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
     1.1 --- a/.hgignore	Mon Dec 30 09:54:10 2019 +0100
     1.2 +++ b/.hgignore	Sat Feb 06 19:11:44 2021 +0100
     1.3 @@ -26,7 +26,7 @@
     1.4  /\.deps/
     1.5  /\.libs/
     1.6  ^stamp-h
     1.7 -^test/ucxtest
     1.8 +test/test_list.c
     1.9  /test-suite.log$
    1.10  ^ucx-.*\.tar.gz$
    1.11  ^.idea/
     2.1 --- a/CHANGELOG	Mon Dec 30 09:54:10 2019 +0100
     2.2 +++ b/CHANGELOG	Sat Feb 06 19:11:44 2021 +0100
     2.3 @@ -1,3 +1,8 @@
     2.4 +Version 3.0 M1
     2.5 +--------------
     2.6 +work in progress
     2.7 +
     2.8 +
     2.9  Version 2.1 - 2019-12-30
    2.10  ------------------------
    2.11  
     3.1 --- a/CMakeLists.txt	Mon Dec 30 09:54:10 2019 +0100
     3.2 +++ b/CMakeLists.txt	Sat Feb 06 19:11:44 2021 +0100
     3.3 @@ -1,5 +1,5 @@
     3.4 -cmake_minimum_required(VERSION 3.10)
     3.5 -project(ucx VERSION 2.1 DESCRIPTION "UAP Common Extensions")
     3.6 +cmake_minimum_required(VERSION 3.14)
     3.7 +project(ucx VERSION 3.0 DESCRIPTION "UAP Common Extensions")
     3.8  
     3.9  # Configuration
    3.10  set(CMAKE_C_STANDARD 11)
    3.11 @@ -11,7 +11,6 @@
    3.12  # Tests
    3.13  enable_testing()
    3.14  add_subdirectory(test)
    3.15 -add_test(NAME test COMMAND ucxtest WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/test")
    3.16  
    3.17  # Web Documentation
    3.18  add_subdirectory(docs/src)
    3.19 @@ -31,10 +30,18 @@
    3.20  
    3.21      configure_file(${CMAKE_SOURCE_DIR}/cmake_infile.doxygen ${CMAKE_BINARY_DIR}/Doxyfile)
    3.22  
    3.23 +    add_custom_target(docs-api-21
    3.24 +            COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/docs/api-2.1 ${CMAKE_BINARY_DIR}/docs/web/api-2.1
    3.25 +            WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    3.26 +            COMMENT "Copying UCX 2.1 API documentation.")
    3.27 +
    3.28      add_custom_target(docs-api
    3.29              COMMAND ${DOXYGEN_EXECUTABLE}
    3.30              WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    3.31 -            COMMENT "Generating API documentation with Doxygen")
    3.32 +            COMMENT "Generating API documentation with Doxygen.")
    3.33 +
    3.34 +    add_custom_target(docs-all DEPENDS docs-html docs-api docs-api-21)
    3.35 +else()
    3.36 +    add_custom_target(docs-all DEPENDS docs-html)
    3.37  endif()
    3.38  
    3.39 -add_custom_target(docs-all DEPENDS docs-html docs-api)
     4.1 --- a/COPYING	Mon Dec 30 09:54:10 2019 +0100
     4.2 +++ b/COPYING	Sat Feb 06 19:11:44 2021 +0100
     4.3 @@ -1,4 +1,4 @@
     4.4 -Copyright 2017 Mike Becker, Olaf Wintermann. All rights reserved.
     4.5 +Copyright 2021 Mike Becker, Olaf Wintermann. All rights reserved.
     4.6  
     4.7  Redistribution and use in source and binary forms, with or without
     4.8  modification, are permitted provided that the following conditions are met:
     5.1 --- a/Makefile.am	Mon Dec 30 09:54:10 2019 +0100
     5.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.3 @@ -1,30 +0,0 @@
     5.4 -#
     5.5 -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     5.6 -#
     5.7 -# Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
     5.8 -#
     5.9 -# Redistribution and use in source and binary forms, with or without
    5.10 -# modification, are permitted provided that the following conditions are met:
    5.11 -#
    5.12 -#   1. Redistributions of source code must retain the above copyright
    5.13 -#      notice, this list of conditions and the following disclaimer.
    5.14 -#
    5.15 -#   2. Redistributions in binary form must reproduce the above copyright
    5.16 -#      notice, this list of conditions and the following disclaimer in the
    5.17 -#      documentation and/or other materials provided with the distribution.
    5.18 -#
    5.19 -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    5.20 -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    5.21 -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    5.22 -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
    5.23 -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    5.24 -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    5.25 -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    5.26 -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    5.27 -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    5.28 -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    5.29 -# POSSIBILITY OF SUCH DAMAGE.
    5.30 -#
    5.31 -
    5.32 -SUBDIRS = src test
    5.33 -ACLOCAL_AMFLAGS = -I m4
     6.1 --- a/README	Mon Dec 30 09:54:10 2019 +0100
     6.2 +++ b/README	Sat Feb 06 19:11:44 2021 +0100
     6.3 @@ -5,11 +5,10 @@
     6.4  0. Table of Contents:
     6.5  
     6.6    1. Introduction  ........................................................ 15
     6.7 -  2. Build  ............................................................... 26
     6.8 -  3. Install  ............................................................. 37
     6.9 -  4. Documentation  ....................................................... 50
    6.10 -  5. Contact  ............................................................. 63
    6.11 -  6. License  ............................................................. 69
    6.12 +  2. Build  ............................................................... 25
    6.13 +  3. Documentation  ....................................................... 44
    6.14 +  4. Contact  ............................................................. 57
    6.15 +  5. License  ............................................................. 64
    6.16  
    6.17  
    6.18  1. Introduction
    6.19 @@ -26,28 +25,23 @@
    6.20  2. Build
    6.21  --------
    6.22  
    6.23 -Untar the source archive and simply run
    6.24 +Untar the source archive and run
    6.25  
    6.26 -  ./configure && make
    6.27 +  mkdir build
    6.28 +  cd build
    6.29 +  cmake ..
    6.30 +  make
    6.31  
    6.32 -If you want to verify your build, you may then run
    6.33 +Optionally install UCX by running the following command as privileged user
    6.34 +
    6.35 +  make install
    6.36 +
    6.37 +If you want to verify your build, you can run
    6.38  
    6.39    make check
    6.40  
    6.41 -3. Install
    6.42 -----------
    6.43  
    6.44 -Build the binaries as described above. Then install UCX, by running
    6.45 -
    6.46 -  make install
    6.47 -
    6.48 -or
    6.49 -
    6.50 -  make install PREFIX=<install_dir>
    6.51 -
    6.52 -The default prefix is /usr/local and will require privileged access.
    6.53 -
    6.54 -4. Documentation
    6.55 +3. Documentation
    6.56  ----------------
    6.57  
    6.58  Documentation is available at:
    6.59 @@ -60,16 +54,17 @@
    6.60    https://develop.uap-core.de/ucx/api/index.html
    6.61  
    6.62  
    6.63 -5. Contact
    6.64 +4. Contact
    6.65  ----------
    6.66  
    6.67    Olaf Wintermann    (olaf.wintermann@gmail.com)
    6.68    Mike Becker        (universe@uap-core.de)
    6.69  
    6.70 -6. License
    6.71 +
    6.72 +5. License
    6.73  ----------
    6.74  
    6.75 -Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
    6.76 +Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
    6.77  
    6.78  Redistribution and use in source and binary forms, with or without
    6.79  modification, are permitted provided that the following conditions are met:
     7.1 --- a/autogen.sh	Mon Dec 30 09:54:10 2019 +0100
     7.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.3 @@ -1,3 +0,0 @@
     7.4 -#!/bin/sh
     7.5 -autoreconf --install
     7.6 -
     8.1 --- a/cmake_infile.doxygen	Mon Dec 30 09:54:10 2019 +0100
     8.2 +++ b/cmake_infile.doxygen	Sat Feb 06 19:11:44 2021 +0100
     8.3 @@ -230,12 +230,6 @@
     8.4  
     8.5  ALIASES                =
     8.6  
     8.7 -# This tag can be used to specify a number of word-keyword mappings (TCL only).
     8.8 -# A mapping has the form "name=value". For example adding "class=itcl::class"
     8.9 -# will allow you to use the command class in the itcl::class meaning.
    8.10 -
    8.11 -TCL_SUBST              =
    8.12 -
    8.13  # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
    8.14  # only. Doxygen will then generate output that is more tailored for C. For
    8.15  # instance, some of the names that are used will be different. The list of all
    8.16 @@ -989,13 +983,6 @@
    8.17  
    8.18  ALPHABETICAL_INDEX     = YES
    8.19  
    8.20 -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
    8.21 -# which the alphabetical index list will be split.
    8.22 -# Minimum value: 1, maximum value: 20, default value: 5.
    8.23 -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
    8.24 -
    8.25 -COLS_IN_ALPHA_INDEX    = 5
    8.26 -
    8.27  # In case all classes in a project start with a common prefix, all classes will
    8.28  # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
    8.29  # can be used to specify a prefix (or a list of prefixes) that should be ignored
    8.30 @@ -2008,12 +1995,6 @@
    8.31  
    8.32  EXTERNAL_PAGES         = YES
    8.33  
    8.34 -# The PERL_PATH should be the absolute path and name of the perl script
    8.35 -# interpreter (i.e. the result of 'which perl').
    8.36 -# The default file (with absolute path) is: /usr/bin/perl.
    8.37 -
    8.38 -PERL_PATH              = /usr/bin/perl
    8.39 -
    8.40  #---------------------------------------------------------------------------
    8.41  # Configuration options related to the dot tool
    8.42  #---------------------------------------------------------------------------
    8.43 @@ -2027,15 +2008,6 @@
    8.44  
    8.45  CLASS_DIAGRAMS         = YES
    8.46  
    8.47 -# You can define message sequence charts within doxygen comments using the \msc
    8.48 -# command. Doxygen will then run the mscgen tool (see:
    8.49 -# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
    8.50 -# documentation. The MSCGEN_PATH tag allows you to specify the directory where
    8.51 -# the mscgen tool resides. If left empty the tool is assumed to be found in the
    8.52 -# default search path.
    8.53 -
    8.54 -MSCGEN_PATH            =
    8.55 -
    8.56  # You can include diagrams made with dia in doxygen documentation. Doxygen will
    8.57  # then run dia to produce the diagram and insert it in the documentation. The
    8.58  # DIA_PATH tag allows you to specify the directory where the dia binary resides.
     9.1 --- a/configure.ac	Mon Dec 30 09:54:10 2019 +0100
     9.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.3 @@ -1,64 +0,0 @@
     9.4 -#
     9.5 -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     9.6 -#
     9.7 -# Copyright 2019 Mike Becker, Olaf Wintermann All rights reserved.
     9.8 -#
     9.9 -# Redistribution and use in source and binary forms, with or without
    9.10 -# modification, are permitted provided that the following conditions are met:
    9.11 -#
    9.12 -#   1. Redistributions of source code must retain the above copyright
    9.13 -#      notice, this list of conditions and the following disclaimer.
    9.14 -#
    9.15 -#   2. Redistributions in binary form must reproduce the above copyright
    9.16 -#      notice, this list of conditions and the following disclaimer in the
    9.17 -#      documentation and/or other materials provided with the distribution.
    9.18 -#
    9.19 -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    9.20 -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    9.21 -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    9.22 -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
    9.23 -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    9.24 -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    9.25 -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    9.26 -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    9.27 -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    9.28 -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    9.29 -# POSSIBILITY OF SUCH DAMAGE.
    9.30 -#
    9.31 -
    9.32 -# the package version must match the macros in ucx.h
    9.33 -# the lib version must follow the libtool versioning convention
    9.34 -AC_PREREQ([2.60])
    9.35 -AC_INIT([ucx], [2.1.0], [olaf.wintermann@gmail.com])
    9.36 -AC_SUBST([UCX_LIB_VERSION], [4:0:1])
    9.37 -
    9.38 -# don't place everything in the project root
    9.39 -AC_CONFIG_AUX_DIR([build-aux])
    9.40 -AC_CONFIG_MACRO_DIR([m4])
    9.41 -
    9.42 -# we use our own directory structure
    9.43 -AM_INIT_AUTOMAKE([foreign -Wall -Werror])
    9.44 -
    9.45 -# if there is an archiver, use it
    9.46 -m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
    9.47 -
    9.48 -# we are compiling a library
    9.49 -LT_INIT
    9.50 -
    9.51 -# we want c11, and may fall back to c99
    9.52 -AC_PROG_CC_C99
    9.53 -
    9.54 -# we want to support automake < 1.14, so we need this deprecated macro
    9.55 -# it tests, whether the compiler allows -c and -o simultaneously
    9.56 -# in modern versions of autoconf, this is done by AC_PROG_CC
    9.57 -AM_PROG_CC_C_O
    9.58 -
    9.59 -# where to place config macros
    9.60 -AC_CONFIG_HEADERS([config.h])
    9.61 -
    9.62 -# our Makefiles
    9.63 -AC_CONFIG_FILES([Makefile src/Makefile test/Makefile])
    9.64 -
    9.65 -# GO
    9.66 -AC_OUTPUT
    9.67 -
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/docs/api-2.1/allocator_8h.html	Sat Feb 06 19:11:44 2021 +0100
    10.3 @@ -0,0 +1,600 @@
    10.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    10.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    10.6 +<head>
    10.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    10.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    10.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   10.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   10.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/allocator.h File Reference</title>
   10.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   10.13 +<script type="text/javascript" src="jquery.js"></script>
   10.14 +<script type="text/javascript" src="dynsections.js"></script>
   10.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   10.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   10.17 +<script type="text/javascript" src="search/search.js"></script>
   10.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   10.19 +</head>
   10.20 +<body>
   10.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   10.22 +<div id="titlearea">
   10.23 +<table cellspacing="0" cellpadding="0">
   10.24 + <tbody>
   10.25 + <tr style="height: 56px;">
   10.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   10.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   10.28 +   <div id="projectname">ucx
   10.29 +   </div>
   10.30 +   <div id="projectbrief">UAP Common Extensions</div>
   10.31 +  </td>
   10.32 + </tr>
   10.33 + </tbody>
   10.34 +</table>
   10.35 +</div>
   10.36 +<!-- end header part -->
   10.37 +<!-- Generated by Doxygen 1.8.13 -->
   10.38 +<script type="text/javascript">
   10.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   10.40 +</script>
   10.41 +<script type="text/javascript" src="menudata.js"></script>
   10.42 +<script type="text/javascript" src="menu.js"></script>
   10.43 +<script type="text/javascript">
   10.44 +$(function() {
   10.45 +  initMenu('',true,false,'search.php','Search');
   10.46 +  $(document).ready(function() { init_search(); });
   10.47 +});
   10.48 +</script>
   10.49 +<div id="main-nav"></div>
   10.50 +<!-- window showing the filter options -->
   10.51 +<div id="MSearchSelectWindow"
   10.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   10.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   10.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   10.55 +</div>
   10.56 +
   10.57 +<!-- iframe showing the search results (closed by default) -->
   10.58 +<div id="MSearchResultsWindow">
   10.59 +<iframe src="javascript:void(0)" frameborder="0" 
   10.60 +        name="MSearchResults" id="MSearchResults">
   10.61 +</iframe>
   10.62 +</div>
   10.63 +
   10.64 +<div id="nav-path" class="navpath">
   10.65 +  <ul>
   10.66 +<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>
   10.67 +</div>
   10.68 +</div><!-- top -->
   10.69 +<div class="header">
   10.70 +  <div class="summary">
   10.71 +<a href="#nested-classes">Data Structures</a> &#124;
   10.72 +<a href="#define-members">Macros</a> &#124;
   10.73 +<a href="#typedef-members">Typedefs</a> &#124;
   10.74 +<a href="#func-members">Functions</a>  </div>
   10.75 +  <div class="headertitle">
   10.76 +<div class="title">allocator.h File Reference</div>  </div>
   10.77 +</div><!--header-->
   10.78 +<div class="contents">
   10.79 +
   10.80 +<p>Allocator for custom memory management.  
   10.81 +<a href="#details">More...</a></p>
   10.82 +<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
   10.83 +</div>
   10.84 +<p><a href="allocator_8h_source.html">Go to the source code of this file.</a></p>
   10.85 +<table class="memberdecls">
   10.86 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
   10.87 +Data Structures</h2></td></tr>
   10.88 +<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>
   10.89 +<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>
   10.90 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   10.91 +</table><table class="memberdecls">
   10.92 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
   10.93 +Macros</h2></td></tr>
   10.94 +<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>
   10.95 +<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>
   10.96 +<tr class="separator:ae1bc218fea8a35f4a3706f0beefcfb19"><td class="memSeparator" colspan="2">&#160;</td></tr>
   10.97 +<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>
   10.98 +<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>
   10.99 +<tr class="separator:a8d71470816f88f78cb9a9686c57e1b10"><td class="memSeparator" colspan="2">&#160;</td></tr>
  10.100 +<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>
  10.101 +<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>
  10.102 +<tr class="separator:a029ee5c9bcbb3f873571553f788c5820"><td class="memSeparator" colspan="2">&#160;</td></tr>
  10.103 +<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>
  10.104 +<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>
  10.105 +<tr class="separator:acd775785b54e97dc2b33a432c12c8fb2"><td class="memSeparator" colspan="2">&#160;</td></tr>
  10.106 +<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>
  10.107 +<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>
  10.108 +<tr class="separator:a1283a8f875f90a7af3aba5e031fc2e3f"><td class="memSeparator" colspan="2">&#160;</td></tr>
  10.109 +</table><table class="memberdecls">
  10.110 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
  10.111 +Typedefs</h2></td></tr>
  10.112 +<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>
  10.113 +<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>
  10.114 +<tr class="separator:a29f0f6a23a70db3b60635cd6dc384473"><td class="memSeparator" colspan="2">&#160;</td></tr>
  10.115 +<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>
  10.116 +<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>
  10.117 +<tr class="separator:a2c0aba4221c1ac6801f03ed799f15b12"><td class="memSeparator" colspan="2">&#160;</td></tr>
  10.118 +<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>
  10.119 +<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>
  10.120 +<tr class="separator:a6d7cf038a806e327c5da37321d04e426"><td class="memSeparator" colspan="2">&#160;</td></tr>
  10.121 +<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>
  10.122 +<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>
  10.123 +<tr class="separator:aaf2387ddaddd8ab4b267e6b00e5d6f7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
  10.124 +</table><table class="memberdecls">
  10.125 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
  10.126 +Functions</h2></td></tr>
  10.127 +<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>
  10.128 +<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>
  10.129 +<tr class="separator:a98d2f1b341118b7a0e341fda5d8b2ebf"><td class="memSeparator" colspan="2">&#160;</td></tr>
  10.130 +<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>
  10.131 +<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>
  10.132 +<tr class="separator:a96403ebf3d2312d95f2fe7627a1cdbc0"><td class="memSeparator" colspan="2">&#160;</td></tr>
  10.133 +<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>
  10.134 +<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>
  10.135 +<tr class="separator:a3a0bfdd13d887012309c459b339f338f"><td class="memSeparator" colspan="2">&#160;</td></tr>
  10.136 +<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>
  10.137 +<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>
  10.138 +<tr class="separator:a47cfc8af626a86fcb93a2b14b90498ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
  10.139 +<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>
  10.140 +<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>
  10.141 +<tr class="separator:a646d83aaaadfe33ae414c0fad8bfc52a"><td class="memSeparator" colspan="2">&#160;</td></tr>
  10.142 +</table>
  10.143 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  10.144 +<div class="textblock"><p>Allocator for custom memory management. </p>
  10.145 +<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>
  10.146 +<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>
  10.147 +<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>
  10.148 +<dl class="section see"><dt>See also</dt><dd><a class="el" href="mempool_8h.html" title="Memory pool implementation. ">mempool.h</a> </dd>
  10.149 +<dd>
  10.150 +<a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a></dd></dl>
  10.151 +<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
  10.152 +<dd>
  10.153 +Olaf Wintermann </dd></dl>
  10.154 +</div><h2 class="groupheader">Macro Definition Documentation</h2>
  10.155 +<a id="a8d71470816f88f78cb9a9686c57e1b10"></a>
  10.156 +<h2 class="memtitle"><span class="permalink"><a href="#a8d71470816f88f78cb9a9686c57e1b10">&#9670;&nbsp;</a></span>alcalloc</h2>
  10.157 +
  10.158 +<div class="memitem">
  10.159 +<div class="memproto">
  10.160 +      <table class="memname">
  10.161 +        <tr>
  10.162 +          <td class="memname">#define alcalloc</td>
  10.163 +          <td>(</td>
  10.164 +          <td class="paramtype">&#160;</td>
  10.165 +          <td class="paramname">allocator, </td>
  10.166 +        </tr>
  10.167 +        <tr>
  10.168 +          <td class="paramkey"></td>
  10.169 +          <td></td>
  10.170 +          <td class="paramtype">&#160;</td>
  10.171 +          <td class="paramname">n, </td>
  10.172 +        </tr>
  10.173 +        <tr>
  10.174 +          <td class="paramkey"></td>
  10.175 +          <td></td>
  10.176 +          <td class="paramtype">&#160;</td>
  10.177 +          <td class="paramname">size&#160;</td>
  10.178 +        </tr>
  10.179 +        <tr>
  10.180 +          <td></td>
  10.181 +          <td>)</td>
  10.182 +          <td></td><td>&#160;&#160;&#160;((allocator)-&gt;calloc((allocator)-&gt;pool, n, size))</td>
  10.183 +        </tr>
  10.184 +      </table>
  10.185 +</div><div class="memdoc">
  10.186 +
  10.187 +<p>Shorthand for calling an allocators calloc function. </p>
  10.188 +<dl class="params"><dt>Parameters</dt><dd>
  10.189 +  <table class="params">
  10.190 +    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
  10.191 +    <tr><td class="paramname">n</td><td>the count of elements the space should be allocated for </td></tr>
  10.192 +    <tr><td class="paramname">size</td><td>the size of each element </td></tr>
  10.193 +  </table>
  10.194 +  </dd>
  10.195 +</dl>
  10.196 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory area </dd></dl>
  10.197 +
  10.198 +</div>
  10.199 +</div>
  10.200 +<a id="acd775785b54e97dc2b33a432c12c8fb2"></a>
  10.201 +<h2 class="memtitle"><span class="permalink"><a href="#acd775785b54e97dc2b33a432c12c8fb2">&#9670;&nbsp;</a></span>alfree</h2>
  10.202 +
  10.203 +<div class="memitem">
  10.204 +<div class="memproto">
  10.205 +      <table class="memname">
  10.206 +        <tr>
  10.207 +          <td class="memname">#define alfree</td>
  10.208 +          <td>(</td>
  10.209 +          <td class="paramtype">&#160;</td>
  10.210 +          <td class="paramname">allocator, </td>
  10.211 +        </tr>
  10.212 +        <tr>
  10.213 +          <td class="paramkey"></td>
  10.214 +          <td></td>
  10.215 +          <td class="paramtype">&#160;</td>
  10.216 +          <td class="paramname">ptr&#160;</td>
  10.217 +        </tr>
  10.218 +        <tr>
  10.219 +          <td></td>
  10.220 +          <td>)</td>
  10.221 +          <td></td><td>&#160;&#160;&#160;((allocator)-&gt;free((allocator)-&gt;pool, ptr))</td>
  10.222 +        </tr>
  10.223 +      </table>
  10.224 +</div><div class="memdoc">
  10.225 +
  10.226 +<p>Shorthand for calling an allocators free function. </p>
  10.227 +<dl class="params"><dt>Parameters</dt><dd>
  10.228 +  <table class="params">
  10.229 +    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
  10.230 +    <tr><td class="paramname">ptr</td><td>the pointer to the memory area that shall be freed </td></tr>
  10.231 +  </table>
  10.232 +  </dd>
  10.233 +</dl>
  10.234 +
  10.235 +</div>
  10.236 +</div>
  10.237 +<a id="ae1bc218fea8a35f4a3706f0beefcfb19"></a>
  10.238 +<h2 class="memtitle"><span class="permalink"><a href="#ae1bc218fea8a35f4a3706f0beefcfb19">&#9670;&nbsp;</a></span>almalloc</h2>
  10.239 +
  10.240 +<div class="memitem">
  10.241 +<div class="memproto">
  10.242 +      <table class="memname">
  10.243 +        <tr>
  10.244 +          <td class="memname">#define almalloc</td>
  10.245 +          <td>(</td>
  10.246 +          <td class="paramtype">&#160;</td>
  10.247 +          <td class="paramname">allocator, </td>
  10.248 +        </tr>
  10.249 +        <tr>
  10.250 +          <td class="paramkey"></td>
  10.251 +          <td></td>
  10.252 +          <td class="paramtype">&#160;</td>
  10.253 +          <td class="paramname">n&#160;</td>
  10.254 +        </tr>
  10.255 +        <tr>
  10.256 +          <td></td>
  10.257 +          <td>)</td>
  10.258 +          <td></td><td>&#160;&#160;&#160;((allocator)-&gt;malloc((allocator)-&gt;pool, n))</td>
  10.259 +        </tr>
  10.260 +      </table>
  10.261 +</div><div class="memdoc">
  10.262 +
  10.263 +<p>Shorthand for calling an allocators malloc function. </p>
  10.264 +<dl class="params"><dt>Parameters</dt><dd>
  10.265 +  <table class="params">
  10.266 +    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
  10.267 +    <tr><td class="paramname">n</td><td>size of space to allocate </td></tr>
  10.268 +  </table>
  10.269 +  </dd>
  10.270 +</dl>
  10.271 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory area </dd></dl>
  10.272 +
  10.273 +</div>
  10.274 +</div>
  10.275 +<a id="a029ee5c9bcbb3f873571553f788c5820"></a>
  10.276 +<h2 class="memtitle"><span class="permalink"><a href="#a029ee5c9bcbb3f873571553f788c5820">&#9670;&nbsp;</a></span>alrealloc</h2>
  10.277 +
  10.278 +<div class="memitem">
  10.279 +<div class="memproto">
  10.280 +      <table class="memname">
  10.281 +        <tr>
  10.282 +          <td class="memname">#define alrealloc</td>
  10.283 +          <td>(</td>
  10.284 +          <td class="paramtype">&#160;</td>
  10.285 +          <td class="paramname">allocator, </td>
  10.286 +        </tr>
  10.287 +        <tr>
  10.288 +          <td class="paramkey"></td>
  10.289 +          <td></td>
  10.290 +          <td class="paramtype">&#160;</td>
  10.291 +          <td class="paramname">ptr, </td>
  10.292 +        </tr>
  10.293 +        <tr>
  10.294 +          <td class="paramkey"></td>
  10.295 +          <td></td>
  10.296 +          <td class="paramtype">&#160;</td>
  10.297 +          <td class="paramname">n&#160;</td>
  10.298 +        </tr>
  10.299 +        <tr>
  10.300 +          <td></td>
  10.301 +          <td>)</td>
  10.302 +          <td></td><td>&#160;&#160;&#160;((allocator)-&gt;realloc((allocator)-&gt;pool, ptr, n))</td>
  10.303 +        </tr>
  10.304 +      </table>
  10.305 +</div><div class="memdoc">
  10.306 +
  10.307 +<p>Shorthand for calling an allocators realloc function. </p>
  10.308 +<dl class="params"><dt>Parameters</dt><dd>
  10.309 +  <table class="params">
  10.310 +    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
  10.311 +    <tr><td class="paramname">ptr</td><td>the pointer to the memory area that shall be reallocated </td></tr>
  10.312 +    <tr><td class="paramname">n</td><td>the new size of the allocated memory area </td></tr>
  10.313 +  </table>
  10.314 +  </dd>
  10.315 +</dl>
  10.316 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the reallocated memory area </dd></dl>
  10.317 +
  10.318 +</div>
  10.319 +</div>
  10.320 +<a id="a1283a8f875f90a7af3aba5e031fc2e3f"></a>
  10.321 +<h2 class="memtitle"><span class="permalink"><a href="#a1283a8f875f90a7af3aba5e031fc2e3f">&#9670;&nbsp;</a></span>UCX_ALLOCATOR_DEFAULT</h2>
  10.322 +
  10.323 +<div class="memitem">
  10.324 +<div class="memproto">
  10.325 +      <table class="memname">
  10.326 +        <tr>
  10.327 +          <td class="memname">#define UCX_ALLOCATOR_DEFAULT</td>
  10.328 +        </tr>
  10.329 +      </table>
  10.330 +</div><div class="memdoc">
  10.331 +<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>
  10.332 +<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>
  10.333 +</div><!-- fragment -->
  10.334 +<p>Convenient macro for a default allocator <code>struct</code> definition. </p>
  10.335 +
  10.336 +</div>
  10.337 +</div>
  10.338 +<h2 class="groupheader">Typedef Documentation</h2>
  10.339 +<a id="a2c0aba4221c1ac6801f03ed799f15b12"></a>
  10.340 +<h2 class="memtitle"><span class="permalink"><a href="#a2c0aba4221c1ac6801f03ed799f15b12">&#9670;&nbsp;</a></span>ucx_allocator_calloc</h2>
  10.341 +
  10.342 +<div class="memitem">
  10.343 +<div class="memproto">
  10.344 +      <table class="memname">
  10.345 +        <tr>
  10.346 +          <td class="memname">typedef void*(* ucx_allocator_calloc) (void *pool, size_t n, size_t size)</td>
  10.347 +        </tr>
  10.348 +      </table>
  10.349 +</div><div class="memdoc">
  10.350 +
  10.351 +<p>A function pointer to the allocators <code>calloc()</code> function. </p>
  10.352 +<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>
  10.353 +
  10.354 +</div>
  10.355 +</div>
  10.356 +<a id="aaf2387ddaddd8ab4b267e6b00e5d6f7e"></a>
  10.357 +<h2 class="memtitle"><span class="permalink"><a href="#aaf2387ddaddd8ab4b267e6b00e5d6f7e">&#9670;&nbsp;</a></span>ucx_allocator_free</h2>
  10.358 +
  10.359 +<div class="memitem">
  10.360 +<div class="memproto">
  10.361 +      <table class="memname">
  10.362 +        <tr>
  10.363 +          <td class="memname">typedef void(* ucx_allocator_free) (void *pool, void *data)</td>
  10.364 +        </tr>
  10.365 +      </table>
  10.366 +</div><div class="memdoc">
  10.367 +
  10.368 +<p>A function pointer to the allocators <code>free()</code> function. </p>
  10.369 +<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>
  10.370 +
  10.371 +</div>
  10.372 +</div>
  10.373 +<a id="a29f0f6a23a70db3b60635cd6dc384473"></a>
  10.374 +<h2 class="memtitle"><span class="permalink"><a href="#a29f0f6a23a70db3b60635cd6dc384473">&#9670;&nbsp;</a></span>ucx_allocator_malloc</h2>
  10.375 +
  10.376 +<div class="memitem">
  10.377 +<div class="memproto">
  10.378 +      <table class="memname">
  10.379 +        <tr>
  10.380 +          <td class="memname">typedef void*(* ucx_allocator_malloc) (void *pool, size_t n)</td>
  10.381 +        </tr>
  10.382 +      </table>
  10.383 +</div><div class="memdoc">
  10.384 +
  10.385 +<p>A function pointer to the allocators <code>malloc()</code> function. </p>
  10.386 +<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>
  10.387 +
  10.388 +</div>
  10.389 +</div>
  10.390 +<a id="a6d7cf038a806e327c5da37321d04e426"></a>
  10.391 +<h2 class="memtitle"><span class="permalink"><a href="#a6d7cf038a806e327c5da37321d04e426">&#9670;&nbsp;</a></span>ucx_allocator_realloc</h2>
  10.392 +
  10.393 +<div class="memitem">
  10.394 +<div class="memproto">
  10.395 +      <table class="memname">
  10.396 +        <tr>
  10.397 +          <td class="memname">typedef void*(* ucx_allocator_realloc) (void *pool, void *data, size_t n)</td>
  10.398 +        </tr>
  10.399 +      </table>
  10.400 +</div><div class="memdoc">
  10.401 +
  10.402 +<p>A function pointer to the allocators <code>realloc()</code> function. </p>
  10.403 +<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>
  10.404 +
  10.405 +</div>
  10.406 +</div>
  10.407 +<h2 class="groupheader">Function Documentation</h2>
  10.408 +<a id="a98d2f1b341118b7a0e341fda5d8b2ebf"></a>
  10.409 +<h2 class="memtitle"><span class="permalink"><a href="#a98d2f1b341118b7a0e341fda5d8b2ebf">&#9670;&nbsp;</a></span>ucx_default_allocator()</h2>
  10.410 +
  10.411 +<div class="memitem">
  10.412 +<div class="memproto">
  10.413 +      <table class="memname">
  10.414 +        <tr>
  10.415 +          <td class="memname"><a class="el" href="structUcxAllocator.html">UcxAllocator</a>* ucx_default_allocator </td>
  10.416 +          <td>(</td>
  10.417 +          <td class="paramname"></td><td>)</td>
  10.418 +          <td></td>
  10.419 +        </tr>
  10.420 +      </table>
  10.421 +</div><div class="memdoc">
  10.422 +
  10.423 +<p>Returns a pointer to the default allocator. </p>
  10.424 +<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>
  10.425 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the default allocator</dd></dl>
  10.426 +<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>
  10.427 +
  10.428 +</div>
  10.429 +</div>
  10.430 +<a id="a3a0bfdd13d887012309c459b339f338f"></a>
  10.431 +<h2 class="memtitle"><span class="permalink"><a href="#a3a0bfdd13d887012309c459b339f338f">&#9670;&nbsp;</a></span>ucx_default_calloc()</h2>
  10.432 +
  10.433 +<div class="memitem">
  10.434 +<div class="memproto">
  10.435 +      <table class="memname">
  10.436 +        <tr>
  10.437 +          <td class="memname">void* ucx_default_calloc </td>
  10.438 +          <td>(</td>
  10.439 +          <td class="paramtype">void *&#160;</td>
  10.440 +          <td class="paramname"><em>ignore</em>, </td>
  10.441 +        </tr>
  10.442 +        <tr>
  10.443 +          <td class="paramkey"></td>
  10.444 +          <td></td>
  10.445 +          <td class="paramtype">size_t&#160;</td>
  10.446 +          <td class="paramname"><em>n</em>, </td>
  10.447 +        </tr>
  10.448 +        <tr>
  10.449 +          <td class="paramkey"></td>
  10.450 +          <td></td>
  10.451 +          <td class="paramtype">size_t&#160;</td>
  10.452 +          <td class="paramname"><em>size</em>&#160;</td>
  10.453 +        </tr>
  10.454 +        <tr>
  10.455 +          <td></td>
  10.456 +          <td>)</td>
  10.457 +          <td></td><td></td>
  10.458 +        </tr>
  10.459 +      </table>
  10.460 +</div><div class="memdoc">
  10.461 +
  10.462 +<p>A wrapper for the standard libc <code>calloc()</code> function. </p>
  10.463 +<dl class="params"><dt>Parameters</dt><dd>
  10.464 +  <table class="params">
  10.465 +    <tr><td class="paramname">ignore</td><td>ignored (may be used by allocators for pooled memory) </td></tr>
  10.466 +    <tr><td class="paramname">n</td><td>argument passed to <code>calloc()</code> </td></tr>
  10.467 +    <tr><td class="paramname">size</td><td>argument passed to <code>calloc()</code> </td></tr>
  10.468 +  </table>
  10.469 +  </dd>
  10.470 +</dl>
  10.471 +<dl class="section return"><dt>Returns</dt><dd>return value of <code>calloc()</code> </dd></dl>
  10.472 +
  10.473 +</div>
  10.474 +</div>
  10.475 +<a id="a646d83aaaadfe33ae414c0fad8bfc52a"></a>
  10.476 +<h2 class="memtitle"><span class="permalink"><a href="#a646d83aaaadfe33ae414c0fad8bfc52a">&#9670;&nbsp;</a></span>ucx_default_free()</h2>
  10.477 +
  10.478 +<div class="memitem">
  10.479 +<div class="memproto">
  10.480 +      <table class="memname">
  10.481 +        <tr>
  10.482 +          <td class="memname">void ucx_default_free </td>
  10.483 +          <td>(</td>
  10.484 +          <td class="paramtype">void *&#160;</td>
  10.485 +          <td class="paramname"><em>ignore</em>, </td>
  10.486 +        </tr>
  10.487 +        <tr>
  10.488 +          <td class="paramkey"></td>
  10.489 +          <td></td>
  10.490 +          <td class="paramtype">void *&#160;</td>
  10.491 +          <td class="paramname"><em>data</em>&#160;</td>
  10.492 +        </tr>
  10.493 +        <tr>
  10.494 +          <td></td>
  10.495 +          <td>)</td>
  10.496 +          <td></td><td></td>
  10.497 +        </tr>
  10.498 +      </table>
  10.499 +</div><div class="memdoc">
  10.500 +
  10.501 +<p>A wrapper for the standard libc <code>free()</code> function. </p>
  10.502 +<dl class="params"><dt>Parameters</dt><dd>
  10.503 +  <table class="params">
  10.504 +    <tr><td class="paramname">ignore</td><td>ignored (may be used by allocators for pooled memory) </td></tr>
  10.505 +    <tr><td class="paramname">data</td><td>argument passed to <code>free()</code> </td></tr>
  10.506 +  </table>
  10.507 +  </dd>
  10.508 +</dl>
  10.509 +
  10.510 +</div>
  10.511 +</div>
  10.512 +<a id="a96403ebf3d2312d95f2fe7627a1cdbc0"></a>
  10.513 +<h2 class="memtitle"><span class="permalink"><a href="#a96403ebf3d2312d95f2fe7627a1cdbc0">&#9670;&nbsp;</a></span>ucx_default_malloc()</h2>
  10.514 +
  10.515 +<div class="memitem">
  10.516 +<div class="memproto">
  10.517 +      <table class="memname">
  10.518 +        <tr>
  10.519 +          <td class="memname">void* ucx_default_malloc </td>
  10.520 +          <td>(</td>
  10.521 +          <td class="paramtype">void *&#160;</td>
  10.522 +          <td class="paramname"><em>ignore</em>, </td>
  10.523 +        </tr>
  10.524 +        <tr>
  10.525 +          <td class="paramkey"></td>
  10.526 +          <td></td>
  10.527 +          <td class="paramtype">size_t&#160;</td>
  10.528 +          <td class="paramname"><em>n</em>&#160;</td>
  10.529 +        </tr>
  10.530 +        <tr>
  10.531 +          <td></td>
  10.532 +          <td>)</td>
  10.533 +          <td></td><td></td>
  10.534 +        </tr>
  10.535 +      </table>
  10.536 +</div><div class="memdoc">
  10.537 +
  10.538 +<p>A wrapper for the standard libc <code>malloc()</code> function. </p>
  10.539 +<dl class="params"><dt>Parameters</dt><dd>
  10.540 +  <table class="params">
  10.541 +    <tr><td class="paramname">ignore</td><td>ignored (may be used by allocators for pooled memory) </td></tr>
  10.542 +    <tr><td class="paramname">n</td><td>argument passed to <code>malloc()</code> </td></tr>
  10.543 +  </table>
  10.544 +  </dd>
  10.545 +</dl>
  10.546 +<dl class="section return"><dt>Returns</dt><dd>return value of <code>malloc()</code> </dd></dl>
  10.547 +
  10.548 +</div>
  10.549 +</div>
  10.550 +<a id="a47cfc8af626a86fcb93a2b14b90498ed"></a>
  10.551 +<h2 class="memtitle"><span class="permalink"><a href="#a47cfc8af626a86fcb93a2b14b90498ed">&#9670;&nbsp;</a></span>ucx_default_realloc()</h2>
  10.552 +
  10.553 +<div class="memitem">
  10.554 +<div class="memproto">
  10.555 +      <table class="memname">
  10.556 +        <tr>
  10.557 +          <td class="memname">void* ucx_default_realloc </td>
  10.558 +          <td>(</td>
  10.559 +          <td class="paramtype">void *&#160;</td>
  10.560 +          <td class="paramname"><em>ignore</em>, </td>
  10.561 +        </tr>
  10.562 +        <tr>
  10.563 +          <td class="paramkey"></td>
  10.564 +          <td></td>
  10.565 +          <td class="paramtype">void *&#160;</td>
  10.566 +          <td class="paramname"><em>data</em>, </td>
  10.567 +        </tr>
  10.568 +        <tr>
  10.569 +          <td class="paramkey"></td>
  10.570 +          <td></td>
  10.571 +          <td class="paramtype">size_t&#160;</td>
  10.572 +          <td class="paramname"><em>n</em>&#160;</td>
  10.573 +        </tr>
  10.574 +        <tr>
  10.575 +          <td></td>
  10.576 +          <td>)</td>
  10.577 +          <td></td><td></td>
  10.578 +        </tr>
  10.579 +      </table>
  10.580 +</div><div class="memdoc">
  10.581 +
  10.582 +<p>A wrapper for the standard libc <code>realloc()</code> function. </p>
  10.583 +<dl class="params"><dt>Parameters</dt><dd>
  10.584 +  <table class="params">
  10.585 +    <tr><td class="paramname">ignore</td><td>ignored (may be used by allocators for pooled memory) </td></tr>
  10.586 +    <tr><td class="paramname">data</td><td>argumend passed to <code>realloc()</code> </td></tr>
  10.587 +    <tr><td class="paramname">n</td><td>argument passed to <code>realloc()</code> </td></tr>
  10.588 +  </table>
  10.589 +  </dd>
  10.590 +</dl>
  10.591 +<dl class="section return"><dt>Returns</dt><dd>return value of <code>realloc()</code> </dd></dl>
  10.592 +
  10.593 +</div>
  10.594 +</div>
  10.595 +</div><!-- contents -->
  10.596 +<!-- start footer part -->
  10.597 +<hr class="footer"/><address class="footer"><small>
  10.598 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  10.599 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  10.600 +</a> 1.8.13
  10.601 +</small></address>
  10.602 +</body>
  10.603 +</html>
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/docs/api-2.1/allocator_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
    11.3 @@ -0,0 +1,95 @@
    11.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    11.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    11.6 +<head>
    11.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    11.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    11.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   11.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   11.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/allocator.h Source File</title>
   11.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   11.13 +<script type="text/javascript" src="jquery.js"></script>
   11.14 +<script type="text/javascript" src="dynsections.js"></script>
   11.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   11.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   11.17 +<script type="text/javascript" src="search/search.js"></script>
   11.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   11.19 +</head>
   11.20 +<body>
   11.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   11.22 +<div id="titlearea">
   11.23 +<table cellspacing="0" cellpadding="0">
   11.24 + <tbody>
   11.25 + <tr style="height: 56px;">
   11.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   11.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   11.28 +   <div id="projectname">ucx
   11.29 +   </div>
   11.30 +   <div id="projectbrief">UAP Common Extensions</div>
   11.31 +  </td>
   11.32 + </tr>
   11.33 + </tbody>
   11.34 +</table>
   11.35 +</div>
   11.36 +<!-- end header part -->
   11.37 +<!-- Generated by Doxygen 1.8.13 -->
   11.38 +<script type="text/javascript">
   11.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   11.40 +</script>
   11.41 +<script type="text/javascript" src="menudata.js"></script>
   11.42 +<script type="text/javascript" src="menu.js"></script>
   11.43 +<script type="text/javascript">
   11.44 +$(function() {
   11.45 +  initMenu('',true,false,'search.php','Search');
   11.46 +  $(document).ready(function() { init_search(); });
   11.47 +});
   11.48 +</script>
   11.49 +<div id="main-nav"></div>
   11.50 +<!-- window showing the filter options -->
   11.51 +<div id="MSearchSelectWindow"
   11.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   11.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   11.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   11.55 +</div>
   11.56 +
   11.57 +<!-- iframe showing the search results (closed by default) -->
   11.58 +<div id="MSearchResultsWindow">
   11.59 +<iframe src="javascript:void(0)" frameborder="0" 
   11.60 +        name="MSearchResults" id="MSearchResults">
   11.61 +</iframe>
   11.62 +</div>
   11.63 +
   11.64 +<div id="nav-path" class="navpath">
   11.65 +  <ul>
   11.66 +<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>
   11.67 +</div>
   11.68 +</div><!-- top -->
   11.69 +<div class="header">
   11.70 +  <div class="headertitle">
   11.71 +<div class="title">allocator.h</div>  </div>
   11.72 +</div><!--header-->
   11.73 +<div class="contents">
   11.74 +<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>
   11.75 +<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>
   11.76 +<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>
   11.77 +<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>
   11.78 +<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>
   11.79 +<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>
   11.80 +<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>
   11.81 +<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>
   11.82 +<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>
   11.83 +<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>
   11.84 +<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>
   11.85 +<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>
   11.86 +<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>
   11.87 +<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>
   11.88 +<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>
   11.89 +<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>
   11.90 +</div><!-- fragment --></div><!-- contents -->
   11.91 +<!-- start footer part -->
   11.92 +<hr class="footer"/><address class="footer"><small>
   11.93 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
   11.94 +<img class="footer" src="doxygen.png" alt="doxygen"/>
   11.95 +</a> 1.8.13
   11.96 +</small></address>
   11.97 +</body>
   11.98 +</html>
    12.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.2 +++ b/docs/api-2.1/annotated.html	Sat Feb 06 19:11:44 2021 +0100
    12.3 @@ -0,0 +1,101 @@
    12.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    12.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    12.6 +<head>
    12.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    12.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    12.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   12.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   12.11 +<title>ucx: Data Structures</title>
   12.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   12.13 +<script type="text/javascript" src="jquery.js"></script>
   12.14 +<script type="text/javascript" src="dynsections.js"></script>
   12.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   12.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   12.17 +<script type="text/javascript" src="search/search.js"></script>
   12.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   12.19 +</head>
   12.20 +<body>
   12.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   12.22 +<div id="titlearea">
   12.23 +<table cellspacing="0" cellpadding="0">
   12.24 + <tbody>
   12.25 + <tr style="height: 56px;">
   12.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   12.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   12.28 +   <div id="projectname">ucx
   12.29 +   </div>
   12.30 +   <div id="projectbrief">UAP Common Extensions</div>
   12.31 +  </td>
   12.32 + </tr>
   12.33 + </tbody>
   12.34 +</table>
   12.35 +</div>
   12.36 +<!-- end header part -->
   12.37 +<!-- Generated by Doxygen 1.8.13 -->
   12.38 +<script type="text/javascript">
   12.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   12.40 +</script>
   12.41 +<script type="text/javascript" src="menudata.js"></script>
   12.42 +<script type="text/javascript" src="menu.js"></script>
   12.43 +<script type="text/javascript">
   12.44 +$(function() {
   12.45 +  initMenu('',true,false,'search.php','Search');
   12.46 +  $(document).ready(function() { init_search(); });
   12.47 +});
   12.48 +</script>
   12.49 +<div id="main-nav"></div>
   12.50 +</div><!-- top -->
   12.51 +<!-- window showing the filter options -->
   12.52 +<div id="MSearchSelectWindow"
   12.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   12.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   12.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   12.56 +</div>
   12.57 +
   12.58 +<!-- iframe showing the search results (closed by default) -->
   12.59 +<div id="MSearchResultsWindow">
   12.60 +<iframe src="javascript:void(0)" frameborder="0" 
   12.61 +        name="MSearchResults" id="MSearchResults">
   12.62 +</iframe>
   12.63 +</div>
   12.64 +
   12.65 +<div class="header">
   12.66 +  <div class="headertitle">
   12.67 +<div class="title">Data Structures</div>  </div>
   12.68 +</div><!--header-->
   12.69 +<div class="contents">
   12.70 +<div class="textblock">Here are the data structures with brief descriptions:</div><div class="directory">
   12.71 +<table class="directory">
   12.72 +<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>
   12.73 +<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>
   12.74 +<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>
   12.75 +<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>
   12.76 +<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>
   12.77 +<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>
   12.78 +<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>
   12.79 +<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>
   12.80 +<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>
   12.81 +<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>
   12.82 +<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>
   12.83 +<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>
   12.84 +<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>
   12.85 +<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>
   12.86 +<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>
   12.87 +<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>
   12.88 +<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>
   12.89 +<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>
   12.90 +<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>
   12.91 +<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>
   12.92 +<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>
   12.93 +<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>
   12.94 +</table>
   12.95 +</div><!-- directory -->
   12.96 +</div><!-- contents -->
   12.97 +<!-- start footer part -->
   12.98 +<hr class="footer"/><address class="footer"><small>
   12.99 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  12.100 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  12.101 +</a> 1.8.13
  12.102 +</small></address>
  12.103 +</body>
  12.104 +</html>
    13.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.2 +++ b/docs/api-2.1/array_8h.html	Sat Feb 06 19:11:44 2021 +0100
    13.3 @@ -0,0 +1,1376 @@
    13.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    13.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    13.6 +<head>
    13.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    13.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    13.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   13.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   13.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/array.h File Reference</title>
   13.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   13.13 +<script type="text/javascript" src="jquery.js"></script>
   13.14 +<script type="text/javascript" src="dynsections.js"></script>
   13.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   13.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   13.17 +<script type="text/javascript" src="search/search.js"></script>
   13.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   13.19 +</head>
   13.20 +<body>
   13.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   13.22 +<div id="titlearea">
   13.23 +<table cellspacing="0" cellpadding="0">
   13.24 + <tbody>
   13.25 + <tr style="height: 56px;">
   13.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   13.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   13.28 +   <div id="projectname">ucx
   13.29 +   </div>
   13.30 +   <div id="projectbrief">UAP Common Extensions</div>
   13.31 +  </td>
   13.32 + </tr>
   13.33 + </tbody>
   13.34 +</table>
   13.35 +</div>
   13.36 +<!-- end header part -->
   13.37 +<!-- Generated by Doxygen 1.8.13 -->
   13.38 +<script type="text/javascript">
   13.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   13.40 +</script>
   13.41 +<script type="text/javascript" src="menudata.js"></script>
   13.42 +<script type="text/javascript" src="menu.js"></script>
   13.43 +<script type="text/javascript">
   13.44 +$(function() {
   13.45 +  initMenu('',true,false,'search.php','Search');
   13.46 +  $(document).ready(function() { init_search(); });
   13.47 +});
   13.48 +</script>
   13.49 +<div id="main-nav"></div>
   13.50 +<!-- window showing the filter options -->
   13.51 +<div id="MSearchSelectWindow"
   13.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   13.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   13.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   13.55 +</div>
   13.56 +
   13.57 +<!-- iframe showing the search results (closed by default) -->
   13.58 +<div id="MSearchResultsWindow">
   13.59 +<iframe src="javascript:void(0)" frameborder="0" 
   13.60 +        name="MSearchResults" id="MSearchResults">
   13.61 +</iframe>
   13.62 +</div>
   13.63 +
   13.64 +<div id="nav-path" class="navpath">
   13.65 +  <ul>
   13.66 +<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>
   13.67 +</div>
   13.68 +</div><!-- top -->
   13.69 +<div class="header">
   13.70 +  <div class="summary">
   13.71 +<a href="#nested-classes">Data Structures</a> &#124;
   13.72 +<a href="#define-members">Macros</a> &#124;
   13.73 +<a href="#func-members">Functions</a>  </div>
   13.74 +  <div class="headertitle">
   13.75 +<div class="title">array.h File Reference</div>  </div>
   13.76 +</div><!--header-->
   13.77 +<div class="contents">
   13.78 +
   13.79 +<p>Dynamically allocated array implementation.  
   13.80 +<a href="#details">More...</a></p>
   13.81 +<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
   13.82 +<code>#include &quot;<a class="el" href="allocator_8h_source.html">allocator.h</a>&quot;</code><br />
   13.83 +</div>
   13.84 +<p><a href="array_8h_source.html">Go to the source code of this file.</a></p>
   13.85 +<table class="memberdecls">
   13.86 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
   13.87 +Data Structures</h2></td></tr>
   13.88 +<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>
   13.89 +<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX array type.  <a href="structUcxArray.html#details">More...</a><br /></td></tr>
   13.90 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   13.91 +</table><table class="memberdecls">
   13.92 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
   13.93 +Macros</h2></td></tr>
   13.94 +<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>
   13.95 +<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>
   13.96 +<tr class="separator:a1d959c29af3125bdd37cde3a554e729c"><td class="memSeparator" colspan="2">&#160;</td></tr>
   13.97 +<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>
   13.98 +<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>
   13.99 +<tr class="separator:a59a5b342965e790945f9c7a3f86b99f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.100 +</table><table class="memberdecls">
  13.101 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
  13.102 +Functions</h2></td></tr>
  13.103 +<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>
  13.104 +<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>
  13.105 +<tr class="separator:ad0a8d76980cf1c1910e64a245803fb9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.106 +<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>
  13.107 +<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>
  13.108 +<tr class="separator:ad708b333c0c1b02c998309a58ea65e31"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.109 +<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>
  13.110 +<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>
  13.111 +<tr class="separator:a994a2fbf1c33a3833e2a70cd9a4352b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.112 +<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>
  13.113 +<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>
  13.114 +<tr class="separator:a177170258c215eb2e4f5a32e59f0cb1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.115 +<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>
  13.116 +<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>
  13.117 +<tr class="separator:ad921e85c28ffae32230777a53c5037e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.118 +<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>
  13.119 +<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>
  13.120 +<tr class="separator:a2451e61ebb15a7ba1c1319267ba75b8c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.121 +<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>
  13.122 +<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>
  13.123 +<tr class="separator:a4a8c273370e4a3a3e2624e364f5ab410"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.124 +<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>
  13.125 +<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>
  13.126 +<tr class="separator:a43292b448adb1741677aa8c578bcc201"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.127 +<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>
  13.128 +<tr class="memdesc:a8e83681d8d5d8cddbf10f63ce5be4c10"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys the array.  <a href="#a8e83681d8d5d8cddbf10f63ce5be4c10">More...</a><br /></td></tr>
  13.129 +<tr class="separator:a8e83681d8d5d8cddbf10f63ce5be4c10"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.130 +<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>
  13.131 +<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>
  13.132 +<tr class="separator:ac01ee914468a16f470bf3071fffbe438"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.133 +<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>
  13.134 +<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>
  13.135 +<tr class="separator:aea01731ad94ea73c0c8fb1d1b7a35fcf"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.136 +<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>
  13.137 +<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>
  13.138 +<tr class="separator:a95b52acc2193b5c33cf0eaa4f2082477"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.139 +<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>
  13.140 +<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>
  13.141 +<tr class="separator:a1bb545d065358d265d80d815ba382a28"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.142 +<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>
  13.143 +<tr class="memdesc:aa5a0bf3d3f0df6406beb0e569021cc28"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatenates two arrays.  <a href="#aa5a0bf3d3f0df6406beb0e569021cc28">More...</a><br /></td></tr>
  13.144 +<tr class="separator:aa5a0bf3d3f0df6406beb0e569021cc28"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.145 +<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>
  13.146 +<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>
  13.147 +<tr class="separator:aa698085fd1a8b70d6b709999c51b49e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.148 +<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>
  13.149 +<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>
  13.150 +<tr class="separator:ae7bdbed94afee9b20b38b95e3ab470f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.151 +<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>
  13.152 +<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>
  13.153 +<tr class="separator:a5241058cd2329147bc5b1593ae7e51dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.154 +<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>
  13.155 +<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>
  13.156 +<tr class="separator:add773514569b872a6624381b4b6af52c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.157 +<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>
  13.158 +<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>
  13.159 +<tr class="separator:aa45eac6b697f83adac81c0860cf306b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.160 +<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>
  13.161 +<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>
  13.162 +<tr class="separator:a548d81b07612bae3ba8c4c4b49104b8e"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.163 +<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>
  13.164 +<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>
  13.165 +<tr class="separator:a2daf50e80aee9bccebee876a7efd2dfc"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.166 +<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>
  13.167 +<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>
  13.168 +<tr class="separator:a27762e7c06a6c781015e3c8ceeee0ce3"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.169 +<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>
  13.170 +<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>
  13.171 +<tr class="separator:a1c3bf8433c1de3c933f3854ab297fe1d"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.172 +<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>
  13.173 +<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>
  13.174 +<tr class="separator:ab0cbf243824aaebee48277315e03afce"><td class="memSeparator" colspan="2">&#160;</td></tr>
  13.175 +</table>
  13.176 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  13.177 +<div class="textblock"><p>Dynamically allocated array implementation. </p>
  13.178 +<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
  13.179 +<dd>
  13.180 +Olaf Wintermann </dd></dl>
  13.181 +</div><h2 class="groupheader">Macro Definition Documentation</h2>
  13.182 +<a id="a1d959c29af3125bdd37cde3a554e729c"></a>
  13.183 +<h2 class="memtitle"><span class="permalink"><a href="#a1d959c29af3125bdd37cde3a554e729c">&#9670;&nbsp;</a></span>ucx_array_util_set</h2>
  13.184 +
  13.185 +<div class="memitem">
  13.186 +<div class="memproto">
  13.187 +      <table class="memname">
  13.188 +        <tr>
  13.189 +          <td class="memname">#define ucx_array_util_set</td>
  13.190 +          <td>(</td>
  13.191 +          <td class="paramtype">&#160;</td>
  13.192 +          <td class="paramname">array, </td>
  13.193 +        </tr>
  13.194 +        <tr>
  13.195 +          <td class="paramkey"></td>
  13.196 +          <td></td>
  13.197 +          <td class="paramtype">&#160;</td>
  13.198 +          <td class="paramname">capacity, </td>
  13.199 +        </tr>
  13.200 +        <tr>
  13.201 +          <td class="paramkey"></td>
  13.202 +          <td></td>
  13.203 +          <td class="paramtype">&#160;</td>
  13.204 +          <td class="paramname">elmsize, </td>
  13.205 +        </tr>
  13.206 +        <tr>
  13.207 +          <td class="paramkey"></td>
  13.208 +          <td></td>
  13.209 +          <td class="paramtype">&#160;</td>
  13.210 +          <td class="paramname">idx, </td>
  13.211 +        </tr>
  13.212 +        <tr>
  13.213 +          <td class="paramkey"></td>
  13.214 +          <td></td>
  13.215 +          <td class="paramtype">&#160;</td>
  13.216 +          <td class="paramname">data&#160;</td>
  13.217 +        </tr>
  13.218 +        <tr>
  13.219 +          <td></td>
  13.220 +          <td>)</td>
  13.221 +          <td></td><td></td>
  13.222 +        </tr>
  13.223 +      </table>
  13.224 +</div><div class="memdoc">
  13.225 +<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>
  13.226 +<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>
  13.227 +</div><!-- fragment -->
  13.228 +<p>Sets an element in an arbitrary user defined array. </p>
  13.229 +<p>The data is copied from the specified data location.</p>
  13.230 +<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>
  13.231 +<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>
  13.232 +<dl class="params"><dt>Parameters</dt><dd>
  13.233 +  <table class="params">
  13.234 +    <tr><td class="paramname">array</td><td>a pointer to location of the array pointer </td></tr>
  13.235 +    <tr><td class="paramname">capacity</td><td>a pointer to the capacity </td></tr>
  13.236 +    <tr><td class="paramname">elmsize</td><td>the size of each element </td></tr>
  13.237 +    <tr><td class="paramname">idx</td><td>the index of the element to set </td></tr>
  13.238 +    <tr><td class="paramname">data</td><td>a pointer to the element data </td></tr>
  13.239 +  </table>
  13.240 +  </dd>
  13.241 +</dl>
  13.242 +<dl class="section return"><dt>Returns</dt><dd>zero on success or non-zero on error (errno will be set) </dd></dl>
  13.243 +
  13.244 +</div>
  13.245 +</div>
  13.246 +<a id="a59a5b342965e790945f9c7a3f86b99f9"></a>
  13.247 +<h2 class="memtitle"><span class="permalink"><a href="#a59a5b342965e790945f9c7a3f86b99f9">&#9670;&nbsp;</a></span>ucx_array_util_setptr</h2>
  13.248 +
  13.249 +<div class="memitem">
  13.250 +<div class="memproto">
  13.251 +      <table class="memname">
  13.252 +        <tr>
  13.253 +          <td class="memname">#define ucx_array_util_setptr</td>
  13.254 +          <td>(</td>
  13.255 +          <td class="paramtype">&#160;</td>
  13.256 +          <td class="paramname">array, </td>
  13.257 +        </tr>
  13.258 +        <tr>
  13.259 +          <td class="paramkey"></td>
  13.260 +          <td></td>
  13.261 +          <td class="paramtype">&#160;</td>
  13.262 +          <td class="paramname">capacity, </td>
  13.263 +        </tr>
  13.264 +        <tr>
  13.265 +          <td class="paramkey"></td>
  13.266 +          <td></td>
  13.267 +          <td class="paramtype">&#160;</td>
  13.268 +          <td class="paramname">idx, </td>
  13.269 +        </tr>
  13.270 +        <tr>
  13.271 +          <td class="paramkey"></td>
  13.272 +          <td></td>
  13.273 +          <td class="paramtype">&#160;</td>
  13.274 +          <td class="paramname">ptr&#160;</td>
  13.275 +        </tr>
  13.276 +        <tr>
  13.277 +          <td></td>
  13.278 +          <td>)</td>
  13.279 +          <td></td><td></td>
  13.280 +        </tr>
  13.281 +      </table>
  13.282 +</div><div class="memdoc">
  13.283 +<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>
  13.284 +<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>
  13.285 +</div><!-- fragment -->
  13.286 +<p>Stores a pointer in an arbitrary user defined array. </p>
  13.287 +<p>The element size of the array must be sizeof(void*).</p>
  13.288 +<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>
  13.289 +<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>
  13.290 +<dl class="params"><dt>Parameters</dt><dd>
  13.291 +  <table class="params">
  13.292 +    <tr><td class="paramname">array</td><td>a pointer to location of the array pointer </td></tr>
  13.293 +    <tr><td class="paramname">capacity</td><td>a pointer to the capacity </td></tr>
  13.294 +    <tr><td class="paramname">idx</td><td>the index of the element to set </td></tr>
  13.295 +    <tr><td class="paramname">ptr</td><td>the pointer to store </td></tr>
  13.296 +  </table>
  13.297 +  </dd>
  13.298 +</dl>
  13.299 +<dl class="section return"><dt>Returns</dt><dd>zero on success or non-zero on error (errno will be set) </dd></dl>
  13.300 +
  13.301 +</div>
  13.302 +</div>
  13.303 +<h2 class="groupheader">Function Documentation</h2>
  13.304 +<a id="aea01731ad94ea73c0c8fb1d1b7a35fcf"></a>
  13.305 +<h2 class="memtitle"><span class="permalink"><a href="#aea01731ad94ea73c0c8fb1d1b7a35fcf">&#9670;&nbsp;</a></span>ucx_array_append_from()</h2>
  13.306 +
  13.307 +<div class="memitem">
  13.308 +<div class="memproto">
  13.309 +      <table class="memname">
  13.310 +        <tr>
  13.311 +          <td class="memname">int ucx_array_append_from </td>
  13.312 +          <td>(</td>
  13.313 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
  13.314 +          <td class="paramname"><em>array</em>, </td>
  13.315 +        </tr>
  13.316 +        <tr>
  13.317 +          <td class="paramkey"></td>
  13.318 +          <td></td>
  13.319 +          <td class="paramtype">void *&#160;</td>
  13.320 +          <td class="paramname"><em>data</em>, </td>
  13.321 +        </tr>
  13.322 +        <tr>
  13.323 +          <td class="paramkey"></td>
  13.324 +          <td></td>
  13.325 +          <td class="paramtype">size_t&#160;</td>
  13.326 +          <td class="paramname"><em>count</em>&#160;</td>
  13.327 +        </tr>
  13.328 +        <tr>
  13.329 +          <td></td>
  13.330 +          <td>)</td>
  13.331 +          <td></td><td></td>
  13.332 +        </tr>
  13.333 +      </table>
  13.334 +</div><div class="memdoc">
  13.335 +
  13.336 +<p>Inserts elements at the end of the array. </p>
  13.337 +<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>
  13.338 +<dl class="params"><dt>Parameters</dt><dd>
  13.339 +  <table class="params">
  13.340 +    <tr><td class="paramname">array</td><td>a pointer the array where to append the data </td></tr>
  13.341 +    <tr><td class="paramname">data</td><td>a pointer to the data to insert (may be <code>NULL</code>) </td></tr>
  13.342 +    <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>
  13.343 +  </table>
  13.344 +  </dd>
  13.345 +</dl>
  13.346 +<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero if a reallocation was necessary but failed </dd></dl>
  13.347 +<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>
  13.348 +<dd>
  13.349 +ucx_array_append() </dd></dl>
  13.350 +
  13.351 +</div>
  13.352 +</div>
  13.353 +<a id="aa698085fd1a8b70d6b709999c51b49e8"></a>
  13.354 +<h2 class="memtitle"><span class="permalink"><a href="#aa698085fd1a8b70d6b709999c51b49e8">&#9670;&nbsp;</a></span>ucx_array_at()</h2>
  13.355 +
  13.356 +<div class="memitem">
  13.357 +<div class="memproto">
  13.358 +      <table class="memname">
  13.359 +        <tr>
  13.360 +          <td class="memname">void* ucx_array_at </td>
  13.361 +          <td>(</td>
  13.362 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> const *&#160;</td>
  13.363 +          <td class="paramname"><em>array</em>, </td>
  13.364 +        </tr>
  13.365 +        <tr>
  13.366 +          <td class="paramkey"></td>
  13.367 +          <td></td>
  13.368 +          <td class="paramtype">size_t&#160;</td>
  13.369 +          <td class="paramname"><em>index</em>&#160;</td>
  13.370 +        </tr>
  13.371 +        <tr>
  13.372 +          <td></td>
  13.373 +          <td>)</td>
  13.374 +          <td></td><td></td>
  13.375 +        </tr>
  13.376 +      </table>
  13.377 +</div><div class="memdoc">
  13.378 +
  13.379 +<p>Returns a pointer to the array element at the specified index. </p>
  13.380 +<dl class="params"><dt>Parameters</dt><dd>
  13.381 +  <table class="params">
  13.382 +    <tr><td class="paramname">array</td><td>the array to retrieve the element from </td></tr>
  13.383 +    <tr><td class="paramname">index</td><td>index of the element to return </td></tr>
  13.384 +  </table>
  13.385 +  </dd>
  13.386 +</dl>
  13.387 +<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>
  13.388 +
  13.389 +</div>
  13.390 +</div>
  13.391 +<a id="a4a8c273370e4a3a3e2624e364f5ab410"></a>
  13.392 +<h2 class="memtitle"><span class="permalink"><a href="#a4a8c273370e4a3a3e2624e364f5ab410">&#9670;&nbsp;</a></span>ucx_array_clone()</h2>
  13.393 +
  13.394 +<div class="memitem">
  13.395 +<div class="memproto">
  13.396 +      <table class="memname">
  13.397 +        <tr>
  13.398 +          <td class="memname">int ucx_array_clone </td>
  13.399 +          <td>(</td>
  13.400 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
  13.401 +          <td class="paramname"><em>dest</em>, </td>
  13.402 +        </tr>
  13.403 +        <tr>
  13.404 +          <td class="paramkey"></td>
  13.405 +          <td></td>
  13.406 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> const *&#160;</td>
  13.407 +          <td class="paramname"><em>src</em>&#160;</td>
  13.408 +        </tr>
  13.409 +        <tr>
  13.410 +          <td></td>
  13.411 +          <td>)</td>
  13.412 +          <td></td><td></td>
  13.413 +        </tr>
  13.414 +      </table>
  13.415 +</div><div class="memdoc">
  13.416 +
  13.417 +<p>Creates an shallow copy of an array. </p>
  13.418 +<p>This function clones the specified array by using memcpy(). If the destination capacity is insufficient, an automatic reallocation is attempted.</p>
  13.419 +<p>Note: if the destination array is uninitialized, the behavior is undefined.</p>
  13.420 +<dl class="params"><dt>Parameters</dt><dd>
  13.421 +  <table class="params">
  13.422 +    <tr><td class="paramname">dest</td><td>the array to copy to </td></tr>
  13.423 +    <tr><td class="paramname">src</td><td>the array to copy from </td></tr>
  13.424 +  </table>
  13.425 +  </dd>
  13.426 +</dl>
  13.427 +<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero on reallocation failure. </dd></dl>
  13.428 +
  13.429 +</div>
  13.430 +</div>
  13.431 +<a id="aa5a0bf3d3f0df6406beb0e569021cc28"></a>
  13.432 +<h2 class="memtitle"><span class="permalink"><a href="#aa5a0bf3d3f0df6406beb0e569021cc28">&#9670;&nbsp;</a></span>ucx_array_concat()</h2>
  13.433 +
  13.434 +<div class="memitem">
  13.435 +<div class="memproto">
  13.436 +      <table class="memname">
  13.437 +        <tr>
  13.438 +          <td class="memname">int ucx_array_concat </td>
  13.439 +          <td>(</td>
  13.440 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
  13.441 +          <td class="paramname"><em>array1</em>, </td>
  13.442 +        </tr>
  13.443 +        <tr>
  13.444 +          <td class="paramkey"></td>
  13.445 +          <td></td>
  13.446 +          <td class="paramtype">const <a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
  13.447 +          <td class="paramname"><em>array2</em>&#160;</td>
  13.448 +        </tr>
  13.449 +        <tr>
  13.450 +          <td></td>
  13.451 +          <td>)</td>
  13.452 +          <td></td><td></td>
  13.453 +        </tr>
  13.454 +      </table>
  13.455 +</div><div class="memdoc">
  13.456 +
  13.457 +<p>Concatenates two arrays. </p>
  13.458 +<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>
  13.459 +<p>The first array may grow automatically. If this fails, both arrays remain unmodified.</p>
  13.460 +<dl class="params"><dt>Parameters</dt><dd>
  13.461 +  <table class="params">
  13.462 +    <tr><td class="paramname">array1</td><td>first array </td></tr>
  13.463 +    <tr><td class="paramname">array2</td><td>second array </td></tr>
  13.464 +  </table>
  13.465 +  </dd>
  13.466 +</dl>
  13.467 +<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>
  13.468 +
  13.469 +</div>
  13.470 +</div>
  13.471 +<a id="a5241058cd2329147bc5b1593ae7e51dc"></a>
  13.472 +<h2 class="memtitle"><span class="permalink"><a href="#a5241058cd2329147bc5b1593ae7e51dc">&#9670;&nbsp;</a></span>ucx_array_contains()</h2>
  13.473 +
  13.474 +<div class="memitem">
  13.475 +<div class="memproto">
  13.476 +      <table class="memname">
  13.477 +        <tr>
  13.478 +          <td class="memname">int ucx_array_contains </td>
  13.479 +          <td>(</td>
  13.480 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> const *&#160;</td>
  13.481 +          <td class="paramname"><em>array</em>, </td>
  13.482 +        </tr>
  13.483 +        <tr>
  13.484 +          <td class="paramkey"></td>
  13.485 +          <td></td>
  13.486 +          <td class="paramtype">void *&#160;</td>
  13.487 +          <td class="paramname"><em>elem</em>, </td>
  13.488 +        </tr>
  13.489 +        <tr>
  13.490 +          <td class="paramkey"></td>
  13.491 +          <td></td>
  13.492 +          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
  13.493 +          <td class="paramname"><em>cmpfnc</em>, </td>
  13.494 +        </tr>
  13.495 +        <tr>
  13.496 +          <td class="paramkey"></td>
  13.497 +          <td></td>
  13.498 +          <td class="paramtype">void *&#160;</td>
  13.499 +          <td class="paramname"><em>data</em>&#160;</td>
  13.500 +        </tr>
  13.501 +        <tr>
  13.502 +          <td></td>
  13.503 +          <td>)</td>
  13.504 +          <td></td><td></td>
  13.505 +        </tr>
  13.506 +      </table>
  13.507 +</div><div class="memdoc">
  13.508 +
  13.509 +<p>Checks, if an array contains a specific element. </p>
  13.510 +<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>
  13.511 +<dl class="params"><dt>Parameters</dt><dd>
  13.512 +  <table class="params">
  13.513 +    <tr><td class="paramname">array</td><td>the array where to search for the data </td></tr>
  13.514 +    <tr><td class="paramname">elem</td><td>the element data </td></tr>
  13.515 +    <tr><td class="paramname">cmpfnc</td><td>the compare function </td></tr>
  13.516 +    <tr><td class="paramname">data</td><td>additional data for the compare function </td></tr>
  13.517 +  </table>
  13.518 +  </dd>
  13.519 +</dl>
  13.520 +<dl class="section return"><dt>Returns</dt><dd>1, if and only if the array contains the specified element data </dd></dl>
  13.521 +<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>
  13.522 +
  13.523 +</div>
  13.524 +</div>
  13.525 +<a id="a8e83681d8d5d8cddbf10f63ce5be4c10"></a>
  13.526 +<h2 class="memtitle"><span class="permalink"><a href="#a8e83681d8d5d8cddbf10f63ce5be4c10">&#9670;&nbsp;</a></span>ucx_array_destroy()</h2>
  13.527 +
  13.528 +<div class="memitem">
  13.529 +<div class="memproto">
  13.530 +      <table class="memname">
  13.531 +        <tr>
  13.532 +          <td class="memname">void ucx_array_destroy </td>
  13.533 +          <td>(</td>
  13.534 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
  13.535 +          <td class="paramname"><em>array</em></td><td>)</td>
  13.536 +          <td></td>
  13.537 +        </tr>
  13.538 +      </table>
  13.539 +</div><div class="memdoc">
  13.540 +
  13.541 +<p>Destroys the array. </p>
  13.542 +<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>
  13.543 +<dl class="params"><dt>Parameters</dt><dd>
  13.544 +  <table class="params">
  13.545 +    <tr><td class="paramname">array</td><td>the array to destroy </td></tr>
  13.546 +  </table>
  13.547 +  </dd>
  13.548 +</dl>
  13.549 +
  13.550 +</div>
  13.551 +</div>
  13.552 +<a id="a43292b448adb1741677aa8c578bcc201"></a>
  13.553 +<h2 class="memtitle"><span class="permalink"><a href="#a43292b448adb1741677aa8c578bcc201">&#9670;&nbsp;</a></span>ucx_array_equals()</h2>
  13.554 +
  13.555 +<div class="memitem">
  13.556 +<div class="memproto">
  13.557 +      <table class="memname">
  13.558 +        <tr>
  13.559 +          <td class="memname">int ucx_array_equals </td>
  13.560 +          <td>(</td>
  13.561 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> const *&#160;</td>
  13.562 +          <td class="paramname"><em>array1</em>, </td>
  13.563 +        </tr>
  13.564 +        <tr>
  13.565 +          <td class="paramkey"></td>
  13.566 +          <td></td>
  13.567 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> const *&#160;</td>
  13.568 +          <td class="paramname"><em>array2</em>, </td>
  13.569 +        </tr>
  13.570 +        <tr>
  13.571 +          <td class="paramkey"></td>
  13.572 +          <td></td>
  13.573 +          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
  13.574 +          <td class="paramname"><em>cmpfnc</em>, </td>
  13.575 +        </tr>
  13.576 +        <tr>
  13.577 +          <td class="paramkey"></td>
  13.578 +          <td></td>
  13.579 +          <td class="paramtype">void *&#160;</td>
  13.580 +          <td class="paramname"><em>data</em>&#160;</td>
  13.581 +        </tr>
  13.582 +        <tr>
  13.583 +          <td></td>
  13.584 +          <td>)</td>
  13.585 +          <td></td><td></td>
  13.586 +        </tr>
  13.587 +      </table>
  13.588 +</div><div class="memdoc">
  13.589 +
  13.590 +<p>Compares two UCX arrays element-wise by using a compare function. </p>
  13.591 +<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>
  13.592 +<p>This function always returns zero, if the element sizes of the arrays do not match and performs no comparisons in this case.</p>
  13.593 +<dl class="params"><dt>Parameters</dt><dd>
  13.594 +  <table class="params">
  13.595 +    <tr><td class="paramname">array1</td><td>the first array </td></tr>
  13.596 +    <tr><td class="paramname">array2</td><td>the second array </td></tr>
  13.597 +    <tr><td class="paramname">cmpfnc</td><td>the compare function </td></tr>
  13.598 +    <tr><td class="paramname">data</td><td>additional data for the compare function </td></tr>
  13.599 +  </table>
  13.600 +  </dd>
  13.601 +</dl>
  13.602 +<dl class="section return"><dt>Returns</dt><dd>1, if and only if the two arrays equal element-wise, 0 otherwise </dd></dl>
  13.603 +
  13.604 +</div>
  13.605 +</div>
  13.606 +<a id="ae7bdbed94afee9b20b38b95e3ab470f0"></a>
  13.607 +<h2 class="memtitle"><span class="permalink"><a href="#ae7bdbed94afee9b20b38b95e3ab470f0">&#9670;&nbsp;</a></span>ucx_array_find()</h2>
  13.608 +
  13.609 +<div class="memitem">
  13.610 +<div class="memproto">
  13.611 +      <table class="memname">
  13.612 +        <tr>
  13.613 +          <td class="memname">size_t ucx_array_find </td>
  13.614 +          <td>(</td>
  13.615 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> const *&#160;</td>
  13.616 +          <td class="paramname"><em>array</em>, </td>
  13.617 +        </tr>
  13.618 +        <tr>
  13.619 +          <td class="paramkey"></td>
  13.620 +          <td></td>
  13.621 +          <td class="paramtype">void *&#160;</td>
  13.622 +          <td class="paramname"><em>elem</em>, </td>
  13.623 +        </tr>
  13.624 +        <tr>
  13.625 +          <td class="paramkey"></td>
  13.626 +          <td></td>
  13.627 +          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
  13.628 +          <td class="paramname"><em>cmpfnc</em>, </td>
  13.629 +        </tr>
  13.630 +        <tr>
  13.631 +          <td class="paramkey"></td>
  13.632 +          <td></td>
  13.633 +          <td class="paramtype">void *&#160;</td>
  13.634 +          <td class="paramname"><em>data</em>&#160;</td>
  13.635 +        </tr>
  13.636 +        <tr>
  13.637 +          <td></td>
  13.638 +          <td>)</td>
  13.639 +          <td></td><td></td>
  13.640 +        </tr>
  13.641 +      </table>
  13.642 +</div><div class="memdoc">
  13.643 +
  13.644 +<p>Returns the index of an element containing the specified data. </p>
  13.645 +<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>
  13.646 +<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>
  13.647 +<dl class="params"><dt>Parameters</dt><dd>
  13.648 +  <table class="params">
  13.649 +    <tr><td class="paramname">array</td><td>the array where to search for the data </td></tr>
  13.650 +    <tr><td class="paramname">elem</td><td>the element data </td></tr>
  13.651 +    <tr><td class="paramname">cmpfnc</td><td>the compare function </td></tr>
  13.652 +    <tr><td class="paramname">data</td><td>additional data for the compare function </td></tr>
  13.653 +  </table>
  13.654 +  </dd>
  13.655 +</dl>
  13.656 +<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>
  13.657 +
  13.658 +</div>
  13.659 +</div>
  13.660 +<a id="ac01ee914468a16f470bf3071fffbe438"></a>
  13.661 +<h2 class="memtitle"><span class="permalink"><a href="#ac01ee914468a16f470bf3071fffbe438">&#9670;&nbsp;</a></span>ucx_array_free()</h2>
  13.662 +
  13.663 +<div class="memitem">
  13.664 +<div class="memproto">
  13.665 +      <table class="memname">
  13.666 +        <tr>
  13.667 +          <td class="memname">void ucx_array_free </td>
  13.668 +          <td>(</td>
  13.669 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
  13.670 +          <td class="paramname"><em>array</em></td><td>)</td>
  13.671 +          <td></td>
  13.672 +        </tr>
  13.673 +      </table>
  13.674 +</div><div class="memdoc">
  13.675 +
  13.676 +<p>Destroys and frees the array. </p>
  13.677 +<dl class="params"><dt>Parameters</dt><dd>
  13.678 +  <table class="params">
  13.679 +    <tr><td class="paramname">array</td><td>the array to free </td></tr>
  13.680 +  </table>
  13.681 +  </dd>
  13.682 +</dl>
  13.683 +
  13.684 +</div>
  13.685 +</div>
  13.686 +<a id="ab0cbf243824aaebee48277315e03afce"></a>
  13.687 +<h2 class="memtitle"><span class="permalink"><a href="#ab0cbf243824aaebee48277315e03afce">&#9670;&nbsp;</a></span>ucx_array_grow()</h2>
  13.688 +
  13.689 +<div class="memitem">
  13.690 +<div class="memproto">
  13.691 +      <table class="memname">
  13.692 +        <tr>
  13.693 +          <td class="memname">int ucx_array_grow </td>
  13.694 +          <td>(</td>
  13.695 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
  13.696 +          <td class="paramname"><em>array</em>, </td>
  13.697 +        </tr>
  13.698 +        <tr>
  13.699 +          <td class="paramkey"></td>
  13.700 +          <td></td>
  13.701 +          <td class="paramtype">size_t&#160;</td>
  13.702 +          <td class="paramname"><em>count</em>&#160;</td>
  13.703 +        </tr>
  13.704 +        <tr>
  13.705 +          <td></td>
  13.706 +          <td>)</td>
  13.707 +          <td></td><td></td>
  13.708 +        </tr>
  13.709 +      </table>
  13.710 +</div><div class="memdoc">
  13.711 +
  13.712 +<p>Resizes the capacity, if the specified number of elements would not fit. </p>
  13.713 +<p>A call to ucx_array_grow(array, count) is effectively the same as ucx_array_reserve(array, array-&gt;size+count).</p>
  13.714 +<dl class="params"><dt>Parameters</dt><dd>
  13.715 +  <table class="params">
  13.716 +    <tr><td class="paramname">array</td><td>a pointer to the array </td></tr>
  13.717 +    <tr><td class="paramname">count</td><td>the number of elements that should additionally fit into the array </td></tr>
  13.718 +  </table>
  13.719 +  </dd>
  13.720 +</dl>
  13.721 +<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero if reallocation failed </dd></dl>
  13.722 +
  13.723 +</div>
  13.724 +</div>
  13.725 +<a id="ad921e85c28ffae32230777a53c5037e5"></a>
  13.726 +<h2 class="memtitle"><span class="permalink"><a href="#ad921e85c28ffae32230777a53c5037e5">&#9670;&nbsp;</a></span>ucx_array_init()</h2>
  13.727 +
  13.728 +<div class="memitem">
  13.729 +<div class="memproto">
  13.730 +      <table class="memname">
  13.731 +        <tr>
  13.732 +          <td class="memname">void ucx_array_init </td>
  13.733 +          <td>(</td>
  13.734 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
  13.735 +          <td class="paramname"><em>array</em>, </td>
  13.736 +        </tr>
  13.737 +        <tr>
  13.738 +          <td class="paramkey"></td>
  13.739 +          <td></td>
  13.740 +          <td class="paramtype">size_t&#160;</td>
  13.741 +          <td class="paramname"><em>capacity</em>, </td>
  13.742 +        </tr>
  13.743 +        <tr>
  13.744 +          <td class="paramkey"></td>
  13.745 +          <td></td>
  13.746 +          <td class="paramtype">size_t&#160;</td>
  13.747 +          <td class="paramname"><em>elemsize</em>&#160;</td>
  13.748 +        </tr>
  13.749 +        <tr>
  13.750 +          <td></td>
  13.751 +          <td>)</td>
  13.752 +          <td></td><td></td>
  13.753 +        </tr>
  13.754 +      </table>
  13.755 +</div><div class="memdoc">
  13.756 +
  13.757 +<p>Initializes a UCX array structure with the given capacity and element size. </p>
  13.758 +<p>The structure must be uninitialized as the data pointer will be overwritten.</p>
  13.759 +<dl class="params"><dt>Parameters</dt><dd>
  13.760 +  <table class="params">
  13.761 +    <tr><td class="paramname">array</td><td>the structure to initialize </td></tr>
  13.762 +    <tr><td class="paramname">capacity</td><td>the initial capacity </td></tr>
  13.763 +    <tr><td class="paramname">elemsize</td><td>the element size </td></tr>
  13.764 +  </table>
  13.765 +  </dd>
  13.766 +</dl>
  13.767 +
  13.768 +</div>
  13.769 +</div>
  13.770 +<a id="a2451e61ebb15a7ba1c1319267ba75b8c"></a>
  13.771 +<h2 class="memtitle"><span class="permalink"><a href="#a2451e61ebb15a7ba1c1319267ba75b8c">&#9670;&nbsp;</a></span>ucx_array_init_a()</h2>
  13.772 +
  13.773 +<div class="memitem">
  13.774 +<div class="memproto">
  13.775 +      <table class="memname">
  13.776 +        <tr>
  13.777 +          <td class="memname">void ucx_array_init_a </td>
  13.778 +          <td>(</td>
  13.779 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
  13.780 +          <td class="paramname"><em>array</em>, </td>
  13.781 +        </tr>
  13.782 +        <tr>
  13.783 +          <td class="paramkey"></td>
  13.784 +          <td></td>
  13.785 +          <td class="paramtype">size_t&#160;</td>
  13.786 +          <td class="paramname"><em>capacity</em>, </td>
  13.787 +        </tr>
  13.788 +        <tr>
  13.789 +          <td class="paramkey"></td>
  13.790 +          <td></td>
  13.791 +          <td class="paramtype">size_t&#160;</td>
  13.792 +          <td class="paramname"><em>elemsize</em>, </td>
  13.793 +        </tr>
  13.794 +        <tr>
  13.795 +          <td class="paramkey"></td>
  13.796 +          <td></td>
  13.797 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
  13.798 +          <td class="paramname"><em>allocator</em>&#160;</td>
  13.799 +        </tr>
  13.800 +        <tr>
  13.801 +          <td></td>
  13.802 +          <td>)</td>
  13.803 +          <td></td><td></td>
  13.804 +        </tr>
  13.805 +      </table>
  13.806 +</div><div class="memdoc">
  13.807 +
  13.808 +<p>Initializes a UCX array structure using the specified allocator. </p>
  13.809 +<p>The structure must be uninitialized as the data pointer will be overwritten.</p>
  13.810 +<dl class="params"><dt>Parameters</dt><dd>
  13.811 +  <table class="params">
  13.812 +    <tr><td class="paramname">array</td><td>the structure to initialize </td></tr>
  13.813 +    <tr><td class="paramname">capacity</td><td>the initial capacity </td></tr>
  13.814 +    <tr><td class="paramname">elemsize</td><td>the element size </td></tr>
  13.815 +    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
  13.816 +  </table>
  13.817 +  </dd>
  13.818 +</dl>
  13.819 +
  13.820 +</div>
  13.821 +</div>
  13.822 +<a id="a994a2fbf1c33a3833e2a70cd9a4352b7"></a>
  13.823 +<h2 class="memtitle"><span class="permalink"><a href="#a994a2fbf1c33a3833e2a70cd9a4352b7">&#9670;&nbsp;</a></span>ucx_array_new()</h2>
  13.824 +
  13.825 +<div class="memitem">
  13.826 +<div class="memproto">
  13.827 +      <table class="memname">
  13.828 +        <tr>
  13.829 +          <td class="memname"><a class="el" href="structUcxArray.html">UcxArray</a>* ucx_array_new </td>
  13.830 +          <td>(</td>
  13.831 +          <td class="paramtype">size_t&#160;</td>
  13.832 +          <td class="paramname"><em>capacity</em>, </td>
  13.833 +        </tr>
  13.834 +        <tr>
  13.835 +          <td class="paramkey"></td>
  13.836 +          <td></td>
  13.837 +          <td class="paramtype">size_t&#160;</td>
  13.838 +          <td class="paramname"><em>elemsize</em>&#160;</td>
  13.839 +        </tr>
  13.840 +        <tr>
  13.841 +          <td></td>
  13.842 +          <td>)</td>
  13.843 +          <td></td><td></td>
  13.844 +        </tr>
  13.845 +      </table>
  13.846 +</div><div class="memdoc">
  13.847 +
  13.848 +<p>Creates a new UCX array with the given capacity and element size. </p>
  13.849 +<dl class="params"><dt>Parameters</dt><dd>
  13.850 +  <table class="params">
  13.851 +    <tr><td class="paramname">capacity</td><td>the initial capacity </td></tr>
  13.852 +    <tr><td class="paramname">elemsize</td><td>the element size </td></tr>
  13.853 +  </table>
  13.854 +  </dd>
  13.855 +</dl>
  13.856 +<dl class="section return"><dt>Returns</dt><dd>a pointer to a new UCX array structure </dd></dl>
  13.857 +
  13.858 +</div>
  13.859 +</div>
  13.860 +<a id="a177170258c215eb2e4f5a32e59f0cb1b"></a>
  13.861 +<h2 class="memtitle"><span class="permalink"><a href="#a177170258c215eb2e4f5a32e59f0cb1b">&#9670;&nbsp;</a></span>ucx_array_new_a()</h2>
  13.862 +
  13.863 +<div class="memitem">
  13.864 +<div class="memproto">
  13.865 +      <table class="memname">
  13.866 +        <tr>
  13.867 +          <td class="memname"><a class="el" href="structUcxArray.html">UcxArray</a>* ucx_array_new_a </td>
  13.868 +          <td>(</td>
  13.869 +          <td class="paramtype">size_t&#160;</td>
  13.870 +          <td class="paramname"><em>capacity</em>, </td>
  13.871 +        </tr>
  13.872 +        <tr>
  13.873 +          <td class="paramkey"></td>
  13.874 +          <td></td>
  13.875 +          <td class="paramtype">size_t&#160;</td>
  13.876 +          <td class="paramname"><em>elemsize</em>, </td>
  13.877 +        </tr>
  13.878 +        <tr>
  13.879 +          <td class="paramkey"></td>
  13.880 +          <td></td>
  13.881 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
  13.882 +          <td class="paramname"><em>allocator</em>&#160;</td>
  13.883 +        </tr>
  13.884 +        <tr>
  13.885 +          <td></td>
  13.886 +          <td>)</td>
  13.887 +          <td></td><td></td>
  13.888 +        </tr>
  13.889 +      </table>
  13.890 +</div><div class="memdoc">
  13.891 +
  13.892 +<p>Creates a new UCX array using the specified allocator. </p>
  13.893 +<dl class="params"><dt>Parameters</dt><dd>
  13.894 +  <table class="params">
  13.895 +    <tr><td class="paramname">capacity</td><td>the initial capacity </td></tr>
  13.896 +    <tr><td class="paramname">elemsize</td><td>the element size </td></tr>
  13.897 +    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
  13.898 +  </table>
  13.899 +  </dd>
  13.900 +</dl>
  13.901 +<dl class="section return"><dt>Returns</dt><dd>a pointer to new UCX array structure </dd></dl>
  13.902 +
  13.903 +</div>
  13.904 +</div>
  13.905 +<a id="a95b52acc2193b5c33cf0eaa4f2082477"></a>
  13.906 +<h2 class="memtitle"><span class="permalink"><a href="#a95b52acc2193b5c33cf0eaa4f2082477">&#9670;&nbsp;</a></span>ucx_array_prepend_from()</h2>
  13.907 +
  13.908 +<div class="memitem">
  13.909 +<div class="memproto">
  13.910 +      <table class="memname">
  13.911 +        <tr>
  13.912 +          <td class="memname">int ucx_array_prepend_from </td>
  13.913 +          <td>(</td>
  13.914 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
  13.915 +          <td class="paramname"><em>array</em>, </td>
  13.916 +        </tr>
  13.917 +        <tr>
  13.918 +          <td class="paramkey"></td>
  13.919 +          <td></td>
  13.920 +          <td class="paramtype">void *&#160;</td>
  13.921 +          <td class="paramname"><em>data</em>, </td>
  13.922 +        </tr>
  13.923 +        <tr>
  13.924 +          <td class="paramkey"></td>
  13.925 +          <td></td>
  13.926 +          <td class="paramtype">size_t&#160;</td>
  13.927 +          <td class="paramname"><em>count</em>&#160;</td>
  13.928 +        </tr>
  13.929 +        <tr>
  13.930 +          <td></td>
  13.931 +          <td>)</td>
  13.932 +          <td></td><td></td>
  13.933 +        </tr>
  13.934 +      </table>
  13.935 +</div><div class="memdoc">
  13.936 +
  13.937 +<p>Inserts elements at the beginning of the array. </p>
  13.938 +<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>
  13.939 +<dl class="params"><dt>Parameters</dt><dd>
  13.940 +  <table class="params">
  13.941 +    <tr><td class="paramname">array</td><td>a pointer the array where to prepend the data </td></tr>
  13.942 +    <tr><td class="paramname">data</td><td>a pointer to the data to insert (may be <code>NULL</code>) </td></tr>
  13.943 +    <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>
  13.944 +  </table>
  13.945 +  </dd>
  13.946 +</dl>
  13.947 +<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero if a reallocation was necessary but failed </dd></dl>
  13.948 +<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>
  13.949 +<dd>
  13.950 +<a class="el" href="array_8h.html#a1bb545d065358d265d80d815ba382a28" title="Sets elements starting at the specified index. ">ucx_array_set_from()</a> </dd>
  13.951 +<dd>
  13.952 +ucx_array_prepend() </dd></dl>
  13.953 +
  13.954 +</div>
  13.955 +</div>
  13.956 +<a id="aa45eac6b697f83adac81c0860cf306b8"></a>
  13.957 +<h2 class="memtitle"><span class="permalink"><a href="#aa45eac6b697f83adac81c0860cf306b8">&#9670;&nbsp;</a></span>ucx_array_remove()</h2>
  13.958 +
  13.959 +<div class="memitem">
  13.960 +<div class="memproto">
  13.961 +      <table class="memname">
  13.962 +        <tr>
  13.963 +          <td class="memname">void ucx_array_remove </td>
  13.964 +          <td>(</td>
  13.965 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
  13.966 +          <td class="paramname"><em>array</em>, </td>
  13.967 +        </tr>
  13.968 +        <tr>
  13.969 +          <td class="paramkey"></td>
  13.970 +          <td></td>
  13.971 +          <td class="paramtype">size_t&#160;</td>
  13.972 +          <td class="paramname"><em>index</em>&#160;</td>
  13.973 +        </tr>
  13.974 +        <tr>
  13.975 +          <td></td>
  13.976 +          <td>)</td>
  13.977 +          <td></td><td></td>
  13.978 +        </tr>
  13.979 +      </table>
  13.980 +</div><div class="memdoc">
  13.981 +
  13.982 +<p>Removes an element from the array. </p>
  13.983 +<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>
  13.984 +<dl class="params"><dt>Parameters</dt><dd>
  13.985 +  <table class="params">
  13.986 +    <tr><td class="paramname">array</td><td>pointer to the array from which the element shall be removed </td></tr>
  13.987 +    <tr><td class="paramname">index</td><td>the index of the element to remove </td></tr>
  13.988 +  </table>
  13.989 +  </dd>
  13.990 +</dl>
  13.991 +
  13.992 +</div>
  13.993 +</div>
  13.994 +<a id="a548d81b07612bae3ba8c4c4b49104b8e"></a>
  13.995 +<h2 class="memtitle"><span class="permalink"><a href="#a548d81b07612bae3ba8c4c4b49104b8e">&#9670;&nbsp;</a></span>ucx_array_remove_fast()</h2>
  13.996 +
  13.997 +<div class="memitem">
  13.998 +<div class="memproto">
  13.999 +      <table class="memname">
 13.1000 +        <tr>
 13.1001 +          <td class="memname">void ucx_array_remove_fast </td>
 13.1002 +          <td>(</td>
 13.1003 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
 13.1004 +          <td class="paramname"><em>array</em>, </td>
 13.1005 +        </tr>
 13.1006 +        <tr>
 13.1007 +          <td class="paramkey"></td>
 13.1008 +          <td></td>
 13.1009 +          <td class="paramtype">size_t&#160;</td>
 13.1010 +          <td class="paramname"><em>index</em>&#160;</td>
 13.1011 +        </tr>
 13.1012 +        <tr>
 13.1013 +          <td></td>
 13.1014 +          <td>)</td>
 13.1015 +          <td></td><td></td>
 13.1016 +        </tr>
 13.1017 +      </table>
 13.1018 +</div><div class="memdoc">
 13.1019 +
 13.1020 +<p>Removes an element from the array. </p>
 13.1021 +<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>
 13.1022 +<dl class="params"><dt>Parameters</dt><dd>
 13.1023 +  <table class="params">
 13.1024 +    <tr><td class="paramname">array</td><td>pointer to the array from which the element shall be removed </td></tr>
 13.1025 +    <tr><td class="paramname">index</td><td>the index of the element to remove </td></tr>
 13.1026 +  </table>
 13.1027 +  </dd>
 13.1028 +</dl>
 13.1029 +
 13.1030 +</div>
 13.1031 +</div>
 13.1032 +<a id="a1c3bf8433c1de3c933f3854ab297fe1d"></a>
 13.1033 +<h2 class="memtitle"><span class="permalink"><a href="#a1c3bf8433c1de3c933f3854ab297fe1d">&#9670;&nbsp;</a></span>ucx_array_reserve()</h2>
 13.1034 +
 13.1035 +<div class="memitem">
 13.1036 +<div class="memproto">
 13.1037 +      <table class="memname">
 13.1038 +        <tr>
 13.1039 +          <td class="memname">int ucx_array_reserve </td>
 13.1040 +          <td>(</td>
 13.1041 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
 13.1042 +          <td class="paramname"><em>array</em>, </td>
 13.1043 +        </tr>
 13.1044 +        <tr>
 13.1045 +          <td class="paramkey"></td>
 13.1046 +          <td></td>
 13.1047 +          <td class="paramtype">size_t&#160;</td>
 13.1048 +          <td class="paramname"><em>capacity</em>&#160;</td>
 13.1049 +        </tr>
 13.1050 +        <tr>
 13.1051 +          <td></td>
 13.1052 +          <td>)</td>
 13.1053 +          <td></td><td></td>
 13.1054 +        </tr>
 13.1055 +      </table>
 13.1056 +</div><div class="memdoc">
 13.1057 +
 13.1058 +<p>Resizes the array only, if the capacity is insufficient. </p>
 13.1059 +<p>If the requested capacity is smaller than the current capacity, this function does nothing.</p>
 13.1060 +<dl class="params"><dt>Parameters</dt><dd>
 13.1061 +  <table class="params">
 13.1062 +    <tr><td class="paramname">array</td><td>a pointer to the array </td></tr>
 13.1063 +    <tr><td class="paramname">capacity</td><td>the guaranteed capacity </td></tr>
 13.1064 +  </table>
 13.1065 +  </dd>
 13.1066 +</dl>
 13.1067 +<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero if reallocation failed </dd></dl>
 13.1068 +
 13.1069 +</div>
 13.1070 +</div>
 13.1071 +<a id="a27762e7c06a6c781015e3c8ceeee0ce3"></a>
 13.1072 +<h2 class="memtitle"><span class="permalink"><a href="#a27762e7c06a6c781015e3c8ceeee0ce3">&#9670;&nbsp;</a></span>ucx_array_resize()</h2>
 13.1073 +
 13.1074 +<div class="memitem">
 13.1075 +<div class="memproto">
 13.1076 +      <table class="memname">
 13.1077 +        <tr>
 13.1078 +          <td class="memname">int ucx_array_resize </td>
 13.1079 +          <td>(</td>
 13.1080 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
 13.1081 +          <td class="paramname"><em>array</em>, </td>
 13.1082 +        </tr>
 13.1083 +        <tr>
 13.1084 +          <td class="paramkey"></td>
 13.1085 +          <td></td>
 13.1086 +          <td class="paramtype">size_t&#160;</td>
 13.1087 +          <td class="paramname"><em>capacity</em>&#160;</td>
 13.1088 +        </tr>
 13.1089 +        <tr>
 13.1090 +          <td></td>
 13.1091 +          <td>)</td>
 13.1092 +          <td></td><td></td>
 13.1093 +        </tr>
 13.1094 +      </table>
 13.1095 +</div><div class="memdoc">
 13.1096 +
 13.1097 +<p>Sets the capacity of the array. </p>
 13.1098 +<p>If the new capacity is smaller than the size of the array, the elements are removed and the size is adjusted accordingly.</p>
 13.1099 +<dl class="params"><dt>Parameters</dt><dd>
 13.1100 +  <table class="params">
 13.1101 +    <tr><td class="paramname">array</td><td>a pointer to the array </td></tr>
 13.1102 +    <tr><td class="paramname">capacity</td><td>the new capacity </td></tr>
 13.1103 +  </table>
 13.1104 +  </dd>
 13.1105 +</dl>
 13.1106 +<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero if reallocation failed </dd></dl>
 13.1107 +
 13.1108 +</div>
 13.1109 +</div>
 13.1110 +<a id="a1bb545d065358d265d80d815ba382a28"></a>
 13.1111 +<h2 class="memtitle"><span class="permalink"><a href="#a1bb545d065358d265d80d815ba382a28">&#9670;&nbsp;</a></span>ucx_array_set_from()</h2>
 13.1112 +
 13.1113 +<div class="memitem">
 13.1114 +<div class="memproto">
 13.1115 +      <table class="memname">
 13.1116 +        <tr>
 13.1117 +          <td class="memname">int ucx_array_set_from </td>
 13.1118 +          <td>(</td>
 13.1119 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
 13.1120 +          <td class="paramname"><em>array</em>, </td>
 13.1121 +        </tr>
 13.1122 +        <tr>
 13.1123 +          <td class="paramkey"></td>
 13.1124 +          <td></td>
 13.1125 +          <td class="paramtype">size_t&#160;</td>
 13.1126 +          <td class="paramname"><em>index</em>, </td>
 13.1127 +        </tr>
 13.1128 +        <tr>
 13.1129 +          <td class="paramkey"></td>
 13.1130 +          <td></td>
 13.1131 +          <td class="paramtype">void *&#160;</td>
 13.1132 +          <td class="paramname"><em>data</em>, </td>
 13.1133 +        </tr>
 13.1134 +        <tr>
 13.1135 +          <td class="paramkey"></td>
 13.1136 +          <td></td>
 13.1137 +          <td class="paramtype">size_t&#160;</td>
 13.1138 +          <td class="paramname"><em>count</em>&#160;</td>
 13.1139 +        </tr>
 13.1140 +        <tr>
 13.1141 +          <td></td>
 13.1142 +          <td>)</td>
 13.1143 +          <td></td><td></td>
 13.1144 +        </tr>
 13.1145 +      </table>
 13.1146 +</div><div class="memdoc">
 13.1147 +
 13.1148 +<p>Sets elements starting at the specified index. </p>
 13.1149 +<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>
 13.1150 +<dl class="params"><dt>Parameters</dt><dd>
 13.1151 +  <table class="params">
 13.1152 +    <tr><td class="paramname">array</td><td>a pointer the array where to set the data </td></tr>
 13.1153 +    <tr><td class="paramname">index</td><td>the index of the element to set </td></tr>
 13.1154 +    <tr><td class="paramname">data</td><td>a pointer to the data to insert (may be <code>NULL</code>) </td></tr>
 13.1155 +    <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>
 13.1156 +  </table>
 13.1157 +  </dd>
 13.1158 +</dl>
 13.1159 +<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero if a reallocation was necessary but failed </dd></dl>
 13.1160 +<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>
 13.1161 +<dd>
 13.1162 +ucx_array_set() </dd></dl>
 13.1163 +
 13.1164 +</div>
 13.1165 +</div>
 13.1166 +<a id="a2daf50e80aee9bccebee876a7efd2dfc"></a>
 13.1167 +<h2 class="memtitle"><span class="permalink"><a href="#a2daf50e80aee9bccebee876a7efd2dfc">&#9670;&nbsp;</a></span>ucx_array_shrink()</h2>
 13.1168 +
 13.1169 +<div class="memitem">
 13.1170 +<div class="memproto">
 13.1171 +      <table class="memname">
 13.1172 +        <tr>
 13.1173 +          <td class="memname">int ucx_array_shrink </td>
 13.1174 +          <td>(</td>
 13.1175 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
 13.1176 +          <td class="paramname"><em>array</em></td><td>)</td>
 13.1177 +          <td></td>
 13.1178 +        </tr>
 13.1179 +      </table>
 13.1180 +</div><div class="memdoc">
 13.1181 +
 13.1182 +<p>Shrinks the memory to exactly fit the contents. </p>
 13.1183 +<p>After this operation, the capacity equals the size.</p>
 13.1184 +<dl class="params"><dt>Parameters</dt><dd>
 13.1185 +  <table class="params">
 13.1186 +    <tr><td class="paramname">array</td><td>a pointer to the array </td></tr>
 13.1187 +  </table>
 13.1188 +  </dd>
 13.1189 +</dl>
 13.1190 +<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero if reallocation failed </dd></dl>
 13.1191 +
 13.1192 +</div>
 13.1193 +</div>
 13.1194 +<a id="add773514569b872a6624381b4b6af52c"></a>
 13.1195 +<h2 class="memtitle"><span class="permalink"><a href="#add773514569b872a6624381b4b6af52c">&#9670;&nbsp;</a></span>ucx_array_sort()</h2>
 13.1196 +
 13.1197 +<div class="memitem">
 13.1198 +<div class="memproto">
 13.1199 +      <table class="memname">
 13.1200 +        <tr>
 13.1201 +          <td class="memname">void ucx_array_sort </td>
 13.1202 +          <td>(</td>
 13.1203 +          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
 13.1204 +          <td class="paramname"><em>array</em>, </td>
 13.1205 +        </tr>
 13.1206 +        <tr>
 13.1207 +          <td class="paramkey"></td>
 13.1208 +          <td></td>
 13.1209 +          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
 13.1210 +          <td class="paramname"><em>cmpfnc</em>, </td>
 13.1211 +        </tr>
 13.1212 +        <tr>
 13.1213 +          <td class="paramkey"></td>
 13.1214 +          <td></td>
 13.1215 +          <td class="paramtype">void *&#160;</td>
 13.1216 +          <td class="paramname"><em>data</em>&#160;</td>
 13.1217 +        </tr>
 13.1218 +        <tr>
 13.1219 +          <td></td>
 13.1220 +          <td>)</td>
 13.1221 +          <td></td><td></td>
 13.1222 +        </tr>
 13.1223 +      </table>
 13.1224 +</div><div class="memdoc">
 13.1225 +
 13.1226 +<p>Sorts a <a class="el" href="structUcxArray.html" title="UCX array type. ">UcxArray</a> with the best available sort algorithm. </p>
 13.1227 +<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>
 13.1228 +<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>
 13.1229 +<dl class="params"><dt>Parameters</dt><dd>
 13.1230 +  <table class="params">
 13.1231 +    <tr><td class="paramname">array</td><td>the array to sort </td></tr>
 13.1232 +    <tr><td class="paramname">cmpfnc</td><td>the function that shall be used to compare the element data </td></tr>
 13.1233 +    <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>
 13.1234 +  </table>
 13.1235 +  </dd>
 13.1236 +</dl>
 13.1237 +
 13.1238 +</div>
 13.1239 +</div>
 13.1240 +<a id="ad0a8d76980cf1c1910e64a245803fb9a"></a>
 13.1241 +<h2 class="memtitle"><span class="permalink"><a href="#ad0a8d76980cf1c1910e64a245803fb9a">&#9670;&nbsp;</a></span>ucx_array_util_set_a()</h2>
 13.1242 +
 13.1243 +<div class="memitem">
 13.1244 +<div class="memproto">
 13.1245 +      <table class="memname">
 13.1246 +        <tr>
 13.1247 +          <td class="memname">int ucx_array_util_set_a </td>
 13.1248 +          <td>(</td>
 13.1249 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
 13.1250 +          <td class="paramname"><em>alloc</em>, </td>
 13.1251 +        </tr>
 13.1252 +        <tr>
 13.1253 +          <td class="paramkey"></td>
 13.1254 +          <td></td>
 13.1255 +          <td class="paramtype">void **&#160;</td>
 13.1256 +          <td class="paramname"><em>array</em>, </td>
 13.1257 +        </tr>
 13.1258 +        <tr>
 13.1259 +          <td class="paramkey"></td>
 13.1260 +          <td></td>
 13.1261 +          <td class="paramtype">size_t *&#160;</td>
 13.1262 +          <td class="paramname"><em>capacity</em>, </td>
 13.1263 +        </tr>
 13.1264 +        <tr>
 13.1265 +          <td class="paramkey"></td>
 13.1266 +          <td></td>
 13.1267 +          <td class="paramtype">size_t&#160;</td>
 13.1268 +          <td class="paramname"><em>elmsize</em>, </td>
 13.1269 +        </tr>
 13.1270 +        <tr>
 13.1271 +          <td class="paramkey"></td>
 13.1272 +          <td></td>
 13.1273 +          <td class="paramtype">size_t&#160;</td>
 13.1274 +          <td class="paramname"><em>idx</em>, </td>
 13.1275 +        </tr>
 13.1276 +        <tr>
 13.1277 +          <td class="paramkey"></td>
 13.1278 +          <td></td>
 13.1279 +          <td class="paramtype">void *&#160;</td>
 13.1280 +          <td class="paramname"><em>data</em>&#160;</td>
 13.1281 +        </tr>
 13.1282 +        <tr>
 13.1283 +          <td></td>
 13.1284 +          <td>)</td>
 13.1285 +          <td></td><td></td>
 13.1286 +        </tr>
 13.1287 +      </table>
 13.1288 +</div><div class="memdoc">
 13.1289 +
 13.1290 +<p>Sets an element in an arbitrary user defined array. </p>
 13.1291 +<p>The data is copied from the specified data location.</p>
 13.1292 +<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>
 13.1293 +<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>
 13.1294 +<dl class="params"><dt>Parameters</dt><dd>
 13.1295 +  <table class="params">
 13.1296 +    <tr><td class="paramname">alloc</td><td>the allocator that shall be used to reallocate the array </td></tr>
 13.1297 +    <tr><td class="paramname">array</td><td>a pointer to location of the array pointer </td></tr>
 13.1298 +    <tr><td class="paramname">capacity</td><td>a pointer to the capacity </td></tr>
 13.1299 +    <tr><td class="paramname">elmsize</td><td>the size of each element </td></tr>
 13.1300 +    <tr><td class="paramname">idx</td><td>the index of the element to set </td></tr>
 13.1301 +    <tr><td class="paramname">data</td><td>a pointer to the element data </td></tr>
 13.1302 +  </table>
 13.1303 +  </dd>
 13.1304 +</dl>
 13.1305 +<dl class="section return"><dt>Returns</dt><dd>zero on success or non-zero on error (errno will be set) </dd></dl>
 13.1306 +
 13.1307 +</div>
 13.1308 +</div>
 13.1309 +<a id="ad708b333c0c1b02c998309a58ea65e31"></a>
 13.1310 +<h2 class="memtitle"><span class="permalink"><a href="#ad708b333c0c1b02c998309a58ea65e31">&#9670;&nbsp;</a></span>ucx_array_util_setptr_a()</h2>
 13.1311 +
 13.1312 +<div class="memitem">
 13.1313 +<div class="memproto">
 13.1314 +      <table class="memname">
 13.1315 +        <tr>
 13.1316 +          <td class="memname">int ucx_array_util_setptr_a </td>
 13.1317 +          <td>(</td>
 13.1318 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
 13.1319 +          <td class="paramname"><em>alloc</em>, </td>
 13.1320 +        </tr>
 13.1321 +        <tr>
 13.1322 +          <td class="paramkey"></td>
 13.1323 +          <td></td>
 13.1324 +          <td class="paramtype">void **&#160;</td>
 13.1325 +          <td class="paramname"><em>array</em>, </td>
 13.1326 +        </tr>
 13.1327 +        <tr>
 13.1328 +          <td class="paramkey"></td>
 13.1329 +          <td></td>
 13.1330 +          <td class="paramtype">size_t *&#160;</td>
 13.1331 +          <td class="paramname"><em>capacity</em>, </td>
 13.1332 +        </tr>
 13.1333 +        <tr>
 13.1334 +          <td class="paramkey"></td>
 13.1335 +          <td></td>
 13.1336 +          <td class="paramtype">size_t&#160;</td>
 13.1337 +          <td class="paramname"><em>idx</em>, </td>
 13.1338 +        </tr>
 13.1339 +        <tr>
 13.1340 +          <td class="paramkey"></td>
 13.1341 +          <td></td>
 13.1342 +          <td class="paramtype">void *&#160;</td>
 13.1343 +          <td class="paramname"><em>ptr</em>&#160;</td>
 13.1344 +        </tr>
 13.1345 +        <tr>
 13.1346 +          <td></td>
 13.1347 +          <td>)</td>
 13.1348 +          <td></td><td></td>
 13.1349 +        </tr>
 13.1350 +      </table>
 13.1351 +</div><div class="memdoc">
 13.1352 +
 13.1353 +<p>Stores a pointer in an arbitrary user defined array. </p>
 13.1354 +<p>The element size of the array must be sizeof(void*).</p>
 13.1355 +<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>
 13.1356 +<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>
 13.1357 +<dl class="params"><dt>Parameters</dt><dd>
 13.1358 +  <table class="params">
 13.1359 +    <tr><td class="paramname">alloc</td><td>the allocator that shall be used to reallocate the array </td></tr>
 13.1360 +    <tr><td class="paramname">array</td><td>a pointer to location of the array pointer </td></tr>
 13.1361 +    <tr><td class="paramname">capacity</td><td>a pointer to the capacity </td></tr>
 13.1362 +    <tr><td class="paramname">idx</td><td>the index of the element to set </td></tr>
 13.1363 +    <tr><td class="paramname">ptr</td><td>the pointer to store </td></tr>
 13.1364 +  </table>
 13.1365 +  </dd>
 13.1366 +</dl>
 13.1367 +<dl class="section return"><dt>Returns</dt><dd>zero on success or non-zero on error (errno will be set) </dd></dl>
 13.1368 +
 13.1369 +</div>
 13.1370 +</div>
 13.1371 +</div><!-- contents -->
 13.1372 +<!-- start footer part -->
 13.1373 +<hr class="footer"/><address class="footer"><small>
 13.1374 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 13.1375 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 13.1376 +</a> 1.8.13
 13.1377 +</small></address>
 13.1378 +</body>
 13.1379 +</html>
    14.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    14.2 +++ b/docs/api-2.1/array_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
    14.3 @@ -0,0 +1,113 @@
    14.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    14.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    14.6 +<head>
    14.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    14.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    14.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   14.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   14.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/array.h Source File</title>
   14.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   14.13 +<script type="text/javascript" src="jquery.js"></script>
   14.14 +<script type="text/javascript" src="dynsections.js"></script>
   14.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   14.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   14.17 +<script type="text/javascript" src="search/search.js"></script>
   14.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   14.19 +</head>
   14.20 +<body>
   14.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   14.22 +<div id="titlearea">
   14.23 +<table cellspacing="0" cellpadding="0">
   14.24 + <tbody>
   14.25 + <tr style="height: 56px;">
   14.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   14.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   14.28 +   <div id="projectname">ucx
   14.29 +   </div>
   14.30 +   <div id="projectbrief">UAP Common Extensions</div>
   14.31 +  </td>
   14.32 + </tr>
   14.33 + </tbody>
   14.34 +</table>
   14.35 +</div>
   14.36 +<!-- end header part -->
   14.37 +<!-- Generated by Doxygen 1.8.13 -->
   14.38 +<script type="text/javascript">
   14.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   14.40 +</script>
   14.41 +<script type="text/javascript" src="menudata.js"></script>
   14.42 +<script type="text/javascript" src="menu.js"></script>
   14.43 +<script type="text/javascript">
   14.44 +$(function() {
   14.45 +  initMenu('',true,false,'search.php','Search');
   14.46 +  $(document).ready(function() { init_search(); });
   14.47 +});
   14.48 +</script>
   14.49 +<div id="main-nav"></div>
   14.50 +<!-- window showing the filter options -->
   14.51 +<div id="MSearchSelectWindow"
   14.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   14.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   14.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   14.55 +</div>
   14.56 +
   14.57 +<!-- iframe showing the search results (closed by default) -->
   14.58 +<div id="MSearchResultsWindow">
   14.59 +<iframe src="javascript:void(0)" frameborder="0" 
   14.60 +        name="MSearchResults" id="MSearchResults">
   14.61 +</iframe>
   14.62 +</div>
   14.63 +
   14.64 +<div id="nav-path" class="navpath">
   14.65 +  <ul>
   14.66 +<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>
   14.67 +</div>
   14.68 +</div><!-- top -->
   14.69 +<div class="header">
   14.70 +  <div class="headertitle">
   14.71 +<div class="title">array.h</div>  </div>
   14.72 +</div><!--header-->
   14.73 +<div class="contents">
   14.74 +<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>
   14.75 +<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>
   14.76 +<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>
   14.77 +<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>
   14.78 +<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>
   14.79 +<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>
   14.80 +<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>
   14.81 +<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>
   14.82 +<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>
   14.83 +<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>
   14.84 +<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>
   14.85 +<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>
   14.86 +<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>
   14.87 +<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>
   14.88 +<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>
   14.89 +<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>
   14.90 +<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>
   14.91 +<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>
   14.92 +<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>
   14.93 +<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>
   14.94 +<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>
   14.95 +<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>
   14.96 +<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>
   14.97 +<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>
   14.98 +<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>
   14.99 +<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>
  14.100 +<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>
  14.101 +<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>
  14.102 +<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>
  14.103 +<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>
  14.104 +<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>
  14.105 +<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>
  14.106 +<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>
  14.107 +<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>
  14.108 +</div><!-- fragment --></div><!-- contents -->
  14.109 +<!-- start footer part -->
  14.110 +<hr class="footer"/><address class="footer"><small>
  14.111 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  14.112 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  14.113 +</a> 1.8.13
  14.114 +</small></address>
  14.115 +</body>
  14.116 +</html>
    15.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    15.2 +++ b/docs/api-2.1/avl_8h.html	Sat Feb 06 19:11:44 2021 +0100
    15.3 @@ -0,0 +1,883 @@
    15.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    15.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    15.6 +<head>
    15.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    15.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    15.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   15.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   15.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/avl.h File Reference</title>
   15.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   15.13 +<script type="text/javascript" src="jquery.js"></script>
   15.14 +<script type="text/javascript" src="dynsections.js"></script>
   15.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   15.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   15.17 +<script type="text/javascript" src="search/search.js"></script>
   15.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   15.19 +</head>
   15.20 +<body>
   15.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   15.22 +<div id="titlearea">
   15.23 +<table cellspacing="0" cellpadding="0">
   15.24 + <tbody>
   15.25 + <tr style="height: 56px;">
   15.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   15.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   15.28 +   <div id="projectname">ucx
   15.29 +   </div>
   15.30 +   <div id="projectbrief">UAP Common Extensions</div>
   15.31 +  </td>
   15.32 + </tr>
   15.33 + </tbody>
   15.34 +</table>
   15.35 +</div>
   15.36 +<!-- end header part -->
   15.37 +<!-- Generated by Doxygen 1.8.13 -->
   15.38 +<script type="text/javascript">
   15.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   15.40 +</script>
   15.41 +<script type="text/javascript" src="menudata.js"></script>
   15.42 +<script type="text/javascript" src="menu.js"></script>
   15.43 +<script type="text/javascript">
   15.44 +$(function() {
   15.45 +  initMenu('',true,false,'search.php','Search');
   15.46 +  $(document).ready(function() { init_search(); });
   15.47 +});
   15.48 +</script>
   15.49 +<div id="main-nav"></div>
   15.50 +<!-- window showing the filter options -->
   15.51 +<div id="MSearchSelectWindow"
   15.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   15.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   15.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   15.55 +</div>
   15.56 +
   15.57 +<!-- iframe showing the search results (closed by default) -->
   15.58 +<div id="MSearchResultsWindow">
   15.59 +<iframe src="javascript:void(0)" frameborder="0" 
   15.60 +        name="MSearchResults" id="MSearchResults">
   15.61 +</iframe>
   15.62 +</div>
   15.63 +
   15.64 +<div id="nav-path" class="navpath">
   15.65 +  <ul>
   15.66 +<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>
   15.67 +</div>
   15.68 +</div><!-- top -->
   15.69 +<div class="header">
   15.70 +  <div class="summary">
   15.71 +<a href="#nested-classes">Data Structures</a> &#124;
   15.72 +<a href="#define-members">Macros</a> &#124;
   15.73 +<a href="#typedef-members">Typedefs</a> &#124;
   15.74 +<a href="#func-members">Functions</a>  </div>
   15.75 +  <div class="headertitle">
   15.76 +<div class="title">avl.h File Reference</div>  </div>
   15.77 +</div><!--header-->
   15.78 +<div class="contents">
   15.79 +
   15.80 +<p>AVL tree implementation.  
   15.81 +<a href="#details">More...</a></p>
   15.82 +<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
   15.83 +<code>#include &quot;<a class="el" href="allocator_8h_source.html">allocator.h</a>&quot;</code><br />
   15.84 +<code>#include &lt;inttypes.h&gt;</code><br />
   15.85 +</div>
   15.86 +<p><a href="avl_8h_source.html">Go to the source code of this file.</a></p>
   15.87 +<table class="memberdecls">
   15.88 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
   15.89 +Data Structures</h2></td></tr>
   15.90 +<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>
   15.91 +<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX AVL Node.  <a href="structUcxAVLNode.html#details">More...</a><br /></td></tr>
   15.92 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   15.93 +<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>
   15.94 +<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX AVL Tree.  <a href="structUcxAVLTree.html#details">More...</a><br /></td></tr>
   15.95 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   15.96 +</table><table class="memberdecls">
   15.97 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
   15.98 +Macros</h2></td></tr>
   15.99 +<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>
  15.100 +<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>
  15.101 +<tr class="separator:ac2886d4b79b48c9fabf6408873f84cd2"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.102 +<tr class="memitem:aaaf4a6f6f661cda7791db239212285d9"><td class="memItemLeft" align="right" valign="top"><a id="aaaf4a6f6f661cda7791db239212285d9"></a>
  15.103 +#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>
  15.104 +<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>
  15.105 +<tr class="separator:aaaf4a6f6f661cda7791db239212285d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.106 +<tr class="memitem:abd2446d544d5412b6997ee8a17bd368c"><td class="memItemLeft" align="right" valign="top"><a id="abd2446d544d5412b6997ee8a17bd368c"></a>
  15.107 +#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>
  15.108 +<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>
  15.109 +<tr class="separator:abd2446d544d5412b6997ee8a17bd368c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.110 +<tr class="memitem:ac74ee7649c1e206b08b31f37dd68ca5e"><td class="memItemLeft" align="right" valign="top"><a id="ac74ee7649c1e206b08b31f37dd68ca5e"></a>
  15.111 +#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>
  15.112 +<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>
  15.113 +<tr class="separator:ac74ee7649c1e206b08b31f37dd68ca5e"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.114 +<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>
  15.115 +<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>
  15.116 +<tr class="separator:af16f24d74fd6af0154de041566c6603b"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.117 +</table><table class="memberdecls">
  15.118 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
  15.119 +Typedefs</h2></td></tr>
  15.120 +<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>
  15.121 +<tr class="memdesc:a08ba2496c2316df58548c3cc29712add"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX AVL Node type.  <a href="#a08ba2496c2316df58548c3cc29712add">More...</a><br /></td></tr>
  15.122 +<tr class="separator:a08ba2496c2316df58548c3cc29712add"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.123 +</table><table class="memberdecls">
  15.124 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
  15.125 +Functions</h2></td></tr>
  15.126 +<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>
  15.127 +<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>
  15.128 +<tr class="separator:a11b043d65a11b7092d5d98b298e5ede3"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.129 +<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>
  15.130 +<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>
  15.131 +<tr class="separator:af0f868d67e9dc08b4867c02a06c23ee2"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.132 +<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>
  15.133 +<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>
  15.134 +<tr class="separator:a2f92db538f25fce908d2cb3e5590944c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.135 +<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>
  15.136 +<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>
  15.137 +<tr class="separator:a31ad7fb196ca211f1fc39f4e15f72279"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.138 +<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>
  15.139 +<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>
  15.140 +<tr class="separator:acf42da9a4168e47dc10b4ba0d27ceb4e"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.141 +<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>
  15.142 +<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>
  15.143 +<tr class="separator:adbcf7ceb3f014a30c7214f7304519efe"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.144 +<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>
  15.145 +<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>
  15.146 +<tr class="separator:a664986f64d6865605199fbff06e19cd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.147 +<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>
  15.148 +<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>
  15.149 +<tr class="separator:a51770e1614b28d7d22dea096c3704f83"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.150 +<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>
  15.151 +<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>
  15.152 +<tr class="separator:aec401fab4a24a7edffa734f9baf88577"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.153 +<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>
  15.154 +<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>
  15.155 +<tr class="separator:a32cf8955cc0226a82bacfc7b76d6474c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.156 +<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>
  15.157 +<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>
  15.158 +<tr class="separator:a9a792b7d9e58073deef74a341f8bc720"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.159 +<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>
  15.160 +<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>
  15.161 +<tr class="separator:a1d821119c805d7fbb7e424bc3effeba9"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.162 +<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>
  15.163 +<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>
  15.164 +<tr class="separator:a01aeeecd6415f0cc2b623486eb28f254"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.165 +<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>
  15.166 +<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>
  15.167 +<tr class="separator:a92c1d41c2b22fe4a029a486ab2153e35"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.168 +<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>
  15.169 +<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>
  15.170 +<tr class="separator:a0e739aeb66dda6a6a3f6eb51b50cf346"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.171 +<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>
  15.172 +<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>
  15.173 +<tr class="separator:aab1ad9b027ff5e50671aa0ee84e2d541"><td class="memSeparator" colspan="2">&#160;</td></tr>
  15.174 +</table>
  15.175 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  15.176 +<div class="textblock"><p>AVL tree implementation. </p>
  15.177 +<p>This binary search tree implementation allows average O(1) insertion and removal of elements (excluding binary search time).</p>
  15.178 +<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
  15.179 +<dd>
  15.180 +Olaf Wintermann </dd></dl>
  15.181 +</div><h2 class="groupheader">Macro Definition Documentation</h2>
  15.182 +<a id="ac2886d4b79b48c9fabf6408873f84cd2"></a>
  15.183 +<h2 class="memtitle"><span class="permalink"><a href="#ac2886d4b79b48c9fabf6408873f84cd2">&#9670;&nbsp;</a></span>ucx_avl_default_new</h2>
  15.184 +
  15.185 +<div class="memitem">
  15.186 +<div class="memproto">
  15.187 +      <table class="memname">
  15.188 +        <tr>
  15.189 +          <td class="memname">#define ucx_avl_default_new</td>
  15.190 +          <td>(</td>
  15.191 +          <td class="paramname"></td><td>)</td>
  15.192 +          <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>
  15.193 +        </tr>
  15.194 +      </table>
  15.195 +</div><div class="memdoc">
  15.196 +
  15.197 +<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>
  15.198 +<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>
  15.199 +
  15.200 +</div>
  15.201 +</div>
  15.202 +<a id="af16f24d74fd6af0154de041566c6603b"></a>
  15.203 +<h2 class="memtitle"><span class="permalink"><a href="#af16f24d74fd6af0154de041566c6603b">&#9670;&nbsp;</a></span>UCX_AVL_FIND_CLOSEST</h2>
  15.204 +
  15.205 +<div class="memitem">
  15.206 +<div class="memproto">
  15.207 +      <table class="memname">
  15.208 +        <tr>
  15.209 +          <td class="memname">#define UCX_AVL_FIND_CLOSEST&#160;&#160;&#160;3</td>
  15.210 +        </tr>
  15.211 +      </table>
  15.212 +</div><div class="memdoc">
  15.213 +
  15.214 +<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>
  15.215 +<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>
  15.216 +
  15.217 +</div>
  15.218 +</div>
  15.219 +<h2 class="groupheader">Typedef Documentation</h2>
  15.220 +<a id="a08ba2496c2316df58548c3cc29712add"></a>
  15.221 +<h2 class="memtitle"><span class="permalink"><a href="#a08ba2496c2316df58548c3cc29712add">&#9670;&nbsp;</a></span>UcxAVLNode</h2>
  15.222 +
  15.223 +<div class="memitem">
  15.224 +<div class="memproto">
  15.225 +      <table class="memname">
  15.226 +        <tr>
  15.227 +          <td class="memname">typedef struct <a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> <a class="el" href="structUcxAVLNode.html">UcxAVLNode</a></td>
  15.228 +        </tr>
  15.229 +      </table>
  15.230 +</div><div class="memdoc">
  15.231 +
  15.232 +<p>UCX AVL Node type. </p>
  15.233 +<dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxAVLNode.html" title="UCX AVL Node. ">UcxAVLNode</a> </dd></dl>
  15.234 +
  15.235 +</div>
  15.236 +</div>
  15.237 +<h2 class="groupheader">Function Documentation</h2>
  15.238 +<a id="a92c1d41c2b22fe4a029a486ab2153e35"></a>
  15.239 +<h2 class="memtitle"><span class="permalink"><a href="#a92c1d41c2b22fe4a029a486ab2153e35">&#9670;&nbsp;</a></span>ucx_avl_count()</h2>
  15.240 +
  15.241 +<div class="memitem">
  15.242 +<div class="memproto">
  15.243 +      <table class="memname">
  15.244 +        <tr>
  15.245 +          <td class="memname">size_t ucx_avl_count </td>
  15.246 +          <td>(</td>
  15.247 +          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
  15.248 +          <td class="paramname"><em>tree</em></td><td>)</td>
  15.249 +          <td></td>
  15.250 +        </tr>
  15.251 +      </table>
  15.252 +</div><div class="memdoc">
  15.253 +
  15.254 +<p>Counts the nodes in the specified <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a>. </p>
  15.255 +<dl class="params"><dt>Parameters</dt><dd>
  15.256 +  <table class="params">
  15.257 +    <tr><td class="paramname">tree</td><td>the AVL tree </td></tr>
  15.258 +  </table>
  15.259 +  </dd>
  15.260 +</dl>
  15.261 +<dl class="section return"><dt>Returns</dt><dd>the node count </dd></dl>
  15.262 +
  15.263 +</div>
  15.264 +</div>
  15.265 +<a id="a51770e1614b28d7d22dea096c3704f83"></a>
  15.266 +<h2 class="memtitle"><span class="permalink"><a href="#a51770e1614b28d7d22dea096c3704f83">&#9670;&nbsp;</a></span>ucx_avl_find()</h2>
  15.267 +
  15.268 +<div class="memitem">
  15.269 +<div class="memproto">
  15.270 +      <table class="memname">
  15.271 +        <tr>
  15.272 +          <td class="memname">void* ucx_avl_find </td>
  15.273 +          <td>(</td>
  15.274 +          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
  15.275 +          <td class="paramname"><em>tree</em>, </td>
  15.276 +        </tr>
  15.277 +        <tr>
  15.278 +          <td class="paramkey"></td>
  15.279 +          <td></td>
  15.280 +          <td class="paramtype">intptr_t&#160;</td>
  15.281 +          <td class="paramname"><em>key</em>, </td>
  15.282 +        </tr>
  15.283 +        <tr>
  15.284 +          <td class="paramkey"></td>
  15.285 +          <td></td>
  15.286 +          <td class="paramtype"><a class="el" href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">distance_func</a>&#160;</td>
  15.287 +          <td class="paramname"><em>dfnc</em>, </td>
  15.288 +        </tr>
  15.289 +        <tr>
  15.290 +          <td class="paramkey"></td>
  15.291 +          <td></td>
  15.292 +          <td class="paramtype">int&#160;</td>
  15.293 +          <td class="paramname"><em>mode</em>&#160;</td>
  15.294 +        </tr>
  15.295 +        <tr>
  15.296 +          <td></td>
  15.297 +          <td>)</td>
  15.298 +          <td></td><td></td>
  15.299 +        </tr>
  15.300 +      </table>
  15.301 +</div><div class="memdoc">
  15.302 +
  15.303 +<p>Finds a value within the tree. </p>
  15.304 +<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>
  15.305 +<dl class="params"><dt>Parameters</dt><dd>
  15.306 +  <table class="params">
  15.307 +    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
  15.308 +    <tr><td class="paramname">key</td><td>the key </td></tr>
  15.309 +    <tr><td class="paramname">dfnc</td><td>the distance function </td></tr>
  15.310 +    <tr><td class="paramname">mode</td><td>the find mode </td></tr>
  15.311 +  </table>
  15.312 +  </dd>
  15.313 +</dl>
  15.314 +<dl class="section return"><dt>Returns</dt><dd>the value (or <code>NULL</code>, if no value can be found) </dd></dl>
  15.315 +
  15.316 +</div>
  15.317 +</div>
  15.318 +<a id="a664986f64d6865605199fbff06e19cd5"></a>
  15.319 +<h2 class="memtitle"><span class="permalink"><a href="#a664986f64d6865605199fbff06e19cd5">&#9670;&nbsp;</a></span>ucx_avl_find_node()</h2>
  15.320 +
  15.321 +<div class="memitem">
  15.322 +<div class="memproto">
  15.323 +      <table class="memname">
  15.324 +        <tr>
  15.325 +          <td class="memname"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a>* ucx_avl_find_node </td>
  15.326 +          <td>(</td>
  15.327 +          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
  15.328 +          <td class="paramname"><em>tree</em>, </td>
  15.329 +        </tr>
  15.330 +        <tr>
  15.331 +          <td class="paramkey"></td>
  15.332 +          <td></td>
  15.333 +          <td class="paramtype">intptr_t&#160;</td>
  15.334 +          <td class="paramname"><em>key</em>, </td>
  15.335 +        </tr>
  15.336 +        <tr>
  15.337 +          <td class="paramkey"></td>
  15.338 +          <td></td>
  15.339 +          <td class="paramtype"><a class="el" href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">distance_func</a>&#160;</td>
  15.340 +          <td class="paramname"><em>dfnc</em>, </td>
  15.341 +        </tr>
  15.342 +        <tr>
  15.343 +          <td class="paramkey"></td>
  15.344 +          <td></td>
  15.345 +          <td class="paramtype">int&#160;</td>
  15.346 +          <td class="paramname"><em>mode</em>&#160;</td>
  15.347 +        </tr>
  15.348 +        <tr>
  15.349 +          <td></td>
  15.350 +          <td>)</td>
  15.351 +          <td></td><td></td>
  15.352 +        </tr>
  15.353 +      </table>
  15.354 +</div><div class="memdoc">
  15.355 +
  15.356 +<p>Finds a node within the tree. </p>
  15.357 +<p>The following modes are supported: </p><ul>
  15.358 +<li>
  15.359 +<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>
  15.360 +<li>
  15.361 +<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>
  15.362 +<li>
  15.363 +<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>
  15.364 +<li>
  15.365 +<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>
  15.366 +</ul>
  15.367 +<p>The distance function provided MUST agree with the compare function of the AVL tree.</p>
  15.368 +<dl class="params"><dt>Parameters</dt><dd>
  15.369 +  <table class="params">
  15.370 +    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
  15.371 +    <tr><td class="paramname">key</td><td>the key </td></tr>
  15.372 +    <tr><td class="paramname">dfnc</td><td>the distance function </td></tr>
  15.373 +    <tr><td class="paramname">mode</td><td>the find mode </td></tr>
  15.374 +  </table>
  15.375 +  </dd>
  15.376 +</dl>
  15.377 +<dl class="section return"><dt>Returns</dt><dd>the node (or <code>NULL</code>, if no node can be found) </dd></dl>
  15.378 +
  15.379 +</div>
  15.380 +</div>
  15.381 +<a id="a2f92db538f25fce908d2cb3e5590944c"></a>
  15.382 +<h2 class="memtitle"><span class="permalink"><a href="#a2f92db538f25fce908d2cb3e5590944c">&#9670;&nbsp;</a></span>ucx_avl_free()</h2>
  15.383 +
  15.384 +<div class="memitem">
  15.385 +<div class="memproto">
  15.386 +      <table class="memname">
  15.387 +        <tr>
  15.388 +          <td class="memname">void ucx_avl_free </td>
  15.389 +          <td>(</td>
  15.390 +          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
  15.391 +          <td class="paramname"><em>tree</em></td><td>)</td>
  15.392 +          <td></td>
  15.393 +        </tr>
  15.394 +      </table>
  15.395 +</div><div class="memdoc">
  15.396 +
  15.397 +<p>Destroys a <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a>. </p>
  15.398 +<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>
  15.399 +<dl class="params"><dt>Parameters</dt><dd>
  15.400 +  <table class="params">
  15.401 +    <tr><td class="paramname">tree</td><td>the tree to destroy </td></tr>
  15.402 +  </table>
  15.403 +  </dd>
  15.404 +</dl>
  15.405 +<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>
  15.406 +
  15.407 +</div>
  15.408 +</div>
  15.409 +<a id="a31ad7fb196ca211f1fc39f4e15f72279"></a>
  15.410 +<h2 class="memtitle"><span class="permalink"><a href="#a31ad7fb196ca211f1fc39f4e15f72279">&#9670;&nbsp;</a></span>ucx_avl_free_content()</h2>
  15.411 +
  15.412 +<div class="memitem">
  15.413 +<div class="memproto">
  15.414 +      <table class="memname">
  15.415 +        <tr>
  15.416 +          <td class="memname">void ucx_avl_free_content </td>
  15.417 +          <td>(</td>
  15.418 +          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
  15.419 +          <td class="paramname"><em>tree</em>, </td>
  15.420 +        </tr>
  15.421 +        <tr>
  15.422 +          <td class="paramkey"></td>
  15.423 +          <td></td>
  15.424 +          <td class="paramtype"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a>&#160;</td>
  15.425 +          <td class="paramname"><em>destr</em>&#160;</td>
  15.426 +        </tr>
  15.427 +        <tr>
  15.428 +          <td></td>
  15.429 +          <td>)</td>
  15.430 +          <td></td><td></td>
  15.431 +        </tr>
  15.432 +      </table>
  15.433 +</div><div class="memdoc">
  15.434 +
  15.435 +<p>Frees the contents of a <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a>. </p>
  15.436 +<p>This is a convenience function that iterates over the tree and passes all values to the specified destructor function.</p>
  15.437 +<p>If no destructor is specified (<code>NULL</code>), the free() function of the tree's own allocator is used.</p>
  15.438 +<p>You must ensure, that it is valid to pass each value in the map to the same destructor function.</p>
  15.439 +<p>You should free the entire tree afterwards, as the contents will be invalid.</p>
  15.440 +<dl class="params"><dt>Parameters</dt><dd>
  15.441 +  <table class="params">
  15.442 +    <tr><td class="paramname">tree</td><td>for which the contents shall be freed </td></tr>
  15.443 +    <tr><td class="paramname">destr</td><td>optional pointer to a destructor function </td></tr>
  15.444 +  </table>
  15.445 +  </dd>
  15.446 +</dl>
  15.447 +<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>
  15.448 +
  15.449 +</div>
  15.450 +</div>
  15.451 +<a id="adbcf7ceb3f014a30c7214f7304519efe"></a>
  15.452 +<h2 class="memtitle"><span class="permalink"><a href="#adbcf7ceb3f014a30c7214f7304519efe">&#9670;&nbsp;</a></span>ucx_avl_get()</h2>
  15.453 +
  15.454 +<div class="memitem">
  15.455 +<div class="memproto">
  15.456 +      <table class="memname">
  15.457 +        <tr>
  15.458 +          <td class="memname">void* ucx_avl_get </td>
  15.459 +          <td>(</td>
  15.460 +          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
  15.461 +          <td class="paramname"><em>tree</em>, </td>
  15.462 +        </tr>
  15.463 +        <tr>
  15.464 +          <td class="paramkey"></td>
  15.465 +          <td></td>
  15.466 +          <td class="paramtype">intptr_t&#160;</td>
  15.467 +          <td class="paramname"><em>key</em>&#160;</td>
  15.468 +        </tr>
  15.469 +        <tr>
  15.470 +          <td></td>
  15.471 +          <td>)</td>
  15.472 +          <td></td><td></td>
  15.473 +        </tr>
  15.474 +      </table>
  15.475 +</div><div class="memdoc">
  15.476 +
  15.477 +<p>Gets the value from the tree, that is associated with the specified key. </p>
  15.478 +<dl class="params"><dt>Parameters</dt><dd>
  15.479 +  <table class="params">
  15.480 +    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
  15.481 +    <tr><td class="paramname">key</td><td>the key </td></tr>
  15.482 +  </table>
  15.483 +  </dd>
  15.484 +</dl>
  15.485 +<dl class="section return"><dt>Returns</dt><dd>the value (or <code>NULL</code>, if the key is not present) </dd></dl>
  15.486 +
  15.487 +</div>
  15.488 +</div>
  15.489 +<a id="acf42da9a4168e47dc10b4ba0d27ceb4e"></a>
  15.490 +<h2 class="memtitle"><span class="permalink"><a href="#acf42da9a4168e47dc10b4ba0d27ceb4e">&#9670;&nbsp;</a></span>ucx_avl_get_node()</h2>
  15.491 +
  15.492 +<div class="memitem">
  15.493 +<div class="memproto">
  15.494 +      <table class="memname">
  15.495 +        <tr>
  15.496 +          <td class="memname"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a>* ucx_avl_get_node </td>
  15.497 +          <td>(</td>
  15.498 +          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
  15.499 +          <td class="paramname"><em>tree</em>, </td>
  15.500 +        </tr>
  15.501 +        <tr>
  15.502 +          <td class="paramkey"></td>
  15.503 +          <td></td>
  15.504 +          <td class="paramtype">intptr_t&#160;</td>
  15.505 +          <td class="paramname"><em>key</em>&#160;</td>
  15.506 +        </tr>
  15.507 +        <tr>
  15.508 +          <td></td>
  15.509 +          <td>)</td>
  15.510 +          <td></td><td></td>
  15.511 +        </tr>
  15.512 +      </table>
  15.513 +</div><div class="memdoc">
  15.514 +
  15.515 +<p>Gets the node from the tree, that is associated with the specified key. </p>
  15.516 +<dl class="params"><dt>Parameters</dt><dd>
  15.517 +  <table class="params">
  15.518 +    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
  15.519 +    <tr><td class="paramname">key</td><td>the key </td></tr>
  15.520 +  </table>
  15.521 +  </dd>
  15.522 +</dl>
  15.523 +<dl class="section return"><dt>Returns</dt><dd>the node (or <code>NULL</code>, if the key is not present) </dd></dl>
  15.524 +
  15.525 +</div>
  15.526 +</div>
  15.527 +<a id="a11b043d65a11b7092d5d98b298e5ede3"></a>
  15.528 +<h2 class="memtitle"><span class="permalink"><a href="#a11b043d65a11b7092d5d98b298e5ede3">&#9670;&nbsp;</a></span>ucx_avl_new()</h2>
  15.529 +
  15.530 +<div class="memitem">
  15.531 +<div class="memproto">
  15.532 +      <table class="memname">
  15.533 +        <tr>
  15.534 +          <td class="memname"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a>* ucx_avl_new </td>
  15.535 +          <td>(</td>
  15.536 +          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
  15.537 +          <td class="paramname"><em>cmpfunc</em></td><td>)</td>
  15.538 +          <td></td>
  15.539 +        </tr>
  15.540 +      </table>
  15.541 +</div><div class="memdoc">
  15.542 +
  15.543 +<p>Initializes a new <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> with a default allocator. </p>
  15.544 +<dl class="params"><dt>Parameters</dt><dd>
  15.545 +  <table class="params">
  15.546 +    <tr><td class="paramname">cmpfunc</td><td>the compare function that shall be used </td></tr>
  15.547 +  </table>
  15.548 +  </dd>
  15.549 +</dl>
  15.550 +<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>
  15.551 +<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>
  15.552 +
  15.553 +</div>
  15.554 +</div>
  15.555 +<a id="af0f868d67e9dc08b4867c02a06c23ee2"></a>
  15.556 +<h2 class="memtitle"><span class="permalink"><a href="#af0f868d67e9dc08b4867c02a06c23ee2">&#9670;&nbsp;</a></span>ucx_avl_new_a()</h2>
  15.557 +
  15.558 +<div class="memitem">
  15.559 +<div class="memproto">
  15.560 +      <table class="memname">
  15.561 +        <tr>
  15.562 +          <td class="memname"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a>* ucx_avl_new_a </td>
  15.563 +          <td>(</td>
  15.564 +          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
  15.565 +          <td class="paramname"><em>cmpfunc</em>, </td>
  15.566 +        </tr>
  15.567 +        <tr>
  15.568 +          <td class="paramkey"></td>
  15.569 +          <td></td>
  15.570 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
  15.571 +          <td class="paramname"><em>allocator</em>&#160;</td>
  15.572 +        </tr>
  15.573 +        <tr>
  15.574 +          <td></td>
  15.575 +          <td>)</td>
  15.576 +          <td></td><td></td>
  15.577 +        </tr>
  15.578 +      </table>
  15.579 +</div><div class="memdoc">
  15.580 +
  15.581 +<p>Initializes a new <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> with the specified allocator. </p>
  15.582 +<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>
  15.583 +<dl class="params"><dt>Parameters</dt><dd>
  15.584 +  <table class="params">
  15.585 +    <tr><td class="paramname">cmpfunc</td><td>the compare function that shall be used </td></tr>
  15.586 +    <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>
  15.587 +  </table>
  15.588 +  </dd>
  15.589 +</dl>
  15.590 +<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>
  15.591 +
  15.592 +</div>
  15.593 +</div>
  15.594 +<a id="a0e739aeb66dda6a6a3f6eb51b50cf346"></a>
  15.595 +<h2 class="memtitle"><span class="permalink"><a href="#a0e739aeb66dda6a6a3f6eb51b50cf346">&#9670;&nbsp;</a></span>ucx_avl_pred()</h2>
  15.596 +
  15.597 +<div class="memitem">
  15.598 +<div class="memproto">
  15.599 +      <table class="memname">
  15.600 +        <tr>
  15.601 +          <td class="memname"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a>* ucx_avl_pred </td>
  15.602 +          <td>(</td>
  15.603 +          <td class="paramtype"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *&#160;</td>
  15.604 +          <td class="paramname"><em>node</em></td><td>)</td>
  15.605 +          <td></td>
  15.606 +        </tr>
  15.607 +      </table>
  15.608 +</div><div class="memdoc">
  15.609 +
  15.610 +<p>Finds the in-order predecessor of the given node. </p>
  15.611 +<dl class="params"><dt>Parameters</dt><dd>
  15.612 +  <table class="params">
  15.613 +    <tr><td class="paramname">node</td><td>an AVL node </td></tr>
  15.614 +  </table>
  15.615 +  </dd>
  15.616 +</dl>
  15.617 +<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>
  15.618 +
  15.619 +</div>
  15.620 +</div>
  15.621 +<a id="aec401fab4a24a7edffa734f9baf88577"></a>
  15.622 +<h2 class="memtitle"><span class="permalink"><a href="#aec401fab4a24a7edffa734f9baf88577">&#9670;&nbsp;</a></span>ucx_avl_put()</h2>
  15.623 +
  15.624 +<div class="memitem">
  15.625 +<div class="memproto">
  15.626 +      <table class="memname">
  15.627 +        <tr>
  15.628 +          <td class="memname">int ucx_avl_put </td>
  15.629 +          <td>(</td>
  15.630 +          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
  15.631 +          <td class="paramname"><em>tree</em>, </td>
  15.632 +        </tr>
  15.633 +        <tr>
  15.634 +          <td class="paramkey"></td>
  15.635 +          <td></td>
  15.636 +          <td class="paramtype">intptr_t&#160;</td>
  15.637 +          <td class="paramname"><em>key</em>, </td>
  15.638 +        </tr>
  15.639 +        <tr>
  15.640 +          <td class="paramkey"></td>
  15.641 +          <td></td>
  15.642 +          <td class="paramtype">void *&#160;</td>
  15.643 +          <td class="paramname"><em>value</em>&#160;</td>
  15.644 +        </tr>
  15.645 +        <tr>
  15.646 +          <td></td>
  15.647 +          <td>)</td>
  15.648 +          <td></td><td></td>
  15.649 +        </tr>
  15.650 +      </table>
  15.651 +</div><div class="memdoc">
  15.652 +
  15.653 +<p>Puts a key/value pair into the tree. </p>
  15.654 +<p>Attention: use this function only, if a possible old value does not need to be preserved.</p>
  15.655 +<dl class="params"><dt>Parameters</dt><dd>
  15.656 +  <table class="params">
  15.657 +    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
  15.658 +    <tr><td class="paramname">key</td><td>the key </td></tr>
  15.659 +    <tr><td class="paramname">value</td><td>the new value </td></tr>
  15.660 +  </table>
  15.661 +  </dd>
  15.662 +</dl>
  15.663 +<dl class="section return"><dt>Returns</dt><dd>zero, if and only if the operation succeeded </dd></dl>
  15.664 +
  15.665 +</div>
  15.666 +</div>
  15.667 +<a id="a32cf8955cc0226a82bacfc7b76d6474c"></a>
  15.668 +<h2 class="memtitle"><span class="permalink"><a href="#a32cf8955cc0226a82bacfc7b76d6474c">&#9670;&nbsp;</a></span>ucx_avl_put_s()</h2>
  15.669 +
  15.670 +<div class="memitem">
  15.671 +<div class="memproto">
  15.672 +      <table class="memname">
  15.673 +        <tr>
  15.674 +          <td class="memname">int ucx_avl_put_s </td>
  15.675 +          <td>(</td>
  15.676 +          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
  15.677 +          <td class="paramname"><em>tree</em>, </td>
  15.678 +        </tr>
  15.679 +        <tr>
  15.680 +          <td class="paramkey"></td>
  15.681 +          <td></td>
  15.682 +          <td class="paramtype">intptr_t&#160;</td>
  15.683 +          <td class="paramname"><em>key</em>, </td>
  15.684 +        </tr>
  15.685 +        <tr>
  15.686 +          <td class="paramkey"></td>
  15.687 +          <td></td>
  15.688 +          <td class="paramtype">void *&#160;</td>
  15.689 +          <td class="paramname"><em>value</em>, </td>
  15.690 +        </tr>
  15.691 +        <tr>
  15.692 +          <td class="paramkey"></td>
  15.693 +          <td></td>
  15.694 +          <td class="paramtype">void **&#160;</td>
  15.695 +          <td class="paramname"><em>oldvalue</em>&#160;</td>
  15.696 +        </tr>
  15.697 +        <tr>
  15.698 +          <td></td>
  15.699 +          <td>)</td>
  15.700 +          <td></td><td></td>
  15.701 +        </tr>
  15.702 +      </table>
  15.703 +</div><div class="memdoc">
  15.704 +
  15.705 +<p>Puts a key/value pair into the tree. </p>
  15.706 +<p>This is a secure function which saves the old value to the variable pointed at by oldvalue.</p>
  15.707 +<dl class="params"><dt>Parameters</dt><dd>
  15.708 +  <table class="params">
  15.709 +    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
  15.710 +    <tr><td class="paramname">key</td><td>the key </td></tr>
  15.711 +    <tr><td class="paramname">value</td><td>the new value </td></tr>
  15.712 +    <tr><td class="paramname">oldvalue</td><td>optional: a pointer to the location where a possible old value shall be stored </td></tr>
  15.713 +  </table>
  15.714 +  </dd>
  15.715 +</dl>
  15.716 +<dl class="section return"><dt>Returns</dt><dd>zero, if and only if the operation succeeded </dd></dl>
  15.717 +
  15.718 +</div>
  15.719 +</div>
  15.720 +<a id="a1d821119c805d7fbb7e424bc3effeba9"></a>
  15.721 +<h2 class="memtitle"><span class="permalink"><a href="#a1d821119c805d7fbb7e424bc3effeba9">&#9670;&nbsp;</a></span>ucx_avl_remove()</h2>
  15.722 +
  15.723 +<div class="memitem">
  15.724 +<div class="memproto">
  15.725 +      <table class="memname">
  15.726 +        <tr>
  15.727 +          <td class="memname">int ucx_avl_remove </td>
  15.728 +          <td>(</td>
  15.729 +          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
  15.730 +          <td class="paramname"><em>tree</em>, </td>
  15.731 +        </tr>
  15.732 +        <tr>
  15.733 +          <td class="paramkey"></td>
  15.734 +          <td></td>
  15.735 +          <td class="paramtype">intptr_t&#160;</td>
  15.736 +          <td class="paramname"><em>key</em>&#160;</td>
  15.737 +        </tr>
  15.738 +        <tr>
  15.739 +          <td></td>
  15.740 +          <td>)</td>
  15.741 +          <td></td><td></td>
  15.742 +        </tr>
  15.743 +      </table>
  15.744 +</div><div class="memdoc">
  15.745 +
  15.746 +<p>Removes an element from the AVL tree. </p>
  15.747 +<dl class="params"><dt>Parameters</dt><dd>
  15.748 +  <table class="params">
  15.749 +    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
  15.750 +    <tr><td class="paramname">key</td><td>the key </td></tr>
  15.751 +  </table>
  15.752 +  </dd>
  15.753 +</dl>
  15.754 +<dl class="section return"><dt>Returns</dt><dd>zero, if and only if an element has been removed </dd></dl>
  15.755 +
  15.756 +</div>
  15.757 +</div>
  15.758 +<a id="a9a792b7d9e58073deef74a341f8bc720"></a>
  15.759 +<h2 class="memtitle"><span class="permalink"><a href="#a9a792b7d9e58073deef74a341f8bc720">&#9670;&nbsp;</a></span>ucx_avl_remove_node()</h2>
  15.760 +
  15.761 +<div class="memitem">
  15.762 +<div class="memproto">
  15.763 +      <table class="memname">
  15.764 +        <tr>
  15.765 +          <td class="memname">int ucx_avl_remove_node </td>
  15.766 +          <td>(</td>
  15.767 +          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
  15.768 +          <td class="paramname"><em>tree</em>, </td>
  15.769 +        </tr>
  15.770 +        <tr>
  15.771 +          <td class="paramkey"></td>
  15.772 +          <td></td>
  15.773 +          <td class="paramtype"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *&#160;</td>
  15.774 +          <td class="paramname"><em>node</em>&#160;</td>
  15.775 +        </tr>
  15.776 +        <tr>
  15.777 +          <td></td>
  15.778 +          <td>)</td>
  15.779 +          <td></td><td></td>
  15.780 +        </tr>
  15.781 +      </table>
  15.782 +</div><div class="memdoc">
  15.783 +
  15.784 +<p>Removes a node from the AVL tree. </p>
  15.785 +<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>
  15.786 +<dl class="params"><dt>Parameters</dt><dd>
  15.787 +  <table class="params">
  15.788 +    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
  15.789 +    <tr><td class="paramname">node</td><td>the node to remove </td></tr>
  15.790 +  </table>
  15.791 +  </dd>
  15.792 +</dl>
  15.793 +<dl class="section return"><dt>Returns</dt><dd>zero, if and only if an element has been removed </dd></dl>
  15.794 +
  15.795 +</div>
  15.796 +</div>
  15.797 +<a id="a01aeeecd6415f0cc2b623486eb28f254"></a>
  15.798 +<h2 class="memtitle"><span class="permalink"><a href="#a01aeeecd6415f0cc2b623486eb28f254">&#9670;&nbsp;</a></span>ucx_avl_remove_s()</h2>
  15.799 +
  15.800 +<div class="memitem">
  15.801 +<div class="memproto">
  15.802 +      <table class="memname">
  15.803 +        <tr>
  15.804 +          <td class="memname">int ucx_avl_remove_s </td>
  15.805 +          <td>(</td>
  15.806 +          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
  15.807 +          <td class="paramname"><em>tree</em>, </td>
  15.808 +        </tr>
  15.809 +        <tr>
  15.810 +          <td class="paramkey"></td>
  15.811 +          <td></td>
  15.812 +          <td class="paramtype">intptr_t&#160;</td>
  15.813 +          <td class="paramname"><em>key</em>, </td>
  15.814 +        </tr>
  15.815 +        <tr>
  15.816 +          <td class="paramkey"></td>
  15.817 +          <td></td>
  15.818 +          <td class="paramtype">intptr_t *&#160;</td>
  15.819 +          <td class="paramname"><em>oldkey</em>, </td>
  15.820 +        </tr>
  15.821 +        <tr>
  15.822 +          <td class="paramkey"></td>
  15.823 +          <td></td>
  15.824 +          <td class="paramtype">void **&#160;</td>
  15.825 +          <td class="paramname"><em>oldvalue</em>&#160;</td>
  15.826 +        </tr>
  15.827 +        <tr>
  15.828 +          <td></td>
  15.829 +          <td>)</td>
  15.830 +          <td></td><td></td>
  15.831 +        </tr>
  15.832 +      </table>
  15.833 +</div><div class="memdoc">
  15.834 +
  15.835 +<p>Removes an element from the AVL tree. </p>
  15.836 +<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>
  15.837 +<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>
  15.838 +<dl class="params"><dt>Parameters</dt><dd>
  15.839 +  <table class="params">
  15.840 +    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
  15.841 +    <tr><td class="paramname">key</td><td>the key of the element to remove </td></tr>
  15.842 +    <tr><td class="paramname">oldkey</td><td>optional: a pointer to the location where the old key shall be stored </td></tr>
  15.843 +    <tr><td class="paramname">oldvalue</td><td>optional: a pointer to the location where the old value shall be stored </td></tr>
  15.844 +  </table>
  15.845 +  </dd>
  15.846 +</dl>
  15.847 +<dl class="section return"><dt>Returns</dt><dd>zero, if and only if an element has been removed </dd></dl>
  15.848 +
  15.849 +</div>
  15.850 +</div>
  15.851 +<a id="aab1ad9b027ff5e50671aa0ee84e2d541"></a>
  15.852 +<h2 class="memtitle"><span class="permalink"><a href="#aab1ad9b027ff5e50671aa0ee84e2d541">&#9670;&nbsp;</a></span>ucx_avl_succ()</h2>
  15.853 +
  15.854 +<div class="memitem">
  15.855 +<div class="memproto">
  15.856 +      <table class="memname">
  15.857 +        <tr>
  15.858 +          <td class="memname"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a>* ucx_avl_succ </td>
  15.859 +          <td>(</td>
  15.860 +          <td class="paramtype"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *&#160;</td>
  15.861 +          <td class="paramname"><em>node</em></td><td>)</td>
  15.862 +          <td></td>
  15.863 +        </tr>
  15.864 +      </table>
  15.865 +</div><div class="memdoc">
  15.866 +
  15.867 +<p>Finds the in-order successor of the given node. </p>
  15.868 +<dl class="params"><dt>Parameters</dt><dd>
  15.869 +  <table class="params">
  15.870 +    <tr><td class="paramname">node</td><td>an AVL node </td></tr>
  15.871 +  </table>
  15.872 +  </dd>
  15.873 +</dl>
  15.874 +<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>
  15.875 +
  15.876 +</div>
  15.877 +</div>
  15.878 +</div><!-- contents -->
  15.879 +<!-- start footer part -->
  15.880 +<hr class="footer"/><address class="footer"><small>
  15.881 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  15.882 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  15.883 +</a> 1.8.13
  15.884 +</small></address>
  15.885 +</body>
  15.886 +</html>
    16.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    16.2 +++ b/docs/api-2.1/avl_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
    16.3 @@ -0,0 +1,113 @@
    16.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    16.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    16.6 +<head>
    16.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    16.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    16.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   16.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   16.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/avl.h Source File</title>
   16.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   16.13 +<script type="text/javascript" src="jquery.js"></script>
   16.14 +<script type="text/javascript" src="dynsections.js"></script>
   16.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   16.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   16.17 +<script type="text/javascript" src="search/search.js"></script>
   16.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   16.19 +</head>
   16.20 +<body>
   16.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   16.22 +<div id="titlearea">
   16.23 +<table cellspacing="0" cellpadding="0">
   16.24 + <tbody>
   16.25 + <tr style="height: 56px;">
   16.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   16.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   16.28 +   <div id="projectname">ucx
   16.29 +   </div>
   16.30 +   <div id="projectbrief">UAP Common Extensions</div>
   16.31 +  </td>
   16.32 + </tr>
   16.33 + </tbody>
   16.34 +</table>
   16.35 +</div>
   16.36 +<!-- end header part -->
   16.37 +<!-- Generated by Doxygen 1.8.13 -->
   16.38 +<script type="text/javascript">
   16.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   16.40 +</script>
   16.41 +<script type="text/javascript" src="menudata.js"></script>
   16.42 +<script type="text/javascript" src="menu.js"></script>
   16.43 +<script type="text/javascript">
   16.44 +$(function() {
   16.45 +  initMenu('',true,false,'search.php','Search');
   16.46 +  $(document).ready(function() { init_search(); });
   16.47 +});
   16.48 +</script>
   16.49 +<div id="main-nav"></div>
   16.50 +<!-- window showing the filter options -->
   16.51 +<div id="MSearchSelectWindow"
   16.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   16.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   16.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   16.55 +</div>
   16.56 +
   16.57 +<!-- iframe showing the search results (closed by default) -->
   16.58 +<div id="MSearchResultsWindow">
   16.59 +<iframe src="javascript:void(0)" frameborder="0" 
   16.60 +        name="MSearchResults" id="MSearchResults">
   16.61 +</iframe>
   16.62 +</div>
   16.63 +
   16.64 +<div id="nav-path" class="navpath">
   16.65 +  <ul>
   16.66 +<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>
   16.67 +</div>
   16.68 +</div><!-- top -->
   16.69 +<div class="header">
   16.70 +  <div class="headertitle">
   16.71 +<div class="title">avl.h</div>  </div>
   16.72 +</div><!--header-->
   16.73 +<div class="contents">
   16.74 +<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>
   16.75 +<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>
   16.76 +<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>
   16.77 +<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>
   16.78 +<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>
   16.79 +<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>
   16.80 +<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>
   16.81 +<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>
   16.82 +<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>
   16.83 +<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>
   16.84 +<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>
   16.85 +<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>
   16.86 +<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>
   16.87 +<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>
   16.88 +<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>
   16.89 +<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>
   16.90 +<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>
   16.91 +<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>
   16.92 +<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>
   16.93 +<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>
   16.94 +<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>
   16.95 +<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>
   16.96 +<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>
   16.97 +<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>
   16.98 +<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>
   16.99 +<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>
  16.100 +<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>
  16.101 +<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>
  16.102 +<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>
  16.103 +<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>
  16.104 +<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>
  16.105 +<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>
  16.106 +<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>
  16.107 +<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>
  16.108 +</div><!-- fragment --></div><!-- contents -->
  16.109 +<!-- start footer part -->
  16.110 +<hr class="footer"/><address class="footer"><small>
  16.111 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  16.112 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  16.113 +</a> 1.8.13
  16.114 +</small></address>
  16.115 +</body>
  16.116 +</html>
    17.1 Binary file docs/api-2.1/bc_s.png has changed
    18.1 Binary file docs/api-2.1/bdwn.png has changed
    19.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    19.2 +++ b/docs/api-2.1/buffer_8h.html	Sat Feb 06 19:11:44 2021 +0100
    19.3 @@ -0,0 +1,844 @@
    19.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    19.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    19.6 +<head>
    19.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    19.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    19.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   19.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   19.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/buffer.h File Reference</title>
   19.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   19.13 +<script type="text/javascript" src="jquery.js"></script>
   19.14 +<script type="text/javascript" src="dynsections.js"></script>
   19.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   19.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   19.17 +<script type="text/javascript" src="search/search.js"></script>
   19.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   19.19 +</head>
   19.20 +<body>
   19.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   19.22 +<div id="titlearea">
   19.23 +<table cellspacing="0" cellpadding="0">
   19.24 + <tbody>
   19.25 + <tr style="height: 56px;">
   19.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   19.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   19.28 +   <div id="projectname">ucx
   19.29 +   </div>
   19.30 +   <div id="projectbrief">UAP Common Extensions</div>
   19.31 +  </td>
   19.32 + </tr>
   19.33 + </tbody>
   19.34 +</table>
   19.35 +</div>
   19.36 +<!-- end header part -->
   19.37 +<!-- Generated by Doxygen 1.8.13 -->
   19.38 +<script type="text/javascript">
   19.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   19.40 +</script>
   19.41 +<script type="text/javascript" src="menudata.js"></script>
   19.42 +<script type="text/javascript" src="menu.js"></script>
   19.43 +<script type="text/javascript">
   19.44 +$(function() {
   19.45 +  initMenu('',true,false,'search.php','Search');
   19.46 +  $(document).ready(function() { init_search(); });
   19.47 +});
   19.48 +</script>
   19.49 +<div id="main-nav"></div>
   19.50 +<!-- window showing the filter options -->
   19.51 +<div id="MSearchSelectWindow"
   19.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   19.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   19.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   19.55 +</div>
   19.56 +
   19.57 +<!-- iframe showing the search results (closed by default) -->
   19.58 +<div id="MSearchResultsWindow">
   19.59 +<iframe src="javascript:void(0)" frameborder="0" 
   19.60 +        name="MSearchResults" id="MSearchResults">
   19.61 +</iframe>
   19.62 +</div>
   19.63 +
   19.64 +<div id="nav-path" class="navpath">
   19.65 +  <ul>
   19.66 +<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>
   19.67 +</div>
   19.68 +</div><!-- top -->
   19.69 +<div class="header">
   19.70 +  <div class="summary">
   19.71 +<a href="#nested-classes">Data Structures</a> &#124;
   19.72 +<a href="#define-members">Macros</a> &#124;
   19.73 +<a href="#func-members">Functions</a>  </div>
   19.74 +  <div class="headertitle">
   19.75 +<div class="title">buffer.h File Reference</div>  </div>
   19.76 +</div><!--header-->
   19.77 +<div class="contents">
   19.78 +
   19.79 +<p>Advanced buffer implementation.  
   19.80 +<a href="#details">More...</a></p>
   19.81 +<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
   19.82 +<code>#include &lt;sys/types.h&gt;</code><br />
   19.83 +<code>#include &lt;stdio.h&gt;</code><br />
   19.84 +</div>
   19.85 +<p><a href="buffer_8h_source.html">Go to the source code of this file.</a></p>
   19.86 +<table class="memberdecls">
   19.87 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
   19.88 +Data Structures</h2></td></tr>
   19.89 +<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>
   19.90 +<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX Buffer.  <a href="structUcxBuffer.html#details">More...</a><br /></td></tr>
   19.91 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   19.92 +</table><table class="memberdecls">
   19.93 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
   19.94 +Macros</h2></td></tr>
   19.95 +<tr class="memitem:acc77c8ed7b26854f555d4a5d11e49ea2"><td class="memItemLeft" align="right" valign="top"><a id="acc77c8ed7b26854f555d4a5d11e49ea2"></a>
   19.96 +#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>
   19.97 +<tr class="memdesc:acc77c8ed7b26854f555d4a5d11e49ea2"><td class="mdescLeft">&#160;</td><td class="mdescRight">No buffer features enabled (all flags cleared). <br /></td></tr>
   19.98 +<tr class="separator:acc77c8ed7b26854f555d4a5d11e49ea2"><td class="memSeparator" colspan="2">&#160;</td></tr>
   19.99 +<tr class="memitem:a8bab11ad8a76719228b9ee91e2e45535"><td class="memItemLeft" align="right" valign="top"><a id="a8bab11ad8a76719228b9ee91e2e45535"></a>
  19.100 +#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>
  19.101 +<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>
  19.102 +<tr class="separator:a8bab11ad8a76719228b9ee91e2e45535"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.103 +<tr class="memitem:a05f9565f2d04399168c3b1c152a632be"><td class="memItemLeft" align="right" valign="top"><a id="a05f9565f2d04399168c3b1c152a632be"></a>
  19.104 +#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>
  19.105 +<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>
  19.106 +<tr class="separator:a05f9565f2d04399168c3b1c152a632be"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.107 +<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>
  19.108 +<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>
  19.109 +<tr class="separator:a828353846428c2c2f695f9938f059e52"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.110 +<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>
  19.111 +<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>
  19.112 +<tr class="separator:a374abd5aabfcc3ee0777a79d5fe651ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.113 +<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>
  19.114 +<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>
  19.115 +<tr class="separator:a0f4b64f1b3a74c4f6c5d9409d6b6086a"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.116 +</table><table class="memberdecls">
  19.117 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
  19.118 +Functions</h2></td></tr>
  19.119 +<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>
  19.120 +<tr class="memdesc:aacea876d692193ec6f859ce98da7351c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new buffer.  <a href="#aacea876d692193ec6f859ce98da7351c">More...</a><br /></td></tr>
  19.121 +<tr class="separator:aacea876d692193ec6f859ce98da7351c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.122 +<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>
  19.123 +<tr class="memdesc:a2af8646d8905c22c7322e7540b0440af"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys a buffer.  <a href="#a2af8646d8905c22c7322e7540b0440af">More...</a><br /></td></tr>
  19.124 +<tr class="separator:a2af8646d8905c22c7322e7540b0440af"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.125 +<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>
  19.126 +<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>
  19.127 +<tr class="separator:a33fa7bb35fe08bbb3542f227514332ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.128 +<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>
  19.129 +<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>
  19.130 +<tr class="separator:a12a0c6a2379ef080043e6286bb8bad69"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.131 +<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>
  19.132 +<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>
  19.133 +<tr class="separator:a4fa10b6471495547eb981248fd4f1bc2"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.134 +<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>
  19.135 +<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>
  19.136 +<tr class="separator:a20431dd0ed6a6fe9f15333bd72afe4db"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.137 +<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>
  19.138 +<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>
  19.139 +<tr class="separator:a47d98482662073c74f35deb0957d15d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.140 +<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>
  19.141 +<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>
  19.142 +<tr class="separator:abad7fd9ad5061224c780b8d1d4c55f09"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.143 +<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>
  19.144 +<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>
  19.145 +<tr class="separator:afaf97d2cd7e9faad79a9d35fe33e30c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.146 +<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>
  19.147 +<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>
  19.148 +<tr class="separator:af8aacc7401814392b58c1b7b81bffc05"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.149 +<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>
  19.150 +<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>
  19.151 +<tr class="separator:ae5c3430759f0059547b35d5a254d4da5"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.152 +<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>
  19.153 +<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>
  19.154 +<tr class="separator:a7d6f01b9d631b0123475dfb98fb849ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.155 +<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>
  19.156 +<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>
  19.157 +<tr class="separator:a396339022159ce4ca6d069de9f9209b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.158 +<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>
  19.159 +<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>
  19.160 +<tr class="separator:af1d4b478e04b3ae0bf30e7c2ea964ea2"><td class="memSeparator" colspan="2">&#160;</td></tr>
  19.161 +</table>
  19.162 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  19.163 +<div class="textblock"><p>Advanced buffer implementation. </p>
  19.164 +<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>
  19.165 +<p>Some features for convenient use of the buffer can be enabled. See the documentation of the macro constants for more information.</p>
  19.166 +<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
  19.167 +<dd>
  19.168 +Olaf Wintermann </dd></dl>
  19.169 +</div><h2 class="groupheader">Macro Definition Documentation</h2>
  19.170 +<a id="a374abd5aabfcc3ee0777a79d5fe651ab"></a>
  19.171 +<h2 class="memtitle"><span class="permalink"><a href="#a374abd5aabfcc3ee0777a79d5fe651ab">&#9670;&nbsp;</a></span>ucx_buffer_clear</h2>
  19.172 +
  19.173 +<div class="memitem">
  19.174 +<div class="memproto">
  19.175 +      <table class="memname">
  19.176 +        <tr>
  19.177 +          <td class="memname">#define ucx_buffer_clear</td>
  19.178 +          <td>(</td>
  19.179 +          <td class="paramtype">&#160;</td>
  19.180 +          <td class="paramname">buffer</td><td>)</td>
  19.181 +          <td></td>
  19.182 +        </tr>
  19.183 +      </table>
  19.184 +</div><div class="memdoc">
  19.185 +<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 -->
  19.186 +<p>Clears the buffer by resetting the position and deleting the data. </p>
  19.187 +<p>The data is deleted by a zeroing it with call to <code>memset()</code>.</p>
  19.188 +<dl class="params"><dt>Parameters</dt><dd>
  19.189 +  <table class="params">
  19.190 +    <tr><td class="paramname">buffer</td><td>the buffer to be cleared </td></tr>
  19.191 +  </table>
  19.192 +  </dd>
  19.193 +</dl>
  19.194 +
  19.195 +</div>
  19.196 +</div>
  19.197 +<a id="a828353846428c2c2f695f9938f059e52"></a>
  19.198 +<h2 class="memtitle"><span class="permalink"><a href="#a828353846428c2c2f695f9938f059e52">&#9670;&nbsp;</a></span>ucx_buffer_clone</h2>
  19.199 +
  19.200 +<div class="memitem">
  19.201 +<div class="memproto">
  19.202 +      <table class="memname">
  19.203 +        <tr>
  19.204 +          <td class="memname">#define ucx_buffer_clone</td>
  19.205 +          <td>(</td>
  19.206 +          <td class="paramtype">&#160;</td>
  19.207 +          <td class="paramname">src, </td>
  19.208 +        </tr>
  19.209 +        <tr>
  19.210 +          <td class="paramkey"></td>
  19.211 +          <td></td>
  19.212 +          <td class="paramtype">&#160;</td>
  19.213 +          <td class="paramname">flags&#160;</td>
  19.214 +        </tr>
  19.215 +        <tr>
  19.216 +          <td></td>
  19.217 +          <td>)</td>
  19.218 +          <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>
  19.219 +        </tr>
  19.220 +      </table>
  19.221 +</div><div class="memdoc">
  19.222 +
  19.223 +<p>A shorthand macro for the full extraction of the buffer. </p>
  19.224 +<dl class="params"><dt>Parameters</dt><dd>
  19.225 +  <table class="params">
  19.226 +    <tr><td class="paramname">src</td><td>the source buffer </td></tr>
  19.227 +    <tr><td class="paramname">flags</td><td>feature mask for the new buffer </td></tr>
  19.228 +  </table>
  19.229 +  </dd>
  19.230 +</dl>
  19.231 +<dl class="section return"><dt>Returns</dt><dd>a new buffer with the extracted content </dd></dl>
  19.232 +
  19.233 +</div>
  19.234 +</div>
  19.235 +<a id="a0f4b64f1b3a74c4f6c5d9409d6b6086a"></a>
  19.236 +<h2 class="memtitle"><span class="permalink"><a href="#a0f4b64f1b3a74c4f6c5d9409d6b6086a">&#9670;&nbsp;</a></span>ucx_buffer_to_sstr</h2>
  19.237 +
  19.238 +<div class="memitem">
  19.239 +<div class="memproto">
  19.240 +      <table class="memname">
  19.241 +        <tr>
  19.242 +          <td class="memname">#define ucx_buffer_to_sstr</td>
  19.243 +          <td>(</td>
  19.244 +          <td class="paramtype">&#160;</td>
  19.245 +          <td class="paramname">buffer</td><td>)</td>
  19.246 +          <td>&#160;&#160;&#160;<a class="el" href="string_8h.html#a2744c38ac44abf3e01fa059056dcf36c">sstrn</a>((buffer)-&gt;space, (buffer)-&gt;size)</td>
  19.247 +        </tr>
  19.248 +      </table>
  19.249 +</div><div class="memdoc">
  19.250 +
  19.251 +<p>Returns the complete buffer content as <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a>. </p>
  19.252 +<dl class="params"><dt>Parameters</dt><dd>
  19.253 +  <table class="params">
  19.254 +    <tr><td class="paramname">buffer</td><td>the buffer </td></tr>
  19.255 +  </table>
  19.256 +  </dd>
  19.257 +</dl>
  19.258 +<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>
  19.259 +
  19.260 +</div>
  19.261 +</div>
  19.262 +<h2 class="groupheader">Function Documentation</h2>
  19.263 +<a id="abad7fd9ad5061224c780b8d1d4c55f09"></a>
  19.264 +<h2 class="memtitle"><span class="permalink"><a href="#abad7fd9ad5061224c780b8d1d4c55f09">&#9670;&nbsp;</a></span>ucx_buffer_eof()</h2>
  19.265 +
  19.266 +<div class="memitem">
  19.267 +<div class="memproto">
  19.268 +      <table class="memname">
  19.269 +        <tr>
  19.270 +          <td class="memname">int ucx_buffer_eof </td>
  19.271 +          <td>(</td>
  19.272 +          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
  19.273 +          <td class="paramname"><em>buffer</em></td><td>)</td>
  19.274 +          <td></td>
  19.275 +        </tr>
  19.276 +      </table>
  19.277 +</div><div class="memdoc">
  19.278 +
  19.279 +<p>Tests, if the buffer position has exceeded the buffer capacity. </p>
  19.280 +<dl class="params"><dt>Parameters</dt><dd>
  19.281 +  <table class="params">
  19.282 +    <tr><td class="paramname">buffer</td><td>the buffer to test </td></tr>
  19.283 +  </table>
  19.284 +  </dd>
  19.285 +</dl>
  19.286 +<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>
  19.287 +
  19.288 +</div>
  19.289 +</div>
  19.290 +<a id="afaf97d2cd7e9faad79a9d35fe33e30c6"></a>
  19.291 +<h2 class="memtitle"><span class="permalink"><a href="#afaf97d2cd7e9faad79a9d35fe33e30c6">&#9670;&nbsp;</a></span>ucx_buffer_extend()</h2>
  19.292 +
  19.293 +<div class="memitem">
  19.294 +<div class="memproto">
  19.295 +      <table class="memname">
  19.296 +        <tr>
  19.297 +          <td class="memname">int ucx_buffer_extend </td>
  19.298 +          <td>(</td>
  19.299 +          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
  19.300 +          <td class="paramname"><em>buffer</em>, </td>
  19.301 +        </tr>
  19.302 +        <tr>
  19.303 +          <td class="paramkey"></td>
  19.304 +          <td></td>
  19.305 +          <td class="paramtype">size_t&#160;</td>
  19.306 +          <td class="paramname"><em>additional_bytes</em>&#160;</td>
  19.307 +        </tr>
  19.308 +        <tr>
  19.309 +          <td></td>
  19.310 +          <td>)</td>
  19.311 +          <td></td><td></td>
  19.312 +        </tr>
  19.313 +      </table>
  19.314 +</div><div class="memdoc">
  19.315 +
  19.316 +<p>Extends the capacity of the buffer. </p>
  19.317 +<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>
  19.318 +<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>
  19.319 +<dl class="params"><dt>Parameters</dt><dd>
  19.320 +  <table class="params">
  19.321 +    <tr><td class="paramname">buffer</td><td>the buffer to extend </td></tr>
  19.322 +    <tr><td class="paramname">additional_bytes</td><td>the number of additional bytes the buffer shall <em>at least</em> hold </td></tr>
  19.323 +  </table>
  19.324 +  </dd>
  19.325 +</dl>
  19.326 +<dl class="section return"><dt>Returns</dt><dd>0 on success or a non-zero value on failure </dd></dl>
  19.327 +
  19.328 +</div>
  19.329 +</div>
  19.330 +<a id="a33fa7bb35fe08bbb3542f227514332ef"></a>
  19.331 +<h2 class="memtitle"><span class="permalink"><a href="#a33fa7bb35fe08bbb3542f227514332ef">&#9670;&nbsp;</a></span>ucx_buffer_extract()</h2>
  19.332 +
  19.333 +<div class="memitem">
  19.334 +<div class="memproto">
  19.335 +      <table class="memname">
  19.336 +        <tr>
  19.337 +          <td class="memname"><a class="el" href="structUcxBuffer.html">UcxBuffer</a>* ucx_buffer_extract </td>
  19.338 +          <td>(</td>
  19.339 +          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
  19.340 +          <td class="paramname"><em>src</em>, </td>
  19.341 +        </tr>
  19.342 +        <tr>
  19.343 +          <td class="paramkey"></td>
  19.344 +          <td></td>
  19.345 +          <td class="paramtype">size_t&#160;</td>
  19.346 +          <td class="paramname"><em>start</em>, </td>
  19.347 +        </tr>
  19.348 +        <tr>
  19.349 +          <td class="paramkey"></td>
  19.350 +          <td></td>
  19.351 +          <td class="paramtype">size_t&#160;</td>
  19.352 +          <td class="paramname"><em>length</em>, </td>
  19.353 +        </tr>
  19.354 +        <tr>
  19.355 +          <td class="paramkey"></td>
  19.356 +          <td></td>
  19.357 +          <td class="paramtype">int&#160;</td>
  19.358 +          <td class="paramname"><em>flags</em>&#160;</td>
  19.359 +        </tr>
  19.360 +        <tr>
  19.361 +          <td></td>
  19.362 +          <td>)</td>
  19.363 +          <td></td><td></td>
  19.364 +        </tr>
  19.365 +      </table>
  19.366 +</div><div class="memdoc">
  19.367 +
  19.368 +<p>Creates a new buffer and fills it with extracted content from another buffer. </p>
  19.369 +<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>
  19.370 +<dl class="params"><dt>Parameters</dt><dd>
  19.371 +  <table class="params">
  19.372 +    <tr><td class="paramname">src</td><td>the source buffer </td></tr>
  19.373 +    <tr><td class="paramname">start</td><td>the start position of extraction </td></tr>
  19.374 +    <tr><td class="paramname">length</td><td>the count of bytes to extract (must not be zero) </td></tr>
  19.375 +    <tr><td class="paramname">flags</td><td>feature mask for the new buffer </td></tr>
  19.376 +  </table>
  19.377 +  </dd>
  19.378 +</dl>
  19.379 +<dl class="section return"><dt>Returns</dt><dd>a new buffer containing the extraction </dd></dl>
  19.380 +
  19.381 +</div>
  19.382 +</div>
  19.383 +<a id="a2af8646d8905c22c7322e7540b0440af"></a>
  19.384 +<h2 class="memtitle"><span class="permalink"><a href="#a2af8646d8905c22c7322e7540b0440af">&#9670;&nbsp;</a></span>ucx_buffer_free()</h2>
  19.385 +
  19.386 +<div class="memitem">
  19.387 +<div class="memproto">
  19.388 +      <table class="memname">
  19.389 +        <tr>
  19.390 +          <td class="memname">void ucx_buffer_free </td>
  19.391 +          <td>(</td>
  19.392 +          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
  19.393 +          <td class="paramname"><em>buffer</em></td><td>)</td>
  19.394 +          <td></td>
  19.395 +        </tr>
  19.396 +      </table>
  19.397 +</div><div class="memdoc">
  19.398 +
  19.399 +<p>Destroys a buffer. </p>
  19.400 +<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>
  19.401 +<dl class="params"><dt>Parameters</dt><dd>
  19.402 +  <table class="params">
  19.403 +    <tr><td class="paramname">buffer</td><td>the buffer to destroy </td></tr>
  19.404 +  </table>
  19.405 +  </dd>
  19.406 +</dl>
  19.407 +
  19.408 +</div>
  19.409 +</div>
  19.410 +<a id="a396339022159ce4ca6d069de9f9209b0"></a>
  19.411 +<h2 class="memtitle"><span class="permalink"><a href="#a396339022159ce4ca6d069de9f9209b0">&#9670;&nbsp;</a></span>ucx_buffer_getc()</h2>
  19.412 +
  19.413 +<div class="memitem">
  19.414 +<div class="memproto">
  19.415 +      <table class="memname">
  19.416 +        <tr>
  19.417 +          <td class="memname">int ucx_buffer_getc </td>
  19.418 +          <td>(</td>
  19.419 +          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
  19.420 +          <td class="paramname"><em>buffer</em></td><td>)</td>
  19.421 +          <td></td>
  19.422 +        </tr>
  19.423 +      </table>
  19.424 +</div><div class="memdoc">
  19.425 +
  19.426 +<p>Gets a character from a buffer. </p>
  19.427 +<p>The current position of the buffer is increased after a successful read.</p>
  19.428 +<dl class="params"><dt>Parameters</dt><dd>
  19.429 +  <table class="params">
  19.430 +    <tr><td class="paramname">buffer</td><td>the buffer to read from </td></tr>
  19.431 +  </table>
  19.432 +  </dd>
  19.433 +</dl>
  19.434 +<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>
  19.435 +
  19.436 +</div>
  19.437 +</div>
  19.438 +<a id="aacea876d692193ec6f859ce98da7351c"></a>
  19.439 +<h2 class="memtitle"><span class="permalink"><a href="#aacea876d692193ec6f859ce98da7351c">&#9670;&nbsp;</a></span>ucx_buffer_new()</h2>
  19.440 +
  19.441 +<div class="memitem">
  19.442 +<div class="memproto">
  19.443 +      <table class="memname">
  19.444 +        <tr>
  19.445 +          <td class="memname"><a class="el" href="structUcxBuffer.html">UcxBuffer</a>* ucx_buffer_new </td>
  19.446 +          <td>(</td>
  19.447 +          <td class="paramtype">void *&#160;</td>
  19.448 +          <td class="paramname"><em>space</em>, </td>
  19.449 +        </tr>
  19.450 +        <tr>
  19.451 +          <td class="paramkey"></td>
  19.452 +          <td></td>
  19.453 +          <td class="paramtype">size_t&#160;</td>
  19.454 +          <td class="paramname"><em>capacity</em>, </td>
  19.455 +        </tr>
  19.456 +        <tr>
  19.457 +          <td class="paramkey"></td>
  19.458 +          <td></td>
  19.459 +          <td class="paramtype">int&#160;</td>
  19.460 +          <td class="paramname"><em>flags</em>&#160;</td>
  19.461 +        </tr>
  19.462 +        <tr>
  19.463 +          <td></td>
  19.464 +          <td>)</td>
  19.465 +          <td></td><td></td>
  19.466 +        </tr>
  19.467 +      </table>
  19.468 +</div><div class="memdoc">
  19.469 +
  19.470 +<p>Creates a new buffer. </p>
  19.471 +<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>
  19.472 +<dl class="params"><dt>Parameters</dt><dd>
  19.473 +  <table class="params">
  19.474 +    <tr><td class="paramname">space</td><td>pointer to the memory area, or <code>NULL</code> to allocate new memory </td></tr>
  19.475 +    <tr><td class="paramname">capacity</td><td>the capacity of the buffer </td></tr>
  19.476 +    <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>
  19.477 +  </table>
  19.478 +  </dd>
  19.479 +</dl>
  19.480 +<dl class="section return"><dt>Returns</dt><dd>the new buffer </dd></dl>
  19.481 +
  19.482 +</div>
  19.483 +</div>
  19.484 +<a id="a7d6f01b9d631b0123475dfb98fb849ac"></a>
  19.485 +<h2 class="memtitle"><span class="permalink"><a href="#a7d6f01b9d631b0123475dfb98fb849ac">&#9670;&nbsp;</a></span>ucx_buffer_putc()</h2>
  19.486 +
  19.487 +<div class="memitem">
  19.488 +<div class="memproto">
  19.489 +      <table class="memname">
  19.490 +        <tr>
  19.491 +          <td class="memname">int ucx_buffer_putc </td>
  19.492 +          <td>(</td>
  19.493 +          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
  19.494 +          <td class="paramname"><em>buffer</em>, </td>
  19.495 +        </tr>
  19.496 +        <tr>
  19.497 +          <td class="paramkey"></td>
  19.498 +          <td></td>
  19.499 +          <td class="paramtype">int&#160;</td>
  19.500 +          <td class="paramname"><em>c</em>&#160;</td>
  19.501 +        </tr>
  19.502 +        <tr>
  19.503 +          <td></td>
  19.504 +          <td>)</td>
  19.505 +          <td></td><td></td>
  19.506 +        </tr>
  19.507 +      </table>
  19.508 +</div><div class="memdoc">
  19.509 +
  19.510 +<p>Writes a character to a buffer. </p>
  19.511 +<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>
  19.512 +<p>On successful write the position of the buffer is increased.</p>
  19.513 +<dl class="params"><dt>Parameters</dt><dd>
  19.514 +  <table class="params">
  19.515 +    <tr><td class="paramname">buffer</td><td>the buffer to write to </td></tr>
  19.516 +    <tr><td class="paramname">c</td><td>the character to write as <code>int</code> value </td></tr>
  19.517 +  </table>
  19.518 +  </dd>
  19.519 +</dl>
  19.520 +<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>
  19.521 +
  19.522 +</div>
  19.523 +</div>
  19.524 +<a id="af1d4b478e04b3ae0bf30e7c2ea964ea2"></a>
  19.525 +<h2 class="memtitle"><span class="permalink"><a href="#af1d4b478e04b3ae0bf30e7c2ea964ea2">&#9670;&nbsp;</a></span>ucx_buffer_puts()</h2>
  19.526 +
  19.527 +<div class="memitem">
  19.528 +<div class="memproto">
  19.529 +      <table class="memname">
  19.530 +        <tr>
  19.531 +          <td class="memname">size_t ucx_buffer_puts </td>
  19.532 +          <td>(</td>
  19.533 +          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
  19.534 +          <td class="paramname"><em>buffer</em>, </td>
  19.535 +        </tr>
  19.536 +        <tr>
  19.537 +          <td class="paramkey"></td>
  19.538 +          <td></td>
  19.539 +          <td class="paramtype">const char *&#160;</td>
  19.540 +          <td class="paramname"><em>str</em>&#160;</td>
  19.541 +        </tr>
  19.542 +        <tr>
  19.543 +          <td></td>
  19.544 +          <td>)</td>
  19.545 +          <td></td><td></td>
  19.546 +        </tr>
  19.547 +      </table>
  19.548 +</div><div class="memdoc">
  19.549 +
  19.550 +<p>Writes a string to a buffer. </p>
  19.551 +<dl class="params"><dt>Parameters</dt><dd>
  19.552 +  <table class="params">
  19.553 +    <tr><td class="paramname">buffer</td><td>the buffer </td></tr>
  19.554 +    <tr><td class="paramname">str</td><td>the string </td></tr>
  19.555 +  </table>
  19.556 +  </dd>
  19.557 +</dl>
  19.558 +<dl class="section return"><dt>Returns</dt><dd>the number of bytes written </dd></dl>
  19.559 +
  19.560 +</div>
  19.561 +</div>
  19.562 +<a id="ae5c3430759f0059547b35d5a254d4da5"></a>
  19.563 +<h2 class="memtitle"><span class="permalink"><a href="#ae5c3430759f0059547b35d5a254d4da5">&#9670;&nbsp;</a></span>ucx_buffer_read()</h2>
  19.564 +
  19.565 +<div class="memitem">
  19.566 +<div class="memproto">
  19.567 +      <table class="memname">
  19.568 +        <tr>
  19.569 +          <td class="memname">size_t ucx_buffer_read </td>
  19.570 +          <td>(</td>
  19.571 +          <td class="paramtype">void *&#160;</td>
  19.572 +          <td class="paramname"><em>ptr</em>, </td>
  19.573 +        </tr>
  19.574 +        <tr>
  19.575 +          <td class="paramkey"></td>
  19.576 +          <td></td>
  19.577 +          <td class="paramtype">size_t&#160;</td>
  19.578 +          <td class="paramname"><em>size</em>, </td>
  19.579 +        </tr>
  19.580 +        <tr>
  19.581 +          <td class="paramkey"></td>
  19.582 +          <td></td>
  19.583 +          <td class="paramtype">size_t&#160;</td>
  19.584 +          <td class="paramname"><em>nitems</em>, </td>
  19.585 +        </tr>
  19.586 +        <tr>
  19.587 +          <td class="paramkey"></td>
  19.588 +          <td></td>
  19.589 +          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
  19.590 +          <td class="paramname"><em>buffer</em>&#160;</td>
  19.591 +        </tr>
  19.592 +        <tr>
  19.593 +          <td></td>
  19.594 +          <td>)</td>
  19.595 +          <td></td><td></td>
  19.596 +        </tr>
  19.597 +      </table>
  19.598 +</div><div class="memdoc">
  19.599 +
  19.600 +<p>Reads data from a <a class="el" href="structUcxBuffer.html" title="UCX Buffer. ">UcxBuffer</a>. </p>
  19.601 +<p>The position of the buffer is increased by the number of bytes read.</p>
  19.602 +<dl class="params"><dt>Parameters</dt><dd>
  19.603 +  <table class="params">
  19.604 +    <tr><td class="paramname">ptr</td><td>a pointer to the memory area where to store the read data </td></tr>
  19.605 +    <tr><td class="paramname">size</td><td>the length of one element </td></tr>
  19.606 +    <tr><td class="paramname">nitems</td><td>the element count </td></tr>
  19.607 +    <tr><td class="paramname">buffer</td><td>the <a class="el" href="structUcxBuffer.html" title="UCX Buffer. ">UcxBuffer</a> to read from </td></tr>
  19.608 +  </table>
  19.609 +  </dd>
  19.610 +</dl>
  19.611 +<dl class="section return"><dt>Returns</dt><dd>the total number of elements read </dd></dl>
  19.612 +
  19.613 +</div>
  19.614 +</div>
  19.615 +<a id="a47d98482662073c74f35deb0957d15d1"></a>
  19.616 +<h2 class="memtitle"><span class="permalink"><a href="#a47d98482662073c74f35deb0957d15d1">&#9670;&nbsp;</a></span>ucx_buffer_seek()</h2>
  19.617 +
  19.618 +<div class="memitem">
  19.619 +<div class="memproto">
  19.620 +      <table class="memname">
  19.621 +        <tr>
  19.622 +          <td class="memname">int ucx_buffer_seek </td>
  19.623 +          <td>(</td>
  19.624 +          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
  19.625 +          <td class="paramname"><em>buffer</em>, </td>
  19.626 +        </tr>
  19.627 +        <tr>
  19.628 +          <td class="paramkey"></td>
  19.629 +          <td></td>
  19.630 +          <td class="paramtype">off_t&#160;</td>
  19.631 +          <td class="paramname"><em>offset</em>, </td>
  19.632 +        </tr>
  19.633 +        <tr>
  19.634 +          <td class="paramkey"></td>
  19.635 +          <td></td>
  19.636 +          <td class="paramtype">int&#160;</td>
  19.637 +          <td class="paramname"><em>whence</em>&#160;</td>
  19.638 +        </tr>
  19.639 +        <tr>
  19.640 +          <td></td>
  19.641 +          <td>)</td>
  19.642 +          <td></td><td></td>
  19.643 +        </tr>
  19.644 +      </table>
  19.645 +</div><div class="memdoc">
  19.646 +
  19.647 +<p>Moves the position of the buffer. </p>
  19.648 +<p>The new position is relative to the <code>whence</code> argument.</p>
  19.649 +<p>SEEK_SET marks the start of the buffer. SEEK_CUR marks the current position. SEEK_END marks the end of the buffer.</p>
  19.650 +<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>
  19.651 +<dl class="params"><dt>Parameters</dt><dd>
  19.652 +  <table class="params">
  19.653 +    <tr><td class="paramname">buffer</td><td></td></tr>
  19.654 +    <tr><td class="paramname">offset</td><td>position offset relative to <code>whence</code> </td></tr>
  19.655 +    <tr><td class="paramname">whence</td><td>one of SEEK_SET, SEEK_CUR or SEEK_END </td></tr>
  19.656 +  </table>
  19.657 +  </dd>
  19.658 +</dl>
  19.659 +<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero if the position is invalid </dd></dl>
  19.660 +
  19.661 +</div>
  19.662 +</div>
  19.663 +<a id="a12a0c6a2379ef080043e6286bb8bad69"></a>
  19.664 +<h2 class="memtitle"><span class="permalink"><a href="#a12a0c6a2379ef080043e6286bb8bad69">&#9670;&nbsp;</a></span>ucx_buffer_shift()</h2>
  19.665 +
  19.666 +<div class="memitem">
  19.667 +<div class="memproto">
  19.668 +      <table class="memname">
  19.669 +        <tr>
  19.670 +          <td class="memname">int ucx_buffer_shift </td>
  19.671 +          <td>(</td>
  19.672 +          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
  19.673 +          <td class="paramname"><em>buffer</em>, </td>
  19.674 +        </tr>
  19.675 +        <tr>
  19.676 +          <td class="paramkey"></td>
  19.677 +          <td></td>
  19.678 +          <td class="paramtype">off_t&#160;</td>
  19.679 +          <td class="paramname"><em>shift</em>&#160;</td>
  19.680 +        </tr>
  19.681 +        <tr>
  19.682 +          <td></td>
  19.683 +          <td>)</td>
  19.684 +          <td></td><td></td>
  19.685 +        </tr>
  19.686 +      </table>
  19.687 +</div><div class="memdoc">
  19.688 +
  19.689 +<p>Shifts the contents of the buffer by the given offset. </p>
  19.690 +<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>
  19.691 +<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>
  19.692 +<p>The buffer position gets shifted alongside with the content but is kept within the boundaries of the buffer.</p>
  19.693 +<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>
  19.694 +<dl class="params"><dt>Parameters</dt><dd>
  19.695 +  <table class="params">
  19.696 +    <tr><td class="paramname">buffer</td><td>the buffer </td></tr>
  19.697 +    <tr><td class="paramname">shift</td><td>the shift offset (negative means left shift) </td></tr>
  19.698 +  </table>
  19.699 +  </dd>
  19.700 +</dl>
  19.701 +<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero if a required auto-extension fails </dd></dl>
  19.702 +
  19.703 +</div>
  19.704 +</div>
  19.705 +<a id="a20431dd0ed6a6fe9f15333bd72afe4db"></a>
  19.706 +<h2 class="memtitle"><span class="permalink"><a href="#a20431dd0ed6a6fe9f15333bd72afe4db">&#9670;&nbsp;</a></span>ucx_buffer_shift_left()</h2>
  19.707 +
  19.708 +<div class="memitem">
  19.709 +<div class="memproto">
  19.710 +      <table class="memname">
  19.711 +        <tr>
  19.712 +          <td class="memname">int ucx_buffer_shift_left </td>
  19.713 +          <td>(</td>
  19.714 +          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
  19.715 +          <td class="paramname"><em>buffer</em>, </td>
  19.716 +        </tr>
  19.717 +        <tr>
  19.718 +          <td class="paramkey"></td>
  19.719 +          <td></td>
  19.720 +          <td class="paramtype">size_t&#160;</td>
  19.721 +          <td class="paramname"><em>shift</em>&#160;</td>
  19.722 +        </tr>
  19.723 +        <tr>
  19.724 +          <td></td>
  19.725 +          <td>)</td>
  19.726 +          <td></td><td></td>
  19.727 +        </tr>
  19.728 +      </table>
  19.729 +</div><div class="memdoc">
  19.730 +
  19.731 +<p>Shifts the buffer to the left. </p>
  19.732 +<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>
  19.733 +<p>Since a left shift cannot fail due to memory allocation problems, this function always returns zero.</p>
  19.734 +<dl class="params"><dt>Parameters</dt><dd>
  19.735 +  <table class="params">
  19.736 +    <tr><td class="paramname">buffer</td><td>the buffer </td></tr>
  19.737 +    <tr><td class="paramname">shift</td><td>the shift offset </td></tr>
  19.738 +  </table>
  19.739 +  </dd>
  19.740 +</dl>
  19.741 +<dl class="section return"><dt>Returns</dt><dd>always zero </dd></dl>
  19.742 +<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>
  19.743 +
  19.744 +</div>
  19.745 +</div>
  19.746 +<a id="a4fa10b6471495547eb981248fd4f1bc2"></a>
  19.747 +<h2 class="memtitle"><span class="permalink"><a href="#a4fa10b6471495547eb981248fd4f1bc2">&#9670;&nbsp;</a></span>ucx_buffer_shift_right()</h2>
  19.748 +
  19.749 +<div class="memitem">
  19.750 +<div class="memproto">
  19.751 +      <table class="memname">
  19.752 +        <tr>
  19.753 +          <td class="memname">int ucx_buffer_shift_right </td>
  19.754 +          <td>(</td>
  19.755 +          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
  19.756 +          <td class="paramname"><em>buffer</em>, </td>
  19.757 +        </tr>
  19.758 +        <tr>
  19.759 +          <td class="paramkey"></td>
  19.760 +          <td></td>
  19.761 +          <td class="paramtype">size_t&#160;</td>
  19.762 +          <td class="paramname"><em>shift</em>&#160;</td>
  19.763 +        </tr>
  19.764 +        <tr>
  19.765 +          <td></td>
  19.766 +          <td>)</td>
  19.767 +          <td></td><td></td>
  19.768 +        </tr>
  19.769 +      </table>
  19.770 +</div><div class="memdoc">
  19.771 +
  19.772 +<p>Shifts the buffer to the right. </p>
  19.773 +<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>
  19.774 +<dl class="params"><dt>Parameters</dt><dd>
  19.775 +  <table class="params">
  19.776 +    <tr><td class="paramname">buffer</td><td>the buffer </td></tr>
  19.777 +    <tr><td class="paramname">shift</td><td>the shift offset </td></tr>
  19.778 +  </table>
  19.779 +  </dd>
  19.780 +</dl>
  19.781 +<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero if a required auto-extension fails </dd></dl>
  19.782 +<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>
  19.783 +
  19.784 +</div>
  19.785 +</div>
  19.786 +<a id="af8aacc7401814392b58c1b7b81bffc05"></a>
  19.787 +<h2 class="memtitle"><span class="permalink"><a href="#af8aacc7401814392b58c1b7b81bffc05">&#9670;&nbsp;</a></span>ucx_buffer_write()</h2>
  19.788 +
  19.789 +<div class="memitem">
  19.790 +<div class="memproto">
  19.791 +      <table class="memname">
  19.792 +        <tr>
  19.793 +          <td class="memname">size_t ucx_buffer_write </td>
  19.794 +          <td>(</td>
  19.795 +          <td class="paramtype">const void *&#160;</td>
  19.796 +          <td class="paramname"><em>ptr</em>, </td>
  19.797 +        </tr>
  19.798 +        <tr>
  19.799 +          <td class="paramkey"></td>
  19.800 +          <td></td>
  19.801 +          <td class="paramtype">size_t&#160;</td>
  19.802 +          <td class="paramname"><em>size</em>, </td>
  19.803 +        </tr>
  19.804 +        <tr>
  19.805 +          <td class="paramkey"></td>
  19.806 +          <td></td>
  19.807 +          <td class="paramtype">size_t&#160;</td>
  19.808 +          <td class="paramname"><em>nitems</em>, </td>
  19.809 +        </tr>
  19.810 +        <tr>
  19.811 +          <td class="paramkey"></td>
  19.812 +          <td></td>
  19.813 +          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
  19.814 +          <td class="paramname"><em>buffer</em>&#160;</td>
  19.815 +        </tr>
  19.816 +        <tr>
  19.817 +          <td></td>
  19.818 +          <td>)</td>
  19.819 +          <td></td><td></td>
  19.820 +        </tr>
  19.821 +      </table>
  19.822 +</div><div class="memdoc">
  19.823 +
  19.824 +<p>Writes data to a <a class="el" href="structUcxBuffer.html" title="UCX Buffer. ">UcxBuffer</a>. </p>
  19.825 +<p>The position of the buffer is increased by the number of bytes written.</p>
  19.826 +<dl class="params"><dt>Parameters</dt><dd>
  19.827 +  <table class="params">
  19.828 +    <tr><td class="paramname">ptr</td><td>a pointer to the memory area containing the bytes to be written </td></tr>
  19.829 +    <tr><td class="paramname">size</td><td>the length of one element </td></tr>
  19.830 +    <tr><td class="paramname">nitems</td><td>the element count </td></tr>
  19.831 +    <tr><td class="paramname">buffer</td><td>the <a class="el" href="structUcxBuffer.html" title="UCX Buffer. ">UcxBuffer</a> to write to </td></tr>
  19.832 +  </table>
  19.833 +  </dd>
  19.834 +</dl>
  19.835 +<dl class="section return"><dt>Returns</dt><dd>the total count of bytes written </dd></dl>
  19.836 +
  19.837 +</div>
  19.838 +</div>
  19.839 +</div><!-- contents -->
  19.840 +<!-- start footer part -->
  19.841 +<hr class="footer"/><address class="footer"><small>
  19.842 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  19.843 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  19.844 +</a> 1.8.13
  19.845 +</small></address>
  19.846 +</body>
  19.847 +</html>
    20.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    20.2 +++ b/docs/api-2.1/buffer_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
    20.3 @@ -0,0 +1,100 @@
    20.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    20.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    20.6 +<head>
    20.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    20.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    20.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   20.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   20.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/buffer.h Source File</title>
   20.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   20.13 +<script type="text/javascript" src="jquery.js"></script>
   20.14 +<script type="text/javascript" src="dynsections.js"></script>
   20.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   20.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   20.17 +<script type="text/javascript" src="search/search.js"></script>
   20.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   20.19 +</head>
   20.20 +<body>
   20.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   20.22 +<div id="titlearea">
   20.23 +<table cellspacing="0" cellpadding="0">
   20.24 + <tbody>
   20.25 + <tr style="height: 56px;">
   20.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   20.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   20.28 +   <div id="projectname">ucx
   20.29 +   </div>
   20.30 +   <div id="projectbrief">UAP Common Extensions</div>
   20.31 +  </td>
   20.32 + </tr>
   20.33 + </tbody>
   20.34 +</table>
   20.35 +</div>
   20.36 +<!-- end header part -->
   20.37 +<!-- Generated by Doxygen 1.8.13 -->
   20.38 +<script type="text/javascript">
   20.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   20.40 +</script>
   20.41 +<script type="text/javascript" src="menudata.js"></script>
   20.42 +<script type="text/javascript" src="menu.js"></script>
   20.43 +<script type="text/javascript">
   20.44 +$(function() {
   20.45 +  initMenu('',true,false,'search.php','Search');
   20.46 +  $(document).ready(function() { init_search(); });
   20.47 +});
   20.48 +</script>
   20.49 +<div id="main-nav"></div>
   20.50 +<!-- window showing the filter options -->
   20.51 +<div id="MSearchSelectWindow"
   20.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   20.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   20.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   20.55 +</div>
   20.56 +
   20.57 +<!-- iframe showing the search results (closed by default) -->
   20.58 +<div id="MSearchResultsWindow">
   20.59 +<iframe src="javascript:void(0)" frameborder="0" 
   20.60 +        name="MSearchResults" id="MSearchResults">
   20.61 +</iframe>
   20.62 +</div>
   20.63 +
   20.64 +<div id="nav-path" class="navpath">
   20.65 +  <ul>
   20.66 +<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>
   20.67 +</div>
   20.68 +</div><!-- top -->
   20.69 +<div class="header">
   20.70 +  <div class="headertitle">
   20.71 +<div class="title">buffer.h</div>  </div>
   20.72 +</div><!--header-->
   20.73 +<div class="contents">
   20.74 +<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>
   20.75 +<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>
   20.76 +<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>
   20.77 +<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>
   20.78 +<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>
   20.79 +<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>
   20.80 +<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>
   20.81 +<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>
   20.82 +<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>
   20.83 +<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>
   20.84 +<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>
   20.85 +<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>
   20.86 +<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>
   20.87 +<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>
   20.88 +<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>
   20.89 +<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>
   20.90 +<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>
   20.91 +<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>
   20.92 +<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>
   20.93 +<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>
   20.94 +<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>
   20.95 +</div><!-- fragment --></div><!-- contents -->
   20.96 +<!-- start footer part -->
   20.97 +<hr class="footer"/><address class="footer"><small>
   20.98 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
   20.99 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  20.100 +</a> 1.8.13
  20.101 +</small></address>
  20.102 +</body>
  20.103 +</html>
    21.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    21.2 +++ b/docs/api-2.1/classes.html	Sat Feb 06 19:11:44 2021 +0100
    21.3 @@ -0,0 +1,89 @@
    21.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    21.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    21.6 +<head>
    21.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    21.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    21.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   21.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   21.11 +<title>ucx: Data Structure Index</title>
   21.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   21.13 +<script type="text/javascript" src="jquery.js"></script>
   21.14 +<script type="text/javascript" src="dynsections.js"></script>
   21.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   21.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   21.17 +<script type="text/javascript" src="search/search.js"></script>
   21.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   21.19 +</head>
   21.20 +<body>
   21.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   21.22 +<div id="titlearea">
   21.23 +<table cellspacing="0" cellpadding="0">
   21.24 + <tbody>
   21.25 + <tr style="height: 56px;">
   21.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   21.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   21.28 +   <div id="projectname">ucx
   21.29 +   </div>
   21.30 +   <div id="projectbrief">UAP Common Extensions</div>
   21.31 +  </td>
   21.32 + </tr>
   21.33 + </tbody>
   21.34 +</table>
   21.35 +</div>
   21.36 +<!-- end header part -->
   21.37 +<!-- Generated by Doxygen 1.8.13 -->
   21.38 +<script type="text/javascript">
   21.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   21.40 +</script>
   21.41 +<script type="text/javascript" src="menudata.js"></script>
   21.42 +<script type="text/javascript" src="menu.js"></script>
   21.43 +<script type="text/javascript">
   21.44 +$(function() {
   21.45 +  initMenu('',true,false,'search.php','Search');
   21.46 +  $(document).ready(function() { init_search(); });
   21.47 +});
   21.48 +</script>
   21.49 +<div id="main-nav"></div>
   21.50 +</div><!-- top -->
   21.51 +<!-- window showing the filter options -->
   21.52 +<div id="MSearchSelectWindow"
   21.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   21.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   21.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   21.56 +</div>
   21.57 +
   21.58 +<!-- iframe showing the search results (closed by default) -->
   21.59 +<div id="MSearchResultsWindow">
   21.60 +<iframe src="javascript:void(0)" frameborder="0" 
   21.61 +        name="MSearchResults" id="MSearchResults">
   21.62 +</iframe>
   21.63 +</div>
   21.64 +
   21.65 +<div class="header">
   21.66 +  <div class="headertitle">
   21.67 +<div class="title">Data Structure Index</div>  </div>
   21.68 +</div><!--header-->
   21.69 +<div class="contents">
   21.70 +<div class="qindex"><a class="qindex" href="#letter_s">s</a>&#160;|&#160;<a class="qindex" href="#letter_u">u</a></div>
   21.71 +<table class="classindex">
   21.72 +<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>
   21.73 +</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>
   21.74 +<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>
   21.75 +<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>
   21.76 +<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>
   21.77 +<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>
   21.78 +</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>
   21.79 +<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>
   21.80 +<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>
   21.81 +<tr><td></td><td></td><td></td><td></td><td></td></tr>
   21.82 +</table>
   21.83 +<div class="qindex"><a class="qindex" href="#letter_s">s</a>&#160;|&#160;<a class="qindex" href="#letter_u">u</a></div>
   21.84 +</div><!-- contents -->
   21.85 +<!-- start footer part -->
   21.86 +<hr class="footer"/><address class="footer"><small>
   21.87 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
   21.88 +<img class="footer" src="doxygen.png" alt="doxygen"/>
   21.89 +</a> 1.8.13
   21.90 +</small></address>
   21.91 +</body>
   21.92 +</html>
    22.1 Binary file docs/api-2.1/closed.png has changed
    23.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    23.2 +++ b/docs/api-2.1/dir_68267d1309a1af8e8297ef4c3efbcdba.html	Sat Feb 06 19:11:44 2021 +0100
    23.3 @@ -0,0 +1,83 @@
    23.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    23.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    23.6 +<head>
    23.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    23.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    23.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   23.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   23.11 +<title>ucx: /home/mike/workspace/c/ucx/src Directory Reference</title>
   23.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   23.13 +<script type="text/javascript" src="jquery.js"></script>
   23.14 +<script type="text/javascript" src="dynsections.js"></script>
   23.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   23.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   23.17 +<script type="text/javascript" src="search/search.js"></script>
   23.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   23.19 +</head>
   23.20 +<body>
   23.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   23.22 +<div id="titlearea">
   23.23 +<table cellspacing="0" cellpadding="0">
   23.24 + <tbody>
   23.25 + <tr style="height: 56px;">
   23.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   23.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   23.28 +   <div id="projectname">ucx
   23.29 +   </div>
   23.30 +   <div id="projectbrief">UAP Common Extensions</div>
   23.31 +  </td>
   23.32 + </tr>
   23.33 + </tbody>
   23.34 +</table>
   23.35 +</div>
   23.36 +<!-- end header part -->
   23.37 +<!-- Generated by Doxygen 1.8.13 -->
   23.38 +<script type="text/javascript">
   23.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   23.40 +</script>
   23.41 +<script type="text/javascript" src="menudata.js"></script>
   23.42 +<script type="text/javascript" src="menu.js"></script>
   23.43 +<script type="text/javascript">
   23.44 +$(function() {
   23.45 +  initMenu('',true,false,'search.php','Search');
   23.46 +  $(document).ready(function() { init_search(); });
   23.47 +});
   23.48 +</script>
   23.49 +<div id="main-nav"></div>
   23.50 +<!-- window showing the filter options -->
   23.51 +<div id="MSearchSelectWindow"
   23.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   23.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   23.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   23.55 +</div>
   23.56 +
   23.57 +<!-- iframe showing the search results (closed by default) -->
   23.58 +<div id="MSearchResultsWindow">
   23.59 +<iframe src="javascript:void(0)" frameborder="0" 
   23.60 +        name="MSearchResults" id="MSearchResults">
   23.61 +</iframe>
   23.62 +</div>
   23.63 +
   23.64 +<div id="nav-path" class="navpath">
   23.65 +  <ul>
   23.66 +<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li>  </ul>
   23.67 +</div>
   23.68 +</div><!-- top -->
   23.69 +<div class="header">
   23.70 +  <div class="headertitle">
   23.71 +<div class="title">src Directory Reference</div>  </div>
   23.72 +</div><!--header-->
   23.73 +<div class="contents">
   23.74 +<table class="memberdecls">
   23.75 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
   23.76 +Directories</h2></td></tr>
   23.77 +</table>
   23.78 +</div><!-- contents -->
   23.79 +<!-- start footer part -->
   23.80 +<hr class="footer"/><address class="footer"><small>
   23.81 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
   23.82 +<img class="footer" src="doxygen.png" alt="doxygen"/>
   23.83 +</a> 1.8.13
   23.84 +</small></address>
   23.85 +</body>
   23.86 +</html>
    24.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    24.2 +++ b/docs/api-2.1/dir_69f4ea29401808fe6229564976cde3ce.html	Sat Feb 06 19:11:44 2021 +0100
    24.3 @@ -0,0 +1,125 @@
    24.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    24.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    24.6 +<head>
    24.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    24.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    24.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   24.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   24.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx Directory Reference</title>
   24.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   24.13 +<script type="text/javascript" src="jquery.js"></script>
   24.14 +<script type="text/javascript" src="dynsections.js"></script>
   24.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   24.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   24.17 +<script type="text/javascript" src="search/search.js"></script>
   24.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   24.19 +</head>
   24.20 +<body>
   24.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   24.22 +<div id="titlearea">
   24.23 +<table cellspacing="0" cellpadding="0">
   24.24 + <tbody>
   24.25 + <tr style="height: 56px;">
   24.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   24.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   24.28 +   <div id="projectname">ucx
   24.29 +   </div>
   24.30 +   <div id="projectbrief">UAP Common Extensions</div>
   24.31 +  </td>
   24.32 + </tr>
   24.33 + </tbody>
   24.34 +</table>
   24.35 +</div>
   24.36 +<!-- end header part -->
   24.37 +<!-- Generated by Doxygen 1.8.13 -->
   24.38 +<script type="text/javascript">
   24.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   24.40 +</script>
   24.41 +<script type="text/javascript" src="menudata.js"></script>
   24.42 +<script type="text/javascript" src="menu.js"></script>
   24.43 +<script type="text/javascript">
   24.44 +$(function() {
   24.45 +  initMenu('',true,false,'search.php','Search');
   24.46 +  $(document).ready(function() { init_search(); });
   24.47 +});
   24.48 +</script>
   24.49 +<div id="main-nav"></div>
   24.50 +<!-- window showing the filter options -->
   24.51 +<div id="MSearchSelectWindow"
   24.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   24.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   24.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   24.55 +</div>
   24.56 +
   24.57 +<!-- iframe showing the search results (closed by default) -->
   24.58 +<div id="MSearchResultsWindow">
   24.59 +<iframe src="javascript:void(0)" frameborder="0" 
   24.60 +        name="MSearchResults" id="MSearchResults">
   24.61 +</iframe>
   24.62 +</div>
   24.63 +
   24.64 +<div id="nav-path" class="navpath">
   24.65 +  <ul>
   24.66 +<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>
   24.67 +</div>
   24.68 +</div><!-- top -->
   24.69 +<div class="header">
   24.70 +  <div class="headertitle">
   24.71 +<div class="title">ucx Directory Reference</div>  </div>
   24.72 +</div><!--header-->
   24.73 +<div class="contents">
   24.74 +<table class="memberdecls">
   24.75 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
   24.76 +Files</h2></td></tr>
   24.77 +<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>
   24.78 +<tr class="memdesc:allocator_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocator for custom memory management. <br /></td></tr>
   24.79 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   24.80 +<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>
   24.81 +<tr class="memdesc:array_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Dynamically allocated array implementation. <br /></td></tr>
   24.82 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   24.83 +<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>
   24.84 +<tr class="memdesc:avl_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">AVL tree implementation. <br /></td></tr>
   24.85 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   24.86 +<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>
   24.87 +<tr class="memdesc:buffer_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Advanced buffer implementation. <br /></td></tr>
   24.88 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   24.89 +<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>
   24.90 +<tr class="memdesc:list_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Doubly linked list implementation. <br /></td></tr>
   24.91 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   24.92 +<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>
   24.93 +<tr class="memdesc:logging_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Logging API. <br /></td></tr>
   24.94 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   24.95 +<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>
   24.96 +<tr class="memdesc:map_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hash map implementation. <br /></td></tr>
   24.97 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   24.98 +<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>
   24.99 +<tr class="memdesc:mempool_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Memory pool implementation. <br /></td></tr>
  24.100 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
  24.101 +<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>
  24.102 +<tr class="memdesc:properties_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Load / store utilities for properties files. <br /></td></tr>
  24.103 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
  24.104 +<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>
  24.105 +<tr class="memdesc:stack_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Default stack memory allocation implementation. <br /></td></tr>
  24.106 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
  24.107 +<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>
  24.108 +<tr class="memdesc:string_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Bounded string implementation. <br /></td></tr>
  24.109 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
  24.110 +<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>
  24.111 +<tr class="memdesc:test_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX Test Framework. <br /></td></tr>
  24.112 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
  24.113 +<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>
  24.114 +<tr class="memdesc:ucx_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Main UCX Header providing most common definitions. <br /></td></tr>
  24.115 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
  24.116 +<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>
  24.117 +<tr class="memdesc:utils_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compare, copy and printf functions. <br /></td></tr>
  24.118 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
  24.119 +</table>
  24.120 +</div><!-- contents -->
  24.121 +<!-- start footer part -->
  24.122 +<hr class="footer"/><address class="footer"><small>
  24.123 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  24.124 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  24.125 +</a> 1.8.13
  24.126 +</small></address>
  24.127 +</body>
  24.128 +</html>
    25.1 Binary file docs/api-2.1/doc.png has changed
    26.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    26.2 +++ b/docs/api-2.1/doxygen.css	Sat Feb 06 19:11:44 2021 +0100
    26.3 @@ -0,0 +1,1596 @@
    26.4 +/* The standard CSS for doxygen 1.8.13 */
    26.5 +
    26.6 +body, table, div, p, dl {
    26.7 +	font: 400 14px/22px Roboto,sans-serif;
    26.8 +}
    26.9 +
   26.10 +p.reference, p.definition {
   26.11 +	font: 400 14px/22px Roboto,sans-serif;
   26.12 +}
   26.13 +
   26.14 +/* @group Heading Levels */
   26.15 +
   26.16 +h1.groupheader {
   26.17 +	font-size: 150%;
   26.18 +}
   26.19 +
   26.20 +.title {
   26.21 +	font: 400 14px/28px Roboto,sans-serif;
   26.22 +	font-size: 150%;
   26.23 +	font-weight: bold;
   26.24 +	margin: 10px 2px;
   26.25 +}
   26.26 +
   26.27 +h2.groupheader {
   26.28 +	border-bottom: 1px solid #879ECB;
   26.29 +	color: #354C7B;
   26.30 +	font-size: 150%;
   26.31 +	font-weight: normal;
   26.32 +	margin-top: 1.75em;
   26.33 +	padding-top: 8px;
   26.34 +	padding-bottom: 4px;
   26.35 +	width: 100%;
   26.36 +}
   26.37 +
   26.38 +h3.groupheader {
   26.39 +	font-size: 100%;
   26.40 +}
   26.41 +
   26.42 +h1, h2, h3, h4, h5, h6 {
   26.43 +	-webkit-transition: text-shadow 0.5s linear;
   26.44 +	-moz-transition: text-shadow 0.5s linear;
   26.45 +	-ms-transition: text-shadow 0.5s linear;
   26.46 +	-o-transition: text-shadow 0.5s linear;
   26.47 +	transition: text-shadow 0.5s linear;
   26.48 +	margin-right: 15px;
   26.49 +}
   26.50 +
   26.51 +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
   26.52 +	text-shadow: 0 0 15px cyan;
   26.53 +}
   26.54 +
   26.55 +dt {
   26.56 +	font-weight: bold;
   26.57 +}
   26.58 +
   26.59 +div.multicol {
   26.60 +	-moz-column-gap: 1em;
   26.61 +	-webkit-column-gap: 1em;
   26.62 +	-moz-column-count: 3;
   26.63 +	-webkit-column-count: 3;
   26.64 +}
   26.65 +
   26.66 +p.startli, p.startdd {
   26.67 +	margin-top: 2px;
   26.68 +}
   26.69 +
   26.70 +p.starttd {
   26.71 +	margin-top: 0px;
   26.72 +}
   26.73 +
   26.74 +p.endli {
   26.75 +	margin-bottom: 0px;
   26.76 +}
   26.77 +
   26.78 +p.enddd {
   26.79 +	margin-bottom: 4px;
   26.80 +}
   26.81 +
   26.82 +p.endtd {
   26.83 +	margin-bottom: 2px;
   26.84 +}
   26.85 +
   26.86 +/* @end */
   26.87 +
   26.88 +caption {
   26.89 +	font-weight: bold;
   26.90 +}
   26.91 +
   26.92 +span.legend {
   26.93 +        font-size: 70%;
   26.94 +        text-align: center;
   26.95 +}
   26.96 +
   26.97 +h3.version {
   26.98 +        font-size: 90%;
   26.99 +        text-align: center;
  26.100 +}
  26.101 +
  26.102 +div.qindex, div.navtab{
  26.103 +	background-color: #EBEFF6;
  26.104 +	border: 1px solid #A3B4D7;
  26.105 +	text-align: center;
  26.106 +}
  26.107 +
  26.108 +div.qindex, div.navpath {
  26.109 +	width: 100%;
  26.110 +	line-height: 140%;
  26.111 +}
  26.112 +
  26.113 +div.navtab {
  26.114 +	margin-right: 15px;
  26.115 +}
  26.116 +
  26.117 +/* @group Link Styling */
  26.118 +
  26.119 +a {
  26.120 +	color: #3D578C;
  26.121 +	font-weight: normal;
  26.122 +	text-decoration: none;
  26.123 +}
  26.124 +
  26.125 +.contents a:visited {
  26.126 +	color: #4665A2;
  26.127 +}
  26.128 +
  26.129 +a:hover {
  26.130 +	text-decoration: underline;
  26.131 +}
  26.132 +
  26.133 +a.qindex {
  26.134 +	font-weight: bold;
  26.135 +}
  26.136 +
  26.137 +a.qindexHL {
  26.138 +	font-weight: bold;
  26.139 +	background-color: #9CAFD4;
  26.140 +	color: #ffffff;
  26.141 +	border: 1px double #869DCA;
  26.142 +}
  26.143 +
  26.144 +.contents a.qindexHL:visited {
  26.145 +        color: #ffffff;
  26.146 +}
  26.147 +
  26.148 +a.el {
  26.149 +	font-weight: bold;
  26.150 +}
  26.151 +
  26.152 +a.elRef {
  26.153 +}
  26.154 +
  26.155 +a.code, a.code:visited, a.line, a.line:visited {
  26.156 +	color: #4665A2; 
  26.157 +}
  26.158 +
  26.159 +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
  26.160 +	color: #4665A2; 
  26.161 +}
  26.162 +
  26.163 +/* @end */
  26.164 +
  26.165 +dl.el {
  26.166 +	margin-left: -1cm;
  26.167 +}
  26.168 +
  26.169 +pre.fragment {
  26.170 +        border: 1px solid #C4CFE5;
  26.171 +        background-color: #FBFCFD;
  26.172 +        padding: 4px 6px;
  26.173 +        margin: 4px 8px 4px 2px;
  26.174 +        overflow: auto;
  26.175 +        word-wrap: break-word;
  26.176 +        font-size:  9pt;
  26.177 +        line-height: 125%;
  26.178 +        font-family: monospace, fixed;
  26.179 +        font-size: 105%;
  26.180 +}
  26.181 +
  26.182 +div.fragment {
  26.183 +        padding: 0px;
  26.184 +        margin: 4px 8px 4px 2px;
  26.185 +	background-color: #FBFCFD;
  26.186 +	border: 1px solid #C4CFE5;
  26.187 +}
  26.188 +
  26.189 +div.line {
  26.190 +	font-family: monospace, fixed;
  26.191 +        font-size: 13px;
  26.192 +	min-height: 13px;
  26.193 +	line-height: 1.0;
  26.194 +	text-wrap: unrestricted;
  26.195 +	white-space: -moz-pre-wrap; /* Moz */
  26.196 +	white-space: -pre-wrap;     /* Opera 4-6 */
  26.197 +	white-space: -o-pre-wrap;   /* Opera 7 */
  26.198 +	white-space: pre-wrap;      /* CSS3  */
  26.199 +	word-wrap: break-word;      /* IE 5.5+ */
  26.200 +	text-indent: -53px;
  26.201 +	padding-left: 53px;
  26.202 +	padding-bottom: 0px;
  26.203 +	margin: 0px;
  26.204 +	-webkit-transition-property: background-color, box-shadow;
  26.205 +	-webkit-transition-duration: 0.5s;
  26.206 +	-moz-transition-property: background-color, box-shadow;
  26.207 +	-moz-transition-duration: 0.5s;
  26.208 +	-ms-transition-property: background-color, box-shadow;
  26.209 +	-ms-transition-duration: 0.5s;
  26.210 +	-o-transition-property: background-color, box-shadow;
  26.211 +	-o-transition-duration: 0.5s;
  26.212 +	transition-property: background-color, box-shadow;
  26.213 +	transition-duration: 0.5s;
  26.214 +}
  26.215 +
  26.216 +div.line:after {
  26.217 +    content:"\000A";
  26.218 +    white-space: pre;
  26.219 +}
  26.220 +
  26.221 +div.line.glow {
  26.222 +	background-color: cyan;
  26.223 +	box-shadow: 0 0 10px cyan;
  26.224 +}
  26.225 +
  26.226 +
  26.227 +span.lineno {
  26.228 +	padding-right: 4px;
  26.229 +	text-align: right;
  26.230 +	border-right: 2px solid #0F0;
  26.231 +	background-color: #E8E8E8;
  26.232 +        white-space: pre;
  26.233 +}
  26.234 +span.lineno a {
  26.235 +	background-color: #D8D8D8;
  26.236 +}
  26.237 +
  26.238 +span.lineno a:hover {
  26.239 +	background-color: #C8C8C8;
  26.240 +}
  26.241 +
  26.242 +.lineno {
  26.243 +	-webkit-touch-callout: none;
  26.244 +	-webkit-user-select: none;
  26.245 +	-khtml-user-select: none;
  26.246 +	-moz-user-select: none;
  26.247 +	-ms-user-select: none;
  26.248 +	user-select: none;
  26.249 +}
  26.250 +
  26.251 +div.ah, span.ah {
  26.252 +	background-color: black;
  26.253 +	font-weight: bold;
  26.254 +	color: #ffffff;
  26.255 +	margin-bottom: 3px;
  26.256 +	margin-top: 3px;
  26.257 +	padding: 0.2em;
  26.258 +	border: solid thin #333;
  26.259 +	border-radius: 0.5em;
  26.260 +	-webkit-border-radius: .5em;
  26.261 +	-moz-border-radius: .5em;
  26.262 +	box-shadow: 2px 2px 3px #999;
  26.263 +	-webkit-box-shadow: 2px 2px 3px #999;
  26.264 +	-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
  26.265 +	background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
  26.266 +	background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%);
  26.267 +}
  26.268 +
  26.269 +div.classindex ul {
  26.270 +        list-style: none;
  26.271 +        padding-left: 0;
  26.272 +}
  26.273 +
  26.274 +div.classindex span.ai {
  26.275 +        display: inline-block;
  26.276 +}
  26.277 +
  26.278 +div.groupHeader {
  26.279 +	margin-left: 16px;
  26.280 +	margin-top: 12px;
  26.281 +	font-weight: bold;
  26.282 +}
  26.283 +
  26.284 +div.groupText {
  26.285 +	margin-left: 16px;
  26.286 +	font-style: italic;
  26.287 +}
  26.288 +
  26.289 +body {
  26.290 +	background-color: white;
  26.291 +	color: black;
  26.292 +        margin: 0;
  26.293 +}
  26.294 +
  26.295 +div.contents {
  26.296 +	margin-top: 10px;
  26.297 +	margin-left: 12px;
  26.298 +	margin-right: 8px;
  26.299 +}
  26.300 +
  26.301 +td.indexkey {
  26.302 +	background-color: #EBEFF6;
  26.303 +	font-weight: bold;
  26.304 +	border: 1px solid #C4CFE5;
  26.305 +	margin: 2px 0px 2px 0;
  26.306 +	padding: 2px 10px;
  26.307 +        white-space: nowrap;
  26.308 +        vertical-align: top;
  26.309 +}
  26.310 +
  26.311 +td.indexvalue {
  26.312 +	background-color: #EBEFF6;
  26.313 +	border: 1px solid #C4CFE5;
  26.314 +	padding: 2px 10px;
  26.315 +	margin: 2px 0px;
  26.316 +}
  26.317 +
  26.318 +tr.memlist {
  26.319 +	background-color: #EEF1F7;
  26.320 +}
  26.321 +
  26.322 +p.formulaDsp {
  26.323 +	text-align: center;
  26.324 +}
  26.325 +
  26.326 +img.formulaDsp {
  26.327 +	
  26.328 +}
  26.329 +
  26.330 +img.formulaInl {
  26.331 +	vertical-align: middle;
  26.332 +}
  26.333 +
  26.334 +div.center {
  26.335 +	text-align: center;
  26.336 +        margin-top: 0px;
  26.337 +        margin-bottom: 0px;
  26.338 +        padding: 0px;
  26.339 +}
  26.340 +
  26.341 +div.center img {
  26.342 +	border: 0px;
  26.343 +}
  26.344 +
  26.345 +address.footer {
  26.346 +	text-align: right;
  26.347 +	padding-right: 12px;
  26.348 +}
  26.349 +
  26.350 +img.footer {
  26.351 +	border: 0px;
  26.352 +	vertical-align: middle;
  26.353 +}
  26.354 +
  26.355 +/* @group Code Colorization */
  26.356 +
  26.357 +span.keyword {
  26.358 +	color: #008000
  26.359 +}
  26.360 +
  26.361 +span.keywordtype {
  26.362 +	color: #604020
  26.363 +}
  26.364 +
  26.365 +span.keywordflow {
  26.366 +	color: #e08000
  26.367 +}
  26.368 +
  26.369 +span.comment {
  26.370 +	color: #800000
  26.371 +}
  26.372 +
  26.373 +span.preprocessor {
  26.374 +	color: #806020
  26.375 +}
  26.376 +
  26.377 +span.stringliteral {
  26.378 +	color: #002080
  26.379 +}
  26.380 +
  26.381 +span.charliteral {
  26.382 +	color: #008080
  26.383 +}
  26.384 +
  26.385 +span.vhdldigit { 
  26.386 +	color: #ff00ff 
  26.387 +}
  26.388 +
  26.389 +span.vhdlchar { 
  26.390 +	color: #000000 
  26.391 +}
  26.392 +
  26.393 +span.vhdlkeyword { 
  26.394 +	color: #700070 
  26.395 +}
  26.396 +
  26.397 +span.vhdllogic { 
  26.398 +	color: #ff0000 
  26.399 +}
  26.400 +
  26.401 +blockquote {
  26.402 +        background-color: #F7F8FB;
  26.403 +        border-left: 2px solid #9CAFD4;
  26.404 +        margin: 0 24px 0 4px;
  26.405 +        padding: 0 12px 0 16px;
  26.406 +}
  26.407 +
  26.408 +/* @end */
  26.409 +
  26.410 +/*
  26.411 +.search {
  26.412 +	color: #003399;
  26.413 +	font-weight: bold;
  26.414 +}
  26.415 +
  26.416 +form.search {
  26.417 +	margin-bottom: 0px;
  26.418 +	margin-top: 0px;
  26.419 +}
  26.420 +
  26.421 +input.search {
  26.422 +	font-size: 75%;
  26.423 +	color: #000080;
  26.424 +	font-weight: normal;
  26.425 +	background-color: #e8eef2;
  26.426 +}
  26.427 +*/
  26.428 +
  26.429 +td.tiny {
  26.430 +	font-size: 75%;
  26.431 +}
  26.432 +
  26.433 +.dirtab {
  26.434 +	padding: 4px;
  26.435 +	border-collapse: collapse;
  26.436 +	border: 1px solid #A3B4D7;
  26.437 +}
  26.438 +
  26.439 +th.dirtab {
  26.440 +	background: #EBEFF6;
  26.441 +	font-weight: bold;
  26.442 +}
  26.443 +
  26.444 +hr {
  26.445 +	height: 0px;
  26.446 +	border: none;
  26.447 +	border-top: 1px solid #4A6AAA;
  26.448 +}
  26.449 +
  26.450 +hr.footer {
  26.451 +	height: 1px;
  26.452 +}
  26.453 +
  26.454 +/* @group Member Descriptions */
  26.455 +
  26.456 +table.memberdecls {
  26.457 +	border-spacing: 0px;
  26.458 +	padding: 0px;
  26.459 +}
  26.460 +
  26.461 +.memberdecls td, .fieldtable tr {
  26.462 +	-webkit-transition-property: background-color, box-shadow;
  26.463 +	-webkit-transition-duration: 0.5s;
  26.464 +	-moz-transition-property: background-color, box-shadow;
  26.465 +	-moz-transition-duration: 0.5s;
  26.466 +	-ms-transition-property: background-color, box-shadow;
  26.467 +	-ms-transition-duration: 0.5s;
  26.468 +	-o-transition-property: background-color, box-shadow;
  26.469 +	-o-transition-duration: 0.5s;
  26.470 +	transition-property: background-color, box-shadow;
  26.471 +	transition-duration: 0.5s;
  26.472 +}
  26.473 +
  26.474 +.memberdecls td.glow, .fieldtable tr.glow {
  26.475 +	background-color: cyan;
  26.476 +	box-shadow: 0 0 15px cyan;
  26.477 +}
  26.478 +
  26.479 +.mdescLeft, .mdescRight,
  26.480 +.memItemLeft, .memItemRight,
  26.481 +.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
  26.482 +	background-color: #F9FAFC;
  26.483 +	border: none;
  26.484 +	margin: 4px;
  26.485 +	padding: 1px 0 0 8px;
  26.486 +}
  26.487 +
  26.488 +.mdescLeft, .mdescRight {
  26.489 +	padding: 0px 8px 4px 8px;
  26.490 +	color: #555;
  26.491 +}
  26.492 +
  26.493 +.memSeparator {
  26.494 +        border-bottom: 1px solid #DEE4F0;
  26.495 +        line-height: 1px;
  26.496 +        margin: 0px;
  26.497 +        padding: 0px;
  26.498 +}
  26.499 +
  26.500 +.memItemLeft, .memTemplItemLeft {
  26.501 +        white-space: nowrap;
  26.502 +}
  26.503 +
  26.504 +.memItemRight {
  26.505 +	width: 100%;
  26.506 +}
  26.507 +
  26.508 +.memTemplParams {
  26.509 +	color: #4665A2;
  26.510 +        white-space: nowrap;
  26.511 +	font-size: 80%;
  26.512 +}
  26.513 +
  26.514 +/* @end */
  26.515 +
  26.516 +/* @group Member Details */
  26.517 +
  26.518 +/* Styles for detailed member documentation */
  26.519 +
  26.520 +.memtitle {
  26.521 +	padding: 8px;
  26.522 +	border-top: 1px solid #A8B8D9;
  26.523 +	border-left: 1px solid #A8B8D9;
  26.524 +	border-right: 1px solid #A8B8D9;
  26.525 +	border-top-right-radius: 4px;
  26.526 +	border-top-left-radius: 4px;
  26.527 +	margin-bottom: -1px;
  26.528 +	background-image: url('nav_f.png');
  26.529 +	background-repeat: repeat-x;
  26.530 +	background-color: #E2E8F2;
  26.531 +	line-height: 1.25;
  26.532 +	font-weight: 300;
  26.533 +	float:left;
  26.534 +}
  26.535 +
  26.536 +.permalink
  26.537 +{
  26.538 +        font-size: 65%;
  26.539 +        display: inline-block;
  26.540 +        vertical-align: middle;
  26.541 +}
  26.542 +
  26.543 +.memtemplate {
  26.544 +	font-size: 80%;
  26.545 +	color: #4665A2;
  26.546 +	font-weight: normal;
  26.547 +	margin-left: 9px;
  26.548 +}
  26.549 +
  26.550 +.memnav {
  26.551 +	background-color: #EBEFF6;
  26.552 +	border: 1px solid #A3B4D7;
  26.553 +	text-align: center;
  26.554 +	margin: 2px;
  26.555 +	margin-right: 15px;
  26.556 +	padding: 2px;
  26.557 +}
  26.558 +
  26.559 +.mempage {
  26.560 +	width: 100%;
  26.561 +}
  26.562 +
  26.563 +.memitem {
  26.564 +	padding: 0;
  26.565 +	margin-bottom: 10px;
  26.566 +	margin-right: 5px;
  26.567 +        -webkit-transition: box-shadow 0.5s linear;
  26.568 +        -moz-transition: box-shadow 0.5s linear;
  26.569 +        -ms-transition: box-shadow 0.5s linear;
  26.570 +        -o-transition: box-shadow 0.5s linear;
  26.571 +        transition: box-shadow 0.5s linear;
  26.572 +        display: table !important;
  26.573 +        width: 100%;
  26.574 +}
  26.575 +
  26.576 +.memitem.glow {
  26.577 +         box-shadow: 0 0 15px cyan;
  26.578 +}
  26.579 +
  26.580 +.memname {
  26.581 +        font-weight: 400;
  26.582 +        margin-left: 6px;
  26.583 +}
  26.584 +
  26.585 +.memname td {
  26.586 +	vertical-align: bottom;
  26.587 +}
  26.588 +
  26.589 +.memproto, dl.reflist dt {
  26.590 +        border-top: 1px solid #A8B8D9;
  26.591 +        border-left: 1px solid #A8B8D9;
  26.592 +        border-right: 1px solid #A8B8D9;
  26.593 +        padding: 6px 0px 6px 0px;
  26.594 +        color: #253555;
  26.595 +        font-weight: bold;
  26.596 +        text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
  26.597 +        background-color: #DFE5F1;
  26.598 +        /* opera specific markup */
  26.599 +        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
  26.600 +        border-top-right-radius: 4px;
  26.601 +        /* firefox specific markup */
  26.602 +        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
  26.603 +        -moz-border-radius-topright: 4px;
  26.604 +        /* webkit specific markup */
  26.605 +        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
  26.606 +        -webkit-border-top-right-radius: 4px;
  26.607 +
  26.608 +}
  26.609 +
  26.610 +.overload {
  26.611 +        font-family: "courier new",courier,monospace;
  26.612 +	font-size: 65%;
  26.613 +}
  26.614 +
  26.615 +.memdoc, dl.reflist dd {
  26.616 +        border-bottom: 1px solid #A8B8D9;      
  26.617 +        border-left: 1px solid #A8B8D9;      
  26.618 +        border-right: 1px solid #A8B8D9; 
  26.619 +        padding: 6px 10px 2px 10px;
  26.620 +        background-color: #FBFCFD;
  26.621 +        border-top-width: 0;
  26.622 +        background-image:url('nav_g.png');
  26.623 +        background-repeat:repeat-x;
  26.624 +        background-color: #FFFFFF;
  26.625 +        /* opera specific markup */
  26.626 +        border-bottom-left-radius: 4px;
  26.627 +        border-bottom-right-radius: 4px;
  26.628 +        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
  26.629 +        /* firefox specific markup */
  26.630 +        -moz-border-radius-bottomleft: 4px;
  26.631 +        -moz-border-radius-bottomright: 4px;
  26.632 +        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
  26.633 +        /* webkit specific markup */
  26.634 +        -webkit-border-bottom-left-radius: 4px;
  26.635 +        -webkit-border-bottom-right-radius: 4px;
  26.636 +        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
  26.637 +}
  26.638 +
  26.639 +dl.reflist dt {
  26.640 +        padding: 5px;
  26.641 +}
  26.642 +
  26.643 +dl.reflist dd {
  26.644 +        margin: 0px 0px 10px 0px;
  26.645 +        padding: 5px;
  26.646 +}
  26.647 +
  26.648 +.paramkey {
  26.649 +	text-align: right;
  26.650 +}
  26.651 +
  26.652 +.paramtype {
  26.653 +	white-space: nowrap;
  26.654 +}
  26.655 +
  26.656 +.paramname {
  26.657 +	color: #602020;
  26.658 +	white-space: nowrap;
  26.659 +}
  26.660 +.paramname em {
  26.661 +	font-style: normal;
  26.662 +}
  26.663 +.paramname code {
  26.664 +        line-height: 14px;
  26.665 +}
  26.666 +
  26.667 +.params, .retval, .exception, .tparams {
  26.668 +        margin-left: 0px;
  26.669 +        padding-left: 0px;
  26.670 +}       
  26.671 +
  26.672 +.params .paramname, .retval .paramname {
  26.673 +        font-weight: bold;
  26.674 +        vertical-align: top;
  26.675 +}
  26.676 +        
  26.677 +.params .paramtype {
  26.678 +        font-style: italic;
  26.679 +        vertical-align: top;
  26.680 +}       
  26.681 +        
  26.682 +.params .paramdir {
  26.683 +        font-family: "courier new",courier,monospace;
  26.684 +        vertical-align: top;
  26.685 +}
  26.686 +
  26.687 +table.mlabels {
  26.688 +	border-spacing: 0px;
  26.689 +}
  26.690 +
  26.691 +td.mlabels-left {
  26.692 +	width: 100%;
  26.693 +	padding: 0px;
  26.694 +}
  26.695 +
  26.696 +td.mlabels-right {
  26.697 +	vertical-align: bottom;
  26.698 +	padding: 0px;
  26.699 +	white-space: nowrap;
  26.700 +}
  26.701 +
  26.702 +span.mlabels {
  26.703 +        margin-left: 8px;
  26.704 +}
  26.705 +
  26.706 +span.mlabel {
  26.707 +        background-color: #728DC1;
  26.708 +        border-top:1px solid #5373B4;
  26.709 +        border-left:1px solid #5373B4;
  26.710 +        border-right:1px solid #C4CFE5;
  26.711 +        border-bottom:1px solid #C4CFE5;
  26.712 +	text-shadow: none;
  26.713 +	color: white;
  26.714 +	margin-right: 4px;
  26.715 +	padding: 2px 3px;
  26.716 +	border-radius: 3px;
  26.717 +	font-size: 7pt;
  26.718 +	white-space: nowrap;
  26.719 +	vertical-align: middle;
  26.720 +}
  26.721 +
  26.722 +
  26.723 +
  26.724 +/* @end */
  26.725 +
  26.726 +/* these are for tree view inside a (index) page */
  26.727 +
  26.728 +div.directory {
  26.729 +        margin: 10px 0px;
  26.730 +        border-top: 1px solid #9CAFD4;
  26.731 +        border-bottom: 1px solid #9CAFD4;
  26.732 +        width: 100%;
  26.733 +}
  26.734 +
  26.735 +.directory table {
  26.736 +        border-collapse:collapse;
  26.737 +}
  26.738 +
  26.739 +.directory td {
  26.740 +        margin: 0px;
  26.741 +        padding: 0px;
  26.742 +	vertical-align: top;
  26.743 +}
  26.744 +
  26.745 +.directory td.entry {
  26.746 +        white-space: nowrap;
  26.747 +        padding-right: 6px;
  26.748 +	padding-top: 3px;
  26.749 +}
  26.750 +
  26.751 +.directory td.entry a {
  26.752 +        outline:none;
  26.753 +}
  26.754 +
  26.755 +.directory td.entry a img {
  26.756 +        border: none;
  26.757 +}
  26.758 +
  26.759 +.directory td.desc {
  26.760 +        width: 100%;
  26.761 +        padding-left: 6px;
  26.762 +	padding-right: 6px;
  26.763 +	padding-top: 3px;
  26.764 +	border-left: 1px solid rgba(0,0,0,0.05);
  26.765 +}
  26.766 +
  26.767 +.directory tr.even {
  26.768 +	padding-left: 6px;
  26.769 +	background-color: #F7F8FB;
  26.770 +}
  26.771 +
  26.772 +.directory img {
  26.773 +	vertical-align: -30%;
  26.774 +}
  26.775 +
  26.776 +.directory .levels {
  26.777 +        white-space: nowrap;
  26.778 +        width: 100%;
  26.779 +        text-align: right;
  26.780 +        font-size: 9pt;
  26.781 +}
  26.782 +
  26.783 +.directory .levels span {
  26.784 +        cursor: pointer;
  26.785 +        padding-left: 2px;
  26.786 +        padding-right: 2px;
  26.787 +	color: #3D578C;
  26.788 +}
  26.789 +
  26.790 +.arrow {
  26.791 +    color: #9CAFD4;
  26.792 +    -webkit-user-select: none;
  26.793 +    -khtml-user-select: none;
  26.794 +    -moz-user-select: none;
  26.795 +    -ms-user-select: none;
  26.796 +    user-select: none;
  26.797 +    cursor: pointer;
  26.798 +    font-size: 80%;
  26.799 +    display: inline-block;
  26.800 +    width: 16px;
  26.801 +    height: 22px;
  26.802 +}
  26.803 +
  26.804 +.icon {
  26.805 +    font-family: Arial, Helvetica;
  26.806 +    font-weight: bold;
  26.807 +    font-size: 12px;
  26.808 +    height: 14px;
  26.809 +    width: 16px;
  26.810 +    display: inline-block;
  26.811 +    background-color: #728DC1;
  26.812 +    color: white;
  26.813 +    text-align: center;
  26.814 +    border-radius: 4px;
  26.815 +    margin-left: 2px;
  26.816 +    margin-right: 2px;
  26.817 +}
  26.818 +
  26.819 +.icona {
  26.820 +    width: 24px;
  26.821 +    height: 22px;
  26.822 +    display: inline-block;
  26.823 +}
  26.824 +
  26.825 +.iconfopen {
  26.826 +    width: 24px;
  26.827 +    height: 18px;
  26.828 +    margin-bottom: 4px;
  26.829 +    background-image:url('folderopen.png');
  26.830 +    background-position: 0px -4px;
  26.831 +    background-repeat: repeat-y;
  26.832 +    vertical-align:top;
  26.833 +    display: inline-block;
  26.834 +}
  26.835 +
  26.836 +.iconfclosed {
  26.837 +    width: 24px;
  26.838 +    height: 18px;
  26.839 +    margin-bottom: 4px;
  26.840 +    background-image:url('folderclosed.png');
  26.841 +    background-position: 0px -4px;
  26.842 +    background-repeat: repeat-y;
  26.843 +    vertical-align:top;
  26.844 +    display: inline-block;
  26.845 +}
  26.846 +
  26.847 +.icondoc {
  26.848 +    width: 24px;
  26.849 +    height: 18px;
  26.850 +    margin-bottom: 4px;
  26.851 +    background-image:url('doc.png');
  26.852 +    background-position: 0px -4px;
  26.853 +    background-repeat: repeat-y;
  26.854 +    vertical-align:top;
  26.855 +    display: inline-block;
  26.856 +}
  26.857 +
  26.858 +table.directory {
  26.859 +    font: 400 14px Roboto,sans-serif;
  26.860 +}
  26.861 +
  26.862 +/* @end */
  26.863 +
  26.864 +div.dynheader {
  26.865 +        margin-top: 8px;
  26.866 +	-webkit-touch-callout: none;
  26.867 +	-webkit-user-select: none;
  26.868 +	-khtml-user-select: none;
  26.869 +	-moz-user-select: none;
  26.870 +	-ms-user-select: none;
  26.871 +	user-select: none;
  26.872 +}
  26.873 +
  26.874 +address {
  26.875 +	font-style: normal;
  26.876 +	color: #2A3D61;
  26.877 +}
  26.878 +
  26.879 +table.doxtable caption {
  26.880 +	caption-side: top;
  26.881 +}
  26.882 +
  26.883 +table.doxtable {
  26.884 +	border-collapse:collapse;
  26.885 +        margin-top: 4px;
  26.886 +        margin-bottom: 4px;
  26.887 +}
  26.888 +
  26.889 +table.doxtable td, table.doxtable th {
  26.890 +	border: 1px solid #2D4068;
  26.891 +	padding: 3px 7px 2px;
  26.892 +}
  26.893 +
  26.894 +table.doxtable th {
  26.895 +	background-color: #374F7F;
  26.896 +	color: #FFFFFF;
  26.897 +	font-size: 110%;
  26.898 +	padding-bottom: 4px;
  26.899 +	padding-top: 5px;
  26.900 +}
  26.901 +
  26.902 +table.fieldtable {
  26.903 +        /*width: 100%;*/
  26.904 +        margin-bottom: 10px;
  26.905 +        border: 1px solid #A8B8D9;
  26.906 +        border-spacing: 0px;
  26.907 +        -moz-border-radius: 4px;
  26.908 +        -webkit-border-radius: 4px;
  26.909 +        border-radius: 4px;
  26.910 +        -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
  26.911 +        -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
  26.912 +        box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
  26.913 +}
  26.914 +
  26.915 +.fieldtable td, .fieldtable th {
  26.916 +        padding: 3px 7px 2px;
  26.917 +}
  26.918 +
  26.919 +.fieldtable td.fieldtype, .fieldtable td.fieldname {
  26.920 +        white-space: nowrap;
  26.921 +        border-right: 1px solid #A8B8D9;
  26.922 +        border-bottom: 1px solid #A8B8D9;
  26.923 +        vertical-align: top;
  26.924 +}
  26.925 +
  26.926 +.fieldtable td.fieldname {
  26.927 +        padding-top: 3px;
  26.928 +}
  26.929 +
  26.930 +.fieldtable td.fielddoc {
  26.931 +        border-bottom: 1px solid #A8B8D9;
  26.932 +        /*width: 100%;*/
  26.933 +}
  26.934 +
  26.935 +.fieldtable td.fielddoc p:first-child {
  26.936 +        margin-top: 0px;
  26.937 +}       
  26.938 +        
  26.939 +.fieldtable td.fielddoc p:last-child {
  26.940 +        margin-bottom: 2px;
  26.941 +}
  26.942 +
  26.943 +.fieldtable tr:last-child td {
  26.944 +        border-bottom: none;
  26.945 +}
  26.946 +
  26.947 +.fieldtable th {
  26.948 +        background-image:url('nav_f.png');
  26.949 +        background-repeat:repeat-x;
  26.950 +        background-color: #E2E8F2;
  26.951 +        font-size: 90%;
  26.952 +        color: #253555;
  26.953 +        padding-bottom: 4px;
  26.954 +        padding-top: 5px;
  26.955 +        text-align:left;
  26.956 +        font-weight: 400;
  26.957 +        -moz-border-radius-topleft: 4px;
  26.958 +        -moz-border-radius-topright: 4px;
  26.959 +        -webkit-border-top-left-radius: 4px;
  26.960 +        -webkit-border-top-right-radius: 4px;
  26.961 +        border-top-left-radius: 4px;
  26.962 +        border-top-right-radius: 4px;
  26.963 +        border-bottom: 1px solid #A8B8D9;
  26.964 +}
  26.965 +
  26.966 +
  26.967 +.tabsearch {
  26.968 +	top: 0px;
  26.969 +	left: 10px;
  26.970 +	height: 36px;
  26.971 +	background-image: url('tab_b.png');
  26.972 +	z-index: 101;
  26.973 +	overflow: hidden;
  26.974 +	font-size: 13px;
  26.975 +}
  26.976 +
  26.977 +.navpath ul
  26.978 +{
  26.979 +	font-size: 11px;
  26.980 +	background-image:url('tab_b.png');
  26.981 +	background-repeat:repeat-x;
  26.982 +	background-position: 0 -5px;
  26.983 +	height:30px;
  26.984 +	line-height:30px;
  26.985 +	color:#8AA0CC;
  26.986 +	border:solid 1px #C2CDE4;
  26.987 +	overflow:hidden;
  26.988 +	margin:0px;
  26.989 +	padding:0px;
  26.990 +}
  26.991 +
  26.992 +.navpath li
  26.993 +{
  26.994 +	list-style-type:none;
  26.995 +	float:left;
  26.996 +	padding-left:10px;
  26.997 +	padding-right:15px;
  26.998 +	background-image:url('bc_s.png');
  26.999 +	background-repeat:no-repeat;
 26.1000 +	background-position:right;
 26.1001 +	color:#364D7C;
 26.1002 +}
 26.1003 +
 26.1004 +.navpath li.navelem a
 26.1005 +{
 26.1006 +	height:32px;
 26.1007 +	display:block;
 26.1008 +	text-decoration: none;
 26.1009 +	outline: none;
 26.1010 +	color: #283A5D;
 26.1011 +	font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
 26.1012 +	text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
 26.1013 +	text-decoration: none;        
 26.1014 +}
 26.1015 +
 26.1016 +.navpath li.navelem a:hover
 26.1017 +{
 26.1018 +	color:#6884BD;
 26.1019 +}
 26.1020 +
 26.1021 +.navpath li.footer
 26.1022 +{
 26.1023 +        list-style-type:none;
 26.1024 +        float:right;
 26.1025 +        padding-left:10px;
 26.1026 +        padding-right:15px;
 26.1027 +        background-image:none;
 26.1028 +        background-repeat:no-repeat;
 26.1029 +        background-position:right;
 26.1030 +        color:#364D7C;
 26.1031 +        font-size: 8pt;
 26.1032 +}
 26.1033 +
 26.1034 +
 26.1035 +div.summary
 26.1036 +{
 26.1037 +	float: right;
 26.1038 +	font-size: 8pt;
 26.1039 +	padding-right: 5px;
 26.1040 +	width: 50%;
 26.1041 +	text-align: right;
 26.1042 +}       
 26.1043 +
 26.1044 +div.summary a
 26.1045 +{
 26.1046 +	white-space: nowrap;
 26.1047 +}
 26.1048 +
 26.1049 +table.classindex
 26.1050 +{
 26.1051 +        margin: 10px;
 26.1052 +        white-space: nowrap;
 26.1053 +        margin-left: 3%;
 26.1054 +        margin-right: 3%;
 26.1055 +        width: 94%;
 26.1056 +        border: 0;
 26.1057 +        border-spacing: 0; 
 26.1058 +        padding: 0;
 26.1059 +}
 26.1060 +
 26.1061 +div.ingroups
 26.1062 +{
 26.1063 +	font-size: 8pt;
 26.1064 +	width: 50%;
 26.1065 +	text-align: left;
 26.1066 +}
 26.1067 +
 26.1068 +div.ingroups a
 26.1069 +{
 26.1070 +	white-space: nowrap;
 26.1071 +}
 26.1072 +
 26.1073 +div.header
 26.1074 +{
 26.1075 +        background-image:url('nav_h.png');
 26.1076 +        background-repeat:repeat-x;
 26.1077 +	background-color: #F9FAFC;
 26.1078 +	margin:  0px;
 26.1079 +	border-bottom: 1px solid #C4CFE5;
 26.1080 +}
 26.1081 +
 26.1082 +div.headertitle
 26.1083 +{
 26.1084 +	padding: 5px 5px 5px 10px;
 26.1085 +}
 26.1086 +
 26.1087 +dl
 26.1088 +{
 26.1089 +        padding: 0 0 0 10px;
 26.1090 +}
 26.1091 +
 26.1092 +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */
 26.1093 +dl.section
 26.1094 +{
 26.1095 +	margin-left: 0px;
 26.1096 +	padding-left: 0px;
 26.1097 +}
 26.1098 +
 26.1099 +dl.note
 26.1100 +{
 26.1101 +        margin-left:-7px;
 26.1102 +        padding-left: 3px;
 26.1103 +        border-left:4px solid;
 26.1104 +        border-color: #D0C000;
 26.1105 +}
 26.1106 +
 26.1107 +dl.warning, dl.attention
 26.1108 +{
 26.1109 +        margin-left:-7px;
 26.1110 +        padding-left: 3px;
 26.1111 +        border-left:4px solid;
 26.1112 +        border-color: #FF0000;
 26.1113 +}
 26.1114 +
 26.1115 +dl.pre, dl.post, dl.invariant
 26.1116 +{
 26.1117 +        margin-left:-7px;
 26.1118 +        padding-left: 3px;
 26.1119 +        border-left:4px solid;
 26.1120 +        border-color: #00D000;
 26.1121 +}
 26.1122 +
 26.1123 +dl.deprecated
 26.1124 +{
 26.1125 +        margin-left:-7px;
 26.1126 +        padding-left: 3px;
 26.1127 +        border-left:4px solid;
 26.1128 +        border-color: #505050;
 26.1129 +}
 26.1130 +
 26.1131 +dl.todo
 26.1132 +{
 26.1133 +        margin-left:-7px;
 26.1134 +        padding-left: 3px;
 26.1135 +        border-left:4px solid;
 26.1136 +        border-color: #00C0E0;
 26.1137 +}
 26.1138 +
 26.1139 +dl.test
 26.1140 +{
 26.1141 +        margin-left:-7px;
 26.1142 +        padding-left: 3px;
 26.1143 +        border-left:4px solid;
 26.1144 +        border-color: #3030E0;
 26.1145 +}
 26.1146 +
 26.1147 +dl.bug
 26.1148 +{
 26.1149 +        margin-left:-7px;
 26.1150 +        padding-left: 3px;
 26.1151 +        border-left:4px solid;
 26.1152 +        border-color: #C08050;
 26.1153 +}
 26.1154 +
 26.1155 +dl.section dd {
 26.1156 +	margin-bottom: 6px;
 26.1157 +}
 26.1158 +
 26.1159 +
 26.1160 +#projectlogo
 26.1161 +{
 26.1162 +	text-align: center;
 26.1163 +	vertical-align: bottom;
 26.1164 +	border-collapse: separate;
 26.1165 +}
 26.1166 + 
 26.1167 +#projectlogo img
 26.1168 +{ 
 26.1169 +	border: 0px none;
 26.1170 +}
 26.1171 + 
 26.1172 +#projectalign
 26.1173 +{
 26.1174 +        vertical-align: middle;
 26.1175 +}
 26.1176 +
 26.1177 +#projectname
 26.1178 +{
 26.1179 +	font: 300% Tahoma, Arial,sans-serif;
 26.1180 +	margin: 0px;
 26.1181 +	padding: 2px 0px;
 26.1182 +}
 26.1183 +    
 26.1184 +#projectbrief
 26.1185 +{
 26.1186 +	font: 120% Tahoma, Arial,sans-serif;
 26.1187 +	margin: 0px;
 26.1188 +	padding: 0px;
 26.1189 +}
 26.1190 +
 26.1191 +#projectnumber
 26.1192 +{
 26.1193 +	font: 50% Tahoma, Arial,sans-serif;
 26.1194 +	margin: 0px;
 26.1195 +	padding: 0px;
 26.1196 +}
 26.1197 +
 26.1198 +#titlearea
 26.1199 +{
 26.1200 +	padding: 0px;
 26.1201 +	margin: 0px;
 26.1202 +	width: 100%;
 26.1203 +	border-bottom: 1px solid #5373B4;
 26.1204 +}
 26.1205 +
 26.1206 +.image
 26.1207 +{
 26.1208 +        text-align: center;
 26.1209 +}
 26.1210 +
 26.1211 +.dotgraph
 26.1212 +{
 26.1213 +        text-align: center;
 26.1214 +}
 26.1215 +
 26.1216 +.mscgraph
 26.1217 +{
 26.1218 +        text-align: center;
 26.1219 +}
 26.1220 +
 26.1221 +.plantumlgraph
 26.1222 +{
 26.1223 +        text-align: center;
 26.1224 +}
 26.1225 +
 26.1226 +.diagraph
 26.1227 +{
 26.1228 +        text-align: center;
 26.1229 +}
 26.1230 +
 26.1231 +.caption
 26.1232 +{
 26.1233 +	font-weight: bold;
 26.1234 +}
 26.1235 +
 26.1236 +div.zoom
 26.1237 +{
 26.1238 +	border: 1px solid #90A5CE;
 26.1239 +}
 26.1240 +
 26.1241 +dl.citelist {
 26.1242 +        margin-bottom:50px;
 26.1243 +}
 26.1244 +
 26.1245 +dl.citelist dt {
 26.1246 +        color:#334975;
 26.1247 +        float:left;
 26.1248 +        font-weight:bold;
 26.1249 +        margin-right:10px;
 26.1250 +        padding:5px;
 26.1251 +}
 26.1252 +
 26.1253 +dl.citelist dd {
 26.1254 +        margin:2px 0;
 26.1255 +        padding:5px 0;
 26.1256 +}
 26.1257 +
 26.1258 +div.toc {
 26.1259 +        padding: 14px 25px;
 26.1260 +        background-color: #F4F6FA;
 26.1261 +        border: 1px solid #D8DFEE;
 26.1262 +        border-radius: 7px 7px 7px 7px;
 26.1263 +        float: right;
 26.1264 +        height: auto;
 26.1265 +        margin: 0 8px 10px 10px;
 26.1266 +        width: 200px;
 26.1267 +}
 26.1268 +
 26.1269 +div.toc li {
 26.1270 +        background: url("bdwn.png") no-repeat scroll 0 5px transparent;
 26.1271 +        font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
 26.1272 +        margin-top: 5px;
 26.1273 +        padding-left: 10px;
 26.1274 +        padding-top: 2px;
 26.1275 +}
 26.1276 +
 26.1277 +div.toc h3 {
 26.1278 +        font: bold 12px/1.2 Arial,FreeSans,sans-serif;
 26.1279 +	color: #4665A2;
 26.1280 +        border-bottom: 0 none;
 26.1281 +        margin: 0;
 26.1282 +}
 26.1283 +
 26.1284 +div.toc ul {
 26.1285 +        list-style: none outside none;
 26.1286 +        border: medium none;
 26.1287 +        padding: 0px;
 26.1288 +}       
 26.1289 +
 26.1290 +div.toc li.level1 {
 26.1291 +        margin-left: 0px;
 26.1292 +}
 26.1293 +
 26.1294 +div.toc li.level2 {
 26.1295 +        margin-left: 15px;
 26.1296 +}
 26.1297 +
 26.1298 +div.toc li.level3 {
 26.1299 +        margin-left: 30px;
 26.1300 +}
 26.1301 +
 26.1302 +div.toc li.level4 {
 26.1303 +        margin-left: 45px;
 26.1304 +}
 26.1305 +
 26.1306 +.inherit_header {
 26.1307 +        font-weight: bold;
 26.1308 +        color: gray;
 26.1309 +        cursor: pointer;
 26.1310 +	-webkit-touch-callout: none;
 26.1311 +	-webkit-user-select: none;
 26.1312 +	-khtml-user-select: none;
 26.1313 +	-moz-user-select: none;
 26.1314 +	-ms-user-select: none;
 26.1315 +	user-select: none;
 26.1316 +}
 26.1317 +
 26.1318 +.inherit_header td {
 26.1319 +        padding: 6px 0px 2px 5px;
 26.1320 +}
 26.1321 +
 26.1322 +.inherit {
 26.1323 +        display: none;
 26.1324 +}
 26.1325 +
 26.1326 +tr.heading h2 {
 26.1327 +        margin-top: 12px;
 26.1328 +        margin-bottom: 4px;
 26.1329 +}
 26.1330 +
 26.1331 +/* tooltip related style info */
 26.1332 +
 26.1333 +.ttc {
 26.1334 +        position: absolute;
 26.1335 +        display: none;
 26.1336 +}
 26.1337 +
 26.1338 +#powerTip {
 26.1339 +	cursor: default;
 26.1340 +	white-space: nowrap;
 26.1341 +	background-color: white;
 26.1342 +	border: 1px solid gray;
 26.1343 +	border-radius: 4px 4px 4px 4px;
 26.1344 +	box-shadow: 1px 1px 7px gray;
 26.1345 +	display: none;
 26.1346 +	font-size: smaller;
 26.1347 +	max-width: 80%;
 26.1348 +	opacity: 0.9;
 26.1349 +	padding: 1ex 1em 1em;
 26.1350 +	position: absolute;
 26.1351 +	z-index: 2147483647;
 26.1352 +}
 26.1353 +
 26.1354 +#powerTip div.ttdoc {
 26.1355 +        color: grey;
 26.1356 +	font-style: italic;
 26.1357 +}
 26.1358 +
 26.1359 +#powerTip div.ttname a {
 26.1360 +        font-weight: bold;
 26.1361 +}
 26.1362 +
 26.1363 +#powerTip div.ttname {
 26.1364 +        font-weight: bold;
 26.1365 +}
 26.1366 +
 26.1367 +#powerTip div.ttdeci {
 26.1368 +        color: #006318;
 26.1369 +}
 26.1370 +
 26.1371 +#powerTip div {
 26.1372 +        margin: 0px;
 26.1373 +        padding: 0px;
 26.1374 +        font: 12px/16px Roboto,sans-serif;
 26.1375 +}
 26.1376 +
 26.1377 +#powerTip:before, #powerTip:after {
 26.1378 +	content: "";
 26.1379 +	position: absolute;
 26.1380 +	margin: 0px;
 26.1381 +}
 26.1382 +
 26.1383 +#powerTip.n:after,  #powerTip.n:before,
 26.1384 +#powerTip.s:after,  #powerTip.s:before,
 26.1385 +#powerTip.w:after,  #powerTip.w:before,
 26.1386 +#powerTip.e:after,  #powerTip.e:before,
 26.1387 +#powerTip.ne:after, #powerTip.ne:before,
 26.1388 +#powerTip.se:after, #powerTip.se:before,
 26.1389 +#powerTip.nw:after, #powerTip.nw:before,
 26.1390 +#powerTip.sw:after, #powerTip.sw:before {
 26.1391 +	border: solid transparent;
 26.1392 +	content: " ";
 26.1393 +	height: 0;
 26.1394 +	width: 0;
 26.1395 +	position: absolute;
 26.1396 +}
 26.1397 +
 26.1398 +#powerTip.n:after,  #powerTip.s:after,
 26.1399 +#powerTip.w:after,  #powerTip.e:after,
 26.1400 +#powerTip.nw:after, #powerTip.ne:after,
 26.1401 +#powerTip.sw:after, #powerTip.se:after {
 26.1402 +	border-color: rgba(255, 255, 255, 0);
 26.1403 +}
 26.1404 +
 26.1405 +#powerTip.n:before,  #powerTip.s:before,
 26.1406 +#powerTip.w:before,  #powerTip.e:before,
 26.1407 +#powerTip.nw:before, #powerTip.ne:before,
 26.1408 +#powerTip.sw:before, #powerTip.se:before {
 26.1409 +	border-color: rgba(128, 128, 128, 0);
 26.1410 +}
 26.1411 +
 26.1412 +#powerTip.n:after,  #powerTip.n:before,
 26.1413 +#powerTip.ne:after, #powerTip.ne:before,
 26.1414 +#powerTip.nw:after, #powerTip.nw:before {
 26.1415 +	top: 100%;
 26.1416 +}
 26.1417 +
 26.1418 +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {
 26.1419 +	border-top-color: #ffffff;
 26.1420 +	border-width: 10px;
 26.1421 +	margin: 0px -10px;
 26.1422 +}
 26.1423 +#powerTip.n:before {
 26.1424 +	border-top-color: #808080;
 26.1425 +	border-width: 11px;
 26.1426 +	margin: 0px -11px;
 26.1427 +}
 26.1428 +#powerTip.n:after, #powerTip.n:before {
 26.1429 +	left: 50%;
 26.1430 +}
 26.1431 +
 26.1432 +#powerTip.nw:after, #powerTip.nw:before {
 26.1433 +	right: 14px;
 26.1434 +}
 26.1435 +
 26.1436 +#powerTip.ne:after, #powerTip.ne:before {
 26.1437 +	left: 14px;
 26.1438 +}
 26.1439 +
 26.1440 +#powerTip.s:after,  #powerTip.s:before,
 26.1441 +#powerTip.se:after, #powerTip.se:before,
 26.1442 +#powerTip.sw:after, #powerTip.sw:before {
 26.1443 +	bottom: 100%;
 26.1444 +}
 26.1445 +
 26.1446 +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {
 26.1447 +	border-bottom-color: #ffffff;
 26.1448 +	border-width: 10px;
 26.1449 +	margin: 0px -10px;
 26.1450 +}
 26.1451 +
 26.1452 +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {
 26.1453 +	border-bottom-color: #808080;
 26.1454 +	border-width: 11px;
 26.1455 +	margin: 0px -11px;
 26.1456 +}
 26.1457 +
 26.1458 +#powerTip.s:after, #powerTip.s:before {
 26.1459 +	left: 50%;
 26.1460 +}
 26.1461 +
 26.1462 +#powerTip.sw:after, #powerTip.sw:before {
 26.1463 +	right: 14px;
 26.1464 +}
 26.1465 +
 26.1466 +#powerTip.se:after, #powerTip.se:before {
 26.1467 +	left: 14px;
 26.1468 +}
 26.1469 +
 26.1470 +#powerTip.e:after, #powerTip.e:before {
 26.1471 +	left: 100%;
 26.1472 +}
 26.1473 +#powerTip.e:after {
 26.1474 +	border-left-color: #ffffff;
 26.1475 +	border-width: 10px;
 26.1476 +	top: 50%;
 26.1477 +	margin-top: -10px;
 26.1478 +}
 26.1479 +#powerTip.e:before {
 26.1480 +	border-left-color: #808080;
 26.1481 +	border-width: 11px;
 26.1482 +	top: 50%;
 26.1483 +	margin-top: -11px;
 26.1484 +}
 26.1485 +
 26.1486 +#powerTip.w:after, #powerTip.w:before {
 26.1487 +	right: 100%;
 26.1488 +}
 26.1489 +#powerTip.w:after {
 26.1490 +	border-right-color: #ffffff;
 26.1491 +	border-width: 10px;
 26.1492 +	top: 50%;
 26.1493 +	margin-top: -10px;
 26.1494 +}
 26.1495 +#powerTip.w:before {
 26.1496 +	border-right-color: #808080;
 26.1497 +	border-width: 11px;
 26.1498 +	top: 50%;
 26.1499 +	margin-top: -11px;
 26.1500 +}
 26.1501 +
 26.1502 +@media print
 26.1503 +{
 26.1504 +  #top { display: none; }
 26.1505 +  #side-nav { display: none; }
 26.1506 +  #nav-path { display: none; }
 26.1507 +  body { overflow:visible; }
 26.1508 +  h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
 26.1509 +  .summary { display: none; }
 26.1510 +  .memitem { page-break-inside: avoid; }
 26.1511 +  #doc-content
 26.1512 +  {
 26.1513 +    margin-left:0 !important;
 26.1514 +    height:auto !important;
 26.1515 +    width:auto !important;
 26.1516 +    overflow:inherit;
 26.1517 +    display:inline;
 26.1518 +  }
 26.1519 +}
 26.1520 +
 26.1521 +/* @group Markdown */
 26.1522 +
 26.1523 +/*
 26.1524 +table.markdownTable {
 26.1525 +	border-collapse:collapse;
 26.1526 +        margin-top: 4px;
 26.1527 +        margin-bottom: 4px;
 26.1528 +}
 26.1529 +
 26.1530 +table.markdownTable td, table.markdownTable th {
 26.1531 +	border: 1px solid #2D4068;
 26.1532 +	padding: 3px 7px 2px;
 26.1533 +}
 26.1534 +
 26.1535 +table.markdownTableHead tr {
 26.1536 +}
 26.1537 +
 26.1538 +table.markdownTableBodyLeft td, table.markdownTable th {
 26.1539 +	border: 1px solid #2D4068;
 26.1540 +	padding: 3px 7px 2px;
 26.1541 +}
 26.1542 +
 26.1543 +th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone {
 26.1544 +	background-color: #374F7F;
 26.1545 +	color: #FFFFFF;
 26.1546 +	font-size: 110%;
 26.1547 +	padding-bottom: 4px;
 26.1548 +	padding-top: 5px;
 26.1549 +}
 26.1550 +
 26.1551 +th.markdownTableHeadLeft {
 26.1552 +	text-align: left
 26.1553 +}
 26.1554 +
 26.1555 +th.markdownTableHeadRight {
 26.1556 +	text-align: right
 26.1557 +}
 26.1558 +
 26.1559 +th.markdownTableHeadCenter {
 26.1560 +	text-align: center
 26.1561 +}
 26.1562 +*/
 26.1563 +
 26.1564 +table.markdownTable {
 26.1565 +	border-collapse:collapse;
 26.1566 +        margin-top: 4px;
 26.1567 +        margin-bottom: 4px;
 26.1568 +}
 26.1569 +
 26.1570 +table.markdownTable td, table.markdownTable th {
 26.1571 +	border: 1px solid #2D4068;
 26.1572 +	padding: 3px 7px 2px;
 26.1573 +}
 26.1574 +
 26.1575 +table.markdownTable tr {
 26.1576 +}
 26.1577 +
 26.1578 +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone {
 26.1579 +	background-color: #374F7F;
 26.1580 +	color: #FFFFFF;
 26.1581 +	font-size: 110%;
 26.1582 +	padding-bottom: 4px;
 26.1583 +	padding-top: 5px;
 26.1584 +}
 26.1585 +
 26.1586 +th.markdownTableHeadLeft, td.markdownTableBodyLeft {
 26.1587 +	text-align: left
 26.1588 +}
 26.1589 +
 26.1590 +th.markdownTableHeadRight, td.markdownTableBodyRight {
 26.1591 +	text-align: right
 26.1592 +}
 26.1593 +
 26.1594 +th.markdownTableHeadCenter, td.markdownTableBodyCenter {
 26.1595 +	text-align: center
 26.1596 +}
 26.1597 +
 26.1598 +
 26.1599 +/* @end */
    27.1 Binary file docs/api-2.1/doxygen.png has changed
    28.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    28.2 +++ b/docs/api-2.1/dynsections.js	Sat Feb 06 19:11:44 2021 +0100
    28.3 @@ -0,0 +1,97 @@
    28.4 +function toggleVisibility(linkObj)
    28.5 +{
    28.6 + var base = $(linkObj).attr('id');
    28.7 + var summary = $('#'+base+'-summary');
    28.8 + var content = $('#'+base+'-content');
    28.9 + var trigger = $('#'+base+'-trigger');
   28.10 + var src=$(trigger).attr('src');
   28.11 + if (content.is(':visible')===true) {
   28.12 +   content.hide();
   28.13 +   summary.show();
   28.14 +   $(linkObj).addClass('closed').removeClass('opened');
   28.15 +   $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
   28.16 + } else {
   28.17 +   content.show();
   28.18 +   summary.hide();
   28.19 +   $(linkObj).removeClass('closed').addClass('opened');
   28.20 +   $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
   28.21 + } 
   28.22 + return false;
   28.23 +}
   28.24 +
   28.25 +function updateStripes()
   28.26 +{
   28.27 +  $('table.directory tr').
   28.28 +       removeClass('even').filter(':visible:even').addClass('even');
   28.29 +}
   28.30 +
   28.31 +function toggleLevel(level)
   28.32 +{
   28.33 +  $('table.directory tr').each(function() {
   28.34 +    var l = this.id.split('_').length-1;
   28.35 +    var i = $('#img'+this.id.substring(3));
   28.36 +    var a = $('#arr'+this.id.substring(3));
   28.37 +    if (l<level+1) {
   28.38 +      i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
   28.39 +      a.html('&#9660;');
   28.40 +      $(this).show();
   28.41 +    } else if (l==level+1) {
   28.42 +      i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
   28.43 +      a.html('&#9658;');
   28.44 +      $(this).show();
   28.45 +    } else {
   28.46 +      $(this).hide();
   28.47 +    }
   28.48 +  });
   28.49 +  updateStripes();
   28.50 +}
   28.51 +
   28.52 +function toggleFolder(id)
   28.53 +{
   28.54 +  // the clicked row
   28.55 +  var currentRow = $('#row_'+id);
   28.56 +
   28.57 +  // all rows after the clicked row
   28.58 +  var rows = currentRow.nextAll("tr");
   28.59 +
   28.60 +  var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
   28.61 +
   28.62 +  // only match elements AFTER this one (can't hide elements before)
   28.63 +  var childRows = rows.filter(function() { return this.id.match(re); });
   28.64 +
   28.65 +  // first row is visible we are HIDING
   28.66 +  if (childRows.filter(':first').is(':visible')===true) {
   28.67 +    // replace down arrow by right arrow for current row
   28.68 +    var currentRowSpans = currentRow.find("span");
   28.69 +    currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
   28.70 +    currentRowSpans.filter(".arrow").html('&#9658;');
   28.71 +    rows.filter("[id^=row_"+id+"]").hide(); // hide all children
   28.72 +  } else { // we are SHOWING
   28.73 +    // replace right arrow by down arrow for current row
   28.74 +    var currentRowSpans = currentRow.find("span");
   28.75 +    currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
   28.76 +    currentRowSpans.filter(".arrow").html('&#9660;');
   28.77 +    // replace down arrows by right arrows for child rows
   28.78 +    var childRowsSpans = childRows.find("span");
   28.79 +    childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
   28.80 +    childRowsSpans.filter(".arrow").html('&#9658;');
   28.81 +    childRows.show(); //show all children
   28.82 +  }
   28.83 +  updateStripes();
   28.84 +}
   28.85 +
   28.86 +
   28.87 +function toggleInherit(id)
   28.88 +{
   28.89 +  var rows = $('tr.inherit.'+id);
   28.90 +  var img = $('tr.inherit_header.'+id+' img');
   28.91 +  var src = $(img).attr('src');
   28.92 +  if (rows.filter(':first').is(':visible')===true) {
   28.93 +    rows.css('display','none');
   28.94 +    $(img).attr('src',src.substring(0,src.length-8)+'closed.png');
   28.95 +  } else {
   28.96 +    rows.css('display','table-row'); // using show() causes jump in firefox
   28.97 +    $(img).attr('src',src.substring(0,src.length-10)+'open.png');
   28.98 +  }
   28.99 +}
  28.100 +
    29.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    29.2 +++ b/docs/api-2.1/files.html	Sat Feb 06 19:11:44 2021 +0100
    29.3 @@ -0,0 +1,95 @@
    29.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    29.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    29.6 +<head>
    29.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    29.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    29.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   29.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   29.11 +<title>ucx: File List</title>
   29.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   29.13 +<script type="text/javascript" src="jquery.js"></script>
   29.14 +<script type="text/javascript" src="dynsections.js"></script>
   29.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   29.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   29.17 +<script type="text/javascript" src="search/search.js"></script>
   29.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   29.19 +</head>
   29.20 +<body>
   29.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   29.22 +<div id="titlearea">
   29.23 +<table cellspacing="0" cellpadding="0">
   29.24 + <tbody>
   29.25 + <tr style="height: 56px;">
   29.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   29.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   29.28 +   <div id="projectname">ucx
   29.29 +   </div>
   29.30 +   <div id="projectbrief">UAP Common Extensions</div>
   29.31 +  </td>
   29.32 + </tr>
   29.33 + </tbody>
   29.34 +</table>
   29.35 +</div>
   29.36 +<!-- end header part -->
   29.37 +<!-- Generated by Doxygen 1.8.13 -->
   29.38 +<script type="text/javascript">
   29.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   29.40 +</script>
   29.41 +<script type="text/javascript" src="menudata.js"></script>
   29.42 +<script type="text/javascript" src="menu.js"></script>
   29.43 +<script type="text/javascript">
   29.44 +$(function() {
   29.45 +  initMenu('',true,false,'search.php','Search');
   29.46 +  $(document).ready(function() { init_search(); });
   29.47 +});
   29.48 +</script>
   29.49 +<div id="main-nav"></div>
   29.50 +</div><!-- top -->
   29.51 +<!-- window showing the filter options -->
   29.52 +<div id="MSearchSelectWindow"
   29.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   29.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   29.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   29.56 +</div>
   29.57 +
   29.58 +<!-- iframe showing the search results (closed by default) -->
   29.59 +<div id="MSearchResultsWindow">
   29.60 +<iframe src="javascript:void(0)" frameborder="0" 
   29.61 +        name="MSearchResults" id="MSearchResults">
   29.62 +</iframe>
   29.63 +</div>
   29.64 +
   29.65 +<div class="header">
   29.66 +  <div class="headertitle">
   29.67 +<div class="title">File List</div>  </div>
   29.68 +</div><!--header-->
   29.69 +<div class="contents">
   29.70 +<div class="textblock">Here is a list of all documented files with brief descriptions:</div><div class="directory">
   29.71 +<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">
   29.72 +<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>
   29.73 +<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>
   29.74 +<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>
   29.75 +<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>
   29.76 +<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>
   29.77 +<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>
   29.78 +<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>
   29.79 +<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>
   29.80 +<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>
   29.81 +<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>
   29.82 +<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>
   29.83 +<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>
   29.84 +<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>
   29.85 +<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>
   29.86 +<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>
   29.87 +<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>
   29.88 +</table>
   29.89 +</div><!-- directory -->
   29.90 +</div><!-- contents -->
   29.91 +<!-- start footer part -->
   29.92 +<hr class="footer"/><address class="footer"><small>
   29.93 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
   29.94 +<img class="footer" src="doxygen.png" alt="doxygen"/>
   29.95 +</a> 1.8.13
   29.96 +</small></address>
   29.97 +</body>
   29.98 +</html>
    30.1 Binary file docs/api-2.1/folderclosed.png has changed
    31.1 Binary file docs/api-2.1/folderopen.png has changed
    32.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    32.2 +++ b/docs/api-2.1/functions.html	Sat Feb 06 19:11:44 2021 +0100
    32.3 @@ -0,0 +1,343 @@
    32.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    32.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    32.6 +<head>
    32.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    32.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    32.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   32.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   32.11 +<title>ucx: Data Fields</title>
   32.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   32.13 +<script type="text/javascript" src="jquery.js"></script>
   32.14 +<script type="text/javascript" src="dynsections.js"></script>
   32.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   32.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   32.17 +<script type="text/javascript" src="search/search.js"></script>
   32.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   32.19 +</head>
   32.20 +<body>
   32.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   32.22 +<div id="titlearea">
   32.23 +<table cellspacing="0" cellpadding="0">
   32.24 + <tbody>
   32.25 + <tr style="height: 56px;">
   32.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   32.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   32.28 +   <div id="projectname">ucx
   32.29 +   </div>
   32.30 +   <div id="projectbrief">UAP Common Extensions</div>
   32.31 +  </td>
   32.32 + </tr>
   32.33 + </tbody>
   32.34 +</table>
   32.35 +</div>
   32.36 +<!-- end header part -->
   32.37 +<!-- Generated by Doxygen 1.8.13 -->
   32.38 +<script type="text/javascript">
   32.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   32.40 +</script>
   32.41 +<script type="text/javascript" src="menudata.js"></script>
   32.42 +<script type="text/javascript" src="menu.js"></script>
   32.43 +<script type="text/javascript">
   32.44 +$(function() {
   32.45 +  initMenu('',true,false,'search.php','Search');
   32.46 +  $(document).ready(function() { init_search(); });
   32.47 +});
   32.48 +</script>
   32.49 +<div id="main-nav"></div>
   32.50 +</div><!-- top -->
   32.51 +<!-- window showing the filter options -->
   32.52 +<div id="MSearchSelectWindow"
   32.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   32.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   32.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   32.56 +</div>
   32.57 +
   32.58 +<!-- iframe showing the search results (closed by default) -->
   32.59 +<div id="MSearchResultsWindow">
   32.60 +<iframe src="javascript:void(0)" frameborder="0" 
   32.61 +        name="MSearchResults" id="MSearchResults">
   32.62 +</iframe>
   32.63 +</div>
   32.64 +
   32.65 +<div class="contents">
   32.66 +<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>
   32.67 +
   32.68 +<h3><a id="index_a"></a>- a -</h3><ul>
   32.69 +<li>allocator
   32.70 +: <a class="el" href="structUcxArray.html#a2ef31303b7548b9aa8e2b9187e295212">UcxArray</a>
   32.71 +, <a class="el" href="structUcxAVLTree.html#a30652776b540156ad54c7d52833e4e28">UcxAVLTree</a>
   32.72 +, <a class="el" href="structUcxMap.html#a531f3e481c1c331cf037b916192e974d">UcxMap</a>
   32.73 +, <a class="el" href="structUcxMempool.html#ac45fd1e9269399e4c434d6bdaa770d92">UcxMempool</a>
   32.74 +, <a class="el" href="structUcxStack.html#a33cda4f6890ac56ab31701598bc1ae10">UcxStack</a>
   32.75 +</li>
   32.76 +</ul>
   32.77 +
   32.78 +
   32.79 +<h3><a id="index_b"></a>- b -</h3><ul>
   32.80 +<li>buffer
   32.81 +: <a class="el" href="structUcxProperties.html#a6bb4d29686df41a0f42641ee15232bfd">UcxProperties</a>
   32.82 +</li>
   32.83 +<li>buflen
   32.84 +: <a class="el" href="structUcxProperties.html#a4e7524434525267e29f493a25dcca6b5">UcxProperties</a>
   32.85 +</li>
   32.86 +</ul>
   32.87 +
   32.88 +
   32.89 +<h3><a id="index_c"></a>- c -</h3><ul>
   32.90 +<li>c
   32.91 +: <a class="el" href="structucx__memchunk.html#ab86550503e5f019bfa61a1e91f1c40da">ucx_memchunk</a>
   32.92 +</li>
   32.93 +<li>calloc
   32.94 +: <a class="el" href="structUcxAllocator.html#ab94ec1cba45cc4e7d81e1588a11cbb62">UcxAllocator</a>
   32.95 +</li>
   32.96 +<li>capacity
   32.97 +: <a class="el" href="structUcxArray.html#a7ed074887908e45bde7e1fbc67b31c18">UcxArray</a>
   32.98 +, <a class="el" href="structUcxBuffer.html#a385661894f3cee9c549bfe07a8b316bf">UcxBuffer</a>
   32.99 +</li>
  32.100 +<li>cmpfunc
  32.101 +: <a class="el" href="structUcxAVLTree.html#a87aff25cb726cb9eb88eb815a10d1004">UcxAVLTree</a>
  32.102 +</li>
  32.103 +<li>comment1
  32.104 +: <a class="el" href="structUcxProperties.html#afaa2e6a289fa6949b7b01df35fa5def8">UcxProperties</a>
  32.105 +</li>
  32.106 +<li>comment2
  32.107 +: <a class="el" href="structUcxProperties.html#a9ea7ecb414ca8bc7bef62cdd19cc6363">UcxProperties</a>
  32.108 +</li>
  32.109 +<li>comment3
  32.110 +: <a class="el" href="structUcxProperties.html#a5f3e561e32bac03e36a191a6940cca92">UcxProperties</a>
  32.111 +</li>
  32.112 +<li>count
  32.113 +: <a class="el" href="structUcxMap.html#a14e9163f71f6c014dfa2103de70ae9cd">UcxMap</a>
  32.114 +</li>
  32.115 +<li>cur
  32.116 +: <a class="el" href="structUcxMapIterator.html#af1fc40f899f37280adb5b85acf6e742f">UcxMapIterator</a>
  32.117 +</li>
  32.118 +</ul>
  32.119 +
  32.120 +
  32.121 +<h3><a id="index_d"></a>- d -</h3><ul>
  32.122 +<li>data
  32.123 +: <a class="el" href="structUcxArray.html#a04d2b03d0a45af1fab19b4216602075a">UcxArray</a>
  32.124 +, <a class="el" href="structUcxKey.html#a6176109f25b34f3fa92bcfbc8ae7a88c">UcxKey</a>
  32.125 +, <a class="el" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">UcxList</a>
  32.126 +, <a class="el" href="structUcxMapElement.html#abbd7f3bf5beef370f702d2d5bb07733c">UcxMapElement</a>
  32.127 +, <a class="el" href="structUcxMapKey.html#ab71d1841e4f538628c00f782267fb6d5">UcxMapKey</a>
  32.128 +, <a class="el" href="structUcxMempool.html#ae98c1b0150bb119ee0a8506a6f310d6e">UcxMempool</a>
  32.129 +</li>
  32.130 +<li>dateformat
  32.131 +: <a class="el" href="structUcxLogger.html#a086f75df0f6c81ec491f25c0a4d9262b">UcxLogger</a>
  32.132 +</li>
  32.133 +<li>delimiter
  32.134 +: <a class="el" href="structUcxProperties.html#af6adb3f69616cf9d2bb5ea7b4d837ca5">UcxProperties</a>
  32.135 +</li>
  32.136 +<li>destructor
  32.137 +: <a class="el" href="structucx__memchunk.html#ac7b5e3fda47b917d6fb2a1d7ea28447b">ucx_memchunk</a>
  32.138 +, <a class="el" href="structucx__regdestr.html#acea2a3bb66909aa800a931ac8b0cce56">ucx_regdestr</a>
  32.139 +</li>
  32.140 +</ul>
  32.141 +
  32.142 +
  32.143 +<h3><a id="index_e"></a>- e -</h3><ul>
  32.144 +<li>elemsize
  32.145 +: <a class="el" href="structUcxArray.html#ac4e9ecdf8a8d010644f6e44dfef8190f">UcxArray</a>
  32.146 +</li>
  32.147 +<li>error
  32.148 +: <a class="el" href="structUcxProperties.html#a34f71a6ab6dcb6892e3b4eb802e75bff">UcxProperties</a>
  32.149 +</li>
  32.150 +</ul>
  32.151 +
  32.152 +
  32.153 +<h3><a id="index_f"></a>- f -</h3><ul>
  32.154 +<li>failure
  32.155 +: <a class="el" href="structUcxTestSuite.html#abfd240541d1e956e49cde0ac36286951">UcxTestSuite</a>
  32.156 +</li>
  32.157 +<li>flags
  32.158 +: <a class="el" href="structUcxBuffer.html#ac642e07b0a03be5aac48eb4aa5bec2f7">UcxBuffer</a>
  32.159 +</li>
  32.160 +<li>free
  32.161 +: <a class="el" href="structUcxAllocator.html#aecce1840378ed53f1002190f4f87026f">UcxAllocator</a>
  32.162 +</li>
  32.163 +</ul>
  32.164 +
  32.165 +
  32.166 +<h3><a id="index_h"></a>- h -</h3><ul>
  32.167 +<li>hash
  32.168 +: <a class="el" href="structUcxKey.html#aac9d372ac34a4cbd8459e2b04e505752">UcxKey</a>
  32.169 +, <a class="el" href="structUcxMapKey.html#a34c1f8fec98174583944fffd30e7c913">UcxMapKey</a>
  32.170 +</li>
  32.171 +<li>height
  32.172 +: <a class="el" href="structUcxAVLNode.html#af129fd32863a7c35e82c5cd9d11dc95a">UcxAVLNode</a>
  32.173 +</li>
  32.174 +</ul>
  32.175 +
  32.176 +
  32.177 +<h3><a id="index_i"></a>- i -</h3><ul>
  32.178 +<li>index
  32.179 +: <a class="el" href="structUcxMapIterator.html#ac2376545c8816dd6895de4995e558c65">UcxMapIterator</a>
  32.180 +</li>
  32.181 +</ul>
  32.182 +
  32.183 +
  32.184 +<h3><a id="index_k"></a>- k -</h3><ul>
  32.185 +<li>key
  32.186 +: <a class="el" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">UcxAVLNode</a>
  32.187 +, <a class="el" href="structUcxMapElement.html#aa446141b708e106e2c8de1303318187c">UcxMapElement</a>
  32.188 +</li>
  32.189 +</ul>
  32.190 +
  32.191 +
  32.192 +<h3><a id="index_l"></a>- l -</h3><ul>
  32.193 +<li>left
  32.194 +: <a class="el" href="structUcxAVLNode.html#ad3a1c733f2c1cc81ac527f846fc24b9c">UcxAVLNode</a>
  32.195 +</li>
  32.196 +<li>len
  32.197 +: <a class="el" href="structUcxKey.html#abef01de37f355688f2ac797d2c280683">UcxKey</a>
  32.198 +, <a class="el" href="structUcxMapKey.html#a504d46caa45c79cd87ff8cd835654270">UcxMapKey</a>
  32.199 +</li>
  32.200 +<li>length
  32.201 +: <a class="el" href="structscstr__t.html#aaa0229f64f1057b6f65adededaa5a172">scstr_t</a>
  32.202 +, <a class="el" href="structsstr__t.html#a5cf571708cdff92e45f08458f2b98229">sstr_t</a>
  32.203 +</li>
  32.204 +<li>level
  32.205 +: <a class="el" href="structUcxLogger.html#a2e0ee94c25b2307096c7970280d189cd">UcxLogger</a>
  32.206 +</li>
  32.207 +<li>levels
  32.208 +: <a class="el" href="structUcxLogger.html#a187129f7bc6e5064b3d92a5f1217f396">UcxLogger</a>
  32.209 +</li>
  32.210 +</ul>
  32.211 +
  32.212 +
  32.213 +<h3><a id="index_m"></a>- m -</h3><ul>
  32.214 +<li>malloc
  32.215 +: <a class="el" href="structUcxAllocator.html#a013376172be39ed54f77c4be6898845a">UcxAllocator</a>
  32.216 +</li>
  32.217 +<li>map
  32.218 +: <a class="el" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">UcxMap</a>
  32.219 +, <a class="el" href="structUcxMapIterator.html#af88d6e22547d09fe1d665dd650dcdb95">UcxMapIterator</a>
  32.220 +</li>
  32.221 +<li>mask
  32.222 +: <a class="el" href="structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c">UcxLogger</a>
  32.223 +</li>
  32.224 +</ul>
  32.225 +
  32.226 +
  32.227 +<h3><a id="index_n"></a>- n -</h3><ul>
  32.228 +<li>ndata
  32.229 +: <a class="el" href="structUcxMempool.html#aa3a73ab231e1bc207d526f46f1c1e23a">UcxMempool</a>
  32.230 +</li>
  32.231 +<li>next
  32.232 +: <a class="el" href="structUcxList.html#a82a1818f1abf765b026fa91478569a8f">UcxList</a>
  32.233 +, <a class="el" href="structUcxMapElement.html#a99fe8188b0889201d70ff5f922deef51">UcxMapElement</a>
  32.234 +, <a class="el" href="structUcxTestList.html#aeebb80ff75d9f6f82ab6dc2641a3c74e">UcxTestList</a>
  32.235 +</li>
  32.236 +</ul>
  32.237 +
  32.238 +
  32.239 +<h3><a id="index_p"></a>- p -</h3><ul>
  32.240 +<li>parent
  32.241 +: <a class="el" href="structUcxAVLNode.html#afc4e3b4f452aa2d91cabb2135b9d42f7">UcxAVLNode</a>
  32.242 +</li>
  32.243 +<li>pool
  32.244 +: <a class="el" href="structUcxAllocator.html#a1b78012998d1c28be86dc595f8f0aac9">UcxAllocator</a>
  32.245 +</li>
  32.246 +<li>pos
  32.247 +: <a class="el" href="structUcxBuffer.html#a7a64288f002cf62b492e2ea49c79615c">UcxBuffer</a>
  32.248 +, <a class="el" href="structUcxProperties.html#addd36ac8e5e42241c0a57453633970db">UcxProperties</a>
  32.249 +</li>
  32.250 +<li>prev
  32.251 +: <a class="el" href="structucx__stack__metadata.html#ad46d2e8e5b0acf05f2def41d451c5579">ucx_stack_metadata</a>
  32.252 +, <a class="el" href="structUcxList.html#a0f1fddce9088b9c1414745d0b1b5c08b">UcxList</a>
  32.253 +</li>
  32.254 +<li>ptr
  32.255 +: <a class="el" href="structscstr__t.html#a305fd48934b474a9bf4a40869030e391">scstr_t</a>
  32.256 +, <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0">sstr_t</a>
  32.257 +, <a class="el" href="structucx__regdestr.html#aac0e9ec8df4aab08728b4f8292b5f5e7">ucx_regdestr</a>
  32.258 +</li>
  32.259 +</ul>
  32.260 +
  32.261 +
  32.262 +<h3><a id="index_r"></a>- r -</h3><ul>
  32.263 +<li>realloc
  32.264 +: <a class="el" href="structUcxAllocator.html#a3550e3847f31d9e9ce3ffcb0d3440c15">UcxAllocator</a>
  32.265 +</li>
  32.266 +<li>right
  32.267 +: <a class="el" href="structUcxAVLNode.html#a7cbaa31dba8c7a89f4f8f7905f6fd238">UcxAVLNode</a>
  32.268 +</li>
  32.269 +<li>root
  32.270 +: <a class="el" href="structUcxAVLTree.html#a393a8fc99eb2c290d3cb67170081d742">UcxAVLTree</a>
  32.271 +</li>
  32.272 +</ul>
  32.273 +
  32.274 +
  32.275 +<h3><a id="index_s"></a>- s -</h3><ul>
  32.276 +<li>size
  32.277 +: <a class="el" href="structucx__stack__metadata.html#ae2a2848b721cfa44a7e963484c5e4b28">ucx_stack_metadata</a>
  32.278 +, <a class="el" href="structUcxArray.html#a20c11f2c9048cda80062842b7c094e20">UcxArray</a>
  32.279 +, <a class="el" href="structUcxBuffer.html#aec0aea8325394951d5ad4a9fbb8e1ac7">UcxBuffer</a>
  32.280 +, <a class="el" href="structUcxMap.html#afe120846b26d99580a7ff1276464e838">UcxMap</a>
  32.281 +, <a class="el" href="structUcxMempool.html#a304729986f2894971d0469e71e196bf0">UcxMempool</a>
  32.282 +, <a class="el" href="structUcxStack.html#a4df86b1917bfc3bbf760220870638143">UcxStack</a>
  32.283 +</li>
  32.284 +<li>space
  32.285 +: <a class="el" href="structUcxBuffer.html#a1a5076e85acb84b715a53bc0f37fb721">UcxBuffer</a>
  32.286 +, <a class="el" href="structUcxStack.html#af64d528744bf3a47fec87d2e45d2992f">UcxStack</a>
  32.287 +</li>
  32.288 +<li>stream
  32.289 +: <a class="el" href="structUcxLogger.html#a33fddf4791e8d49e479ecc78bf5d1b9e">UcxLogger</a>
  32.290 +</li>
  32.291 +<li>success
  32.292 +: <a class="el" href="structUcxTestSuite.html#a6cefa870a3c2e38d6ee682e38643dbbb">UcxTestSuite</a>
  32.293 +</li>
  32.294 +</ul>
  32.295 +
  32.296 +
  32.297 +<h3><a id="index_t"></a>- t -</h3><ul>
  32.298 +<li>test
  32.299 +: <a class="el" href="structUcxTestList.html#a6022faa52e772b073141ca0a2f5a56c9">UcxTestList</a>
  32.300 +</li>
  32.301 +<li>tests
  32.302 +: <a class="el" href="structUcxTestSuite.html#a630677a70ebc2c3296704cda3196492b">UcxTestSuite</a>
  32.303 +</li>
  32.304 +<li>tmp
  32.305 +: <a class="el" href="structUcxProperties.html#a68556d4260153f58dde44e4c365edce6">UcxProperties</a>
  32.306 +</li>
  32.307 +<li>tmpcap
  32.308 +: <a class="el" href="structUcxProperties.html#a5af10131ea9f679b4ee174499f92e210">UcxProperties</a>
  32.309 +</li>
  32.310 +<li>tmplen
  32.311 +: <a class="el" href="structUcxProperties.html#a8a81853d5903bee2f4e1fa53fdffae6e">UcxProperties</a>
  32.312 +</li>
  32.313 +<li>top
  32.314 +: <a class="el" href="structUcxStack.html#af0ff6f58edce469f17683013b86ade27">UcxStack</a>
  32.315 +</li>
  32.316 +</ul>
  32.317 +
  32.318 +
  32.319 +<h3><a id="index_u"></a>- u -</h3><ul>
  32.320 +<li>userdata
  32.321 +: <a class="el" href="structUcxAVLTree.html#ae92a3bfad3fe33c8dcbdad85112f83fd">UcxAVLTree</a>
  32.322 +</li>
  32.323 +</ul>
  32.324 +
  32.325 +
  32.326 +<h3><a id="index_v"></a>- v -</h3><ul>
  32.327 +<li>value
  32.328 +: <a class="el" href="structUcxAVLNode.html#a302501b8c04c3fde668fe72249871258">UcxAVLNode</a>
  32.329 +</li>
  32.330 +</ul>
  32.331 +
  32.332 +
  32.333 +<h3><a id="index_w"></a>- w -</h3><ul>
  32.334 +<li>writer
  32.335 +: <a class="el" href="structUcxLogger.html#ada13bba090a9dc4f8d6cd9be73c60930">UcxLogger</a>
  32.336 +</li>
  32.337 +</ul>
  32.338 +</div><!-- contents -->
  32.339 +<!-- start footer part -->
  32.340 +<hr class="footer"/><address class="footer"><small>
  32.341 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  32.342 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  32.343 +</a> 1.8.13
  32.344 +</small></address>
  32.345 +</body>
  32.346 +</html>
    33.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    33.2 +++ b/docs/api-2.1/functions_vars.html	Sat Feb 06 19:11:44 2021 +0100
    33.3 @@ -0,0 +1,343 @@
    33.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    33.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    33.6 +<head>
    33.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    33.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    33.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   33.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   33.11 +<title>ucx: Data Fields - Variables</title>
   33.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   33.13 +<script type="text/javascript" src="jquery.js"></script>
   33.14 +<script type="text/javascript" src="dynsections.js"></script>
   33.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   33.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   33.17 +<script type="text/javascript" src="search/search.js"></script>
   33.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   33.19 +</head>
   33.20 +<body>
   33.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   33.22 +<div id="titlearea">
   33.23 +<table cellspacing="0" cellpadding="0">
   33.24 + <tbody>
   33.25 + <tr style="height: 56px;">
   33.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   33.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   33.28 +   <div id="projectname">ucx
   33.29 +   </div>
   33.30 +   <div id="projectbrief">UAP Common Extensions</div>
   33.31 +  </td>
   33.32 + </tr>
   33.33 + </tbody>
   33.34 +</table>
   33.35 +</div>
   33.36 +<!-- end header part -->
   33.37 +<!-- Generated by Doxygen 1.8.13 -->
   33.38 +<script type="text/javascript">
   33.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   33.40 +</script>
   33.41 +<script type="text/javascript" src="menudata.js"></script>
   33.42 +<script type="text/javascript" src="menu.js"></script>
   33.43 +<script type="text/javascript">
   33.44 +$(function() {
   33.45 +  initMenu('',true,false,'search.php','Search');
   33.46 +  $(document).ready(function() { init_search(); });
   33.47 +});
   33.48 +</script>
   33.49 +<div id="main-nav"></div>
   33.50 +</div><!-- top -->
   33.51 +<!-- window showing the filter options -->
   33.52 +<div id="MSearchSelectWindow"
   33.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   33.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   33.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   33.56 +</div>
   33.57 +
   33.58 +<!-- iframe showing the search results (closed by default) -->
   33.59 +<div id="MSearchResultsWindow">
   33.60 +<iframe src="javascript:void(0)" frameborder="0" 
   33.61 +        name="MSearchResults" id="MSearchResults">
   33.62 +</iframe>
   33.63 +</div>
   33.64 +
   33.65 +<div class="contents">
   33.66 +&#160;
   33.67 +
   33.68 +<h3><a id="index_a"></a>- a -</h3><ul>
   33.69 +<li>allocator
   33.70 +: <a class="el" href="structUcxArray.html#a2ef31303b7548b9aa8e2b9187e295212">UcxArray</a>
   33.71 +, <a class="el" href="structUcxAVLTree.html#a30652776b540156ad54c7d52833e4e28">UcxAVLTree</a>
   33.72 +, <a class="el" href="structUcxMap.html#a531f3e481c1c331cf037b916192e974d">UcxMap</a>
   33.73 +, <a class="el" href="structUcxMempool.html#ac45fd1e9269399e4c434d6bdaa770d92">UcxMempool</a>
   33.74 +, <a class="el" href="structUcxStack.html#a33cda4f6890ac56ab31701598bc1ae10">UcxStack</a>
   33.75 +</li>
   33.76 +</ul>
   33.77 +
   33.78 +
   33.79 +<h3><a id="index_b"></a>- b -</h3><ul>
   33.80 +<li>buffer
   33.81 +: <a class="el" href="structUcxProperties.html#a6bb4d29686df41a0f42641ee15232bfd">UcxProperties</a>
   33.82 +</li>
   33.83 +<li>buflen
   33.84 +: <a class="el" href="structUcxProperties.html#a4e7524434525267e29f493a25dcca6b5">UcxProperties</a>
   33.85 +</li>
   33.86 +</ul>
   33.87 +
   33.88 +
   33.89 +<h3><a id="index_c"></a>- c -</h3><ul>
   33.90 +<li>c
   33.91 +: <a class="el" href="structucx__memchunk.html#ab86550503e5f019bfa61a1e91f1c40da">ucx_memchunk</a>
   33.92 +</li>
   33.93 +<li>calloc
   33.94 +: <a class="el" href="structUcxAllocator.html#ab94ec1cba45cc4e7d81e1588a11cbb62">UcxAllocator</a>
   33.95 +</li>
   33.96 +<li>capacity
   33.97 +: <a class="el" href="structUcxArray.html#a7ed074887908e45bde7e1fbc67b31c18">UcxArray</a>
   33.98 +, <a class="el" href="structUcxBuffer.html#a385661894f3cee9c549bfe07a8b316bf">UcxBuffer</a>
   33.99 +</li>
  33.100 +<li>cmpfunc
  33.101 +: <a class="el" href="structUcxAVLTree.html#a87aff25cb726cb9eb88eb815a10d1004">UcxAVLTree</a>
  33.102 +</li>
  33.103 +<li>comment1
  33.104 +: <a class="el" href="structUcxProperties.html#afaa2e6a289fa6949b7b01df35fa5def8">UcxProperties</a>
  33.105 +</li>
  33.106 +<li>comment2
  33.107 +: <a class="el" href="structUcxProperties.html#a9ea7ecb414ca8bc7bef62cdd19cc6363">UcxProperties</a>
  33.108 +</li>
  33.109 +<li>comment3
  33.110 +: <a class="el" href="structUcxProperties.html#a5f3e561e32bac03e36a191a6940cca92">UcxProperties</a>
  33.111 +</li>
  33.112 +<li>count
  33.113 +: <a class="el" href="structUcxMap.html#a14e9163f71f6c014dfa2103de70ae9cd">UcxMap</a>
  33.114 +</li>
  33.115 +<li>cur
  33.116 +: <a class="el" href="structUcxMapIterator.html#af1fc40f899f37280adb5b85acf6e742f">UcxMapIterator</a>
  33.117 +</li>
  33.118 +</ul>
  33.119 +
  33.120 +
  33.121 +<h3><a id="index_d"></a>- d -</h3><ul>
  33.122 +<li>data
  33.123 +: <a class="el" href="structUcxArray.html#a04d2b03d0a45af1fab19b4216602075a">UcxArray</a>
  33.124 +, <a class="el" href="structUcxKey.html#a6176109f25b34f3fa92bcfbc8ae7a88c">UcxKey</a>
  33.125 +, <a class="el" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">UcxList</a>
  33.126 +, <a class="el" href="structUcxMapElement.html#abbd7f3bf5beef370f702d2d5bb07733c">UcxMapElement</a>
  33.127 +, <a class="el" href="structUcxMapKey.html#ab71d1841e4f538628c00f782267fb6d5">UcxMapKey</a>
  33.128 +, <a class="el" href="structUcxMempool.html#ae98c1b0150bb119ee0a8506a6f310d6e">UcxMempool</a>
  33.129 +</li>
  33.130 +<li>dateformat
  33.131 +: <a class="el" href="structUcxLogger.html#a086f75df0f6c81ec491f25c0a4d9262b">UcxLogger</a>
  33.132 +</li>
  33.133 +<li>delimiter
  33.134 +: <a class="el" href="structUcxProperties.html#af6adb3f69616cf9d2bb5ea7b4d837ca5">UcxProperties</a>
  33.135 +</li>
  33.136 +<li>destructor
  33.137 +: <a class="el" href="structucx__memchunk.html#ac7b5e3fda47b917d6fb2a1d7ea28447b">ucx_memchunk</a>
  33.138 +, <a class="el" href="structucx__regdestr.html#acea2a3bb66909aa800a931ac8b0cce56">ucx_regdestr</a>
  33.139 +</li>
  33.140 +</ul>
  33.141 +
  33.142 +
  33.143 +<h3><a id="index_e"></a>- e -</h3><ul>
  33.144 +<li>elemsize
  33.145 +: <a class="el" href="structUcxArray.html#ac4e9ecdf8a8d010644f6e44dfef8190f">UcxArray</a>
  33.146 +</li>
  33.147 +<li>error
  33.148 +: <a class="el" href="structUcxProperties.html#a34f71a6ab6dcb6892e3b4eb802e75bff">UcxProperties</a>
  33.149 +</li>
  33.150 +</ul>
  33.151 +
  33.152 +
  33.153 +<h3><a id="index_f"></a>- f -</h3><ul>
  33.154 +<li>failure
  33.155 +: <a class="el" href="structUcxTestSuite.html#abfd240541d1e956e49cde0ac36286951">UcxTestSuite</a>
  33.156 +</li>
  33.157 +<li>flags
  33.158 +: <a class="el" href="structUcxBuffer.html#ac642e07b0a03be5aac48eb4aa5bec2f7">UcxBuffer</a>
  33.159 +</li>
  33.160 +<li>free
  33.161 +: <a class="el" href="structUcxAllocator.html#aecce1840378ed53f1002190f4f87026f">UcxAllocator</a>
  33.162 +</li>
  33.163 +</ul>
  33.164 +
  33.165 +
  33.166 +<h3><a id="index_h"></a>- h -</h3><ul>
  33.167 +<li>hash
  33.168 +: <a class="el" href="structUcxKey.html#aac9d372ac34a4cbd8459e2b04e505752">UcxKey</a>
  33.169 +, <a class="el" href="structUcxMapKey.html#a34c1f8fec98174583944fffd30e7c913">UcxMapKey</a>
  33.170 +</li>
  33.171 +<li>height
  33.172 +: <a class="el" href="structUcxAVLNode.html#af129fd32863a7c35e82c5cd9d11dc95a">UcxAVLNode</a>
  33.173 +</li>
  33.174 +</ul>
  33.175 +
  33.176 +
  33.177 +<h3><a id="index_i"></a>- i -</h3><ul>
  33.178 +<li>index
  33.179 +: <a class="el" href="structUcxMapIterator.html#ac2376545c8816dd6895de4995e558c65">UcxMapIterator</a>
  33.180 +</li>
  33.181 +</ul>
  33.182 +
  33.183 +
  33.184 +<h3><a id="index_k"></a>- k -</h3><ul>
  33.185 +<li>key
  33.186 +: <a class="el" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">UcxAVLNode</a>
  33.187 +, <a class="el" href="structUcxMapElement.html#aa446141b708e106e2c8de1303318187c">UcxMapElement</a>
  33.188 +</li>
  33.189 +</ul>
  33.190 +
  33.191 +
  33.192 +<h3><a id="index_l"></a>- l -</h3><ul>
  33.193 +<li>left
  33.194 +: <a class="el" href="structUcxAVLNode.html#ad3a1c733f2c1cc81ac527f846fc24b9c">UcxAVLNode</a>
  33.195 +</li>
  33.196 +<li>len
  33.197 +: <a class="el" href="structUcxKey.html#abef01de37f355688f2ac797d2c280683">UcxKey</a>
  33.198 +, <a class="el" href="structUcxMapKey.html#a504d46caa45c79cd87ff8cd835654270">UcxMapKey</a>
  33.199 +</li>
  33.200 +<li>length
  33.201 +: <a class="el" href="structscstr__t.html#aaa0229f64f1057b6f65adededaa5a172">scstr_t</a>
  33.202 +, <a class="el" href="structsstr__t.html#a5cf571708cdff92e45f08458f2b98229">sstr_t</a>
  33.203 +</li>
  33.204 +<li>level
  33.205 +: <a class="el" href="structUcxLogger.html#a2e0ee94c25b2307096c7970280d189cd">UcxLogger</a>
  33.206 +</li>
  33.207 +<li>levels
  33.208 +: <a class="el" href="structUcxLogger.html#a187129f7bc6e5064b3d92a5f1217f396">UcxLogger</a>
  33.209 +</li>
  33.210 +</ul>
  33.211 +
  33.212 +
  33.213 +<h3><a id="index_m"></a>- m -</h3><ul>
  33.214 +<li>malloc
  33.215 +: <a class="el" href="structUcxAllocator.html#a013376172be39ed54f77c4be6898845a">UcxAllocator</a>
  33.216 +</li>
  33.217 +<li>map
  33.218 +: <a class="el" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">UcxMap</a>
  33.219 +, <a class="el" href="structUcxMapIterator.html#af88d6e22547d09fe1d665dd650dcdb95">UcxMapIterator</a>
  33.220 +</li>
  33.221 +<li>mask
  33.222 +: <a class="el" href="structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c">UcxLogger</a>
  33.223 +</li>
  33.224 +</ul>
  33.225 +
  33.226 +
  33.227 +<h3><a id="index_n"></a>- n -</h3><ul>
  33.228 +<li>ndata
  33.229 +: <a class="el" href="structUcxMempool.html#aa3a73ab231e1bc207d526f46f1c1e23a">UcxMempool</a>
  33.230 +</li>
  33.231 +<li>next
  33.232 +: <a class="el" href="structUcxList.html#a82a1818f1abf765b026fa91478569a8f">UcxList</a>
  33.233 +, <a class="el" href="structUcxMapElement.html#a99fe8188b0889201d70ff5f922deef51">UcxMapElement</a>
  33.234 +, <a class="el" href="structUcxTestList.html#aeebb80ff75d9f6f82ab6dc2641a3c74e">UcxTestList</a>
  33.235 +</li>
  33.236 +</ul>
  33.237 +
  33.238 +
  33.239 +<h3><a id="index_p"></a>- p -</h3><ul>
  33.240 +<li>parent
  33.241 +: <a class="el" href="structUcxAVLNode.html#afc4e3b4f452aa2d91cabb2135b9d42f7">UcxAVLNode</a>
  33.242 +</li>
  33.243 +<li>pool
  33.244 +: <a class="el" href="structUcxAllocator.html#a1b78012998d1c28be86dc595f8f0aac9">UcxAllocator</a>
  33.245 +</li>
  33.246 +<li>pos
  33.247 +: <a class="el" href="structUcxBuffer.html#a7a64288f002cf62b492e2ea49c79615c">UcxBuffer</a>
  33.248 +, <a class="el" href="structUcxProperties.html#addd36ac8e5e42241c0a57453633970db">UcxProperties</a>
  33.249 +</li>
  33.250 +<li>prev
  33.251 +: <a class="el" href="structucx__stack__metadata.html#ad46d2e8e5b0acf05f2def41d451c5579">ucx_stack_metadata</a>
  33.252 +, <a class="el" href="structUcxList.html#a0f1fddce9088b9c1414745d0b1b5c08b">UcxList</a>
  33.253 +</li>
  33.254 +<li>ptr
  33.255 +: <a class="el" href="structscstr__t.html#a305fd48934b474a9bf4a40869030e391">scstr_t</a>
  33.256 +, <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0">sstr_t</a>
  33.257 +, <a class="el" href="structucx__regdestr.html#aac0e9ec8df4aab08728b4f8292b5f5e7">ucx_regdestr</a>
  33.258 +</li>
  33.259 +</ul>
  33.260 +
  33.261 +
  33.262 +<h3><a id="index_r"></a>- r -</h3><ul>
  33.263 +<li>realloc
  33.264 +: <a class="el" href="structUcxAllocator.html#a3550e3847f31d9e9ce3ffcb0d3440c15">UcxAllocator</a>
  33.265 +</li>
  33.266 +<li>right
  33.267 +: <a class="el" href="structUcxAVLNode.html#a7cbaa31dba8c7a89f4f8f7905f6fd238">UcxAVLNode</a>
  33.268 +</li>
  33.269 +<li>root
  33.270 +: <a class="el" href="structUcxAVLTree.html#a393a8fc99eb2c290d3cb67170081d742">UcxAVLTree</a>
  33.271 +</li>
  33.272 +</ul>
  33.273 +
  33.274 +
  33.275 +<h3><a id="index_s"></a>- s -</h3><ul>
  33.276 +<li>size
  33.277 +: <a class="el" href="structucx__stack__metadata.html#ae2a2848b721cfa44a7e963484c5e4b28">ucx_stack_metadata</a>
  33.278 +, <a class="el" href="structUcxArray.html#a20c11f2c9048cda80062842b7c094e20">UcxArray</a>
  33.279 +, <a class="el" href="structUcxBuffer.html#aec0aea8325394951d5ad4a9fbb8e1ac7">UcxBuffer</a>
  33.280 +, <a class="el" href="structUcxMap.html#afe120846b26d99580a7ff1276464e838">UcxMap</a>
  33.281 +, <a class="el" href="structUcxMempool.html#a304729986f2894971d0469e71e196bf0">UcxMempool</a>
  33.282 +, <a class="el" href="structUcxStack.html#a4df86b1917bfc3bbf760220870638143">UcxStack</a>
  33.283 +</li>
  33.284 +<li>space
  33.285 +: <a class="el" href="structUcxBuffer.html#a1a5076e85acb84b715a53bc0f37fb721">UcxBuffer</a>
  33.286 +, <a class="el" href="structUcxStack.html#af64d528744bf3a47fec87d2e45d2992f">UcxStack</a>
  33.287 +</li>
  33.288 +<li>stream
  33.289 +: <a class="el" href="structUcxLogger.html#a33fddf4791e8d49e479ecc78bf5d1b9e">UcxLogger</a>
  33.290 +</li>
  33.291 +<li>success
  33.292 +: <a class="el" href="structUcxTestSuite.html#a6cefa870a3c2e38d6ee682e38643dbbb">UcxTestSuite</a>
  33.293 +</li>
  33.294 +</ul>
  33.295 +
  33.296 +
  33.297 +<h3><a id="index_t"></a>- t -</h3><ul>
  33.298 +<li>test
  33.299 +: <a class="el" href="structUcxTestList.html#a6022faa52e772b073141ca0a2f5a56c9">UcxTestList</a>
  33.300 +</li>
  33.301 +<li>tests
  33.302 +: <a class="el" href="structUcxTestSuite.html#a630677a70ebc2c3296704cda3196492b">UcxTestSuite</a>
  33.303 +</li>
  33.304 +<li>tmp
  33.305 +: <a class="el" href="structUcxProperties.html#a68556d4260153f58dde44e4c365edce6">UcxProperties</a>
  33.306 +</li>
  33.307 +<li>tmpcap
  33.308 +: <a class="el" href="structUcxProperties.html#a5af10131ea9f679b4ee174499f92e210">UcxProperties</a>
  33.309 +</li>
  33.310 +<li>tmplen
  33.311 +: <a class="el" href="structUcxProperties.html#a8a81853d5903bee2f4e1fa53fdffae6e">UcxProperties</a>
  33.312 +</li>
  33.313 +<li>top
  33.314 +: <a class="el" href="structUcxStack.html#af0ff6f58edce469f17683013b86ade27">UcxStack</a>
  33.315 +</li>
  33.316 +</ul>
  33.317 +
  33.318 +
  33.319 +<h3><a id="index_u"></a>- u -</h3><ul>
  33.320 +<li>userdata
  33.321 +: <a class="el" href="structUcxAVLTree.html#ae92a3bfad3fe33c8dcbdad85112f83fd">UcxAVLTree</a>
  33.322 +</li>
  33.323 +</ul>
  33.324 +
  33.325 +
  33.326 +<h3><a id="index_v"></a>- v -</h3><ul>
  33.327 +<li>value
  33.328 +: <a class="el" href="structUcxAVLNode.html#a302501b8c04c3fde668fe72249871258">UcxAVLNode</a>
  33.329 +</li>
  33.330 +</ul>
  33.331 +
  33.332 +
  33.333 +<h3><a id="index_w"></a>- w -</h3><ul>
  33.334 +<li>writer
  33.335 +: <a class="el" href="structUcxLogger.html#ada13bba090a9dc4f8d6cd9be73c60930">UcxLogger</a>
  33.336 +</li>
  33.337 +</ul>
  33.338 +</div><!-- contents -->
  33.339 +<!-- start footer part -->
  33.340 +<hr class="footer"/><address class="footer"><small>
  33.341 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  33.342 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  33.343 +</a> 1.8.13
  33.344 +</small></address>
  33.345 +</body>
  33.346 +</html>
    34.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    34.2 +++ b/docs/api-2.1/globals.html	Sat Feb 06 19:11:44 2021 +0100
    34.3 @@ -0,0 +1,78 @@
    34.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    34.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    34.6 +<head>
    34.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    34.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    34.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   34.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   34.11 +<title>ucx: Globals</title>
   34.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   34.13 +<script type="text/javascript" src="jquery.js"></script>
   34.14 +<script type="text/javascript" src="dynsections.js"></script>
   34.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   34.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   34.17 +<script type="text/javascript" src="search/search.js"></script>
   34.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   34.19 +</head>
   34.20 +<body>
   34.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   34.22 +<div id="titlearea">
   34.23 +<table cellspacing="0" cellpadding="0">
   34.24 + <tbody>
   34.25 + <tr style="height: 56px;">
   34.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   34.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   34.28 +   <div id="projectname">ucx
   34.29 +   </div>
   34.30 +   <div id="projectbrief">UAP Common Extensions</div>
   34.31 +  </td>
   34.32 + </tr>
   34.33 + </tbody>
   34.34 +</table>
   34.35 +</div>
   34.36 +<!-- end header part -->
   34.37 +<!-- Generated by Doxygen 1.8.13 -->
   34.38 +<script type="text/javascript">
   34.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   34.40 +</script>
   34.41 +<script type="text/javascript" src="menudata.js"></script>
   34.42 +<script type="text/javascript" src="menu.js"></script>
   34.43 +<script type="text/javascript">
   34.44 +$(function() {
   34.45 +  initMenu('',true,false,'search.php','Search');
   34.46 +  $(document).ready(function() { init_search(); });
   34.47 +});
   34.48 +</script>
   34.49 +<div id="main-nav"></div>
   34.50 +</div><!-- top -->
   34.51 +<!-- window showing the filter options -->
   34.52 +<div id="MSearchSelectWindow"
   34.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   34.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   34.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   34.56 +</div>
   34.57 +
   34.58 +<!-- iframe showing the search results (closed by default) -->
   34.59 +<div id="MSearchResultsWindow">
   34.60 +<iframe src="javascript:void(0)" frameborder="0" 
   34.61 +        name="MSearchResults" id="MSearchResults">
   34.62 +</iframe>
   34.63 +</div>
   34.64 +
   34.65 +<div class="contents">
   34.66 +<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
   34.67 +
   34.68 +<h3><a id="index__"></a>- _ -</h3><ul>
   34.69 +<li>__FUNCTION__
   34.70 +: <a class="el" href="test_8h.html#a828bb1dfda1afd67ca795075903d227d">test.h</a>
   34.71 +</li>
   34.72 +</ul>
   34.73 +</div><!-- contents -->
   34.74 +<!-- start footer part -->
   34.75 +<hr class="footer"/><address class="footer"><small>
   34.76 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
   34.77 +<img class="footer" src="doxygen.png" alt="doxygen"/>
   34.78 +</a> 1.8.13
   34.79 +</small></address>
   34.80 +</body>
   34.81 +</html>
    35.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    35.2 +++ b/docs/api-2.1/globals_a.html	Sat Feb 06 19:11:44 2021 +0100
    35.3 @@ -0,0 +1,87 @@
    35.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    35.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    35.6 +<head>
    35.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    35.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    35.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   35.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   35.11 +<title>ucx: Globals</title>
   35.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   35.13 +<script type="text/javascript" src="jquery.js"></script>
   35.14 +<script type="text/javascript" src="dynsections.js"></script>
   35.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   35.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   35.17 +<script type="text/javascript" src="search/search.js"></script>
   35.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   35.19 +</head>
   35.20 +<body>
   35.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   35.22 +<div id="titlearea">
   35.23 +<table cellspacing="0" cellpadding="0">
   35.24 + <tbody>
   35.25 + <tr style="height: 56px;">
   35.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   35.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   35.28 +   <div id="projectname">ucx
   35.29 +   </div>
   35.30 +   <div id="projectbrief">UAP Common Extensions</div>
   35.31 +  </td>
   35.32 + </tr>
   35.33 + </tbody>
   35.34 +</table>
   35.35 +</div>
   35.36 +<!-- end header part -->
   35.37 +<!-- Generated by Doxygen 1.8.13 -->
   35.38 +<script type="text/javascript">
   35.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   35.40 +</script>
   35.41 +<script type="text/javascript" src="menudata.js"></script>
   35.42 +<script type="text/javascript" src="menu.js"></script>
   35.43 +<script type="text/javascript">
   35.44 +$(function() {
   35.45 +  initMenu('',true,false,'search.php','Search');
   35.46 +  $(document).ready(function() { init_search(); });
   35.47 +});
   35.48 +</script>
   35.49 +<div id="main-nav"></div>
   35.50 +</div><!-- top -->
   35.51 +<!-- window showing the filter options -->
   35.52 +<div id="MSearchSelectWindow"
   35.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   35.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   35.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   35.56 +</div>
   35.57 +
   35.58 +<!-- iframe showing the search results (closed by default) -->
   35.59 +<div id="MSearchResultsWindow">
   35.60 +<iframe src="javascript:void(0)" frameborder="0" 
   35.61 +        name="MSearchResults" id="MSearchResults">
   35.62 +</iframe>
   35.63 +</div>
   35.64 +
   35.65 +<div class="contents">
   35.66 +<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
   35.67 +
   35.68 +<h3><a id="index_a"></a>- a -</h3><ul>
   35.69 +<li>alcalloc
   35.70 +: <a class="el" href="allocator_8h.html#a8d71470816f88f78cb9a9686c57e1b10">allocator.h</a>
   35.71 +</li>
   35.72 +<li>alfree
   35.73 +: <a class="el" href="allocator_8h.html#acd775785b54e97dc2b33a432c12c8fb2">allocator.h</a>
   35.74 +</li>
   35.75 +<li>almalloc
   35.76 +: <a class="el" href="allocator_8h.html#ae1bc218fea8a35f4a3706f0beefcfb19">allocator.h</a>
   35.77 +</li>
   35.78 +<li>alrealloc
   35.79 +: <a class="el" href="allocator_8h.html#a029ee5c9bcbb3f873571553f788c5820">allocator.h</a>
   35.80 +</li>
   35.81 +</ul>
   35.82 +</div><!-- contents -->
   35.83 +<!-- start footer part -->
   35.84 +<hr class="footer"/><address class="footer"><small>
   35.85 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
   35.86 +<img class="footer" src="doxygen.png" alt="doxygen"/>
   35.87 +</a> 1.8.13
   35.88 +</small></address>
   35.89 +</body>
   35.90 +</html>
    36.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    36.2 +++ b/docs/api-2.1/globals_c.html	Sat Feb 06 19:11:44 2021 +0100
    36.3 @@ -0,0 +1,81 @@
    36.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    36.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    36.6 +<head>
    36.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    36.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    36.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   36.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   36.11 +<title>ucx: Globals</title>
   36.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   36.13 +<script type="text/javascript" src="jquery.js"></script>
   36.14 +<script type="text/javascript" src="dynsections.js"></script>
   36.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   36.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   36.17 +<script type="text/javascript" src="search/search.js"></script>
   36.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   36.19 +</head>
   36.20 +<body>
   36.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   36.22 +<div id="titlearea">
   36.23 +<table cellspacing="0" cellpadding="0">
   36.24 + <tbody>
   36.25 + <tr style="height: 56px;">
   36.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   36.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   36.28 +   <div id="projectname">ucx
   36.29 +   </div>
   36.30 +   <div id="projectbrief">UAP Common Extensions</div>
   36.31 +  </td>
   36.32 + </tr>
   36.33 + </tbody>
   36.34 +</table>
   36.35 +</div>
   36.36 +<!-- end header part -->
   36.37 +<!-- Generated by Doxygen 1.8.13 -->
   36.38 +<script type="text/javascript">
   36.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   36.40 +</script>
   36.41 +<script type="text/javascript" src="menudata.js"></script>
   36.42 +<script type="text/javascript" src="menu.js"></script>
   36.43 +<script type="text/javascript">
   36.44 +$(function() {
   36.45 +  initMenu('',true,false,'search.php','Search');
   36.46 +  $(document).ready(function() { init_search(); });
   36.47 +});
   36.48 +</script>
   36.49 +<div id="main-nav"></div>
   36.50 +</div><!-- top -->
   36.51 +<!-- window showing the filter options -->
   36.52 +<div id="MSearchSelectWindow"
   36.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   36.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   36.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   36.56 +</div>
   36.57 +
   36.58 +<!-- iframe showing the search results (closed by default) -->
   36.59 +<div id="MSearchResultsWindow">
   36.60 +<iframe src="javascript:void(0)" frameborder="0" 
   36.61 +        name="MSearchResults" id="MSearchResults">
   36.62 +</iframe>
   36.63 +</div>
   36.64 +
   36.65 +<div class="contents">
   36.66 +<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
   36.67 +
   36.68 +<h3><a id="index_c"></a>- c -</h3><ul>
   36.69 +<li>cmp_func
   36.70 +: <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">ucx.h</a>
   36.71 +</li>
   36.72 +<li>copy_func
   36.73 +: <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">ucx.h</a>
   36.74 +</li>
   36.75 +</ul>
   36.76 +</div><!-- contents -->
   36.77 +<!-- start footer part -->
   36.78 +<hr class="footer"/><address class="footer"><small>
   36.79 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
   36.80 +<img class="footer" src="doxygen.png" alt="doxygen"/>
   36.81 +</a> 1.8.13
   36.82 +</small></address>
   36.83 +</body>
   36.84 +</html>
    37.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    37.2 +++ b/docs/api-2.1/globals_d.html	Sat Feb 06 19:11:44 2021 +0100
    37.3 @@ -0,0 +1,78 @@
    37.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    37.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    37.6 +<head>
    37.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    37.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    37.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   37.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   37.11 +<title>ucx: Globals</title>
   37.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   37.13 +<script type="text/javascript" src="jquery.js"></script>
   37.14 +<script type="text/javascript" src="dynsections.js"></script>
   37.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   37.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   37.17 +<script type="text/javascript" src="search/search.js"></script>
   37.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   37.19 +</head>
   37.20 +<body>
   37.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   37.22 +<div id="titlearea">
   37.23 +<table cellspacing="0" cellpadding="0">
   37.24 + <tbody>
   37.25 + <tr style="height: 56px;">
   37.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   37.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   37.28 +   <div id="projectname">ucx
   37.29 +   </div>
   37.30 +   <div id="projectbrief">UAP Common Extensions</div>
   37.31 +  </td>
   37.32 + </tr>
   37.33 + </tbody>
   37.34 +</table>
   37.35 +</div>
   37.36 +<!-- end header part -->
   37.37 +<!-- Generated by Doxygen 1.8.13 -->
   37.38 +<script type="text/javascript">
   37.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   37.40 +</script>
   37.41 +<script type="text/javascript" src="menudata.js"></script>
   37.42 +<script type="text/javascript" src="menu.js"></script>
   37.43 +<script type="text/javascript">
   37.44 +$(function() {
   37.45 +  initMenu('',true,false,'search.php','Search');
   37.46 +  $(document).ready(function() { init_search(); });
   37.47 +});
   37.48 +</script>
   37.49 +<div id="main-nav"></div>
   37.50 +</div><!-- top -->
   37.51 +<!-- window showing the filter options -->
   37.52 +<div id="MSearchSelectWindow"
   37.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   37.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   37.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   37.56 +</div>
   37.57 +
   37.58 +<!-- iframe showing the search results (closed by default) -->
   37.59 +<div id="MSearchResultsWindow">
   37.60 +<iframe src="javascript:void(0)" frameborder="0" 
   37.61 +        name="MSearchResults" id="MSearchResults">
   37.62 +</iframe>
   37.63 +</div>
   37.64 +
   37.65 +<div class="contents">
   37.66 +<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
   37.67 +
   37.68 +<h3><a id="index_d"></a>- d -</h3><ul>
   37.69 +<li>distance_func
   37.70 +: <a class="el" href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">ucx.h</a>
   37.71 +</li>
   37.72 +</ul>
   37.73 +</div><!-- contents -->
   37.74 +<!-- start footer part -->
   37.75 +<hr class="footer"/><address class="footer"><small>
   37.76 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
   37.77 +<img class="footer" src="doxygen.png" alt="doxygen"/>
   37.78 +</a> 1.8.13
   37.79 +</small></address>
   37.80 +</body>
   37.81 +</html>
    38.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    38.2 +++ b/docs/api-2.1/globals_defs.html	Sat Feb 06 19:11:44 2021 +0100
    38.3 @@ -0,0 +1,364 @@
    38.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    38.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    38.6 +<head>
    38.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    38.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    38.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   38.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   38.11 +<title>ucx: Globals</title>
   38.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   38.13 +<script type="text/javascript" src="jquery.js"></script>
   38.14 +<script type="text/javascript" src="dynsections.js"></script>
   38.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   38.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   38.17 +<script type="text/javascript" src="search/search.js"></script>
   38.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   38.19 +</head>
   38.20 +<body>
   38.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   38.22 +<div id="titlearea">
   38.23 +<table cellspacing="0" cellpadding="0">
   38.24 + <tbody>
   38.25 + <tr style="height: 56px;">
   38.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   38.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   38.28 +   <div id="projectname">ucx
   38.29 +   </div>
   38.30 +   <div id="projectbrief">UAP Common Extensions</div>
   38.31 +  </td>
   38.32 + </tr>
   38.33 + </tbody>
   38.34 +</table>
   38.35 +</div>
   38.36 +<!-- end header part -->
   38.37 +<!-- Generated by Doxygen 1.8.13 -->
   38.38 +<script type="text/javascript">
   38.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   38.40 +</script>
   38.41 +<script type="text/javascript" src="menudata.js"></script>
   38.42 +<script type="text/javascript" src="menu.js"></script>
   38.43 +<script type="text/javascript">
   38.44 +$(function() {
   38.45 +  initMenu('',true,false,'search.php','Search');
   38.46 +  $(document).ready(function() { init_search(); });
   38.47 +});
   38.48 +</script>
   38.49 +<div id="main-nav"></div>
   38.50 +</div><!-- top -->
   38.51 +<!-- window showing the filter options -->
   38.52 +<div id="MSearchSelectWindow"
   38.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   38.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   38.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   38.56 +</div>
   38.57 +
   38.58 +<!-- iframe showing the search results (closed by default) -->
   38.59 +<div id="MSearchResultsWindow">
   38.60 +<iframe src="javascript:void(0)" frameborder="0" 
   38.61 +        name="MSearchResults" id="MSearchResults">
   38.62 +</iframe>
   38.63 +</div>
   38.64 +
   38.65 +<div class="contents">
   38.66 +&#160;
   38.67 +
   38.68 +<h3><a id="index__"></a>- _ -</h3><ul>
   38.69 +<li>__FUNCTION__
   38.70 +: <a class="el" href="test_8h.html#a828bb1dfda1afd67ca795075903d227d">test.h</a>
   38.71 +</li>
   38.72 +</ul>
   38.73 +
   38.74 +
   38.75 +<h3><a id="index_a"></a>- a -</h3><ul>
   38.76 +<li>alcalloc
   38.77 +: <a class="el" href="allocator_8h.html#a8d71470816f88f78cb9a9686c57e1b10">allocator.h</a>
   38.78 +</li>
   38.79 +<li>alfree
   38.80 +: <a class="el" href="allocator_8h.html#acd775785b54e97dc2b33a432c12c8fb2">allocator.h</a>
   38.81 +</li>
   38.82 +<li>almalloc
   38.83 +: <a class="el" href="allocator_8h.html#ae1bc218fea8a35f4a3706f0beefcfb19">allocator.h</a>
   38.84 +</li>
   38.85 +<li>alrealloc
   38.86 +: <a class="el" href="allocator_8h.html#a029ee5c9bcbb3f873571553f788c5820">allocator.h</a>
   38.87 +</li>
   38.88 +</ul>
   38.89 +
   38.90 +
   38.91 +<h3><a id="index_p"></a>- p -</h3><ul>
   38.92 +<li>PRIsstr
   38.93 +: <a class="el" href="string_8h.html#a7d5bc48708405a28b23667e32dfcecae">string.h</a>
   38.94 +</li>
   38.95 +</ul>
   38.96 +
   38.97 +
   38.98 +<h3><a id="index_s"></a>- s -</h3><ul>
   38.99 +<li>S
  38.100 +: <a class="el" href="string_8h.html#a8fa17c8cf4c36df48f4108c36da8573e">string.h</a>
  38.101 +</li>
  38.102 +<li>SC
  38.103 +: <a class="el" href="string_8h.html#a7d261dd0bc358c957a368bc058c1ce53">string.h</a>
  38.104 +</li>
  38.105 +<li>SCSTR
  38.106 +: <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">string.h</a>
  38.107 +</li>
  38.108 +<li>SFMT
  38.109 +: <a class="el" href="string_8h.html#a23ed51e87385886bb65e8cd19c839362">string.h</a>
  38.110 +</li>
  38.111 +<li>sstrcasecmp
  38.112 +: <a class="el" href="string_8h.html#a81b0f6df794152c2038703d4e9d0ad59">string.h</a>
  38.113 +</li>
  38.114 +<li>sstrcaseprefix
  38.115 +: <a class="el" href="string_8h.html#acd3dc64e90db9b4046e14f115a815ff4">string.h</a>
  38.116 +</li>
  38.117 +<li>sstrcasesuffix
  38.118 +: <a class="el" href="string_8h.html#a57eabd4862d531dd685bbf2feb8468bf">string.h</a>
  38.119 +</li>
  38.120 +<li>sstrcat
  38.121 +: <a class="el" href="string_8h.html#a6af8a4c347c7fdb5980d4c4803be2759">string.h</a>
  38.122 +</li>
  38.123 +<li>sstrcat_a
  38.124 +: <a class="el" href="string_8h.html#a6068d460f9bc05962666a917d26568b3">string.h</a>
  38.125 +</li>
  38.126 +<li>sstrcmp
  38.127 +: <a class="el" href="string_8h.html#a7ae7156c8de57454ca38d306100b8160">string.h</a>
  38.128 +</li>
  38.129 +<li>sstrdup
  38.130 +: <a class="el" href="string_8h.html#accbfd2b459a028d7af9fb7df6f977d80">string.h</a>
  38.131 +</li>
  38.132 +<li>sstrdup_a
  38.133 +: <a class="el" href="string_8h.html#a8d098baada4ea9ad5d8b6343b5aec007">string.h</a>
  38.134 +</li>
  38.135 +<li>sstrlower
  38.136 +: <a class="el" href="string_8h.html#a89343ea3e719f00ee802b557db57b769">string.h</a>
  38.137 +</li>
  38.138 +<li>sstrlower_a
  38.139 +: <a class="el" href="string_8h.html#a4bb4742fe71115f493991d307cb22b23">string.h</a>
  38.140 +</li>
  38.141 +<li>sstrnlen
  38.142 +: <a class="el" href="string_8h.html#a33fa945acc5ac2ce962e5ef13cf1638c">string.h</a>
  38.143 +</li>
  38.144 +<li>sstrprefix
  38.145 +: <a class="el" href="string_8h.html#a7d73b66256384b26927e787318fdefa2">string.h</a>
  38.146 +</li>
  38.147 +<li>sstrscstr
  38.148 +: <a class="el" href="string_8h.html#aa696932213265e10f864678686f4ccde">string.h</a>
  38.149 +</li>
  38.150 +<li>sstrsplit
  38.151 +: <a class="el" href="string_8h.html#aa929984004c3576bfafb95031aca8eb7">string.h</a>
  38.152 +</li>
  38.153 +<li>sstrsplit_a
  38.154 +: <a class="el" href="string_8h.html#ac9f69fa3a17e26a3a5f9d985b5844601">string.h</a>
  38.155 +</li>
  38.156 +<li>sstrstr
  38.157 +: <a class="el" href="string_8h.html#a9d03be026afa9447c52bb34b9e3b895a">string.h</a>
  38.158 +</li>
  38.159 +<li>sstrsuffix
  38.160 +: <a class="el" href="string_8h.html#ac6a5246f26be2e8a5f34d8995b7ec14e">string.h</a>
  38.161 +</li>
  38.162 +<li>sstrupper
  38.163 +: <a class="el" href="string_8h.html#a084fe5a3a90d6fb6b15ecda03bb30824">string.h</a>
  38.164 +</li>
  38.165 +<li>sstrupper_a
  38.166 +: <a class="el" href="string_8h.html#a5f0dd83c0176b812fb428004b2877a34">string.h</a>
  38.167 +</li>
  38.168 +<li>ST
  38.169 +: <a class="el" href="string_8h.html#a9037956cca97a4e84b642f17f3d10378">string.h</a>
  38.170 +</li>
  38.171 +</ul>
  38.172 +
  38.173 +
  38.174 +<h3><a id="index_u"></a>- u -</h3><ul>
  38.175 +<li>UCX_ALLOCATOR_DEFAULT
  38.176 +: <a class="el" href="allocator_8h.html#a1283a8f875f90a7af3aba5e031fc2e3f">allocator.h</a>
  38.177 +</li>
  38.178 +<li>ucx_array_util_set
  38.179 +: <a class="el" href="array_8h.html#a1d959c29af3125bdd37cde3a554e729c">array.h</a>
  38.180 +</li>
  38.181 +<li>ucx_array_util_setptr
  38.182 +: <a class="el" href="array_8h.html#a59a5b342965e790945f9c7a3f86b99f9">array.h</a>
  38.183 +</li>
  38.184 +<li>ucx_avl_default_new
  38.185 +: <a class="el" href="avl_8h.html#ac2886d4b79b48c9fabf6408873f84cd2">avl.h</a>
  38.186 +</li>
  38.187 +<li>UCX_AVL_FIND_CLOSEST
  38.188 +: <a class="el" href="avl_8h.html#af16f24d74fd6af0154de041566c6603b">avl.h</a>
  38.189 +</li>
  38.190 +<li>UCX_AVL_FIND_EXACT
  38.191 +: <a class="el" href="avl_8h.html#aaaf4a6f6f661cda7791db239212285d9">avl.h</a>
  38.192 +</li>
  38.193 +<li>UCX_AVL_FIND_LOWER_BOUNDED
  38.194 +: <a class="el" href="avl_8h.html#abd2446d544d5412b6997ee8a17bd368c">avl.h</a>
  38.195 +</li>
  38.196 +<li>UCX_AVL_FIND_UPPER_BOUNDED
  38.197 +: <a class="el" href="avl_8h.html#ac74ee7649c1e206b08b31f37dd68ca5e">avl.h</a>
  38.198 +</li>
  38.199 +<li>ucx_bprintf
  38.200 +: <a class="el" href="utils_8h.html#a9d7d65a420f026fcb6982803d5120519">utils.h</a>
  38.201 +</li>
  38.202 +<li>UCX_BUFFER_AUTOEXTEND
  38.203 +: <a class="el" href="buffer_8h.html#a05f9565f2d04399168c3b1c152a632be">buffer.h</a>
  38.204 +</li>
  38.205 +<li>UCX_BUFFER_AUTOFREE
  38.206 +: <a class="el" href="buffer_8h.html#a8bab11ad8a76719228b9ee91e2e45535">buffer.h</a>
  38.207 +</li>
  38.208 +<li>ucx_buffer_clear
  38.209 +: <a class="el" href="buffer_8h.html#a374abd5aabfcc3ee0777a79d5fe651ab">buffer.h</a>
  38.210 +</li>
  38.211 +<li>ucx_buffer_clone
  38.212 +: <a class="el" href="buffer_8h.html#a828353846428c2c2f695f9938f059e52">buffer.h</a>
  38.213 +</li>
  38.214 +<li>UCX_BUFFER_DEFAULT
  38.215 +: <a class="el" href="buffer_8h.html#acc77c8ed7b26854f555d4a5d11e49ea2">buffer.h</a>
  38.216 +</li>
  38.217 +<li>ucx_buffer_to_sstr
  38.218 +: <a class="el" href="buffer_8h.html#a0f4b64f1b3a74c4f6c5d9409d6b6086a">buffer.h</a>
  38.219 +</li>
  38.220 +<li>UCX_FOREACH
  38.221 +: <a class="el" href="list_8h.html#a4b143b6526a410aa4d22cb3bb9365d70">list.h</a>
  38.222 +</li>
  38.223 +<li>ucx_logger_debug
  38.224 +: <a class="el" href="logging_8h.html#a2936402799892db5138e5f1f8c25db0c">logging.h</a>
  38.225 +</li>
  38.226 +<li>UCX_LOGGER_DEBUG
  38.227 +: <a class="el" href="logging_8h.html#acff01d1ef919ea997cfce755fc1b83d8">logging.h</a>
  38.228 +</li>
  38.229 +<li>ucx_logger_error
  38.230 +: <a class="el" href="logging_8h.html#a6a9e472e14d6768e59d96d245e065397">logging.h</a>
  38.231 +</li>
  38.232 +<li>UCX_LOGGER_ERROR
  38.233 +: <a class="el" href="logging_8h.html#aa254c07fe3a907613e2256a318d5c9a8">logging.h</a>
  38.234 +</li>
  38.235 +<li>UCX_LOGGER_INFO
  38.236 +: <a class="el" href="logging_8h.html#a4b0178bf60a6129373ffc59114ca4c9b">logging.h</a>
  38.237 +</li>
  38.238 +<li>ucx_logger_info
  38.239 +: <a class="el" href="logging_8h.html#a98464d8d51376ce2716dcc4eca00d5da">logging.h</a>
  38.240 +</li>
  38.241 +<li>UCX_LOGGER_LEVEL
  38.242 +: <a class="el" href="logging_8h.html#aee18bc20e58ffb69910121512c350839">logging.h</a>
  38.243 +</li>
  38.244 +<li>ucx_logger_log
  38.245 +: <a class="el" href="logging_8h.html#aa0245325031d95799b28def177fd14ec">logging.h</a>
  38.246 +</li>
  38.247 +<li>ucx_logger_register_level
  38.248 +: <a class="el" href="logging_8h.html#a5cffc19502c4c90bfb3bd3bbcd18170a">logging.h</a>
  38.249 +</li>
  38.250 +<li>UCX_LOGGER_SOURCE
  38.251 +: <a class="el" href="logging_8h.html#a0e0d72b12616c1e49ff8834eaf4cb8a2">logging.h</a>
  38.252 +</li>
  38.253 +<li>UCX_LOGGER_TIMESTAMP
  38.254 +: <a class="el" href="logging_8h.html#a38607008268b4f776ee500fb95d2e823">logging.h</a>
  38.255 +</li>
  38.256 +<li>UCX_LOGGER_TRACE
  38.257 +: <a class="el" href="logging_8h.html#a55b88d1fec7036d841b3ddd6195c5586">logging.h</a>
  38.258 +</li>
  38.259 +<li>ucx_logger_trace
  38.260 +: <a class="el" href="logging_8h.html#a3031b7ff13f4cfae9c2916543be2877c">logging.h</a>
  38.261 +</li>
  38.262 +<li>UCX_LOGGER_WARN
  38.263 +: <a class="el" href="logging_8h.html#abd01ca11486226ba34e8f7028d9fffba">logging.h</a>
  38.264 +</li>
  38.265 +<li>ucx_logger_warn
  38.266 +: <a class="el" href="logging_8h.html#aca7bd861b646892813fd7310c0aa69af">logging.h</a>
  38.267 +</li>
  38.268 +<li>ucx_map_cstr_get
  38.269 +: <a class="el" href="map_8h.html#a64e1fb55498fa502dd2ed8ed69062cdd">map.h</a>
  38.270 +</li>
  38.271 +<li>ucx_map_cstr_put
  38.272 +: <a class="el" href="map_8h.html#ad9356b01425b934ab237b52339ac0cc3">map.h</a>
  38.273 +</li>
  38.274 +<li>ucx_map_cstr_remove
  38.275 +: <a class="el" href="map_8h.html#a9c4405a5a75ecf64e2ef3d0c6501a9fe">map.h</a>
  38.276 +</li>
  38.277 +<li>UCX_MAP_FOREACH
  38.278 +: <a class="el" href="map_8h.html#a940896c4aa1b13e54c55c04c3efc186b">map.h</a>
  38.279 +</li>
  38.280 +<li>ucx_map_int_get
  38.281 +: <a class="el" href="map_8h.html#aa1681bd2178553cd092fd24c4d681d3c">map.h</a>
  38.282 +</li>
  38.283 +<li>ucx_map_int_put
  38.284 +: <a class="el" href="map_8h.html#aaa30af79b4068c923895619e83f44367">map.h</a>
  38.285 +</li>
  38.286 +<li>ucx_map_int_remove
  38.287 +: <a class="el" href="map_8h.html#aa767958b5468737755c09f7185b1770c">map.h</a>
  38.288 +</li>
  38.289 +<li>ucx_map_sstr_get
  38.290 +: <a class="el" href="map_8h.html#a14d385f6b7f371f0507861cabd2eab4e">map.h</a>
  38.291 +</li>
  38.292 +<li>ucx_map_sstr_put
  38.293 +: <a class="el" href="map_8h.html#ac26a8615bfc8f47ee9eaceb47645f98e">map.h</a>
  38.294 +</li>
  38.295 +<li>ucx_map_sstr_remove
  38.296 +: <a class="el" href="map_8h.html#a48700ea86fadb9ea54d13010f9124df2">map.h</a>
  38.297 +</li>
  38.298 +<li>ucx_mempool_new_default
  38.299 +: <a class="el" href="mempool_8h.html#a49f7bd1da5ac201d0cf54dc0f0d82dd2">mempool.h</a>
  38.300 +</li>
  38.301 +<li>ucx_sprintf
  38.302 +: <a class="el" href="utils_8h.html#af9f333b66ecd639c347c7235f4992e2e">utils.h</a>
  38.303 +</li>
  38.304 +<li>ucx_stack_dim
  38.305 +: <a class="el" href="stack_8h.html#a3b761343c6491222604341ebfa443226">stack.h</a>
  38.306 +</li>
  38.307 +<li>ucx_stack_empty
  38.308 +: <a class="el" href="stack_8h.html#a4f7239dbd6c032c56812e370b71c1985">stack.h</a>
  38.309 +</li>
  38.310 +<li>ucx_stack_pop
  38.311 +: <a class="el" href="stack_8h.html#a506b82374734ec476d086ddfb561174d">stack.h</a>
  38.312 +</li>
  38.313 +<li>ucx_stack_topsize
  38.314 +: <a class="el" href="stack_8h.html#a030197051a803e87d5eeac5adb80b15a">stack.h</a>
  38.315 +</li>
  38.316 +<li>ucx_stream_bcopy
  38.317 +: <a class="el" href="utils_8h.html#a6003a1750a66234169bd1f8cc84b297b">utils.h</a>
  38.318 +</li>
  38.319 +<li>ucx_stream_copy
  38.320 +: <a class="el" href="utils_8h.html#a41ca1344f781c0d3bf7a414a6e811392">utils.h</a>
  38.321 +</li>
  38.322 +<li>UCX_STREAM_COPY_BUFSIZE
  38.323 +: <a class="el" href="utils_8h.html#a23efd74fa5f701d4cf26ccbfd138a439">utils.h</a>
  38.324 +</li>
  38.325 +<li>ucx_stream_ncopy
  38.326 +: <a class="el" href="utils_8h.html#add13f39a8af440b4f7e6f74339eaada2">utils.h</a>
  38.327 +</li>
  38.328 +<li>ucx_szmul
  38.329 +: <a class="el" href="ucx_8h.html#a0b5ed6c1a0b15356f4f948acfd32a4cc">ucx.h</a>
  38.330 +</li>
  38.331 +<li>UCX_TEST
  38.332 +: <a class="el" href="test_8h.html#a66cfb29c329fc9eaef071f2449836659">test.h</a>
  38.333 +</li>
  38.334 +<li>UCX_TEST_ASSERT
  38.335 +: <a class="el" href="test_8h.html#a08f477cd12fc3fe741a92493e5df58a9">test.h</a>
  38.336 +</li>
  38.337 +<li>UCX_TEST_BEGIN
  38.338 +: <a class="el" href="test_8h.html#a0547b8d4f3bcdb0633fdd8925e8aa5d4">test.h</a>
  38.339 +</li>
  38.340 +<li>UCX_TEST_CALL_SUBROUTINE
  38.341 +: <a class="el" href="test_8h.html#a0efbab91c54f5237a2ab207f48cf0e51">test.h</a>
  38.342 +</li>
  38.343 +<li>UCX_TEST_END
  38.344 +: <a class="el" href="test_8h.html#a86e64857c04f0447f8b16fb9c2b3b639">test.h</a>
  38.345 +</li>
  38.346 +<li>UCX_TEST_SUBROUTINE
  38.347 +: <a class="el" href="test_8h.html#ae073cf5ead22cb27d662da048e16f44a">test.h</a>
  38.348 +</li>
  38.349 +<li>UCX_VERSION
  38.350 +: <a class="el" href="ucx_8h.html#af12001920ca2fc1405615684e4dea284">ucx.h</a>
  38.351 +</li>
  38.352 +<li>UCX_VERSION_MAJOR
  38.353 +: <a class="el" href="ucx_8h.html#aa57e5dd22d42387d748cc16777df1383">ucx.h</a>
  38.354 +</li>
  38.355 +<li>UCX_VERSION_MINOR
  38.356 +: <a class="el" href="ucx_8h.html#a9ac10d6353e23d4615a87fc737c65eb0">ucx.h</a>
  38.357 +</li>
  38.358 +</ul>
  38.359 +</div><!-- contents -->
  38.360 +<!-- start footer part -->
  38.361 +<hr class="footer"/><address class="footer"><small>
  38.362 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  38.363 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  38.364 +</a> 1.8.13
  38.365 +</small></address>
  38.366 +</body>
  38.367 +</html>
    39.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    39.2 +++ b/docs/api-2.1/globals_func.html	Sat Feb 06 19:11:44 2021 +0100
    39.3 @@ -0,0 +1,174 @@
    39.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    39.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    39.6 +<head>
    39.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    39.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    39.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   39.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   39.11 +<title>ucx: Globals</title>
   39.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   39.13 +<script type="text/javascript" src="jquery.js"></script>
   39.14 +<script type="text/javascript" src="dynsections.js"></script>
   39.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   39.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   39.17 +<script type="text/javascript" src="search/search.js"></script>
   39.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   39.19 +</head>
   39.20 +<body>
   39.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   39.22 +<div id="titlearea">
   39.23 +<table cellspacing="0" cellpadding="0">
   39.24 + <tbody>
   39.25 + <tr style="height: 56px;">
   39.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   39.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   39.28 +   <div id="projectname">ucx
   39.29 +   </div>
   39.30 +   <div id="projectbrief">UAP Common Extensions</div>
   39.31 +  </td>
   39.32 + </tr>
   39.33 + </tbody>
   39.34 +</table>
   39.35 +</div>
   39.36 +<!-- end header part -->
   39.37 +<!-- Generated by Doxygen 1.8.13 -->
   39.38 +<script type="text/javascript">
   39.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   39.40 +</script>
   39.41 +<script type="text/javascript" src="menudata.js"></script>
   39.42 +<script type="text/javascript" src="menu.js"></script>
   39.43 +<script type="text/javascript">
   39.44 +$(function() {
   39.45 +  initMenu('',true,false,'search.php','Search');
   39.46 +  $(document).ready(function() { init_search(); });
   39.47 +});
   39.48 +</script>
   39.49 +<div id="main-nav"></div>
   39.50 +</div><!-- top -->
   39.51 +<!-- window showing the filter options -->
   39.52 +<div id="MSearchSelectWindow"
   39.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   39.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   39.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   39.56 +</div>
   39.57 +
   39.58 +<!-- iframe showing the search results (closed by default) -->
   39.59 +<div id="MSearchResultsWindow">
   39.60 +<iframe src="javascript:void(0)" frameborder="0" 
   39.61 +        name="MSearchResults" id="MSearchResults">
   39.62 +</iframe>
   39.63 +</div>
   39.64 +
   39.65 +<div class="contents">
   39.66 +&#160;
   39.67 +
   39.68 +<h3><a id="index_s"></a>- s -</h3><ul>
   39.69 +<li>scstr()
   39.70 +: <a class="el" href="string_8h.html#a2b1d6f1eca1c1549f37107b9c026c5a6">string.h</a>
   39.71 +</li>
   39.72 +<li>scstrcasecmp()
   39.73 +: <a class="el" href="string_8h.html#aca8142fb823d253054e17c17cfca05e0">string.h</a>
   39.74 +</li>
   39.75 +<li>scstrcaseprefix()
   39.76 +: <a class="el" href="string_8h.html#a3718ef4aa1e86cdb26bda2f07fb585df">string.h</a>
   39.77 +</li>
   39.78 +<li>scstrcasesuffix()
   39.79 +: <a class="el" href="string_8h.html#a6edb4b85f2b9efe79db7ffe6eccd7bc3">string.h</a>
   39.80 +</li>
   39.81 +<li>scstrcat()
   39.82 +: <a class="el" href="string_8h.html#a7376842c19e954b49215da81ef76ac0c">string.h</a>
   39.83 +</li>
   39.84 +<li>scstrcat_a()
   39.85 +: <a class="el" href="string_8h.html#abacce4cbd6f70fcb6453904ef08b02e9">string.h</a>
   39.86 +</li>
   39.87 +<li>scstrchr()
   39.88 +: <a class="el" href="string_8h.html#a5836d6a7a744791c35e5c17bdc394a87">string.h</a>
   39.89 +</li>
   39.90 +<li>scstrcmp()
   39.91 +: <a class="el" href="string_8h.html#af35272a8e5408c88ed3e25a3a98f0a82">string.h</a>
   39.92 +</li>
   39.93 +<li>scstrdup()
   39.94 +: <a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164">string.h</a>
   39.95 +</li>
   39.96 +<li>scstrdup_a()
   39.97 +: <a class="el" href="string_8h.html#a8fe58921f51eb1fde038472377e63014">string.h</a>
   39.98 +</li>
   39.99 +<li>scstrlower()
  39.100 +: <a class="el" href="string_8h.html#abccf198bea3186ff2abb080cc88dcae6">string.h</a>
  39.101 +</li>
  39.102 +<li>scstrlower_a()
  39.103 +: <a class="el" href="string_8h.html#a3cf1e557df7ab58d03c78832c4060276">string.h</a>
  39.104 +</li>
  39.105 +<li>scstrn()
  39.106 +: <a class="el" href="string_8h.html#ae594f6e222ea394cef6a26c0dfad000d">string.h</a>
  39.107 +</li>
  39.108 +<li>scstrnlen()
  39.109 +: <a class="el" href="string_8h.html#ac1b000030d6d197eec48c15a182055d5">string.h</a>
  39.110 +</li>
  39.111 +<li>scstrprefix()
  39.112 +: <a class="el" href="string_8h.html#a599ddc2f88dd1df68b72eefd91347393">string.h</a>
  39.113 +</li>
  39.114 +<li>scstrrchr()
  39.115 +: <a class="el" href="string_8h.html#ae389835b97cd9382e7d6a6a075323376">string.h</a>
  39.116 +</li>
  39.117 +<li>scstrscstr()
  39.118 +: <a class="el" href="string_8h.html#a54f256c3abe811c52d58b4ff1b23f051">string.h</a>
  39.119 +</li>
  39.120 +<li>scstrsplit()
  39.121 +: <a class="el" href="string_8h.html#ae71cac352b00230848bde358f0fb05ea">string.h</a>
  39.122 +</li>
  39.123 +<li>scstrsplit_a()
  39.124 +: <a class="el" href="string_8h.html#a52906455ae530c9cdc6812c8e6d9bdef">string.h</a>
  39.125 +</li>
  39.126 +<li>scstrsstr()
  39.127 +: <a class="el" href="string_8h.html#aa4362cb36c6629f9d8484739fd827748">string.h</a>
  39.128 +</li>
  39.129 +<li>scstrsubs()
  39.130 +: <a class="el" href="string_8h.html#a9a6c8d8db0dda0037c3c852cce1a5060">string.h</a>
  39.131 +</li>
  39.132 +<li>scstrsubsl()
  39.133 +: <a class="el" href="string_8h.html#ad50f0f67b906fad0744f46bcb51e144b">string.h</a>
  39.134 +</li>
  39.135 +<li>scstrsuffix()
  39.136 +: <a class="el" href="string_8h.html#a1f0ae316a2afe85d5b4655e6ece6721a">string.h</a>
  39.137 +</li>
  39.138 +<li>scstrtrim()
  39.139 +: <a class="el" href="string_8h.html#ad374b16eb1be8b48019debad9b9f268c">string.h</a>
  39.140 +</li>
  39.141 +<li>scstrupper()
  39.142 +: <a class="el" href="string_8h.html#af3dd09ec9d11162fe0075f4e60f41240">string.h</a>
  39.143 +</li>
  39.144 +<li>scstrupper_a()
  39.145 +: <a class="el" href="string_8h.html#aea94613eb74668cc05d365803d32bfad">string.h</a>
  39.146 +</li>
  39.147 +<li>sstr()
  39.148 +: <a class="el" href="string_8h.html#a539eb7059251a051ee5d179526a23e9a">string.h</a>
  39.149 +</li>
  39.150 +<li>sstrchr()
  39.151 +: <a class="el" href="string_8h.html#af80898a0b75955eb2579298c3ae2c481">string.h</a>
  39.152 +</li>
  39.153 +<li>sstrn()
  39.154 +: <a class="el" href="string_8h.html#a2744c38ac44abf3e01fa059056dcf36c">string.h</a>
  39.155 +</li>
  39.156 +<li>sstrrchr()
  39.157 +: <a class="el" href="string_8h.html#adae3f59957ca328e1da5285cb8b02a72">string.h</a>
  39.158 +</li>
  39.159 +<li>sstrsubs()
  39.160 +: <a class="el" href="string_8h.html#a5eb9e0e1f26cf7fbecc038cd90e8b258">string.h</a>
  39.161 +</li>
  39.162 +<li>sstrsubsl()
  39.163 +: <a class="el" href="string_8h.html#a78925c91af54f23cebd20ff99ef4331a">string.h</a>
  39.164 +</li>
  39.165 +<li>sstrtrim()
  39.166 +: <a class="el" href="string_8h.html#ae2d6da564d3fce51f2e0cac580fdbc56">string.h</a>
  39.167 +</li>
  39.168 +</ul>
  39.169 +</div><!-- contents -->
  39.170 +<!-- start footer part -->
  39.171 +<hr class="footer"/><address class="footer"><small>
  39.172 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  39.173 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  39.174 +</a> 1.8.13
  39.175 +</small></address>
  39.176 +</body>
  39.177 +</html>
    40.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    40.2 +++ b/docs/api-2.1/globals_func_u.html	Sat Feb 06 19:11:44 2021 +0100
    40.3 @@ -0,0 +1,621 @@
    40.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    40.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    40.6 +<head>
    40.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    40.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    40.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   40.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   40.11 +<title>ucx: Globals</title>
   40.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   40.13 +<script type="text/javascript" src="jquery.js"></script>
   40.14 +<script type="text/javascript" src="dynsections.js"></script>
   40.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   40.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   40.17 +<script type="text/javascript" src="search/search.js"></script>
   40.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   40.19 +</head>
   40.20 +<body>
   40.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   40.22 +<div id="titlearea">
   40.23 +<table cellspacing="0" cellpadding="0">
   40.24 + <tbody>
   40.25 + <tr style="height: 56px;">
   40.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   40.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   40.28 +   <div id="projectname">ucx
   40.29 +   </div>
   40.30 +   <div id="projectbrief">UAP Common Extensions</div>
   40.31 +  </td>
   40.32 + </tr>
   40.33 + </tbody>
   40.34 +</table>
   40.35 +</div>
   40.36 +<!-- end header part -->
   40.37 +<!-- Generated by Doxygen 1.8.13 -->
   40.38 +<script type="text/javascript">
   40.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   40.40 +</script>
   40.41 +<script type="text/javascript" src="menudata.js"></script>
   40.42 +<script type="text/javascript" src="menu.js"></script>
   40.43 +<script type="text/javascript">
   40.44 +$(function() {
   40.45 +  initMenu('',true,false,'search.php','Search');
   40.46 +  $(document).ready(function() { init_search(); });
   40.47 +});
   40.48 +</script>
   40.49 +<div id="main-nav"></div>
   40.50 +</div><!-- top -->
   40.51 +<!-- window showing the filter options -->
   40.52 +<div id="MSearchSelectWindow"
   40.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   40.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   40.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   40.56 +</div>
   40.57 +
   40.58 +<!-- iframe showing the search results (closed by default) -->
   40.59 +<div id="MSearchResultsWindow">
   40.60 +<iframe src="javascript:void(0)" frameborder="0" 
   40.61 +        name="MSearchResults" id="MSearchResults">
   40.62 +</iframe>
   40.63 +</div>
   40.64 +
   40.65 +<div class="contents">
   40.66 +&#160;
   40.67 +
   40.68 +<h3><a id="index_u"></a>- u -</h3><ul>
   40.69 +<li>ucx_array_append_from()
   40.70 +: <a class="el" href="array_8h.html#aea01731ad94ea73c0c8fb1d1b7a35fcf">array.h</a>
   40.71 +</li>
   40.72 +<li>ucx_array_at()
   40.73 +: <a class="el" href="array_8h.html#aa698085fd1a8b70d6b709999c51b49e8">array.h</a>
   40.74 +</li>
   40.75 +<li>ucx_array_clone()
   40.76 +: <a class="el" href="array_8h.html#a4a8c273370e4a3a3e2624e364f5ab410">array.h</a>
   40.77 +</li>
   40.78 +<li>ucx_array_concat()
   40.79 +: <a class="el" href="array_8h.html#aa5a0bf3d3f0df6406beb0e569021cc28">array.h</a>
   40.80 +</li>
   40.81 +<li>ucx_array_contains()
   40.82 +: <a class="el" href="array_8h.html#a5241058cd2329147bc5b1593ae7e51dc">array.h</a>
   40.83 +</li>
   40.84 +<li>ucx_array_destroy()
   40.85 +: <a class="el" href="array_8h.html#a8e83681d8d5d8cddbf10f63ce5be4c10">array.h</a>
   40.86 +</li>
   40.87 +<li>ucx_array_equals()
   40.88 +: <a class="el" href="array_8h.html#a43292b448adb1741677aa8c578bcc201">array.h</a>
   40.89 +</li>
   40.90 +<li>ucx_array_find()
   40.91 +: <a class="el" href="array_8h.html#ae7bdbed94afee9b20b38b95e3ab470f0">array.h</a>
   40.92 +</li>
   40.93 +<li>ucx_array_free()
   40.94 +: <a class="el" href="array_8h.html#ac01ee914468a16f470bf3071fffbe438">array.h</a>
   40.95 +</li>
   40.96 +<li>ucx_array_grow()
   40.97 +: <a class="el" href="array_8h.html#ab0cbf243824aaebee48277315e03afce">array.h</a>
   40.98 +</li>
   40.99 +<li>ucx_array_init()
  40.100 +: <a class="el" href="array_8h.html#ad921e85c28ffae32230777a53c5037e5">array.h</a>
  40.101 +</li>
  40.102 +<li>ucx_array_init_a()
  40.103 +: <a class="el" href="array_8h.html#a2451e61ebb15a7ba1c1319267ba75b8c">array.h</a>
  40.104 +</li>
  40.105 +<li>ucx_array_new()
  40.106 +: <a class="el" href="array_8h.html#a994a2fbf1c33a3833e2a70cd9a4352b7">array.h</a>
  40.107 +</li>
  40.108 +<li>ucx_array_new_a()
  40.109 +: <a class="el" href="array_8h.html#a177170258c215eb2e4f5a32e59f0cb1b">array.h</a>
  40.110 +</li>
  40.111 +<li>ucx_array_prepend_from()
  40.112 +: <a class="el" href="array_8h.html#a95b52acc2193b5c33cf0eaa4f2082477">array.h</a>
  40.113 +</li>
  40.114 +<li>ucx_array_remove()
  40.115 +: <a class="el" href="array_8h.html#aa45eac6b697f83adac81c0860cf306b8">array.h</a>
  40.116 +</li>
  40.117 +<li>ucx_array_remove_fast()
  40.118 +: <a class="el" href="array_8h.html#a548d81b07612bae3ba8c4c4b49104b8e">array.h</a>
  40.119 +</li>
  40.120 +<li>ucx_array_reserve()
  40.121 +: <a class="el" href="array_8h.html#a1c3bf8433c1de3c933f3854ab297fe1d">array.h</a>
  40.122 +</li>
  40.123 +<li>ucx_array_resize()
  40.124 +: <a class="el" href="array_8h.html#a27762e7c06a6c781015e3c8ceeee0ce3">array.h</a>
  40.125 +</li>
  40.126 +<li>ucx_array_set_from()
  40.127 +: <a class="el" href="array_8h.html#a1bb545d065358d265d80d815ba382a28">array.h</a>
  40.128 +</li>
  40.129 +<li>ucx_array_shrink()
  40.130 +: <a class="el" href="array_8h.html#a2daf50e80aee9bccebee876a7efd2dfc">array.h</a>
  40.131 +</li>
  40.132 +<li>ucx_array_sort()
  40.133 +: <a class="el" href="array_8h.html#add773514569b872a6624381b4b6af52c">array.h</a>
  40.134 +</li>
  40.135 +<li>ucx_array_util_set_a()
  40.136 +: <a class="el" href="array_8h.html#ad0a8d76980cf1c1910e64a245803fb9a">array.h</a>
  40.137 +</li>
  40.138 +<li>ucx_array_util_setptr_a()
  40.139 +: <a class="el" href="array_8h.html#ad708b333c0c1b02c998309a58ea65e31">array.h</a>
  40.140 +</li>
  40.141 +<li>ucx_asprintf()
  40.142 +: <a class="el" href="utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5">utils.h</a>
  40.143 +</li>
  40.144 +<li>ucx_avl_count()
  40.145 +: <a class="el" href="avl_8h.html#a92c1d41c2b22fe4a029a486ab2153e35">avl.h</a>
  40.146 +</li>
  40.147 +<li>ucx_avl_find()
  40.148 +: <a class="el" href="avl_8h.html#a51770e1614b28d7d22dea096c3704f83">avl.h</a>
  40.149 +</li>
  40.150 +<li>ucx_avl_find_node()
  40.151 +: <a class="el" href="avl_8h.html#a664986f64d6865605199fbff06e19cd5">avl.h</a>
  40.152 +</li>
  40.153 +<li>ucx_avl_free()
  40.154 +: <a class="el" href="avl_8h.html#a2f92db538f25fce908d2cb3e5590944c">avl.h</a>
  40.155 +</li>
  40.156 +<li>ucx_avl_free_content()
  40.157 +: <a class="el" href="avl_8h.html#a31ad7fb196ca211f1fc39f4e15f72279">avl.h</a>
  40.158 +</li>
  40.159 +<li>ucx_avl_get()
  40.160 +: <a class="el" href="avl_8h.html#adbcf7ceb3f014a30c7214f7304519efe">avl.h</a>
  40.161 +</li>
  40.162 +<li>ucx_avl_get_node()
  40.163 +: <a class="el" href="avl_8h.html#acf42da9a4168e47dc10b4ba0d27ceb4e">avl.h</a>
  40.164 +</li>
  40.165 +<li>ucx_avl_new()
  40.166 +: <a class="el" href="avl_8h.html#a11b043d65a11b7092d5d98b298e5ede3">avl.h</a>
  40.167 +</li>
  40.168 +<li>ucx_avl_new_a()
  40.169 +: <a class="el" href="avl_8h.html#af0f868d67e9dc08b4867c02a06c23ee2">avl.h</a>
  40.170 +</li>
  40.171 +<li>ucx_avl_pred()
  40.172 +: <a class="el" href="avl_8h.html#a0e739aeb66dda6a6a3f6eb51b50cf346">avl.h</a>
  40.173 +</li>
  40.174 +<li>ucx_avl_put()
  40.175 +: <a class="el" href="avl_8h.html#aec401fab4a24a7edffa734f9baf88577">avl.h</a>
  40.176 +</li>
  40.177 +<li>ucx_avl_put_s()
  40.178 +: <a class="el" href="avl_8h.html#a32cf8955cc0226a82bacfc7b76d6474c">avl.h</a>
  40.179 +</li>
  40.180 +<li>ucx_avl_remove()
  40.181 +: <a class="el" href="avl_8h.html#a1d821119c805d7fbb7e424bc3effeba9">avl.h</a>
  40.182 +</li>
  40.183 +<li>ucx_avl_remove_node()
  40.184 +: <a class="el" href="avl_8h.html#a9a792b7d9e58073deef74a341f8bc720">avl.h</a>
  40.185 +</li>
  40.186 +<li>ucx_avl_remove_s()
  40.187 +: <a class="el" href="avl_8h.html#a01aeeecd6415f0cc2b623486eb28f254">avl.h</a>
  40.188 +</li>
  40.189 +<li>ucx_avl_succ()
  40.190 +: <a class="el" href="avl_8h.html#aab1ad9b027ff5e50671aa0ee84e2d541">avl.h</a>
  40.191 +</li>
  40.192 +<li>ucx_buffer_eof()
  40.193 +: <a class="el" href="buffer_8h.html#abad7fd9ad5061224c780b8d1d4c55f09">buffer.h</a>
  40.194 +</li>
  40.195 +<li>ucx_buffer_extend()
  40.196 +: <a class="el" href="buffer_8h.html#afaf97d2cd7e9faad79a9d35fe33e30c6">buffer.h</a>
  40.197 +</li>
  40.198 +<li>ucx_buffer_extract()
  40.199 +: <a class="el" href="buffer_8h.html#a33fa7bb35fe08bbb3542f227514332ef">buffer.h</a>
  40.200 +</li>
  40.201 +<li>ucx_buffer_free()
  40.202 +: <a class="el" href="buffer_8h.html#a2af8646d8905c22c7322e7540b0440af">buffer.h</a>
  40.203 +</li>
  40.204 +<li>ucx_buffer_getc()
  40.205 +: <a class="el" href="buffer_8h.html#a396339022159ce4ca6d069de9f9209b0">buffer.h</a>
  40.206 +</li>
  40.207 +<li>ucx_buffer_new()
  40.208 +: <a class="el" href="buffer_8h.html#aacea876d692193ec6f859ce98da7351c">buffer.h</a>
  40.209 +</li>
  40.210 +<li>ucx_buffer_putc()
  40.211 +: <a class="el" href="buffer_8h.html#a7d6f01b9d631b0123475dfb98fb849ac">buffer.h</a>
  40.212 +</li>
  40.213 +<li>ucx_buffer_puts()
  40.214 +: <a class="el" href="buffer_8h.html#af1d4b478e04b3ae0bf30e7c2ea964ea2">buffer.h</a>
  40.215 +</li>
  40.216 +<li>ucx_buffer_read()
  40.217 +: <a class="el" href="buffer_8h.html#ae5c3430759f0059547b35d5a254d4da5">buffer.h</a>
  40.218 +</li>
  40.219 +<li>ucx_buffer_seek()
  40.220 +: <a class="el" href="buffer_8h.html#a47d98482662073c74f35deb0957d15d1">buffer.h</a>
  40.221 +</li>
  40.222 +<li>ucx_buffer_shift()
  40.223 +: <a class="el" href="buffer_8h.html#a12a0c6a2379ef080043e6286bb8bad69">buffer.h</a>
  40.224 +</li>
  40.225 +<li>ucx_buffer_shift_left()
  40.226 +: <a class="el" href="buffer_8h.html#a20431dd0ed6a6fe9f15333bd72afe4db">buffer.h</a>
  40.227 +</li>
  40.228 +<li>ucx_buffer_shift_right()
  40.229 +: <a class="el" href="buffer_8h.html#a4fa10b6471495547eb981248fd4f1bc2">buffer.h</a>
  40.230 +</li>
  40.231 +<li>ucx_buffer_write()
  40.232 +: <a class="el" href="buffer_8h.html#af8aacc7401814392b58c1b7b81bffc05">buffer.h</a>
  40.233 +</li>
  40.234 +<li>ucx_cmp_double()
  40.235 +: <a class="el" href="utils_8h.html#ab804b7c27d0bfcd7bf3a3583140825b6">utils.h</a>
  40.236 +</li>
  40.237 +<li>ucx_cmp_float()
  40.238 +: <a class="el" href="utils_8h.html#ad1196b561bcdad76c393885819769a97">utils.h</a>
  40.239 +</li>
  40.240 +<li>ucx_cmp_int()
  40.241 +: <a class="el" href="utils_8h.html#a8ce7e11e6b3deafe89a32a091fde7f16">utils.h</a>
  40.242 +</li>
  40.243 +<li>ucx_cmp_int16()
  40.244 +: <a class="el" href="utils_8h.html#aa29e6e559946375e34113e34e0b0bd0d">utils.h</a>
  40.245 +</li>
  40.246 +<li>ucx_cmp_int32()
  40.247 +: <a class="el" href="utils_8h.html#a858b2ac443fb202643b71f6a7e9218dd">utils.h</a>
  40.248 +</li>
  40.249 +<li>ucx_cmp_int64()
  40.250 +: <a class="el" href="utils_8h.html#a54701aea6a89fed1402dfb0bf56bc7f6">utils.h</a>
  40.251 +</li>
  40.252 +<li>ucx_cmp_longint()
  40.253 +: <a class="el" href="utils_8h.html#aeb57a2b9a6aaa0460c7a6bec29accf2c">utils.h</a>
  40.254 +</li>
  40.255 +<li>ucx_cmp_longlong()
  40.256 +: <a class="el" href="utils_8h.html#a366b57def20f86a41eaedf575eea5375">utils.h</a>
  40.257 +</li>
  40.258 +<li>ucx_cmp_mem()
  40.259 +: <a class="el" href="utils_8h.html#aff7d2bcded71196831a8c0664333f8e7">utils.h</a>
  40.260 +</li>
  40.261 +<li>ucx_cmp_ptr()
  40.262 +: <a class="el" href="utils_8h.html#aa174d539de3ea59be4f9640f17ce53d8">utils.h</a>
  40.263 +</li>
  40.264 +<li>ucx_cmp_sstr()
  40.265 +: <a class="el" href="utils_8h.html#adee0739589166d272f8cb7c23aabf8ba">utils.h</a>
  40.266 +</li>
  40.267 +<li>ucx_cmp_str()
  40.268 +: <a class="el" href="utils_8h.html#aa6a37b9d172b6a5b2803d152f9e1b258">utils.h</a>
  40.269 +</li>
  40.270 +<li>ucx_cmp_strn()
  40.271 +: <a class="el" href="utils_8h.html#ac6b354a878f551a3a5b20a167db3f308">utils.h</a>
  40.272 +</li>
  40.273 +<li>ucx_cmp_uint()
  40.274 +: <a class="el" href="utils_8h.html#abd83a5da91c3dd026a6931bd80c12f1e">utils.h</a>
  40.275 +</li>
  40.276 +<li>ucx_cmp_uint16()
  40.277 +: <a class="el" href="utils_8h.html#acde5366437e886a459b7468f7a9e11f0">utils.h</a>
  40.278 +</li>
  40.279 +<li>ucx_cmp_uint32()
  40.280 +: <a class="el" href="utils_8h.html#a5879d1722330355914d8c9146fa549d3">utils.h</a>
  40.281 +</li>
  40.282 +<li>ucx_cmp_uint64()
  40.283 +: <a class="el" href="utils_8h.html#a1572a78b5b42f7151a5b2a5a7283d62d">utils.h</a>
  40.284 +</li>
  40.285 +<li>ucx_cmp_ulongint()
  40.286 +: <a class="el" href="utils_8h.html#a3f3cbae2594d6f722bae29acb0408a24">utils.h</a>
  40.287 +</li>
  40.288 +<li>ucx_cmp_ulonglong()
  40.289 +: <a class="el" href="utils_8h.html#a6acfc359421f21f9a042a654ff7faac5">utils.h</a>
  40.290 +</li>
  40.291 +<li>ucx_default_allocator()
  40.292 +: <a class="el" href="allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf">allocator.h</a>
  40.293 +</li>
  40.294 +<li>ucx_default_calloc()
  40.295 +: <a class="el" href="allocator_8h.html#a3a0bfdd13d887012309c459b339f338f">allocator.h</a>
  40.296 +</li>
  40.297 +<li>ucx_default_free()
  40.298 +: <a class="el" href="allocator_8h.html#a646d83aaaadfe33ae414c0fad8bfc52a">allocator.h</a>
  40.299 +</li>
  40.300 +<li>ucx_default_malloc()
  40.301 +: <a class="el" href="allocator_8h.html#a96403ebf3d2312d95f2fe7627a1cdbc0">allocator.h</a>
  40.302 +</li>
  40.303 +<li>ucx_default_realloc()
  40.304 +: <a class="el" href="allocator_8h.html#a47cfc8af626a86fcb93a2b14b90498ed">allocator.h</a>
  40.305 +</li>
  40.306 +<li>ucx_dist_int()
  40.307 +: <a class="el" href="utils_8h.html#a4ab6753739d56c09cdf6079fdcabf7c6">utils.h</a>
  40.308 +</li>
  40.309 +<li>ucx_dist_int16()
  40.310 +: <a class="el" href="utils_8h.html#a81fb8434b70ca11bf2c14abfa21d16a9">utils.h</a>
  40.311 +</li>
  40.312 +<li>ucx_dist_int32()
  40.313 +: <a class="el" href="utils_8h.html#ab4a659cc46096f0490c1dafa57726476">utils.h</a>
  40.314 +</li>
  40.315 +<li>ucx_dist_int64()
  40.316 +: <a class="el" href="utils_8h.html#a54e7d06585bad3a899befc4e9c13853f">utils.h</a>
  40.317 +</li>
  40.318 +<li>ucx_dist_longint()
  40.319 +: <a class="el" href="utils_8h.html#a43e73d288b1553a0078bf4c98dd341f5">utils.h</a>
  40.320 +</li>
  40.321 +<li>ucx_dist_longlong()
  40.322 +: <a class="el" href="utils_8h.html#a306778414a2427951ea263be92368627">utils.h</a>
  40.323 +</li>
  40.324 +<li>ucx_dist_uint()
  40.325 +: <a class="el" href="utils_8h.html#a37b7d471ca1679992afc11a0deda45f4">utils.h</a>
  40.326 +</li>
  40.327 +<li>ucx_dist_uint16()
  40.328 +: <a class="el" href="utils_8h.html#a66e00a0703cbcde050ec922578e2f080">utils.h</a>
  40.329 +</li>
  40.330 +<li>ucx_dist_uint32()
  40.331 +: <a class="el" href="utils_8h.html#add2b5c5507caba59d894b84e056b079b">utils.h</a>
  40.332 +</li>
  40.333 +<li>ucx_dist_uint64()
  40.334 +: <a class="el" href="utils_8h.html#a3ba75e2e0b2479eef2b22fb219b42da7">utils.h</a>
  40.335 +</li>
  40.336 +<li>ucx_dist_ulongint()
  40.337 +: <a class="el" href="utils_8h.html#abb13476228d0c16bfaba08469adbae2d">utils.h</a>
  40.338 +</li>
  40.339 +<li>ucx_dist_ulonglong()
  40.340 +: <a class="el" href="utils_8h.html#a59a5859272cb4b43cbdd58208c41e32b">utils.h</a>
  40.341 +</li>
  40.342 +<li>ucx_fprintf()
  40.343 +: <a class="el" href="utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a">utils.h</a>
  40.344 +</li>
  40.345 +<li>ucx_hash()
  40.346 +: <a class="el" href="map_8h.html#aea3be97254c05595d986ef6a9faae87b">map.h</a>
  40.347 +</li>
  40.348 +<li>ucx_key()
  40.349 +: <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">map.h</a>
  40.350 +</li>
  40.351 +<li>ucx_list_append()
  40.352 +: <a class="el" href="list_8h.html#a00c122c8a26d35b60676939df4161621">list.h</a>
  40.353 +</li>
  40.354 +<li>ucx_list_append_a()
  40.355 +: <a class="el" href="list_8h.html#adf3b3e2e0ff977d8928671d6bd82fc60">list.h</a>
  40.356 +</li>
  40.357 +<li>ucx_list_clone()
  40.358 +: <a class="el" href="list_8h.html#ae7054a41c289b24e6caf5cb07ac850ed">list.h</a>
  40.359 +</li>
  40.360 +<li>ucx_list_clone_a()
  40.361 +: <a class="el" href="list_8h.html#a08ca1ba0d2e82258b0408714c1f4c425">list.h</a>
  40.362 +</li>
  40.363 +<li>ucx_list_concat()
  40.364 +: <a class="el" href="list_8h.html#a77163a0cc82fae52bec26c8c0c3674d9">list.h</a>
  40.365 +</li>
  40.366 +<li>ucx_list_contains()
  40.367 +: <a class="el" href="list_8h.html#a8b0fa051fcfe12e1a82cca1087973852">list.h</a>
  40.368 +</li>
  40.369 +<li>ucx_list_difference()
  40.370 +: <a class="el" href="list_8h.html#a6c5db5d1d11ad28b6fe1a80ee1c1e449">list.h</a>
  40.371 +</li>
  40.372 +<li>ucx_list_difference_a()
  40.373 +: <a class="el" href="list_8h.html#a4a2a2fc5cc41073c516db6235bbc51d5">list.h</a>
  40.374 +</li>
  40.375 +<li>ucx_list_equals()
  40.376 +: <a class="el" href="list_8h.html#adc435447cecf885bc63d232191085bbe">list.h</a>
  40.377 +</li>
  40.378 +<li>ucx_list_find()
  40.379 +: <a class="el" href="list_8h.html#a9b3b6842d3be572e06a7f519e198cb83">list.h</a>
  40.380 +</li>
  40.381 +<li>ucx_list_first()
  40.382 +: <a class="el" href="list_8h.html#a6aa0e34ebc5f0dca6f52d0f7626b4bd5">list.h</a>
  40.383 +</li>
  40.384 +<li>ucx_list_free()
  40.385 +: <a class="el" href="list_8h.html#a1a0fa2c5b1e478a96da19b0c3f013668">list.h</a>
  40.386 +</li>
  40.387 +<li>ucx_list_free_a()
  40.388 +: <a class="el" href="list_8h.html#a944e11f76c38767cd1100d72a4e3b25b">list.h</a>
  40.389 +</li>
  40.390 +<li>ucx_list_free_content()
  40.391 +: <a class="el" href="list_8h.html#a4ba6c96642f72ea046cc22627c72979c">list.h</a>
  40.392 +</li>
  40.393 +<li>ucx_list_get()
  40.394 +: <a class="el" href="list_8h.html#a2509ffe19bce6a8708c77f89480c75fb">list.h</a>
  40.395 +</li>
  40.396 +<li>ucx_list_indexof()
  40.397 +: <a class="el" href="list_8h.html#ae2ff2974812ca185870f80bc4ed9337e">list.h</a>
  40.398 +</li>
  40.399 +<li>ucx_list_intersection()
  40.400 +: <a class="el" href="list_8h.html#a259f9b754978aeca23dfabba16e20f39">list.h</a>
  40.401 +</li>
  40.402 +<li>ucx_list_intersection_a()
  40.403 +: <a class="el" href="list_8h.html#a1d0b00514dbb81ba6270b58da0c5b9a8">list.h</a>
  40.404 +</li>
  40.405 +<li>ucx_list_last()
  40.406 +: <a class="el" href="list_8h.html#add5ec40c5006e29c629d23c2eb5a6553">list.h</a>
  40.407 +</li>
  40.408 +<li>ucx_list_prepend()
  40.409 +: <a class="el" href="list_8h.html#a8fcb68e4556395b15180eec2d0b77aa4">list.h</a>
  40.410 +</li>
  40.411 +<li>ucx_list_prepend_a()
  40.412 +: <a class="el" href="list_8h.html#a54654e6dc60e1c3de9e886c150e404ec">list.h</a>
  40.413 +</li>
  40.414 +<li>ucx_list_remove()
  40.415 +: <a class="el" href="list_8h.html#a410cb3e8260037ba56c72d14b899b468">list.h</a>
  40.416 +</li>
  40.417 +<li>ucx_list_remove_a()
  40.418 +: <a class="el" href="list_8h.html#aca687b7c4e7170175f447e549125aa52">list.h</a>
  40.419 +</li>
  40.420 +<li>ucx_list_size()
  40.421 +: <a class="el" href="list_8h.html#ae88001cc8ae40b946560f31434abed8f">list.h</a>
  40.422 +</li>
  40.423 +<li>ucx_list_sort()
  40.424 +: <a class="el" href="list_8h.html#ac74962d9bd7cfc9d3e2e09651469377b">list.h</a>
  40.425 +</li>
  40.426 +<li>ucx_list_union()
  40.427 +: <a class="el" href="list_8h.html#a94ecdb0cea1633ad7074f027fa8485fa">list.h</a>
  40.428 +</li>
  40.429 +<li>ucx_list_union_a()
  40.430 +: <a class="el" href="list_8h.html#a65b4355536f4ebc4130211b46469f4c1">list.h</a>
  40.431 +</li>
  40.432 +<li>ucx_logger_free()
  40.433 +: <a class="el" href="logging_8h.html#ac4697b784e01ec990d2acea192e21658">logging.h</a>
  40.434 +</li>
  40.435 +<li>ucx_logger_logf()
  40.436 +: <a class="el" href="logging_8h.html#ac337e5d02ebea565012d4c11bd643801">logging.h</a>
  40.437 +</li>
  40.438 +<li>ucx_logger_new()
  40.439 +: <a class="el" href="logging_8h.html#ac560f8517d2172794c9d2691735ec48c">logging.h</a>
  40.440 +</li>
  40.441 +<li>ucx_map_clear()
  40.442 +: <a class="el" href="map_8h.html#a285e90e40681c6d9631c935dda0967f2">map.h</a>
  40.443 +</li>
  40.444 +<li>ucx_map_clone()
  40.445 +: <a class="el" href="map_8h.html#a62c6c30cbb0d824ba710f5030ff9a4e4">map.h</a>
  40.446 +</li>
  40.447 +<li>ucx_map_clone_a()
  40.448 +: <a class="el" href="map_8h.html#a9aea9103703d5c168420bb6bf85549ea">map.h</a>
  40.449 +</li>
  40.450 +<li>ucx_map_copy()
  40.451 +: <a class="el" href="map_8h.html#adfeb2d61003fd2896bcfdc9a57f36425">map.h</a>
  40.452 +</li>
  40.453 +<li>ucx_map_difference()
  40.454 +: <a class="el" href="map_8h.html#a774fcff87d1e58b6c5af77dd19a8c3dc">map.h</a>
  40.455 +</li>
  40.456 +<li>ucx_map_difference_a()
  40.457 +: <a class="el" href="map_8h.html#ad0ba103494247d798ac3037c50fc8831">map.h</a>
  40.458 +</li>
  40.459 +<li>ucx_map_free()
  40.460 +: <a class="el" href="map_8h.html#abe3d9688e4224bf7bb962abf25ff8c2e">map.h</a>
  40.461 +</li>
  40.462 +<li>ucx_map_free_content()
  40.463 +: <a class="el" href="map_8h.html#a750f3d9d83e2f3788a14c17a9d160618">map.h</a>
  40.464 +</li>
  40.465 +<li>ucx_map_get()
  40.466 +: <a class="el" href="map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6">map.h</a>
  40.467 +</li>
  40.468 +<li>ucx_map_intersection()
  40.469 +: <a class="el" href="map_8h.html#aa594d7a5afebc3bed6bb265348cf6b0d">map.h</a>
  40.470 +</li>
  40.471 +<li>ucx_map_intersection_a()
  40.472 +: <a class="el" href="map_8h.html#a169e0470a20484dd76425fdf77e3651e">map.h</a>
  40.473 +</li>
  40.474 +<li>ucx_map_iter_next()
  40.475 +: <a class="el" href="map_8h.html#aceb8675abf44860b4bbc301bbada5b91">map.h</a>
  40.476 +</li>
  40.477 +<li>ucx_map_iterator()
  40.478 +: <a class="el" href="map_8h.html#a9150e9c64fdf4dfcc2cad106b91aa110">map.h</a>
  40.479 +</li>
  40.480 +<li>ucx_map_new()
  40.481 +: <a class="el" href="map_8h.html#a79f31de8b93814493759dbc8b940cf0c">map.h</a>
  40.482 +</li>
  40.483 +<li>ucx_map_new_a()
  40.484 +: <a class="el" href="map_8h.html#aed508a94c66cc15372503c64b70eb03e">map.h</a>
  40.485 +</li>
  40.486 +<li>ucx_map_put()
  40.487 +: <a class="el" href="map_8h.html#ac04a08b604217070254d4c58f0e82498">map.h</a>
  40.488 +</li>
  40.489 +<li>ucx_map_rehash()
  40.490 +: <a class="el" href="map_8h.html#a174bce9fad554dd92b8da354e0d32512">map.h</a>
  40.491 +</li>
  40.492 +<li>ucx_map_remove()
  40.493 +: <a class="el" href="map_8h.html#a17248a4888eb8f9ae18be522d64632aa">map.h</a>
  40.494 +</li>
  40.495 +<li>ucx_map_union()
  40.496 +: <a class="el" href="map_8h.html#a3f65978c481af7f637cad021d93522d5">map.h</a>
  40.497 +</li>
  40.498 +<li>ucx_map_union_a()
  40.499 +: <a class="el" href="map_8h.html#ab6370c3fa8113fdad593ce4b0460c9c6">map.h</a>
  40.500 +</li>
  40.501 +<li>ucx_memcpy()
  40.502 +: <a class="el" href="utils_8h.html#ab2e184e6a744941aab6b8058116baf30">utils.h</a>
  40.503 +</li>
  40.504 +<li>ucx_mempool_calloc()
  40.505 +: <a class="el" href="mempool_8h.html#a4b9142011824ae24f00fabe128417d69">mempool.h</a>
  40.506 +</li>
  40.507 +<li>ucx_mempool_chcap()
  40.508 +: <a class="el" href="mempool_8h.html#aaf75b5016098723a9280531ccc3a6d77">mempool.h</a>
  40.509 +</li>
  40.510 +<li>ucx_mempool_destroy()
  40.511 +: <a class="el" href="mempool_8h.html#af096378da7e9bfbed3088497cf4c15bf">mempool.h</a>
  40.512 +</li>
  40.513 +<li>ucx_mempool_free()
  40.514 +: <a class="el" href="mempool_8h.html#aefa26e3015f5aefadbfc74221bd246ac">mempool.h</a>
  40.515 +</li>
  40.516 +<li>ucx_mempool_malloc()
  40.517 +: <a class="el" href="mempool_8h.html#a2ae492b8f2878ccc9837ac213dced11e">mempool.h</a>
  40.518 +</li>
  40.519 +<li>ucx_mempool_new()
  40.520 +: <a class="el" href="mempool_8h.html#ad71cb8c3b6fdb30360376a8b372ef22a">mempool.h</a>
  40.521 +</li>
  40.522 +<li>ucx_mempool_realloc()
  40.523 +: <a class="el" href="mempool_8h.html#a660ef42520ed6737c2e77aae18e3a7a4">mempool.h</a>
  40.524 +</li>
  40.525 +<li>ucx_mempool_reg_destr()
  40.526 +: <a class="el" href="mempool_8h.html#af47b6b7c40f8f263dc28cc9a4e77b27c">mempool.h</a>
  40.527 +</li>
  40.528 +<li>ucx_mempool_set_destr()
  40.529 +: <a class="el" href="mempool_8h.html#adb788e7ec24cd7dbdea6381539c549f2">mempool.h</a>
  40.530 +</li>
  40.531 +<li>ucx_properties2map()
  40.532 +: <a class="el" href="properties_8h.html#a5c7ff8bc3139960a3f3dc92072b742f3">properties.h</a>
  40.533 +</li>
  40.534 +<li>ucx_properties_fill()
  40.535 +: <a class="el" href="properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d">properties.h</a>
  40.536 +</li>
  40.537 +<li>ucx_properties_free()
  40.538 +: <a class="el" href="properties_8h.html#a38a2fe7bb2986bd87c7e69356ab05c05">properties.h</a>
  40.539 +</li>
  40.540 +<li>ucx_properties_load()
  40.541 +: <a class="el" href="properties_8h.html#ae1b600f839a6b2278b68fc314981a8a3">properties.h</a>
  40.542 +</li>
  40.543 +<li>ucx_properties_new()
  40.544 +: <a class="el" href="properties_8h.html#a44d9dd12cab3aaa0084f1c8b89405796">properties.h</a>
  40.545 +</li>
  40.546 +<li>ucx_properties_next()
  40.547 +: <a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c">properties.h</a>
  40.548 +</li>
  40.549 +<li>ucx_properties_store()
  40.550 +: <a class="el" href="properties_8h.html#a63c0c1b7648e675b21a1788917ff36fb">properties.h</a>
  40.551 +</li>
  40.552 +<li>ucx_sc2sc()
  40.553 +: <a class="el" href="string_8h.html#a69d5e3eeec783cc43314df71248768f5">string.h</a>
  40.554 +</li>
  40.555 +<li>ucx_ss2c_s()
  40.556 +: <a class="el" href="string_8h.html#aedeb5d7bddda54116101a8d68af8c56d">string.h</a>
  40.557 +</li>
  40.558 +<li>ucx_ss2sc()
  40.559 +: <a class="el" href="string_8h.html#a9ce5ad1b2aa2dbeba204d452c2e64359">string.h</a>
  40.560 +</li>
  40.561 +<li>ucx_stack_avail()
  40.562 +: <a class="el" href="stack_8h.html#a53cd2c7743dc8ad9cbd35ade0b4873e7">stack.h</a>
  40.563 +</li>
  40.564 +<li>ucx_stack_calloc()
  40.565 +: <a class="el" href="stack_8h.html#afdc467524b5e19a9a777c6bc03e17174">stack.h</a>
  40.566 +</li>
  40.567 +<li>ucx_stack_free()
  40.568 +: <a class="el" href="stack_8h.html#aabd55c14a3866b3782ba324f4d8b4c41">stack.h</a>
  40.569 +</li>
  40.570 +<li>ucx_stack_init()
  40.571 +: <a class="el" href="stack_8h.html#abaef685df4e7ef95cd7218984a0618fe">stack.h</a>
  40.572 +</li>
  40.573 +<li>ucx_stack_malloc()
  40.574 +: <a class="el" href="stack_8h.html#af865b416802140f6b6e8ab3626d7d1ac">stack.h</a>
  40.575 +</li>
  40.576 +<li>ucx_stack_popn()
  40.577 +: <a class="el" href="stack_8h.html#a07ea48f28eab474dcfefbb86fa66ef81">stack.h</a>
  40.578 +</li>
  40.579 +<li>ucx_stack_push()
  40.580 +: <a class="el" href="stack_8h.html#af85e6f77a8341beb6188f9ae1a8e9f92">stack.h</a>
  40.581 +</li>
  40.582 +<li>ucx_stack_pusharr()
  40.583 +: <a class="el" href="stack_8h.html#a7bb138979191bba138e76ea37488fae2">stack.h</a>
  40.584 +</li>
  40.585 +<li>ucx_stack_realloc()
  40.586 +: <a class="el" href="stack_8h.html#a0c678f96f6fabab49b2b034a1fe91c3a">stack.h</a>
  40.587 +</li>
  40.588 +<li>ucx_strcpy()
  40.589 +: <a class="el" href="utils_8h.html#adeb6e8d0a53a829207cfa0a979d01fff">utils.h</a>
  40.590 +</li>
  40.591 +<li>ucx_stream_bncopy()
  40.592 +: <a class="el" href="utils_8h.html#a114ee7f7da62656ffd35e2dc23394201">utils.h</a>
  40.593 +</li>
  40.594 +<li>ucx_szmul_impl()
  40.595 +: <a class="el" href="ucx_8h.html#a6637171cc0ec097b297f731a3036dd3b">ucx.h</a>
  40.596 +</li>
  40.597 +<li>ucx_test_register()
  40.598 +: <a class="el" href="test_8h.html#a8dfabc42f183d3a4d79379a5d17bf67d">test.h</a>
  40.599 +</li>
  40.600 +<li>ucx_test_run()
  40.601 +: <a class="el" href="test_8h.html#a3721458deeecb43aa322428f007714c3">test.h</a>
  40.602 +</li>
  40.603 +<li>ucx_test_suite_free()
  40.604 +: <a class="el" href="test_8h.html#a4a6ac61a6f72722273f8eaa7a343edde">test.h</a>
  40.605 +</li>
  40.606 +<li>ucx_test_suite_new()
  40.607 +: <a class="el" href="test_8h.html#a531f0df90363e0befbe900878f65f09e">test.h</a>
  40.608 +</li>
  40.609 +<li>ucx_vasprintf()
  40.610 +: <a class="el" href="utils_8h.html#a3ea1dfb856c741f3e8ec6bfdc9ad427e">utils.h</a>
  40.611 +</li>
  40.612 +<li>ucx_vfprintf()
  40.613 +: <a class="el" href="utils_8h.html#a4907967beb92c3ae351dd239abbb6927">utils.h</a>
  40.614 +</li>
  40.615 +</ul>
  40.616 +</div><!-- contents -->
  40.617 +<!-- start footer part -->
  40.618 +<hr class="footer"/><address class="footer"><small>
  40.619 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  40.620 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  40.621 +</a> 1.8.13
  40.622 +</small></address>
  40.623 +</body>
  40.624 +</html>
    41.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    41.2 +++ b/docs/api-2.1/globals_p.html	Sat Feb 06 19:11:44 2021 +0100
    41.3 @@ -0,0 +1,78 @@
    41.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    41.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    41.6 +<head>
    41.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    41.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    41.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   41.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   41.11 +<title>ucx: Globals</title>
   41.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   41.13 +<script type="text/javascript" src="jquery.js"></script>
   41.14 +<script type="text/javascript" src="dynsections.js"></script>
   41.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   41.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   41.17 +<script type="text/javascript" src="search/search.js"></script>
   41.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   41.19 +</head>
   41.20 +<body>
   41.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   41.22 +<div id="titlearea">
   41.23 +<table cellspacing="0" cellpadding="0">
   41.24 + <tbody>
   41.25 + <tr style="height: 56px;">
   41.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   41.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   41.28 +   <div id="projectname">ucx
   41.29 +   </div>
   41.30 +   <div id="projectbrief">UAP Common Extensions</div>
   41.31 +  </td>
   41.32 + </tr>
   41.33 + </tbody>
   41.34 +</table>
   41.35 +</div>
   41.36 +<!-- end header part -->
   41.37 +<!-- Generated by Doxygen 1.8.13 -->
   41.38 +<script type="text/javascript">
   41.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   41.40 +</script>
   41.41 +<script type="text/javascript" src="menudata.js"></script>
   41.42 +<script type="text/javascript" src="menu.js"></script>
   41.43 +<script type="text/javascript">
   41.44 +$(function() {
   41.45 +  initMenu('',true,false,'search.php','Search');
   41.46 +  $(document).ready(function() { init_search(); });
   41.47 +});
   41.48 +</script>
   41.49 +<div id="main-nav"></div>
   41.50 +</div><!-- top -->
   41.51 +<!-- window showing the filter options -->
   41.52 +<div id="MSearchSelectWindow"
   41.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   41.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   41.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   41.56 +</div>
   41.57 +
   41.58 +<!-- iframe showing the search results (closed by default) -->
   41.59 +<div id="MSearchResultsWindow">
   41.60 +<iframe src="javascript:void(0)" frameborder="0" 
   41.61 +        name="MSearchResults" id="MSearchResults">
   41.62 +</iframe>
   41.63 +</div>
   41.64 +
   41.65 +<div class="contents">
   41.66 +<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
   41.67 +
   41.68 +<h3><a id="index_p"></a>- p -</h3><ul>
   41.69 +<li>PRIsstr
   41.70 +: <a class="el" href="string_8h.html#a7d5bc48708405a28b23667e32dfcecae">string.h</a>
   41.71 +</li>
   41.72 +</ul>
   41.73 +</div><!-- contents -->
   41.74 +<!-- start footer part -->
   41.75 +<hr class="footer"/><address class="footer"><small>
   41.76 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
   41.77 +<img class="footer" src="doxygen.png" alt="doxygen"/>
   41.78 +</a> 1.8.13
   41.79 +</small></address>
   41.80 +</body>
   41.81 +</html>
    42.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    42.2 +++ b/docs/api-2.1/globals_r.html	Sat Feb 06 19:11:44 2021 +0100
    42.3 @@ -0,0 +1,78 @@
    42.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    42.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    42.6 +<head>
    42.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    42.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    42.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   42.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   42.11 +<title>ucx: Globals</title>
   42.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   42.13 +<script type="text/javascript" src="jquery.js"></script>
   42.14 +<script type="text/javascript" src="dynsections.js"></script>
   42.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   42.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   42.17 +<script type="text/javascript" src="search/search.js"></script>
   42.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   42.19 +</head>
   42.20 +<body>
   42.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   42.22 +<div id="titlearea">
   42.23 +<table cellspacing="0" cellpadding="0">
   42.24 + <tbody>
   42.25 + <tr style="height: 56px;">
   42.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   42.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   42.28 +   <div id="projectname">ucx
   42.29 +   </div>
   42.30 +   <div id="projectbrief">UAP Common Extensions</div>
   42.31 +  </td>
   42.32 + </tr>
   42.33 + </tbody>
   42.34 +</table>
   42.35 +</div>
   42.36 +<!-- end header part -->
   42.37 +<!-- Generated by Doxygen 1.8.13 -->
   42.38 +<script type="text/javascript">
   42.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   42.40 +</script>
   42.41 +<script type="text/javascript" src="menudata.js"></script>
   42.42 +<script type="text/javascript" src="menu.js"></script>
   42.43 +<script type="text/javascript">
   42.44 +$(function() {
   42.45 +  initMenu('',true,false,'search.php','Search');
   42.46 +  $(document).ready(function() { init_search(); });
   42.47 +});
   42.48 +</script>
   42.49 +<div id="main-nav"></div>
   42.50 +</div><!-- top -->
   42.51 +<!-- window showing the filter options -->
   42.52 +<div id="MSearchSelectWindow"
   42.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   42.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   42.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   42.56 +</div>
   42.57 +
   42.58 +<!-- iframe showing the search results (closed by default) -->
   42.59 +<div id="MSearchResultsWindow">
   42.60 +<iframe src="javascript:void(0)" frameborder="0" 
   42.61 +        name="MSearchResults" id="MSearchResults">
   42.62 +</iframe>
   42.63 +</div>
   42.64 +
   42.65 +<div class="contents">
   42.66 +<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
   42.67 +
   42.68 +<h3><a id="index_r"></a>- r -</h3><ul>
   42.69 +<li>read_func
   42.70 +: <a class="el" href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">ucx.h</a>
   42.71 +</li>
   42.72 +</ul>
   42.73 +</div><!-- contents -->
   42.74 +<!-- start footer part -->
   42.75 +<hr class="footer"/><address class="footer"><small>
   42.76 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
   42.77 +<img class="footer" src="doxygen.png" alt="doxygen"/>
   42.78 +</a> 1.8.13
   42.79 +</small></address>
   42.80 +</body>
   42.81 +</html>
    43.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    43.2 +++ b/docs/api-2.1/globals_s.html	Sat Feb 06 19:11:44 2021 +0100
    43.3 @@ -0,0 +1,246 @@
    43.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    43.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    43.6 +<head>
    43.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    43.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    43.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   43.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   43.11 +<title>ucx: Globals</title>
   43.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   43.13 +<script type="text/javascript" src="jquery.js"></script>
   43.14 +<script type="text/javascript" src="dynsections.js"></script>
   43.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   43.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   43.17 +<script type="text/javascript" src="search/search.js"></script>
   43.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   43.19 +</head>
   43.20 +<body>
   43.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   43.22 +<div id="titlearea">
   43.23 +<table cellspacing="0" cellpadding="0">
   43.24 + <tbody>
   43.25 + <tr style="height: 56px;">
   43.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   43.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   43.28 +   <div id="projectname">ucx
   43.29 +   </div>
   43.30 +   <div id="projectbrief">UAP Common Extensions</div>
   43.31 +  </td>
   43.32 + </tr>
   43.33 + </tbody>
   43.34 +</table>
   43.35 +</div>
   43.36 +<!-- end header part -->
   43.37 +<!-- Generated by Doxygen 1.8.13 -->
   43.38 +<script type="text/javascript">
   43.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   43.40 +</script>
   43.41 +<script type="text/javascript" src="menudata.js"></script>
   43.42 +<script type="text/javascript" src="menu.js"></script>
   43.43 +<script type="text/javascript">
   43.44 +$(function() {
   43.45 +  initMenu('',true,false,'search.php','Search');
   43.46 +  $(document).ready(function() { init_search(); });
   43.47 +});
   43.48 +</script>
   43.49 +<div id="main-nav"></div>
   43.50 +</div><!-- top -->
   43.51 +<!-- window showing the filter options -->
   43.52 +<div id="MSearchSelectWindow"
   43.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   43.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   43.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   43.56 +</div>
   43.57 +
   43.58 +<!-- iframe showing the search results (closed by default) -->
   43.59 +<div id="MSearchResultsWindow">
   43.60 +<iframe src="javascript:void(0)" frameborder="0" 
   43.61 +        name="MSearchResults" id="MSearchResults">
   43.62 +</iframe>
   43.63 +</div>
   43.64 +
   43.65 +<div class="contents">
   43.66 +<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
   43.67 +
   43.68 +<h3><a id="index_s"></a>- s -</h3><ul>
   43.69 +<li>S
   43.70 +: <a class="el" href="string_8h.html#a8fa17c8cf4c36df48f4108c36da8573e">string.h</a>
   43.71 +</li>
   43.72 +<li>SC
   43.73 +: <a class="el" href="string_8h.html#a7d261dd0bc358c957a368bc058c1ce53">string.h</a>
   43.74 +</li>
   43.75 +<li>scstr()
   43.76 +: <a class="el" href="string_8h.html#a2b1d6f1eca1c1549f37107b9c026c5a6">string.h</a>
   43.77 +</li>
   43.78 +<li>SCSTR
   43.79 +: <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">string.h</a>
   43.80 +</li>
   43.81 +<li>scstrcasecmp()
   43.82 +: <a class="el" href="string_8h.html#aca8142fb823d253054e17c17cfca05e0">string.h</a>
   43.83 +</li>
   43.84 +<li>scstrcaseprefix()
   43.85 +: <a class="el" href="string_8h.html#a3718ef4aa1e86cdb26bda2f07fb585df">string.h</a>
   43.86 +</li>
   43.87 +<li>scstrcasesuffix()
   43.88 +: <a class="el" href="string_8h.html#a6edb4b85f2b9efe79db7ffe6eccd7bc3">string.h</a>
   43.89 +</li>
   43.90 +<li>scstrcat()
   43.91 +: <a class="el" href="string_8h.html#a7376842c19e954b49215da81ef76ac0c">string.h</a>
   43.92 +</li>
   43.93 +<li>scstrcat_a()
   43.94 +: <a class="el" href="string_8h.html#abacce4cbd6f70fcb6453904ef08b02e9">string.h</a>
   43.95 +</li>
   43.96 +<li>scstrchr()
   43.97 +: <a class="el" href="string_8h.html#a5836d6a7a744791c35e5c17bdc394a87">string.h</a>
   43.98 +</li>
   43.99 +<li>scstrcmp()
  43.100 +: <a class="el" href="string_8h.html#af35272a8e5408c88ed3e25a3a98f0a82">string.h</a>
  43.101 +</li>
  43.102 +<li>scstrdup()
  43.103 +: <a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164">string.h</a>
  43.104 +</li>
  43.105 +<li>scstrdup_a()
  43.106 +: <a class="el" href="string_8h.html#a8fe58921f51eb1fde038472377e63014">string.h</a>
  43.107 +</li>
  43.108 +<li>scstrlower()
  43.109 +: <a class="el" href="string_8h.html#abccf198bea3186ff2abb080cc88dcae6">string.h</a>
  43.110 +</li>
  43.111 +<li>scstrlower_a()
  43.112 +: <a class="el" href="string_8h.html#a3cf1e557df7ab58d03c78832c4060276">string.h</a>
  43.113 +</li>
  43.114 +<li>scstrn()
  43.115 +: <a class="el" href="string_8h.html#ae594f6e222ea394cef6a26c0dfad000d">string.h</a>
  43.116 +</li>
  43.117 +<li>scstrnlen()
  43.118 +: <a class="el" href="string_8h.html#ac1b000030d6d197eec48c15a182055d5">string.h</a>
  43.119 +</li>
  43.120 +<li>scstrprefix()
  43.121 +: <a class="el" href="string_8h.html#a599ddc2f88dd1df68b72eefd91347393">string.h</a>
  43.122 +</li>
  43.123 +<li>scstrrchr()
  43.124 +: <a class="el" href="string_8h.html#ae389835b97cd9382e7d6a6a075323376">string.h</a>
  43.125 +</li>
  43.126 +<li>scstrscstr()
  43.127 +: <a class="el" href="string_8h.html#a54f256c3abe811c52d58b4ff1b23f051">string.h</a>
  43.128 +</li>
  43.129 +<li>scstrsplit()
  43.130 +: <a class="el" href="string_8h.html#ae71cac352b00230848bde358f0fb05ea">string.h</a>
  43.131 +</li>
  43.132 +<li>scstrsplit_a()
  43.133 +: <a class="el" href="string_8h.html#a52906455ae530c9cdc6812c8e6d9bdef">string.h</a>
  43.134 +</li>
  43.135 +<li>scstrsstr()
  43.136 +: <a class="el" href="string_8h.html#aa4362cb36c6629f9d8484739fd827748">string.h</a>
  43.137 +</li>
  43.138 +<li>scstrsubs()
  43.139 +: <a class="el" href="string_8h.html#a9a6c8d8db0dda0037c3c852cce1a5060">string.h</a>
  43.140 +</li>
  43.141 +<li>scstrsubsl()
  43.142 +: <a class="el" href="string_8h.html#ad50f0f67b906fad0744f46bcb51e144b">string.h</a>
  43.143 +</li>
  43.144 +<li>scstrsuffix()
  43.145 +: <a class="el" href="string_8h.html#a1f0ae316a2afe85d5b4655e6ece6721a">string.h</a>
  43.146 +</li>
  43.147 +<li>scstrtrim()
  43.148 +: <a class="el" href="string_8h.html#ad374b16eb1be8b48019debad9b9f268c">string.h</a>
  43.149 +</li>
  43.150 +<li>scstrupper()
  43.151 +: <a class="el" href="string_8h.html#af3dd09ec9d11162fe0075f4e60f41240">string.h</a>
  43.152 +</li>
  43.153 +<li>scstrupper_a()
  43.154 +: <a class="el" href="string_8h.html#aea94613eb74668cc05d365803d32bfad">string.h</a>
  43.155 +</li>
  43.156 +<li>SFMT
  43.157 +: <a class="el" href="string_8h.html#a23ed51e87385886bb65e8cd19c839362">string.h</a>
  43.158 +</li>
  43.159 +<li>sstr()
  43.160 +: <a class="el" href="string_8h.html#a539eb7059251a051ee5d179526a23e9a">string.h</a>
  43.161 +</li>
  43.162 +<li>sstrcasecmp
  43.163 +: <a class="el" href="string_8h.html#a81b0f6df794152c2038703d4e9d0ad59">string.h</a>
  43.164 +</li>
  43.165 +<li>sstrcaseprefix
  43.166 +: <a class="el" href="string_8h.html#acd3dc64e90db9b4046e14f115a815ff4">string.h</a>
  43.167 +</li>
  43.168 +<li>sstrcasesuffix
  43.169 +: <a class="el" href="string_8h.html#a57eabd4862d531dd685bbf2feb8468bf">string.h</a>
  43.170 +</li>
  43.171 +<li>sstrcat
  43.172 +: <a class="el" href="string_8h.html#a6af8a4c347c7fdb5980d4c4803be2759">string.h</a>
  43.173 +</li>
  43.174 +<li>sstrcat_a
  43.175 +: <a class="el" href="string_8h.html#a6068d460f9bc05962666a917d26568b3">string.h</a>
  43.176 +</li>
  43.177 +<li>sstrchr()
  43.178 +: <a class="el" href="string_8h.html#af80898a0b75955eb2579298c3ae2c481">string.h</a>
  43.179 +</li>
  43.180 +<li>sstrcmp
  43.181 +: <a class="el" href="string_8h.html#a7ae7156c8de57454ca38d306100b8160">string.h</a>
  43.182 +</li>
  43.183 +<li>sstrdup
  43.184 +: <a class="el" href="string_8h.html#accbfd2b459a028d7af9fb7df6f977d80">string.h</a>
  43.185 +</li>
  43.186 +<li>sstrdup_a
  43.187 +: <a class="el" href="string_8h.html#a8d098baada4ea9ad5d8b6343b5aec007">string.h</a>
  43.188 +</li>
  43.189 +<li>sstrlower
  43.190 +: <a class="el" href="string_8h.html#a89343ea3e719f00ee802b557db57b769">string.h</a>
  43.191 +</li>
  43.192 +<li>sstrlower_a
  43.193 +: <a class="el" href="string_8h.html#a4bb4742fe71115f493991d307cb22b23">string.h</a>
  43.194 +</li>
  43.195 +<li>sstrn()
  43.196 +: <a class="el" href="string_8h.html#a2744c38ac44abf3e01fa059056dcf36c">string.h</a>
  43.197 +</li>
  43.198 +<li>sstrnlen
  43.199 +: <a class="el" href="string_8h.html#a33fa945acc5ac2ce962e5ef13cf1638c">string.h</a>
  43.200 +</li>
  43.201 +<li>sstrprefix
  43.202 +: <a class="el" href="string_8h.html#a7d73b66256384b26927e787318fdefa2">string.h</a>
  43.203 +</li>
  43.204 +<li>sstrrchr()
  43.205 +: <a class="el" href="string_8h.html#adae3f59957ca328e1da5285cb8b02a72">string.h</a>
  43.206 +</li>
  43.207 +<li>sstrscstr
  43.208 +: <a class="el" href="string_8h.html#aa696932213265e10f864678686f4ccde">string.h</a>
  43.209 +</li>
  43.210 +<li>sstrsplit
  43.211 +: <a class="el" href="string_8h.html#aa929984004c3576bfafb95031aca8eb7">string.h</a>
  43.212 +</li>
  43.213 +<li>sstrsplit_a
  43.214 +: <a class="el" href="string_8h.html#ac9f69fa3a17e26a3a5f9d985b5844601">string.h</a>
  43.215 +</li>
  43.216 +<li>sstrstr
  43.217 +: <a class="el" href="string_8h.html#a9d03be026afa9447c52bb34b9e3b895a">string.h</a>
  43.218 +</li>
  43.219 +<li>sstrsubs()
  43.220 +: <a class="el" href="string_8h.html#a5eb9e0e1f26cf7fbecc038cd90e8b258">string.h</a>
  43.221 +</li>
  43.222 +<li>sstrsubsl()
  43.223 +: <a class="el" href="string_8h.html#a78925c91af54f23cebd20ff99ef4331a">string.h</a>
  43.224 +</li>
  43.225 +<li>sstrsuffix
  43.226 +: <a class="el" href="string_8h.html#ac6a5246f26be2e8a5f34d8995b7ec14e">string.h</a>
  43.227 +</li>
  43.228 +<li>sstrtrim()
  43.229 +: <a class="el" href="string_8h.html#ae2d6da564d3fce51f2e0cac580fdbc56">string.h</a>
  43.230 +</li>
  43.231 +<li>sstrupper
  43.232 +: <a class="el" href="string_8h.html#a084fe5a3a90d6fb6b15ecda03bb30824">string.h</a>
  43.233 +</li>
  43.234 +<li>sstrupper_a
  43.235 +: <a class="el" href="string_8h.html#a5f0dd83c0176b812fb428004b2877a34">string.h</a>
  43.236 +</li>
  43.237 +<li>ST
  43.238 +: <a class="el" href="string_8h.html#a9037956cca97a4e84b642f17f3d10378">string.h</a>
  43.239 +</li>
  43.240 +</ul>
  43.241 +</div><!-- contents -->
  43.242 +<!-- start footer part -->
  43.243 +<hr class="footer"/><address class="footer"><small>
  43.244 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  43.245 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  43.246 +</a> 1.8.13
  43.247 +</small></address>
  43.248 +</body>
  43.249 +</html>
    44.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    44.2 +++ b/docs/api-2.1/globals_type.html	Sat Feb 06 19:11:44 2021 +0100
    44.3 @@ -0,0 +1,130 @@
    44.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    44.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    44.6 +<head>
    44.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    44.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    44.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   44.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   44.11 +<title>ucx: Globals</title>
   44.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   44.13 +<script type="text/javascript" src="jquery.js"></script>
   44.14 +<script type="text/javascript" src="dynsections.js"></script>
   44.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   44.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   44.17 +<script type="text/javascript" src="search/search.js"></script>
   44.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   44.19 +</head>
   44.20 +<body>
   44.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   44.22 +<div id="titlearea">
   44.23 +<table cellspacing="0" cellpadding="0">
   44.24 + <tbody>
   44.25 + <tr style="height: 56px;">
   44.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   44.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   44.28 +   <div id="projectname">ucx
   44.29 +   </div>
   44.30 +   <div id="projectbrief">UAP Common Extensions</div>
   44.31 +  </td>
   44.32 + </tr>
   44.33 + </tbody>
   44.34 +</table>
   44.35 +</div>
   44.36 +<!-- end header part -->
   44.37 +<!-- Generated by Doxygen 1.8.13 -->
   44.38 +<script type="text/javascript">
   44.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   44.40 +</script>
   44.41 +<script type="text/javascript" src="menudata.js"></script>
   44.42 +<script type="text/javascript" src="menu.js"></script>
   44.43 +<script type="text/javascript">
   44.44 +$(function() {
   44.45 +  initMenu('',true,false,'search.php','Search');
   44.46 +  $(document).ready(function() { init_search(); });
   44.47 +});
   44.48 +</script>
   44.49 +<div id="main-nav"></div>
   44.50 +</div><!-- top -->
   44.51 +<!-- window showing the filter options -->
   44.52 +<div id="MSearchSelectWindow"
   44.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   44.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   44.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   44.56 +</div>
   44.57 +
   44.58 +<!-- iframe showing the search results (closed by default) -->
   44.59 +<div id="MSearchResultsWindow">
   44.60 +<iframe src="javascript:void(0)" frameborder="0" 
   44.61 +        name="MSearchResults" id="MSearchResults">
   44.62 +</iframe>
   44.63 +</div>
   44.64 +
   44.65 +<div class="contents">
   44.66 +&#160;<ul>
   44.67 +<li>cmp_func
   44.68 +: <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">ucx.h</a>
   44.69 +</li>
   44.70 +<li>copy_func
   44.71 +: <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">ucx.h</a>
   44.72 +</li>
   44.73 +<li>distance_func
   44.74 +: <a class="el" href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">ucx.h</a>
   44.75 +</li>
   44.76 +<li>read_func
   44.77 +: <a class="el" href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">ucx.h</a>
   44.78 +</li>
   44.79 +<li>ucx_allocator_calloc
   44.80 +: <a class="el" href="allocator_8h.html#a2c0aba4221c1ac6801f03ed799f15b12">allocator.h</a>
   44.81 +</li>
   44.82 +<li>ucx_allocator_free
   44.83 +: <a class="el" href="allocator_8h.html#aaf2387ddaddd8ab4b267e6b00e5d6f7e">allocator.h</a>
   44.84 +</li>
   44.85 +<li>ucx_allocator_malloc
   44.86 +: <a class="el" href="allocator_8h.html#a29f0f6a23a70db3b60635cd6dc384473">allocator.h</a>
   44.87 +</li>
   44.88 +<li>ucx_allocator_realloc
   44.89 +: <a class="el" href="allocator_8h.html#a6d7cf038a806e327c5da37321d04e426">allocator.h</a>
   44.90 +</li>
   44.91 +<li>ucx_destructor
   44.92 +: <a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx.h</a>
   44.93 +</li>
   44.94 +<li>UcxAVLNode
   44.95 +: <a class="el" href="avl_8h.html#a08ba2496c2316df58548c3cc29712add">avl.h</a>
   44.96 +</li>
   44.97 +<li>UcxKey
   44.98 +: <a class="el" href="map_8h.html#ad63828bb23123fc01a5315a2bac3b142">map.h</a>
   44.99 +</li>
  44.100 +<li>UcxList
  44.101 +: <a class="el" href="list_8h.html#aa6f89f91c1081c9a7c6866c298f497a2">list.h</a>
  44.102 +</li>
  44.103 +<li>UcxMap
  44.104 +: <a class="el" href="map_8h.html#a18e21948725b2da68c35da587a722033">map.h</a>
  44.105 +</li>
  44.106 +<li>UcxMapElement
  44.107 +: <a class="el" href="map_8h.html#ad7d7a910a32113eb93eae11c3dc97b4b">map.h</a>
  44.108 +</li>
  44.109 +<li>UcxMapIterator
  44.110 +: <a class="el" href="map_8h.html#ae36aff5f645948c54f51578b11fd87fb">map.h</a>
  44.111 +</li>
  44.112 +<li>UcxTest
  44.113 +: <a class="el" href="test_8h.html#ae906817354c010b83c2784260cce7a1c">test.h</a>
  44.114 +</li>
  44.115 +<li>UcxTestList
  44.116 +: <a class="el" href="test_8h.html#a8048c50ae73ea690b776edfd63bd6a5d">test.h</a>
  44.117 +</li>
  44.118 +<li>UcxTestSuite
  44.119 +: <a class="el" href="test_8h.html#a52115d1d0f1c4a565ed6ef7c1bfd0363">test.h</a>
  44.120 +</li>
  44.121 +<li>write_func
  44.122 +: <a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">ucx.h</a>
  44.123 +</li>
  44.124 +</ul>
  44.125 +</div><!-- contents -->
  44.126 +<!-- start footer part -->
  44.127 +<hr class="footer"/><address class="footer"><small>
  44.128 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  44.129 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  44.130 +</a> 1.8.13
  44.131 +</small></address>
  44.132 +</body>
  44.133 +</html>
    45.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    45.2 +++ b/docs/api-2.1/globals_u.html	Sat Feb 06 19:11:44 2021 +0100
    45.3 @@ -0,0 +1,846 @@
    45.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    45.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    45.6 +<head>
    45.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    45.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    45.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   45.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   45.11 +<title>ucx: Globals</title>
   45.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   45.13 +<script type="text/javascript" src="jquery.js"></script>
   45.14 +<script type="text/javascript" src="dynsections.js"></script>
   45.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   45.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   45.17 +<script type="text/javascript" src="search/search.js"></script>
   45.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   45.19 +</head>
   45.20 +<body>
   45.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   45.22 +<div id="titlearea">
   45.23 +<table cellspacing="0" cellpadding="0">
   45.24 + <tbody>
   45.25 + <tr style="height: 56px;">
   45.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   45.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   45.28 +   <div id="projectname">ucx
   45.29 +   </div>
   45.30 +   <div id="projectbrief">UAP Common Extensions</div>
   45.31 +  </td>
   45.32 + </tr>
   45.33 + </tbody>
   45.34 +</table>
   45.35 +</div>
   45.36 +<!-- end header part -->
   45.37 +<!-- Generated by Doxygen 1.8.13 -->
   45.38 +<script type="text/javascript">
   45.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   45.40 +</script>
   45.41 +<script type="text/javascript" src="menudata.js"></script>
   45.42 +<script type="text/javascript" src="menu.js"></script>
   45.43 +<script type="text/javascript">
   45.44 +$(function() {
   45.45 +  initMenu('',true,false,'search.php','Search');
   45.46 +  $(document).ready(function() { init_search(); });
   45.47 +});
   45.48 +</script>
   45.49 +<div id="main-nav"></div>
   45.50 +</div><!-- top -->
   45.51 +<!-- window showing the filter options -->
   45.52 +<div id="MSearchSelectWindow"
   45.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   45.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   45.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   45.56 +</div>
   45.57 +
   45.58 +<!-- iframe showing the search results (closed by default) -->
   45.59 +<div id="MSearchResultsWindow">
   45.60 +<iframe src="javascript:void(0)" frameborder="0" 
   45.61 +        name="MSearchResults" id="MSearchResults">
   45.62 +</iframe>
   45.63 +</div>
   45.64 +
   45.65 +<div class="contents">
   45.66 +<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
   45.67 +
   45.68 +<h3><a id="index_u"></a>- u -</h3><ul>
   45.69 +<li>ucx_allocator_calloc
   45.70 +: <a class="el" href="allocator_8h.html#a2c0aba4221c1ac6801f03ed799f15b12">allocator.h</a>
   45.71 +</li>
   45.72 +<li>UCX_ALLOCATOR_DEFAULT
   45.73 +: <a class="el" href="allocator_8h.html#a1283a8f875f90a7af3aba5e031fc2e3f">allocator.h</a>
   45.74 +</li>
   45.75 +<li>ucx_allocator_free
   45.76 +: <a class="el" href="allocator_8h.html#aaf2387ddaddd8ab4b267e6b00e5d6f7e">allocator.h</a>
   45.77 +</li>
   45.78 +<li>ucx_allocator_malloc
   45.79 +: <a class="el" href="allocator_8h.html#a29f0f6a23a70db3b60635cd6dc384473">allocator.h</a>
   45.80 +</li>
   45.81 +<li>ucx_allocator_realloc
   45.82 +: <a class="el" href="allocator_8h.html#a6d7cf038a806e327c5da37321d04e426">allocator.h</a>
   45.83 +</li>
   45.84 +<li>ucx_array_append_from()
   45.85 +: <a class="el" href="array_8h.html#aea01731ad94ea73c0c8fb1d1b7a35fcf">array.h</a>
   45.86 +</li>
   45.87 +<li>ucx_array_at()
   45.88 +: <a class="el" href="array_8h.html#aa698085fd1a8b70d6b709999c51b49e8">array.h</a>
   45.89 +</li>
   45.90 +<li>ucx_array_clone()
   45.91 +: <a class="el" href="array_8h.html#a4a8c273370e4a3a3e2624e364f5ab410">array.h</a>
   45.92 +</li>
   45.93 +<li>ucx_array_concat()
   45.94 +: <a class="el" href="array_8h.html#aa5a0bf3d3f0df6406beb0e569021cc28">array.h</a>
   45.95 +</li>
   45.96 +<li>ucx_array_contains()
   45.97 +: <a class="el" href="array_8h.html#a5241058cd2329147bc5b1593ae7e51dc">array.h</a>
   45.98 +</li>
   45.99 +<li>ucx_array_destroy()
  45.100 +: <a class="el" href="array_8h.html#a8e83681d8d5d8cddbf10f63ce5be4c10">array.h</a>
  45.101 +</li>
  45.102 +<li>ucx_array_equals()
  45.103 +: <a class="el" href="array_8h.html#a43292b448adb1741677aa8c578bcc201">array.h</a>
  45.104 +</li>
  45.105 +<li>ucx_array_find()
  45.106 +: <a class="el" href="array_8h.html#ae7bdbed94afee9b20b38b95e3ab470f0">array.h</a>
  45.107 +</li>
  45.108 +<li>ucx_array_free()
  45.109 +: <a class="el" href="array_8h.html#ac01ee914468a16f470bf3071fffbe438">array.h</a>
  45.110 +</li>
  45.111 +<li>ucx_array_grow()
  45.112 +: <a class="el" href="array_8h.html#ab0cbf243824aaebee48277315e03afce">array.h</a>
  45.113 +</li>
  45.114 +<li>ucx_array_init()
  45.115 +: <a class="el" href="array_8h.html#ad921e85c28ffae32230777a53c5037e5">array.h</a>
  45.116 +</li>
  45.117 +<li>ucx_array_init_a()
  45.118 +: <a class="el" href="array_8h.html#a2451e61ebb15a7ba1c1319267ba75b8c">array.h</a>
  45.119 +</li>
  45.120 +<li>ucx_array_new()
  45.121 +: <a class="el" href="array_8h.html#a994a2fbf1c33a3833e2a70cd9a4352b7">array.h</a>
  45.122 +</li>
  45.123 +<li>ucx_array_new_a()
  45.124 +: <a class="el" href="array_8h.html#a177170258c215eb2e4f5a32e59f0cb1b">array.h</a>
  45.125 +</li>
  45.126 +<li>ucx_array_prepend_from()
  45.127 +: <a class="el" href="array_8h.html#a95b52acc2193b5c33cf0eaa4f2082477">array.h</a>
  45.128 +</li>
  45.129 +<li>ucx_array_remove()
  45.130 +: <a class="el" href="array_8h.html#aa45eac6b697f83adac81c0860cf306b8">array.h</a>
  45.131 +</li>
  45.132 +<li>ucx_array_remove_fast()
  45.133 +: <a class="el" href="array_8h.html#a548d81b07612bae3ba8c4c4b49104b8e">array.h</a>
  45.134 +</li>
  45.135 +<li>ucx_array_reserve()
  45.136 +: <a class="el" href="array_8h.html#a1c3bf8433c1de3c933f3854ab297fe1d">array.h</a>
  45.137 +</li>
  45.138 +<li>ucx_array_resize()
  45.139 +: <a class="el" href="array_8h.html#a27762e7c06a6c781015e3c8ceeee0ce3">array.h</a>
  45.140 +</li>
  45.141 +<li>ucx_array_set_from()
  45.142 +: <a class="el" href="array_8h.html#a1bb545d065358d265d80d815ba382a28">array.h</a>
  45.143 +</li>
  45.144 +<li>ucx_array_shrink()
  45.145 +: <a class="el" href="array_8h.html#a2daf50e80aee9bccebee876a7efd2dfc">array.h</a>
  45.146 +</li>
  45.147 +<li>ucx_array_sort()
  45.148 +: <a class="el" href="array_8h.html#add773514569b872a6624381b4b6af52c">array.h</a>
  45.149 +</li>
  45.150 +<li>ucx_array_util_set
  45.151 +: <a class="el" href="array_8h.html#a1d959c29af3125bdd37cde3a554e729c">array.h</a>
  45.152 +</li>
  45.153 +<li>ucx_array_util_set_a()
  45.154 +: <a class="el" href="array_8h.html#ad0a8d76980cf1c1910e64a245803fb9a">array.h</a>
  45.155 +</li>
  45.156 +<li>ucx_array_util_setptr
  45.157 +: <a class="el" href="array_8h.html#a59a5b342965e790945f9c7a3f86b99f9">array.h</a>
  45.158 +</li>
  45.159 +<li>ucx_array_util_setptr_a()
  45.160 +: <a class="el" href="array_8h.html#ad708b333c0c1b02c998309a58ea65e31">array.h</a>
  45.161 +</li>
  45.162 +<li>ucx_asprintf()
  45.163 +: <a class="el" href="utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5">utils.h</a>
  45.164 +</li>
  45.165 +<li>ucx_avl_count()
  45.166 +: <a class="el" href="avl_8h.html#a92c1d41c2b22fe4a029a486ab2153e35">avl.h</a>
  45.167 +</li>
  45.168 +<li>ucx_avl_default_new
  45.169 +: <a class="el" href="avl_8h.html#ac2886d4b79b48c9fabf6408873f84cd2">avl.h</a>
  45.170 +</li>
  45.171 +<li>ucx_avl_find()
  45.172 +: <a class="el" href="avl_8h.html#a51770e1614b28d7d22dea096c3704f83">avl.h</a>
  45.173 +</li>
  45.174 +<li>UCX_AVL_FIND_CLOSEST
  45.175 +: <a class="el" href="avl_8h.html#af16f24d74fd6af0154de041566c6603b">avl.h</a>
  45.176 +</li>
  45.177 +<li>UCX_AVL_FIND_EXACT
  45.178 +: <a class="el" href="avl_8h.html#aaaf4a6f6f661cda7791db239212285d9">avl.h</a>
  45.179 +</li>
  45.180 +<li>UCX_AVL_FIND_LOWER_BOUNDED
  45.181 +: <a class="el" href="avl_8h.html#abd2446d544d5412b6997ee8a17bd368c">avl.h</a>
  45.182 +</li>
  45.183 +<li>ucx_avl_find_node()
  45.184 +: <a class="el" href="avl_8h.html#a664986f64d6865605199fbff06e19cd5">avl.h</a>
  45.185 +</li>
  45.186 +<li>UCX_AVL_FIND_UPPER_BOUNDED
  45.187 +: <a class="el" href="avl_8h.html#ac74ee7649c1e206b08b31f37dd68ca5e">avl.h</a>
  45.188 +</li>
  45.189 +<li>ucx_avl_free()
  45.190 +: <a class="el" href="avl_8h.html#a2f92db538f25fce908d2cb3e5590944c">avl.h</a>
  45.191 +</li>
  45.192 +<li>ucx_avl_free_content()
  45.193 +: <a class="el" href="avl_8h.html#a31ad7fb196ca211f1fc39f4e15f72279">avl.h</a>
  45.194 +</li>
  45.195 +<li>ucx_avl_get()
  45.196 +: <a class="el" href="avl_8h.html#adbcf7ceb3f014a30c7214f7304519efe">avl.h</a>
  45.197 +</li>
  45.198 +<li>ucx_avl_get_node()
  45.199 +: <a class="el" href="avl_8h.html#acf42da9a4168e47dc10b4ba0d27ceb4e">avl.h</a>
  45.200 +</li>
  45.201 +<li>ucx_avl_new()
  45.202 +: <a class="el" href="avl_8h.html#a11b043d65a11b7092d5d98b298e5ede3">avl.h</a>
  45.203 +</li>
  45.204 +<li>ucx_avl_new_a()
  45.205 +: <a class="el" href="avl_8h.html#af0f868d67e9dc08b4867c02a06c23ee2">avl.h</a>
  45.206 +</li>
  45.207 +<li>ucx_avl_pred()
  45.208 +: <a class="el" href="avl_8h.html#a0e739aeb66dda6a6a3f6eb51b50cf346">avl.h</a>
  45.209 +</li>
  45.210 +<li>ucx_avl_put()
  45.211 +: <a class="el" href="avl_8h.html#aec401fab4a24a7edffa734f9baf88577">avl.h</a>
  45.212 +</li>
  45.213 +<li>ucx_avl_put_s()
  45.214 +: <a class="el" href="avl_8h.html#a32cf8955cc0226a82bacfc7b76d6474c">avl.h</a>
  45.215 +</li>
  45.216 +<li>ucx_avl_remove()
  45.217 +: <a class="el" href="avl_8h.html#a1d821119c805d7fbb7e424bc3effeba9">avl.h</a>
  45.218 +</li>
  45.219 +<li>ucx_avl_remove_node()
  45.220 +: <a class="el" href="avl_8h.html#a9a792b7d9e58073deef74a341f8bc720">avl.h</a>
  45.221 +</li>
  45.222 +<li>ucx_avl_remove_s()
  45.223 +: <a class="el" href="avl_8h.html#a01aeeecd6415f0cc2b623486eb28f254">avl.h</a>
  45.224 +</li>
  45.225 +<li>ucx_avl_succ()
  45.226 +: <a class="el" href="avl_8h.html#aab1ad9b027ff5e50671aa0ee84e2d541">avl.h</a>
  45.227 +</li>
  45.228 +<li>ucx_bprintf
  45.229 +: <a class="el" href="utils_8h.html#a9d7d65a420f026fcb6982803d5120519">utils.h</a>
  45.230 +</li>
  45.231 +<li>UCX_BUFFER_AUTOEXTEND
  45.232 +: <a class="el" href="buffer_8h.html#a05f9565f2d04399168c3b1c152a632be">buffer.h</a>
  45.233 +</li>
  45.234 +<li>UCX_BUFFER_AUTOFREE
  45.235 +: <a class="el" href="buffer_8h.html#a8bab11ad8a76719228b9ee91e2e45535">buffer.h</a>
  45.236 +</li>
  45.237 +<li>ucx_buffer_clear
  45.238 +: <a class="el" href="buffer_8h.html#a374abd5aabfcc3ee0777a79d5fe651ab">buffer.h</a>
  45.239 +</li>
  45.240 +<li>ucx_buffer_clone
  45.241 +: <a class="el" href="buffer_8h.html#a828353846428c2c2f695f9938f059e52">buffer.h</a>
  45.242 +</li>
  45.243 +<li>UCX_BUFFER_DEFAULT
  45.244 +: <a class="el" href="buffer_8h.html#acc77c8ed7b26854f555d4a5d11e49ea2">buffer.h</a>
  45.245 +</li>
  45.246 +<li>ucx_buffer_eof()
  45.247 +: <a class="el" href="buffer_8h.html#abad7fd9ad5061224c780b8d1d4c55f09">buffer.h</a>
  45.248 +</li>
  45.249 +<li>ucx_buffer_extend()
  45.250 +: <a class="el" href="buffer_8h.html#afaf97d2cd7e9faad79a9d35fe33e30c6">buffer.h</a>
  45.251 +</li>
  45.252 +<li>ucx_buffer_extract()
  45.253 +: <a class="el" href="buffer_8h.html#a33fa7bb35fe08bbb3542f227514332ef">buffer.h</a>
  45.254 +</li>
  45.255 +<li>ucx_buffer_free()
  45.256 +: <a class="el" href="buffer_8h.html#a2af8646d8905c22c7322e7540b0440af">buffer.h</a>
  45.257 +</li>
  45.258 +<li>ucx_buffer_getc()
  45.259 +: <a class="el" href="buffer_8h.html#a396339022159ce4ca6d069de9f9209b0">buffer.h</a>
  45.260 +</li>
  45.261 +<li>ucx_buffer_new()
  45.262 +: <a class="el" href="buffer_8h.html#aacea876d692193ec6f859ce98da7351c">buffer.h</a>
  45.263 +</li>
  45.264 +<li>ucx_buffer_putc()
  45.265 +: <a class="el" href="buffer_8h.html#a7d6f01b9d631b0123475dfb98fb849ac">buffer.h</a>
  45.266 +</li>
  45.267 +<li>ucx_buffer_puts()
  45.268 +: <a class="el" href="buffer_8h.html#af1d4b478e04b3ae0bf30e7c2ea964ea2">buffer.h</a>
  45.269 +</li>
  45.270 +<li>ucx_buffer_read()
  45.271 +: <a class="el" href="buffer_8h.html#ae5c3430759f0059547b35d5a254d4da5">buffer.h</a>
  45.272 +</li>
  45.273 +<li>ucx_buffer_seek()
  45.274 +: <a class="el" href="buffer_8h.html#a47d98482662073c74f35deb0957d15d1">buffer.h</a>
  45.275 +</li>
  45.276 +<li>ucx_buffer_shift()
  45.277 +: <a class="el" href="buffer_8h.html#a12a0c6a2379ef080043e6286bb8bad69">buffer.h</a>
  45.278 +</li>
  45.279 +<li>ucx_buffer_shift_left()
  45.280 +: <a class="el" href="buffer_8h.html#a20431dd0ed6a6fe9f15333bd72afe4db">buffer.h</a>
  45.281 +</li>
  45.282 +<li>ucx_buffer_shift_right()
  45.283 +: <a class="el" href="buffer_8h.html#a4fa10b6471495547eb981248fd4f1bc2">buffer.h</a>
  45.284 +</li>
  45.285 +<li>ucx_buffer_to_sstr
  45.286 +: <a class="el" href="buffer_8h.html#a0f4b64f1b3a74c4f6c5d9409d6b6086a">buffer.h</a>
  45.287 +</li>
  45.288 +<li>ucx_buffer_write()
  45.289 +: <a class="el" href="buffer_8h.html#af8aacc7401814392b58c1b7b81bffc05">buffer.h</a>
  45.290 +</li>
  45.291 +<li>ucx_cmp_double()
  45.292 +: <a class="el" href="utils_8h.html#ab804b7c27d0bfcd7bf3a3583140825b6">utils.h</a>
  45.293 +</li>
  45.294 +<li>ucx_cmp_float()
  45.295 +: <a class="el" href="utils_8h.html#ad1196b561bcdad76c393885819769a97">utils.h</a>
  45.296 +</li>
  45.297 +<li>ucx_cmp_int()
  45.298 +: <a class="el" href="utils_8h.html#a8ce7e11e6b3deafe89a32a091fde7f16">utils.h</a>
  45.299 +</li>
  45.300 +<li>ucx_cmp_int16()
  45.301 +: <a class="el" href="utils_8h.html#aa29e6e559946375e34113e34e0b0bd0d">utils.h</a>
  45.302 +</li>
  45.303 +<li>ucx_cmp_int32()
  45.304 +: <a class="el" href="utils_8h.html#a858b2ac443fb202643b71f6a7e9218dd">utils.h</a>
  45.305 +</li>
  45.306 +<li>ucx_cmp_int64()
  45.307 +: <a class="el" href="utils_8h.html#a54701aea6a89fed1402dfb0bf56bc7f6">utils.h</a>
  45.308 +</li>
  45.309 +<li>ucx_cmp_longint()
  45.310 +: <a class="el" href="utils_8h.html#aeb57a2b9a6aaa0460c7a6bec29accf2c">utils.h</a>
  45.311 +</li>
  45.312 +<li>ucx_cmp_longlong()
  45.313 +: <a class="el" href="utils_8h.html#a366b57def20f86a41eaedf575eea5375">utils.h</a>
  45.314 +</li>
  45.315 +<li>ucx_cmp_mem()
  45.316 +: <a class="el" href="utils_8h.html#aff7d2bcded71196831a8c0664333f8e7">utils.h</a>
  45.317 +</li>
  45.318 +<li>ucx_cmp_ptr()
  45.319 +: <a class="el" href="utils_8h.html#aa174d539de3ea59be4f9640f17ce53d8">utils.h</a>
  45.320 +</li>
  45.321 +<li>ucx_cmp_sstr()
  45.322 +: <a class="el" href="utils_8h.html#adee0739589166d272f8cb7c23aabf8ba">utils.h</a>
  45.323 +</li>
  45.324 +<li>ucx_cmp_str()
  45.325 +: <a class="el" href="utils_8h.html#aa6a37b9d172b6a5b2803d152f9e1b258">utils.h</a>
  45.326 +</li>
  45.327 +<li>ucx_cmp_strn()
  45.328 +: <a class="el" href="utils_8h.html#ac6b354a878f551a3a5b20a167db3f308">utils.h</a>
  45.329 +</li>
  45.330 +<li>ucx_cmp_uint()
  45.331 +: <a class="el" href="utils_8h.html#abd83a5da91c3dd026a6931bd80c12f1e">utils.h</a>
  45.332 +</li>
  45.333 +<li>ucx_cmp_uint16()
  45.334 +: <a class="el" href="utils_8h.html#acde5366437e886a459b7468f7a9e11f0">utils.h</a>
  45.335 +</li>
  45.336 +<li>ucx_cmp_uint32()
  45.337 +: <a class="el" href="utils_8h.html#a5879d1722330355914d8c9146fa549d3">utils.h</a>
  45.338 +</li>
  45.339 +<li>ucx_cmp_uint64()
  45.340 +: <a class="el" href="utils_8h.html#a1572a78b5b42f7151a5b2a5a7283d62d">utils.h</a>
  45.341 +</li>
  45.342 +<li>ucx_cmp_ulongint()
  45.343 +: <a class="el" href="utils_8h.html#a3f3cbae2594d6f722bae29acb0408a24">utils.h</a>
  45.344 +</li>
  45.345 +<li>ucx_cmp_ulonglong()
  45.346 +: <a class="el" href="utils_8h.html#a6acfc359421f21f9a042a654ff7faac5">utils.h</a>
  45.347 +</li>
  45.348 +<li>ucx_default_allocator()
  45.349 +: <a class="el" href="allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf">allocator.h</a>
  45.350 +</li>
  45.351 +<li>ucx_default_calloc()
  45.352 +: <a class="el" href="allocator_8h.html#a3a0bfdd13d887012309c459b339f338f">allocator.h</a>
  45.353 +</li>
  45.354 +<li>ucx_default_free()
  45.355 +: <a class="el" href="allocator_8h.html#a646d83aaaadfe33ae414c0fad8bfc52a">allocator.h</a>
  45.356 +</li>
  45.357 +<li>ucx_default_malloc()
  45.358 +: <a class="el" href="allocator_8h.html#a96403ebf3d2312d95f2fe7627a1cdbc0">allocator.h</a>
  45.359 +</li>
  45.360 +<li>ucx_default_realloc()
  45.361 +: <a class="el" href="allocator_8h.html#a47cfc8af626a86fcb93a2b14b90498ed">allocator.h</a>
  45.362 +</li>
  45.363 +<li>ucx_destructor
  45.364 +: <a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx.h</a>
  45.365 +</li>
  45.366 +<li>ucx_dist_int()
  45.367 +: <a class="el" href="utils_8h.html#a4ab6753739d56c09cdf6079fdcabf7c6">utils.h</a>
  45.368 +</li>
  45.369 +<li>ucx_dist_int16()
  45.370 +: <a class="el" href="utils_8h.html#a81fb8434b70ca11bf2c14abfa21d16a9">utils.h</a>
  45.371 +</li>
  45.372 +<li>ucx_dist_int32()
  45.373 +: <a class="el" href="utils_8h.html#ab4a659cc46096f0490c1dafa57726476">utils.h</a>
  45.374 +</li>
  45.375 +<li>ucx_dist_int64()
  45.376 +: <a class="el" href="utils_8h.html#a54e7d06585bad3a899befc4e9c13853f">utils.h</a>
  45.377 +</li>
  45.378 +<li>ucx_dist_longint()
  45.379 +: <a class="el" href="utils_8h.html#a43e73d288b1553a0078bf4c98dd341f5">utils.h</a>
  45.380 +</li>
  45.381 +<li>ucx_dist_longlong()
  45.382 +: <a class="el" href="utils_8h.html#a306778414a2427951ea263be92368627">utils.h</a>
  45.383 +</li>
  45.384 +<li>ucx_dist_uint()
  45.385 +: <a class="el" href="utils_8h.html#a37b7d471ca1679992afc11a0deda45f4">utils.h</a>
  45.386 +</li>
  45.387 +<li>ucx_dist_uint16()
  45.388 +: <a class="el" href="utils_8h.html#a66e00a0703cbcde050ec922578e2f080">utils.h</a>
  45.389 +</li>
  45.390 +<li>ucx_dist_uint32()
  45.391 +: <a class="el" href="utils_8h.html#add2b5c5507caba59d894b84e056b079b">utils.h</a>
  45.392 +</li>
  45.393 +<li>ucx_dist_uint64()
  45.394 +: <a class="el" href="utils_8h.html#a3ba75e2e0b2479eef2b22fb219b42da7">utils.h</a>
  45.395 +</li>
  45.396 +<li>ucx_dist_ulongint()
  45.397 +: <a class="el" href="utils_8h.html#abb13476228d0c16bfaba08469adbae2d">utils.h</a>
  45.398 +</li>
  45.399 +<li>ucx_dist_ulonglong()
  45.400 +: <a class="el" href="utils_8h.html#a59a5859272cb4b43cbdd58208c41e32b">utils.h</a>
  45.401 +</li>
  45.402 +<li>UCX_FOREACH
  45.403 +: <a class="el" href="list_8h.html#a4b143b6526a410aa4d22cb3bb9365d70">list.h</a>
  45.404 +</li>
  45.405 +<li>ucx_fprintf()
  45.406 +: <a class="el" href="utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a">utils.h</a>
  45.407 +</li>
  45.408 +<li>ucx_hash()
  45.409 +: <a class="el" href="map_8h.html#aea3be97254c05595d986ef6a9faae87b">map.h</a>
  45.410 +</li>
  45.411 +<li>ucx_key()
  45.412 +: <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">map.h</a>
  45.413 +</li>
  45.414 +<li>ucx_list_append()
  45.415 +: <a class="el" href="list_8h.html#a00c122c8a26d35b60676939df4161621">list.h</a>
  45.416 +</li>
  45.417 +<li>ucx_list_append_a()
  45.418 +: <a class="el" href="list_8h.html#adf3b3e2e0ff977d8928671d6bd82fc60">list.h</a>
  45.419 +</li>
  45.420 +<li>ucx_list_clone()
  45.421 +: <a class="el" href="list_8h.html#ae7054a41c289b24e6caf5cb07ac850ed">list.h</a>
  45.422 +</li>
  45.423 +<li>ucx_list_clone_a()
  45.424 +: <a class="el" href="list_8h.html#a08ca1ba0d2e82258b0408714c1f4c425">list.h</a>
  45.425 +</li>
  45.426 +<li>ucx_list_concat()
  45.427 +: <a class="el" href="list_8h.html#a77163a0cc82fae52bec26c8c0c3674d9">list.h</a>
  45.428 +</li>
  45.429 +<li>ucx_list_contains()
  45.430 +: <a class="el" href="list_8h.html#a8b0fa051fcfe12e1a82cca1087973852">list.h</a>
  45.431 +</li>
  45.432 +<li>ucx_list_difference()
  45.433 +: <a class="el" href="list_8h.html#a6c5db5d1d11ad28b6fe1a80ee1c1e449">list.h</a>
  45.434 +</li>
  45.435 +<li>ucx_list_difference_a()
  45.436 +: <a class="el" href="list_8h.html#a4a2a2fc5cc41073c516db6235bbc51d5">list.h</a>
  45.437 +</li>
  45.438 +<li>ucx_list_equals()
  45.439 +: <a class="el" href="list_8h.html#adc435447cecf885bc63d232191085bbe">list.h</a>
  45.440 +</li>
  45.441 +<li>ucx_list_find()
  45.442 +: <a class="el" href="list_8h.html#a9b3b6842d3be572e06a7f519e198cb83">list.h</a>
  45.443 +</li>
  45.444 +<li>ucx_list_first()
  45.445 +: <a class="el" href="list_8h.html#a6aa0e34ebc5f0dca6f52d0f7626b4bd5">list.h</a>
  45.446 +</li>
  45.447 +<li>ucx_list_free()
  45.448 +: <a class="el" href="list_8h.html#a1a0fa2c5b1e478a96da19b0c3f013668">list.h</a>
  45.449 +</li>
  45.450 +<li>ucx_list_free_a()
  45.451 +: <a class="el" href="list_8h.html#a944e11f76c38767cd1100d72a4e3b25b">list.h</a>
  45.452 +</li>
  45.453 +<li>ucx_list_free_content()
  45.454 +: <a class="el" href="list_8h.html#a4ba6c96642f72ea046cc22627c72979c">list.h</a>
  45.455 +</li>
  45.456 +<li>ucx_list_get()
  45.457 +: <a class="el" href="list_8h.html#a2509ffe19bce6a8708c77f89480c75fb">list.h</a>
  45.458 +</li>
  45.459 +<li>ucx_list_indexof()
  45.460 +: <a class="el" href="list_8h.html#ae2ff2974812ca185870f80bc4ed9337e">list.h</a>
  45.461 +</li>
  45.462 +<li>ucx_list_intersection()
  45.463 +: <a class="el" href="list_8h.html#a259f9b754978aeca23dfabba16e20f39">list.h</a>
  45.464 +</li>
  45.465 +<li>ucx_list_intersection_a()
  45.466 +: <a class="el" href="list_8h.html#a1d0b00514dbb81ba6270b58da0c5b9a8">list.h</a>
  45.467 +</li>
  45.468 +<li>ucx_list_last()
  45.469 +: <a class="el" href="list_8h.html#add5ec40c5006e29c629d23c2eb5a6553">list.h</a>
  45.470 +</li>
  45.471 +<li>ucx_list_prepend()
  45.472 +: <a class="el" href="list_8h.html#a8fcb68e4556395b15180eec2d0b77aa4">list.h</a>
  45.473 +</li>
  45.474 +<li>ucx_list_prepend_a()
  45.475 +: <a class="el" href="list_8h.html#a54654e6dc60e1c3de9e886c150e404ec">list.h</a>
  45.476 +</li>
  45.477 +<li>ucx_list_remove()
  45.478 +: <a class="el" href="list_8h.html#a410cb3e8260037ba56c72d14b899b468">list.h</a>
  45.479 +</li>
  45.480 +<li>ucx_list_remove_a()
  45.481 +: <a class="el" href="list_8h.html#aca687b7c4e7170175f447e549125aa52">list.h</a>
  45.482 +</li>
  45.483 +<li>ucx_list_size()
  45.484 +: <a class="el" href="list_8h.html#ae88001cc8ae40b946560f31434abed8f">list.h</a>
  45.485 +</li>
  45.486 +<li>ucx_list_sort()
  45.487 +: <a class="el" href="list_8h.html#ac74962d9bd7cfc9d3e2e09651469377b">list.h</a>
  45.488 +</li>
  45.489 +<li>ucx_list_union()
  45.490 +: <a class="el" href="list_8h.html#a94ecdb0cea1633ad7074f027fa8485fa">list.h</a>
  45.491 +</li>
  45.492 +<li>ucx_list_union_a()
  45.493 +: <a class="el" href="list_8h.html#a65b4355536f4ebc4130211b46469f4c1">list.h</a>
  45.494 +</li>
  45.495 +<li>UCX_LOGGER_DEBUG
  45.496 +: <a class="el" href="logging_8h.html#acff01d1ef919ea997cfce755fc1b83d8">logging.h</a>
  45.497 +</li>
  45.498 +<li>ucx_logger_debug
  45.499 +: <a class="el" href="logging_8h.html#a2936402799892db5138e5f1f8c25db0c">logging.h</a>
  45.500 +</li>
  45.501 +<li>ucx_logger_error
  45.502 +: <a class="el" href="logging_8h.html#a6a9e472e14d6768e59d96d245e065397">logging.h</a>
  45.503 +</li>
  45.504 +<li>UCX_LOGGER_ERROR
  45.505 +: <a class="el" href="logging_8h.html#aa254c07fe3a907613e2256a318d5c9a8">logging.h</a>
  45.506 +</li>
  45.507 +<li>ucx_logger_free()
  45.508 +: <a class="el" href="logging_8h.html#ac4697b784e01ec990d2acea192e21658">logging.h</a>
  45.509 +</li>
  45.510 +<li>UCX_LOGGER_INFO
  45.511 +: <a class="el" href="logging_8h.html#a4b0178bf60a6129373ffc59114ca4c9b">logging.h</a>
  45.512 +</li>
  45.513 +<li>ucx_logger_info
  45.514 +: <a class="el" href="logging_8h.html#a98464d8d51376ce2716dcc4eca00d5da">logging.h</a>
  45.515 +</li>
  45.516 +<li>UCX_LOGGER_LEVEL
  45.517 +: <a class="el" href="logging_8h.html#aee18bc20e58ffb69910121512c350839">logging.h</a>
  45.518 +</li>
  45.519 +<li>ucx_logger_log
  45.520 +: <a class="el" href="logging_8h.html#aa0245325031d95799b28def177fd14ec">logging.h</a>
  45.521 +</li>
  45.522 +<li>ucx_logger_logf()
  45.523 +: <a class="el" href="logging_8h.html#ac337e5d02ebea565012d4c11bd643801">logging.h</a>
  45.524 +</li>
  45.525 +<li>ucx_logger_new()
  45.526 +: <a class="el" href="logging_8h.html#ac560f8517d2172794c9d2691735ec48c">logging.h</a>
  45.527 +</li>
  45.528 +<li>ucx_logger_register_level
  45.529 +: <a class="el" href="logging_8h.html#a5cffc19502c4c90bfb3bd3bbcd18170a">logging.h</a>
  45.530 +</li>
  45.531 +<li>UCX_LOGGER_SOURCE
  45.532 +: <a class="el" href="logging_8h.html#a0e0d72b12616c1e49ff8834eaf4cb8a2">logging.h</a>
  45.533 +</li>
  45.534 +<li>UCX_LOGGER_TIMESTAMP
  45.535 +: <a class="el" href="logging_8h.html#a38607008268b4f776ee500fb95d2e823">logging.h</a>
  45.536 +</li>
  45.537 +<li>UCX_LOGGER_TRACE
  45.538 +: <a class="el" href="logging_8h.html#a55b88d1fec7036d841b3ddd6195c5586">logging.h</a>
  45.539 +</li>
  45.540 +<li>ucx_logger_trace
  45.541 +: <a class="el" href="logging_8h.html#a3031b7ff13f4cfae9c2916543be2877c">logging.h</a>
  45.542 +</li>
  45.543 +<li>ucx_logger_warn
  45.544 +: <a class="el" href="logging_8h.html#aca7bd861b646892813fd7310c0aa69af">logging.h</a>
  45.545 +</li>
  45.546 +<li>UCX_LOGGER_WARN
  45.547 +: <a class="el" href="logging_8h.html#abd01ca11486226ba34e8f7028d9fffba">logging.h</a>
  45.548 +</li>
  45.549 +<li>ucx_map_clear()
  45.550 +: <a class="el" href="map_8h.html#a285e90e40681c6d9631c935dda0967f2">map.h</a>
  45.551 +</li>
  45.552 +<li>ucx_map_clone()
  45.553 +: <a class="el" href="map_8h.html#a62c6c30cbb0d824ba710f5030ff9a4e4">map.h</a>
  45.554 +</li>
  45.555 +<li>ucx_map_clone_a()
  45.556 +: <a class="el" href="map_8h.html#a9aea9103703d5c168420bb6bf85549ea">map.h</a>
  45.557 +</li>
  45.558 +<li>ucx_map_copy()
  45.559 +: <a class="el" href="map_8h.html#adfeb2d61003fd2896bcfdc9a57f36425">map.h</a>
  45.560 +</li>
  45.561 +<li>ucx_map_cstr_get
  45.562 +: <a class="el" href="map_8h.html#a64e1fb55498fa502dd2ed8ed69062cdd">map.h</a>
  45.563 +</li>
  45.564 +<li>ucx_map_cstr_put
  45.565 +: <a class="el" href="map_8h.html#ad9356b01425b934ab237b52339ac0cc3">map.h</a>
  45.566 +</li>
  45.567 +<li>ucx_map_cstr_remove
  45.568 +: <a class="el" href="map_8h.html#a9c4405a5a75ecf64e2ef3d0c6501a9fe">map.h</a>
  45.569 +</li>
  45.570 +<li>ucx_map_difference()
  45.571 +: <a class="el" href="map_8h.html#a774fcff87d1e58b6c5af77dd19a8c3dc">map.h</a>
  45.572 +</li>
  45.573 +<li>ucx_map_difference_a()
  45.574 +: <a class="el" href="map_8h.html#ad0ba103494247d798ac3037c50fc8831">map.h</a>
  45.575 +</li>
  45.576 +<li>UCX_MAP_FOREACH
  45.577 +: <a class="el" href="map_8h.html#a940896c4aa1b13e54c55c04c3efc186b">map.h</a>
  45.578 +</li>
  45.579 +<li>ucx_map_free()
  45.580 +: <a class="el" href="map_8h.html#abe3d9688e4224bf7bb962abf25ff8c2e">map.h</a>
  45.581 +</li>
  45.582 +<li>ucx_map_free_content()
  45.583 +: <a class="el" href="map_8h.html#a750f3d9d83e2f3788a14c17a9d160618">map.h</a>
  45.584 +</li>
  45.585 +<li>ucx_map_get()
  45.586 +: <a class="el" href="map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6">map.h</a>
  45.587 +</li>
  45.588 +<li>ucx_map_int_get
  45.589 +: <a class="el" href="map_8h.html#aa1681bd2178553cd092fd24c4d681d3c">map.h</a>
  45.590 +</li>
  45.591 +<li>ucx_map_int_put
  45.592 +: <a class="el" href="map_8h.html#aaa30af79b4068c923895619e83f44367">map.h</a>
  45.593 +</li>
  45.594 +<li>ucx_map_int_remove
  45.595 +: <a class="el" href="map_8h.html#aa767958b5468737755c09f7185b1770c">map.h</a>
  45.596 +</li>
  45.597 +<li>ucx_map_intersection()
  45.598 +: <a class="el" href="map_8h.html#aa594d7a5afebc3bed6bb265348cf6b0d">map.h</a>
  45.599 +</li>
  45.600 +<li>ucx_map_intersection_a()
  45.601 +: <a class="el" href="map_8h.html#a169e0470a20484dd76425fdf77e3651e">map.h</a>
  45.602 +</li>
  45.603 +<li>ucx_map_iter_next()
  45.604 +: <a class="el" href="map_8h.html#aceb8675abf44860b4bbc301bbada5b91">map.h</a>
  45.605 +</li>
  45.606 +<li>ucx_map_iterator()
  45.607 +: <a class="el" href="map_8h.html#a9150e9c64fdf4dfcc2cad106b91aa110">map.h</a>
  45.608 +</li>
  45.609 +<li>ucx_map_new()
  45.610 +: <a class="el" href="map_8h.html#a79f31de8b93814493759dbc8b940cf0c">map.h</a>
  45.611 +</li>
  45.612 +<li>ucx_map_new_a()
  45.613 +: <a class="el" href="map_8h.html#aed508a94c66cc15372503c64b70eb03e">map.h</a>
  45.614 +</li>
  45.615 +<li>ucx_map_put()
  45.616 +: <a class="el" href="map_8h.html#ac04a08b604217070254d4c58f0e82498">map.h</a>
  45.617 +</li>
  45.618 +<li>ucx_map_rehash()
  45.619 +: <a class="el" href="map_8h.html#a174bce9fad554dd92b8da354e0d32512">map.h</a>
  45.620 +</li>
  45.621 +<li>ucx_map_remove()
  45.622 +: <a class="el" href="map_8h.html#a17248a4888eb8f9ae18be522d64632aa">map.h</a>
  45.623 +</li>
  45.624 +<li>ucx_map_sstr_get
  45.625 +: <a class="el" href="map_8h.html#a14d385f6b7f371f0507861cabd2eab4e">map.h</a>
  45.626 +</li>
  45.627 +<li>ucx_map_sstr_put
  45.628 +: <a class="el" href="map_8h.html#ac26a8615bfc8f47ee9eaceb47645f98e">map.h</a>
  45.629 +</li>
  45.630 +<li>ucx_map_sstr_remove
  45.631 +: <a class="el" href="map_8h.html#a48700ea86fadb9ea54d13010f9124df2">map.h</a>
  45.632 +</li>
  45.633 +<li>ucx_map_union()
  45.634 +: <a class="el" href="map_8h.html#a3f65978c481af7f637cad021d93522d5">map.h</a>
  45.635 +</li>
  45.636 +<li>ucx_map_union_a()
  45.637 +: <a class="el" href="map_8h.html#ab6370c3fa8113fdad593ce4b0460c9c6">map.h</a>
  45.638 +</li>
  45.639 +<li>ucx_memcpy()
  45.640 +: <a class="el" href="utils_8h.html#ab2e184e6a744941aab6b8058116baf30">utils.h</a>
  45.641 +</li>
  45.642 +<li>ucx_mempool_calloc()
  45.643 +: <a class="el" href="mempool_8h.html#a4b9142011824ae24f00fabe128417d69">mempool.h</a>
  45.644 +</li>
  45.645 +<li>ucx_mempool_chcap()
  45.646 +: <a class="el" href="mempool_8h.html#aaf75b5016098723a9280531ccc3a6d77">mempool.h</a>
  45.647 +</li>
  45.648 +<li>ucx_mempool_destroy()
  45.649 +: <a class="el" href="mempool_8h.html#af096378da7e9bfbed3088497cf4c15bf">mempool.h</a>
  45.650 +</li>
  45.651 +<li>ucx_mempool_free()
  45.652 +: <a class="el" href="mempool_8h.html#aefa26e3015f5aefadbfc74221bd246ac">mempool.h</a>
  45.653 +</li>
  45.654 +<li>ucx_mempool_malloc()
  45.655 +: <a class="el" href="mempool_8h.html#a2ae492b8f2878ccc9837ac213dced11e">mempool.h</a>
  45.656 +</li>
  45.657 +<li>ucx_mempool_new()
  45.658 +: <a class="el" href="mempool_8h.html#ad71cb8c3b6fdb30360376a8b372ef22a">mempool.h</a>
  45.659 +</li>
  45.660 +<li>ucx_mempool_new_default
  45.661 +: <a class="el" href="mempool_8h.html#a49f7bd1da5ac201d0cf54dc0f0d82dd2">mempool.h</a>
  45.662 +</li>
  45.663 +<li>ucx_mempool_realloc()
  45.664 +: <a class="el" href="mempool_8h.html#a660ef42520ed6737c2e77aae18e3a7a4">mempool.h</a>
  45.665 +</li>
  45.666 +<li>ucx_mempool_reg_destr()
  45.667 +: <a class="el" href="mempool_8h.html#af47b6b7c40f8f263dc28cc9a4e77b27c">mempool.h</a>
  45.668 +</li>
  45.669 +<li>ucx_mempool_set_destr()
  45.670 +: <a class="el" href="mempool_8h.html#adb788e7ec24cd7dbdea6381539c549f2">mempool.h</a>
  45.671 +</li>
  45.672 +<li>ucx_properties2map()
  45.673 +: <a class="el" href="properties_8h.html#a5c7ff8bc3139960a3f3dc92072b742f3">properties.h</a>
  45.674 +</li>
  45.675 +<li>ucx_properties_fill()
  45.676 +: <a class="el" href="properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d">properties.h</a>
  45.677 +</li>
  45.678 +<li>ucx_properties_free()
  45.679 +: <a class="el" href="properties_8h.html#a38a2fe7bb2986bd87c7e69356ab05c05">properties.h</a>
  45.680 +</li>
  45.681 +<li>ucx_properties_load()
  45.682 +: <a class="el" href="properties_8h.html#ae1b600f839a6b2278b68fc314981a8a3">properties.h</a>
  45.683 +</li>
  45.684 +<li>ucx_properties_new()
  45.685 +: <a class="el" href="properties_8h.html#a44d9dd12cab3aaa0084f1c8b89405796">properties.h</a>
  45.686 +</li>
  45.687 +<li>ucx_properties_next()
  45.688 +: <a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c">properties.h</a>
  45.689 +</li>
  45.690 +<li>ucx_properties_store()
  45.691 +: <a class="el" href="properties_8h.html#a63c0c1b7648e675b21a1788917ff36fb">properties.h</a>
  45.692 +</li>
  45.693 +<li>ucx_sc2sc()
  45.694 +: <a class="el" href="string_8h.html#a69d5e3eeec783cc43314df71248768f5">string.h</a>
  45.695 +</li>
  45.696 +<li>ucx_sprintf
  45.697 +: <a class="el" href="utils_8h.html#af9f333b66ecd639c347c7235f4992e2e">utils.h</a>
  45.698 +</li>
  45.699 +<li>ucx_ss2c_s()
  45.700 +: <a class="el" href="string_8h.html#aedeb5d7bddda54116101a8d68af8c56d">string.h</a>
  45.701 +</li>
  45.702 +<li>ucx_ss2sc()
  45.703 +: <a class="el" href="string_8h.html#a9ce5ad1b2aa2dbeba204d452c2e64359">string.h</a>
  45.704 +</li>
  45.705 +<li>ucx_stack_avail()
  45.706 +: <a class="el" href="stack_8h.html#a53cd2c7743dc8ad9cbd35ade0b4873e7">stack.h</a>
  45.707 +</li>
  45.708 +<li>ucx_stack_calloc()
  45.709 +: <a class="el" href="stack_8h.html#afdc467524b5e19a9a777c6bc03e17174">stack.h</a>
  45.710 +</li>
  45.711 +<li>ucx_stack_dim
  45.712 +: <a class="el" href="stack_8h.html#a3b761343c6491222604341ebfa443226">stack.h</a>
  45.713 +</li>
  45.714 +<li>ucx_stack_empty
  45.715 +: <a class="el" href="stack_8h.html#a4f7239dbd6c032c56812e370b71c1985">stack.h</a>
  45.716 +</li>
  45.717 +<li>ucx_stack_free()
  45.718 +: <a class="el" href="stack_8h.html#aabd55c14a3866b3782ba324f4d8b4c41">stack.h</a>
  45.719 +</li>
  45.720 +<li>ucx_stack_init()
  45.721 +: <a class="el" href="stack_8h.html#abaef685df4e7ef95cd7218984a0618fe">stack.h</a>
  45.722 +</li>
  45.723 +<li>ucx_stack_malloc()
  45.724 +: <a class="el" href="stack_8h.html#af865b416802140f6b6e8ab3626d7d1ac">stack.h</a>
  45.725 +</li>
  45.726 +<li>ucx_stack_pop
  45.727 +: <a class="el" href="stack_8h.html#a506b82374734ec476d086ddfb561174d">stack.h</a>
  45.728 +</li>
  45.729 +<li>ucx_stack_popn()
  45.730 +: <a class="el" href="stack_8h.html#a07ea48f28eab474dcfefbb86fa66ef81">stack.h</a>
  45.731 +</li>
  45.732 +<li>ucx_stack_push()
  45.733 +: <a class="el" href="stack_8h.html#af85e6f77a8341beb6188f9ae1a8e9f92">stack.h</a>
  45.734 +</li>
  45.735 +<li>ucx_stack_pusharr()
  45.736 +: <a class="el" href="stack_8h.html#a7bb138979191bba138e76ea37488fae2">stack.h</a>
  45.737 +</li>
  45.738 +<li>ucx_stack_realloc()
  45.739 +: <a class="el" href="stack_8h.html#a0c678f96f6fabab49b2b034a1fe91c3a">stack.h</a>
  45.740 +</li>
  45.741 +<li>ucx_stack_topsize
  45.742 +: <a class="el" href="stack_8h.html#a030197051a803e87d5eeac5adb80b15a">stack.h</a>
  45.743 +</li>
  45.744 +<li>ucx_strcpy()
  45.745 +: <a class="el" href="utils_8h.html#adeb6e8d0a53a829207cfa0a979d01fff">utils.h</a>
  45.746 +</li>
  45.747 +<li>ucx_stream_bcopy
  45.748 +: <a class="el" href="utils_8h.html#a6003a1750a66234169bd1f8cc84b297b">utils.h</a>
  45.749 +</li>
  45.750 +<li>ucx_stream_bncopy()
  45.751 +: <a class="el" href="utils_8h.html#a114ee7f7da62656ffd35e2dc23394201">utils.h</a>
  45.752 +</li>
  45.753 +<li>ucx_stream_copy
  45.754 +: <a class="el" href="utils_8h.html#a41ca1344f781c0d3bf7a414a6e811392">utils.h</a>
  45.755 +</li>
  45.756 +<li>UCX_STREAM_COPY_BUFSIZE
  45.757 +: <a class="el" href="utils_8h.html#a23efd74fa5f701d4cf26ccbfd138a439">utils.h</a>
  45.758 +</li>
  45.759 +<li>ucx_stream_ncopy
  45.760 +: <a class="el" href="utils_8h.html#add13f39a8af440b4f7e6f74339eaada2">utils.h</a>
  45.761 +</li>
  45.762 +<li>ucx_szmul
  45.763 +: <a class="el" href="ucx_8h.html#a0b5ed6c1a0b15356f4f948acfd32a4cc">ucx.h</a>
  45.764 +</li>
  45.765 +<li>ucx_szmul_impl()
  45.766 +: <a class="el" href="ucx_8h.html#a6637171cc0ec097b297f731a3036dd3b">ucx.h</a>
  45.767 +</li>
  45.768 +<li>UCX_TEST
  45.769 +: <a class="el" href="test_8h.html#a66cfb29c329fc9eaef071f2449836659">test.h</a>
  45.770 +</li>
  45.771 +<li>UCX_TEST_ASSERT
  45.772 +: <a class="el" href="test_8h.html#a08f477cd12fc3fe741a92493e5df58a9">test.h</a>
  45.773 +</li>
  45.774 +<li>UCX_TEST_BEGIN
  45.775 +: <a class="el" href="test_8h.html#a0547b8d4f3bcdb0633fdd8925e8aa5d4">test.h</a>
  45.776 +</li>
  45.777 +<li>UCX_TEST_CALL_SUBROUTINE
  45.778 +: <a class="el" href="test_8h.html#a0efbab91c54f5237a2ab207f48cf0e51">test.h</a>
  45.779 +</li>
  45.780 +<li>UCX_TEST_END
  45.781 +: <a class="el" href="test_8h.html#a86e64857c04f0447f8b16fb9c2b3b639">test.h</a>
  45.782 +</li>
  45.783 +<li>ucx_test_register()
  45.784 +: <a class="el" href="test_8h.html#a8dfabc42f183d3a4d79379a5d17bf67d">test.h</a>
  45.785 +</li>
  45.786 +<li>ucx_test_run()
  45.787 +: <a class="el" href="test_8h.html#a3721458deeecb43aa322428f007714c3">test.h</a>
  45.788 +</li>
  45.789 +<li>UCX_TEST_SUBROUTINE
  45.790 +: <a class="el" href="test_8h.html#ae073cf5ead22cb27d662da048e16f44a">test.h</a>
  45.791 +</li>
  45.792 +<li>ucx_test_suite_free()
  45.793 +: <a class="el" href="test_8h.html#a4a6ac61a6f72722273f8eaa7a343edde">test.h</a>
  45.794 +</li>
  45.795 +<li>ucx_test_suite_new()
  45.796 +: <a class="el" href="test_8h.html#a531f0df90363e0befbe900878f65f09e">test.h</a>
  45.797 +</li>
  45.798 +<li>ucx_vasprintf()
  45.799 +: <a class="el" href="utils_8h.html#a3ea1dfb856c741f3e8ec6bfdc9ad427e">utils.h</a>
  45.800 +</li>
  45.801 +<li>UCX_VERSION
  45.802 +: <a class="el" href="ucx_8h.html#af12001920ca2fc1405615684e4dea284">ucx.h</a>
  45.803 +</li>
  45.804 +<li>UCX_VERSION_MAJOR
  45.805 +: <a class="el" href="ucx_8h.html#aa57e5dd22d42387d748cc16777df1383">ucx.h</a>
  45.806 +</li>
  45.807 +<li>UCX_VERSION_MINOR
  45.808 +: <a class="el" href="ucx_8h.html#a9ac10d6353e23d4615a87fc737c65eb0">ucx.h</a>
  45.809 +</li>
  45.810 +<li>ucx_vfprintf()
  45.811 +: <a class="el" href="utils_8h.html#a4907967beb92c3ae351dd239abbb6927">utils.h</a>
  45.812 +</li>
  45.813 +<li>UcxAVLNode
  45.814 +: <a class="el" href="avl_8h.html#a08ba2496c2316df58548c3cc29712add">avl.h</a>
  45.815 +</li>
  45.816 +<li>UcxKey
  45.817 +: <a class="el" href="map_8h.html#ad63828bb23123fc01a5315a2bac3b142">map.h</a>
  45.818 +</li>
  45.819 +<li>UcxList
  45.820 +: <a class="el" href="list_8h.html#aa6f89f91c1081c9a7c6866c298f497a2">list.h</a>
  45.821 +</li>
  45.822 +<li>UcxMap
  45.823 +: <a class="el" href="map_8h.html#a18e21948725b2da68c35da587a722033">map.h</a>
  45.824 +</li>
  45.825 +<li>UcxMapElement
  45.826 +: <a class="el" href="map_8h.html#ad7d7a910a32113eb93eae11c3dc97b4b">map.h</a>
  45.827 +</li>
  45.828 +<li>UcxMapIterator
  45.829 +: <a class="el" href="map_8h.html#ae36aff5f645948c54f51578b11fd87fb">map.h</a>
  45.830 +</li>
  45.831 +<li>UcxTest
  45.832 +: <a class="el" href="test_8h.html#ae906817354c010b83c2784260cce7a1c">test.h</a>
  45.833 +</li>
  45.834 +<li>UcxTestList
  45.835 +: <a class="el" href="test_8h.html#a8048c50ae73ea690b776edfd63bd6a5d">test.h</a>
  45.836 +</li>
  45.837 +<li>UcxTestSuite
  45.838 +: <a class="el" href="test_8h.html#a52115d1d0f1c4a565ed6ef7c1bfd0363">test.h</a>
  45.839 +</li>
  45.840 +</ul>
  45.841 +</div><!-- contents -->
  45.842 +<!-- start footer part -->
  45.843 +<hr class="footer"/><address class="footer"><small>
  45.844 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  45.845 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  45.846 +</a> 1.8.13
  45.847 +</small></address>
  45.848 +</body>
  45.849 +</html>
    46.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    46.2 +++ b/docs/api-2.1/globals_w.html	Sat Feb 06 19:11:44 2021 +0100
    46.3 @@ -0,0 +1,78 @@
    46.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    46.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    46.6 +<head>
    46.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    46.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    46.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   46.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   46.11 +<title>ucx: Globals</title>
   46.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   46.13 +<script type="text/javascript" src="jquery.js"></script>
   46.14 +<script type="text/javascript" src="dynsections.js"></script>
   46.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   46.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   46.17 +<script type="text/javascript" src="search/search.js"></script>
   46.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   46.19 +</head>
   46.20 +<body>
   46.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   46.22 +<div id="titlearea">
   46.23 +<table cellspacing="0" cellpadding="0">
   46.24 + <tbody>
   46.25 + <tr style="height: 56px;">
   46.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   46.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   46.28 +   <div id="projectname">ucx
   46.29 +   </div>
   46.30 +   <div id="projectbrief">UAP Common Extensions</div>
   46.31 +  </td>
   46.32 + </tr>
   46.33 + </tbody>
   46.34 +</table>
   46.35 +</div>
   46.36 +<!-- end header part -->
   46.37 +<!-- Generated by Doxygen 1.8.13 -->
   46.38 +<script type="text/javascript">
   46.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   46.40 +</script>
   46.41 +<script type="text/javascript" src="menudata.js"></script>
   46.42 +<script type="text/javascript" src="menu.js"></script>
   46.43 +<script type="text/javascript">
   46.44 +$(function() {
   46.45 +  initMenu('',true,false,'search.php','Search');
   46.46 +  $(document).ready(function() { init_search(); });
   46.47 +});
   46.48 +</script>
   46.49 +<div id="main-nav"></div>
   46.50 +</div><!-- top -->
   46.51 +<!-- window showing the filter options -->
   46.52 +<div id="MSearchSelectWindow"
   46.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   46.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   46.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   46.56 +</div>
   46.57 +
   46.58 +<!-- iframe showing the search results (closed by default) -->
   46.59 +<div id="MSearchResultsWindow">
   46.60 +<iframe src="javascript:void(0)" frameborder="0" 
   46.61 +        name="MSearchResults" id="MSearchResults">
   46.62 +</iframe>
   46.63 +</div>
   46.64 +
   46.65 +<div class="contents">
   46.66 +<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
   46.67 +
   46.68 +<h3><a id="index_w"></a>- w -</h3><ul>
   46.69 +<li>write_func
   46.70 +: <a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">ucx.h</a>
   46.71 +</li>
   46.72 +</ul>
   46.73 +</div><!-- contents -->
   46.74 +<!-- start footer part -->
   46.75 +<hr class="footer"/><address class="footer"><small>
   46.76 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
   46.77 +<img class="footer" src="doxygen.png" alt="doxygen"/>
   46.78 +</a> 1.8.13
   46.79 +</small></address>
   46.80 +</body>
   46.81 +</html>
    47.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    47.2 +++ b/docs/api-2.1/index.html	Sat Feb 06 19:11:44 2021 +0100
    47.3 @@ -0,0 +1,88 @@
    47.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    47.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    47.6 +<head>
    47.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    47.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    47.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   47.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   47.11 +<title>ucx: UAP Common Extensions</title>
   47.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   47.13 +<script type="text/javascript" src="jquery.js"></script>
   47.14 +<script type="text/javascript" src="dynsections.js"></script>
   47.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   47.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   47.17 +<script type="text/javascript" src="search/search.js"></script>
   47.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   47.19 +</head>
   47.20 +<body>
   47.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   47.22 +<div id="titlearea">
   47.23 +<table cellspacing="0" cellpadding="0">
   47.24 + <tbody>
   47.25 + <tr style="height: 56px;">
   47.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   47.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   47.28 +   <div id="projectname">ucx
   47.29 +   </div>
   47.30 +   <div id="projectbrief">UAP Common Extensions</div>
   47.31 +  </td>
   47.32 + </tr>
   47.33 + </tbody>
   47.34 +</table>
   47.35 +</div>
   47.36 +<!-- end header part -->
   47.37 +<!-- Generated by Doxygen 1.8.13 -->
   47.38 +<script type="text/javascript">
   47.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   47.40 +</script>
   47.41 +<script type="text/javascript" src="menudata.js"></script>
   47.42 +<script type="text/javascript" src="menu.js"></script>
   47.43 +<script type="text/javascript">
   47.44 +$(function() {
   47.45 +  initMenu('',true,false,'search.php','Search');
   47.46 +  $(document).ready(function() { init_search(); });
   47.47 +});
   47.48 +</script>
   47.49 +<div id="main-nav"></div>
   47.50 +</div><!-- top -->
   47.51 +<!-- window showing the filter options -->
   47.52 +<div id="MSearchSelectWindow"
   47.53 +     onmouseover="return searchBox.OnSearchSelectShow()"
   47.54 +     onmouseout="return searchBox.OnSearchSelectHide()"
   47.55 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   47.56 +</div>
   47.57 +
   47.58 +<!-- iframe showing the search results (closed by default) -->
   47.59 +<div id="MSearchResultsWindow">
   47.60 +<iframe src="javascript:void(0)" frameborder="0" 
   47.61 +        name="MSearchResults" id="MSearchResults">
   47.62 +</iframe>
   47.63 +</div>
   47.64 +
   47.65 +<div class="header">
   47.66 +  <div class="headertitle">
   47.67 +<div class="title">UAP Common Extensions </div>  </div>
   47.68 +</div><!--header-->
   47.69 +<div class="contents">
   47.70 +<div class="textblock"><p>Library with common and useful functions, macros and data structures.</p>
   47.71 +<p>Latest available source:<br />
   47.72 + <a href="https://sourceforge.net/projects/ucx/files/">https://sourceforge.net/projects/ucx/files/</a> </p>
   47.73 +<p>Repositories:<br />
   47.74 + <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>
   47.75 +<h2>LICENCE</h2>
   47.76 +<p>Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.</p>
   47.77 +<p>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p>
   47.78 +<ol type="1">
   47.79 +<li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li>
   47.80 +<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>
   47.81 +</ol>
   47.82 +<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>
   47.83 +</div></div><!-- contents -->
   47.84 +<!-- start footer part -->
   47.85 +<hr class="footer"/><address class="footer"><small>
   47.86 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
   47.87 +<img class="footer" src="doxygen.png" alt="doxygen"/>
   47.88 +</a> 1.8.13
   47.89 +</small></address>
   47.90 +</body>
   47.91 +</html>
    48.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    48.2 +++ b/docs/api-2.1/jquery.js	Sat Feb 06 19:11:44 2021 +0100
    48.3 @@ -0,0 +1,87 @@
    48.4 +/*!
    48.5 + * jQuery JavaScript Library v1.7.1
    48.6 + * http://jquery.com/
    48.7 + *
    48.8 + * Copyright 2011, John Resig
    48.9 + * Dual licensed under the MIT or GPL Version 2 licenses.
   48.10 + * http://jquery.org/license
   48.11 + *
   48.12 + * Includes Sizzle.js
   48.13 + * http://sizzlejs.com/
   48.14 + * Copyright 2011, The Dojo Foundation
   48.15 + * Released under the MIT, BSD, and GPL Licenses.
   48.16 + *
   48.17 + * Date: Mon Nov 21 21:11:03 2011 -0500
   48.18 + */
   48.19 +(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}});
   48.20 +/*!
   48.21 + * Sizzle CSS Selector Engine
   48.22 + *  Copyright 2011, The Dojo Foundation
   48.23 + *  Released under the MIT, BSD, and GPL Licenses.
   48.24 + *  More information: http://sizzlejs.com/
   48.25 + */
   48.26 +(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);/*!
   48.27 + * jQuery UI 1.8.18
   48.28 + *
   48.29 + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
   48.30 + * Dual licensed under the MIT or GPL Version 2 licenses.
   48.31 + * http://jquery.org/license
   48.32 + *
   48.33 + * http://docs.jquery.com/UI
   48.34 + */
   48.35 +(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);/*!
   48.36 + * jQuery UI Widget 1.8.18
   48.37 + *
   48.38 + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
   48.39 + * Dual licensed under the MIT or GPL Version 2 licenses.
   48.40 + * http://jquery.org/license
   48.41 + *
   48.42 + * http://docs.jquery.com/UI/Widget
   48.43 + */
   48.44 +(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);/*!
   48.45 + * jQuery UI Mouse 1.8.18
   48.46 + *
   48.47 + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
   48.48 + * Dual licensed under the MIT or GPL Version 2 licenses.
   48.49 + * http://jquery.org/license
   48.50 + *
   48.51 + * http://docs.jquery.com/UI/Mouse
   48.52 + *
   48.53 + * Depends:
   48.54 + *	jquery.ui.widget.js
   48.55 + */
   48.56 +(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);/*!
   48.57 + * jQuery hashchange event - v1.3 - 7/21/2010
   48.58 + * http://benalman.com/projects/jquery-hashchange-plugin/
   48.59 + * 
   48.60 + * Copyright (c) 2010 "Cowboy" Ben Alman
   48.61 + * Dual licensed under the MIT and GPL licenses.
   48.62 + * http://benalman.com/about/license/
   48.63 + */
   48.64 +(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);/*!
   48.65 + PowerTip - v1.2.0 - 2013-04-03
   48.66 + http://stevenbenner.github.com/jquery-powertip/
   48.67 + Copyright (c) 2013 Steven Benner (http://stevenbenner.com/).
   48.68 + Released under MIT license.
   48.69 + https://raw.github.com/stevenbenner/jquery-powertip/master/LICENSE.txt
   48.70 +*/
   48.71 +(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}}));/*!
   48.72 + * jQuery UI Touch Punch 0.2.3
   48.73 + *
   48.74 + * Copyright 2011–2014, Dave Furfero
   48.75 + * Dual licensed under the MIT or GPL Version 2 licenses.
   48.76 + *
   48.77 + * Depends:
   48.78 + *  jquery.ui.widget.js
   48.79 + *  jquery.ui.mouse.js
   48.80 + */
   48.81 +(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);/*!
   48.82 + * SmartMenus jQuery Plugin - v1.0.0 - January 27, 2016
   48.83 + * http://www.smartmenus.org/
   48.84 + *
   48.85 + * Copyright Vasil Dinkov, Vadikom Web Ltd.
   48.86 + * http://vadikom.com
   48.87 + *
   48.88 + * Licensed MIT
   48.89 + */
   48.90 +(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}));
   48.91 \ No newline at end of file
    49.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    49.2 +++ b/docs/api-2.1/list_8h.html	Sat Feb 06 19:11:44 2021 +0100
    49.3 @@ -0,0 +1,1556 @@
    49.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    49.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    49.6 +<head>
    49.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    49.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    49.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   49.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   49.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/list.h File Reference</title>
   49.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   49.13 +<script type="text/javascript" src="jquery.js"></script>
   49.14 +<script type="text/javascript" src="dynsections.js"></script>
   49.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   49.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   49.17 +<script type="text/javascript" src="search/search.js"></script>
   49.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   49.19 +</head>
   49.20 +<body>
   49.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   49.22 +<div id="titlearea">
   49.23 +<table cellspacing="0" cellpadding="0">
   49.24 + <tbody>
   49.25 + <tr style="height: 56px;">
   49.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   49.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   49.28 +   <div id="projectname">ucx
   49.29 +   </div>
   49.30 +   <div id="projectbrief">UAP Common Extensions</div>
   49.31 +  </td>
   49.32 + </tr>
   49.33 + </tbody>
   49.34 +</table>
   49.35 +</div>
   49.36 +<!-- end header part -->
   49.37 +<!-- Generated by Doxygen 1.8.13 -->
   49.38 +<script type="text/javascript">
   49.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   49.40 +</script>
   49.41 +<script type="text/javascript" src="menudata.js"></script>
   49.42 +<script type="text/javascript" src="menu.js"></script>
   49.43 +<script type="text/javascript">
   49.44 +$(function() {
   49.45 +  initMenu('',true,false,'search.php','Search');
   49.46 +  $(document).ready(function() { init_search(); });
   49.47 +});
   49.48 +</script>
   49.49 +<div id="main-nav"></div>
   49.50 +<!-- window showing the filter options -->
   49.51 +<div id="MSearchSelectWindow"
   49.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   49.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   49.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   49.55 +</div>
   49.56 +
   49.57 +<!-- iframe showing the search results (closed by default) -->
   49.58 +<div id="MSearchResultsWindow">
   49.59 +<iframe src="javascript:void(0)" frameborder="0" 
   49.60 +        name="MSearchResults" id="MSearchResults">
   49.61 +</iframe>
   49.62 +</div>
   49.63 +
   49.64 +<div id="nav-path" class="navpath">
   49.65 +  <ul>
   49.66 +<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>
   49.67 +</div>
   49.68 +</div><!-- top -->
   49.69 +<div class="header">
   49.70 +  <div class="summary">
   49.71 +<a href="#nested-classes">Data Structures</a> &#124;
   49.72 +<a href="#define-members">Macros</a> &#124;
   49.73 +<a href="#typedef-members">Typedefs</a> &#124;
   49.74 +<a href="#func-members">Functions</a>  </div>
   49.75 +  <div class="headertitle">
   49.76 +<div class="title">list.h File Reference</div>  </div>
   49.77 +</div><!--header-->
   49.78 +<div class="contents">
   49.79 +
   49.80 +<p>Doubly linked list implementation.  
   49.81 +<a href="#details">More...</a></p>
   49.82 +<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
   49.83 +<code>#include &quot;<a class="el" href="allocator_8h_source.html">allocator.h</a>&quot;</code><br />
   49.84 +</div>
   49.85 +<p><a href="list_8h_source.html">Go to the source code of this file.</a></p>
   49.86 +<table class="memberdecls">
   49.87 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
   49.88 +Data Structures</h2></td></tr>
   49.89 +<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>
   49.90 +<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX list structure.  <a href="structUcxList.html#details">More...</a><br /></td></tr>
   49.91 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   49.92 +</table><table class="memberdecls">
   49.93 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
   49.94 +Macros</h2></td></tr>
   49.95 +<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>
   49.96 +<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>
   49.97 +<tr class="separator:a4b143b6526a410aa4d22cb3bb9365d70"><td class="memSeparator" colspan="2">&#160;</td></tr>
   49.98 +</table><table class="memberdecls">
   49.99 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
  49.100 +Typedefs</h2></td></tr>
  49.101 +<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>
  49.102 +<tr class="memdesc:aa6f89f91c1081c9a7c6866c298f497a2"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX list type.  <a href="#aa6f89f91c1081c9a7c6866c298f497a2">More...</a><br /></td></tr>
  49.103 +<tr class="separator:aa6f89f91c1081c9a7c6866c298f497a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.104 +</table><table class="memberdecls">
  49.105 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
  49.106 +Functions</h2></td></tr>
  49.107 +<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>
  49.108 +<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>
  49.109 +<tr class="separator:ae7054a41c289b24e6caf5cb07ac850ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.110 +<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>
  49.111 +<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>
  49.112 +<tr class="separator:a08ca1ba0d2e82258b0408714c1f4c425"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.113 +<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>
  49.114 +<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>
  49.115 +<tr class="separator:adc435447cecf885bc63d232191085bbe"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.116 +<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>
  49.117 +<tr class="memdesc:a1a0fa2c5b1e478a96da19b0c3f013668"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys the entire list.  <a href="#a1a0fa2c5b1e478a96da19b0c3f013668">More...</a><br /></td></tr>
  49.118 +<tr class="separator:a1a0fa2c5b1e478a96da19b0c3f013668"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.119 +<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>
  49.120 +<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>
  49.121 +<tr class="separator:a944e11f76c38767cd1100d72a4e3b25b"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.122 +<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>
  49.123 +<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>
  49.124 +<tr class="separator:a4ba6c96642f72ea046cc22627c72979c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.125 +<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>
  49.126 +<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>
  49.127 +<tr class="separator:a00c122c8a26d35b60676939df4161621"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.128 +<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>
  49.129 +<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>
  49.130 +<tr class="separator:adf3b3e2e0ff977d8928671d6bd82fc60"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.131 +<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>
  49.132 +<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>
  49.133 +<tr class="separator:a8fcb68e4556395b15180eec2d0b77aa4"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.134 +<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>
  49.135 +<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>
  49.136 +<tr class="separator:a54654e6dc60e1c3de9e886c150e404ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.137 +<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>
  49.138 +<tr class="memdesc:a77163a0cc82fae52bec26c8c0c3674d9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatenates two lists.  <a href="#a77163a0cc82fae52bec26c8c0c3674d9">More...</a><br /></td></tr>
  49.139 +<tr class="separator:a77163a0cc82fae52bec26c8c0c3674d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.140 +<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>
  49.141 +<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>
  49.142 +<tr class="separator:a6aa0e34ebc5f0dca6f52d0f7626b4bd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.143 +<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>
  49.144 +<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>
  49.145 +<tr class="separator:add5ec40c5006e29c629d23c2eb5a6553"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.146 +<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>
  49.147 +<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>
  49.148 +<tr class="separator:a2509ffe19bce6a8708c77f89480c75fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.149 +<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>
  49.150 +<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>
  49.151 +<tr class="separator:ae2ff2974812ca185870f80bc4ed9337e"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.152 +<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>
  49.153 +<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>
  49.154 +<tr class="separator:ae88001cc8ae40b946560f31434abed8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.155 +<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>
  49.156 +<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>
  49.157 +<tr class="separator:a9b3b6842d3be572e06a7f519e198cb83"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.158 +<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>
  49.159 +<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>
  49.160 +<tr class="separator:a8b0fa051fcfe12e1a82cca1087973852"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.161 +<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>
  49.162 +<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>
  49.163 +<tr class="separator:ac74962d9bd7cfc9d3e2e09651469377b"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.164 +<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>
  49.165 +<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>
  49.166 +<tr class="separator:a410cb3e8260037ba56c72d14b899b468"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.167 +<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>
  49.168 +<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>
  49.169 +<tr class="separator:aca687b7c4e7170175f447e549125aa52"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.170 +<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>
  49.171 +<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>
  49.172 +<tr class="separator:a94ecdb0cea1633ad7074f027fa8485fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.173 +<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>
  49.174 +<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>
  49.175 +<tr class="separator:a65b4355536f4ebc4130211b46469f4c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.176 +<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>
  49.177 +<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>
  49.178 +<tr class="separator:a259f9b754978aeca23dfabba16e20f39"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.179 +<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>
  49.180 +<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>
  49.181 +<tr class="separator:a1d0b00514dbb81ba6270b58da0c5b9a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.182 +<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>
  49.183 +<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>
  49.184 +<tr class="separator:a6c5db5d1d11ad28b6fe1a80ee1c1e449"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.185 +<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>
  49.186 +<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>
  49.187 +<tr class="separator:a4a2a2fc5cc41073c516db6235bbc51d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
  49.188 +</table>
  49.189 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  49.190 +<div class="textblock"><p>Doubly linked list implementation. </p>
  49.191 +<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
  49.192 +<dd>
  49.193 +Olaf Wintermann </dd></dl>
  49.194 +</div><h2 class="groupheader">Macro Definition Documentation</h2>
  49.195 +<a id="a4b143b6526a410aa4d22cb3bb9365d70"></a>
  49.196 +<h2 class="memtitle"><span class="permalink"><a href="#a4b143b6526a410aa4d22cb3bb9365d70">&#9670;&nbsp;</a></span>UCX_FOREACH</h2>
  49.197 +
  49.198 +<div class="memitem">
  49.199 +<div class="memproto">
  49.200 +      <table class="memname">
  49.201 +        <tr>
  49.202 +          <td class="memname">#define UCX_FOREACH</td>
  49.203 +          <td>(</td>
  49.204 +          <td class="paramtype">&#160;</td>
  49.205 +          <td class="paramname">elem, </td>
  49.206 +        </tr>
  49.207 +        <tr>
  49.208 +          <td class="paramkey"></td>
  49.209 +          <td></td>
  49.210 +          <td class="paramtype">&#160;</td>
  49.211 +          <td class="paramname">list&#160;</td>
  49.212 +        </tr>
  49.213 +        <tr>
  49.214 +          <td></td>
  49.215 +          <td>)</td>
  49.216 +          <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>
  49.217 +        </tr>
  49.218 +      </table>
  49.219 +</div><div class="memdoc">
  49.220 +
  49.221 +<p>Loop statement for UCX lists. </p>
  49.222 +<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>
  49.223 +<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>
  49.224 +<dl class="params"><dt>Parameters</dt><dd>
  49.225 +  <table class="params">
  49.226 +    <tr><td class="paramname">list</td><td>The first element of the list </td></tr>
  49.227 +    <tr><td class="paramname">elem</td><td>The variable name of the element </td></tr>
  49.228 +  </table>
  49.229 +  </dd>
  49.230 +</dl>
  49.231 +
  49.232 +</div>
  49.233 +</div>
  49.234 +<h2 class="groupheader">Typedef Documentation</h2>
  49.235 +<a id="aa6f89f91c1081c9a7c6866c298f497a2"></a>
  49.236 +<h2 class="memtitle"><span class="permalink"><a href="#aa6f89f91c1081c9a7c6866c298f497a2">&#9670;&nbsp;</a></span>UcxList</h2>
  49.237 +
  49.238 +<div class="memitem">
  49.239 +<div class="memproto">
  49.240 +      <table class="memname">
  49.241 +        <tr>
  49.242 +          <td class="memname">typedef struct <a class="el" href="structUcxList.html">UcxList</a> <a class="el" href="structUcxList.html">UcxList</a></td>
  49.243 +        </tr>
  49.244 +      </table>
  49.245 +</div><div class="memdoc">
  49.246 +
  49.247 +<p>UCX list type. </p>
  49.248 +<dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxList.html" title="UCX list structure. ">UcxList</a> </dd></dl>
  49.249 +
  49.250 +</div>
  49.251 +</div>
  49.252 +<h2 class="groupheader">Function Documentation</h2>
  49.253 +<a id="a00c122c8a26d35b60676939df4161621"></a>
  49.254 +<h2 class="memtitle"><span class="permalink"><a href="#a00c122c8a26d35b60676939df4161621">&#9670;&nbsp;</a></span>ucx_list_append()</h2>
  49.255 +
  49.256 +<div class="memitem">
  49.257 +<div class="memproto">
  49.258 +      <table class="memname">
  49.259 +        <tr>
  49.260 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_append </td>
  49.261 +          <td>(</td>
  49.262 +          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.263 +          <td class="paramname"><em>list</em>, </td>
  49.264 +        </tr>
  49.265 +        <tr>
  49.266 +          <td class="paramkey"></td>
  49.267 +          <td></td>
  49.268 +          <td class="paramtype">void *&#160;</td>
  49.269 +          <td class="paramname"><em>data</em>&#160;</td>
  49.270 +        </tr>
  49.271 +        <tr>
  49.272 +          <td></td>
  49.273 +          <td>)</td>
  49.274 +          <td></td><td></td>
  49.275 +        </tr>
  49.276 +      </table>
  49.277 +</div><div class="memdoc">
  49.278 +
  49.279 +<p>Inserts an element at the end of the list. </p>
  49.280 +<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>
  49.281 +<dl class="params"><dt>Parameters</dt><dd>
  49.282 +  <table class="params">
  49.283 +    <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>
  49.284 +    <tr><td class="paramname">data</td><td>the data to insert </td></tr>
  49.285 +  </table>
  49.286 +  </dd>
  49.287 +</dl>
  49.288 +<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>
  49.289 +
  49.290 +</div>
  49.291 +</div>
  49.292 +<a id="adf3b3e2e0ff977d8928671d6bd82fc60"></a>
  49.293 +<h2 class="memtitle"><span class="permalink"><a href="#adf3b3e2e0ff977d8928671d6bd82fc60">&#9670;&nbsp;</a></span>ucx_list_append_a()</h2>
  49.294 +
  49.295 +<div class="memitem">
  49.296 +<div class="memproto">
  49.297 +      <table class="memname">
  49.298 +        <tr>
  49.299 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_append_a </td>
  49.300 +          <td>(</td>
  49.301 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
  49.302 +          <td class="paramname"><em>allocator</em>, </td>
  49.303 +        </tr>
  49.304 +        <tr>
  49.305 +          <td class="paramkey"></td>
  49.306 +          <td></td>
  49.307 +          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.308 +          <td class="paramname"><em>list</em>, </td>
  49.309 +        </tr>
  49.310 +        <tr>
  49.311 +          <td class="paramkey"></td>
  49.312 +          <td></td>
  49.313 +          <td class="paramtype">void *&#160;</td>
  49.314 +          <td class="paramname"><em>data</em>&#160;</td>
  49.315 +        </tr>
  49.316 +        <tr>
  49.317 +          <td></td>
  49.318 +          <td>)</td>
  49.319 +          <td></td><td></td>
  49.320 +        </tr>
  49.321 +      </table>
  49.322 +</div><div class="memdoc">
  49.323 +
  49.324 +<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>
  49.325 +<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>
  49.326 +<dl class="params"><dt>Parameters</dt><dd>
  49.327 +  <table class="params">
  49.328 +    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
  49.329 +    <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>
  49.330 +    <tr><td class="paramname">data</td><td>the data to insert </td></tr>
  49.331 +  </table>
  49.332 +  </dd>
  49.333 +</dl>
  49.334 +<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>
  49.335 +<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>
  49.336 +
  49.337 +</div>
  49.338 +</div>
  49.339 +<a id="ae7054a41c289b24e6caf5cb07ac850ed"></a>
  49.340 +<h2 class="memtitle"><span class="permalink"><a href="#ae7054a41c289b24e6caf5cb07ac850ed">&#9670;&nbsp;</a></span>ucx_list_clone()</h2>
  49.341 +
  49.342 +<div class="memitem">
  49.343 +<div class="memproto">
  49.344 +      <table class="memname">
  49.345 +        <tr>
  49.346 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_clone </td>
  49.347 +          <td>(</td>
  49.348 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.349 +          <td class="paramname"><em>list</em>, </td>
  49.350 +        </tr>
  49.351 +        <tr>
  49.352 +          <td class="paramkey"></td>
  49.353 +          <td></td>
  49.354 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
  49.355 +          <td class="paramname"><em>cpyfnc</em>, </td>
  49.356 +        </tr>
  49.357 +        <tr>
  49.358 +          <td class="paramkey"></td>
  49.359 +          <td></td>
  49.360 +          <td class="paramtype">void *&#160;</td>
  49.361 +          <td class="paramname"><em>data</em>&#160;</td>
  49.362 +        </tr>
  49.363 +        <tr>
  49.364 +          <td></td>
  49.365 +          <td>)</td>
  49.366 +          <td></td><td></td>
  49.367 +        </tr>
  49.368 +      </table>
  49.369 +</div><div class="memdoc">
  49.370 +
  49.371 +<p>Creates an element-wise copy of a list. </p>
  49.372 +<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>
  49.373 +<dl class="params"><dt>Parameters</dt><dd>
  49.374 +  <table class="params">
  49.375 +    <tr><td class="paramname">list</td><td>the list to copy </td></tr>
  49.376 +    <tr><td class="paramname">cpyfnc</td><td>a pointer to the function that shall copy an element (may be <code>NULL</code>) </td></tr>
  49.377 +    <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>
  49.378 +  </table>
  49.379 +  </dd>
  49.380 +</dl>
  49.381 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the copy </dd></dl>
  49.382 +
  49.383 +</div>
  49.384 +</div>
  49.385 +<a id="a08ca1ba0d2e82258b0408714c1f4c425"></a>
  49.386 +<h2 class="memtitle"><span class="permalink"><a href="#a08ca1ba0d2e82258b0408714c1f4c425">&#9670;&nbsp;</a></span>ucx_list_clone_a()</h2>
  49.387 +
  49.388 +<div class="memitem">
  49.389 +<div class="memproto">
  49.390 +      <table class="memname">
  49.391 +        <tr>
  49.392 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_clone_a </td>
  49.393 +          <td>(</td>
  49.394 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
  49.395 +          <td class="paramname"><em>allocator</em>, </td>
  49.396 +        </tr>
  49.397 +        <tr>
  49.398 +          <td class="paramkey"></td>
  49.399 +          <td></td>
  49.400 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.401 +          <td class="paramname"><em>list</em>, </td>
  49.402 +        </tr>
  49.403 +        <tr>
  49.404 +          <td class="paramkey"></td>
  49.405 +          <td></td>
  49.406 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
  49.407 +          <td class="paramname"><em>cpyfnc</em>, </td>
  49.408 +        </tr>
  49.409 +        <tr>
  49.410 +          <td class="paramkey"></td>
  49.411 +          <td></td>
  49.412 +          <td class="paramtype">void *&#160;</td>
  49.413 +          <td class="paramname"><em>data</em>&#160;</td>
  49.414 +        </tr>
  49.415 +        <tr>
  49.416 +          <td></td>
  49.417 +          <td>)</td>
  49.418 +          <td></td><td></td>
  49.419 +        </tr>
  49.420 +      </table>
  49.421 +</div><div class="memdoc">
  49.422 +
  49.423 +<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>
  49.424 +<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>
  49.425 +<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>
  49.426 +<dl class="params"><dt>Parameters</dt><dd>
  49.427 +  <table class="params">
  49.428 +    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
  49.429 +    <tr><td class="paramname">list</td><td>the list to copy </td></tr>
  49.430 +    <tr><td class="paramname">cpyfnc</td><td>a pointer to the function that shall copy an element (may be <code>NULL</code>) </td></tr>
  49.431 +    <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>
  49.432 +  </table>
  49.433 +  </dd>
  49.434 +</dl>
  49.435 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the copy </dd></dl>
  49.436 +<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>
  49.437 +
  49.438 +</div>
  49.439 +</div>
  49.440 +<a id="a77163a0cc82fae52bec26c8c0c3674d9"></a>
  49.441 +<h2 class="memtitle"><span class="permalink"><a href="#a77163a0cc82fae52bec26c8c0c3674d9">&#9670;&nbsp;</a></span>ucx_list_concat()</h2>
  49.442 +
  49.443 +<div class="memitem">
  49.444 +<div class="memproto">
  49.445 +      <table class="memname">
  49.446 +        <tr>
  49.447 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_concat </td>
  49.448 +          <td>(</td>
  49.449 +          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.450 +          <td class="paramname"><em>list1</em>, </td>
  49.451 +        </tr>
  49.452 +        <tr>
  49.453 +          <td class="paramkey"></td>
  49.454 +          <td></td>
  49.455 +          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.456 +          <td class="paramname"><em>list2</em>&#160;</td>
  49.457 +        </tr>
  49.458 +        <tr>
  49.459 +          <td></td>
  49.460 +          <td>)</td>
  49.461 +          <td></td><td></td>
  49.462 +        </tr>
  49.463 +      </table>
  49.464 +</div><div class="memdoc">
  49.465 +
  49.466 +<p>Concatenates two lists. </p>
  49.467 +<p>Either of the two arguments may be <code>NULL</code>.</p>
  49.468 +<p>This function modifies the references to the next/previous element of the last/first element of <code>list1</code>/<code> list2</code>.</p>
  49.469 +<dl class="params"><dt>Parameters</dt><dd>
  49.470 +  <table class="params">
  49.471 +    <tr><td class="paramname">list1</td><td>first list </td></tr>
  49.472 +    <tr><td class="paramname">list2</td><td>second list </td></tr>
  49.473 +  </table>
  49.474 +  </dd>
  49.475 +</dl>
  49.476 +<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>
  49.477 +
  49.478 +</div>
  49.479 +</div>
  49.480 +<a id="a8b0fa051fcfe12e1a82cca1087973852"></a>
  49.481 +<h2 class="memtitle"><span class="permalink"><a href="#a8b0fa051fcfe12e1a82cca1087973852">&#9670;&nbsp;</a></span>ucx_list_contains()</h2>
  49.482 +
  49.483 +<div class="memitem">
  49.484 +<div class="memproto">
  49.485 +      <table class="memname">
  49.486 +        <tr>
  49.487 +          <td class="memname">int ucx_list_contains </td>
  49.488 +          <td>(</td>
  49.489 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.490 +          <td class="paramname"><em>list</em>, </td>
  49.491 +        </tr>
  49.492 +        <tr>
  49.493 +          <td class="paramkey"></td>
  49.494 +          <td></td>
  49.495 +          <td class="paramtype">void *&#160;</td>
  49.496 +          <td class="paramname"><em>elem</em>, </td>
  49.497 +        </tr>
  49.498 +        <tr>
  49.499 +          <td class="paramkey"></td>
  49.500 +          <td></td>
  49.501 +          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
  49.502 +          <td class="paramname"><em>cmpfnc</em>, </td>
  49.503 +        </tr>
  49.504 +        <tr>
  49.505 +          <td class="paramkey"></td>
  49.506 +          <td></td>
  49.507 +          <td class="paramtype">void *&#160;</td>
  49.508 +          <td class="paramname"><em>data</em>&#160;</td>
  49.509 +        </tr>
  49.510 +        <tr>
  49.511 +          <td></td>
  49.512 +          <td>)</td>
  49.513 +          <td></td><td></td>
  49.514 +        </tr>
  49.515 +      </table>
  49.516 +</div><div class="memdoc">
  49.517 +
  49.518 +<p>Checks, if a list contains a specific element. </p>
  49.519 +<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>
  49.520 +<dl class="params"><dt>Parameters</dt><dd>
  49.521 +  <table class="params">
  49.522 +    <tr><td class="paramname">list</td><td>the list where to search for the data </td></tr>
  49.523 +    <tr><td class="paramname">elem</td><td>the element data </td></tr>
  49.524 +    <tr><td class="paramname">cmpfnc</td><td>the compare function </td></tr>
  49.525 +    <tr><td class="paramname">data</td><td>additional data for the compare function </td></tr>
  49.526 +  </table>
  49.527 +  </dd>
  49.528 +</dl>
  49.529 +<dl class="section return"><dt>Returns</dt><dd>1, if and only if the list contains the specified element data </dd></dl>
  49.530 +<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>
  49.531 +
  49.532 +</div>
  49.533 +</div>
  49.534 +<a id="a6c5db5d1d11ad28b6fe1a80ee1c1e449"></a>
  49.535 +<h2 class="memtitle"><span class="permalink"><a href="#a6c5db5d1d11ad28b6fe1a80ee1c1e449">&#9670;&nbsp;</a></span>ucx_list_difference()</h2>
  49.536 +
  49.537 +<div class="memitem">
  49.538 +<div class="memproto">
  49.539 +      <table class="memname">
  49.540 +        <tr>
  49.541 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_difference </td>
  49.542 +          <td>(</td>
  49.543 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.544 +          <td class="paramname"><em>left</em>, </td>
  49.545 +        </tr>
  49.546 +        <tr>
  49.547 +          <td class="paramkey"></td>
  49.548 +          <td></td>
  49.549 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.550 +          <td class="paramname"><em>right</em>, </td>
  49.551 +        </tr>
  49.552 +        <tr>
  49.553 +          <td class="paramkey"></td>
  49.554 +          <td></td>
  49.555 +          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
  49.556 +          <td class="paramname"><em>cmpfnc</em>, </td>
  49.557 +        </tr>
  49.558 +        <tr>
  49.559 +          <td class="paramkey"></td>
  49.560 +          <td></td>
  49.561 +          <td class="paramtype">void *&#160;</td>
  49.562 +          <td class="paramname"><em>cmpdata</em>, </td>
  49.563 +        </tr>
  49.564 +        <tr>
  49.565 +          <td class="paramkey"></td>
  49.566 +          <td></td>
  49.567 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
  49.568 +          <td class="paramname"><em>cpfnc</em>, </td>
  49.569 +        </tr>
  49.570 +        <tr>
  49.571 +          <td class="paramkey"></td>
  49.572 +          <td></td>
  49.573 +          <td class="paramtype">void *&#160;</td>
  49.574 +          <td class="paramname"><em>cpdata</em>&#160;</td>
  49.575 +        </tr>
  49.576 +        <tr>
  49.577 +          <td></td>
  49.578 +          <td>)</td>
  49.579 +          <td></td><td></td>
  49.580 +        </tr>
  49.581 +      </table>
  49.582 +</div><div class="memdoc">
  49.583 +
  49.584 +<p>Returns the difference of two lists. </p>
  49.585 +<p>The difference contains all elements of the left list (including duplicates) that are not equal to any element of the right list.</p>
  49.586 +<dl class="params"><dt>Parameters</dt><dd>
  49.587 +  <table class="params">
  49.588 +    <tr><td class="paramname">left</td><td>the left source list </td></tr>
  49.589 +    <tr><td class="paramname">right</td><td>the right source list </td></tr>
  49.590 +    <tr><td class="paramname">cmpfnc</td><td>a function to compare elements </td></tr>
  49.591 +    <tr><td class="paramname">cmpdata</td><td>additional data for the compare function </td></tr>
  49.592 +    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
  49.593 +    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
  49.594 +  </table>
  49.595 +  </dd>
  49.596 +</dl>
  49.597 +<dl class="section return"><dt>Returns</dt><dd>a new list containing the difference </dd></dl>
  49.598 +
  49.599 +</div>
  49.600 +</div>
  49.601 +<a id="a4a2a2fc5cc41073c516db6235bbc51d5"></a>
  49.602 +<h2 class="memtitle"><span class="permalink"><a href="#a4a2a2fc5cc41073c516db6235bbc51d5">&#9670;&nbsp;</a></span>ucx_list_difference_a()</h2>
  49.603 +
  49.604 +<div class="memitem">
  49.605 +<div class="memproto">
  49.606 +      <table class="memname">
  49.607 +        <tr>
  49.608 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_difference_a </td>
  49.609 +          <td>(</td>
  49.610 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
  49.611 +          <td class="paramname"><em>allocator</em>, </td>
  49.612 +        </tr>
  49.613 +        <tr>
  49.614 +          <td class="paramkey"></td>
  49.615 +          <td></td>
  49.616 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.617 +          <td class="paramname"><em>left</em>, </td>
  49.618 +        </tr>
  49.619 +        <tr>
  49.620 +          <td class="paramkey"></td>
  49.621 +          <td></td>
  49.622 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.623 +          <td class="paramname"><em>right</em>, </td>
  49.624 +        </tr>
  49.625 +        <tr>
  49.626 +          <td class="paramkey"></td>
  49.627 +          <td></td>
  49.628 +          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
  49.629 +          <td class="paramname"><em>cmpfnc</em>, </td>
  49.630 +        </tr>
  49.631 +        <tr>
  49.632 +          <td class="paramkey"></td>
  49.633 +          <td></td>
  49.634 +          <td class="paramtype">void *&#160;</td>
  49.635 +          <td class="paramname"><em>cmpdata</em>, </td>
  49.636 +        </tr>
  49.637 +        <tr>
  49.638 +          <td class="paramkey"></td>
  49.639 +          <td></td>
  49.640 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
  49.641 +          <td class="paramname"><em>cpfnc</em>, </td>
  49.642 +        </tr>
  49.643 +        <tr>
  49.644 +          <td class="paramkey"></td>
  49.645 +          <td></td>
  49.646 +          <td class="paramtype">void *&#160;</td>
  49.647 +          <td class="paramname"><em>cpdata</em>&#160;</td>
  49.648 +        </tr>
  49.649 +        <tr>
  49.650 +          <td></td>
  49.651 +          <td>)</td>
  49.652 +          <td></td><td></td>
  49.653 +        </tr>
  49.654 +      </table>
  49.655 +</div><div class="memdoc">
  49.656 +
  49.657 +<p>Returns the difference of two lists. </p>
  49.658 +<p>The difference contains all elements of the left list (including duplicates) that are not equal to any element of the right list.</p>
  49.659 +<dl class="params"><dt>Parameters</dt><dd>
  49.660 +  <table class="params">
  49.661 +    <tr><td class="paramname">allocator</td><td>allocates the new list elements </td></tr>
  49.662 +    <tr><td class="paramname">left</td><td>the left source list </td></tr>
  49.663 +    <tr><td class="paramname">right</td><td>the right source list </td></tr>
  49.664 +    <tr><td class="paramname">cmpfnc</td><td>a function to compare elements </td></tr>
  49.665 +    <tr><td class="paramname">cmpdata</td><td>additional data for the compare function </td></tr>
  49.666 +    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
  49.667 +    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
  49.668 +  </table>
  49.669 +  </dd>
  49.670 +</dl>
  49.671 +<dl class="section return"><dt>Returns</dt><dd>a new list containing the difference </dd></dl>
  49.672 +
  49.673 +</div>
  49.674 +</div>
  49.675 +<a id="adc435447cecf885bc63d232191085bbe"></a>
  49.676 +<h2 class="memtitle"><span class="permalink"><a href="#adc435447cecf885bc63d232191085bbe">&#9670;&nbsp;</a></span>ucx_list_equals()</h2>
  49.677 +
  49.678 +<div class="memitem">
  49.679 +<div class="memproto">
  49.680 +      <table class="memname">
  49.681 +        <tr>
  49.682 +          <td class="memname">int ucx_list_equals </td>
  49.683 +          <td>(</td>
  49.684 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.685 +          <td class="paramname"><em>list1</em>, </td>
  49.686 +        </tr>
  49.687 +        <tr>
  49.688 +          <td class="paramkey"></td>
  49.689 +          <td></td>
  49.690 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.691 +          <td class="paramname"><em>list2</em>, </td>
  49.692 +        </tr>
  49.693 +        <tr>
  49.694 +          <td class="paramkey"></td>
  49.695 +          <td></td>
  49.696 +          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
  49.697 +          <td class="paramname"><em>cmpfnc</em>, </td>
  49.698 +        </tr>
  49.699 +        <tr>
  49.700 +          <td class="paramkey"></td>
  49.701 +          <td></td>
  49.702 +          <td class="paramtype">void *&#160;</td>
  49.703 +          <td class="paramname"><em>data</em>&#160;</td>
  49.704 +        </tr>
  49.705 +        <tr>
  49.706 +          <td></td>
  49.707 +          <td>)</td>
  49.708 +          <td></td><td></td>
  49.709 +        </tr>
  49.710 +      </table>
  49.711 +</div><div class="memdoc">
  49.712 +
  49.713 +<p>Compares two UCX lists element-wise by using a compare function. </p>
  49.714 +<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>
  49.715 +<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>
  49.716 +<dl class="params"><dt>Parameters</dt><dd>
  49.717 +  <table class="params">
  49.718 +    <tr><td class="paramname">list1</td><td>the first list </td></tr>
  49.719 +    <tr><td class="paramname">list2</td><td>the second list </td></tr>
  49.720 +    <tr><td class="paramname">cmpfnc</td><td>the compare function </td></tr>
  49.721 +    <tr><td class="paramname">data</td><td>additional data for the compare function </td></tr>
  49.722 +  </table>
  49.723 +  </dd>
  49.724 +</dl>
  49.725 +<dl class="section return"><dt>Returns</dt><dd>1, if and only if the two lists equal element-wise, 0 otherwise </dd></dl>
  49.726 +
  49.727 +</div>
  49.728 +</div>
  49.729 +<a id="a9b3b6842d3be572e06a7f519e198cb83"></a>
  49.730 +<h2 class="memtitle"><span class="permalink"><a href="#a9b3b6842d3be572e06a7f519e198cb83">&#9670;&nbsp;</a></span>ucx_list_find()</h2>
  49.731 +
  49.732 +<div class="memitem">
  49.733 +<div class="memproto">
  49.734 +      <table class="memname">
  49.735 +        <tr>
  49.736 +          <td class="memname">ssize_t ucx_list_find </td>
  49.737 +          <td>(</td>
  49.738 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.739 +          <td class="paramname"><em>list</em>, </td>
  49.740 +        </tr>
  49.741 +        <tr>
  49.742 +          <td class="paramkey"></td>
  49.743 +          <td></td>
  49.744 +          <td class="paramtype">void *&#160;</td>
  49.745 +          <td class="paramname"><em>elem</em>, </td>
  49.746 +        </tr>
  49.747 +        <tr>
  49.748 +          <td class="paramkey"></td>
  49.749 +          <td></td>
  49.750 +          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
  49.751 +          <td class="paramname"><em>cmpfnc</em>, </td>
  49.752 +        </tr>
  49.753 +        <tr>
  49.754 +          <td class="paramkey"></td>
  49.755 +          <td></td>
  49.756 +          <td class="paramtype">void *&#160;</td>
  49.757 +          <td class="paramname"><em>data</em>&#160;</td>
  49.758 +        </tr>
  49.759 +        <tr>
  49.760 +          <td></td>
  49.761 +          <td>)</td>
  49.762 +          <td></td><td></td>
  49.763 +        </tr>
  49.764 +      </table>
  49.765 +</div><div class="memdoc">
  49.766 +
  49.767 +<p>Returns the index of an element containing the specified data. </p>
  49.768 +<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>
  49.769 +<p>If the list contains the data more than once, the index of the first occurrence is returned.</p>
  49.770 +<dl class="params"><dt>Parameters</dt><dd>
  49.771 +  <table class="params">
  49.772 +    <tr><td class="paramname">list</td><td>the list where to search for the data </td></tr>
  49.773 +    <tr><td class="paramname">elem</td><td>the element data </td></tr>
  49.774 +    <tr><td class="paramname">cmpfnc</td><td>the compare function </td></tr>
  49.775 +    <tr><td class="paramname">data</td><td>additional data for the compare function </td></tr>
  49.776 +  </table>
  49.777 +  </dd>
  49.778 +</dl>
  49.779 +<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>
  49.780 +
  49.781 +</div>
  49.782 +</div>
  49.783 +<a id="a6aa0e34ebc5f0dca6f52d0f7626b4bd5"></a>
  49.784 +<h2 class="memtitle"><span class="permalink"><a href="#a6aa0e34ebc5f0dca6f52d0f7626b4bd5">&#9670;&nbsp;</a></span>ucx_list_first()</h2>
  49.785 +
  49.786 +<div class="memitem">
  49.787 +<div class="memproto">
  49.788 +      <table class="memname">
  49.789 +        <tr>
  49.790 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_first </td>
  49.791 +          <td>(</td>
  49.792 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.793 +          <td class="paramname"><em>elem</em></td><td>)</td>
  49.794 +          <td></td>
  49.795 +        </tr>
  49.796 +      </table>
  49.797 +</div><div class="memdoc">
  49.798 +
  49.799 +<p>Returns the first element of a list. </p>
  49.800 +<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>
  49.801 +<dl class="params"><dt>Parameters</dt><dd>
  49.802 +  <table class="params">
  49.803 +    <tr><td class="paramname">elem</td><td>one element of the list </td></tr>
  49.804 +  </table>
  49.805 +  </dd>
  49.806 +</dl>
  49.807 +<dl class="section return"><dt>Returns</dt><dd>the first element of the list, the specified element is a member of </dd></dl>
  49.808 +
  49.809 +</div>
  49.810 +</div>
  49.811 +<a id="a1a0fa2c5b1e478a96da19b0c3f013668"></a>
  49.812 +<h2 class="memtitle"><span class="permalink"><a href="#a1a0fa2c5b1e478a96da19b0c3f013668">&#9670;&nbsp;</a></span>ucx_list_free()</h2>
  49.813 +
  49.814 +<div class="memitem">
  49.815 +<div class="memproto">
  49.816 +      <table class="memname">
  49.817 +        <tr>
  49.818 +          <td class="memname">void ucx_list_free </td>
  49.819 +          <td>(</td>
  49.820 +          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.821 +          <td class="paramname"><em>list</em></td><td>)</td>
  49.822 +          <td></td>
  49.823 +        </tr>
  49.824 +      </table>
  49.825 +</div><div class="memdoc">
  49.826 +
  49.827 +<p>Destroys the entire list. </p>
  49.828 +<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>
  49.829 +<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>
  49.830 +<dl class="params"><dt>Parameters</dt><dd>
  49.831 +  <table class="params">
  49.832 +    <tr><td class="paramname">list</td><td>the list to free </td></tr>
  49.833 +  </table>
  49.834 +  </dd>
  49.835 +</dl>
  49.836 +<dl class="section see"><dt>See also</dt><dd>ucx_list_free_contents() </dd></dl>
  49.837 +
  49.838 +</div>
  49.839 +</div>
  49.840 +<a id="a944e11f76c38767cd1100d72a4e3b25b"></a>
  49.841 +<h2 class="memtitle"><span class="permalink"><a href="#a944e11f76c38767cd1100d72a4e3b25b">&#9670;&nbsp;</a></span>ucx_list_free_a()</h2>
  49.842 +
  49.843 +<div class="memitem">
  49.844 +<div class="memproto">
  49.845 +      <table class="memname">
  49.846 +        <tr>
  49.847 +          <td class="memname">void ucx_list_free_a </td>
  49.848 +          <td>(</td>
  49.849 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
  49.850 +          <td class="paramname"><em>allocator</em>, </td>
  49.851 +        </tr>
  49.852 +        <tr>
  49.853 +          <td class="paramkey"></td>
  49.854 +          <td></td>
  49.855 +          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.856 +          <td class="paramname"><em>list</em>&#160;</td>
  49.857 +        </tr>
  49.858 +        <tr>
  49.859 +          <td></td>
  49.860 +          <td>)</td>
  49.861 +          <td></td><td></td>
  49.862 +        </tr>
  49.863 +      </table>
  49.864 +</div><div class="memdoc">
  49.865 +
  49.866 +<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>
  49.867 +<p>See <a class="el" href="list_8h.html#a1a0fa2c5b1e478a96da19b0c3f013668" title="Destroys the entire list. ">ucx_list_free()</a> for details.</p>
  49.868 +<dl class="params"><dt>Parameters</dt><dd>
  49.869 +  <table class="params">
  49.870 +    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
  49.871 +    <tr><td class="paramname">list</td><td>the list to free </td></tr>
  49.872 +  </table>
  49.873 +  </dd>
  49.874 +</dl>
  49.875 +<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>
  49.876 +
  49.877 +</div>
  49.878 +</div>
  49.879 +<a id="a4ba6c96642f72ea046cc22627c72979c"></a>
  49.880 +<h2 class="memtitle"><span class="permalink"><a href="#a4ba6c96642f72ea046cc22627c72979c">&#9670;&nbsp;</a></span>ucx_list_free_content()</h2>
  49.881 +
  49.882 +<div class="memitem">
  49.883 +<div class="memproto">
  49.884 +      <table class="memname">
  49.885 +        <tr>
  49.886 +          <td class="memname">void ucx_list_free_content </td>
  49.887 +          <td>(</td>
  49.888 +          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.889 +          <td class="paramname"><em>list</em>, </td>
  49.890 +        </tr>
  49.891 +        <tr>
  49.892 +          <td class="paramkey"></td>
  49.893 +          <td></td>
  49.894 +          <td class="paramtype"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a>&#160;</td>
  49.895 +          <td class="paramname"><em>destr</em>&#160;</td>
  49.896 +        </tr>
  49.897 +        <tr>
  49.898 +          <td></td>
  49.899 +          <td>)</td>
  49.900 +          <td></td><td></td>
  49.901 +        </tr>
  49.902 +      </table>
  49.903 +</div><div class="memdoc">
  49.904 +
  49.905 +<p>Destroys the contents of the specified list by calling the specified destructor on each of them. </p>
  49.906 +<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>
  49.907 +<p>If no destructor is specified (<code>NULL</code>), stdlib's free() is used.</p>
  49.908 +<dl class="params"><dt>Parameters</dt><dd>
  49.909 +  <table class="params">
  49.910 +    <tr><td class="paramname">list</td><td>the list for which the contents shall be freed </td></tr>
  49.911 +    <tr><td class="paramname">destr</td><td>optional destructor function </td></tr>
  49.912 +  </table>
  49.913 +  </dd>
  49.914 +</dl>
  49.915 +<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>
  49.916 +
  49.917 +</div>
  49.918 +</div>
  49.919 +<a id="a2509ffe19bce6a8708c77f89480c75fb"></a>
  49.920 +<h2 class="memtitle"><span class="permalink"><a href="#a2509ffe19bce6a8708c77f89480c75fb">&#9670;&nbsp;</a></span>ucx_list_get()</h2>
  49.921 +
  49.922 +<div class="memitem">
  49.923 +<div class="memproto">
  49.924 +      <table class="memname">
  49.925 +        <tr>
  49.926 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_get </td>
  49.927 +          <td>(</td>
  49.928 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.929 +          <td class="paramname"><em>list</em>, </td>
  49.930 +        </tr>
  49.931 +        <tr>
  49.932 +          <td class="paramkey"></td>
  49.933 +          <td></td>
  49.934 +          <td class="paramtype">size_t&#160;</td>
  49.935 +          <td class="paramname"><em>index</em>&#160;</td>
  49.936 +        </tr>
  49.937 +        <tr>
  49.938 +          <td></td>
  49.939 +          <td>)</td>
  49.940 +          <td></td><td></td>
  49.941 +        </tr>
  49.942 +      </table>
  49.943 +</div><div class="memdoc">
  49.944 +
  49.945 +<p>Returns the list element at the specified index. </p>
  49.946 +<dl class="params"><dt>Parameters</dt><dd>
  49.947 +  <table class="params">
  49.948 +    <tr><td class="paramname">list</td><td>the list to retrieve the element from </td></tr>
  49.949 +    <tr><td class="paramname">index</td><td>index of the element to return </td></tr>
  49.950 +  </table>
  49.951 +  </dd>
  49.952 +</dl>
  49.953 +<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>
  49.954 +
  49.955 +</div>
  49.956 +</div>
  49.957 +<a id="ae2ff2974812ca185870f80bc4ed9337e"></a>
  49.958 +<h2 class="memtitle"><span class="permalink"><a href="#ae2ff2974812ca185870f80bc4ed9337e">&#9670;&nbsp;</a></span>ucx_list_indexof()</h2>
  49.959 +
  49.960 +<div class="memitem">
  49.961 +<div class="memproto">
  49.962 +      <table class="memname">
  49.963 +        <tr>
  49.964 +          <td class="memname">ssize_t ucx_list_indexof </td>
  49.965 +          <td>(</td>
  49.966 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.967 +          <td class="paramname"><em>list</em>, </td>
  49.968 +        </tr>
  49.969 +        <tr>
  49.970 +          <td class="paramkey"></td>
  49.971 +          <td></td>
  49.972 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
  49.973 +          <td class="paramname"><em>elem</em>&#160;</td>
  49.974 +        </tr>
  49.975 +        <tr>
  49.976 +          <td></td>
  49.977 +          <td>)</td>
  49.978 +          <td></td><td></td>
  49.979 +        </tr>
  49.980 +      </table>
  49.981 +</div><div class="memdoc">
  49.982 +
  49.983 +<p>Returns the index of an element. </p>
  49.984 +<dl class="params"><dt>Parameters</dt><dd>
  49.985 +  <table class="params">
  49.986 +    <tr><td class="paramname">list</td><td>the list where to search for the element </td></tr>
  49.987 +    <tr><td class="paramname">elem</td><td>the element to find </td></tr>
  49.988 +  </table>
  49.989 +  </dd>
  49.990 +</dl>
  49.991 +<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>
  49.992 +
  49.993 +</div>
  49.994 +</div>
  49.995 +<a id="a259f9b754978aeca23dfabba16e20f39"></a>
  49.996 +<h2 class="memtitle"><span class="permalink"><a href="#a259f9b754978aeca23dfabba16e20f39">&#9670;&nbsp;</a></span>ucx_list_intersection()</h2>
  49.997 +
  49.998 +<div class="memitem">
  49.999 +<div class="memproto">
 49.1000 +      <table class="memname">
 49.1001 +        <tr>
 49.1002 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_intersection </td>
 49.1003 +          <td>(</td>
 49.1004 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1005 +          <td class="paramname"><em>left</em>, </td>
 49.1006 +        </tr>
 49.1007 +        <tr>
 49.1008 +          <td class="paramkey"></td>
 49.1009 +          <td></td>
 49.1010 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1011 +          <td class="paramname"><em>right</em>, </td>
 49.1012 +        </tr>
 49.1013 +        <tr>
 49.1014 +          <td class="paramkey"></td>
 49.1015 +          <td></td>
 49.1016 +          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
 49.1017 +          <td class="paramname"><em>cmpfnc</em>, </td>
 49.1018 +        </tr>
 49.1019 +        <tr>
 49.1020 +          <td class="paramkey"></td>
 49.1021 +          <td></td>
 49.1022 +          <td class="paramtype">void *&#160;</td>
 49.1023 +          <td class="paramname"><em>cmpdata</em>, </td>
 49.1024 +        </tr>
 49.1025 +        <tr>
 49.1026 +          <td class="paramkey"></td>
 49.1027 +          <td></td>
 49.1028 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
 49.1029 +          <td class="paramname"><em>cpfnc</em>, </td>
 49.1030 +        </tr>
 49.1031 +        <tr>
 49.1032 +          <td class="paramkey"></td>
 49.1033 +          <td></td>
 49.1034 +          <td class="paramtype">void *&#160;</td>
 49.1035 +          <td class="paramname"><em>cpdata</em>&#160;</td>
 49.1036 +        </tr>
 49.1037 +        <tr>
 49.1038 +          <td></td>
 49.1039 +          <td>)</td>
 49.1040 +          <td></td><td></td>
 49.1041 +        </tr>
 49.1042 +      </table>
 49.1043 +</div><div class="memdoc">
 49.1044 +
 49.1045 +<p>Returns the intersection of two lists. </p>
 49.1046 +<p>The intersection contains all elements of the left list (including duplicates) that can be found in the right list.</p>
 49.1047 +<dl class="params"><dt>Parameters</dt><dd>
 49.1048 +  <table class="params">
 49.1049 +    <tr><td class="paramname">left</td><td>the left source list </td></tr>
 49.1050 +    <tr><td class="paramname">right</td><td>the right source list </td></tr>
 49.1051 +    <tr><td class="paramname">cmpfnc</td><td>a function to compare elements </td></tr>
 49.1052 +    <tr><td class="paramname">cmpdata</td><td>additional data for the compare function </td></tr>
 49.1053 +    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
 49.1054 +    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
 49.1055 +  </table>
 49.1056 +  </dd>
 49.1057 +</dl>
 49.1058 +<dl class="section return"><dt>Returns</dt><dd>a new list containing the intersection </dd></dl>
 49.1059 +
 49.1060 +</div>
 49.1061 +</div>
 49.1062 +<a id="a1d0b00514dbb81ba6270b58da0c5b9a8"></a>
 49.1063 +<h2 class="memtitle"><span class="permalink"><a href="#a1d0b00514dbb81ba6270b58da0c5b9a8">&#9670;&nbsp;</a></span>ucx_list_intersection_a()</h2>
 49.1064 +
 49.1065 +<div class="memitem">
 49.1066 +<div class="memproto">
 49.1067 +      <table class="memname">
 49.1068 +        <tr>
 49.1069 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_intersection_a </td>
 49.1070 +          <td>(</td>
 49.1071 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
 49.1072 +          <td class="paramname"><em>allocator</em>, </td>
 49.1073 +        </tr>
 49.1074 +        <tr>
 49.1075 +          <td class="paramkey"></td>
 49.1076 +          <td></td>
 49.1077 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1078 +          <td class="paramname"><em>left</em>, </td>
 49.1079 +        </tr>
 49.1080 +        <tr>
 49.1081 +          <td class="paramkey"></td>
 49.1082 +          <td></td>
 49.1083 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1084 +          <td class="paramname"><em>right</em>, </td>
 49.1085 +        </tr>
 49.1086 +        <tr>
 49.1087 +          <td class="paramkey"></td>
 49.1088 +          <td></td>
 49.1089 +          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
 49.1090 +          <td class="paramname"><em>cmpfnc</em>, </td>
 49.1091 +        </tr>
 49.1092 +        <tr>
 49.1093 +          <td class="paramkey"></td>
 49.1094 +          <td></td>
 49.1095 +          <td class="paramtype">void *&#160;</td>
 49.1096 +          <td class="paramname"><em>cmpdata</em>, </td>
 49.1097 +        </tr>
 49.1098 +        <tr>
 49.1099 +          <td class="paramkey"></td>
 49.1100 +          <td></td>
 49.1101 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
 49.1102 +          <td class="paramname"><em>cpfnc</em>, </td>
 49.1103 +        </tr>
 49.1104 +        <tr>
 49.1105 +          <td class="paramkey"></td>
 49.1106 +          <td></td>
 49.1107 +          <td class="paramtype">void *&#160;</td>
 49.1108 +          <td class="paramname"><em>cpdata</em>&#160;</td>
 49.1109 +        </tr>
 49.1110 +        <tr>
 49.1111 +          <td></td>
 49.1112 +          <td>)</td>
 49.1113 +          <td></td><td></td>
 49.1114 +        </tr>
 49.1115 +      </table>
 49.1116 +</div><div class="memdoc">
 49.1117 +
 49.1118 +<p>Returns the intersection of two lists. </p>
 49.1119 +<p>The intersection contains all elements of the left list (including duplicates) that can be found in the right list.</p>
 49.1120 +<dl class="params"><dt>Parameters</dt><dd>
 49.1121 +  <table class="params">
 49.1122 +    <tr><td class="paramname">allocator</td><td>allocates the new list elements </td></tr>
 49.1123 +    <tr><td class="paramname">left</td><td>the left source list </td></tr>
 49.1124 +    <tr><td class="paramname">right</td><td>the right source list </td></tr>
 49.1125 +    <tr><td class="paramname">cmpfnc</td><td>a function to compare elements </td></tr>
 49.1126 +    <tr><td class="paramname">cmpdata</td><td>additional data for the compare function </td></tr>
 49.1127 +    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
 49.1128 +    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
 49.1129 +  </table>
 49.1130 +  </dd>
 49.1131 +</dl>
 49.1132 +<dl class="section return"><dt>Returns</dt><dd>a new list containing the intersection </dd></dl>
 49.1133 +
 49.1134 +</div>
 49.1135 +</div>
 49.1136 +<a id="add5ec40c5006e29c629d23c2eb5a6553"></a>
 49.1137 +<h2 class="memtitle"><span class="permalink"><a href="#add5ec40c5006e29c629d23c2eb5a6553">&#9670;&nbsp;</a></span>ucx_list_last()</h2>
 49.1138 +
 49.1139 +<div class="memitem">
 49.1140 +<div class="memproto">
 49.1141 +      <table class="memname">
 49.1142 +        <tr>
 49.1143 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_last </td>
 49.1144 +          <td>(</td>
 49.1145 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1146 +          <td class="paramname"><em>elem</em></td><td>)</td>
 49.1147 +          <td></td>
 49.1148 +        </tr>
 49.1149 +      </table>
 49.1150 +</div><div class="memdoc">
 49.1151 +
 49.1152 +<p>Returns the last element of a list. </p>
 49.1153 +<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>
 49.1154 +<dl class="params"><dt>Parameters</dt><dd>
 49.1155 +  <table class="params">
 49.1156 +    <tr><td class="paramname">elem</td><td>one element of the list </td></tr>
 49.1157 +  </table>
 49.1158 +  </dd>
 49.1159 +</dl>
 49.1160 +<dl class="section return"><dt>Returns</dt><dd>the last element of the list, the specified element is a member of </dd></dl>
 49.1161 +
 49.1162 +</div>
 49.1163 +</div>
 49.1164 +<a id="a8fcb68e4556395b15180eec2d0b77aa4"></a>
 49.1165 +<h2 class="memtitle"><span class="permalink"><a href="#a8fcb68e4556395b15180eec2d0b77aa4">&#9670;&nbsp;</a></span>ucx_list_prepend()</h2>
 49.1166 +
 49.1167 +<div class="memitem">
 49.1168 +<div class="memproto">
 49.1169 +      <table class="memname">
 49.1170 +        <tr>
 49.1171 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_prepend </td>
 49.1172 +          <td>(</td>
 49.1173 +          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1174 +          <td class="paramname"><em>list</em>, </td>
 49.1175 +        </tr>
 49.1176 +        <tr>
 49.1177 +          <td class="paramkey"></td>
 49.1178 +          <td></td>
 49.1179 +          <td class="paramtype">void *&#160;</td>
 49.1180 +          <td class="paramname"><em>data</em>&#160;</td>
 49.1181 +        </tr>
 49.1182 +        <tr>
 49.1183 +          <td></td>
 49.1184 +          <td>)</td>
 49.1185 +          <td></td><td></td>
 49.1186 +        </tr>
 49.1187 +      </table>
 49.1188 +</div><div class="memdoc">
 49.1189 +
 49.1190 +<p>Inserts an element at the beginning of the list. </p>
 49.1191 +<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>
 49.1192 +<dl class="params"><dt>Parameters</dt><dd>
 49.1193 +  <table class="params">
 49.1194 +    <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>
 49.1195 +    <tr><td class="paramname">data</td><td>the data to insert </td></tr>
 49.1196 +  </table>
 49.1197 +  </dd>
 49.1198 +</dl>
 49.1199 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the new list head </dd></dl>
 49.1200 +
 49.1201 +</div>
 49.1202 +</div>
 49.1203 +<a id="a54654e6dc60e1c3de9e886c150e404ec"></a>
 49.1204 +<h2 class="memtitle"><span class="permalink"><a href="#a54654e6dc60e1c3de9e886c150e404ec">&#9670;&nbsp;</a></span>ucx_list_prepend_a()</h2>
 49.1205 +
 49.1206 +<div class="memitem">
 49.1207 +<div class="memproto">
 49.1208 +      <table class="memname">
 49.1209 +        <tr>
 49.1210 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_prepend_a </td>
 49.1211 +          <td>(</td>
 49.1212 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
 49.1213 +          <td class="paramname"><em>allocator</em>, </td>
 49.1214 +        </tr>
 49.1215 +        <tr>
 49.1216 +          <td class="paramkey"></td>
 49.1217 +          <td></td>
 49.1218 +          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1219 +          <td class="paramname"><em>list</em>, </td>
 49.1220 +        </tr>
 49.1221 +        <tr>
 49.1222 +          <td class="paramkey"></td>
 49.1223 +          <td></td>
 49.1224 +          <td class="paramtype">void *&#160;</td>
 49.1225 +          <td class="paramname"><em>data</em>&#160;</td>
 49.1226 +        </tr>
 49.1227 +        <tr>
 49.1228 +          <td></td>
 49.1229 +          <td>)</td>
 49.1230 +          <td></td><td></td>
 49.1231 +        </tr>
 49.1232 +      </table>
 49.1233 +</div><div class="memdoc">
 49.1234 +
 49.1235 +<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>
 49.1236 +<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>
 49.1237 +<dl class="params"><dt>Parameters</dt><dd>
 49.1238 +  <table class="params">
 49.1239 +    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
 49.1240 +    <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>
 49.1241 +    <tr><td class="paramname">data</td><td>the data to insert </td></tr>
 49.1242 +  </table>
 49.1243 +  </dd>
 49.1244 +</dl>
 49.1245 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the new list head </dd></dl>
 49.1246 +<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>
 49.1247 +
 49.1248 +</div>
 49.1249 +</div>
 49.1250 +<a id="a410cb3e8260037ba56c72d14b899b468"></a>
 49.1251 +<h2 class="memtitle"><span class="permalink"><a href="#a410cb3e8260037ba56c72d14b899b468">&#9670;&nbsp;</a></span>ucx_list_remove()</h2>
 49.1252 +
 49.1253 +<div class="memitem">
 49.1254 +<div class="memproto">
 49.1255 +      <table class="memname">
 49.1256 +        <tr>
 49.1257 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_remove </td>
 49.1258 +          <td>(</td>
 49.1259 +          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1260 +          <td class="paramname"><em>list</em>, </td>
 49.1261 +        </tr>
 49.1262 +        <tr>
 49.1263 +          <td class="paramkey"></td>
 49.1264 +          <td></td>
 49.1265 +          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1266 +          <td class="paramname"><em>element</em>&#160;</td>
 49.1267 +        </tr>
 49.1268 +        <tr>
 49.1269 +          <td></td>
 49.1270 +          <td>)</td>
 49.1271 +          <td></td><td></td>
 49.1272 +        </tr>
 49.1273 +      </table>
 49.1274 +</div><div class="memdoc">
 49.1275 +
 49.1276 +<p>Removes an element from the list. </p>
 49.1277 +<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>
 49.1278 +<dl class="params"><dt>Parameters</dt><dd>
 49.1279 +  <table class="params">
 49.1280 +    <tr><td class="paramname">list</td><td>the list from which the element shall be removed </td></tr>
 49.1281 +    <tr><td class="paramname">element</td><td>the element to remove </td></tr>
 49.1282 +  </table>
 49.1283 +  </dd>
 49.1284 +</dl>
 49.1285 +<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>
 49.1286 +
 49.1287 +</div>
 49.1288 +</div>
 49.1289 +<a id="aca687b7c4e7170175f447e549125aa52"></a>
 49.1290 +<h2 class="memtitle"><span class="permalink"><a href="#aca687b7c4e7170175f447e549125aa52">&#9670;&nbsp;</a></span>ucx_list_remove_a()</h2>
 49.1291 +
 49.1292 +<div class="memitem">
 49.1293 +<div class="memproto">
 49.1294 +      <table class="memname">
 49.1295 +        <tr>
 49.1296 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_remove_a </td>
 49.1297 +          <td>(</td>
 49.1298 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
 49.1299 +          <td class="paramname"><em>allocator</em>, </td>
 49.1300 +        </tr>
 49.1301 +        <tr>
 49.1302 +          <td class="paramkey"></td>
 49.1303 +          <td></td>
 49.1304 +          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1305 +          <td class="paramname"><em>list</em>, </td>
 49.1306 +        </tr>
 49.1307 +        <tr>
 49.1308 +          <td class="paramkey"></td>
 49.1309 +          <td></td>
 49.1310 +          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1311 +          <td class="paramname"><em>element</em>&#160;</td>
 49.1312 +        </tr>
 49.1313 +        <tr>
 49.1314 +          <td></td>
 49.1315 +          <td>)</td>
 49.1316 +          <td></td><td></td>
 49.1317 +        </tr>
 49.1318 +      </table>
 49.1319 +</div><div class="memdoc">
 49.1320 +
 49.1321 +<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>
 49.1322 +<p>See <a class="el" href="list_8h.html#a410cb3e8260037ba56c72d14b899b468" title="Removes an element from the list. ">ucx_list_remove()</a> for details.</p>
 49.1323 +<dl class="params"><dt>Parameters</dt><dd>
 49.1324 +  <table class="params">
 49.1325 +    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
 49.1326 +    <tr><td class="paramname">list</td><td>the list from which the element shall be removed </td></tr>
 49.1327 +    <tr><td class="paramname">element</td><td>the element to remove </td></tr>
 49.1328 +  </table>
 49.1329 +  </dd>
 49.1330 +</dl>
 49.1331 +<dl class="section return"><dt>Returns</dt><dd>returns the updated list pointer or <code>NULL</code>, if the list </dd></dl>
 49.1332 +<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>
 49.1333 +
 49.1334 +</div>
 49.1335 +</div>
 49.1336 +<a id="ae88001cc8ae40b946560f31434abed8f"></a>
 49.1337 +<h2 class="memtitle"><span class="permalink"><a href="#ae88001cc8ae40b946560f31434abed8f">&#9670;&nbsp;</a></span>ucx_list_size()</h2>
 49.1338 +
 49.1339 +<div class="memitem">
 49.1340 +<div class="memproto">
 49.1341 +      <table class="memname">
 49.1342 +        <tr>
 49.1343 +          <td class="memname">size_t ucx_list_size </td>
 49.1344 +          <td>(</td>
 49.1345 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1346 +          <td class="paramname"><em>list</em></td><td>)</td>
 49.1347 +          <td></td>
 49.1348 +        </tr>
 49.1349 +      </table>
 49.1350 +</div><div class="memdoc">
 49.1351 +
 49.1352 +<p>Returns the element count of the list. </p>
 49.1353 +<dl class="params"><dt>Parameters</dt><dd>
 49.1354 +  <table class="params">
 49.1355 +    <tr><td class="paramname">list</td><td>the list whose elements are counted </td></tr>
 49.1356 +  </table>
 49.1357 +  </dd>
 49.1358 +</dl>
 49.1359 +<dl class="section return"><dt>Returns</dt><dd>the element count </dd></dl>
 49.1360 +
 49.1361 +</div>
 49.1362 +</div>
 49.1363 +<a id="ac74962d9bd7cfc9d3e2e09651469377b"></a>
 49.1364 +<h2 class="memtitle"><span class="permalink"><a href="#ac74962d9bd7cfc9d3e2e09651469377b">&#9670;&nbsp;</a></span>ucx_list_sort()</h2>
 49.1365 +
 49.1366 +<div class="memitem">
 49.1367 +<div class="memproto">
 49.1368 +      <table class="memname">
 49.1369 +        <tr>
 49.1370 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_sort </td>
 49.1371 +          <td>(</td>
 49.1372 +          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1373 +          <td class="paramname"><em>list</em>, </td>
 49.1374 +        </tr>
 49.1375 +        <tr>
 49.1376 +          <td class="paramkey"></td>
 49.1377 +          <td></td>
 49.1378 +          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
 49.1379 +          <td class="paramname"><em>cmpfnc</em>, </td>
 49.1380 +        </tr>
 49.1381 +        <tr>
 49.1382 +          <td class="paramkey"></td>
 49.1383 +          <td></td>
 49.1384 +          <td class="paramtype">void *&#160;</td>
 49.1385 +          <td class="paramname"><em>data</em>&#160;</td>
 49.1386 +        </tr>
 49.1387 +        <tr>
 49.1388 +          <td></td>
 49.1389 +          <td>)</td>
 49.1390 +          <td></td><td></td>
 49.1391 +        </tr>
 49.1392 +      </table>
 49.1393 +</div><div class="memdoc">
 49.1394 +
 49.1395 +<p>Sorts a <a class="el" href="structUcxList.html" title="UCX list structure. ">UcxList</a> with natural merge sort. </p>
 49.1396 +<p>This function uses O(n) additional temporary memory for merge operations that is automatically freed after each merge.</p>
 49.1397 +<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>
 49.1398 +<dl class="params"><dt>Parameters</dt><dd>
 49.1399 +  <table class="params">
 49.1400 +    <tr><td class="paramname">list</td><td>the list to sort </td></tr>
 49.1401 +    <tr><td class="paramname">cmpfnc</td><td>the function that shall be used to compare the element data </td></tr>
 49.1402 +    <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>
 49.1403 +  </table>
 49.1404 +  </dd>
 49.1405 +</dl>
 49.1406 +<dl class="section return"><dt>Returns</dt><dd>the sorted list </dd></dl>
 49.1407 +
 49.1408 +</div>
 49.1409 +</div>
 49.1410 +<a id="a94ecdb0cea1633ad7074f027fa8485fa"></a>
 49.1411 +<h2 class="memtitle"><span class="permalink"><a href="#a94ecdb0cea1633ad7074f027fa8485fa">&#9670;&nbsp;</a></span>ucx_list_union()</h2>
 49.1412 +
 49.1413 +<div class="memitem">
 49.1414 +<div class="memproto">
 49.1415 +      <table class="memname">
 49.1416 +        <tr>
 49.1417 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_union </td>
 49.1418 +          <td>(</td>
 49.1419 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1420 +          <td class="paramname"><em>left</em>, </td>
 49.1421 +        </tr>
 49.1422 +        <tr>
 49.1423 +          <td class="paramkey"></td>
 49.1424 +          <td></td>
 49.1425 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1426 +          <td class="paramname"><em>right</em>, </td>
 49.1427 +        </tr>
 49.1428 +        <tr>
 49.1429 +          <td class="paramkey"></td>
 49.1430 +          <td></td>
 49.1431 +          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
 49.1432 +          <td class="paramname"><em>cmpfnc</em>, </td>
 49.1433 +        </tr>
 49.1434 +        <tr>
 49.1435 +          <td class="paramkey"></td>
 49.1436 +          <td></td>
 49.1437 +          <td class="paramtype">void *&#160;</td>
 49.1438 +          <td class="paramname"><em>cmpdata</em>, </td>
 49.1439 +        </tr>
 49.1440 +        <tr>
 49.1441 +          <td class="paramkey"></td>
 49.1442 +          <td></td>
 49.1443 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
 49.1444 +          <td class="paramname"><em>cpfnc</em>, </td>
 49.1445 +        </tr>
 49.1446 +        <tr>
 49.1447 +          <td class="paramkey"></td>
 49.1448 +          <td></td>
 49.1449 +          <td class="paramtype">void *&#160;</td>
 49.1450 +          <td class="paramname"><em>cpdata</em>&#160;</td>
 49.1451 +        </tr>
 49.1452 +        <tr>
 49.1453 +          <td></td>
 49.1454 +          <td>)</td>
 49.1455 +          <td></td><td></td>
 49.1456 +        </tr>
 49.1457 +      </table>
 49.1458 +</div><div class="memdoc">
 49.1459 +
 49.1460 +<p>Returns the union of two lists. </p>
 49.1461 +<p>The union is a list of unique elements regarding cmpfnc obtained from both source lists.</p>
 49.1462 +<dl class="params"><dt>Parameters</dt><dd>
 49.1463 +  <table class="params">
 49.1464 +    <tr><td class="paramname">left</td><td>the left source list </td></tr>
 49.1465 +    <tr><td class="paramname">right</td><td>the right source list </td></tr>
 49.1466 +    <tr><td class="paramname">cmpfnc</td><td>a function to compare elements </td></tr>
 49.1467 +    <tr><td class="paramname">cmpdata</td><td>additional data for the compare function </td></tr>
 49.1468 +    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
 49.1469 +    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
 49.1470 +  </table>
 49.1471 +  </dd>
 49.1472 +</dl>
 49.1473 +<dl class="section return"><dt>Returns</dt><dd>a new list containing the union </dd></dl>
 49.1474 +
 49.1475 +</div>
 49.1476 +</div>
 49.1477 +<a id="a65b4355536f4ebc4130211b46469f4c1"></a>
 49.1478 +<h2 class="memtitle"><span class="permalink"><a href="#a65b4355536f4ebc4130211b46469f4c1">&#9670;&nbsp;</a></span>ucx_list_union_a()</h2>
 49.1479 +
 49.1480 +<div class="memitem">
 49.1481 +<div class="memproto">
 49.1482 +      <table class="memname">
 49.1483 +        <tr>
 49.1484 +          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_union_a </td>
 49.1485 +          <td>(</td>
 49.1486 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
 49.1487 +          <td class="paramname"><em>allocator</em>, </td>
 49.1488 +        </tr>
 49.1489 +        <tr>
 49.1490 +          <td class="paramkey"></td>
 49.1491 +          <td></td>
 49.1492 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1493 +          <td class="paramname"><em>left</em>, </td>
 49.1494 +        </tr>
 49.1495 +        <tr>
 49.1496 +          <td class="paramkey"></td>
 49.1497 +          <td></td>
 49.1498 +          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
 49.1499 +          <td class="paramname"><em>right</em>, </td>
 49.1500 +        </tr>
 49.1501 +        <tr>
 49.1502 +          <td class="paramkey"></td>
 49.1503 +          <td></td>
 49.1504 +          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
 49.1505 +          <td class="paramname"><em>cmpfnc</em>, </td>
 49.1506 +        </tr>
 49.1507 +        <tr>
 49.1508 +          <td class="paramkey"></td>
 49.1509 +          <td></td>
 49.1510 +          <td class="paramtype">void *&#160;</td>
 49.1511 +          <td class="paramname"><em>cmpdata</em>, </td>
 49.1512 +        </tr>
 49.1513 +        <tr>
 49.1514 +          <td class="paramkey"></td>
 49.1515 +          <td></td>
 49.1516 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
 49.1517 +          <td class="paramname"><em>cpfnc</em>, </td>
 49.1518 +        </tr>
 49.1519 +        <tr>
 49.1520 +          <td class="paramkey"></td>
 49.1521 +          <td></td>
 49.1522 +          <td class="paramtype">void *&#160;</td>
 49.1523 +          <td class="paramname"><em>cpdata</em>&#160;</td>
 49.1524 +        </tr>
 49.1525 +        <tr>
 49.1526 +          <td></td>
 49.1527 +          <td>)</td>
 49.1528 +          <td></td><td></td>
 49.1529 +        </tr>
 49.1530 +      </table>
 49.1531 +</div><div class="memdoc">
 49.1532 +
 49.1533 +<p>Returns the union of two lists. </p>
 49.1534 +<p>The union is a list of unique elements regarding cmpfnc obtained from both source lists.</p>
 49.1535 +<dl class="params"><dt>Parameters</dt><dd>
 49.1536 +  <table class="params">
 49.1537 +    <tr><td class="paramname">allocator</td><td>allocates the new list elements </td></tr>
 49.1538 +    <tr><td class="paramname">left</td><td>the left source list </td></tr>
 49.1539 +    <tr><td class="paramname">right</td><td>the right source list </td></tr>
 49.1540 +    <tr><td class="paramname">cmpfnc</td><td>a function to compare elements </td></tr>
 49.1541 +    <tr><td class="paramname">cmpdata</td><td>additional data for the compare function </td></tr>
 49.1542 +    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
 49.1543 +    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
 49.1544 +  </table>
 49.1545 +  </dd>
 49.1546 +</dl>
 49.1547 +<dl class="section return"><dt>Returns</dt><dd>a new list containing the union </dd></dl>
 49.1548 +
 49.1549 +</div>
 49.1550 +</div>
 49.1551 +</div><!-- contents -->
 49.1552 +<!-- start footer part -->
 49.1553 +<hr class="footer"/><address class="footer"><small>
 49.1554 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 49.1555 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 49.1556 +</a> 1.8.13
 49.1557 +</small></address>
 49.1558 +</body>
 49.1559 +</html>
    50.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    50.2 +++ b/docs/api-2.1/list_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
    50.3 @@ -0,0 +1,116 @@
    50.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    50.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    50.6 +<head>
    50.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    50.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    50.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   50.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   50.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/list.h Source File</title>
   50.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   50.13 +<script type="text/javascript" src="jquery.js"></script>
   50.14 +<script type="text/javascript" src="dynsections.js"></script>
   50.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   50.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   50.17 +<script type="text/javascript" src="search/search.js"></script>
   50.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   50.19 +</head>
   50.20 +<body>
   50.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   50.22 +<div id="titlearea">
   50.23 +<table cellspacing="0" cellpadding="0">
   50.24 + <tbody>
   50.25 + <tr style="height: 56px;">
   50.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   50.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   50.28 +   <div id="projectname">ucx
   50.29 +   </div>
   50.30 +   <div id="projectbrief">UAP Common Extensions</div>
   50.31 +  </td>
   50.32 + </tr>
   50.33 + </tbody>
   50.34 +</table>
   50.35 +</div>
   50.36 +<!-- end header part -->
   50.37 +<!-- Generated by Doxygen 1.8.13 -->
   50.38 +<script type="text/javascript">
   50.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   50.40 +</script>
   50.41 +<script type="text/javascript" src="menudata.js"></script>
   50.42 +<script type="text/javascript" src="menu.js"></script>
   50.43 +<script type="text/javascript">
   50.44 +$(function() {
   50.45 +  initMenu('',true,false,'search.php','Search');
   50.46 +  $(document).ready(function() { init_search(); });
   50.47 +});
   50.48 +</script>
   50.49 +<div id="main-nav"></div>
   50.50 +<!-- window showing the filter options -->
   50.51 +<div id="MSearchSelectWindow"
   50.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   50.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   50.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   50.55 +</div>
   50.56 +
   50.57 +<!-- iframe showing the search results (closed by default) -->
   50.58 +<div id="MSearchResultsWindow">
   50.59 +<iframe src="javascript:void(0)" frameborder="0" 
   50.60 +        name="MSearchResults" id="MSearchResults">
   50.61 +</iframe>
   50.62 +</div>
   50.63 +
   50.64 +<div id="nav-path" class="navpath">
   50.65 +  <ul>
   50.66 +<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>
   50.67 +</div>
   50.68 +</div><!-- top -->
   50.69 +<div class="header">
   50.70 +  <div class="headertitle">
   50.71 +<div class="title">list.h</div>  </div>
   50.72 +</div><!--header-->
   50.73 +<div class="contents">
   50.74 +<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>
   50.75 +<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>
   50.76 +<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>
   50.77 +<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>
   50.78 +<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>
   50.79 +<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>
   50.80 +<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>
   50.81 +<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>
   50.82 +<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>
   50.83 +<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>
   50.84 +<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>
   50.85 +<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>
   50.86 +<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>
   50.87 +<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>
   50.88 +<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>
   50.89 +<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>
   50.90 +<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>
   50.91 +<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>
   50.92 +<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>
   50.93 +<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>
   50.94 +<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>
   50.95 +<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>
   50.96 +<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>
   50.97 +<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>
   50.98 +<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>
   50.99 +<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>
  50.100 +<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>
  50.101 +<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>
  50.102 +<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>
  50.103 +<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>
  50.104 +<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>
  50.105 +<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>
  50.106 +<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>
  50.107 +<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>
  50.108 +<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>
  50.109 +<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>
  50.110 +<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>
  50.111 +</div><!-- fragment --></div><!-- contents -->
  50.112 +<!-- start footer part -->
  50.113 +<hr class="footer"/><address class="footer"><small>
  50.114 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  50.115 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  50.116 +</a> 1.8.13
  50.117 +</small></address>
  50.118 +</body>
  50.119 +</html>
    51.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    51.2 +++ b/docs/api-2.1/logging_8h.html	Sat Feb 06 19:11:44 2021 +0100
    51.3 @@ -0,0 +1,716 @@
    51.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    51.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    51.6 +<head>
    51.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    51.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    51.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   51.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   51.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/logging.h File Reference</title>
   51.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   51.13 +<script type="text/javascript" src="jquery.js"></script>
   51.14 +<script type="text/javascript" src="dynsections.js"></script>
   51.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   51.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   51.17 +<script type="text/javascript" src="search/search.js"></script>
   51.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   51.19 +</head>
   51.20 +<body>
   51.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   51.22 +<div id="titlearea">
   51.23 +<table cellspacing="0" cellpadding="0">
   51.24 + <tbody>
   51.25 + <tr style="height: 56px;">
   51.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   51.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   51.28 +   <div id="projectname">ucx
   51.29 +   </div>
   51.30 +   <div id="projectbrief">UAP Common Extensions</div>
   51.31 +  </td>
   51.32 + </tr>
   51.33 + </tbody>
   51.34 +</table>
   51.35 +</div>
   51.36 +<!-- end header part -->
   51.37 +<!-- Generated by Doxygen 1.8.13 -->
   51.38 +<script type="text/javascript">
   51.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   51.40 +</script>
   51.41 +<script type="text/javascript" src="menudata.js"></script>
   51.42 +<script type="text/javascript" src="menu.js"></script>
   51.43 +<script type="text/javascript">
   51.44 +$(function() {
   51.45 +  initMenu('',true,false,'search.php','Search');
   51.46 +  $(document).ready(function() { init_search(); });
   51.47 +});
   51.48 +</script>
   51.49 +<div id="main-nav"></div>
   51.50 +<!-- window showing the filter options -->
   51.51 +<div id="MSearchSelectWindow"
   51.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   51.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   51.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   51.55 +</div>
   51.56 +
   51.57 +<!-- iframe showing the search results (closed by default) -->
   51.58 +<div id="MSearchResultsWindow">
   51.59 +<iframe src="javascript:void(0)" frameborder="0" 
   51.60 +        name="MSearchResults" id="MSearchResults">
   51.61 +</iframe>
   51.62 +</div>
   51.63 +
   51.64 +<div id="nav-path" class="navpath">
   51.65 +  <ul>
   51.66 +<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>
   51.67 +</div>
   51.68 +</div><!-- top -->
   51.69 +<div class="header">
   51.70 +  <div class="summary">
   51.71 +<a href="#nested-classes">Data Structures</a> &#124;
   51.72 +<a href="#define-members">Macros</a> &#124;
   51.73 +<a href="#func-members">Functions</a>  </div>
   51.74 +  <div class="headertitle">
   51.75 +<div class="title">logging.h File Reference</div>  </div>
   51.76 +</div><!--header-->
   51.77 +<div class="contents">
   51.78 +
   51.79 +<p>Logging API.  
   51.80 +<a href="#details">More...</a></p>
   51.81 +<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
   51.82 +<code>#include &quot;<a class="el" href="map_8h_source.html">map.h</a>&quot;</code><br />
   51.83 +<code>#include &quot;<a class="el" href="string_8h_source.html">string.h</a>&quot;</code><br />
   51.84 +<code>#include &lt;stdio.h&gt;</code><br />
   51.85 +</div>
   51.86 +<p><a href="logging_8h_source.html">Go to the source code of this file.</a></p>
   51.87 +<table class="memberdecls">
   51.88 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
   51.89 +Data Structures</h2></td></tr>
   51.90 +<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>
   51.91 +<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>
   51.92 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   51.93 +</table><table class="memberdecls">
   51.94 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
   51.95 +Macros</h2></td></tr>
   51.96 +<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>
   51.97 +<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>
   51.98 +<tr class="separator:aa254c07fe3a907613e2256a318d5c9a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
   51.99 +<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>
  51.100 +<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>
  51.101 +<tr class="separator:abd01ca11486226ba34e8f7028d9fffba"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.102 +<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>
  51.103 +<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>
  51.104 +<tr class="separator:a4b0178bf60a6129373ffc59114ca4c9b"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.105 +<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>
  51.106 +<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>
  51.107 +<tr class="separator:acff01d1ef919ea997cfce755fc1b83d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.108 +<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>
  51.109 +<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>
  51.110 +<tr class="separator:a55b88d1fec7036d841b3ddd6195c5586"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.111 +<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>
  51.112 +<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>
  51.113 +<tr class="separator:aee18bc20e58ffb69910121512c350839"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.114 +<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>
  51.115 +<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>
  51.116 +<tr class="separator:a38607008268b4f776ee500fb95d2e823"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.117 +<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>
  51.118 +<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>
  51.119 +<tr class="separator:a0e0d72b12616c1e49ff8834eaf4cb8a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.120 +<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>
  51.121 +<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>
  51.122 +<tr class="separator:a5cffc19502c4c90bfb3bd3bbcd18170a"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.123 +<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>
  51.124 +<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>
  51.125 +<tr class="separator:aa0245325031d95799b28def177fd14ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.126 +<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>
  51.127 +<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>
  51.128 +<tr class="separator:a6a9e472e14d6768e59d96d245e065397"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.129 +<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>
  51.130 +<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>
  51.131 +<tr class="separator:a98464d8d51376ce2716dcc4eca00d5da"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.132 +<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>
  51.133 +<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>
  51.134 +<tr class="separator:aca7bd861b646892813fd7310c0aa69af"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.135 +<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>
  51.136 +<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>
  51.137 +<tr class="separator:a2936402799892db5138e5f1f8c25db0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.138 +<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>
  51.139 +<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>
  51.140 +<tr class="separator:a3031b7ff13f4cfae9c2916543be2877c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.141 +</table><table class="memberdecls">
  51.142 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
  51.143 +Functions</h2></td></tr>
  51.144 +<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>
  51.145 +<tr class="memdesc:ac560f8517d2172794c9d2691735ec48c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new logger.  <a href="#ac560f8517d2172794c9d2691735ec48c">More...</a><br /></td></tr>
  51.146 +<tr class="separator:ac560f8517d2172794c9d2691735ec48c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.147 +<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>
  51.148 +<tr class="memdesc:ac4697b784e01ec990d2acea192e21658"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys the logger.  <a href="#ac4697b784e01ec990d2acea192e21658">More...</a><br /></td></tr>
  51.149 +<tr class="separator:ac4697b784e01ec990d2acea192e21658"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.150 +<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>
  51.151 +<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>
  51.152 +<tr class="separator:ac337e5d02ebea565012d4c11bd643801"><td class="memSeparator" colspan="2">&#160;</td></tr>
  51.153 +</table>
  51.154 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  51.155 +<div class="textblock"><p>Logging API. </p>
  51.156 +<dl class="section author"><dt>Author</dt><dd>Mike Becker, Olaf Wintermann </dd></dl>
  51.157 +</div><h2 class="groupheader">Macro Definition Documentation</h2>
  51.158 +<a id="acff01d1ef919ea997cfce755fc1b83d8"></a>
  51.159 +<h2 class="memtitle"><span class="permalink"><a href="#acff01d1ef919ea997cfce755fc1b83d8">&#9670;&nbsp;</a></span>UCX_LOGGER_DEBUG</h2>
  51.160 +
  51.161 +<div class="memitem">
  51.162 +<div class="memproto">
  51.163 +      <table class="memname">
  51.164 +        <tr>
  51.165 +          <td class="memname">#define UCX_LOGGER_DEBUG&#160;&#160;&#160;0x30</td>
  51.166 +        </tr>
  51.167 +      </table>
  51.168 +</div><div class="memdoc">
  51.169 +
  51.170 +<p>Log level for debug messages. </p>
  51.171 +
  51.172 +</div>
  51.173 +</div>
  51.174 +<a id="a2936402799892db5138e5f1f8c25db0c"></a>
  51.175 +<h2 class="memtitle"><span class="permalink"><a href="#a2936402799892db5138e5f1f8c25db0c">&#9670;&nbsp;</a></span>ucx_logger_debug</h2>
  51.176 +
  51.177 +<div class="memitem">
  51.178 +<div class="memproto">
  51.179 +      <table class="memname">
  51.180 +        <tr>
  51.181 +          <td class="memname">#define ucx_logger_debug</td>
  51.182 +          <td>(</td>
  51.183 +          <td class="paramtype">&#160;</td>
  51.184 +          <td class="paramname">logger, </td>
  51.185 +        </tr>
  51.186 +        <tr>
  51.187 +          <td class="paramkey"></td>
  51.188 +          <td></td>
  51.189 +          <td class="paramtype">&#160;</td>
  51.190 +          <td class="paramname"><em>...</em>&#160;</td>
  51.191 +        </tr>
  51.192 +        <tr>
  51.193 +          <td></td>
  51.194 +          <td>)</td>
  51.195 +          <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>
  51.196 +        </tr>
  51.197 +      </table>
  51.198 +</div><div class="memdoc">
  51.199 +
  51.200 +<p>Shortcut for logging a debug message. </p>
  51.201 +<dl class="params"><dt>Parameters</dt><dd>
  51.202 +  <table class="params">
  51.203 +    <tr><td class="paramname">logger</td><td>the logger to use </td></tr>
  51.204 +    <tr><td class="paramname">...</td><td>format string and arguments </td></tr>
  51.205 +  </table>
  51.206 +  </dd>
  51.207 +</dl>
  51.208 +<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>
  51.209 +
  51.210 +</div>
  51.211 +</div>
  51.212 +<a id="aa254c07fe3a907613e2256a318d5c9a8"></a>
  51.213 +<h2 class="memtitle"><span class="permalink"><a href="#aa254c07fe3a907613e2256a318d5c9a8">&#9670;&nbsp;</a></span>UCX_LOGGER_ERROR</h2>
  51.214 +
  51.215 +<div class="memitem">
  51.216 +<div class="memproto">
  51.217 +      <table class="memname">
  51.218 +        <tr>
  51.219 +          <td class="memname">#define UCX_LOGGER_ERROR&#160;&#160;&#160;0x00</td>
  51.220 +        </tr>
  51.221 +      </table>
  51.222 +</div><div class="memdoc">
  51.223 +
  51.224 +<p>Log level for error messages. </p>
  51.225 +
  51.226 +</div>
  51.227 +</div>
  51.228 +<a id="a6a9e472e14d6768e59d96d245e065397"></a>
  51.229 +<h2 class="memtitle"><span class="permalink"><a href="#a6a9e472e14d6768e59d96d245e065397">&#9670;&nbsp;</a></span>ucx_logger_error</h2>
  51.230 +
  51.231 +<div class="memitem">
  51.232 +<div class="memproto">
  51.233 +      <table class="memname">
  51.234 +        <tr>
  51.235 +          <td class="memname">#define ucx_logger_error</td>
  51.236 +          <td>(</td>
  51.237 +          <td class="paramtype">&#160;</td>
  51.238 +          <td class="paramname">logger, </td>
  51.239 +        </tr>
  51.240 +        <tr>
  51.241 +          <td class="paramkey"></td>
  51.242 +          <td></td>
  51.243 +          <td class="paramtype">&#160;</td>
  51.244 +          <td class="paramname"><em>...</em>&#160;</td>
  51.245 +        </tr>
  51.246 +        <tr>
  51.247 +          <td></td>
  51.248 +          <td>)</td>
  51.249 +          <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>
  51.250 +        </tr>
  51.251 +      </table>
  51.252 +</div><div class="memdoc">
  51.253 +
  51.254 +<p>Shortcut for logging an error message. </p>
  51.255 +<dl class="params"><dt>Parameters</dt><dd>
  51.256 +  <table class="params">
  51.257 +    <tr><td class="paramname">logger</td><td>the logger to use </td></tr>
  51.258 +    <tr><td class="paramname">...</td><td>format string and arguments </td></tr>
  51.259 +  </table>
  51.260 +  </dd>
  51.261 +</dl>
  51.262 +<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>
  51.263 +
  51.264 +</div>
  51.265 +</div>
  51.266 +<a id="a4b0178bf60a6129373ffc59114ca4c9b"></a>
  51.267 +<h2 class="memtitle"><span class="permalink"><a href="#a4b0178bf60a6129373ffc59114ca4c9b">&#9670;&nbsp;</a></span>UCX_LOGGER_INFO</h2>
  51.268 +
  51.269 +<div class="memitem">
  51.270 +<div class="memproto">
  51.271 +      <table class="memname">
  51.272 +        <tr>
  51.273 +          <td class="memname">#define UCX_LOGGER_INFO&#160;&#160;&#160;0x20</td>
  51.274 +        </tr>
  51.275 +      </table>
  51.276 +</div><div class="memdoc">
  51.277 +
  51.278 +<p>Log level for information messages. </p>
  51.279 +
  51.280 +</div>
  51.281 +</div>
  51.282 +<a id="a98464d8d51376ce2716dcc4eca00d5da"></a>
  51.283 +<h2 class="memtitle"><span class="permalink"><a href="#a98464d8d51376ce2716dcc4eca00d5da">&#9670;&nbsp;</a></span>ucx_logger_info</h2>
  51.284 +
  51.285 +<div class="memitem">
  51.286 +<div class="memproto">
  51.287 +      <table class="memname">
  51.288 +        <tr>
  51.289 +          <td class="memname">#define ucx_logger_info</td>
  51.290 +          <td>(</td>
  51.291 +          <td class="paramtype">&#160;</td>
  51.292 +          <td class="paramname">logger, </td>
  51.293 +        </tr>
  51.294 +        <tr>
  51.295 +          <td class="paramkey"></td>
  51.296 +          <td></td>
  51.297 +          <td class="paramtype">&#160;</td>
  51.298 +          <td class="paramname"><em>...</em>&#160;</td>
  51.299 +        </tr>
  51.300 +        <tr>
  51.301 +          <td></td>
  51.302 +          <td>)</td>
  51.303 +          <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>
  51.304 +        </tr>
  51.305 +      </table>
  51.306 +</div><div class="memdoc">
  51.307 +
  51.308 +<p>Shortcut for logging an information message. </p>
  51.309 +<dl class="params"><dt>Parameters</dt><dd>
  51.310 +  <table class="params">
  51.311 +    <tr><td class="paramname">logger</td><td>the logger to use </td></tr>
  51.312 +    <tr><td class="paramname">...</td><td>format string and arguments </td></tr>
  51.313 +  </table>
  51.314 +  </dd>
  51.315 +</dl>
  51.316 +<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>
  51.317 +
  51.318 +</div>
  51.319 +</div>
  51.320 +<a id="aee18bc20e58ffb69910121512c350839"></a>
  51.321 +<h2 class="memtitle"><span class="permalink"><a href="#aee18bc20e58ffb69910121512c350839">&#9670;&nbsp;</a></span>UCX_LOGGER_LEVEL</h2>
  51.322 +
  51.323 +<div class="memitem">
  51.324 +<div class="memproto">
  51.325 +      <table class="memname">
  51.326 +        <tr>
  51.327 +          <td class="memname">#define UCX_LOGGER_LEVEL&#160;&#160;&#160;0x01</td>
  51.328 +        </tr>
  51.329 +      </table>
  51.330 +</div><div class="memdoc">
  51.331 +
  51.332 +<p>Output flag for the log level. </p>
  51.333 +<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>
  51.334 +
  51.335 +</div>
  51.336 +</div>
  51.337 +<a id="aa0245325031d95799b28def177fd14ec"></a>
  51.338 +<h2 class="memtitle"><span class="permalink"><a href="#aa0245325031d95799b28def177fd14ec">&#9670;&nbsp;</a></span>ucx_logger_log</h2>
  51.339 +
  51.340 +<div class="memitem">
  51.341 +<div class="memproto">
  51.342 +      <table class="memname">
  51.343 +        <tr>
  51.344 +          <td class="memname">#define ucx_logger_log</td>
  51.345 +          <td>(</td>
  51.346 +          <td class="paramtype">&#160;</td>
  51.347 +          <td class="paramname">logger, </td>
  51.348 +        </tr>
  51.349 +        <tr>
  51.350 +          <td class="paramkey"></td>
  51.351 +          <td></td>
  51.352 +          <td class="paramtype">&#160;</td>
  51.353 +          <td class="paramname">level, </td>
  51.354 +        </tr>
  51.355 +        <tr>
  51.356 +          <td class="paramkey"></td>
  51.357 +          <td></td>
  51.358 +          <td class="paramtype">&#160;</td>
  51.359 +          <td class="paramname"><em>...</em>&#160;</td>
  51.360 +        </tr>
  51.361 +        <tr>
  51.362 +          <td></td>
  51.363 +          <td>)</td>
  51.364 +          <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>
  51.365 +        </tr>
  51.366 +      </table>
  51.367 +</div><div class="memdoc">
  51.368 +
  51.369 +<p>Logs a message at the specified level. </p>
  51.370 +<dl class="params"><dt>Parameters</dt><dd>
  51.371 +  <table class="params">
  51.372 +    <tr><td class="paramname">logger</td><td>the logger to use </td></tr>
  51.373 +    <tr><td class="paramname">level</td><td>the level to log the message on </td></tr>
  51.374 +    <tr><td class="paramname">...</td><td>format string and arguments </td></tr>
  51.375 +  </table>
  51.376 +  </dd>
  51.377 +</dl>
  51.378 +<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>
  51.379 +
  51.380 +</div>
  51.381 +</div>
  51.382 +<a id="a5cffc19502c4c90bfb3bd3bbcd18170a"></a>
  51.383 +<h2 class="memtitle"><span class="permalink"><a href="#a5cffc19502c4c90bfb3bd3bbcd18170a">&#9670;&nbsp;</a></span>ucx_logger_register_level</h2>
  51.384 +
  51.385 +<div class="memitem">
  51.386 +<div class="memproto">
  51.387 +      <table class="memname">
  51.388 +        <tr>
  51.389 +          <td class="memname">#define ucx_logger_register_level</td>
  51.390 +          <td>(</td>
  51.391 +          <td class="paramtype">&#160;</td>
  51.392 +          <td class="paramname">logger, </td>
  51.393 +        </tr>
  51.394 +        <tr>
  51.395 +          <td class="paramkey"></td>
  51.396 +          <td></td>
  51.397 +          <td class="paramtype">&#160;</td>
  51.398 +          <td class="paramname">level, </td>
  51.399 +        </tr>
  51.400 +        <tr>
  51.401 +          <td class="paramkey"></td>
  51.402 +          <td></td>
  51.403 +          <td class="paramtype">&#160;</td>
  51.404 +          <td class="paramname">name&#160;</td>
  51.405 +        </tr>
  51.406 +        <tr>
  51.407 +          <td></td>
  51.408 +          <td>)</td>
  51.409 +          <td></td><td></td>
  51.410 +        </tr>
  51.411 +      </table>
  51.412 +</div><div class="memdoc">
  51.413 +<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 -->
  51.414 +<p>Registers a custom log level. </p>
  51.415 +<dl class="params"><dt>Parameters</dt><dd>
  51.416 +  <table class="params">
  51.417 +    <tr><td class="paramname">logger</td><td>the logger </td></tr>
  51.418 +    <tr><td class="paramname">level</td><td>the log level as unsigned integer </td></tr>
  51.419 +    <tr><td class="paramname">name</td><td>a string literal describing the level </td></tr>
  51.420 +  </table>
  51.421 +  </dd>
  51.422 +</dl>
  51.423 +
  51.424 +</div>
  51.425 +</div>
  51.426 +<a id="a0e0d72b12616c1e49ff8834eaf4cb8a2"></a>
  51.427 +<h2 class="memtitle"><span class="permalink"><a href="#a0e0d72b12616c1e49ff8834eaf4cb8a2">&#9670;&nbsp;</a></span>UCX_LOGGER_SOURCE</h2>
  51.428 +
  51.429 +<div class="memitem">
  51.430 +<div class="memproto">
  51.431 +      <table class="memname">
  51.432 +        <tr>
  51.433 +          <td class="memname">#define UCX_LOGGER_SOURCE&#160;&#160;&#160;0x04</td>
  51.434 +        </tr>
  51.435 +      </table>
  51.436 +</div><div class="memdoc">
  51.437 +
  51.438 +<p>Output flag for the source. </p>
  51.439 +<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>
  51.440 +
  51.441 +</div>
  51.442 +</div>
  51.443 +<a id="a38607008268b4f776ee500fb95d2e823"></a>
  51.444 +<h2 class="memtitle"><span class="permalink"><a href="#a38607008268b4f776ee500fb95d2e823">&#9670;&nbsp;</a></span>UCX_LOGGER_TIMESTAMP</h2>
  51.445 +
  51.446 +<div class="memitem">
  51.447 +<div class="memproto">
  51.448 +      <table class="memname">
  51.449 +        <tr>
  51.450 +          <td class="memname">#define UCX_LOGGER_TIMESTAMP&#160;&#160;&#160;0x02</td>
  51.451 +        </tr>
  51.452 +      </table>
  51.453 +</div><div class="memdoc">
  51.454 +
  51.455 +<p>Output flag for the timestmap. </p>
  51.456 +<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>
  51.457 +
  51.458 +</div>
  51.459 +</div>
  51.460 +<a id="a55b88d1fec7036d841b3ddd6195c5586"></a>
  51.461 +<h2 class="memtitle"><span class="permalink"><a href="#a55b88d1fec7036d841b3ddd6195c5586">&#9670;&nbsp;</a></span>UCX_LOGGER_TRACE</h2>
  51.462 +
  51.463 +<div class="memitem">
  51.464 +<div class="memproto">
  51.465 +      <table class="memname">
  51.466 +        <tr>
  51.467 +          <td class="memname">#define UCX_LOGGER_TRACE&#160;&#160;&#160;0x40</td>
  51.468 +        </tr>
  51.469 +      </table>
  51.470 +</div><div class="memdoc">
  51.471 +
  51.472 +<p>Log level for trace messages. </p>
  51.473 +
  51.474 +</div>
  51.475 +</div>
  51.476 +<a id="a3031b7ff13f4cfae9c2916543be2877c"></a>
  51.477 +<h2 class="memtitle"><span class="permalink"><a href="#a3031b7ff13f4cfae9c2916543be2877c">&#9670;&nbsp;</a></span>ucx_logger_trace</h2>
  51.478 +
  51.479 +<div class="memitem">
  51.480 +<div class="memproto">
  51.481 +      <table class="memname">
  51.482 +        <tr>
  51.483 +          <td class="memname">#define ucx_logger_trace</td>
  51.484 +          <td>(</td>
  51.485 +          <td class="paramtype">&#160;</td>
  51.486 +          <td class="paramname">logger, </td>
  51.487 +        </tr>
  51.488 +        <tr>
  51.489 +          <td class="paramkey"></td>
  51.490 +          <td></td>
  51.491 +          <td class="paramtype">&#160;</td>
  51.492 +          <td class="paramname"><em>...</em>&#160;</td>
  51.493 +        </tr>
  51.494 +        <tr>
  51.495 +          <td></td>
  51.496 +          <td>)</td>
  51.497 +          <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>
  51.498 +        </tr>
  51.499 +      </table>
  51.500 +</div><div class="memdoc">
  51.501 +
  51.502 +<p>Shortcut for logging a trace message. </p>
  51.503 +<dl class="params"><dt>Parameters</dt><dd>
  51.504 +  <table class="params">
  51.505 +    <tr><td class="paramname">logger</td><td>the logger to use </td></tr>
  51.506 +    <tr><td class="paramname">...</td><td>format string and arguments </td></tr>
  51.507 +  </table>
  51.508 +  </dd>
  51.509 +</dl>
  51.510 +<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>
  51.511 +
  51.512 +</div>
  51.513 +</div>
  51.514 +<a id="abd01ca11486226ba34e8f7028d9fffba"></a>
  51.515 +<h2 class="memtitle"><span class="permalink"><a href="#abd01ca11486226ba34e8f7028d9fffba">&#9670;&nbsp;</a></span>UCX_LOGGER_WARN</h2>
  51.516 +
  51.517 +<div class="memitem">
  51.518 +<div class="memproto">
  51.519 +      <table class="memname">
  51.520 +        <tr>
  51.521 +          <td class="memname">#define UCX_LOGGER_WARN&#160;&#160;&#160;0x10</td>
  51.522 +        </tr>
  51.523 +      </table>
  51.524 +</div><div class="memdoc">
  51.525 +
  51.526 +<p>Log level for warning messages. </p>
  51.527 +
  51.528 +</div>
  51.529 +</div>
  51.530 +<a id="aca7bd861b646892813fd7310c0aa69af"></a>
  51.531 +<h2 class="memtitle"><span class="permalink"><a href="#aca7bd861b646892813fd7310c0aa69af">&#9670;&nbsp;</a></span>ucx_logger_warn</h2>
  51.532 +
  51.533 +<div class="memitem">
  51.534 +<div class="memproto">
  51.535 +      <table class="memname">
  51.536 +        <tr>
  51.537 +          <td class="memname">#define ucx_logger_warn</td>
  51.538 +          <td>(</td>
  51.539 +          <td class="paramtype">&#160;</td>
  51.540 +          <td class="paramname">logger, </td>
  51.541 +        </tr>
  51.542 +        <tr>
  51.543 +          <td class="paramkey"></td>
  51.544 +          <td></td>
  51.545 +          <td class="paramtype">&#160;</td>
  51.546 +          <td class="paramname"><em>...</em>&#160;</td>
  51.547 +        </tr>
  51.548 +        <tr>
  51.549 +          <td></td>
  51.550 +          <td>)</td>
  51.551 +          <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>
  51.552 +        </tr>
  51.553 +      </table>
  51.554 +</div><div class="memdoc">
  51.555 +
  51.556 +<p>Shortcut for logging a warning message. </p>
  51.557 +<dl class="params"><dt>Parameters</dt><dd>
  51.558 +  <table class="params">
  51.559 +    <tr><td class="paramname">logger</td><td>the logger to use </td></tr>
  51.560 +    <tr><td class="paramname">...</td><td>format string and arguments </td></tr>
  51.561 +  </table>
  51.562 +  </dd>
  51.563 +</dl>
  51.564 +<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>
  51.565 +
  51.566 +</div>
  51.567 +</div>
  51.568 +<h2 class="groupheader">Function Documentation</h2>
  51.569 +<a id="ac4697b784e01ec990d2acea192e21658"></a>
  51.570 +<h2 class="memtitle"><span class="permalink"><a href="#ac4697b784e01ec990d2acea192e21658">&#9670;&nbsp;</a></span>ucx_logger_free()</h2>
  51.571 +
  51.572 +<div class="memitem">
  51.573 +<div class="memproto">
  51.574 +      <table class="memname">
  51.575 +        <tr>
  51.576 +          <td class="memname">void ucx_logger_free </td>
  51.577 +          <td>(</td>
  51.578 +          <td class="paramtype"><a class="el" href="structUcxLogger.html">UcxLogger</a> *&#160;</td>
  51.579 +          <td class="paramname"><em>logger</em></td><td>)</td>
  51.580 +          <td></td>
  51.581 +        </tr>
  51.582 +      </table>
  51.583 +</div><div class="memdoc">
  51.584 +
  51.585 +<p>Destroys the logger. </p>
  51.586 +<p>The map containing the valid log levels is also automatically destroyed.</p>
  51.587 +<dl class="params"><dt>Parameters</dt><dd>
  51.588 +  <table class="params">
  51.589 +    <tr><td class="paramname">logger</td><td>the logger to destroy </td></tr>
  51.590 +  </table>
  51.591 +  </dd>
  51.592 +</dl>
  51.593 +
  51.594 +</div>
  51.595 +</div>
  51.596 +<a id="ac337e5d02ebea565012d4c11bd643801"></a>
  51.597 +<h2 class="memtitle"><span class="permalink"><a href="#ac337e5d02ebea565012d4c11bd643801">&#9670;&nbsp;</a></span>ucx_logger_logf()</h2>
  51.598 +
  51.599 +<div class="memitem">
  51.600 +<div class="memproto">
  51.601 +      <table class="memname">
  51.602 +        <tr>
  51.603 +          <td class="memname">void ucx_logger_logf </td>
  51.604 +          <td>(</td>
  51.605 +          <td class="paramtype"><a class="el" href="structUcxLogger.html">UcxLogger</a> *&#160;</td>
  51.606 +          <td class="paramname"><em>logger</em>, </td>
  51.607 +        </tr>
  51.608 +        <tr>
  51.609 +          <td class="paramkey"></td>
  51.610 +          <td></td>
  51.611 +          <td class="paramtype">unsigned int&#160;</td>
  51.612 +          <td class="paramname"><em>level</em>, </td>
  51.613 +        </tr>
  51.614 +        <tr>
  51.615 +          <td class="paramkey"></td>
  51.616 +          <td></td>
  51.617 +          <td class="paramtype">const char *&#160;</td>
  51.618 +          <td class="paramname"><em>file</em>, </td>
  51.619 +        </tr>
  51.620 +        <tr>
  51.621 +          <td class="paramkey"></td>
  51.622 +          <td></td>
  51.623 +          <td class="paramtype">const unsigned int&#160;</td>
  51.624 +          <td class="paramname"><em>line</em>, </td>
  51.625 +        </tr>
  51.626 +        <tr>
  51.627 +          <td class="paramkey"></td>
  51.628 +          <td></td>
  51.629 +          <td class="paramtype">const char *&#160;</td>
  51.630 +          <td class="paramname"><em>format</em>, </td>
  51.631 +        </tr>
  51.632 +        <tr>
  51.633 +          <td class="paramkey"></td>
  51.634 +          <td></td>
  51.635 +          <td class="paramtype">&#160;</td>
  51.636 +          <td class="paramname"><em>...</em>&#160;</td>
  51.637 +        </tr>
  51.638 +        <tr>
  51.639 +          <td></td>
  51.640 +          <td>)</td>
  51.641 +          <td></td><td></td>
  51.642 +        </tr>
  51.643 +      </table>
  51.644 +</div><div class="memdoc">
  51.645 +
  51.646 +<p>Internal log function - use macros instead. </p>
  51.647 +<p>This function uses the <code>format</code> and variadic arguments for a printf()-style output of the log message.</p>
  51.648 +<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>
  51.649 +<p><code>[LEVEL] [TIMESTAMP] [SOURCEFILE]:[LINENO] message</code></p>
  51.650 +<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>
  51.651 +<dl class="params"><dt>Parameters</dt><dd>
  51.652 +  <table class="params">
  51.653 +    <tr><td class="paramname">logger</td><td>the logger to use </td></tr>
  51.654 +    <tr><td class="paramname">level</td><td>the level to log on </td></tr>
  51.655 +    <tr><td class="paramname">file</td><td>information about the source file </td></tr>
  51.656 +    <tr><td class="paramname">line</td><td>information about the source line number </td></tr>
  51.657 +    <tr><td class="paramname">format</td><td>format string </td></tr>
  51.658 +    <tr><td class="paramname">...</td><td>arguments </td></tr>
  51.659 +  </table>
  51.660 +  </dd>
  51.661 +</dl>
  51.662 +<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>
  51.663 +
  51.664 +</div>
  51.665 +</div>
  51.666 +<a id="ac560f8517d2172794c9d2691735ec48c"></a>
  51.667 +<h2 class="memtitle"><span class="permalink"><a href="#ac560f8517d2172794c9d2691735ec48c">&#9670;&nbsp;</a></span>ucx_logger_new()</h2>
  51.668 +
  51.669 +<div class="memitem">
  51.670 +<div class="memproto">
  51.671 +      <table class="memname">
  51.672 +        <tr>
  51.673 +          <td class="memname"><a class="el" href="structUcxLogger.html">UcxLogger</a>* ucx_logger_new </td>
  51.674 +          <td>(</td>
  51.675 +          <td class="paramtype">void *&#160;</td>
  51.676 +          <td class="paramname"><em>stream</em>, </td>
  51.677 +        </tr>
  51.678 +        <tr>
  51.679 +          <td class="paramkey"></td>
  51.680 +          <td></td>
  51.681 +          <td class="paramtype">unsigned int&#160;</td>
  51.682 +          <td class="paramname"><em>level</em>, </td>
  51.683 +        </tr>
  51.684 +        <tr>
  51.685 +          <td class="paramkey"></td>
  51.686 +          <td></td>
  51.687 +          <td class="paramtype">unsigned int&#160;</td>
  51.688 +          <td class="paramname"><em>mask</em>&#160;</td>
  51.689 +        </tr>
  51.690 +        <tr>
  51.691 +          <td></td>
  51.692 +          <td>)</td>
  51.693 +          <td></td><td></td>
  51.694 +        </tr>
  51.695 +      </table>
  51.696 +</div><div class="memdoc">
  51.697 +
  51.698 +<p>Creates a new logger. </p>
  51.699 +<dl class="params"><dt>Parameters</dt><dd>
  51.700 +  <table class="params">
  51.701 +    <tr><td class="paramname">stream</td><td>the stream, which the logger shall write to </td></tr>
  51.702 +    <tr><td class="paramname">level</td><td>the level on which the logger shall operate </td></tr>
  51.703 +    <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>
  51.704 +  </table>
  51.705 +  </dd>
  51.706 +</dl>
  51.707 +<dl class="section return"><dt>Returns</dt><dd>a new logger object </dd></dl>
  51.708 +
  51.709 +</div>
  51.710 +</div>
  51.711 +</div><!-- contents -->
  51.712 +<!-- start footer part -->
  51.713 +<hr class="footer"/><address class="footer"><small>
  51.714 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  51.715 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  51.716 +</a> 1.8.13
  51.717 +</small></address>
  51.718 +</body>
  51.719 +</html>
    52.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    52.2 +++ b/docs/api-2.1/logging_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
    52.3 @@ -0,0 +1,94 @@
    52.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    52.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    52.6 +<head>
    52.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    52.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    52.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   52.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   52.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/logging.h Source File</title>
   52.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   52.13 +<script type="text/javascript" src="jquery.js"></script>
   52.14 +<script type="text/javascript" src="dynsections.js"></script>
   52.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   52.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   52.17 +<script type="text/javascript" src="search/search.js"></script>
   52.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   52.19 +</head>
   52.20 +<body>
   52.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   52.22 +<div id="titlearea">
   52.23 +<table cellspacing="0" cellpadding="0">
   52.24 + <tbody>
   52.25 + <tr style="height: 56px;">
   52.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   52.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   52.28 +   <div id="projectname">ucx
   52.29 +   </div>
   52.30 +   <div id="projectbrief">UAP Common Extensions</div>
   52.31 +  </td>
   52.32 + </tr>
   52.33 + </tbody>
   52.34 +</table>
   52.35 +</div>
   52.36 +<!-- end header part -->
   52.37 +<!-- Generated by Doxygen 1.8.13 -->
   52.38 +<script type="text/javascript">
   52.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   52.40 +</script>
   52.41 +<script type="text/javascript" src="menudata.js"></script>
   52.42 +<script type="text/javascript" src="menu.js"></script>
   52.43 +<script type="text/javascript">
   52.44 +$(function() {
   52.45 +  initMenu('',true,false,'search.php','Search');
   52.46 +  $(document).ready(function() { init_search(); });
   52.47 +});
   52.48 +</script>
   52.49 +<div id="main-nav"></div>
   52.50 +<!-- window showing the filter options -->
   52.51 +<div id="MSearchSelectWindow"
   52.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   52.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   52.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   52.55 +</div>
   52.56 +
   52.57 +<!-- iframe showing the search results (closed by default) -->
   52.58 +<div id="MSearchResultsWindow">
   52.59 +<iframe src="javascript:void(0)" frameborder="0" 
   52.60 +        name="MSearchResults" id="MSearchResults">
   52.61 +</iframe>
   52.62 +</div>
   52.63 +
   52.64 +<div id="nav-path" class="navpath">
   52.65 +  <ul>
   52.66 +<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>
   52.67 +</div>
   52.68 +</div><!-- top -->
   52.69 +<div class="header">
   52.70 +  <div class="headertitle">
   52.71 +<div class="title">logging.h</div>  </div>
   52.72 +</div><!--header-->
   52.73 +<div class="contents">
   52.74 +<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>
   52.75 +<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>
   52.76 +<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>
   52.77 +<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>
   52.78 +<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>
   52.79 +<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>
   52.80 +<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>
   52.81 +<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>
   52.82 +<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>
   52.83 +<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>
   52.84 +<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>
   52.85 +<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>
   52.86 +<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>
   52.87 +<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>
   52.88 +<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>
   52.89 +</div><!-- fragment --></div><!-- contents -->
   52.90 +<!-- start footer part -->
   52.91 +<hr class="footer"/><address class="footer"><small>
   52.92 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
   52.93 +<img class="footer" src="doxygen.png" alt="doxygen"/>
   52.94 +</a> 1.8.13
   52.95 +</small></address>
   52.96 +</body>
   52.97 +</html>
    53.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    53.2 +++ b/docs/api-2.1/map_8h.html	Sat Feb 06 19:11:44 2021 +0100
    53.3 @@ -0,0 +1,1689 @@
    53.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    53.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    53.6 +<head>
    53.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    53.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    53.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   53.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   53.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/map.h File Reference</title>
   53.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   53.13 +<script type="text/javascript" src="jquery.js"></script>
   53.14 +<script type="text/javascript" src="dynsections.js"></script>
   53.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   53.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   53.17 +<script type="text/javascript" src="search/search.js"></script>
   53.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   53.19 +</head>
   53.20 +<body>
   53.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   53.22 +<div id="titlearea">
   53.23 +<table cellspacing="0" cellpadding="0">
   53.24 + <tbody>
   53.25 + <tr style="height: 56px;">
   53.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   53.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   53.28 +   <div id="projectname">ucx
   53.29 +   </div>
   53.30 +   <div id="projectbrief">UAP Common Extensions</div>
   53.31 +  </td>
   53.32 + </tr>
   53.33 + </tbody>
   53.34 +</table>
   53.35 +</div>
   53.36 +<!-- end header part -->
   53.37 +<!-- Generated by Doxygen 1.8.13 -->
   53.38 +<script type="text/javascript">
   53.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   53.40 +</script>
   53.41 +<script type="text/javascript" src="menudata.js"></script>
   53.42 +<script type="text/javascript" src="menu.js"></script>
   53.43 +<script type="text/javascript">
   53.44 +$(function() {
   53.45 +  initMenu('',true,false,'search.php','Search');
   53.46 +  $(document).ready(function() { init_search(); });
   53.47 +});
   53.48 +</script>
   53.49 +<div id="main-nav"></div>
   53.50 +<!-- window showing the filter options -->
   53.51 +<div id="MSearchSelectWindow"
   53.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   53.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   53.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   53.55 +</div>
   53.56 +
   53.57 +<!-- iframe showing the search results (closed by default) -->
   53.58 +<div id="MSearchResultsWindow">
   53.59 +<iframe src="javascript:void(0)" frameborder="0" 
   53.60 +        name="MSearchResults" id="MSearchResults">
   53.61 +</iframe>
   53.62 +</div>
   53.63 +
   53.64 +<div id="nav-path" class="navpath">
   53.65 +  <ul>
   53.66 +<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>
   53.67 +</div>
   53.68 +</div><!-- top -->
   53.69 +<div class="header">
   53.70 +  <div class="summary">
   53.71 +<a href="#nested-classes">Data Structures</a> &#124;
   53.72 +<a href="#define-members">Macros</a> &#124;
   53.73 +<a href="#typedef-members">Typedefs</a> &#124;
   53.74 +<a href="#func-members">Functions</a>  </div>
   53.75 +  <div class="headertitle">
   53.76 +<div class="title">map.h File Reference</div>  </div>
   53.77 +</div><!--header-->
   53.78 +<div class="contents">
   53.79 +
   53.80 +<p>Hash map implementation.  
   53.81 +<a href="#details">More...</a></p>
   53.82 +<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
   53.83 +<code>#include &quot;<a class="el" href="string_8h_source.html">string.h</a>&quot;</code><br />
   53.84 +<code>#include &quot;<a class="el" href="allocator_8h_source.html">allocator.h</a>&quot;</code><br />
   53.85 +<code>#include &lt;stdio.h&gt;</code><br />
   53.86 +</div>
   53.87 +<p><a href="map_8h_source.html">Go to the source code of this file.</a></p>
   53.88 +<table class="memberdecls">
   53.89 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
   53.90 +Data Structures</h2></td></tr>
   53.91 +<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>
   53.92 +<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>
   53.93 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   53.94 +<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>
   53.95 +<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>
   53.96 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   53.97 +<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>
   53.98 +<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>
   53.99 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.100 +<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>
  53.101 +<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>
  53.102 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.103 +<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>
  53.104 +<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>
  53.105 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.106 +</table><table class="memberdecls">
  53.107 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
  53.108 +Macros</h2></td></tr>
  53.109 +<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>
  53.110 +<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>
  53.111 +<tr class="separator:a940896c4aa1b13e54c55c04c3efc186b"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.112 +<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>
  53.113 +<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>
  53.114 +<tr class="separator:ac26a8615bfc8f47ee9eaceb47645f98e"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.115 +<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>
  53.116 +<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>
  53.117 +<tr class="separator:ad9356b01425b934ab237b52339ac0cc3"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.118 +<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>
  53.119 +<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>
  53.120 +<tr class="separator:aaa30af79b4068c923895619e83f44367"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.121 +<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>
  53.122 +<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>
  53.123 +<tr class="separator:a14d385f6b7f371f0507861cabd2eab4e"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.124 +<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>
  53.125 +<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>
  53.126 +<tr class="separator:a64e1fb55498fa502dd2ed8ed69062cdd"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.127 +<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>
  53.128 +<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>
  53.129 +<tr class="separator:aa1681bd2178553cd092fd24c4d681d3c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.130 +<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>
  53.131 +<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>
  53.132 +<tr class="separator:a48700ea86fadb9ea54d13010f9124df2"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.133 +<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>
  53.134 +<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>
  53.135 +<tr class="separator:a9c4405a5a75ecf64e2ef3d0c6501a9fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.136 +<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>
  53.137 +<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>
  53.138 +<tr class="separator:aa767958b5468737755c09f7185b1770c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.139 +</table><table class="memberdecls">
  53.140 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
  53.141 +Typedefs</h2></td></tr>
  53.142 +<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>
  53.143 +<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>
  53.144 +<tr class="separator:a18e21948725b2da68c35da587a722033"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.145 +<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>
  53.146 +<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>
  53.147 +<tr class="separator:ad63828bb23123fc01a5315a2bac3b142"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.148 +<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>
  53.149 +<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>
  53.150 +<tr class="separator:ad7d7a910a32113eb93eae11c3dc97b4b"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.151 +<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>
  53.152 +<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>
  53.153 +<tr class="separator:ae36aff5f645948c54f51578b11fd87fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.154 +</table><table class="memberdecls">
  53.155 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
  53.156 +Functions</h2></td></tr>
  53.157 +<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>
  53.158 +<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>
  53.159 +<tr class="separator:a79f31de8b93814493759dbc8b940cf0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.160 +<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>
  53.161 +<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>
  53.162 +<tr class="separator:aed508a94c66cc15372503c64b70eb03e"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.163 +<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>
  53.164 +<tr class="memdesc:abe3d9688e4224bf7bb962abf25ff8c2e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees a hash map.  <a href="#abe3d9688e4224bf7bb962abf25ff8c2e">More...</a><br /></td></tr>
  53.165 +<tr class="separator:abe3d9688e4224bf7bb962abf25ff8c2e"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.166 +<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>
  53.167 +<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>
  53.168 +<tr class="separator:a750f3d9d83e2f3788a14c17a9d160618"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.169 +<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>
  53.170 +<tr class="memdesc:a285e90e40681c6d9631c935dda0967f2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Clears a hash map.  <a href="#a285e90e40681c6d9631c935dda0967f2">More...</a><br /></td></tr>
  53.171 +<tr class="separator:a285e90e40681c6d9631c935dda0967f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.172 +<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>
  53.173 +<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>
  53.174 +<tr class="separator:adfeb2d61003fd2896bcfdc9a57f36425"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.175 +<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>
  53.176 +<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>
  53.177 +<tr class="separator:a62c6c30cbb0d824ba710f5030ff9a4e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.178 +<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>
  53.179 +<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>
  53.180 +<tr class="separator:a9aea9103703d5c168420bb6bf85549ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.181 +<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>
  53.182 +<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>
  53.183 +<tr class="separator:a174bce9fad554dd92b8da354e0d32512"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.184 +<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>
  53.185 +<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>
  53.186 +<tr class="separator:ac04a08b604217070254d4c58f0e82498"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.187 +<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>
  53.188 +<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>
  53.189 +<tr class="separator:ab61192c5af2e06ecb9ad73880d1c95a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.190 +<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>
  53.191 +<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>
  53.192 +<tr class="separator:a17248a4888eb8f9ae18be522d64632aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.193 +<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>
  53.194 +<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>
  53.195 +<tr class="separator:a3e540bb46b8ee19789aed63fd8919200"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.196 +<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>
  53.197 +<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>
  53.198 +<tr class="separator:aea3be97254c05595d986ef6a9faae87b"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.199 +<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>
  53.200 +<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>
  53.201 +<tr class="separator:a9150e9c64fdf4dfcc2cad106b91aa110"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.202 +<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>
  53.203 +<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>
  53.204 +<tr class="separator:aceb8675abf44860b4bbc301bbada5b91"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.205 +<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>
  53.206 +<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>
  53.207 +<tr class="separator:a3f65978c481af7f637cad021d93522d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.208 +<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>
  53.209 +<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>
  53.210 +<tr class="separator:ab6370c3fa8113fdad593ce4b0460c9c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.211 +<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>
  53.212 +<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>
  53.213 +<tr class="separator:aa594d7a5afebc3bed6bb265348cf6b0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.214 +<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>
  53.215 +<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>
  53.216 +<tr class="separator:a169e0470a20484dd76425fdf77e3651e"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.217 +<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>
  53.218 +<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>
  53.219 +<tr class="separator:a774fcff87d1e58b6c5af77dd19a8c3dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.220 +<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>
  53.221 +<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>
  53.222 +<tr class="separator:ad0ba103494247d798ac3037c50fc8831"><td class="memSeparator" colspan="2">&#160;</td></tr>
  53.223 +</table>
  53.224 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  53.225 +<div class="textblock"><p>Hash map implementation. </p>
  53.226 +<p>This implementation uses murmur hash 2 and separate chaining with linked lists.</p>
  53.227 +<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
  53.228 +<dd>
  53.229 +Olaf Wintermann </dd></dl>
  53.230 +</div><h2 class="groupheader">Macro Definition Documentation</h2>
  53.231 +<a id="a64e1fb55498fa502dd2ed8ed69062cdd"></a>
  53.232 +<h2 class="memtitle"><span class="permalink"><a href="#a64e1fb55498fa502dd2ed8ed69062cdd">&#9670;&nbsp;</a></span>ucx_map_cstr_get</h2>
  53.233 +
  53.234 +<div class="memitem">
  53.235 +<div class="memproto">
  53.236 +      <table class="memname">
  53.237 +        <tr>
  53.238 +          <td class="memname">#define ucx_map_cstr_get</td>
  53.239 +          <td>(</td>
  53.240 +          <td class="paramtype">&#160;</td>
  53.241 +          <td class="paramname">map, </td>
  53.242 +        </tr>
  53.243 +        <tr>
  53.244 +          <td class="paramkey"></td>
  53.245 +          <td></td>
  53.246 +          <td class="paramtype">&#160;</td>
  53.247 +          <td class="paramname">key&#160;</td>
  53.248 +        </tr>
  53.249 +        <tr>
  53.250 +          <td></td>
  53.251 +          <td>)</td>
  53.252 +          <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>
  53.253 +        </tr>
  53.254 +      </table>
  53.255 +</div><div class="memdoc">
  53.256 +
  53.257 +<p>Shorthand for getting data from the map with a C string key. </p>
  53.258 +<dl class="params"><dt>Parameters</dt><dd>
  53.259 +  <table class="params">
  53.260 +    <tr><td class="paramname">map</td><td>the map </td></tr>
  53.261 +    <tr><td class="paramname">key</td><td>the key </td></tr>
  53.262 +  </table>
  53.263 +  </dd>
  53.264 +</dl>
  53.265 +<dl class="section return"><dt>Returns</dt><dd>the value </dd></dl>
  53.266 +<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>
  53.267 +
  53.268 +</div>
  53.269 +</div>
  53.270 +<a id="ad9356b01425b934ab237b52339ac0cc3"></a>
  53.271 +<h2 class="memtitle"><span class="permalink"><a href="#ad9356b01425b934ab237b52339ac0cc3">&#9670;&nbsp;</a></span>ucx_map_cstr_put</h2>
  53.272 +
  53.273 +<div class="memitem">
  53.274 +<div class="memproto">
  53.275 +      <table class="memname">
  53.276 +        <tr>
  53.277 +          <td class="memname">#define ucx_map_cstr_put</td>
  53.278 +          <td>(</td>
  53.279 +          <td class="paramtype">&#160;</td>
  53.280 +          <td class="paramname">map, </td>
  53.281 +        </tr>
  53.282 +        <tr>
  53.283 +          <td class="paramkey"></td>
  53.284 +          <td></td>
  53.285 +          <td class="paramtype">&#160;</td>
  53.286 +          <td class="paramname">key, </td>
  53.287 +        </tr>
  53.288 +        <tr>
  53.289 +          <td class="paramkey"></td>
  53.290 +          <td></td>
  53.291 +          <td class="paramtype">&#160;</td>
  53.292 +          <td class="paramname">value&#160;</td>
  53.293 +        </tr>
  53.294 +        <tr>
  53.295 +          <td></td>
  53.296 +          <td>)</td>
  53.297 +          <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>
  53.298 +        </tr>
  53.299 +      </table>
  53.300 +</div><div class="memdoc">
  53.301 +
  53.302 +<p>Shorthand for putting data with a C string key into the map. </p>
  53.303 +<dl class="params"><dt>Parameters</dt><dd>
  53.304 +  <table class="params">
  53.305 +    <tr><td class="paramname">map</td><td>the map </td></tr>
  53.306 +    <tr><td class="paramname">key</td><td>the key </td></tr>
  53.307 +    <tr><td class="paramname">value</td><td>the value </td></tr>
  53.308 +  </table>
  53.309 +  </dd>
  53.310 +</dl>
  53.311 +<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero value on failure </dd></dl>
  53.312 +<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>
  53.313 +
  53.314 +</div>
  53.315 +</div>
  53.316 +<a id="a9c4405a5a75ecf64e2ef3d0c6501a9fe"></a>
  53.317 +<h2 class="memtitle"><span class="permalink"><a href="#a9c4405a5a75ecf64e2ef3d0c6501a9fe">&#9670;&nbsp;</a></span>ucx_map_cstr_remove</h2>
  53.318 +
  53.319 +<div class="memitem">
  53.320 +<div class="memproto">
  53.321 +      <table class="memname">
  53.322 +        <tr>
  53.323 +          <td class="memname">#define ucx_map_cstr_remove</td>
  53.324 +          <td>(</td>
  53.325 +          <td class="paramtype">&#160;</td>
  53.326 +          <td class="paramname">map, </td>
  53.327 +        </tr>
  53.328 +        <tr>
  53.329 +          <td class="paramkey"></td>
  53.330 +          <td></td>
  53.331 +          <td class="paramtype">&#160;</td>
  53.332 +          <td class="paramname">key&#160;</td>
  53.333 +        </tr>
  53.334 +        <tr>
  53.335 +          <td></td>
  53.336 +          <td>)</td>
  53.337 +          <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>
  53.338 +        </tr>
  53.339 +      </table>
  53.340 +</div><div class="memdoc">
  53.341 +
  53.342 +<p>Shorthand for removing data from the map with a C string key. </p>
  53.343 +<dl class="params"><dt>Parameters</dt><dd>
  53.344 +  <table class="params">
  53.345 +    <tr><td class="paramname">map</td><td>the map </td></tr>
  53.346 +    <tr><td class="paramname">key</td><td>the key </td></tr>
  53.347 +  </table>
  53.348 +  </dd>
  53.349 +</dl>
  53.350 +<dl class="section return"><dt>Returns</dt><dd>the removed value </dd></dl>
  53.351 +<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>
  53.352 +
  53.353 +</div>
  53.354 +</div>
  53.355 +<a id="a940896c4aa1b13e54c55c04c3efc186b"></a>
  53.356 +<h2 class="memtitle"><span class="permalink"><a href="#a940896c4aa1b13e54c55c04c3efc186b">&#9670;&nbsp;</a></span>UCX_MAP_FOREACH</h2>
  53.357 +
  53.358 +<div class="memitem">
  53.359 +<div class="memproto">
  53.360 +      <table class="memname">
  53.361 +        <tr>
  53.362 +          <td class="memname">#define UCX_MAP_FOREACH</td>
  53.363 +          <td>(</td>
  53.364 +          <td class="paramtype">&#160;</td>
  53.365 +          <td class="paramname">key, </td>
  53.366 +        </tr>
  53.367 +        <tr>
  53.368 +          <td class="paramkey"></td>
  53.369 +          <td></td>
  53.370 +          <td class="paramtype">&#160;</td>
  53.371 +          <td class="paramname">value, </td>
  53.372 +        </tr>
  53.373 +        <tr>
  53.374 +          <td class="paramkey"></td>
  53.375 +          <td></td>
  53.376 +          <td class="paramtype">&#160;</td>
  53.377 +          <td class="paramname">iter&#160;</td>
  53.378 +        </tr>
  53.379 +        <tr>
  53.380 +          <td></td>
  53.381 +          <td>)</td>
  53.382 +          <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>
  53.383 +        </tr>
  53.384 +      </table>
  53.385 +</div><div class="memdoc">
  53.386 +
  53.387 +<p>Loop statement for UCX maps. </p>
  53.388 +<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>
  53.389 +<dl class="params"><dt>Parameters</dt><dd>
  53.390 +  <table class="params">
  53.391 +    <tr><td class="paramname">key</td><td>the variable name for the key </td></tr>
  53.392 +    <tr><td class="paramname">value</td><td>the variable name for the value </td></tr>
  53.393 +    <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>
  53.394 +  </table>
  53.395 +  </dd>
  53.396 +</dl>
  53.397 +<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>
  53.398 +
  53.399 +</div>
  53.400 +</div>
  53.401 +<a id="aa1681bd2178553cd092fd24c4d681d3c"></a>
  53.402 +<h2 class="memtitle"><span class="permalink"><a href="#aa1681bd2178553cd092fd24c4d681d3c">&#9670;&nbsp;</a></span>ucx_map_int_get</h2>
  53.403 +
  53.404 +<div class="memitem">
  53.405 +<div class="memproto">
  53.406 +      <table class="memname">
  53.407 +        <tr>
  53.408 +          <td class="memname">#define ucx_map_int_get</td>
  53.409 +          <td>(</td>
  53.410 +          <td class="paramtype">&#160;</td>
  53.411 +          <td class="paramname">map, </td>
  53.412 +        </tr>
  53.413 +        <tr>
  53.414 +          <td class="paramkey"></td>
  53.415 +          <td></td>
  53.416 +          <td class="paramtype">&#160;</td>
  53.417 +          <td class="paramname">key&#160;</td>
  53.418 +        </tr>
  53.419 +        <tr>
  53.420 +          <td></td>
  53.421 +          <td>)</td>
  53.422 +          <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>
  53.423 +        </tr>
  53.424 +      </table>
  53.425 +</div><div class="memdoc">
  53.426 +
  53.427 +<p>Shorthand for getting data from the map with an integer key. </p>
  53.428 +<dl class="params"><dt>Parameters</dt><dd>
  53.429 +  <table class="params">
  53.430 +    <tr><td class="paramname">map</td><td>the map </td></tr>
  53.431 +    <tr><td class="paramname">key</td><td>the key </td></tr>
  53.432 +  </table>
  53.433 +  </dd>
  53.434 +</dl>
  53.435 +<dl class="section return"><dt>Returns</dt><dd>the value </dd></dl>
  53.436 +<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>
  53.437 +
  53.438 +</div>
  53.439 +</div>
  53.440 +<a id="aaa30af79b4068c923895619e83f44367"></a>
  53.441 +<h2 class="memtitle"><span class="permalink"><a href="#aaa30af79b4068c923895619e83f44367">&#9670;&nbsp;</a></span>ucx_map_int_put</h2>
  53.442 +
  53.443 +<div class="memitem">
  53.444 +<div class="memproto">
  53.445 +      <table class="memname">
  53.446 +        <tr>
  53.447 +          <td class="memname">#define ucx_map_int_put</td>
  53.448 +          <td>(</td>
  53.449 +          <td class="paramtype">&#160;</td>
  53.450 +          <td class="paramname">map, </td>
  53.451 +        </tr>
  53.452 +        <tr>
  53.453 +          <td class="paramkey"></td>
  53.454 +          <td></td>
  53.455 +          <td class="paramtype">&#160;</td>
  53.456 +          <td class="paramname">key, </td>
  53.457 +        </tr>
  53.458 +        <tr>
  53.459 +          <td class="paramkey"></td>
  53.460 +          <td></td>
  53.461 +          <td class="paramtype">&#160;</td>
  53.462 +          <td class="paramname">value&#160;</td>
  53.463 +        </tr>
  53.464 +        <tr>
  53.465 +          <td></td>
  53.466 +          <td>)</td>
  53.467 +          <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>
  53.468 +        </tr>
  53.469 +      </table>
  53.470 +</div><div class="memdoc">
  53.471 +
  53.472 +<p>Shorthand for putting data with an integer key into the map. </p>
  53.473 +<dl class="params"><dt>Parameters</dt><dd>
  53.474 +  <table class="params">
  53.475 +    <tr><td class="paramname">map</td><td>the map </td></tr>
  53.476 +    <tr><td class="paramname">key</td><td>the key </td></tr>
  53.477 +    <tr><td class="paramname">value</td><td>the value </td></tr>
  53.478 +  </table>
  53.479 +  </dd>
  53.480 +</dl>
  53.481 +<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero value on failure </dd></dl>
  53.482 +<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>
  53.483 +
  53.484 +</div>
  53.485 +</div>
  53.486 +<a id="aa767958b5468737755c09f7185b1770c"></a>
  53.487 +<h2 class="memtitle"><span class="permalink"><a href="#aa767958b5468737755c09f7185b1770c">&#9670;&nbsp;</a></span>ucx_map_int_remove</h2>
  53.488 +
  53.489 +<div class="memitem">
  53.490 +<div class="memproto">
  53.491 +      <table class="memname">
  53.492 +        <tr>
  53.493 +          <td class="memname">#define ucx_map_int_remove</td>
  53.494 +          <td>(</td>
  53.495 +          <td class="paramtype">&#160;</td>
  53.496 +          <td class="paramname">map, </td>
  53.497 +        </tr>
  53.498 +        <tr>
  53.499 +          <td class="paramkey"></td>
  53.500 +          <td></td>
  53.501 +          <td class="paramtype">&#160;</td>
  53.502 +          <td class="paramname">key&#160;</td>
  53.503 +        </tr>
  53.504 +        <tr>
  53.505 +          <td></td>
  53.506 +          <td>)</td>
  53.507 +          <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>
  53.508 +        </tr>
  53.509 +      </table>
  53.510 +</div><div class="memdoc">
  53.511 +
  53.512 +<p>Shorthand for removing data from the map with an integer key. </p>
  53.513 +<dl class="params"><dt>Parameters</dt><dd>
  53.514 +  <table class="params">
  53.515 +    <tr><td class="paramname">map</td><td>the map </td></tr>
  53.516 +    <tr><td class="paramname">key</td><td>the key </td></tr>
  53.517 +  </table>
  53.518 +  </dd>
  53.519 +</dl>
  53.520 +<dl class="section return"><dt>Returns</dt><dd>the removed value </dd></dl>
  53.521 +<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>
  53.522 +
  53.523 +</div>
  53.524 +</div>
  53.525 +<a id="a14d385f6b7f371f0507861cabd2eab4e"></a>
  53.526 +<h2 class="memtitle"><span class="permalink"><a href="#a14d385f6b7f371f0507861cabd2eab4e">&#9670;&nbsp;</a></span>ucx_map_sstr_get</h2>
  53.527 +
  53.528 +<div class="memitem">
  53.529 +<div class="memproto">
  53.530 +      <table class="memname">
  53.531 +        <tr>
  53.532 +          <td class="memname">#define ucx_map_sstr_get</td>
  53.533 +          <td>(</td>
  53.534 +          <td class="paramtype">&#160;</td>
  53.535 +          <td class="paramname">map, </td>
  53.536 +        </tr>
  53.537 +        <tr>
  53.538 +          <td class="paramkey"></td>
  53.539 +          <td></td>
  53.540 +          <td class="paramtype">&#160;</td>
  53.541 +          <td class="paramname">key&#160;</td>
  53.542 +        </tr>
  53.543 +        <tr>
  53.544 +          <td></td>
  53.545 +          <td>)</td>
  53.546 +          <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>
  53.547 +        </tr>
  53.548 +      </table>
  53.549 +</div><div class="memdoc">
  53.550 +
  53.551 +<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>
  53.552 +<dl class="params"><dt>Parameters</dt><dd>
  53.553 +  <table class="params">
  53.554 +    <tr><td class="paramname">map</td><td>the map </td></tr>
  53.555 +    <tr><td class="paramname">key</td><td>the key </td></tr>
  53.556 +  </table>
  53.557 +  </dd>
  53.558 +</dl>
  53.559 +<dl class="section return"><dt>Returns</dt><dd>the value </dd></dl>
  53.560 +<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>
  53.561 +
  53.562 +</div>
  53.563 +</div>
  53.564 +<a id="ac26a8615bfc8f47ee9eaceb47645f98e"></a>
  53.565 +<h2 class="memtitle"><span class="permalink"><a href="#ac26a8615bfc8f47ee9eaceb47645f98e">&#9670;&nbsp;</a></span>ucx_map_sstr_put</h2>
  53.566 +
  53.567 +<div class="memitem">
  53.568 +<div class="memproto">
  53.569 +      <table class="memname">
  53.570 +        <tr>
  53.571 +          <td class="memname">#define ucx_map_sstr_put</td>
  53.572 +          <td>(</td>
  53.573 +          <td class="paramtype">&#160;</td>
  53.574 +          <td class="paramname">map, </td>
  53.575 +        </tr>
  53.576 +        <tr>
  53.577 +          <td class="paramkey"></td>
  53.578 +          <td></td>
  53.579 +          <td class="paramtype">&#160;</td>
  53.580 +          <td class="paramname">key, </td>
  53.581 +        </tr>
  53.582 +        <tr>
  53.583 +          <td class="paramkey"></td>
  53.584 +          <td></td>
  53.585 +          <td class="paramtype">&#160;</td>
  53.586 +          <td class="paramname">value&#160;</td>
  53.587 +        </tr>
  53.588 +        <tr>
  53.589 +          <td></td>
  53.590 +          <td>)</td>
  53.591 +          <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>
  53.592 +        </tr>
  53.593 +      </table>
  53.594 +</div><div class="memdoc">
  53.595 +
  53.596 +<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>
  53.597 +<dl class="params"><dt>Parameters</dt><dd>
  53.598 +  <table class="params">
  53.599 +    <tr><td class="paramname">map</td><td>the map </td></tr>
  53.600 +    <tr><td class="paramname">key</td><td>the key </td></tr>
  53.601 +    <tr><td class="paramname">value</td><td>the value </td></tr>
  53.602 +  </table>
  53.603 +  </dd>
  53.604 +</dl>
  53.605 +<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero value on failure </dd></dl>
  53.606 +<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>
  53.607 +
  53.608 +</div>
  53.609 +</div>
  53.610 +<a id="a48700ea86fadb9ea54d13010f9124df2"></a>
  53.611 +<h2 class="memtitle"><span class="permalink"><a href="#a48700ea86fadb9ea54d13010f9124df2">&#9670;&nbsp;</a></span>ucx_map_sstr_remove</h2>
  53.612 +
  53.613 +<div class="memitem">
  53.614 +<div class="memproto">
  53.615 +      <table class="memname">
  53.616 +        <tr>
  53.617 +          <td class="memname">#define ucx_map_sstr_remove</td>
  53.618 +          <td>(</td>
  53.619 +          <td class="paramtype">&#160;</td>
  53.620 +          <td class="paramname">map, </td>
  53.621 +        </tr>
  53.622 +        <tr>
  53.623 +          <td class="paramkey"></td>
  53.624 +          <td></td>
  53.625 +          <td class="paramtype">&#160;</td>
  53.626 +          <td class="paramname">key&#160;</td>
  53.627 +        </tr>
  53.628 +        <tr>
  53.629 +          <td></td>
  53.630 +          <td>)</td>
  53.631 +          <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>
  53.632 +        </tr>
  53.633 +      </table>
  53.634 +</div><div class="memdoc">
  53.635 +
  53.636 +<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>
  53.637 +<dl class="params"><dt>Parameters</dt><dd>
  53.638 +  <table class="params">
  53.639 +    <tr><td class="paramname">map</td><td>the map </td></tr>
  53.640 +    <tr><td class="paramname">key</td><td>the key </td></tr>
  53.641 +  </table>
  53.642 +  </dd>
  53.643 +</dl>
  53.644 +<dl class="section return"><dt>Returns</dt><dd>the removed value </dd></dl>
  53.645 +<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>
  53.646 +
  53.647 +</div>
  53.648 +</div>
  53.649 +<h2 class="groupheader">Typedef Documentation</h2>
  53.650 +<a id="ad63828bb23123fc01a5315a2bac3b142"></a>
  53.651 +<h2 class="memtitle"><span class="permalink"><a href="#ad63828bb23123fc01a5315a2bac3b142">&#9670;&nbsp;</a></span>UcxKey</h2>
  53.652 +
  53.653 +<div class="memitem">
  53.654 +<div class="memproto">
  53.655 +      <table class="memname">
  53.656 +        <tr>
  53.657 +          <td class="memname">typedef struct <a class="el" href="structUcxKey.html">UcxKey</a> <a class="el" href="structUcxKey.html">UcxKey</a></td>
  53.658 +        </tr>
  53.659 +      </table>
  53.660 +</div><div class="memdoc">
  53.661 +
  53.662 +<p>Type for a key of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>. </p>
  53.663 +<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>
  53.664 +
  53.665 +</div>
  53.666 +</div>
  53.667 +<a id="a18e21948725b2da68c35da587a722033"></a>
  53.668 +<h2 class="memtitle"><span class="permalink"><a href="#a18e21948725b2da68c35da587a722033">&#9670;&nbsp;</a></span>UcxMap</h2>
  53.669 +
  53.670 +<div class="memitem">
  53.671 +<div class="memproto">
  53.672 +      <table class="memname">
  53.673 +        <tr>
  53.674 +          <td class="memname">typedef struct <a class="el" href="structUcxMap.html">UcxMap</a> <a class="el" href="structUcxMap.html">UcxMap</a></td>
  53.675 +        </tr>
  53.676 +      </table>
  53.677 +</div><div class="memdoc">
  53.678 +
  53.679 +<p>Type for the UCX map. </p>
  53.680 +<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>
  53.681 +
  53.682 +</div>
  53.683 +</div>
  53.684 +<a id="ad7d7a910a32113eb93eae11c3dc97b4b"></a>
  53.685 +<h2 class="memtitle"><span class="permalink"><a href="#ad7d7a910a32113eb93eae11c3dc97b4b">&#9670;&nbsp;</a></span>UcxMapElement</h2>
  53.686 +
  53.687 +<div class="memitem">
  53.688 +<div class="memproto">
  53.689 +      <table class="memname">
  53.690 +        <tr>
  53.691 +          <td class="memname">typedef struct <a class="el" href="structUcxMapElement.html">UcxMapElement</a> <a class="el" href="structUcxMapElement.html">UcxMapElement</a></td>
  53.692 +        </tr>
  53.693 +      </table>
  53.694 +</div><div class="memdoc">
  53.695 +
  53.696 +<p>Type for an element of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>. </p>
  53.697 +<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>
  53.698 +
  53.699 +</div>
  53.700 +</div>
  53.701 +<a id="ae36aff5f645948c54f51578b11fd87fb"></a>
  53.702 +<h2 class="memtitle"><span class="permalink"><a href="#ae36aff5f645948c54f51578b11fd87fb">&#9670;&nbsp;</a></span>UcxMapIterator</h2>
  53.703 +
  53.704 +<div class="memitem">
  53.705 +<div class="memproto">
  53.706 +      <table class="memname">
  53.707 +        <tr>
  53.708 +          <td class="memname">typedef struct <a class="el" href="structUcxMapIterator.html">UcxMapIterator</a> <a class="el" href="structUcxMapIterator.html">UcxMapIterator</a></td>
  53.709 +        </tr>
  53.710 +      </table>
  53.711 +</div><div class="memdoc">
  53.712 +
  53.713 +<p>Type for an iterator over a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>. </p>
  53.714 +<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>
  53.715 +
  53.716 +</div>
  53.717 +</div>
  53.718 +<h2 class="groupheader">Function Documentation</h2>
  53.719 +<a id="aea3be97254c05595d986ef6a9faae87b"></a>
  53.720 +<h2 class="memtitle"><span class="permalink"><a href="#aea3be97254c05595d986ef6a9faae87b">&#9670;&nbsp;</a></span>ucx_hash()</h2>
  53.721 +
  53.722 +<div class="memitem">
  53.723 +<div class="memproto">
  53.724 +      <table class="memname">
  53.725 +        <tr>
  53.726 +          <td class="memname">int ucx_hash </td>
  53.727 +          <td>(</td>
  53.728 +          <td class="paramtype">const char *&#160;</td>
  53.729 +          <td class="paramname"><em>data</em>, </td>
  53.730 +        </tr>
  53.731 +        <tr>
  53.732 +          <td class="paramkey"></td>
  53.733 +          <td></td>
  53.734 +          <td class="paramtype">size_t&#160;</td>
  53.735 +          <td class="paramname"><em>len</em>&#160;</td>
  53.736 +        </tr>
  53.737 +        <tr>
  53.738 +          <td></td>
  53.739 +          <td>)</td>
  53.740 +          <td></td><td></td>
  53.741 +        </tr>
  53.742 +      </table>
  53.743 +</div><div class="memdoc">
  53.744 +
  53.745 +<p>Computes a murmur hash-2. </p>
  53.746 +<dl class="params"><dt>Parameters</dt><dd>
  53.747 +  <table class="params">
  53.748 +    <tr><td class="paramname">data</td><td>the data to hash </td></tr>
  53.749 +    <tr><td class="paramname">len</td><td>the length of the data </td></tr>
  53.750 +  </table>
  53.751 +  </dd>
  53.752 +</dl>
  53.753 +<dl class="section return"><dt>Returns</dt><dd>the murmur hash-2 of the data </dd></dl>
  53.754 +
  53.755 +</div>
  53.756 +</div>
  53.757 +<a id="a3e540bb46b8ee19789aed63fd8919200"></a>
  53.758 +<h2 class="memtitle"><span class="permalink"><a href="#a3e540bb46b8ee19789aed63fd8919200">&#9670;&nbsp;</a></span>ucx_key()</h2>
  53.759 +
  53.760 +<div class="memitem">
  53.761 +<div class="memproto">
  53.762 +      <table class="memname">
  53.763 +        <tr>
  53.764 +          <td class="memname"><a class="el" href="structUcxKey.html">UcxKey</a> ucx_key </td>
  53.765 +          <td>(</td>
  53.766 +          <td class="paramtype">const void *&#160;</td>
  53.767 +          <td class="paramname"><em>data</em>, </td>
  53.768 +        </tr>
  53.769 +        <tr>
  53.770 +          <td class="paramkey"></td>
  53.771 +          <td></td>
  53.772 +          <td class="paramtype">size_t&#160;</td>
  53.773 +          <td class="paramname"><em>len</em>&#160;</td>
  53.774 +        </tr>
  53.775 +        <tr>
  53.776 +          <td></td>
  53.777 +          <td>)</td>
  53.778 +          <td></td><td></td>
  53.779 +        </tr>
  53.780 +      </table>
  53.781 +</div><div class="memdoc">
  53.782 +
  53.783 +<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>
  53.784 +<p>This function implicitly computes the hash.</p>
  53.785 +<dl class="params"><dt>Parameters</dt><dd>
  53.786 +  <table class="params">
  53.787 +    <tr><td class="paramname">data</td><td>the data for the key </td></tr>
  53.788 +    <tr><td class="paramname">len</td><td>the length of the data </td></tr>
  53.789 +  </table>
  53.790 +  </dd>
  53.791 +</dl>
  53.792 +<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>
  53.793 +<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>
  53.794 +
  53.795 +</div>
  53.796 +</div>
  53.797 +<a id="a285e90e40681c6d9631c935dda0967f2"></a>
  53.798 +<h2 class="memtitle"><span class="permalink"><a href="#a285e90e40681c6d9631c935dda0967f2">&#9670;&nbsp;</a></span>ucx_map_clear()</h2>
  53.799 +
  53.800 +<div class="memitem">
  53.801 +<div class="memproto">
  53.802 +      <table class="memname">
  53.803 +        <tr>
  53.804 +          <td class="memname">void ucx_map_clear </td>
  53.805 +          <td>(</td>
  53.806 +          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
  53.807 +          <td class="paramname"><em>map</em></td><td>)</td>
  53.808 +          <td></td>
  53.809 +        </tr>
  53.810 +      </table>
  53.811 +</div><div class="memdoc">
  53.812 +
  53.813 +<p>Clears a hash map. </p>
  53.814 +<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>
  53.815 +<dl class="params"><dt>Parameters</dt><dd>
  53.816 +  <table class="params">
  53.817 +    <tr><td class="paramname">map</td><td>the map to be cleared </td></tr>
  53.818 +  </table>
  53.819 +  </dd>
  53.820 +</dl>
  53.821 +<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>
  53.822 +
  53.823 +</div>
  53.824 +</div>
  53.825 +<a id="a62c6c30cbb0d824ba710f5030ff9a4e4"></a>
  53.826 +<h2 class="memtitle"><span class="permalink"><a href="#a62c6c30cbb0d824ba710f5030ff9a4e4">&#9670;&nbsp;</a></span>ucx_map_clone()</h2>
  53.827 +
  53.828 +<div class="memitem">
  53.829 +<div class="memproto">
  53.830 +      <table class="memname">
  53.831 +        <tr>
  53.832 +          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_clone </td>
  53.833 +          <td>(</td>
  53.834 +          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> const *&#160;</td>
  53.835 +          <td class="paramname"><em>map</em>, </td>
  53.836 +        </tr>
  53.837 +        <tr>
  53.838 +          <td class="paramkey"></td>
  53.839 +          <td></td>
  53.840 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
  53.841 +          <td class="paramname"><em>fnc</em>, </td>
  53.842 +        </tr>
  53.843 +        <tr>
  53.844 +          <td class="paramkey"></td>
  53.845 +          <td></td>
  53.846 +          <td class="paramtype">void *&#160;</td>
  53.847 +          <td class="paramname"><em>data</em>&#160;</td>
  53.848 +        </tr>
  53.849 +        <tr>
  53.850 +          <td></td>
  53.851 +          <td>)</td>
  53.852 +          <td></td><td></td>
  53.853 +        </tr>
  53.854 +      </table>
  53.855 +</div><div class="memdoc">
  53.856 +
  53.857 +<p>Clones the map and rehashes if necessary. </p>
  53.858 +<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>
  53.859 +<dl class="params"><dt>Parameters</dt><dd>
  53.860 +  <table class="params">
  53.861 +    <tr><td class="paramname">map</td><td>the map to clone </td></tr>
  53.862 +    <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>
  53.863 +    <tr><td class="paramname">data</td><td>additional data for the copy function </td></tr>
  53.864 +  </table>
  53.865 +  </dd>
  53.866 +</dl>
  53.867 +<dl class="section return"><dt>Returns</dt><dd>the cloned map </dd></dl>
  53.868 +<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>
  53.869 +
  53.870 +</div>
  53.871 +</div>
  53.872 +<a id="a9aea9103703d5c168420bb6bf85549ea"></a>
  53.873 +<h2 class="memtitle"><span class="permalink"><a href="#a9aea9103703d5c168420bb6bf85549ea">&#9670;&nbsp;</a></span>ucx_map_clone_a()</h2>
  53.874 +
  53.875 +<div class="memitem">
  53.876 +<div class="memproto">
  53.877 +      <table class="memname">
  53.878 +        <tr>
  53.879 +          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_clone_a </td>
  53.880 +          <td>(</td>
  53.881 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
  53.882 +          <td class="paramname"><em>allocator</em>, </td>
  53.883 +        </tr>
  53.884 +        <tr>
  53.885 +          <td class="paramkey"></td>
  53.886 +          <td></td>
  53.887 +          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> const *&#160;</td>
  53.888 +          <td class="paramname"><em>map</em>, </td>
  53.889 +        </tr>
  53.890 +        <tr>
  53.891 +          <td class="paramkey"></td>
  53.892 +          <td></td>
  53.893 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
  53.894 +          <td class="paramname"><em>fnc</em>, </td>
  53.895 +        </tr>
  53.896 +        <tr>
  53.897 +          <td class="paramkey"></td>
  53.898 +          <td></td>
  53.899 +          <td class="paramtype">void *&#160;</td>
  53.900 +          <td class="paramname"><em>data</em>&#160;</td>
  53.901 +        </tr>
  53.902 +        <tr>
  53.903 +          <td></td>
  53.904 +          <td>)</td>
  53.905 +          <td></td><td></td>
  53.906 +        </tr>
  53.907 +      </table>
  53.908 +</div><div class="memdoc">
  53.909 +
  53.910 +<p>Clones the map and rehashes if necessary. </p>
  53.911 +<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>
  53.912 +<dl class="params"><dt>Parameters</dt><dd>
  53.913 +  <table class="params">
  53.914 +    <tr><td class="paramname">allocator</td><td>the allocator to use for the cloned map </td></tr>
  53.915 +    <tr><td class="paramname">map</td><td>the map to clone </td></tr>
  53.916 +    <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>
  53.917 +    <tr><td class="paramname">data</td><td>additional data for the copy function </td></tr>
  53.918 +  </table>
  53.919 +  </dd>
  53.920 +</dl>
  53.921 +<dl class="section return"><dt>Returns</dt><dd>the cloned map </dd></dl>
  53.922 +<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>
  53.923 +
  53.924 +</div>
  53.925 +</div>
  53.926 +<a id="adfeb2d61003fd2896bcfdc9a57f36425"></a>
  53.927 +<h2 class="memtitle"><span class="permalink"><a href="#adfeb2d61003fd2896bcfdc9a57f36425">&#9670;&nbsp;</a></span>ucx_map_copy()</h2>
  53.928 +
  53.929 +<div class="memitem">
  53.930 +<div class="memproto">
  53.931 +      <table class="memname">
  53.932 +        <tr>
  53.933 +          <td class="memname">int ucx_map_copy </td>
  53.934 +          <td>(</td>
  53.935 +          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> const *&#160;</td>
  53.936 +          <td class="paramname"><em>from</em>, </td>
  53.937 +        </tr>
  53.938 +        <tr>
  53.939 +          <td class="paramkey"></td>
  53.940 +          <td></td>
  53.941 +          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
  53.942 +          <td class="paramname"><em>to</em>, </td>
  53.943 +        </tr>
  53.944 +        <tr>
  53.945 +          <td class="paramkey"></td>
  53.946 +          <td></td>
  53.947 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
  53.948 +          <td class="paramname"><em>fnc</em>, </td>
  53.949 +        </tr>
  53.950 +        <tr>
  53.951 +          <td class="paramkey"></td>
  53.952 +          <td></td>
  53.953 +          <td class="paramtype">void *&#160;</td>
  53.954 +          <td class="paramname"><em>data</em>&#160;</td>
  53.955 +        </tr>
  53.956 +        <tr>
  53.957 +          <td></td>
  53.958 +          <td>)</td>
  53.959 +          <td></td><td></td>
  53.960 +        </tr>
  53.961 +      </table>
  53.962 +</div><div class="memdoc">
  53.963 +
  53.964 +<p>Copies contents from a map to another map using a copy function. </p>
  53.965 +<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>
  53.966 +<dl class="params"><dt>Parameters</dt><dd>
  53.967 +  <table class="params">
  53.968 +    <tr><td class="paramname">from</td><td>the source map </td></tr>
  53.969 +    <tr><td class="paramname">to</td><td>the destination map </td></tr>
  53.970 +    <tr><td class="paramname">fnc</td><td>the copy function or <code>NULL</code> if the pointer address shall be copied </td></tr>
  53.971 +    <tr><td class="paramname">data</td><td>additional data for the copy function </td></tr>
  53.972 +  </table>
  53.973 +  </dd>
  53.974 +</dl>
  53.975 +<dl class="section return"><dt>Returns</dt><dd>0 on success or a non-zero value on memory allocation errors </dd></dl>
  53.976 +
  53.977 +</div>
  53.978 +</div>
  53.979 +<a id="a774fcff87d1e58b6c5af77dd19a8c3dc"></a>
  53.980 +<h2 class="memtitle"><span class="permalink"><a href="#a774fcff87d1e58b6c5af77dd19a8c3dc">&#9670;&nbsp;</a></span>ucx_map_difference()</h2>
  53.981 +
  53.982 +<div class="memitem">
  53.983 +<div class="memproto">
  53.984 +      <table class="memname">
  53.985 +        <tr>
  53.986 +          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_difference </td>
  53.987 +          <td>(</td>
  53.988 +          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
  53.989 +          <td class="paramname"><em>first</em>, </td>
  53.990 +        </tr>
  53.991 +        <tr>
  53.992 +          <td class="paramkey"></td>
  53.993 +          <td></td>
  53.994 +          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
  53.995 +          <td class="paramname"><em>second</em>, </td>
  53.996 +        </tr>
  53.997 +        <tr>
  53.998 +          <td class="paramkey"></td>
  53.999 +          <td></td>
 53.1000 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
 53.1001 +          <td class="paramname"><em>cpfnc</em>, </td>
 53.1002 +        </tr>
 53.1003 +        <tr>
 53.1004 +          <td class="paramkey"></td>
 53.1005 +          <td></td>
 53.1006 +          <td class="paramtype">void *&#160;</td>
 53.1007 +          <td class="paramname"><em>cpdata</em>&#160;</td>
 53.1008 +        </tr>
 53.1009 +        <tr>
 53.1010 +          <td></td>
 53.1011 +          <td>)</td>
 53.1012 +          <td></td><td></td>
 53.1013 +        </tr>
 53.1014 +      </table>
 53.1015 +</div><div class="memdoc">
 53.1016 +
 53.1017 +<p>Returns the difference of two maps. </p>
 53.1018 +<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>
 53.1019 +<dl class="params"><dt>Parameters</dt><dd>
 53.1020 +  <table class="params">
 53.1021 +    <tr><td class="paramname">first</td><td>the first source map </td></tr>
 53.1022 +    <tr><td class="paramname">second</td><td>the second source map </td></tr>
 53.1023 +    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
 53.1024 +    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
 53.1025 +  </table>
 53.1026 +  </dd>
 53.1027 +</dl>
 53.1028 +<dl class="section return"><dt>Returns</dt><dd>a new list containing the difference </dd></dl>
 53.1029 +
 53.1030 +</div>
 53.1031 +</div>
 53.1032 +<a id="ad0ba103494247d798ac3037c50fc8831"></a>
 53.1033 +<h2 class="memtitle"><span class="permalink"><a href="#ad0ba103494247d798ac3037c50fc8831">&#9670;&nbsp;</a></span>ucx_map_difference_a()</h2>
 53.1034 +
 53.1035 +<div class="memitem">
 53.1036 +<div class="memproto">
 53.1037 +      <table class="memname">
 53.1038 +        <tr>
 53.1039 +          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_difference_a </td>
 53.1040 +          <td>(</td>
 53.1041 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
 53.1042 +          <td class="paramname"><em>allocator</em>, </td>
 53.1043 +        </tr>
 53.1044 +        <tr>
 53.1045 +          <td class="paramkey"></td>
 53.1046 +          <td></td>
 53.1047 +          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
 53.1048 +          <td class="paramname"><em>first</em>, </td>
 53.1049 +        </tr>
 53.1050 +        <tr>
 53.1051 +          <td class="paramkey"></td>
 53.1052 +          <td></td>
 53.1053 +          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
 53.1054 +          <td class="paramname"><em>second</em>, </td>
 53.1055 +        </tr>
 53.1056 +        <tr>
 53.1057 +          <td class="paramkey"></td>
 53.1058 +          <td></td>
 53.1059 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
 53.1060 +          <td class="paramname"><em>cpfnc</em>, </td>
 53.1061 +        </tr>
 53.1062 +        <tr>
 53.1063 +          <td class="paramkey"></td>
 53.1064 +          <td></td>
 53.1065 +          <td class="paramtype">void *&#160;</td>
 53.1066 +          <td class="paramname"><em>cpdata</em>&#160;</td>
 53.1067 +        </tr>
 53.1068 +        <tr>
 53.1069 +          <td></td>
 53.1070 +          <td>)</td>
 53.1071 +          <td></td><td></td>
 53.1072 +        </tr>
 53.1073 +      </table>
 53.1074 +</div><div class="memdoc">
 53.1075 +
 53.1076 +<p>Returns the difference of two maps. </p>
 53.1077 +<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>
 53.1078 +<dl class="params"><dt>Parameters</dt><dd>
 53.1079 +  <table class="params">
 53.1080 +    <tr><td class="paramname">allocator</td><td>the allocator that shall be used by the new map </td></tr>
 53.1081 +    <tr><td class="paramname">first</td><td>the first source map </td></tr>
 53.1082 +    <tr><td class="paramname">second</td><td>the second source map </td></tr>
 53.1083 +    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
 53.1084 +    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
 53.1085 +  </table>
 53.1086 +  </dd>
 53.1087 +</dl>
 53.1088 +<dl class="section return"><dt>Returns</dt><dd>a new list containing the difference </dd></dl>
 53.1089 +
 53.1090 +</div>
 53.1091 +</div>
 53.1092 +<a id="abe3d9688e4224bf7bb962abf25ff8c2e"></a>
 53.1093 +<h2 class="memtitle"><span class="permalink"><a href="#abe3d9688e4224bf7bb962abf25ff8c2e">&#9670;&nbsp;</a></span>ucx_map_free()</h2>
 53.1094 +
 53.1095 +<div class="memitem">
 53.1096 +<div class="memproto">
 53.1097 +      <table class="memname">
 53.1098 +        <tr>
 53.1099 +          <td class="memname">void ucx_map_free </td>
 53.1100 +          <td>(</td>
 53.1101 +          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
 53.1102 +          <td class="paramname"><em>map</em></td><td>)</td>
 53.1103 +          <td></td>
 53.1104 +        </tr>
 53.1105 +      </table>
 53.1106 +</div><div class="memdoc">
 53.1107 +
 53.1108 +<p>Frees a hash map. </p>
 53.1109 +<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>
 53.1110 +<dl class="params"><dt>Parameters</dt><dd>
 53.1111 +  <table class="params">
 53.1112 +    <tr><td class="paramname">map</td><td>the map to be freed </td></tr>
 53.1113 +  </table>
 53.1114 +  </dd>
 53.1115 +</dl>
 53.1116 +<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>
 53.1117 +
 53.1118 +</div>
 53.1119 +</div>
 53.1120 +<a id="a750f3d9d83e2f3788a14c17a9d160618"></a>
 53.1121 +<h2 class="memtitle"><span class="permalink"><a href="#a750f3d9d83e2f3788a14c17a9d160618">&#9670;&nbsp;</a></span>ucx_map_free_content()</h2>
 53.1122 +
 53.1123 +<div class="memitem">
 53.1124 +<div class="memproto">
 53.1125 +      <table class="memname">
 53.1126 +        <tr>
 53.1127 +          <td class="memname">void ucx_map_free_content </td>
 53.1128 +          <td>(</td>
 53.1129 +          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
 53.1130 +          <td class="paramname"><em>map</em>, </td>
 53.1131 +        </tr>
 53.1132 +        <tr>
 53.1133 +          <td class="paramkey"></td>
 53.1134 +          <td></td>
 53.1135 +          <td class="paramtype"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a>&#160;</td>
 53.1136 +          <td class="paramname"><em>destr</em>&#160;</td>
 53.1137 +        </tr>
 53.1138 +        <tr>
 53.1139 +          <td></td>
 53.1140 +          <td>)</td>
 53.1141 +          <td></td><td></td>
 53.1142 +        </tr>
 53.1143 +      </table>
 53.1144 +</div><div class="memdoc">
 53.1145 +
 53.1146 +<p>Frees the contents of a hash map. </p>
 53.1147 +<p>This is a convenience function that iterates over the map and passes all values to the specified destructor function.</p>
 53.1148 +<p>If no destructor is specified (<code>NULL</code>), the free() function of the map's own allocator is used.</p>
 53.1149 +<p>You must ensure, that it is valid to pass each value in the map to the same destructor function.</p>
 53.1150 +<p>You should free or clear the map afterwards, as the contents will be invalid.</p>
 53.1151 +<dl class="params"><dt>Parameters</dt><dd>
 53.1152 +  <table class="params">
 53.1153 +    <tr><td class="paramname">map</td><td>for which the contents shall be freed </td></tr>
 53.1154 +    <tr><td class="paramname">destr</td><td>optional pointer to a destructor function </td></tr>
 53.1155 +  </table>
 53.1156 +  </dd>
 53.1157 +</dl>
 53.1158 +<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>
 53.1159 +<dd>
 53.1160 +<a class="el" href="map_8h.html#a285e90e40681c6d9631c935dda0967f2" title="Clears a hash map. ">ucx_map_clear()</a> </dd></dl>
 53.1161 +
 53.1162 +</div>
 53.1163 +</div>
 53.1164 +<a id="ab61192c5af2e06ecb9ad73880d1c95a6"></a>
 53.1165 +<h2 class="memtitle"><span class="permalink"><a href="#ab61192c5af2e06ecb9ad73880d1c95a6">&#9670;&nbsp;</a></span>ucx_map_get()</h2>
 53.1166 +
 53.1167 +<div class="memitem">
 53.1168 +<div class="memproto">
 53.1169 +      <table class="memname">
 53.1170 +        <tr>
 53.1171 +          <td class="memname">void* ucx_map_get </td>
 53.1172 +          <td>(</td>
 53.1173 +          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> const *&#160;</td>
 53.1174 +          <td class="paramname"><em>map</em>, </td>
 53.1175 +        </tr>
 53.1176 +        <tr>
 53.1177 +          <td class="paramkey"></td>
 53.1178 +          <td></td>
 53.1179 +          <td class="paramtype"><a class="el" href="structUcxKey.html">UcxKey</a>&#160;</td>
 53.1180 +          <td class="paramname"><em>key</em>&#160;</td>
 53.1181 +        </tr>
 53.1182 +        <tr>
 53.1183 +          <td></td>
 53.1184 +          <td>)</td>
 53.1185 +          <td></td><td></td>
 53.1186 +        </tr>
 53.1187 +      </table>
 53.1188 +</div><div class="memdoc">
 53.1189 +
 53.1190 +<p>Retrieves a value by using a key. </p>
 53.1191 +<dl class="params"><dt>Parameters</dt><dd>
 53.1192 +  <table class="params">
 53.1193 +    <tr><td class="paramname">map</td><td>the map </td></tr>
 53.1194 +    <tr><td class="paramname">key</td><td>the key </td></tr>
 53.1195 +  </table>
 53.1196 +  </dd>
 53.1197 +</dl>
 53.1198 +<dl class="section return"><dt>Returns</dt><dd>the value </dd></dl>
 53.1199 +
 53.1200 +</div>
 53.1201 +</div>
 53.1202 +<a id="aa594d7a5afebc3bed6bb265348cf6b0d"></a>
 53.1203 +<h2 class="memtitle"><span class="permalink"><a href="#aa594d7a5afebc3bed6bb265348cf6b0d">&#9670;&nbsp;</a></span>ucx_map_intersection()</h2>
 53.1204 +
 53.1205 +<div class="memitem">
 53.1206 +<div class="memproto">
 53.1207 +      <table class="memname">
 53.1208 +        <tr>
 53.1209 +          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_intersection </td>
 53.1210 +          <td>(</td>
 53.1211 +          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
 53.1212 +          <td class="paramname"><em>first</em>, </td>
 53.1213 +        </tr>
 53.1214 +        <tr>
 53.1215 +          <td class="paramkey"></td>
 53.1216 +          <td></td>
 53.1217 +          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
 53.1218 +          <td class="paramname"><em>second</em>, </td>
 53.1219 +        </tr>
 53.1220 +        <tr>
 53.1221 +          <td class="paramkey"></td>
 53.1222 +          <td></td>
 53.1223 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
 53.1224 +          <td class="paramname"><em>cpfnc</em>, </td>
 53.1225 +        </tr>
 53.1226 +        <tr>
 53.1227 +          <td class="paramkey"></td>
 53.1228 +          <td></td>
 53.1229 +          <td class="paramtype">void *&#160;</td>
 53.1230 +          <td class="paramname"><em>cpdata</em>&#160;</td>
 53.1231 +        </tr>
 53.1232 +        <tr>
 53.1233 +          <td></td>
 53.1234 +          <td>)</td>
 53.1235 +          <td></td><td></td>
 53.1236 +        </tr>
 53.1237 +      </table>
 53.1238 +</div><div class="memdoc">
 53.1239 +
 53.1240 +<p>Returns the intersection of two maps. </p>
 53.1241 +<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>
 53.1242 +<dl class="params"><dt>Parameters</dt><dd>
 53.1243 +  <table class="params">
 53.1244 +    <tr><td class="paramname">first</td><td>the first source map </td></tr>
 53.1245 +    <tr><td class="paramname">second</td><td>the second source map </td></tr>
 53.1246 +    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
 53.1247 +    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
 53.1248 +  </table>
 53.1249 +  </dd>
 53.1250 +</dl>
 53.1251 +<dl class="section return"><dt>Returns</dt><dd>a new map containing the intersection </dd></dl>
 53.1252 +
 53.1253 +</div>
 53.1254 +</div>
 53.1255 +<a id="a169e0470a20484dd76425fdf77e3651e"></a>
 53.1256 +<h2 class="memtitle"><span class="permalink"><a href="#a169e0470a20484dd76425fdf77e3651e">&#9670;&nbsp;</a></span>ucx_map_intersection_a()</h2>
 53.1257 +
 53.1258 +<div class="memitem">
 53.1259 +<div class="memproto">
 53.1260 +      <table class="memname">
 53.1261 +        <tr>
 53.1262 +          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_intersection_a </td>
 53.1263 +          <td>(</td>
 53.1264 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
 53.1265 +          <td class="paramname"><em>allocator</em>, </td>
 53.1266 +        </tr>
 53.1267 +        <tr>
 53.1268 +          <td class="paramkey"></td>
 53.1269 +          <td></td>
 53.1270 +          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
 53.1271 +          <td class="paramname"><em>first</em>, </td>
 53.1272 +        </tr>
 53.1273 +        <tr>
 53.1274 +          <td class="paramkey"></td>
 53.1275 +          <td></td>
 53.1276 +          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
 53.1277 +          <td class="paramname"><em>second</em>, </td>
 53.1278 +        </tr>
 53.1279 +        <tr>
 53.1280 +          <td class="paramkey"></td>
 53.1281 +          <td></td>
 53.1282 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
 53.1283 +          <td class="paramname"><em>cpfnc</em>, </td>
 53.1284 +        </tr>
 53.1285 +        <tr>
 53.1286 +          <td class="paramkey"></td>
 53.1287 +          <td></td>
 53.1288 +          <td class="paramtype">void *&#160;</td>
 53.1289 +          <td class="paramname"><em>cpdata</em>&#160;</td>
 53.1290 +        </tr>
 53.1291 +        <tr>
 53.1292 +          <td></td>
 53.1293 +          <td>)</td>
 53.1294 +          <td></td><td></td>
 53.1295 +        </tr>
 53.1296 +      </table>
 53.1297 +</div><div class="memdoc">
 53.1298 +
 53.1299 +<p>Returns the intersection of two maps. </p>
 53.1300 +<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>
 53.1301 +<dl class="params"><dt>Parameters</dt><dd>
 53.1302 +  <table class="params">
 53.1303 +    <tr><td class="paramname">allocator</td><td>the allocator that shall be used by the new map </td></tr>
 53.1304 +    <tr><td class="paramname">first</td><td>the first source map </td></tr>
 53.1305 +    <tr><td class="paramname">second</td><td>the second source map </td></tr>
 53.1306 +    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
 53.1307 +    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
 53.1308 +  </table>
 53.1309 +  </dd>
 53.1310 +</dl>
 53.1311 +<dl class="section return"><dt>Returns</dt><dd>a new map containing the intersection </dd></dl>
 53.1312 +
 53.1313 +</div>
 53.1314 +</div>
 53.1315 +<a id="aceb8675abf44860b4bbc301bbada5b91"></a>
 53.1316 +<h2 class="memtitle"><span class="permalink"><a href="#aceb8675abf44860b4bbc301bbada5b91">&#9670;&nbsp;</a></span>ucx_map_iter_next()</h2>
 53.1317 +
 53.1318 +<div class="memitem">
 53.1319 +<div class="memproto">
 53.1320 +      <table class="memname">
 53.1321 +        <tr>
 53.1322 +          <td class="memname">int ucx_map_iter_next </td>
 53.1323 +          <td>(</td>
 53.1324 +          <td class="paramtype"><a class="el" href="structUcxMapIterator.html">UcxMapIterator</a> *&#160;</td>
 53.1325 +          <td class="paramname"><em>iterator</em>, </td>
 53.1326 +        </tr>
 53.1327 +        <tr>
 53.1328 +          <td class="paramkey"></td>
 53.1329 +          <td></td>
 53.1330 +          <td class="paramtype"><a class="el" href="structUcxKey.html">UcxKey</a> *&#160;</td>
 53.1331 +          <td class="paramname"><em>key</em>, </td>
 53.1332 +        </tr>
 53.1333 +        <tr>
 53.1334 +          <td class="paramkey"></td>
 53.1335 +          <td></td>
 53.1336 +          <td class="paramtype">void **&#160;</td>
 53.1337 +          <td class="paramname"><em>value</em>&#160;</td>
 53.1338 +        </tr>
 53.1339 +        <tr>
 53.1340 +          <td></td>
 53.1341 +          <td>)</td>
 53.1342 +          <td></td><td></td>
 53.1343 +        </tr>
 53.1344 +      </table>
 53.1345 +</div><div class="memdoc">
 53.1346 +
 53.1347 +<p>Proceeds to the next element of the map (if any). </p>
 53.1348 +<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>
 53.1349 +<p>If no further elements are found, this function returns zero and leaves the last found key/value-pair in memory.</p>
 53.1350 +<dl class="params"><dt>Parameters</dt><dd>
 53.1351 +  <table class="params">
 53.1352 +    <tr><td class="paramname">iterator</td><td>the iterator to use </td></tr>
 53.1353 +    <tr><td class="paramname">key</td><td>a pointer to the memory where to store the key </td></tr>
 53.1354 +    <tr><td class="paramname">value</td><td>a pointer to the memory where to store the value </td></tr>
 53.1355 +  </table>
 53.1356 +  </dd>
 53.1357 +</dl>
 53.1358 +<dl class="section return"><dt>Returns</dt><dd>1, if another element was found, 0 if all elements has been processed </dd></dl>
 53.1359 +<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>
 53.1360 +
 53.1361 +</div>
 53.1362 +</div>
 53.1363 +<a id="a9150e9c64fdf4dfcc2cad106b91aa110"></a>
 53.1364 +<h2 class="memtitle"><span class="permalink"><a href="#a9150e9c64fdf4dfcc2cad106b91aa110">&#9670;&nbsp;</a></span>ucx_map_iterator()</h2>
 53.1365 +
 53.1366 +<div class="memitem">
 53.1367 +<div class="memproto">
 53.1368 +      <table class="memname">
 53.1369 +        <tr>
 53.1370 +          <td class="memname"><a class="el" href="structUcxMapIterator.html">UcxMapIterator</a> ucx_map_iterator </td>
 53.1371 +          <td>(</td>
 53.1372 +          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> const *&#160;</td>
 53.1373 +          <td class="paramname"><em>map</em></td><td>)</td>
 53.1374 +          <td></td>
 53.1375 +        </tr>
 53.1376 +      </table>
 53.1377 +</div><div class="memdoc">
 53.1378 +
 53.1379 +<p>Creates an iterator for a map. </p>
 53.1380 +<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>
 53.1381 +<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>
 53.1382 +<dl class="params"><dt>Parameters</dt><dd>
 53.1383 +  <table class="params">
 53.1384 +    <tr><td class="paramname">map</td><td>the map to create the iterator for </td></tr>
 53.1385 +  </table>
 53.1386 +  </dd>
 53.1387 +</dl>
 53.1388 +<dl class="section return"><dt>Returns</dt><dd>an iterator initialized on the first element of the first element list </dd></dl>
 53.1389 +<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>
 53.1390 +
 53.1391 +</div>
 53.1392 +</div>
 53.1393 +<a id="a79f31de8b93814493759dbc8b940cf0c"></a>
 53.1394 +<h2 class="memtitle"><span class="permalink"><a href="#a79f31de8b93814493759dbc8b940cf0c">&#9670;&nbsp;</a></span>ucx_map_new()</h2>
 53.1395 +
 53.1396 +<div class="memitem">
 53.1397 +<div class="memproto">
 53.1398 +      <table class="memname">
 53.1399 +        <tr>
 53.1400 +          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_new </td>
 53.1401 +          <td>(</td>
 53.1402 +          <td class="paramtype">size_t&#160;</td>
 53.1403 +          <td class="paramname"><em>size</em></td><td>)</td>
 53.1404 +          <td></td>
 53.1405 +        </tr>
 53.1406 +      </table>
 53.1407 +</div><div class="memdoc">
 53.1408 +
 53.1409 +<p>Creates a new hash map with the specified size. </p>
 53.1410 +<dl class="params"><dt>Parameters</dt><dd>
 53.1411 +  <table class="params">
 53.1412 +    <tr><td class="paramname">size</td><td>the size of the hash map </td></tr>
 53.1413 +  </table>
 53.1414 +  </dd>
 53.1415 +</dl>
 53.1416 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the new hash map </dd></dl>
 53.1417 +
 53.1418 +</div>
 53.1419 +</div>
 53.1420 +<a id="aed508a94c66cc15372503c64b70eb03e"></a>
 53.1421 +<h2 class="memtitle"><span class="permalink"><a href="#aed508a94c66cc15372503c64b70eb03e">&#9670;&nbsp;</a></span>ucx_map_new_a()</h2>
 53.1422 +
 53.1423 +<div class="memitem">
 53.1424 +<div class="memproto">
 53.1425 +      <table class="memname">
 53.1426 +        <tr>
 53.1427 +          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_new_a </td>
 53.1428 +          <td>(</td>
 53.1429 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
 53.1430 +          <td class="paramname"><em>allocator</em>, </td>
 53.1431 +        </tr>
 53.1432 +        <tr>
 53.1433 +          <td class="paramkey"></td>
 53.1434 +          <td></td>
 53.1435 +          <td class="paramtype">size_t&#160;</td>
 53.1436 +          <td class="paramname"><em>size</em>&#160;</td>
 53.1437 +        </tr>
 53.1438 +        <tr>
 53.1439 +          <td></td>
 53.1440 +          <td>)</td>
 53.1441 +          <td></td><td></td>
 53.1442 +        </tr>
 53.1443 +      </table>
 53.1444 +</div><div class="memdoc">
 53.1445 +
 53.1446 +<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>
 53.1447 +<dl class="params"><dt>Parameters</dt><dd>
 53.1448 +  <table class="params">
 53.1449 +    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
 53.1450 +    <tr><td class="paramname">size</td><td>the size of the hash map </td></tr>
 53.1451 +  </table>
 53.1452 +  </dd>
 53.1453 +</dl>
 53.1454 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the new hash map </dd></dl>
 53.1455 +
 53.1456 +</div>
 53.1457 +</div>
 53.1458 +<a id="ac04a08b604217070254d4c58f0e82498"></a>
 53.1459 +<h2 class="memtitle"><span class="permalink"><a href="#ac04a08b604217070254d4c58f0e82498">&#9670;&nbsp;</a></span>ucx_map_put()</h2>
 53.1460 +
 53.1461 +<div class="memitem">
 53.1462 +<div class="memproto">
 53.1463 +      <table class="memname">
 53.1464 +        <tr>
 53.1465 +          <td class="memname">int ucx_map_put </td>
 53.1466 +          <td>(</td>
 53.1467 +          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
 53.1468 +          <td class="paramname"><em>map</em>, </td>
 53.1469 +        </tr>
 53.1470 +        <tr>
 53.1471 +          <td class="paramkey"></td>
 53.1472 +          <td></td>
 53.1473 +          <td class="paramtype"><a class="el" href="structUcxKey.html">UcxKey</a>&#160;</td>
 53.1474 +          <td class="paramname"><em>key</em>, </td>
 53.1475 +        </tr>
 53.1476 +        <tr>
 53.1477 +          <td class="paramkey"></td>
 53.1478 +          <td></td>
 53.1479 +          <td class="paramtype">void *&#160;</td>
 53.1480 +          <td class="paramname"><em>value</em>&#160;</td>
 53.1481 +        </tr>
 53.1482 +        <tr>
 53.1483 +          <td></td>
 53.1484 +          <td>)</td>
 53.1485 +          <td></td><td></td>
 53.1486 +        </tr>
 53.1487 +      </table>
 53.1488 +</div><div class="memdoc">
 53.1489 +
 53.1490 +<p>Puts a key/value-pair into the map. </p>
 53.1491 +<dl class="params"><dt>Parameters</dt><dd>
 53.1492 +  <table class="params">
 53.1493 +    <tr><td class="paramname">map</td><td>the map </td></tr>
 53.1494 +    <tr><td class="paramname">key</td><td>the key </td></tr>
 53.1495 +    <tr><td class="paramname">value</td><td>the value </td></tr>
 53.1496 +  </table>
 53.1497 +  </dd>
 53.1498 +</dl>
 53.1499 +<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero value on failure </dd></dl>
 53.1500 +
 53.1501 +</div>
 53.1502 +</div>
 53.1503 +<a id="a174bce9fad554dd92b8da354e0d32512"></a>
 53.1504 +<h2 class="memtitle"><span class="permalink"><a href="#a174bce9fad554dd92b8da354e0d32512">&#9670;&nbsp;</a></span>ucx_map_rehash()</h2>
 53.1505 +
 53.1506 +<div class="memitem">
 53.1507 +<div class="memproto">
 53.1508 +      <table class="memname">
 53.1509 +        <tr>
 53.1510 +          <td class="memname">int ucx_map_rehash </td>
 53.1511 +          <td>(</td>
 53.1512 +          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
 53.1513 +          <td class="paramname"><em>map</em></td><td>)</td>
 53.1514 +          <td></td>
 53.1515 +        </tr>
 53.1516 +      </table>
 53.1517 +</div><div class="memdoc">
 53.1518 +
 53.1519 +<p>Increases size of the hash map, if necessary. </p>
 53.1520 +<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>
 53.1521 +<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>
 53.1522 +<p>You can use this function to dramatically increase access performance.</p>
 53.1523 +<dl class="params"><dt>Parameters</dt><dd>
 53.1524 +  <table class="params">
 53.1525 +    <tr><td class="paramname">map</td><td>the map to rehash </td></tr>
 53.1526 +  </table>
 53.1527 +  </dd>
 53.1528 +</dl>
 53.1529 +<dl class="section return"><dt>Returns</dt><dd>1, if a memory allocation error occurred, 0 otherwise </dd></dl>
 53.1530 +
 53.1531 +</div>
 53.1532 +</div>
 53.1533 +<a id="a17248a4888eb8f9ae18be522d64632aa"></a>
 53.1534 +<h2 class="memtitle"><span class="permalink"><a href="#a17248a4888eb8f9ae18be522d64632aa">&#9670;&nbsp;</a></span>ucx_map_remove()</h2>
 53.1535 +
 53.1536 +<div class="memitem">
 53.1537 +<div class="memproto">
 53.1538 +      <table class="memname">
 53.1539 +        <tr>
 53.1540 +          <td class="memname">void* ucx_map_remove </td>
 53.1541 +          <td>(</td>
 53.1542 +          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
 53.1543 +          <td class="paramname"><em>map</em>, </td>
 53.1544 +        </tr>
 53.1545 +        <tr>
 53.1546 +          <td class="paramkey"></td>
 53.1547 +          <td></td>
 53.1548 +          <td class="paramtype"><a class="el" href="structUcxKey.html">UcxKey</a>&#160;</td>
 53.1549 +          <td class="paramname"><em>key</em>&#160;</td>
 53.1550 +        </tr>
 53.1551 +        <tr>
 53.1552 +          <td></td>
 53.1553 +          <td>)</td>
 53.1554 +          <td></td><td></td>
 53.1555 +        </tr>
 53.1556 +      </table>
 53.1557 +</div><div class="memdoc">
 53.1558 +
 53.1559 +<p>Removes a key/value-pair from the map by using the key. </p>
 53.1560 +<dl class="params"><dt>Parameters</dt><dd>
 53.1561 +  <table class="params">
 53.1562 +    <tr><td class="paramname">map</td><td>the map </td></tr>
 53.1563 +    <tr><td class="paramname">key</td><td>the key </td></tr>
 53.1564 +  </table>
 53.1565 +  </dd>
 53.1566 +</dl>
 53.1567 +<dl class="section return"><dt>Returns</dt><dd>the removed value </dd></dl>
 53.1568 +
 53.1569 +</div>
 53.1570 +</div>
 53.1571 +<a id="a3f65978c481af7f637cad021d93522d5"></a>
 53.1572 +<h2 class="memtitle"><span class="permalink"><a href="#a3f65978c481af7f637cad021d93522d5">&#9670;&nbsp;</a></span>ucx_map_union()</h2>
 53.1573 +
 53.1574 +<div class="memitem">
 53.1575 +<div class="memproto">
 53.1576 +      <table class="memname">
 53.1577 +        <tr>
 53.1578 +          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_union </td>
 53.1579 +          <td>(</td>
 53.1580 +          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
 53.1581 +          <td class="paramname"><em>first</em>, </td>
 53.1582 +        </tr>
 53.1583 +        <tr>
 53.1584 +          <td class="paramkey"></td>
 53.1585 +          <td></td>
 53.1586 +          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
 53.1587 +          <td class="paramname"><em>second</em>, </td>
 53.1588 +        </tr>
 53.1589 +        <tr>
 53.1590 +          <td class="paramkey"></td>
 53.1591 +          <td></td>
 53.1592 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
 53.1593 +          <td class="paramname"><em>cpfnc</em>, </td>
 53.1594 +        </tr>
 53.1595 +        <tr>
 53.1596 +          <td class="paramkey"></td>
 53.1597 +          <td></td>
 53.1598 +          <td class="paramtype">void *&#160;</td>
 53.1599 +          <td class="paramname"><em>cpdata</em>&#160;</td>
 53.1600 +        </tr>
 53.1601 +        <tr>
 53.1602 +          <td></td>
 53.1603 +          <td>)</td>
 53.1604 +          <td></td><td></td>
 53.1605 +        </tr>
 53.1606 +      </table>
 53.1607 +</div><div class="memdoc">
 53.1608 +
 53.1609 +<p>Returns the union of two maps. </p>
 53.1610 +<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>
 53.1611 +<dl class="params"><dt>Parameters</dt><dd>
 53.1612 +  <table class="params">
 53.1613 +    <tr><td class="paramname">first</td><td>the first source map </td></tr>
 53.1614 +    <tr><td class="paramname">second</td><td>the second source map </td></tr>
 53.1615 +    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
 53.1616 +    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
 53.1617 +  </table>
 53.1618 +  </dd>
 53.1619 +</dl>
 53.1620 +<dl class="section return"><dt>Returns</dt><dd>a new map containing the union </dd></dl>
 53.1621 +
 53.1622 +</div>
 53.1623 +</div>
 53.1624 +<a id="ab6370c3fa8113fdad593ce4b0460c9c6"></a>
 53.1625 +<h2 class="memtitle"><span class="permalink"><a href="#ab6370c3fa8113fdad593ce4b0460c9c6">&#9670;&nbsp;</a></span>ucx_map_union_a()</h2>
 53.1626 +
 53.1627 +<div class="memitem">
 53.1628 +<div class="memproto">
 53.1629 +      <table class="memname">
 53.1630 +        <tr>
 53.1631 +          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_union_a </td>
 53.1632 +          <td>(</td>
 53.1633 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
 53.1634 +          <td class="paramname"><em>allocator</em>, </td>
 53.1635 +        </tr>
 53.1636 +        <tr>
 53.1637 +          <td class="paramkey"></td>
 53.1638 +          <td></td>
 53.1639 +          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
 53.1640 +          <td class="paramname"><em>first</em>, </td>
 53.1641 +        </tr>
 53.1642 +        <tr>
 53.1643 +          <td class="paramkey"></td>
 53.1644 +          <td></td>
 53.1645 +          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
 53.1646 +          <td class="paramname"><em>second</em>, </td>
 53.1647 +        </tr>
 53.1648 +        <tr>
 53.1649 +          <td class="paramkey"></td>
 53.1650 +          <td></td>
 53.1651 +          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
 53.1652 +          <td class="paramname"><em>cpfnc</em>, </td>
 53.1653 +        </tr>
 53.1654 +        <tr>
 53.1655 +          <td class="paramkey"></td>
 53.1656 +          <td></td>
 53.1657 +          <td class="paramtype">void *&#160;</td>
 53.1658 +          <td class="paramname"><em>cpdata</em>&#160;</td>
 53.1659 +        </tr>
 53.1660 +        <tr>
 53.1661 +          <td></td>
 53.1662 +          <td>)</td>
 53.1663 +          <td></td><td></td>
 53.1664 +        </tr>
 53.1665 +      </table>
 53.1666 +</div><div class="memdoc">
 53.1667 +
 53.1668 +<p>Returns the union of two maps. </p>
 53.1669 +<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>
 53.1670 +<dl class="params"><dt>Parameters</dt><dd>
 53.1671 +  <table class="params">
 53.1672 +    <tr><td class="paramname">allocator</td><td>the allocator that shall be used by the new map </td></tr>
 53.1673 +    <tr><td class="paramname">first</td><td>the first source map </td></tr>
 53.1674 +    <tr><td class="paramname">second</td><td>the second source map </td></tr>
 53.1675 +    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
 53.1676 +    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
 53.1677 +  </table>
 53.1678 +  </dd>
 53.1679 +</dl>
 53.1680 +<dl class="section return"><dt>Returns</dt><dd>a new map containing the union </dd></dl>
 53.1681 +
 53.1682 +</div>
 53.1683 +</div>
 53.1684 +</div><!-- contents -->
 53.1685 +<!-- start footer part -->
 53.1686 +<hr class="footer"/><address class="footer"><small>
 53.1687 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 53.1688 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 53.1689 +</a> 1.8.13
 53.1690 +</small></address>
 53.1691 +</body>
 53.1692 +</html>
    54.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    54.2 +++ b/docs/api-2.1/map_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
    54.3 @@ -0,0 +1,127 @@
    54.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    54.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    54.6 +<head>
    54.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    54.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    54.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   54.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   54.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/map.h Source File</title>
   54.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   54.13 +<script type="text/javascript" src="jquery.js"></script>
   54.14 +<script type="text/javascript" src="dynsections.js"></script>
   54.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   54.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   54.17 +<script type="text/javascript" src="search/search.js"></script>
   54.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   54.19 +</head>
   54.20 +<body>
   54.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   54.22 +<div id="titlearea">
   54.23 +<table cellspacing="0" cellpadding="0">
   54.24 + <tbody>
   54.25 + <tr style="height: 56px;">
   54.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   54.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   54.28 +   <div id="projectname">ucx
   54.29 +   </div>
   54.30 +   <div id="projectbrief">UAP Common Extensions</div>
   54.31 +  </td>
   54.32 + </tr>
   54.33 + </tbody>
   54.34 +</table>
   54.35 +</div>
   54.36 +<!-- end header part -->
   54.37 +<!-- Generated by Doxygen 1.8.13 -->
   54.38 +<script type="text/javascript">
   54.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   54.40 +</script>
   54.41 +<script type="text/javascript" src="menudata.js"></script>
   54.42 +<script type="text/javascript" src="menu.js"></script>
   54.43 +<script type="text/javascript">
   54.44 +$(function() {
   54.45 +  initMenu('',true,false,'search.php','Search');
   54.46 +  $(document).ready(function() { init_search(); });
   54.47 +});
   54.48 +</script>
   54.49 +<div id="main-nav"></div>
   54.50 +<!-- window showing the filter options -->
   54.51 +<div id="MSearchSelectWindow"
   54.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   54.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   54.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   54.55 +</div>
   54.56 +
   54.57 +<!-- iframe showing the search results (closed by default) -->
   54.58 +<div id="MSearchResultsWindow">
   54.59 +<iframe src="javascript:void(0)" frameborder="0" 
   54.60 +        name="MSearchResults" id="MSearchResults">
   54.61 +</iframe>
   54.62 +</div>
   54.63 +
   54.64 +<div id="nav-path" class="navpath">
   54.65 +  <ul>
   54.66 +<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>
   54.67 +</div>
   54.68 +</div><!-- top -->
   54.69 +<div class="header">
   54.70 +  <div class="headertitle">
   54.71 +<div class="title">map.h</div>  </div>
   54.72 +</div><!--header-->
   54.73 +<div class="contents">
   54.74 +<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>
   54.75 +<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>
   54.76 +<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>
   54.77 +<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>
   54.78 +<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>
   54.79 +<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>
   54.80 +<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>
   54.81 +<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>
   54.82 +<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>
   54.83 +<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>
   54.84 +<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>
   54.85 +<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>
   54.86 +<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>
   54.87 +<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>
   54.88 +<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>
   54.89 +<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>
   54.90 +<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>
   54.91 +<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>
   54.92 +<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>
   54.93 +<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>
   54.94 +<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>
   54.95 +<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>
   54.96 +<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>
   54.97 +<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>
   54.98 +<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>
   54.99 +<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>
  54.100 +<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>
  54.101 +<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>
  54.102 +<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>
  54.103 +<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>
  54.104 +<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>
  54.105 +<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>
  54.106 +<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>
  54.107 +<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>
  54.108 +<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>
  54.109 +<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>
  54.110 +<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>
  54.111 +<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>
  54.112 +<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>
  54.113 +<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>
  54.114 +<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>
  54.115 +<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>
  54.116 +<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>
  54.117 +<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>
  54.118 +<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>
  54.119 +<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>
  54.120 +<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>
  54.121 +<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>
  54.122 +</div><!-- fragment --></div><!-- contents -->
  54.123 +<!-- start footer part -->
  54.124 +<hr class="footer"/><address class="footer"><small>
  54.125 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  54.126 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  54.127 +</a> 1.8.13
  54.128 +</small></address>
  54.129 +</body>
  54.130 +</html>
    55.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    55.2 +++ b/docs/api-2.1/mempool_8h.html	Sat Feb 06 19:11:44 2021 +0100
    55.3 @@ -0,0 +1,517 @@
    55.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    55.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    55.6 +<head>
    55.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    55.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    55.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   55.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   55.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/mempool.h File Reference</title>
   55.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   55.13 +<script type="text/javascript" src="jquery.js"></script>
   55.14 +<script type="text/javascript" src="dynsections.js"></script>
   55.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   55.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   55.17 +<script type="text/javascript" src="search/search.js"></script>
   55.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   55.19 +</head>
   55.20 +<body>
   55.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   55.22 +<div id="titlearea">
   55.23 +<table cellspacing="0" cellpadding="0">
   55.24 + <tbody>
   55.25 + <tr style="height: 56px;">
   55.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   55.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   55.28 +   <div id="projectname">ucx
   55.29 +   </div>
   55.30 +   <div id="projectbrief">UAP Common Extensions</div>
   55.31 +  </td>
   55.32 + </tr>
   55.33 + </tbody>
   55.34 +</table>
   55.35 +</div>
   55.36 +<!-- end header part -->
   55.37 +<!-- Generated by Doxygen 1.8.13 -->
   55.38 +<script type="text/javascript">
   55.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   55.40 +</script>
   55.41 +<script type="text/javascript" src="menudata.js"></script>
   55.42 +<script type="text/javascript" src="menu.js"></script>
   55.43 +<script type="text/javascript">
   55.44 +$(function() {
   55.45 +  initMenu('',true,false,'search.php','Search');
   55.46 +  $(document).ready(function() { init_search(); });
   55.47 +});
   55.48 +</script>
   55.49 +<div id="main-nav"></div>
   55.50 +<!-- window showing the filter options -->
   55.51 +<div id="MSearchSelectWindow"
   55.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   55.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   55.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   55.55 +</div>
   55.56 +
   55.57 +<!-- iframe showing the search results (closed by default) -->
   55.58 +<div id="MSearchResultsWindow">
   55.59 +<iframe src="javascript:void(0)" frameborder="0" 
   55.60 +        name="MSearchResults" id="MSearchResults">
   55.61 +</iframe>
   55.62 +</div>
   55.63 +
   55.64 +<div id="nav-path" class="navpath">
   55.65 +  <ul>
   55.66 +<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>
   55.67 +</div>
   55.68 +</div><!-- top -->
   55.69 +<div class="header">
   55.70 +  <div class="summary">
   55.71 +<a href="#nested-classes">Data Structures</a> &#124;
   55.72 +<a href="#define-members">Macros</a> &#124;
   55.73 +<a href="#func-members">Functions</a>  </div>
   55.74 +  <div class="headertitle">
   55.75 +<div class="title">mempool.h File Reference</div>  </div>
   55.76 +</div><!--header-->
   55.77 +<div class="contents">
   55.78 +
   55.79 +<p>Memory pool implementation.  
   55.80 +<a href="#details">More...</a></p>
   55.81 +<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
   55.82 +<code>#include &quot;<a class="el" href="allocator_8h_source.html">allocator.h</a>&quot;</code><br />
   55.83 +<code>#include &lt;stddef.h&gt;</code><br />
   55.84 +</div>
   55.85 +<p><a href="mempool_8h_source.html">Go to the source code of this file.</a></p>
   55.86 +<table class="memberdecls">
   55.87 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
   55.88 +Data Structures</h2></td></tr>
   55.89 +<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>
   55.90 +<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX mempool structure.  <a href="structUcxMempool.html#details">More...</a><br /></td></tr>
   55.91 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   55.92 +</table><table class="memberdecls">
   55.93 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
   55.94 +Macros</h2></td></tr>
   55.95 +<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>
   55.96 +<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>
   55.97 +<tr class="separator:a49f7bd1da5ac201d0cf54dc0f0d82dd2"><td class="memSeparator" colspan="2">&#160;</td></tr>
   55.98 +</table><table class="memberdecls">
   55.99 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
  55.100 +Functions</h2></td></tr>
  55.101 +<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>
  55.102 +<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>
  55.103 +<tr class="separator:ad71cb8c3b6fdb30360376a8b372ef22a"><td class="memSeparator" colspan="2">&#160;</td></tr>
  55.104 +<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>
  55.105 +<tr class="memdesc:aaf75b5016098723a9280531ccc3a6d77"><td class="mdescLeft">&#160;</td><td class="mdescRight">Resizes a memory pool.  <a href="#aaf75b5016098723a9280531ccc3a6d77">More...</a><br /></td></tr>
  55.106 +<tr class="separator:aaf75b5016098723a9280531ccc3a6d77"><td class="memSeparator" colspan="2">&#160;</td></tr>
  55.107 +<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>
  55.108 +<tr class="memdesc:a2ae492b8f2878ccc9837ac213dced11e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocates pooled memory.  <a href="#a2ae492b8f2878ccc9837ac213dced11e">More...</a><br /></td></tr>
  55.109 +<tr class="separator:a2ae492b8f2878ccc9837ac213dced11e"><td class="memSeparator" colspan="2">&#160;</td></tr>
  55.110 +<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>
  55.111 +<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>
  55.112 +<tr class="separator:a4b9142011824ae24f00fabe128417d69"><td class="memSeparator" colspan="2">&#160;</td></tr>
  55.113 +<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>
  55.114 +<tr class="memdesc:a660ef42520ed6737c2e77aae18e3a7a4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Reallocates pooled memory.  <a href="#a660ef42520ed6737c2e77aae18e3a7a4">More...</a><br /></td></tr>
  55.115 +<tr class="separator:a660ef42520ed6737c2e77aae18e3a7a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
  55.116 +<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>
  55.117 +<tr class="memdesc:aefa26e3015f5aefadbfc74221bd246ac"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees pooled memory.  <a href="#aefa26e3015f5aefadbfc74221bd246ac">More...</a><br /></td></tr>
  55.118 +<tr class="separator:aefa26e3015f5aefadbfc74221bd246ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
  55.119 +<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>
  55.120 +<tr class="memdesc:af096378da7e9bfbed3088497cf4c15bf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys a memory pool.  <a href="#af096378da7e9bfbed3088497cf4c15bf">More...</a><br /></td></tr>
  55.121 +<tr class="separator:af096378da7e9bfbed3088497cf4c15bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
  55.122 +<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>
  55.123 +<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>
  55.124 +<tr class="separator:adb788e7ec24cd7dbdea6381539c549f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
  55.125 +<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>
  55.126 +<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>
  55.127 +<tr class="separator:af47b6b7c40f8f263dc28cc9a4e77b27c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  55.128 +</table>
  55.129 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  55.130 +<div class="textblock"><p>Memory pool implementation. </p>
  55.131 +<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
  55.132 +<dd>
  55.133 +Olaf Wintermann </dd></dl>
  55.134 +</div><h2 class="groupheader">Macro Definition Documentation</h2>
  55.135 +<a id="a49f7bd1da5ac201d0cf54dc0f0d82dd2"></a>
  55.136 +<h2 class="memtitle"><span class="permalink"><a href="#a49f7bd1da5ac201d0cf54dc0f0d82dd2">&#9670;&nbsp;</a></span>ucx_mempool_new_default</h2>
  55.137 +
  55.138 +<div class="memitem">
  55.139 +<div class="memproto">
  55.140 +      <table class="memname">
  55.141 +        <tr>
  55.142 +          <td class="memname">#define ucx_mempool_new_default</td>
  55.143 +          <td>(</td>
  55.144 +          <td class="paramname"></td><td>)</td>
  55.145 +          <td>&#160;&#160;&#160;<a class="el" href="mempool_8h.html#ad71cb8c3b6fdb30360376a8b372ef22a">ucx_mempool_new</a>(16)</td>
  55.146 +        </tr>
  55.147 +      </table>
  55.148 +</div><div class="memdoc">
  55.149 +
  55.150 +<p>Shorthand for a new default memory pool with a capacity of 16 elements. </p>
  55.151 +
  55.152 +</div>
  55.153 +</div>
  55.154 +<h2 class="groupheader">Function Documentation</h2>
  55.155 +<a id="a4b9142011824ae24f00fabe128417d69"></a>
  55.156 +<h2 class="memtitle"><span class="permalink"><a href="#a4b9142011824ae24f00fabe128417d69">&#9670;&nbsp;</a></span>ucx_mempool_calloc()</h2>
  55.157 +
  55.158 +<div class="memitem">
  55.159 +<div class="memproto">
  55.160 +      <table class="memname">
  55.161 +        <tr>
  55.162 +          <td class="memname">void* ucx_mempool_calloc </td>
  55.163 +          <td>(</td>
  55.164 +          <td class="paramtype"><a class="el" href="structUcxMempool.html">UcxMempool</a> *&#160;</td>
  55.165 +          <td class="paramname"><em>pool</em>, </td>
  55.166 +        </tr>
  55.167 +        <tr>
  55.168 +          <td class="paramkey"></td>
  55.169 +          <td></td>
  55.170 +          <td class="paramtype">size_t&#160;</td>
  55.171 +          <td class="paramname"><em>nelem</em>, </td>
  55.172 +        </tr>
  55.173 +        <tr>
  55.174 +          <td class="paramkey"></td>
  55.175 +          <td></td>
  55.176 +          <td class="paramtype">size_t&#160;</td>
  55.177 +          <td class="paramname"><em>elsize</em>&#160;</td>
  55.178 +        </tr>
  55.179 +        <tr>
  55.180 +          <td></td>
  55.181 +          <td>)</td>
  55.182 +          <td></td><td></td>
  55.183 +        </tr>
  55.184 +      </table>
  55.185 +</div><div class="memdoc">
  55.186 +
  55.187 +<p>Allocates a pooled memory array. </p>
  55.188 +<p>The content of the allocated memory is set to zero.</p>
  55.189 +<dl class="params"><dt>Parameters</dt><dd>
  55.190 +  <table class="params">
  55.191 +    <tr><td class="paramname">pool</td><td>the memory pool </td></tr>
  55.192 +    <tr><td class="paramname">nelem</td><td>amount of elements to allocate </td></tr>
  55.193 +    <tr><td class="paramname">elsize</td><td>amount of memory per element </td></tr>
  55.194 +  </table>
  55.195 +  </dd>
  55.196 +</dl>
  55.197 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory </dd></dl>
  55.198 +<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>
  55.199 +
  55.200 +</div>
  55.201 +</div>
  55.202 +<a id="aaf75b5016098723a9280531ccc3a6d77"></a>
  55.203 +<h2 class="memtitle"><span class="permalink"><a href="#aaf75b5016098723a9280531ccc3a6d77">&#9670;&nbsp;</a></span>ucx_mempool_chcap()</h2>
  55.204 +
  55.205 +<div class="memitem">
  55.206 +<div class="memproto">
  55.207 +      <table class="memname">
  55.208 +        <tr>
  55.209 +          <td class="memname">int ucx_mempool_chcap </td>
  55.210 +          <td>(</td>
  55.211 +          <td class="paramtype"><a class="el" href="structUcxMempool.html">UcxMempool</a> *&#160;</td>
  55.212 +          <td class="paramname"><em>pool</em>, </td>
  55.213 +        </tr>
  55.214 +        <tr>
  55.215 +          <td class="paramkey"></td>
  55.216 +          <td></td>
  55.217 +          <td class="paramtype">size_t&#160;</td>
  55.218 +          <td class="paramname"><em>newcap</em>&#160;</td>
  55.219 +        </tr>
  55.220 +        <tr>
  55.221 +          <td></td>
  55.222 +          <td>)</td>
  55.223 +          <td></td><td></td>
  55.224 +        </tr>
  55.225 +      </table>
  55.226 +</div><div class="memdoc">
  55.227 +
  55.228 +<p>Resizes a memory pool. </p>
  55.229 +<p>This function will fail if the new capacity is not sufficient for the present data.</p>
  55.230 +<dl class="params"><dt>Parameters</dt><dd>
  55.231 +  <table class="params">
  55.232 +    <tr><td class="paramname">pool</td><td>the pool to resize </td></tr>
  55.233 +    <tr><td class="paramname">newcap</td><td>the new capacity </td></tr>
  55.234 +  </table>
  55.235 +  </dd>
  55.236 +</dl>
  55.237 +<dl class="section return"><dt>Returns</dt><dd>zero on success or non-zero on failure </dd></dl>
  55.238 +
  55.239 +</div>
  55.240 +</div>
  55.241 +<a id="af096378da7e9bfbed3088497cf4c15bf"></a>
  55.242 +<h2 class="memtitle"><span class="permalink"><a href="#af096378da7e9bfbed3088497cf4c15bf">&#9670;&nbsp;</a></span>ucx_mempool_destroy()</h2>
  55.243 +
  55.244 +<div class="memitem">
  55.245 +<div class="memproto">
  55.246 +      <table class="memname">
  55.247 +        <tr>
  55.248 +          <td class="memname">void ucx_mempool_destroy </td>
  55.249 +          <td>(</td>
  55.250 +          <td class="paramtype"><a class="el" href="structUcxMempool.html">UcxMempool</a> *&#160;</td>
  55.251 +          <td class="paramname"><em>pool</em></td><td>)</td>
  55.252 +          <td></td>
  55.253 +        </tr>
  55.254 +      </table>
  55.255 +</div><div class="memdoc">
  55.256 +
  55.257 +<p>Destroys a memory pool. </p>
  55.258 +<p>For each element the destructor function (if any) is called and the element is freed.</p>
  55.259 +<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>
  55.260 +<dl class="params"><dt>Parameters</dt><dd>
  55.261 +  <table class="params">
  55.262 +    <tr><td class="paramname">pool</td><td>the mempool to destroy </td></tr>
  55.263 +  </table>
  55.264 +  </dd>
  55.265 +</dl>
  55.266 +
  55.267 +</div>
  55.268 +</div>
  55.269 +<a id="aefa26e3015f5aefadbfc74221bd246ac"></a>
  55.270 +<h2 class="memtitle"><span class="permalink"><a href="#aefa26e3015f5aefadbfc74221bd246ac">&#9670;&nbsp;</a></span>ucx_mempool_free()</h2>
  55.271 +
  55.272 +<div class="memitem">
  55.273 +<div class="memproto">
  55.274 +      <table class="memname">
  55.275 +        <tr>
  55.276 +          <td class="memname">void ucx_mempool_free </td>
  55.277 +          <td>(</td>
  55.278 +          <td class="paramtype"><a class="el" href="structUcxMempool.html">UcxMempool</a> *&#160;</td>
  55.279 +          <td class="paramname"><em>pool</em>, </td>
  55.280 +        </tr>
  55.281 +        <tr>
  55.282 +          <td class="paramkey"></td>
  55.283 +          <td></td>
  55.284 +          <td class="paramtype">void *&#160;</td>
  55.285 +          <td class="paramname"><em>ptr</em>&#160;</td>
  55.286 +        </tr>
  55.287 +        <tr>
  55.288 +          <td></td>
  55.289 +          <td>)</td>
  55.290 +          <td></td><td></td>
  55.291 +        </tr>
  55.292 +      </table>
  55.293 +</div><div class="memdoc">
  55.294 +
  55.295 +<p>Frees pooled memory. </p>
  55.296 +<p>Before freeing the memory, the specified destructor function (if any) is called.</p>
  55.297 +<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>
  55.298 +<dl class="params"><dt>Parameters</dt><dd>
  55.299 +  <table class="params">
  55.300 +    <tr><td class="paramname">pool</td><td>the memory pool </td></tr>
  55.301 +    <tr><td class="paramname">ptr</td><td>a pointer to the memory that shall be freed </td></tr>
  55.302 +  </table>
  55.303 +  </dd>
  55.304 +</dl>
  55.305 +<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>
  55.306 +
  55.307 +</div>
  55.308 +</div>
  55.309 +<a id="a2ae492b8f2878ccc9837ac213dced11e"></a>
  55.310 +<h2 class="memtitle"><span class="permalink"><a href="#a2ae492b8f2878ccc9837ac213dced11e">&#9670;&nbsp;</a></span>ucx_mempool_malloc()</h2>
  55.311 +
  55.312 +<div class="memitem">
  55.313 +<div class="memproto">
  55.314 +      <table class="memname">
  55.315 +        <tr>
  55.316 +          <td class="memname">void* ucx_mempool_malloc </td>
  55.317 +          <td>(</td>
  55.318 +          <td class="paramtype"><a class="el" href="structUcxMempool.html">UcxMempool</a> *&#160;</td>
  55.319 +          <td class="paramname"><em>pool</em>, </td>
  55.320 +        </tr>
  55.321 +        <tr>
  55.322 +          <td class="paramkey"></td>
  55.323 +          <td></td>
  55.324 +          <td class="paramtype">size_t&#160;</td>
  55.325 +          <td class="paramname"><em>n</em>&#160;</td>
  55.326 +        </tr>
  55.327 +        <tr>
  55.328 +          <td></td>
  55.329 +          <td>)</td>
  55.330 +          <td></td><td></td>
  55.331 +        </tr>
  55.332 +      </table>
  55.333 +</div><div class="memdoc">
  55.334 +
  55.335 +<p>Allocates pooled memory. </p>
  55.336 +<dl class="params"><dt>Parameters</dt><dd>
  55.337 +  <table class="params">
  55.338 +    <tr><td class="paramname">pool</td><td>the memory pool </td></tr>
  55.339 +    <tr><td class="paramname">n</td><td>amount of memory to allocate </td></tr>
  55.340 +  </table>
  55.341 +  </dd>
  55.342 +</dl>
  55.343 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory </dd></dl>
  55.344 +<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>
  55.345 +
  55.346 +</div>
  55.347 +</div>
  55.348 +<a id="ad71cb8c3b6fdb30360376a8b372ef22a"></a>
  55.349 +<h2 class="memtitle"><span class="permalink"><a href="#ad71cb8c3b6fdb30360376a8b372ef22a">&#9670;&nbsp;</a></span>ucx_mempool_new()</h2>
  55.350 +
  55.351 +<div class="memitem">
  55.352 +<div class="memproto">
  55.353 +      <table class="memname">
  55.354 +        <tr>
  55.355 +          <td class="memname"><a class="el" href="structUcxMempool.html">UcxMempool</a>* ucx_mempool_new </td>
  55.356 +          <td>(</td>
  55.357 +          <td class="paramtype">size_t&#160;</td>
  55.358 +          <td class="paramname"><em>n</em></td><td>)</td>
  55.359 +          <td></td>
  55.360 +        </tr>
  55.361 +      </table>
  55.362 +</div><div class="memdoc">
  55.363 +
  55.364 +<p>Creates a memory pool with the specified initial size. </p>
  55.365 +<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>
  55.366 +<dl class="params"><dt>Parameters</dt><dd>
  55.367 +  <table class="params">
  55.368 +    <tr><td class="paramname">n</td><td>initial pool size (should be a power of two, e.g. 16) </td></tr>
  55.369 +  </table>
  55.370 +  </dd>
  55.371 +</dl>
  55.372 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the new memory pool </dd></dl>
  55.373 +<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>
  55.374 +
  55.375 +</div>
  55.376 +</div>
  55.377 +<a id="a660ef42520ed6737c2e77aae18e3a7a4"></a>
  55.378 +<h2 class="memtitle"><span class="permalink"><a href="#a660ef42520ed6737c2e77aae18e3a7a4">&#9670;&nbsp;</a></span>ucx_mempool_realloc()</h2>
  55.379 +
  55.380 +<div class="memitem">
  55.381 +<div class="memproto">
  55.382 +      <table class="memname">
  55.383 +        <tr>
  55.384 +          <td class="memname">void* ucx_mempool_realloc </td>
  55.385 +          <td>(</td>
  55.386 +          <td class="paramtype"><a class="el" href="structUcxMempool.html">UcxMempool</a> *&#160;</td>
  55.387 +          <td class="paramname"><em>pool</em>, </td>
  55.388 +        </tr>
  55.389 +        <tr>
  55.390 +          <td class="paramkey"></td>
  55.391 +          <td></td>
  55.392 +          <td class="paramtype">void *&#160;</td>
  55.393 +          <td class="paramname"><em>ptr</em>, </td>
  55.394 +        </tr>
  55.395 +        <tr>
  55.396 +          <td class="paramkey"></td>
  55.397 +          <td></td>
  55.398 +          <td class="paramtype">size_t&#160;</td>
  55.399 +          <td class="paramname"><em>n</em>&#160;</td>
  55.400 +        </tr>
  55.401 +        <tr>
  55.402 +          <td></td>
  55.403 +          <td>)</td>
  55.404 +          <td></td><td></td>
  55.405 +        </tr>
  55.406 +      </table>
  55.407 +</div><div class="memdoc">
  55.408 +
  55.409 +<p>Reallocates pooled memory. </p>
  55.410 +<p>If the memory to be reallocated is not contained by the specified pool, the behavior is undefined.</p>
  55.411 +<dl class="params"><dt>Parameters</dt><dd>
  55.412 +  <table class="params">
  55.413 +    <tr><td class="paramname">pool</td><td>the memory pool </td></tr>
  55.414 +    <tr><td class="paramname">ptr</td><td>a pointer to the memory that shall be reallocated </td></tr>
  55.415 +    <tr><td class="paramname">n</td><td>the new size of the memory </td></tr>
  55.416 +  </table>
  55.417 +  </dd>
  55.418 +</dl>
  55.419 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the new location of the memory </dd></dl>
  55.420 +<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>
  55.421 +
  55.422 +</div>
  55.423 +</div>
  55.424 +<a id="af47b6b7c40f8f263dc28cc9a4e77b27c"></a>
  55.425 +<h2 class="memtitle"><span class="permalink"><a href="#af47b6b7c40f8f263dc28cc9a4e77b27c">&#9670;&nbsp;</a></span>ucx_mempool_reg_destr()</h2>
  55.426 +
  55.427 +<div class="memitem">
  55.428 +<div class="memproto">
  55.429 +      <table class="memname">
  55.430 +        <tr>
  55.431 +          <td class="memname">void ucx_mempool_reg_destr </td>
  55.432 +          <td>(</td>
  55.433 +          <td class="paramtype"><a class="el" href="structUcxMempool.html">UcxMempool</a> *&#160;</td>
  55.434 +          <td class="paramname"><em>pool</em>, </td>
  55.435 +        </tr>
  55.436 +        <tr>
  55.437 +          <td class="paramkey"></td>
  55.438 +          <td></td>
  55.439 +          <td class="paramtype">void *&#160;</td>
  55.440 +          <td class="paramname"><em>ptr</em>, </td>
  55.441 +        </tr>
  55.442 +        <tr>
  55.443 +          <td class="paramkey"></td>
  55.444 +          <td></td>
  55.445 +          <td class="paramtype"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a>&#160;</td>
  55.446 +          <td class="paramname"><em>destr</em>&#160;</td>
  55.447 +        </tr>
  55.448 +        <tr>
  55.449 +          <td></td>
  55.450 +          <td>)</td>
  55.451 +          <td></td><td></td>
  55.452 +        </tr>
  55.453 +      </table>
  55.454 +</div><div class="memdoc">
  55.455 +
  55.456 +<p>Registers a destructor function for the specified (non-pooled) memory. </p>
  55.457 +<p>This is useful, if you have memory that has not been allocated by a mempool, but shall be managed by a mempool.</p>
  55.458 +<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>
  55.459 +<dl class="params"><dt>Parameters</dt><dd>
  55.460 +  <table class="params">
  55.461 +    <tr><td class="paramname">pool</td><td>the memory pool </td></tr>
  55.462 +    <tr><td class="paramname">ptr</td><td>data the destructor is registered for </td></tr>
  55.463 +    <tr><td class="paramname">destr</td><td>a pointer to the destructor function </td></tr>
  55.464 +  </table>
  55.465 +  </dd>
  55.466 +</dl>
  55.467 +
  55.468 +</div>
  55.469 +</div>
  55.470 +<a id="adb788e7ec24cd7dbdea6381539c549f2"></a>
  55.471 +<h2 class="memtitle"><span class="permalink"><a href="#adb788e7ec24cd7dbdea6381539c549f2">&#9670;&nbsp;</a></span>ucx_mempool_set_destr()</h2>
  55.472 +
  55.473 +<div class="memitem">
  55.474 +<div class="memproto">
  55.475 +      <table class="memname">
  55.476 +        <tr>
  55.477 +          <td class="memname">void ucx_mempool_set_destr </td>
  55.478 +          <td>(</td>
  55.479 +          <td class="paramtype">void *&#160;</td>
  55.480 +          <td class="paramname"><em>ptr</em>, </td>
  55.481 +        </tr>
  55.482 +        <tr>
  55.483 +          <td class="paramkey"></td>
  55.484 +          <td></td>
  55.485 +          <td class="paramtype"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a>&#160;</td>
  55.486 +          <td class="paramname"><em>func</em>&#160;</td>
  55.487 +        </tr>
  55.488 +        <tr>
  55.489 +          <td></td>
  55.490 +          <td>)</td>
  55.491 +          <td></td><td></td>
  55.492 +        </tr>
  55.493 +      </table>
  55.494 +</div><div class="memdoc">
  55.495 +
  55.496 +<p>Sets a destructor function for the specified memory. </p>
  55.497 +<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>
  55.498 +<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>
  55.499 +<dl class="params"><dt>Parameters</dt><dd>
  55.500 +  <table class="params">
  55.501 +    <tr><td class="paramname">ptr</td><td>pooled memory </td></tr>
  55.502 +    <tr><td class="paramname">func</td><td>a pointer to the destructor function </td></tr>
  55.503 +  </table>
  55.504 +  </dd>
  55.505 +</dl>
  55.506 +<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>
  55.507 +<dd>
  55.508 +<a class="el" href="mempool_8h.html#af096378da7e9bfbed3088497cf4c15bf" title="Destroys a memory pool. ">ucx_mempool_destroy()</a> </dd></dl>
  55.509 +
  55.510 +</div>
  55.511 +</div>
  55.512 +</div><!-- contents -->
  55.513 +<!-- start footer part -->
  55.514 +<hr class="footer"/><address class="footer"><small>
  55.515 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  55.516 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  55.517 +</a> 1.8.13
  55.518 +</small></address>
  55.519 +</body>
  55.520 +</html>
    56.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    56.2 +++ b/docs/api-2.1/mempool_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
    56.3 @@ -0,0 +1,97 @@
    56.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    56.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    56.6 +<head>
    56.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    56.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    56.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   56.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   56.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/mempool.h Source File</title>
   56.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   56.13 +<script type="text/javascript" src="jquery.js"></script>
   56.14 +<script type="text/javascript" src="dynsections.js"></script>
   56.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   56.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   56.17 +<script type="text/javascript" src="search/search.js"></script>
   56.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   56.19 +</head>
   56.20 +<body>
   56.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   56.22 +<div id="titlearea">
   56.23 +<table cellspacing="0" cellpadding="0">
   56.24 + <tbody>
   56.25 + <tr style="height: 56px;">
   56.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   56.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   56.28 +   <div id="projectname">ucx
   56.29 +   </div>
   56.30 +   <div id="projectbrief">UAP Common Extensions</div>
   56.31 +  </td>
   56.32 + </tr>
   56.33 + </tbody>
   56.34 +</table>
   56.35 +</div>
   56.36 +<!-- end header part -->
   56.37 +<!-- Generated by Doxygen 1.8.13 -->
   56.38 +<script type="text/javascript">
   56.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   56.40 +</script>
   56.41 +<script type="text/javascript" src="menudata.js"></script>
   56.42 +<script type="text/javascript" src="menu.js"></script>
   56.43 +<script type="text/javascript">
   56.44 +$(function() {
   56.45 +  initMenu('',true,false,'search.php','Search');
   56.46 +  $(document).ready(function() { init_search(); });
   56.47 +});
   56.48 +</script>
   56.49 +<div id="main-nav"></div>
   56.50 +<!-- window showing the filter options -->
   56.51 +<div id="MSearchSelectWindow"
   56.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   56.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   56.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   56.55 +</div>
   56.56 +
   56.57 +<!-- iframe showing the search results (closed by default) -->
   56.58 +<div id="MSearchResultsWindow">
   56.59 +<iframe src="javascript:void(0)" frameborder="0" 
   56.60 +        name="MSearchResults" id="MSearchResults">
   56.61 +</iframe>
   56.62 +</div>
   56.63 +
   56.64 +<div id="nav-path" class="navpath">
   56.65 +  <ul>
   56.66 +<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>
   56.67 +</div>
   56.68 +</div><!-- top -->
   56.69 +<div class="header">
   56.70 +  <div class="headertitle">
   56.71 +<div class="title">mempool.h</div>  </div>
   56.72 +</div><!--header-->
   56.73 +<div class="contents">
   56.74 +<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>
   56.75 +<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>
   56.76 +<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>
   56.77 +<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>
   56.78 +<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>
   56.79 +<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>
   56.80 +<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>
   56.81 +<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>
   56.82 +<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>
   56.83 +<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>
   56.84 +<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>
   56.85 +<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>
   56.86 +<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>
   56.87 +<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>
   56.88 +<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>
   56.89 +<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>
   56.90 +<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>
   56.91 +<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>
   56.92 +</div><!-- fragment --></div><!-- contents -->
   56.93 +<!-- start footer part -->
   56.94 +<hr class="footer"/><address class="footer"><small>
   56.95 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
   56.96 +<img class="footer" src="doxygen.png" alt="doxygen"/>
   56.97 +</a> 1.8.13
   56.98 +</small></address>
   56.99 +</body>
  56.100 +</html>
    57.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    57.2 +++ b/docs/api-2.1/menu.js	Sat Feb 06 19:11:44 2021 +0100
    57.3 @@ -0,0 +1,26 @@
    57.4 +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
    57.5 +  function makeTree(data,relPath) {
    57.6 +    var result='';
    57.7 +    if ('children' in data) {
    57.8 +      result+='<ul>';
    57.9 +      for (var i in data.children) {
   57.10 +        result+='<li><a href="'+relPath+data.children[i].url+'">'+
   57.11 +                                data.children[i].text+'</a>'+
   57.12 +                                makeTree(data.children[i],relPath)+'</li>';
   57.13 +      }
   57.14 +      result+='</ul>';
   57.15 +    }
   57.16 +    return result;
   57.17 +  }
   57.18 +
   57.19 +  $('#main-nav').append(makeTree(menudata,relPath));
   57.20 +  $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
   57.21 +  if (searchEnabled) {
   57.22 +    if (serverSide) {
   57.23 +      $('#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>');
   57.24 +    } else {
   57.25 +      $('#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>');
   57.26 +    }
   57.27 +  }
   57.28 +  $('#main-menu').smartmenus();
   57.29 +}
    58.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    58.2 +++ b/docs/api-2.1/menudata.js	Sat Feb 06 19:11:44 2021 +0100
    58.3 @@ -0,0 +1,69 @@
    58.4 +var menudata={children:[
    58.5 +{text:"Main Page",url:"index.html"},
    58.6 +{text:"Data Structures",url:"annotated.html",children:[
    58.7 +{text:"Data Structures",url:"annotated.html"},
    58.8 +{text:"Data Structure Index",url:"classes.html"},
    58.9 +{text:"Data Fields",url:"functions.html",children:[
   58.10 +{text:"All",url:"functions.html",children:[
   58.11 +{text:"a",url:"functions.html#index_a"},
   58.12 +{text:"b",url:"functions.html#index_b"},
   58.13 +{text:"c",url:"functions.html#index_c"},
   58.14 +{text:"d",url:"functions.html#index_d"},
   58.15 +{text:"e",url:"functions.html#index_e"},
   58.16 +{text:"f",url:"functions.html#index_f"},
   58.17 +{text:"h",url:"functions.html#index_h"},
   58.18 +{text:"i",url:"functions.html#index_i"},
   58.19 +{text:"k",url:"functions.html#index_k"},
   58.20 +{text:"l",url:"functions.html#index_l"},
   58.21 +{text:"m",url:"functions.html#index_m"},
   58.22 +{text:"n",url:"functions.html#index_n"},
   58.23 +{text:"p",url:"functions.html#index_p"},
   58.24 +{text:"r",url:"functions.html#index_r"},
   58.25 +{text:"s",url:"functions.html#index_s"},
   58.26 +{text:"t",url:"functions.html#index_t"},
   58.27 +{text:"u",url:"functions.html#index_u"},
   58.28 +{text:"v",url:"functions.html#index_v"},
   58.29 +{text:"w",url:"functions.html#index_w"}]},
   58.30 +{text:"Variables",url:"functions_vars.html",children:[
   58.31 +{text:"a",url:"functions_vars.html#index_a"},
   58.32 +{text:"b",url:"functions_vars.html#index_b"},
   58.33 +{text:"c",url:"functions_vars.html#index_c"},
   58.34 +{text:"d",url:"functions_vars.html#index_d"},
   58.35 +{text:"e",url:"functions_vars.html#index_e"},
   58.36 +{text:"f",url:"functions_vars.html#index_f"},
   58.37 +{text:"h",url:"functions_vars.html#index_h"},
   58.38 +{text:"i",url:"functions_vars.html#index_i"},
   58.39 +{text:"k",url:"functions_vars.html#index_k"},
   58.40 +{text:"l",url:"functions_vars.html#index_l"},
   58.41 +{text:"m",url:"functions_vars.html#index_m"},
   58.42 +{text:"n",url:"functions_vars.html#index_n"},
   58.43 +{text:"p",url:"functions_vars.html#index_p"},
   58.44 +{text:"r",url:"functions_vars.html#index_r"},
   58.45 +{text:"s",url:"functions_vars.html#index_s"},
   58.46 +{text:"t",url:"functions_vars.html#index_t"},
   58.47 +{text:"u",url:"functions_vars.html#index_u"},
   58.48 +{text:"v",url:"functions_vars.html#index_v"},
   58.49 +{text:"w",url:"functions_vars.html#index_w"}]}]}]},
   58.50 +{text:"Files",url:"files.html",children:[
   58.51 +{text:"File List",url:"files.html"},
   58.52 +{text:"Globals",url:"globals.html",children:[
   58.53 +{text:"All",url:"globals.html",children:[
   58.54 +{text:"_",url:"globals.html#index__"},
   58.55 +{text:"a",url:"globals_a.html#index_a"},
   58.56 +{text:"c",url:"globals_c.html#index_c"},
   58.57 +{text:"d",url:"globals_d.html#index_d"},
   58.58 +{text:"p",url:"globals_p.html#index_p"},
   58.59 +{text:"r",url:"globals_r.html#index_r"},
   58.60 +{text:"s",url:"globals_s.html#index_s"},
   58.61 +{text:"u",url:"globals_u.html#index_u"},
   58.62 +{text:"w",url:"globals_w.html#index_w"}]},
   58.63 +{text:"Functions",url:"globals_func.html",children:[
   58.64 +{text:"s",url:"globals_func.html#index_s"},
   58.65 +{text:"u",url:"globals_func_u.html#index_u"}]},
   58.66 +{text:"Typedefs",url:"globals_type.html"},
   58.67 +{text:"Macros",url:"globals_defs.html",children:[
   58.68 +{text:"_",url:"globals_defs.html#index__"},
   58.69 +{text:"a",url:"globals_defs.html#index_a"},
   58.70 +{text:"p",url:"globals_defs.html#index_p"},
   58.71 +{text:"s",url:"globals_defs.html#index_s"},
   58.72 +{text:"u",url:"globals_defs.html#index_u"}]}]}]}]}
    59.1 Binary file docs/api-2.1/nav_f.png has changed
    60.1 Binary file docs/api-2.1/nav_g.png has changed
    61.1 Binary file docs/api-2.1/nav_h.png has changed
    62.1 Binary file docs/api-2.1/open.png has changed
    63.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    63.2 +++ b/docs/api-2.1/properties_8h.html	Sat Feb 06 19:11:44 2021 +0100
    63.3 @@ -0,0 +1,393 @@
    63.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    63.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    63.6 +<head>
    63.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    63.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    63.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   63.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   63.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/properties.h File Reference</title>
   63.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   63.13 +<script type="text/javascript" src="jquery.js"></script>
   63.14 +<script type="text/javascript" src="dynsections.js"></script>
   63.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   63.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   63.17 +<script type="text/javascript" src="search/search.js"></script>
   63.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   63.19 +</head>
   63.20 +<body>
   63.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   63.22 +<div id="titlearea">
   63.23 +<table cellspacing="0" cellpadding="0">
   63.24 + <tbody>
   63.25 + <tr style="height: 56px;">
   63.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   63.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   63.28 +   <div id="projectname">ucx
   63.29 +   </div>
   63.30 +   <div id="projectbrief">UAP Common Extensions</div>
   63.31 +  </td>
   63.32 + </tr>
   63.33 + </tbody>
   63.34 +</table>
   63.35 +</div>
   63.36 +<!-- end header part -->
   63.37 +<!-- Generated by Doxygen 1.8.13 -->
   63.38 +<script type="text/javascript">
   63.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   63.40 +</script>
   63.41 +<script type="text/javascript" src="menudata.js"></script>
   63.42 +<script type="text/javascript" src="menu.js"></script>
   63.43 +<script type="text/javascript">
   63.44 +$(function() {
   63.45 +  initMenu('',true,false,'search.php','Search');
   63.46 +  $(document).ready(function() { init_search(); });
   63.47 +});
   63.48 +</script>
   63.49 +<div id="main-nav"></div>
   63.50 +<!-- window showing the filter options -->
   63.51 +<div id="MSearchSelectWindow"
   63.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   63.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   63.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   63.55 +</div>
   63.56 +
   63.57 +<!-- iframe showing the search results (closed by default) -->
   63.58 +<div id="MSearchResultsWindow">
   63.59 +<iframe src="javascript:void(0)" frameborder="0" 
   63.60 +        name="MSearchResults" id="MSearchResults">
   63.61 +</iframe>
   63.62 +</div>
   63.63 +
   63.64 +<div id="nav-path" class="navpath">
   63.65 +  <ul>
   63.66 +<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>
   63.67 +</div>
   63.68 +</div><!-- top -->
   63.69 +<div class="header">
   63.70 +  <div class="summary">
   63.71 +<a href="#nested-classes">Data Structures</a> &#124;
   63.72 +<a href="#func-members">Functions</a>  </div>
   63.73 +  <div class="headertitle">
   63.74 +<div class="title">properties.h File Reference</div>  </div>
   63.75 +</div><!--header-->
   63.76 +<div class="contents">
   63.77 +
   63.78 +<p>Load / store utilities for properties files.  
   63.79 +<a href="#details">More...</a></p>
   63.80 +<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
   63.81 +<code>#include &quot;<a class="el" href="map_8h_source.html">map.h</a>&quot;</code><br />
   63.82 +</div>
   63.83 +<p><a href="properties_8h_source.html">Go to the source code of this file.</a></p>
   63.84 +<table class="memberdecls">
   63.85 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
   63.86 +Data Structures</h2></td></tr>
   63.87 +<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>
   63.88 +<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>
   63.89 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
   63.90 +</table><table class="memberdecls">
   63.91 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
   63.92 +Functions</h2></td></tr>
   63.93 +<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>
   63.94 +<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>
   63.95 +<tr class="separator:a44d9dd12cab3aaa0084f1c8b89405796"><td class="memSeparator" colspan="2">&#160;</td></tr>
   63.96 +<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>
   63.97 +<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>
   63.98 +<tr class="separator:a38a2fe7bb2986bd87c7e69356ab05c05"><td class="memSeparator" colspan="2">&#160;</td></tr>
   63.99 +<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>
  63.100 +<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>
  63.101 +<tr class="separator:aaf8de121764a4d22c763ff2ab41f3a4d"><td class="memSeparator" colspan="2">&#160;</td></tr>
  63.102 +<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>
  63.103 +<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>
  63.104 +<tr class="separator:a7e03bc573d45d48c538cd721e810d33c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  63.105 +<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>
  63.106 +<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>
  63.107 +<tr class="separator:a5c7ff8bc3139960a3f3dc92072b742f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
  63.108 +<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>
  63.109 +<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>
  63.110 +<tr class="separator:ae1b600f839a6b2278b68fc314981a8a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
  63.111 +<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>
  63.112 +<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>
  63.113 +<tr class="separator:a63c0c1b7648e675b21a1788917ff36fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
  63.114 +</table>
  63.115 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  63.116 +<div class="textblock"><p>Load / store utilities for properties files. </p>
  63.117 +<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
  63.118 +<dd>
  63.119 +Olaf Wintermann </dd></dl>
  63.120 +</div><h2 class="groupheader">Function Documentation</h2>
  63.121 +<a id="a5c7ff8bc3139960a3f3dc92072b742f3"></a>
  63.122 +<h2 class="memtitle"><span class="permalink"><a href="#a5c7ff8bc3139960a3f3dc92072b742f3">&#9670;&nbsp;</a></span>ucx_properties2map()</h2>
  63.123 +
  63.124 +<div class="memitem">
  63.125 +<div class="memproto">
  63.126 +      <table class="memname">
  63.127 +        <tr>
  63.128 +          <td class="memname">int ucx_properties2map </td>
  63.129 +          <td>(</td>
  63.130 +          <td class="paramtype"><a class="el" href="structUcxProperties.html">UcxProperties</a> *&#160;</td>
  63.131 +          <td class="paramname"><em>prop</em>, </td>
  63.132 +        </tr>
  63.133 +        <tr>
  63.134 +          <td class="paramkey"></td>
  63.135 +          <td></td>
  63.136 +          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
  63.137 +          <td class="paramname"><em>map</em>&#160;</td>
  63.138 +        </tr>
  63.139 +        <tr>
  63.140 +          <td></td>
  63.141 +          <td>)</td>
  63.142 +          <td></td><td></td>
  63.143 +        </tr>
  63.144 +      </table>
  63.145 +</div><div class="memdoc">
  63.146 +
  63.147 +<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>
  63.148 +<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>
  63.149 +<p>The memory for the map values is allocated by the map's own allocator.</p>
  63.150 +<dl class="params"><dt>Parameters</dt><dd>
  63.151 +  <table class="params">
  63.152 +    <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>
  63.153 +    <tr><td class="paramname">map</td><td>the target map </td></tr>
  63.154 +  </table>
  63.155 +  </dd>
  63.156 +</dl>
  63.157 +<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>
  63.158 +<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>
  63.159 +<dd>
  63.160 +<a class="el" href="structUcxMap.html#a531f3e481c1c331cf037b916192e974d" title="An allocator that is used for the map elements. ">UcxMap.allocator</a> </dd></dl>
  63.161 +
  63.162 +</div>
  63.163 +</div>
  63.164 +<a id="aaf8de121764a4d22c763ff2ab41f3a4d"></a>
  63.165 +<h2 class="memtitle"><span class="permalink"><a href="#aaf8de121764a4d22c763ff2ab41f3a4d">&#9670;&nbsp;</a></span>ucx_properties_fill()</h2>
  63.166 +
  63.167 +<div class="memitem">
  63.168 +<div class="memproto">
  63.169 +      <table class="memname">
  63.170 +        <tr>
  63.171 +          <td class="memname">void ucx_properties_fill </td>
  63.172 +          <td>(</td>
  63.173 +          <td class="paramtype"><a class="el" href="structUcxProperties.html">UcxProperties</a> *&#160;</td>
  63.174 +          <td class="paramname"><em>prop</em>, </td>
  63.175 +        </tr>
  63.176 +        <tr>
  63.177 +          <td class="paramkey"></td>
  63.178 +          <td></td>
  63.179 +          <td class="paramtype">char *&#160;</td>
  63.180 +          <td class="paramname"><em>buf</em>, </td>
  63.181 +        </tr>
  63.182 +        <tr>
  63.183 +          <td class="paramkey"></td>
  63.184 +          <td></td>
  63.185 +          <td class="paramtype">size_t&#160;</td>
  63.186 +          <td class="paramname"><em>len</em>&#160;</td>
  63.187 +        </tr>
  63.188 +        <tr>
  63.189 +          <td></td>
  63.190 +          <td>)</td>
  63.191 +          <td></td><td></td>
  63.192 +        </tr>
  63.193 +      </table>
  63.194 +</div><div class="memdoc">
  63.195 +
  63.196 +<p>Sets the input buffer for the properties parser. </p>
  63.197 +<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>
  63.198 +<dl class="params"><dt>Parameters</dt><dd>
  63.199 +  <table class="params">
  63.200 +    <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>
  63.201 +    <tr><td class="paramname">buf</td><td>a pointer to the new buffer </td></tr>
  63.202 +    <tr><td class="paramname">len</td><td>the payload length of the buffer </td></tr>
  63.203 +  </table>
  63.204 +  </dd>
  63.205 +</dl>
  63.206 +<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>
  63.207 +<dd>
  63.208 +<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>
  63.209 +
  63.210 +</div>
  63.211 +</div>
  63.212 +<a id="a38a2fe7bb2986bd87c7e69356ab05c05"></a>
  63.213 +<h2 class="memtitle"><span class="permalink"><a href="#a38a2fe7bb2986bd87c7e69356ab05c05">&#9670;&nbsp;</a></span>ucx_properties_free()</h2>
  63.214 +
  63.215 +<div class="memitem">
  63.216 +<div class="memproto">
  63.217 +      <table class="memname">
  63.218 +        <tr>
  63.219 +          <td class="memname">void ucx_properties_free </td>
  63.220 +          <td>(</td>
  63.221 +          <td class="paramtype"><a class="el" href="structUcxProperties.html">UcxProperties</a> *&#160;</td>
  63.222 +          <td class="paramname"><em>prop</em></td><td>)</td>
  63.223 +          <td></td>
  63.224 +        </tr>
  63.225 +      </table>
  63.226 +</div><div class="memdoc">
  63.227 +
  63.228 +<p>Destroys a <a class="el" href="structUcxProperties.html" title="UcxProperties object for parsing properties data. ">UcxProperties</a> object. </p>
  63.229 +<dl class="params"><dt>Parameters</dt><dd>
  63.230 +  <table class="params">
  63.231 +    <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>
  63.232 +  </table>
  63.233 +  </dd>
  63.234 +</dl>
  63.235 +
  63.236 +</div>
  63.237 +</div>
  63.238 +<a id="ae1b600f839a6b2278b68fc314981a8a3"></a>
  63.239 +<h2 class="memtitle"><span class="permalink"><a href="#ae1b600f839a6b2278b68fc314981a8a3">&#9670;&nbsp;</a></span>ucx_properties_load()</h2>
  63.240 +
  63.241 +<div class="memitem">
  63.242 +<div class="memproto">
  63.243 +      <table class="memname">
  63.244 +        <tr>
  63.245 +          <td class="memname">int ucx_properties_load </td>
  63.246 +          <td>(</td>
  63.247 +          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
  63.248 +          <td class="paramname"><em>map</em>, </td>
  63.249 +        </tr>
  63.250 +        <tr>
  63.251 +          <td class="paramkey"></td>
  63.252 +          <td></td>
  63.253 +          <td class="paramtype">FILE *&#160;</td>
  63.254 +          <td class="paramname"><em>file</em>&#160;</td>
  63.255 +        </tr>
  63.256 +        <tr>
  63.257 +          <td></td>
  63.258 +          <td>)</td>
  63.259 +          <td></td><td></td>
  63.260 +        </tr>
  63.261 +      </table>
  63.262 +</div><div class="memdoc">
  63.263 +
  63.264 +<p>Loads a properties file to a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>. </p>
  63.265 +<p>This is a convenience function that reads data from an input stream until the end of the stream is reached.</p>
  63.266 +<dl class="params"><dt>Parameters</dt><dd>
  63.267 +  <table class="params">
  63.268 +    <tr><td class="paramname">map</td><td>the map object to write the key/value-pairs to </td></tr>
  63.269 +    <tr><td class="paramname">file</td><td>the <code>FILE*</code> stream to read from </td></tr>
  63.270 +  </table>
  63.271 +  </dd>
  63.272 +</dl>
  63.273 +<dl class="section return"><dt>Returns</dt><dd>0 on success, or a non-zero value on error</dd></dl>
  63.274 +<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>
  63.275 +<dd>
  63.276 +<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>
  63.277 +
  63.278 +</div>
  63.279 +</div>
  63.280 +<a id="a44d9dd12cab3aaa0084f1c8b89405796"></a>
  63.281 +<h2 class="memtitle"><span class="permalink"><a href="#a44d9dd12cab3aaa0084f1c8b89405796">&#9670;&nbsp;</a></span>ucx_properties_new()</h2>
  63.282 +
  63.283 +<div class="memitem">
  63.284 +<div class="memproto">
  63.285 +      <table class="memname">
  63.286 +        <tr>
  63.287 +          <td class="memname"><a class="el" href="structUcxProperties.html">UcxProperties</a>* ucx_properties_new </td>
  63.288 +          <td>(</td>
  63.289 +          <td class="paramname"></td><td>)</td>
  63.290 +          <td></td>
  63.291 +        </tr>
  63.292 +      </table>
  63.293 +</div><div class="memdoc">
  63.294 +
  63.295 +<p>Constructs a new <a class="el" href="structUcxProperties.html" title="UcxProperties object for parsing properties data. ">UcxProperties</a> object. </p>
  63.296 +<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>
  63.297 +
  63.298 +</div>
  63.299 +</div>
  63.300 +<a id="a7e03bc573d45d48c538cd721e810d33c"></a>
  63.301 +<h2 class="memtitle"><span class="permalink"><a href="#a7e03bc573d45d48c538cd721e810d33c">&#9670;&nbsp;</a></span>ucx_properties_next()</h2>
  63.302 +
  63.303 +<div class="memitem">
  63.304 +<div class="memproto">
  63.305 +      <table class="memname">
  63.306 +        <tr>
  63.307 +          <td class="memname">int ucx_properties_next </td>
  63.308 +          <td>(</td>
  63.309 +          <td class="paramtype"><a class="el" href="structUcxProperties.html">UcxProperties</a> *&#160;</td>
  63.310 +          <td class="paramname"><em>prop</em>, </td>
  63.311 +        </tr>
  63.312 +        <tr>
  63.313 +          <td class="paramkey"></td>
  63.314 +          <td></td>
  63.315 +          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a> *&#160;</td>
  63.316 +          <td class="paramname"><em>name</em>, </td>
  63.317 +        </tr>
  63.318 +        <tr>
  63.319 +          <td class="paramkey"></td>
  63.320 +          <td></td>
  63.321 +          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a> *&#160;</td>
  63.322 +          <td class="paramname"><em>value</em>&#160;</td>
  63.323 +        </tr>
  63.324 +        <tr>
  63.325 +          <td></td>
  63.326 +          <td>)</td>
  63.327 +          <td></td><td></td>
  63.328 +        </tr>
  63.329 +      </table>
  63.330 +</div><div class="memdoc">
  63.331 +
  63.332 +<p>Retrieves the next key/value-pair. </p>
  63.333 +<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>
  63.334 +<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>
  63.335 +<dl class="params"><dt>Parameters</dt><dd>
  63.336 +  <table class="params">
  63.337 +    <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>
  63.338 +    <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>
  63.339 +    <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>
  63.340 +  </table>
  63.341 +  </dd>
  63.342 +</dl>
  63.343 +<dl class="section return"><dt>Returns</dt><dd>Nonzero, if a key/value-pair was successfully retrieved </dd></dl>
  63.344 +<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>
  63.345 +
  63.346 +</div>
  63.347 +</div>
  63.348 +<a id="a63c0c1b7648e675b21a1788917ff36fb"></a>
  63.349 +<h2 class="memtitle"><span class="permalink"><a href="#a63c0c1b7648e675b21a1788917ff36fb">&#9670;&nbsp;</a></span>ucx_properties_store()</h2>
  63.350 +
  63.351 +<div class="memitem">
  63.352 +<div class="memproto">
  63.353 +      <table class="memname">
  63.354 +        <tr>
  63.355 +          <td class="memname">int ucx_properties_store </td>
  63.356 +          <td>(</td>
  63.357 +          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
  63.358 +          <td class="paramname"><em>map</em>, </td>
  63.359 +        </tr>
  63.360 +        <tr>
  63.361 +          <td class="paramkey"></td>
  63.362 +          <td></td>
  63.363 +          <td class="paramtype">FILE *&#160;</td>
  63.364 +          <td class="paramname"><em>file</em>&#160;</td>
  63.365 +        </tr>
  63.366 +        <tr>
  63.367 +          <td></td>
  63.368 +          <td>)</td>
  63.369 +          <td></td><td></td>
  63.370 +        </tr>
  63.371 +      </table>
  63.372 +</div><div class="memdoc">
  63.373 +
  63.374 +<p>Stores a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a> to a file. </p>
  63.375 +<p>The key/value-pairs are written by using the following format:</p>
  63.376 +<p><code>[key] = [value]\n</code></p>
  63.377 +<dl class="params"><dt>Parameters</dt><dd>
  63.378 +  <table class="params">
  63.379 +    <tr><td class="paramname">map</td><td>the map to store </td></tr>
  63.380 +    <tr><td class="paramname">file</td><td>the <code>FILE*</code> stream to write to </td></tr>
  63.381 +  </table>
  63.382 +  </dd>
  63.383 +</dl>
  63.384 +<dl class="section return"><dt>Returns</dt><dd>0 on success, or a non-zero value on error </dd></dl>
  63.385 +
  63.386 +</div>
  63.387 +</div>
  63.388 +</div><!-- contents -->
  63.389 +<!-- start footer part -->
  63.390 +<hr class="footer"/><address class="footer"><small>
  63.391 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  63.392 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  63.393 +</a> 1.8.13
  63.394 +</small></address>
  63.395 +</body>
  63.396 +</html>
    64.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    64.2 +++ b/docs/api-2.1/properties_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
    64.3 @@ -0,0 +1,102 @@
    64.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    64.5 +<html xmlns="http://www.w3.org/1999/xhtml">
    64.6 +<head>
    64.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    64.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
    64.9 +<meta name="generator" content="Doxygen 1.8.13"/>
   64.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
   64.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/properties.h Source File</title>
   64.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
   64.13 +<script type="text/javascript" src="jquery.js"></script>
   64.14 +<script type="text/javascript" src="dynsections.js"></script>
   64.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
   64.16 +<script type="text/javascript" src="search/searchdata.js"></script>
   64.17 +<script type="text/javascript" src="search/search.js"></script>
   64.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
   64.19 +</head>
   64.20 +<body>
   64.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
   64.22 +<div id="titlearea">
   64.23 +<table cellspacing="0" cellpadding="0">
   64.24 + <tbody>
   64.25 + <tr style="height: 56px;">
   64.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
   64.27 +  <td id="projectalign" style="padding-left: 0.5em;">
   64.28 +   <div id="projectname">ucx
   64.29 +   </div>
   64.30 +   <div id="projectbrief">UAP Common Extensions</div>
   64.31 +  </td>
   64.32 + </tr>
   64.33 + </tbody>
   64.34 +</table>
   64.35 +</div>
   64.36 +<!-- end header part -->
   64.37 +<!-- Generated by Doxygen 1.8.13 -->
   64.38 +<script type="text/javascript">
   64.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
   64.40 +</script>
   64.41 +<script type="text/javascript" src="menudata.js"></script>
   64.42 +<script type="text/javascript" src="menu.js"></script>
   64.43 +<script type="text/javascript">
   64.44 +$(function() {
   64.45 +  initMenu('',true,false,'search.php','Search');
   64.46 +  $(document).ready(function() { init_search(); });
   64.47 +});
   64.48 +</script>
   64.49 +<div id="main-nav"></div>
   64.50 +<!-- window showing the filter options -->
   64.51 +<div id="MSearchSelectWindow"
   64.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
   64.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
   64.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
   64.55 +</div>
   64.56 +
   64.57 +<!-- iframe showing the search results (closed by default) -->
   64.58 +<div id="MSearchResultsWindow">
   64.59 +<iframe src="javascript:void(0)" frameborder="0" 
   64.60 +        name="MSearchResults" id="MSearchResults">
   64.61 +</iframe>
   64.62 +</div>
   64.63 +
   64.64 +<div id="nav-path" class="navpath">
   64.65 +  <ul>
   64.66 +<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>
   64.67 +</div>
   64.68 +</div><!-- top -->
   64.69 +<div class="header">
   64.70 +  <div class="headertitle">
   64.71 +<div class="title">properties.h</div>  </div>
   64.72 +</div><!--header-->
   64.73 +<div class="contents">
   64.74 +<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>
   64.75 +<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>
   64.76 +<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>
   64.77 +<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>
   64.78 +<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>
   64.79 +<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>
   64.80 +<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>
   64.81 +<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>
   64.82 +<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>
   64.83 +<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>
   64.84 +<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>
   64.85 +<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>
   64.86 +<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>
   64.87 +<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>
   64.88 +<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>
   64.89 +<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>
   64.90 +<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>
   64.91 +<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>
   64.92 +<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>
   64.93 +<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>
   64.94 +<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>
   64.95 +<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>
   64.96 +<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>
   64.97 +</div><!-- fragment --></div><!-- contents -->
   64.98 +<!-- start footer part -->
   64.99 +<hr class="footer"/><address class="footer"><small>
  64.100 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  64.101 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  64.102 +</a> 1.8.13
  64.103 +</small></address>
  64.104 +</body>
  64.105 +</html>
    65.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    65.2 +++ b/docs/api-2.1/search/all_0.html	Sat Feb 06 19:11:44 2021 +0100
    65.3 @@ -0,0 +1,26 @@
    65.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    65.5 +<html><head><title></title>
    65.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    65.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    65.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    65.9 +<script type="text/javascript" src="all_0.js"></script>
   65.10 +<script type="text/javascript" src="search.js"></script>
   65.11 +</head>
   65.12 +<body class="SRPage">
   65.13 +<div id="SRIndex">
   65.14 +<div class="SRStatus" id="Loading">Loading...</div>
   65.15 +<div id="SRResults"></div>
   65.16 +<script type="text/javascript"><!--
   65.17 +createResults();
   65.18 +--></script>
   65.19 +<div class="SRStatus" id="Searching">Searching...</div>
   65.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   65.21 +<script type="text/javascript"><!--
   65.22 +document.getElementById("Loading").style.display="none";
   65.23 +document.getElementById("NoMatches").style.display="none";
   65.24 +var searchResults = new SearchResults("searchResults");
   65.25 +searchResults.Search();
   65.26 +--></script>
   65.27 +</div>
   65.28 +</body>
   65.29 +</html>
    66.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    66.2 +++ b/docs/api-2.1/search/all_0.js	Sat Feb 06 19:11:44 2021 +0100
    66.3 @@ -0,0 +1,4 @@
    66.4 +var searchData=
    66.5 +[
    66.6 +  ['_5f_5ffunction_5f_5f',['__FUNCTION__',['../test_8h.html#a828bb1dfda1afd67ca795075903d227d',1,'test.h']]]
    66.7 +];
    67.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    67.2 +++ b/docs/api-2.1/search/all_1.html	Sat Feb 06 19:11:44 2021 +0100
    67.3 @@ -0,0 +1,26 @@
    67.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    67.5 +<html><head><title></title>
    67.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    67.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    67.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    67.9 +<script type="text/javascript" src="all_1.js"></script>
   67.10 +<script type="text/javascript" src="search.js"></script>
   67.11 +</head>
   67.12 +<body class="SRPage">
   67.13 +<div id="SRIndex">
   67.14 +<div class="SRStatus" id="Loading">Loading...</div>
   67.15 +<div id="SRResults"></div>
   67.16 +<script type="text/javascript"><!--
   67.17 +createResults();
   67.18 +--></script>
   67.19 +<div class="SRStatus" id="Searching">Searching...</div>
   67.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   67.21 +<script type="text/javascript"><!--
   67.22 +document.getElementById("Loading").style.display="none";
   67.23 +document.getElementById("NoMatches").style.display="none";
   67.24 +var searchResults = new SearchResults("searchResults");
   67.25 +searchResults.Search();
   67.26 +--></script>
   67.27 +</div>
   67.28 +</body>
   67.29 +</html>
    68.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    68.2 +++ b/docs/api-2.1/search/all_1.js	Sat Feb 06 19:11:44 2021 +0100
    68.3 @@ -0,0 +1,11 @@
    68.4 +var searchData=
    68.5 +[
    68.6 +  ['alcalloc',['alcalloc',['../allocator_8h.html#a8d71470816f88f78cb9a9686c57e1b10',1,'allocator.h']]],
    68.7 +  ['alfree',['alfree',['../allocator_8h.html#acd775785b54e97dc2b33a432c12c8fb2',1,'allocator.h']]],
    68.8 +  ['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()']]],
    68.9 +  ['allocator_2eh',['allocator.h',['../allocator_8h.html',1,'']]],
   68.10 +  ['almalloc',['almalloc',['../allocator_8h.html#ae1bc218fea8a35f4a3706f0beefcfb19',1,'allocator.h']]],
   68.11 +  ['alrealloc',['alrealloc',['../allocator_8h.html#a029ee5c9bcbb3f873571553f788c5820',1,'allocator.h']]],
   68.12 +  ['array_2eh',['array.h',['../array_8h.html',1,'']]],
   68.13 +  ['avl_2eh',['avl.h',['../avl_8h.html',1,'']]]
   68.14 +];
    69.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    69.2 +++ b/docs/api-2.1/search/all_10.html	Sat Feb 06 19:11:44 2021 +0100
    69.3 @@ -0,0 +1,26 @@
    69.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    69.5 +<html><head><title></title>
    69.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    69.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    69.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    69.9 +<script type="text/javascript" src="all_10.js"></script>
   69.10 +<script type="text/javascript" src="search.js"></script>
   69.11 +</head>
   69.12 +<body class="SRPage">
   69.13 +<div id="SRIndex">
   69.14 +<div class="SRStatus" id="Loading">Loading...</div>
   69.15 +<div id="SRResults"></div>
   69.16 +<script type="text/javascript"><!--
   69.17 +createResults();
   69.18 +--></script>
   69.19 +<div class="SRStatus" id="Searching">Searching...</div>
   69.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   69.21 +<script type="text/javascript"><!--
   69.22 +document.getElementById("Loading").style.display="none";
   69.23 +document.getElementById("NoMatches").style.display="none";
   69.24 +var searchResults = new SearchResults("searchResults");
   69.25 +searchResults.Search();
   69.26 +--></script>
   69.27 +</div>
   69.28 +</body>
   69.29 +</html>
    70.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    70.2 +++ b/docs/api-2.1/search/all_10.js	Sat Feb 06 19:11:44 2021 +0100
    70.3 @@ -0,0 +1,10 @@
    70.4 +var searchData=
    70.5 +[
    70.6 +  ['test',['test',['../structUcxTestList.html#a6022faa52e772b073141ca0a2f5a56c9',1,'UcxTestList']]],
    70.7 +  ['test_2eh',['test.h',['../test_8h.html',1,'']]],
    70.8 +  ['tests',['tests',['../structUcxTestSuite.html#a630677a70ebc2c3296704cda3196492b',1,'UcxTestSuite']]],
    70.9 +  ['tmp',['tmp',['../structUcxProperties.html#a68556d4260153f58dde44e4c365edce6',1,'UcxProperties']]],
   70.10 +  ['tmpcap',['tmpcap',['../structUcxProperties.html#a5af10131ea9f679b4ee174499f92e210',1,'UcxProperties']]],
   70.11 +  ['tmplen',['tmplen',['../structUcxProperties.html#a8a81853d5903bee2f4e1fa53fdffae6e',1,'UcxProperties']]],
   70.12 +  ['top',['top',['../structUcxStack.html#af0ff6f58edce469f17683013b86ade27',1,'UcxStack']]]
   70.13 +];
    71.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    71.2 +++ b/docs/api-2.1/search/all_11.html	Sat Feb 06 19:11:44 2021 +0100
    71.3 @@ -0,0 +1,26 @@
    71.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    71.5 +<html><head><title></title>
    71.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    71.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    71.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    71.9 +<script type="text/javascript" src="all_11.js"></script>
   71.10 +<script type="text/javascript" src="search.js"></script>
   71.11 +</head>
   71.12 +<body class="SRPage">
   71.13 +<div id="SRIndex">
   71.14 +<div class="SRStatus" id="Loading">Loading...</div>
   71.15 +<div id="SRResults"></div>
   71.16 +<script type="text/javascript"><!--
   71.17 +createResults();
   71.18 +--></script>
   71.19 +<div class="SRStatus" id="Searching">Searching...</div>
   71.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   71.21 +<script type="text/javascript"><!--
   71.22 +document.getElementById("Loading").style.display="none";
   71.23 +document.getElementById("NoMatches").style.display="none";
   71.24 +var searchResults = new SearchResults("searchResults");
   71.25 +searchResults.Search();
   71.26 +--></script>
   71.27 +</div>
   71.28 +</body>
   71.29 +</html>
    72.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    72.2 +++ b/docs/api-2.1/search/all_11.js	Sat Feb 06 19:11:44 2021 +0100
    72.3 @@ -0,0 +1,271 @@
    72.4 +var searchData=
    72.5 +[
    72.6 +  ['uap_20common_20extensions',['UAP Common Extensions',['../index.html',1,'']]],
    72.7 +  ['ucx_2eh',['ucx.h',['../ucx_8h.html',1,'']]],
    72.8 +  ['ucx_5fallocator_5fcalloc',['ucx_allocator_calloc',['../allocator_8h.html#a2c0aba4221c1ac6801f03ed799f15b12',1,'allocator.h']]],
    72.9 +  ['ucx_5fallocator_5fdefault',['UCX_ALLOCATOR_DEFAULT',['../allocator_8h.html#a1283a8f875f90a7af3aba5e031fc2e3f',1,'allocator.h']]],
   72.10 +  ['ucx_5fallocator_5ffree',['ucx_allocator_free',['../allocator_8h.html#aaf2387ddaddd8ab4b267e6b00e5d6f7e',1,'allocator.h']]],
   72.11 +  ['ucx_5fallocator_5fmalloc',['ucx_allocator_malloc',['../allocator_8h.html#a29f0f6a23a70db3b60635cd6dc384473',1,'allocator.h']]],
   72.12 +  ['ucx_5fallocator_5frealloc',['ucx_allocator_realloc',['../allocator_8h.html#a6d7cf038a806e327c5da37321d04e426',1,'allocator.h']]],
   72.13 +  ['ucx_5farray_5fappend_5ffrom',['ucx_array_append_from',['../array_8h.html#aea01731ad94ea73c0c8fb1d1b7a35fcf',1,'array.c']]],
   72.14 +  ['ucx_5farray_5fat',['ucx_array_at',['../array_8h.html#aa698085fd1a8b70d6b709999c51b49e8',1,'array.c']]],
   72.15 +  ['ucx_5farray_5fclone',['ucx_array_clone',['../array_8h.html#a4a8c273370e4a3a3e2624e364f5ab410',1,'array.c']]],
   72.16 +  ['ucx_5farray_5fconcat',['ucx_array_concat',['../array_8h.html#aa5a0bf3d3f0df6406beb0e569021cc28',1,'array.c']]],
   72.17 +  ['ucx_5farray_5fcontains',['ucx_array_contains',['../array_8h.html#a5241058cd2329147bc5b1593ae7e51dc',1,'array.c']]],
   72.18 +  ['ucx_5farray_5fdestroy',['ucx_array_destroy',['../array_8h.html#a8e83681d8d5d8cddbf10f63ce5be4c10',1,'array.c']]],
   72.19 +  ['ucx_5farray_5fequals',['ucx_array_equals',['../array_8h.html#a43292b448adb1741677aa8c578bcc201',1,'array.c']]],
   72.20 +  ['ucx_5farray_5ffind',['ucx_array_find',['../array_8h.html#ae7bdbed94afee9b20b38b95e3ab470f0',1,'array.c']]],
   72.21 +  ['ucx_5farray_5ffree',['ucx_array_free',['../array_8h.html#ac01ee914468a16f470bf3071fffbe438',1,'array.c']]],
   72.22 +  ['ucx_5farray_5fgrow',['ucx_array_grow',['../array_8h.html#ab0cbf243824aaebee48277315e03afce',1,'array.c']]],
   72.23 +  ['ucx_5farray_5finit',['ucx_array_init',['../array_8h.html#ad921e85c28ffae32230777a53c5037e5',1,'array.c']]],
   72.24 +  ['ucx_5farray_5finit_5fa',['ucx_array_init_a',['../array_8h.html#a2451e61ebb15a7ba1c1319267ba75b8c',1,'array.c']]],
   72.25 +  ['ucx_5farray_5fnew',['ucx_array_new',['../array_8h.html#a994a2fbf1c33a3833e2a70cd9a4352b7',1,'array.c']]],
   72.26 +  ['ucx_5farray_5fnew_5fa',['ucx_array_new_a',['../array_8h.html#a177170258c215eb2e4f5a32e59f0cb1b',1,'array.c']]],
   72.27 +  ['ucx_5farray_5fprepend_5ffrom',['ucx_array_prepend_from',['../array_8h.html#a95b52acc2193b5c33cf0eaa4f2082477',1,'array.c']]],
   72.28 +  ['ucx_5farray_5fremove',['ucx_array_remove',['../array_8h.html#aa45eac6b697f83adac81c0860cf306b8',1,'array.c']]],
   72.29 +  ['ucx_5farray_5fremove_5ffast',['ucx_array_remove_fast',['../array_8h.html#a548d81b07612bae3ba8c4c4b49104b8e',1,'array.c']]],
   72.30 +  ['ucx_5farray_5freserve',['ucx_array_reserve',['../array_8h.html#a1c3bf8433c1de3c933f3854ab297fe1d',1,'array.c']]],
   72.31 +  ['ucx_5farray_5fresize',['ucx_array_resize',['../array_8h.html#a27762e7c06a6c781015e3c8ceeee0ce3',1,'array.c']]],
   72.32 +  ['ucx_5farray_5fset_5ffrom',['ucx_array_set_from',['../array_8h.html#a1bb545d065358d265d80d815ba382a28',1,'array.c']]],
   72.33 +  ['ucx_5farray_5fshrink',['ucx_array_shrink',['../array_8h.html#a2daf50e80aee9bccebee876a7efd2dfc',1,'array.c']]],
   72.34 +  ['ucx_5farray_5fsort',['ucx_array_sort',['../array_8h.html#add773514569b872a6624381b4b6af52c',1,'array.c']]],
   72.35 +  ['ucx_5farray_5futil_5fset',['ucx_array_util_set',['../array_8h.html#a1d959c29af3125bdd37cde3a554e729c',1,'array.h']]],
   72.36 +  ['ucx_5farray_5futil_5fset_5fa',['ucx_array_util_set_a',['../array_8h.html#ad0a8d76980cf1c1910e64a245803fb9a',1,'array.c']]],
   72.37 +  ['ucx_5farray_5futil_5fsetptr',['ucx_array_util_setptr',['../array_8h.html#a59a5b342965e790945f9c7a3f86b99f9',1,'array.h']]],
   72.38 +  ['ucx_5farray_5futil_5fsetptr_5fa',['ucx_array_util_setptr_a',['../array_8h.html#ad708b333c0c1b02c998309a58ea65e31',1,'array.c']]],
   72.39 +  ['ucx_5fasprintf',['ucx_asprintf',['../utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5',1,'utils.c']]],
   72.40 +  ['ucx_5favl_5fcount',['ucx_avl_count',['../avl_8h.html#a92c1d41c2b22fe4a029a486ab2153e35',1,'avl.c']]],
   72.41 +  ['ucx_5favl_5fdefault_5fnew',['ucx_avl_default_new',['../avl_8h.html#ac2886d4b79b48c9fabf6408873f84cd2',1,'avl.h']]],
   72.42 +  ['ucx_5favl_5ffind',['ucx_avl_find',['../avl_8h.html#a51770e1614b28d7d22dea096c3704f83',1,'avl.c']]],
   72.43 +  ['ucx_5favl_5ffind_5fclosest',['UCX_AVL_FIND_CLOSEST',['../avl_8h.html#af16f24d74fd6af0154de041566c6603b',1,'avl.h']]],
   72.44 +  ['ucx_5favl_5ffind_5fexact',['UCX_AVL_FIND_EXACT',['../avl_8h.html#aaaf4a6f6f661cda7791db239212285d9',1,'avl.h']]],
   72.45 +  ['ucx_5favl_5ffind_5flower_5fbounded',['UCX_AVL_FIND_LOWER_BOUNDED',['../avl_8h.html#abd2446d544d5412b6997ee8a17bd368c',1,'avl.h']]],
   72.46 +  ['ucx_5favl_5ffind_5fnode',['ucx_avl_find_node',['../avl_8h.html#a664986f64d6865605199fbff06e19cd5',1,'avl.c']]],
   72.47 +  ['ucx_5favl_5ffind_5fupper_5fbounded',['UCX_AVL_FIND_UPPER_BOUNDED',['../avl_8h.html#ac74ee7649c1e206b08b31f37dd68ca5e',1,'avl.h']]],
   72.48 +  ['ucx_5favl_5ffree',['ucx_avl_free',['../avl_8h.html#a2f92db538f25fce908d2cb3e5590944c',1,'avl.c']]],
   72.49 +  ['ucx_5favl_5ffree_5fcontent',['ucx_avl_free_content',['../avl_8h.html#a31ad7fb196ca211f1fc39f4e15f72279',1,'avl.c']]],
   72.50 +  ['ucx_5favl_5fget',['ucx_avl_get',['../avl_8h.html#adbcf7ceb3f014a30c7214f7304519efe',1,'avl.c']]],
   72.51 +  ['ucx_5favl_5fget_5fnode',['ucx_avl_get_node',['../avl_8h.html#acf42da9a4168e47dc10b4ba0d27ceb4e',1,'avl.c']]],
   72.52 +  ['ucx_5favl_5fnew',['ucx_avl_new',['../avl_8h.html#a11b043d65a11b7092d5d98b298e5ede3',1,'avl.c']]],
   72.53 +  ['ucx_5favl_5fnew_5fa',['ucx_avl_new_a',['../avl_8h.html#af0f868d67e9dc08b4867c02a06c23ee2',1,'avl.c']]],
   72.54 +  ['ucx_5favl_5fpred',['ucx_avl_pred',['../avl_8h.html#a0e739aeb66dda6a6a3f6eb51b50cf346',1,'avl.c']]],
   72.55 +  ['ucx_5favl_5fput',['ucx_avl_put',['../avl_8h.html#aec401fab4a24a7edffa734f9baf88577',1,'avl.c']]],
   72.56 +  ['ucx_5favl_5fput_5fs',['ucx_avl_put_s',['../avl_8h.html#a32cf8955cc0226a82bacfc7b76d6474c',1,'avl.c']]],
   72.57 +  ['ucx_5favl_5fremove',['ucx_avl_remove',['../avl_8h.html#a1d821119c805d7fbb7e424bc3effeba9',1,'avl.c']]],
   72.58 +  ['ucx_5favl_5fremove_5fnode',['ucx_avl_remove_node',['../avl_8h.html#a9a792b7d9e58073deef74a341f8bc720',1,'avl.c']]],
   72.59 +  ['ucx_5favl_5fremove_5fs',['ucx_avl_remove_s',['../avl_8h.html#a01aeeecd6415f0cc2b623486eb28f254',1,'avl.c']]],
   72.60 +  ['ucx_5favl_5fsucc',['ucx_avl_succ',['../avl_8h.html#aab1ad9b027ff5e50671aa0ee84e2d541',1,'avl.c']]],
   72.61 +  ['ucx_5fbprintf',['ucx_bprintf',['../utils_8h.html#a9d7d65a420f026fcb6982803d5120519',1,'utils.h']]],
   72.62 +  ['ucx_5fbuffer_5fautoextend',['UCX_BUFFER_AUTOEXTEND',['../buffer_8h.html#a05f9565f2d04399168c3b1c152a632be',1,'buffer.h']]],
   72.63 +  ['ucx_5fbuffer_5fautofree',['UCX_BUFFER_AUTOFREE',['../buffer_8h.html#a8bab11ad8a76719228b9ee91e2e45535',1,'buffer.h']]],
   72.64 +  ['ucx_5fbuffer_5fclear',['ucx_buffer_clear',['../buffer_8h.html#a374abd5aabfcc3ee0777a79d5fe651ab',1,'buffer.h']]],
   72.65 +  ['ucx_5fbuffer_5fclone',['ucx_buffer_clone',['../buffer_8h.html#a828353846428c2c2f695f9938f059e52',1,'buffer.h']]],
   72.66 +  ['ucx_5fbuffer_5fdefault',['UCX_BUFFER_DEFAULT',['../buffer_8h.html#acc77c8ed7b26854f555d4a5d11e49ea2',1,'buffer.h']]],
   72.67 +  ['ucx_5fbuffer_5feof',['ucx_buffer_eof',['../buffer_8h.html#abad7fd9ad5061224c780b8d1d4c55f09',1,'buffer.c']]],
   72.68 +  ['ucx_5fbuffer_5fextend',['ucx_buffer_extend',['../buffer_8h.html#afaf97d2cd7e9faad79a9d35fe33e30c6',1,'buffer.c']]],
   72.69 +  ['ucx_5fbuffer_5fextract',['ucx_buffer_extract',['../buffer_8h.html#a33fa7bb35fe08bbb3542f227514332ef',1,'buffer.c']]],
   72.70 +  ['ucx_5fbuffer_5ffree',['ucx_buffer_free',['../buffer_8h.html#a2af8646d8905c22c7322e7540b0440af',1,'buffer.c']]],
   72.71 +  ['ucx_5fbuffer_5fgetc',['ucx_buffer_getc',['../buffer_8h.html#a396339022159ce4ca6d069de9f9209b0',1,'buffer.c']]],
   72.72 +  ['ucx_5fbuffer_5fnew',['ucx_buffer_new',['../buffer_8h.html#aacea876d692193ec6f859ce98da7351c',1,'buffer.c']]],
   72.73 +  ['ucx_5fbuffer_5fputc',['ucx_buffer_putc',['../buffer_8h.html#a7d6f01b9d631b0123475dfb98fb849ac',1,'buffer.c']]],
   72.74 +  ['ucx_5fbuffer_5fputs',['ucx_buffer_puts',['../buffer_8h.html#af1d4b478e04b3ae0bf30e7c2ea964ea2',1,'buffer.c']]],
   72.75 +  ['ucx_5fbuffer_5fread',['ucx_buffer_read',['../buffer_8h.html#ae5c3430759f0059547b35d5a254d4da5',1,'buffer.c']]],
   72.76 +  ['ucx_5fbuffer_5fseek',['ucx_buffer_seek',['../buffer_8h.html#a47d98482662073c74f35deb0957d15d1',1,'buffer.c']]],
   72.77 +  ['ucx_5fbuffer_5fshift',['ucx_buffer_shift',['../buffer_8h.html#a12a0c6a2379ef080043e6286bb8bad69',1,'buffer.c']]],
   72.78 +  ['ucx_5fbuffer_5fshift_5fleft',['ucx_buffer_shift_left',['../buffer_8h.html#a20431dd0ed6a6fe9f15333bd72afe4db',1,'buffer.c']]],
   72.79 +  ['ucx_5fbuffer_5fshift_5fright',['ucx_buffer_shift_right',['../buffer_8h.html#a4fa10b6471495547eb981248fd4f1bc2',1,'buffer.c']]],
   72.80 +  ['ucx_5fbuffer_5fto_5fsstr',['ucx_buffer_to_sstr',['../buffer_8h.html#a0f4b64f1b3a74c4f6c5d9409d6b6086a',1,'buffer.h']]],
   72.81 +  ['ucx_5fbuffer_5fwrite',['ucx_buffer_write',['../buffer_8h.html#af8aacc7401814392b58c1b7b81bffc05',1,'buffer.c']]],
   72.82 +  ['ucx_5fcmp_5fdouble',['ucx_cmp_double',['../utils_8h.html#ab804b7c27d0bfcd7bf3a3583140825b6',1,'utils.c']]],
   72.83 +  ['ucx_5fcmp_5ffloat',['ucx_cmp_float',['../utils_8h.html#ad1196b561bcdad76c393885819769a97',1,'utils.c']]],
   72.84 +  ['ucx_5fcmp_5fint',['ucx_cmp_int',['../utils_8h.html#a8ce7e11e6b3deafe89a32a091fde7f16',1,'utils.c']]],
   72.85 +  ['ucx_5fcmp_5fint16',['ucx_cmp_int16',['../utils_8h.html#aa29e6e559946375e34113e34e0b0bd0d',1,'utils.c']]],
   72.86 +  ['ucx_5fcmp_5fint32',['ucx_cmp_int32',['../utils_8h.html#a858b2ac443fb202643b71f6a7e9218dd',1,'utils.c']]],
   72.87 +  ['ucx_5fcmp_5fint64',['ucx_cmp_int64',['../utils_8h.html#a54701aea6a89fed1402dfb0bf56bc7f6',1,'utils.c']]],
   72.88 +  ['ucx_5fcmp_5flongint',['ucx_cmp_longint',['../utils_8h.html#aeb57a2b9a6aaa0460c7a6bec29accf2c',1,'utils.c']]],
   72.89 +  ['ucx_5fcmp_5flonglong',['ucx_cmp_longlong',['../utils_8h.html#a366b57def20f86a41eaedf575eea5375',1,'utils.c']]],
   72.90 +  ['ucx_5fcmp_5fmem',['ucx_cmp_mem',['../utils_8h.html#aff7d2bcded71196831a8c0664333f8e7',1,'utils.c']]],
   72.91 +  ['ucx_5fcmp_5fptr',['ucx_cmp_ptr',['../utils_8h.html#aa174d539de3ea59be4f9640f17ce53d8',1,'utils.c']]],
   72.92 +  ['ucx_5fcmp_5fsstr',['ucx_cmp_sstr',['../utils_8h.html#adee0739589166d272f8cb7c23aabf8ba',1,'utils.c']]],
   72.93 +  ['ucx_5fcmp_5fstr',['ucx_cmp_str',['../utils_8h.html#aa6a37b9d172b6a5b2803d152f9e1b258',1,'utils.c']]],
   72.94 +  ['ucx_5fcmp_5fstrn',['ucx_cmp_strn',['../utils_8h.html#ac6b354a878f551a3a5b20a167db3f308',1,'utils.c']]],
   72.95 +  ['ucx_5fcmp_5fuint',['ucx_cmp_uint',['../utils_8h.html#abd83a5da91c3dd026a6931bd80c12f1e',1,'utils.c']]],
   72.96 +  ['ucx_5fcmp_5fuint16',['ucx_cmp_uint16',['../utils_8h.html#acde5366437e886a459b7468f7a9e11f0',1,'utils.c']]],
   72.97 +  ['ucx_5fcmp_5fuint32',['ucx_cmp_uint32',['../utils_8h.html#a5879d1722330355914d8c9146fa549d3',1,'utils.c']]],
   72.98 +  ['ucx_5fcmp_5fuint64',['ucx_cmp_uint64',['../utils_8h.html#a1572a78b5b42f7151a5b2a5a7283d62d',1,'utils.c']]],
   72.99 +  ['ucx_5fcmp_5fulongint',['ucx_cmp_ulongint',['../utils_8h.html#a3f3cbae2594d6f722bae29acb0408a24',1,'utils.c']]],
  72.100 +  ['ucx_5fcmp_5fulonglong',['ucx_cmp_ulonglong',['../utils_8h.html#a6acfc359421f21f9a042a654ff7faac5',1,'utils.c']]],
  72.101 +  ['ucx_5fdefault_5fallocator',['ucx_default_allocator',['../allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf',1,'allocator.c']]],
  72.102 +  ['ucx_5fdefault_5fcalloc',['ucx_default_calloc',['../allocator_8h.html#a3a0bfdd13d887012309c459b339f338f',1,'allocator.c']]],
  72.103 +  ['ucx_5fdefault_5ffree',['ucx_default_free',['../allocator_8h.html#a646d83aaaadfe33ae414c0fad8bfc52a',1,'allocator.c']]],
  72.104 +  ['ucx_5fdefault_5fmalloc',['ucx_default_malloc',['../allocator_8h.html#a96403ebf3d2312d95f2fe7627a1cdbc0',1,'allocator.c']]],
  72.105 +  ['ucx_5fdefault_5frealloc',['ucx_default_realloc',['../allocator_8h.html#a47cfc8af626a86fcb93a2b14b90498ed',1,'allocator.c']]],
  72.106 +  ['ucx_5fdestructor',['ucx_destructor',['../ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3',1,'ucx.h']]],
  72.107 +  ['ucx_5fdist_5fint',['ucx_dist_int',['../utils_8h.html#a4ab6753739d56c09cdf6079fdcabf7c6',1,'utils.c']]],
  72.108 +  ['ucx_5fdist_5fint16',['ucx_dist_int16',['../utils_8h.html#a81fb8434b70ca11bf2c14abfa21d16a9',1,'utils.c']]],
  72.109 +  ['ucx_5fdist_5fint32',['ucx_dist_int32',['../utils_8h.html#ab4a659cc46096f0490c1dafa57726476',1,'utils.c']]],
  72.110 +  ['ucx_5fdist_5fint64',['ucx_dist_int64',['../utils_8h.html#a54e7d06585bad3a899befc4e9c13853f',1,'utils.c']]],
  72.111 +  ['ucx_5fdist_5flongint',['ucx_dist_longint',['../utils_8h.html#a43e73d288b1553a0078bf4c98dd341f5',1,'utils.c']]],
  72.112 +  ['ucx_5fdist_5flonglong',['ucx_dist_longlong',['../utils_8h.html#a306778414a2427951ea263be92368627',1,'utils.c']]],
  72.113 +  ['ucx_5fdist_5fuint',['ucx_dist_uint',['../utils_8h.html#a37b7d471ca1679992afc11a0deda45f4',1,'utils.c']]],
  72.114 +  ['ucx_5fdist_5fuint16',['ucx_dist_uint16',['../utils_8h.html#a66e00a0703cbcde050ec922578e2f080',1,'utils.c']]],
  72.115 +  ['ucx_5fdist_5fuint32',['ucx_dist_uint32',['../utils_8h.html#add2b5c5507caba59d894b84e056b079b',1,'utils.c']]],
  72.116 +  ['ucx_5fdist_5fuint64',['ucx_dist_uint64',['../utils_8h.html#a3ba75e2e0b2479eef2b22fb219b42da7',1,'utils.c']]],
  72.117 +  ['ucx_5fdist_5fulongint',['ucx_dist_ulongint',['../utils_8h.html#abb13476228d0c16bfaba08469adbae2d',1,'utils.c']]],
  72.118 +  ['ucx_5fdist_5fulonglong',['ucx_dist_ulonglong',['../utils_8h.html#a59a5859272cb4b43cbdd58208c41e32b',1,'utils.c']]],
  72.119 +  ['ucx_5fforeach',['UCX_FOREACH',['../list_8h.html#a4b143b6526a410aa4d22cb3bb9365d70',1,'list.h']]],
  72.120 +  ['ucx_5ffprintf',['ucx_fprintf',['../utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a',1,'utils.c']]],
  72.121 +  ['ucx_5fhash',['ucx_hash',['../map_8h.html#aea3be97254c05595d986ef6a9faae87b',1,'map.c']]],
  72.122 +  ['ucx_5fkey',['ucx_key',['../map_8h.html#a3e540bb46b8ee19789aed63fd8919200',1,'map.c']]],
  72.123 +  ['ucx_5flist_5fappend',['ucx_list_append',['../list_8h.html#a00c122c8a26d35b60676939df4161621',1,'list.c']]],
  72.124 +  ['ucx_5flist_5fappend_5fa',['ucx_list_append_a',['../list_8h.html#adf3b3e2e0ff977d8928671d6bd82fc60',1,'list.c']]],
  72.125 +  ['ucx_5flist_5fclone',['ucx_list_clone',['../list_8h.html#ae7054a41c289b24e6caf5cb07ac850ed',1,'list.c']]],
  72.126 +  ['ucx_5flist_5fclone_5fa',['ucx_list_clone_a',['../list_8h.html#a08ca1ba0d2e82258b0408714c1f4c425',1,'list.c']]],
  72.127 +  ['ucx_5flist_5fconcat',['ucx_list_concat',['../list_8h.html#a77163a0cc82fae52bec26c8c0c3674d9',1,'list.c']]],
  72.128 +  ['ucx_5flist_5fcontains',['ucx_list_contains',['../list_8h.html#a8b0fa051fcfe12e1a82cca1087973852',1,'list.c']]],
  72.129 +  ['ucx_5flist_5fdifference',['ucx_list_difference',['../list_8h.html#a6c5db5d1d11ad28b6fe1a80ee1c1e449',1,'list.c']]],
  72.130 +  ['ucx_5flist_5fdifference_5fa',['ucx_list_difference_a',['../list_8h.html#a4a2a2fc5cc41073c516db6235bbc51d5',1,'list.c']]],
  72.131 +  ['ucx_5flist_5fequals',['ucx_list_equals',['../list_8h.html#adc435447cecf885bc63d232191085bbe',1,'list.c']]],
  72.132 +  ['ucx_5flist_5ffind',['ucx_list_find',['../list_8h.html#a9b3b6842d3be572e06a7f519e198cb83',1,'list.c']]],
  72.133 +  ['ucx_5flist_5ffirst',['ucx_list_first',['../list_8h.html#a6aa0e34ebc5f0dca6f52d0f7626b4bd5',1,'list.c']]],
  72.134 +  ['ucx_5flist_5ffree',['ucx_list_free',['../list_8h.html#a1a0fa2c5b1e478a96da19b0c3f013668',1,'list.c']]],
  72.135 +  ['ucx_5flist_5ffree_5fa',['ucx_list_free_a',['../list_8h.html#a944e11f76c38767cd1100d72a4e3b25b',1,'list.c']]],
  72.136 +  ['ucx_5flist_5ffree_5fcontent',['ucx_list_free_content',['../list_8h.html#a4ba6c96642f72ea046cc22627c72979c',1,'list.c']]],
  72.137 +  ['ucx_5flist_5fget',['ucx_list_get',['../list_8h.html#a2509ffe19bce6a8708c77f89480c75fb',1,'list.c']]],
  72.138 +  ['ucx_5flist_5findexof',['ucx_list_indexof',['../list_8h.html#ae2ff2974812ca185870f80bc4ed9337e',1,'list.c']]],
  72.139 +  ['ucx_5flist_5fintersection',['ucx_list_intersection',['../list_8h.html#a259f9b754978aeca23dfabba16e20f39',1,'list.c']]],
  72.140 +  ['ucx_5flist_5fintersection_5fa',['ucx_list_intersection_a',['../list_8h.html#a1d0b00514dbb81ba6270b58da0c5b9a8',1,'list.c']]],
  72.141 +  ['ucx_5flist_5flast',['ucx_list_last',['../list_8h.html#add5ec40c5006e29c629d23c2eb5a6553',1,'list.c']]],
  72.142 +  ['ucx_5flist_5fprepend',['ucx_list_prepend',['../list_8h.html#a8fcb68e4556395b15180eec2d0b77aa4',1,'list.c']]],
  72.143 +  ['ucx_5flist_5fprepend_5fa',['ucx_list_prepend_a',['../list_8h.html#a54654e6dc60e1c3de9e886c150e404ec',1,'list.c']]],
  72.144 +  ['ucx_5flist_5fremove',['ucx_list_remove',['../list_8h.html#a410cb3e8260037ba56c72d14b899b468',1,'list.c']]],
  72.145 +  ['ucx_5flist_5fremove_5fa',['ucx_list_remove_a',['../list_8h.html#aca687b7c4e7170175f447e549125aa52',1,'list.c']]],
  72.146 +  ['ucx_5flist_5fsize',['ucx_list_size',['../list_8h.html#ae88001cc8ae40b946560f31434abed8f',1,'list.c']]],
  72.147 +  ['ucx_5flist_5fsort',['ucx_list_sort',['../list_8h.html#ac74962d9bd7cfc9d3e2e09651469377b',1,'list.c']]],
  72.148 +  ['ucx_5flist_5funion',['ucx_list_union',['../list_8h.html#a94ecdb0cea1633ad7074f027fa8485fa',1,'list.c']]],
  72.149 +  ['ucx_5flist_5funion_5fa',['ucx_list_union_a',['../list_8h.html#a65b4355536f4ebc4130211b46469f4c1',1,'list.c']]],
  72.150 +  ['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']]],
  72.151 +  ['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']]],
  72.152 +  ['ucx_5flogger_5ffree',['ucx_logger_free',['../logging_8h.html#ac4697b784e01ec990d2acea192e21658',1,'logging.c']]],
  72.153 +  ['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']]],
  72.154 +  ['ucx_5flogger_5flevel',['UCX_LOGGER_LEVEL',['../logging_8h.html#aee18bc20e58ffb69910121512c350839',1,'logging.h']]],
  72.155 +  ['ucx_5flogger_5flog',['ucx_logger_log',['../logging_8h.html#aa0245325031d95799b28def177fd14ec',1,'logging.h']]],
  72.156 +  ['ucx_5flogger_5flogf',['ucx_logger_logf',['../logging_8h.html#ac337e5d02ebea565012d4c11bd643801',1,'logging.c']]],
  72.157 +  ['ucx_5flogger_5fnew',['ucx_logger_new',['../logging_8h.html#ac560f8517d2172794c9d2691735ec48c',1,'logging.c']]],
  72.158 +  ['ucx_5flogger_5fregister_5flevel',['ucx_logger_register_level',['../logging_8h.html#a5cffc19502c4c90bfb3bd3bbcd18170a',1,'logging.h']]],
  72.159 +  ['ucx_5flogger_5fsource',['UCX_LOGGER_SOURCE',['../logging_8h.html#a0e0d72b12616c1e49ff8834eaf4cb8a2',1,'logging.h']]],
  72.160 +  ['ucx_5flogger_5ftimestamp',['UCX_LOGGER_TIMESTAMP',['../logging_8h.html#a38607008268b4f776ee500fb95d2e823',1,'logging.h']]],
  72.161 +  ['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']]],
  72.162 +  ['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']]],
  72.163 +  ['ucx_5fmap_5fclear',['ucx_map_clear',['../map_8h.html#a285e90e40681c6d9631c935dda0967f2',1,'map.c']]],
  72.164 +  ['ucx_5fmap_5fclone',['ucx_map_clone',['../map_8h.html#a62c6c30cbb0d824ba710f5030ff9a4e4',1,'map.c']]],
  72.165 +  ['ucx_5fmap_5fclone_5fa',['ucx_map_clone_a',['../map_8h.html#a9aea9103703d5c168420bb6bf85549ea',1,'map.c']]],
  72.166 +  ['ucx_5fmap_5fcopy',['ucx_map_copy',['../map_8h.html#adfeb2d61003fd2896bcfdc9a57f36425',1,'map.c']]],
  72.167 +  ['ucx_5fmap_5fcstr_5fget',['ucx_map_cstr_get',['../map_8h.html#a64e1fb55498fa502dd2ed8ed69062cdd',1,'map.h']]],
  72.168 +  ['ucx_5fmap_5fcstr_5fput',['ucx_map_cstr_put',['../map_8h.html#ad9356b01425b934ab237b52339ac0cc3',1,'map.h']]],
  72.169 +  ['ucx_5fmap_5fcstr_5fremove',['ucx_map_cstr_remove',['../map_8h.html#a9c4405a5a75ecf64e2ef3d0c6501a9fe',1,'map.h']]],
  72.170 +  ['ucx_5fmap_5fdifference',['ucx_map_difference',['../map_8h.html#a774fcff87d1e58b6c5af77dd19a8c3dc',1,'map.c']]],
  72.171 +  ['ucx_5fmap_5fdifference_5fa',['ucx_map_difference_a',['../map_8h.html#ad0ba103494247d798ac3037c50fc8831',1,'map.c']]],
  72.172 +  ['ucx_5fmap_5fforeach',['UCX_MAP_FOREACH',['../map_8h.html#a940896c4aa1b13e54c55c04c3efc186b',1,'map.h']]],
  72.173 +  ['ucx_5fmap_5ffree',['ucx_map_free',['../map_8h.html#abe3d9688e4224bf7bb962abf25ff8c2e',1,'map.c']]],
  72.174 +  ['ucx_5fmap_5ffree_5fcontent',['ucx_map_free_content',['../map_8h.html#a750f3d9d83e2f3788a14c17a9d160618',1,'map.c']]],
  72.175 +  ['ucx_5fmap_5fget',['ucx_map_get',['../map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6',1,'map.c']]],
  72.176 +  ['ucx_5fmap_5fint_5fget',['ucx_map_int_get',['../map_8h.html#aa1681bd2178553cd092fd24c4d681d3c',1,'map.h']]],
  72.177 +  ['ucx_5fmap_5fint_5fput',['ucx_map_int_put',['../map_8h.html#aaa30af79b4068c923895619e83f44367',1,'map.h']]],
  72.178 +  ['ucx_5fmap_5fint_5fremove',['ucx_map_int_remove',['../map_8h.html#aa767958b5468737755c09f7185b1770c',1,'map.h']]],
  72.179 +  ['ucx_5fmap_5fintersection',['ucx_map_intersection',['../map_8h.html#aa594d7a5afebc3bed6bb265348cf6b0d',1,'map.c']]],
  72.180 +  ['ucx_5fmap_5fintersection_5fa',['ucx_map_intersection_a',['../map_8h.html#a169e0470a20484dd76425fdf77e3651e',1,'map.c']]],
  72.181 +  ['ucx_5fmap_5fiter_5fnext',['ucx_map_iter_next',['../map_8h.html#aceb8675abf44860b4bbc301bbada5b91',1,'map.c']]],
  72.182 +  ['ucx_5fmap_5fiterator',['ucx_map_iterator',['../map_8h.html#a9150e9c64fdf4dfcc2cad106b91aa110',1,'map.c']]],
  72.183 +  ['ucx_5fmap_5fnew',['ucx_map_new',['../map_8h.html#a79f31de8b93814493759dbc8b940cf0c',1,'map.c']]],
  72.184 +  ['ucx_5fmap_5fnew_5fa',['ucx_map_new_a',['../map_8h.html#aed508a94c66cc15372503c64b70eb03e',1,'map.c']]],
  72.185 +  ['ucx_5fmap_5fput',['ucx_map_put',['../map_8h.html#ac04a08b604217070254d4c58f0e82498',1,'map.c']]],
  72.186 +  ['ucx_5fmap_5frehash',['ucx_map_rehash',['../map_8h.html#a174bce9fad554dd92b8da354e0d32512',1,'map.c']]],
  72.187 +  ['ucx_5fmap_5fremove',['ucx_map_remove',['../map_8h.html#a17248a4888eb8f9ae18be522d64632aa',1,'map.c']]],
  72.188 +  ['ucx_5fmap_5fsstr_5fget',['ucx_map_sstr_get',['../map_8h.html#a14d385f6b7f371f0507861cabd2eab4e',1,'map.h']]],
  72.189 +  ['ucx_5fmap_5fsstr_5fput',['ucx_map_sstr_put',['../map_8h.html#ac26a8615bfc8f47ee9eaceb47645f98e',1,'map.h']]],
  72.190 +  ['ucx_5fmap_5fsstr_5fremove',['ucx_map_sstr_remove',['../map_8h.html#a48700ea86fadb9ea54d13010f9124df2',1,'map.h']]],
  72.191 +  ['ucx_5fmap_5funion',['ucx_map_union',['../map_8h.html#a3f65978c481af7f637cad021d93522d5',1,'map.c']]],
  72.192 +  ['ucx_5fmap_5funion_5fa',['ucx_map_union_a',['../map_8h.html#ab6370c3fa8113fdad593ce4b0460c9c6',1,'map.c']]],
  72.193 +  ['ucx_5fmemchunk',['ucx_memchunk',['../structucx__memchunk.html',1,'']]],
  72.194 +  ['ucx_5fmemcpy',['ucx_memcpy',['../utils_8h.html#ab2e184e6a744941aab6b8058116baf30',1,'utils.c']]],
  72.195 +  ['ucx_5fmempool_5fcalloc',['ucx_mempool_calloc',['../mempool_8h.html#a4b9142011824ae24f00fabe128417d69',1,'mempool.c']]],
  72.196 +  ['ucx_5fmempool_5fchcap',['ucx_mempool_chcap',['../mempool_8h.html#aaf75b5016098723a9280531ccc3a6d77',1,'mempool.c']]],
  72.197 +  ['ucx_5fmempool_5fdestroy',['ucx_mempool_destroy',['../mempool_8h.html#af096378da7e9bfbed3088497cf4c15bf',1,'mempool.c']]],
  72.198 +  ['ucx_5fmempool_5ffree',['ucx_mempool_free',['../mempool_8h.html#aefa26e3015f5aefadbfc74221bd246ac',1,'mempool.c']]],
  72.199 +  ['ucx_5fmempool_5fmalloc',['ucx_mempool_malloc',['../mempool_8h.html#a2ae492b8f2878ccc9837ac213dced11e',1,'mempool.c']]],
  72.200 +  ['ucx_5fmempool_5fnew',['ucx_mempool_new',['../mempool_8h.html#ad71cb8c3b6fdb30360376a8b372ef22a',1,'mempool.c']]],
  72.201 +  ['ucx_5fmempool_5fnew_5fdefault',['ucx_mempool_new_default',['../mempool_8h.html#a49f7bd1da5ac201d0cf54dc0f0d82dd2',1,'mempool.h']]],
  72.202 +  ['ucx_5fmempool_5frealloc',['ucx_mempool_realloc',['../mempool_8h.html#a660ef42520ed6737c2e77aae18e3a7a4',1,'mempool.c']]],
  72.203 +  ['ucx_5fmempool_5freg_5fdestr',['ucx_mempool_reg_destr',['../mempool_8h.html#af47b6b7c40f8f263dc28cc9a4e77b27c',1,'mempool.c']]],
  72.204 +  ['ucx_5fmempool_5fset_5fdestr',['ucx_mempool_set_destr',['../mempool_8h.html#adb788e7ec24cd7dbdea6381539c549f2',1,'mempool.c']]],
  72.205 +  ['ucx_5fproperties2map',['ucx_properties2map',['../properties_8h.html#a5c7ff8bc3139960a3f3dc92072b742f3',1,'properties.c']]],
  72.206 +  ['ucx_5fproperties_5ffill',['ucx_properties_fill',['../properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d',1,'properties.c']]],
  72.207 +  ['ucx_5fproperties_5ffree',['ucx_properties_free',['../properties_8h.html#a38a2fe7bb2986bd87c7e69356ab05c05',1,'properties.c']]],
  72.208 +  ['ucx_5fproperties_5fload',['ucx_properties_load',['../properties_8h.html#ae1b600f839a6b2278b68fc314981a8a3',1,'properties.c']]],
  72.209 +  ['ucx_5fproperties_5fnew',['ucx_properties_new',['../properties_8h.html#a44d9dd12cab3aaa0084f1c8b89405796',1,'properties.c']]],
  72.210 +  ['ucx_5fproperties_5fnext',['ucx_properties_next',['../properties_8h.html#a7e03bc573d45d48c538cd721e810d33c',1,'properties.c']]],
  72.211 +  ['ucx_5fproperties_5fstore',['ucx_properties_store',['../properties_8h.html#a63c0c1b7648e675b21a1788917ff36fb',1,'properties.c']]],
  72.212 +  ['ucx_5fregdestr',['ucx_regdestr',['../structucx__regdestr.html',1,'']]],
  72.213 +  ['ucx_5fsc2sc',['ucx_sc2sc',['../string_8h.html#a69d5e3eeec783cc43314df71248768f5',1,'string.c']]],
  72.214 +  ['ucx_5fsprintf',['ucx_sprintf',['../utils_8h.html#af9f333b66ecd639c347c7235f4992e2e',1,'utils.h']]],
  72.215 +  ['ucx_5fss2c_5fs',['ucx_ss2c_s',['../string_8h.html#aedeb5d7bddda54116101a8d68af8c56d',1,'string.h']]],
  72.216 +  ['ucx_5fss2sc',['ucx_ss2sc',['../string_8h.html#a9ce5ad1b2aa2dbeba204d452c2e64359',1,'string.c']]],
  72.217 +  ['ucx_5fstack_5favail',['ucx_stack_avail',['../stack_8h.html#a53cd2c7743dc8ad9cbd35ade0b4873e7',1,'stack.c']]],
  72.218 +  ['ucx_5fstack_5fcalloc',['ucx_stack_calloc',['../stack_8h.html#afdc467524b5e19a9a777c6bc03e17174',1,'stack.c']]],
  72.219 +  ['ucx_5fstack_5fdim',['ucx_stack_dim',['../stack_8h.html#a3b761343c6491222604341ebfa443226',1,'stack.h']]],
  72.220 +  ['ucx_5fstack_5fempty',['ucx_stack_empty',['../stack_8h.html#a4f7239dbd6c032c56812e370b71c1985',1,'stack.h']]],
  72.221 +  ['ucx_5fstack_5ffree',['ucx_stack_free',['../stack_8h.html#aabd55c14a3866b3782ba324f4d8b4c41',1,'stack.c']]],
  72.222 +  ['ucx_5fstack_5finit',['ucx_stack_init',['../stack_8h.html#abaef685df4e7ef95cd7218984a0618fe',1,'stack.c']]],
  72.223 +  ['ucx_5fstack_5fmalloc',['ucx_stack_malloc',['../stack_8h.html#af865b416802140f6b6e8ab3626d7d1ac',1,'stack.c']]],
  72.224 +  ['ucx_5fstack_5fmetadata',['ucx_stack_metadata',['../structucx__stack__metadata.html',1,'']]],
  72.225 +  ['ucx_5fstack_5fpop',['ucx_stack_pop',['../stack_8h.html#a506b82374734ec476d086ddfb561174d',1,'stack.h']]],
  72.226 +  ['ucx_5fstack_5fpopn',['ucx_stack_popn',['../stack_8h.html#a07ea48f28eab474dcfefbb86fa66ef81',1,'stack.c']]],
  72.227 +  ['ucx_5fstack_5fpush',['ucx_stack_push',['../stack_8h.html#af85e6f77a8341beb6188f9ae1a8e9f92',1,'stack.c']]],
  72.228 +  ['ucx_5fstack_5fpusharr',['ucx_stack_pusharr',['../stack_8h.html#a7bb138979191bba138e76ea37488fae2',1,'stack.c']]],
  72.229 +  ['ucx_5fstack_5frealloc',['ucx_stack_realloc',['../stack_8h.html#a0c678f96f6fabab49b2b034a1fe91c3a',1,'stack.c']]],
  72.230 +  ['ucx_5fstack_5ftopsize',['ucx_stack_topsize',['../stack_8h.html#a030197051a803e87d5eeac5adb80b15a',1,'stack.h']]],
  72.231 +  ['ucx_5fstrcpy',['ucx_strcpy',['../utils_8h.html#adeb6e8d0a53a829207cfa0a979d01fff',1,'utils.c']]],
  72.232 +  ['ucx_5fstream_5fbcopy',['ucx_stream_bcopy',['../utils_8h.html#a6003a1750a66234169bd1f8cc84b297b',1,'utils.h']]],
  72.233 +  ['ucx_5fstream_5fbncopy',['ucx_stream_bncopy',['../utils_8h.html#a114ee7f7da62656ffd35e2dc23394201',1,'utils.c']]],
  72.234 +  ['ucx_5fstream_5fcopy',['ucx_stream_copy',['../utils_8h.html#a41ca1344f781c0d3bf7a414a6e811392',1,'utils.h']]],
  72.235 +  ['ucx_5fstream_5fcopy_5fbufsize',['UCX_STREAM_COPY_BUFSIZE',['../utils_8h.html#a23efd74fa5f701d4cf26ccbfd138a439',1,'utils.h']]],
  72.236 +  ['ucx_5fstream_5fncopy',['ucx_stream_ncopy',['../utils_8h.html#add13f39a8af440b4f7e6f74339eaada2',1,'utils.h']]],
  72.237 +  ['ucx_5fszmul',['ucx_szmul',['../ucx_8h.html#a0b5ed6c1a0b15356f4f948acfd32a4cc',1,'ucx.h']]],
  72.238 +  ['ucx_5fszmul_5fimpl',['ucx_szmul_impl',['../ucx_8h.html#a6637171cc0ec097b297f731a3036dd3b',1,'ucx.c']]],
  72.239 +  ['ucx_5ftest',['UCX_TEST',['../test_8h.html#a66cfb29c329fc9eaef071f2449836659',1,'test.h']]],
  72.240 +  ['ucx_5ftest_5fassert',['UCX_TEST_ASSERT',['../test_8h.html#a08f477cd12fc3fe741a92493e5df58a9',1,'test.h']]],
  72.241 +  ['ucx_5ftest_5fbegin',['UCX_TEST_BEGIN',['../test_8h.html#a0547b8d4f3bcdb0633fdd8925e8aa5d4',1,'test.h']]],
  72.242 +  ['ucx_5ftest_5fcall_5fsubroutine',['UCX_TEST_CALL_SUBROUTINE',['../test_8h.html#a0efbab91c54f5237a2ab207f48cf0e51',1,'test.h']]],
  72.243 +  ['ucx_5ftest_5fend',['UCX_TEST_END',['../test_8h.html#a86e64857c04f0447f8b16fb9c2b3b639',1,'test.h']]],
  72.244 +  ['ucx_5ftest_5fregister',['ucx_test_register',['../test_8h.html#a8dfabc42f183d3a4d79379a5d17bf67d',1,'test.c']]],
  72.245 +  ['ucx_5ftest_5frun',['ucx_test_run',['../test_8h.html#a3721458deeecb43aa322428f007714c3',1,'test.c']]],
  72.246 +  ['ucx_5ftest_5fsubroutine',['UCX_TEST_SUBROUTINE',['../test_8h.html#ae073cf5ead22cb27d662da048e16f44a',1,'test.h']]],
  72.247 +  ['ucx_5ftest_5fsuite_5ffree',['ucx_test_suite_free',['../test_8h.html#a4a6ac61a6f72722273f8eaa7a343edde',1,'test.c']]],
  72.248 +  ['ucx_5ftest_5fsuite_5fnew',['ucx_test_suite_new',['../test_8h.html#a531f0df90363e0befbe900878f65f09e',1,'test.c']]],
  72.249 +  ['ucx_5fvasprintf',['ucx_vasprintf',['../utils_8h.html#a3ea1dfb856c741f3e8ec6bfdc9ad427e',1,'utils.c']]],
  72.250 +  ['ucx_5fversion',['UCX_VERSION',['../ucx_8h.html#af12001920ca2fc1405615684e4dea284',1,'ucx.h']]],
  72.251 +  ['ucx_5fversion_5fmajor',['UCX_VERSION_MAJOR',['../ucx_8h.html#aa57e5dd22d42387d748cc16777df1383',1,'ucx.h']]],
  72.252 +  ['ucx_5fversion_5fminor',['UCX_VERSION_MINOR',['../ucx_8h.html#a9ac10d6353e23d4615a87fc737c65eb0',1,'ucx.h']]],
  72.253 +  ['ucx_5fvfprintf',['ucx_vfprintf',['../utils_8h.html#a4907967beb92c3ae351dd239abbb6927',1,'utils.c']]],
  72.254 +  ['ucxallocator',['UcxAllocator',['../structUcxAllocator.html',1,'']]],
  72.255 +  ['ucxarray',['UcxArray',['../structUcxArray.html',1,'']]],
  72.256 +  ['ucxavlnode',['UcxAVLNode',['../structUcxAVLNode.html',1,'UcxAVLNode'],['../avl_8h.html#a08ba2496c2316df58548c3cc29712add',1,'UcxAVLNode():&#160;avl.h']]],
  72.257 +  ['ucxavltree',['UcxAVLTree',['../structUcxAVLTree.html',1,'']]],
  72.258 +  ['ucxbuffer',['UcxBuffer',['../structUcxBuffer.html',1,'']]],
  72.259 +  ['ucxkey',['UcxKey',['../structUcxKey.html',1,'UcxKey'],['../map_8h.html#ad63828bb23123fc01a5315a2bac3b142',1,'UcxKey():&#160;map.h']]],
  72.260 +  ['ucxlist',['UcxList',['../structUcxList.html',1,'UcxList'],['../list_8h.html#aa6f89f91c1081c9a7c6866c298f497a2',1,'UcxList():&#160;list.h']]],
  72.261 +  ['ucxlogger',['UcxLogger',['../structUcxLogger.html',1,'']]],
  72.262 +  ['ucxmap',['UcxMap',['../structUcxMap.html',1,'UcxMap'],['../map_8h.html#a18e21948725b2da68c35da587a722033',1,'UcxMap():&#160;map.h']]],
  72.263 +  ['ucxmapelement',['UcxMapElement',['../structUcxMapElement.html',1,'UcxMapElement'],['../map_8h.html#ad7d7a910a32113eb93eae11c3dc97b4b',1,'UcxMapElement():&#160;map.h']]],
  72.264 +  ['ucxmapiterator',['UcxMapIterator',['../structUcxMapIterator.html',1,'UcxMapIterator'],['../map_8h.html#ae36aff5f645948c54f51578b11fd87fb',1,'UcxMapIterator():&#160;map.h']]],
  72.265 +  ['ucxmapkey',['UcxMapKey',['../structUcxMapKey.html',1,'']]],
  72.266 +  ['ucxmempool',['UcxMempool',['../structUcxMempool.html',1,'']]],
  72.267 +  ['ucxproperties',['UcxProperties',['../structUcxProperties.html',1,'']]],
  72.268 +  ['ucxstack',['UcxStack',['../structUcxStack.html',1,'']]],
  72.269 +  ['ucxtest',['UcxTest',['../test_8h.html#ae906817354c010b83c2784260cce7a1c',1,'test.h']]],
  72.270 +  ['ucxtestlist',['UcxTestList',['../structUcxTestList.html',1,'UcxTestList'],['../test_8h.html#a8048c50ae73ea690b776edfd63bd6a5d',1,'UcxTestList():&#160;test.h']]],
  72.271 +  ['ucxtestsuite',['UcxTestSuite',['../structUcxTestSuite.html',1,'UcxTestSuite'],['../test_8h.html#a52115d1d0f1c4a565ed6ef7c1bfd0363',1,'UcxTestSuite():&#160;test.h']]],
  72.272 +  ['userdata',['userdata',['../structUcxAVLTree.html#ae92a3bfad3fe33c8dcbdad85112f83fd',1,'UcxAVLTree']]],
  72.273 +  ['utils_2eh',['utils.h',['../utils_8h.html',1,'']]]
  72.274 +];
    73.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    73.2 +++ b/docs/api-2.1/search/all_12.html	Sat Feb 06 19:11:44 2021 +0100
    73.3 @@ -0,0 +1,26 @@
    73.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    73.5 +<html><head><title></title>
    73.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    73.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    73.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    73.9 +<script type="text/javascript" src="all_12.js"></script>
   73.10 +<script type="text/javascript" src="search.js"></script>
   73.11 +</head>
   73.12 +<body class="SRPage">
   73.13 +<div id="SRIndex">
   73.14 +<div class="SRStatus" id="Loading">Loading...</div>
   73.15 +<div id="SRResults"></div>
   73.16 +<script type="text/javascript"><!--
   73.17 +createResults();
   73.18 +--></script>
   73.19 +<div class="SRStatus" id="Searching">Searching...</div>
   73.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   73.21 +<script type="text/javascript"><!--
   73.22 +document.getElementById("Loading").style.display="none";
   73.23 +document.getElementById("NoMatches").style.display="none";
   73.24 +var searchResults = new SearchResults("searchResults");
   73.25 +searchResults.Search();
   73.26 +--></script>
   73.27 +</div>
   73.28 +</body>
   73.29 +</html>
    74.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    74.2 +++ b/docs/api-2.1/search/all_12.js	Sat Feb 06 19:11:44 2021 +0100
    74.3 @@ -0,0 +1,4 @@
    74.4 +var searchData=
    74.5 +[
    74.6 +  ['value',['value',['../structUcxAVLNode.html#a302501b8c04c3fde668fe72249871258',1,'UcxAVLNode']]]
    74.7 +];
    75.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    75.2 +++ b/docs/api-2.1/search/all_13.html	Sat Feb 06 19:11:44 2021 +0100
    75.3 @@ -0,0 +1,26 @@
    75.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    75.5 +<html><head><title></title>
    75.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    75.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    75.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    75.9 +<script type="text/javascript" src="all_13.js"></script>
   75.10 +<script type="text/javascript" src="search.js"></script>
   75.11 +</head>
   75.12 +<body class="SRPage">
   75.13 +<div id="SRIndex">
   75.14 +<div class="SRStatus" id="Loading">Loading...</div>
   75.15 +<div id="SRResults"></div>
   75.16 +<script type="text/javascript"><!--
   75.17 +createResults();
   75.18 +--></script>
   75.19 +<div class="SRStatus" id="Searching">Searching...</div>
   75.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   75.21 +<script type="text/javascript"><!--
   75.22 +document.getElementById("Loading").style.display="none";
   75.23 +document.getElementById("NoMatches").style.display="none";
   75.24 +var searchResults = new SearchResults("searchResults");
   75.25 +searchResults.Search();
   75.26 +--></script>
   75.27 +</div>
   75.28 +</body>
   75.29 +</html>
    76.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    76.2 +++ b/docs/api-2.1/search/all_13.js	Sat Feb 06 19:11:44 2021 +0100
    76.3 @@ -0,0 +1,5 @@
    76.4 +var searchData=
    76.5 +[
    76.6 +  ['write_5ffunc',['write_func',['../ucx_8h.html#a989b3f0fa4d307d278378fde435641ed',1,'ucx.h']]],
    76.7 +  ['writer',['writer',['../structUcxLogger.html#ada13bba090a9dc4f8d6cd9be73c60930',1,'UcxLogger']]]
    76.8 +];
    77.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    77.2 +++ b/docs/api-2.1/search/all_2.html	Sat Feb 06 19:11:44 2021 +0100
    77.3 @@ -0,0 +1,26 @@
    77.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    77.5 +<html><head><title></title>
    77.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    77.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    77.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    77.9 +<script type="text/javascript" src="all_2.js"></script>
   77.10 +<script type="text/javascript" src="search.js"></script>
   77.11 +</head>
   77.12 +<body class="SRPage">
   77.13 +<div id="SRIndex">
   77.14 +<div class="SRStatus" id="Loading">Loading...</div>
   77.15 +<div id="SRResults"></div>
   77.16 +<script type="text/javascript"><!--
   77.17 +createResults();
   77.18 +--></script>
   77.19 +<div class="SRStatus" id="Searching">Searching...</div>
   77.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   77.21 +<script type="text/javascript"><!--
   77.22 +document.getElementById("Loading").style.display="none";
   77.23 +document.getElementById("NoMatches").style.display="none";
   77.24 +var searchResults = new SearchResults("searchResults");
   77.25 +searchResults.Search();
   77.26 +--></script>
   77.27 +</div>
   77.28 +</body>
   77.29 +</html>
    78.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    78.2 +++ b/docs/api-2.1/search/all_2.js	Sat Feb 06 19:11:44 2021 +0100
    78.3 @@ -0,0 +1,6 @@
    78.4 +var searchData=
    78.5 +[
    78.6 +  ['buffer',['buffer',['../structUcxProperties.html#a6bb4d29686df41a0f42641ee15232bfd',1,'UcxProperties']]],
    78.7 +  ['buffer_2eh',['buffer.h',['../buffer_8h.html',1,'']]],
    78.8 +  ['buflen',['buflen',['../structUcxProperties.html#a4e7524434525267e29f493a25dcca6b5',1,'UcxProperties']]]
    78.9 +];
    79.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    79.2 +++ b/docs/api-2.1/search/all_3.html	Sat Feb 06 19:11:44 2021 +0100
    79.3 @@ -0,0 +1,26 @@
    79.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    79.5 +<html><head><title></title>
    79.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    79.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    79.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    79.9 +<script type="text/javascript" src="all_3.js"></script>
   79.10 +<script type="text/javascript" src="search.js"></script>
   79.11 +</head>
   79.12 +<body class="SRPage">
   79.13 +<div id="SRIndex">
   79.14 +<div class="SRStatus" id="Loading">Loading...</div>
   79.15 +<div id="SRResults"></div>
   79.16 +<script type="text/javascript"><!--
   79.17 +createResults();
   79.18 +--></script>
   79.19 +<div class="SRStatus" id="Searching">Searching...</div>
   79.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   79.21 +<script type="text/javascript"><!--
   79.22 +document.getElementById("Loading").style.display="none";
   79.23 +document.getElementById("NoMatches").style.display="none";
   79.24 +var searchResults = new SearchResults("searchResults");
   79.25 +searchResults.Search();
   79.26 +--></script>
   79.27 +</div>
   79.28 +</body>
   79.29 +</html>
    80.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    80.2 +++ b/docs/api-2.1/search/all_3.js	Sat Feb 06 19:11:44 2021 +0100
    80.3 @@ -0,0 +1,14 @@
    80.4 +var searchData=
    80.5 +[
    80.6 +  ['c',['c',['../structucx__memchunk.html#ab86550503e5f019bfa61a1e91f1c40da',1,'ucx_memchunk']]],
    80.7 +  ['calloc',['calloc',['../structUcxAllocator.html#ab94ec1cba45cc4e7d81e1588a11cbb62',1,'UcxAllocator']]],
    80.8 +  ['capacity',['capacity',['../structUcxArray.html#a7ed074887908e45bde7e1fbc67b31c18',1,'UcxArray::capacity()'],['../structUcxBuffer.html#a385661894f3cee9c549bfe07a8b316bf',1,'UcxBuffer::capacity()']]],
    80.9 +  ['cmp_5ffunc',['cmp_func',['../ucx_8h.html#afe5e2d5dbf34778e0e97852051570791',1,'ucx.h']]],
   80.10 +  ['cmpfunc',['cmpfunc',['../structUcxAVLTree.html#a87aff25cb726cb9eb88eb815a10d1004',1,'UcxAVLTree']]],
   80.11 +  ['comment1',['comment1',['../structUcxProperties.html#afaa2e6a289fa6949b7b01df35fa5def8',1,'UcxProperties']]],
   80.12 +  ['comment2',['comment2',['../structUcxProperties.html#a9ea7ecb414ca8bc7bef62cdd19cc6363',1,'UcxProperties']]],
   80.13 +  ['comment3',['comment3',['../structUcxProperties.html#a5f3e561e32bac03e36a191a6940cca92',1,'UcxProperties']]],
   80.14 +  ['copy_5ffunc',['copy_func',['../ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967',1,'ucx.h']]],
   80.15 +  ['count',['count',['../structUcxMap.html#a14e9163f71f6c014dfa2103de70ae9cd',1,'UcxMap']]],
   80.16 +  ['cur',['cur',['../structUcxMapIterator.html#af1fc40f899f37280adb5b85acf6e742f',1,'UcxMapIterator']]]
   80.17 +];
    81.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    81.2 +++ b/docs/api-2.1/search/all_4.html	Sat Feb 06 19:11:44 2021 +0100
    81.3 @@ -0,0 +1,26 @@
    81.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    81.5 +<html><head><title></title>
    81.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    81.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    81.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    81.9 +<script type="text/javascript" src="all_4.js"></script>
   81.10 +<script type="text/javascript" src="search.js"></script>
   81.11 +</head>
   81.12 +<body class="SRPage">
   81.13 +<div id="SRIndex">
   81.14 +<div class="SRStatus" id="Loading">Loading...</div>
   81.15 +<div id="SRResults"></div>
   81.16 +<script type="text/javascript"><!--
   81.17 +createResults();
   81.18 +--></script>
   81.19 +<div class="SRStatus" id="Searching">Searching...</div>
   81.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   81.21 +<script type="text/javascript"><!--
   81.22 +document.getElementById("Loading").style.display="none";
   81.23 +document.getElementById("NoMatches").style.display="none";
   81.24 +var searchResults = new SearchResults("searchResults");
   81.25 +searchResults.Search();
   81.26 +--></script>
   81.27 +</div>
   81.28 +</body>
   81.29 +</html>
    82.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    82.2 +++ b/docs/api-2.1/search/all_4.js	Sat Feb 06 19:11:44 2021 +0100
    82.3 @@ -0,0 +1,8 @@
    82.4 +var searchData=
    82.5 +[
    82.6 +  ['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()']]],
    82.7 +  ['dateformat',['dateformat',['../structUcxLogger.html#a086f75df0f6c81ec491f25c0a4d9262b',1,'UcxLogger']]],
    82.8 +  ['delimiter',['delimiter',['../structUcxProperties.html#af6adb3f69616cf9d2bb5ea7b4d837ca5',1,'UcxProperties']]],
    82.9 +  ['destructor',['destructor',['../structucx__memchunk.html#ac7b5e3fda47b917d6fb2a1d7ea28447b',1,'ucx_memchunk::destructor()'],['../structucx__regdestr.html#acea2a3bb66909aa800a931ac8b0cce56',1,'ucx_regdestr::destructor()']]],
   82.10 +  ['distance_5ffunc',['distance_func',['../ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9',1,'ucx.h']]]
   82.11 +];
    83.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    83.2 +++ b/docs/api-2.1/search/all_5.html	Sat Feb 06 19:11:44 2021 +0100
    83.3 @@ -0,0 +1,26 @@
    83.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    83.5 +<html><head><title></title>
    83.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    83.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    83.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    83.9 +<script type="text/javascript" src="all_5.js"></script>
   83.10 +<script type="text/javascript" src="search.js"></script>
   83.11 +</head>
   83.12 +<body class="SRPage">
   83.13 +<div id="SRIndex">
   83.14 +<div class="SRStatus" id="Loading">Loading...</div>
   83.15 +<div id="SRResults"></div>
   83.16 +<script type="text/javascript"><!--
   83.17 +createResults();
   83.18 +--></script>
   83.19 +<div class="SRStatus" id="Searching">Searching...</div>
   83.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   83.21 +<script type="text/javascript"><!--
   83.22 +document.getElementById("Loading").style.display="none";
   83.23 +document.getElementById("NoMatches").style.display="none";
   83.24 +var searchResults = new SearchResults("searchResults");
   83.25 +searchResults.Search();
   83.26 +--></script>
   83.27 +</div>
   83.28 +</body>
   83.29 +</html>
    84.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    84.2 +++ b/docs/api-2.1/search/all_5.js	Sat Feb 06 19:11:44 2021 +0100
    84.3 @@ -0,0 +1,5 @@
    84.4 +var searchData=
    84.5 +[
    84.6 +  ['elemsize',['elemsize',['../structUcxArray.html#ac4e9ecdf8a8d010644f6e44dfef8190f',1,'UcxArray']]],
    84.7 +  ['error',['error',['../structUcxProperties.html#a34f71a6ab6dcb6892e3b4eb802e75bff',1,'UcxProperties']]]
    84.8 +];
    85.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    85.2 +++ b/docs/api-2.1/search/all_6.html	Sat Feb 06 19:11:44 2021 +0100
    85.3 @@ -0,0 +1,26 @@
    85.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    85.5 +<html><head><title></title>
    85.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    85.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    85.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    85.9 +<script type="text/javascript" src="all_6.js"></script>
   85.10 +<script type="text/javascript" src="search.js"></script>
   85.11 +</head>
   85.12 +<body class="SRPage">
   85.13 +<div id="SRIndex">
   85.14 +<div class="SRStatus" id="Loading">Loading...</div>
   85.15 +<div id="SRResults"></div>
   85.16 +<script type="text/javascript"><!--
   85.17 +createResults();
   85.18 +--></script>
   85.19 +<div class="SRStatus" id="Searching">Searching...</div>
   85.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   85.21 +<script type="text/javascript"><!--
   85.22 +document.getElementById("Loading").style.display="none";
   85.23 +document.getElementById("NoMatches").style.display="none";
   85.24 +var searchResults = new SearchResults("searchResults");
   85.25 +searchResults.Search();
   85.26 +--></script>
   85.27 +</div>
   85.28 +</body>
   85.29 +</html>
    86.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    86.2 +++ b/docs/api-2.1/search/all_6.js	Sat Feb 06 19:11:44 2021 +0100
    86.3 @@ -0,0 +1,6 @@
    86.4 +var searchData=
    86.5 +[
    86.6 +  ['failure',['failure',['../structUcxTestSuite.html#abfd240541d1e956e49cde0ac36286951',1,'UcxTestSuite']]],
    86.7 +  ['flags',['flags',['../structUcxBuffer.html#ac642e07b0a03be5aac48eb4aa5bec2f7',1,'UcxBuffer']]],
    86.8 +  ['free',['free',['../structUcxAllocator.html#aecce1840378ed53f1002190f4f87026f',1,'UcxAllocator']]]
    86.9 +];
    87.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    87.2 +++ b/docs/api-2.1/search/all_7.html	Sat Feb 06 19:11:44 2021 +0100
    87.3 @@ -0,0 +1,26 @@
    87.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    87.5 +<html><head><title></title>
    87.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    87.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    87.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    87.9 +<script type="text/javascript" src="all_7.js"></script>
   87.10 +<script type="text/javascript" src="search.js"></script>
   87.11 +</head>
   87.12 +<body class="SRPage">
   87.13 +<div id="SRIndex">
   87.14 +<div class="SRStatus" id="Loading">Loading...</div>
   87.15 +<div id="SRResults"></div>
   87.16 +<script type="text/javascript"><!--
   87.17 +createResults();
   87.18 +--></script>
   87.19 +<div class="SRStatus" id="Searching">Searching...</div>
   87.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   87.21 +<script type="text/javascript"><!--
   87.22 +document.getElementById("Loading").style.display="none";
   87.23 +document.getElementById("NoMatches").style.display="none";
   87.24 +var searchResults = new SearchResults("searchResults");
   87.25 +searchResults.Search();
   87.26 +--></script>
   87.27 +</div>
   87.28 +</body>
   87.29 +</html>
    88.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    88.2 +++ b/docs/api-2.1/search/all_7.js	Sat Feb 06 19:11:44 2021 +0100
    88.3 @@ -0,0 +1,5 @@
    88.4 +var searchData=
    88.5 +[
    88.6 +  ['hash',['hash',['../structUcxKey.html#aac9d372ac34a4cbd8459e2b04e505752',1,'UcxKey::hash()'],['../structUcxMapKey.html#a34c1f8fec98174583944fffd30e7c913',1,'UcxMapKey::hash()']]],
    88.7 +  ['height',['height',['../structUcxAVLNode.html#af129fd32863a7c35e82c5cd9d11dc95a',1,'UcxAVLNode']]]
    88.8 +];
    89.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    89.2 +++ b/docs/api-2.1/search/all_8.html	Sat Feb 06 19:11:44 2021 +0100
    89.3 @@ -0,0 +1,26 @@
    89.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    89.5 +<html><head><title></title>
    89.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    89.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    89.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    89.9 +<script type="text/javascript" src="all_8.js"></script>
   89.10 +<script type="text/javascript" src="search.js"></script>
   89.11 +</head>
   89.12 +<body class="SRPage">
   89.13 +<div id="SRIndex">
   89.14 +<div class="SRStatus" id="Loading">Loading...</div>
   89.15 +<div id="SRResults"></div>
   89.16 +<script type="text/javascript"><!--
   89.17 +createResults();
   89.18 +--></script>
   89.19 +<div class="SRStatus" id="Searching">Searching...</div>
   89.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   89.21 +<script type="text/javascript"><!--
   89.22 +document.getElementById("Loading").style.display="none";
   89.23 +document.getElementById("NoMatches").style.display="none";
   89.24 +var searchResults = new SearchResults("searchResults");
   89.25 +searchResults.Search();
   89.26 +--></script>
   89.27 +</div>
   89.28 +</body>
   89.29 +</html>
    90.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    90.2 +++ b/docs/api-2.1/search/all_8.js	Sat Feb 06 19:11:44 2021 +0100
    90.3 @@ -0,0 +1,4 @@
    90.4 +var searchData=
    90.5 +[
    90.6 +  ['index',['index',['../structUcxMapIterator.html#ac2376545c8816dd6895de4995e558c65',1,'UcxMapIterator']]]
    90.7 +];
    91.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    91.2 +++ b/docs/api-2.1/search/all_9.html	Sat Feb 06 19:11:44 2021 +0100
    91.3 @@ -0,0 +1,26 @@
    91.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    91.5 +<html><head><title></title>
    91.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    91.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    91.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    91.9 +<script type="text/javascript" src="all_9.js"></script>
   91.10 +<script type="text/javascript" src="search.js"></script>
   91.11 +</head>
   91.12 +<body class="SRPage">
   91.13 +<div id="SRIndex">
   91.14 +<div class="SRStatus" id="Loading">Loading...</div>
   91.15 +<div id="SRResults"></div>
   91.16 +<script type="text/javascript"><!--
   91.17 +createResults();
   91.18 +--></script>
   91.19 +<div class="SRStatus" id="Searching">Searching...</div>
   91.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   91.21 +<script type="text/javascript"><!--
   91.22 +document.getElementById("Loading").style.display="none";
   91.23 +document.getElementById("NoMatches").style.display="none";
   91.24 +var searchResults = new SearchResults("searchResults");
   91.25 +searchResults.Search();
   91.26 +--></script>
   91.27 +</div>
   91.28 +</body>
   91.29 +</html>
    92.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    92.2 +++ b/docs/api-2.1/search/all_9.js	Sat Feb 06 19:11:44 2021 +0100
    92.3 @@ -0,0 +1,4 @@
    92.4 +var searchData=
    92.5 +[
    92.6 +  ['key',['key',['../structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6',1,'UcxAVLNode::key()'],['../structUcxMapElement.html#aa446141b708e106e2c8de1303318187c',1,'UcxMapElement::key()']]]
    92.7 +];
    93.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    93.2 +++ b/docs/api-2.1/search/all_a.html	Sat Feb 06 19:11:44 2021 +0100
    93.3 @@ -0,0 +1,26 @@
    93.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    93.5 +<html><head><title></title>
    93.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    93.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    93.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    93.9 +<script type="text/javascript" src="all_a.js"></script>
   93.10 +<script type="text/javascript" src="search.js"></script>
   93.11 +</head>
   93.12 +<body class="SRPage">
   93.13 +<div id="SRIndex">
   93.14 +<div class="SRStatus" id="Loading">Loading...</div>
   93.15 +<div id="SRResults"></div>
   93.16 +<script type="text/javascript"><!--
   93.17 +createResults();
   93.18 +--></script>
   93.19 +<div class="SRStatus" id="Searching">Searching...</div>
   93.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   93.21 +<script type="text/javascript"><!--
   93.22 +document.getElementById("Loading").style.display="none";
   93.23 +document.getElementById("NoMatches").style.display="none";
   93.24 +var searchResults = new SearchResults("searchResults");
   93.25 +searchResults.Search();
   93.26 +--></script>
   93.27 +</div>
   93.28 +</body>
   93.29 +</html>
    94.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    94.2 +++ b/docs/api-2.1/search/all_a.js	Sat Feb 06 19:11:44 2021 +0100
    94.3 @@ -0,0 +1,10 @@
    94.4 +var searchData=
    94.5 +[
    94.6 +  ['left',['left',['../structUcxAVLNode.html#ad3a1c733f2c1cc81ac527f846fc24b9c',1,'UcxAVLNode']]],
    94.7 +  ['len',['len',['../structUcxKey.html#abef01de37f355688f2ac797d2c280683',1,'UcxKey::len()'],['../structUcxMapKey.html#a504d46caa45c79cd87ff8cd835654270',1,'UcxMapKey::len()']]],
    94.8 +  ['length',['length',['../structsstr__t.html#a5cf571708cdff92e45f08458f2b98229',1,'sstr_t::length()'],['../structscstr__t.html#aaa0229f64f1057b6f65adededaa5a172',1,'scstr_t::length()']]],
    94.9 +  ['level',['level',['../structUcxLogger.html#a2e0ee94c25b2307096c7970280d189cd',1,'UcxLogger']]],
   94.10 +  ['levels',['levels',['../structUcxLogger.html#a187129f7bc6e5064b3d92a5f1217f396',1,'UcxLogger']]],
   94.11 +  ['list_2eh',['list.h',['../list_8h.html',1,'']]],
   94.12 +  ['logging_2eh',['logging.h',['../logging_8h.html',1,'']]]
   94.13 +];
    95.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    95.2 +++ b/docs/api-2.1/search/all_b.html	Sat Feb 06 19:11:44 2021 +0100
    95.3 @@ -0,0 +1,26 @@
    95.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    95.5 +<html><head><title></title>
    95.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    95.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    95.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    95.9 +<script type="text/javascript" src="all_b.js"></script>
   95.10 +<script type="text/javascript" src="search.js"></script>
   95.11 +</head>
   95.12 +<body class="SRPage">
   95.13 +<div id="SRIndex">
   95.14 +<div class="SRStatus" id="Loading">Loading...</div>
   95.15 +<div id="SRResults"></div>
   95.16 +<script type="text/javascript"><!--
   95.17 +createResults();
   95.18 +--></script>
   95.19 +<div class="SRStatus" id="Searching">Searching...</div>
   95.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   95.21 +<script type="text/javascript"><!--
   95.22 +document.getElementById("Loading").style.display="none";
   95.23 +document.getElementById("NoMatches").style.display="none";
   95.24 +var searchResults = new SearchResults("searchResults");
   95.25 +searchResults.Search();
   95.26 +--></script>
   95.27 +</div>
   95.28 +</body>
   95.29 +</html>
    96.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    96.2 +++ b/docs/api-2.1/search/all_b.js	Sat Feb 06 19:11:44 2021 +0100
    96.3 @@ -0,0 +1,8 @@
    96.4 +var searchData=
    96.5 +[
    96.6 +  ['malloc',['malloc',['../structUcxAllocator.html#a013376172be39ed54f77c4be6898845a',1,'UcxAllocator']]],
    96.7 +  ['map',['map',['../structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790',1,'UcxMap::map()'],['../structUcxMapIterator.html#af88d6e22547d09fe1d665dd650dcdb95',1,'UcxMapIterator::map()']]],
    96.8 +  ['map_2eh',['map.h',['../map_8h.html',1,'']]],
    96.9 +  ['mask',['mask',['../structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c',1,'UcxLogger']]],
   96.10 +  ['mempool_2eh',['mempool.h',['../mempool_8h.html',1,'']]]
   96.11 +];
    97.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    97.2 +++ b/docs/api-2.1/search/all_c.html	Sat Feb 06 19:11:44 2021 +0100
    97.3 @@ -0,0 +1,26 @@
    97.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    97.5 +<html><head><title></title>
    97.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    97.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    97.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    97.9 +<script type="text/javascript" src="all_c.js"></script>
   97.10 +<script type="text/javascript" src="search.js"></script>
   97.11 +</head>
   97.12 +<body class="SRPage">
   97.13 +<div id="SRIndex">
   97.14 +<div class="SRStatus" id="Loading">Loading...</div>
   97.15 +<div id="SRResults"></div>
   97.16 +<script type="text/javascript"><!--
   97.17 +createResults();
   97.18 +--></script>
   97.19 +<div class="SRStatus" id="Searching">Searching...</div>
   97.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   97.21 +<script type="text/javascript"><!--
   97.22 +document.getElementById("Loading").style.display="none";
   97.23 +document.getElementById("NoMatches").style.display="none";
   97.24 +var searchResults = new SearchResults("searchResults");
   97.25 +searchResults.Search();
   97.26 +--></script>
   97.27 +</div>
   97.28 +</body>
   97.29 +</html>
    98.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    98.2 +++ b/docs/api-2.1/search/all_c.js	Sat Feb 06 19:11:44 2021 +0100
    98.3 @@ -0,0 +1,5 @@
    98.4 +var searchData=
    98.5 +[
    98.6 +  ['ndata',['ndata',['../structUcxMempool.html#aa3a73ab231e1bc207d526f46f1c1e23a',1,'UcxMempool']]],
    98.7 +  ['next',['next',['../structUcxList.html#a82a1818f1abf765b026fa91478569a8f',1,'UcxList::next()'],['../structUcxMapElement.html#a99fe8188b0889201d70ff5f922deef51',1,'UcxMapElement::next()'],['../structUcxTestList.html#aeebb80ff75d9f6f82ab6dc2641a3c74e',1,'UcxTestList::next()']]]
    98.8 +];
    99.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    99.2 +++ b/docs/api-2.1/search/all_d.html	Sat Feb 06 19:11:44 2021 +0100
    99.3 @@ -0,0 +1,26 @@
    99.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    99.5 +<html><head><title></title>
    99.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
    99.7 +<meta name="generator" content="Doxygen 1.8.13"/>
    99.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
    99.9 +<script type="text/javascript" src="all_d.js"></script>
   99.10 +<script type="text/javascript" src="search.js"></script>
   99.11 +</head>
   99.12 +<body class="SRPage">
   99.13 +<div id="SRIndex">
   99.14 +<div class="SRStatus" id="Loading">Loading...</div>
   99.15 +<div id="SRResults"></div>
   99.16 +<script type="text/javascript"><!--
   99.17 +createResults();
   99.18 +--></script>
   99.19 +<div class="SRStatus" id="Searching">Searching...</div>
   99.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
   99.21 +<script type="text/javascript"><!--
   99.22 +document.getElementById("Loading").style.display="none";
   99.23 +document.getElementById("NoMatches").style.display="none";
   99.24 +var searchResults = new SearchResults("searchResults");
   99.25 +searchResults.Search();
   99.26 +--></script>
   99.27 +</div>
   99.28 +</body>
   99.29 +</html>
   100.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   100.2 +++ b/docs/api-2.1/search/all_d.js	Sat Feb 06 19:11:44 2021 +0100
   100.3 @@ -0,0 +1,10 @@
   100.4 +var searchData=
   100.5 +[
   100.6 +  ['parent',['parent',['../structUcxAVLNode.html#afc4e3b4f452aa2d91cabb2135b9d42f7',1,'UcxAVLNode']]],
   100.7 +  ['pool',['pool',['../structUcxAllocator.html#a1b78012998d1c28be86dc595f8f0aac9',1,'UcxAllocator']]],
   100.8 +  ['pos',['pos',['../structUcxBuffer.html#a7a64288f002cf62b492e2ea49c79615c',1,'UcxBuffer::pos()'],['../structUcxProperties.html#addd36ac8e5e42241c0a57453633970db',1,'UcxProperties::pos()']]],
   100.9 +  ['prev',['prev',['../structUcxList.html#a0f1fddce9088b9c1414745d0b1b5c08b',1,'UcxList::prev()'],['../structucx__stack__metadata.html#ad46d2e8e5b0acf05f2def41d451c5579',1,'ucx_stack_metadata::prev()']]],
  100.10 +  ['prisstr',['PRIsstr',['../string_8h.html#a7d5bc48708405a28b23667e32dfcecae',1,'string.h']]],
  100.11 +  ['properties_2eh',['properties.h',['../properties_8h.html',1,'']]],
  100.12 +  ['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()']]]
  100.13 +];
   101.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   101.2 +++ b/docs/api-2.1/search/all_e.html	Sat Feb 06 19:11:44 2021 +0100
   101.3 @@ -0,0 +1,26 @@
   101.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   101.5 +<html><head><title></title>
   101.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   101.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   101.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   101.9 +<script type="text/javascript" src="all_e.js"></script>
  101.10 +<script type="text/javascript" src="search.js"></script>
  101.11 +</head>
  101.12 +<body class="SRPage">
  101.13 +<div id="SRIndex">
  101.14 +<div class="SRStatus" id="Loading">Loading...</div>
  101.15 +<div id="SRResults"></div>
  101.16 +<script type="text/javascript"><!--
  101.17 +createResults();
  101.18 +--></script>
  101.19 +<div class="SRStatus" id="Searching">Searching...</div>
  101.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  101.21 +<script type="text/javascript"><!--
  101.22 +document.getElementById("Loading").style.display="none";
  101.23 +document.getElementById("NoMatches").style.display="none";
  101.24 +var searchResults = new SearchResults("searchResults");
  101.25 +searchResults.Search();
  101.26 +--></script>
  101.27 +</div>
  101.28 +</body>
  101.29 +</html>
   102.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   102.2 +++ b/docs/api-2.1/search/all_e.js	Sat Feb 06 19:11:44 2021 +0100
   102.3 @@ -0,0 +1,7 @@
   102.4 +var searchData=
   102.5 +[
   102.6 +  ['read_5ffunc',['read_func',['../ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5',1,'ucx.h']]],
   102.7 +  ['realloc',['realloc',['../structUcxAllocator.html#a3550e3847f31d9e9ce3ffcb0d3440c15',1,'UcxAllocator']]],
   102.8 +  ['right',['right',['../structUcxAVLNode.html#a7cbaa31dba8c7a89f4f8f7905f6fd238',1,'UcxAVLNode']]],
   102.9 +  ['root',['root',['../structUcxAVLTree.html#a393a8fc99eb2c290d3cb67170081d742',1,'UcxAVLTree']]]
  102.10 +];
   103.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   103.2 +++ b/docs/api-2.1/search/all_f.html	Sat Feb 06 19:11:44 2021 +0100
   103.3 @@ -0,0 +1,26 @@
   103.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   103.5 +<html><head><title></title>
   103.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   103.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   103.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   103.9 +<script type="text/javascript" src="all_f.js"></script>
  103.10 +<script type="text/javascript" src="search.js"></script>
  103.11 +</head>
  103.12 +<body class="SRPage">
  103.13 +<div id="SRIndex">
  103.14 +<div class="SRStatus" id="Loading">Loading...</div>
  103.15 +<div id="SRResults"></div>
  103.16 +<script type="text/javascript"><!--
  103.17 +createResults();
  103.18 +--></script>
  103.19 +<div class="SRStatus" id="Searching">Searching...</div>
  103.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  103.21 +<script type="text/javascript"><!--
  103.22 +document.getElementById("Loading").style.display="none";
  103.23 +document.getElementById("NoMatches").style.display="none";
  103.24 +var searchResults = new SearchResults("searchResults");
  103.25 +searchResults.Search();
  103.26 +--></script>
  103.27 +</div>
  103.28 +</body>
  103.29 +</html>
   104.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   104.2 +++ b/docs/api-2.1/search/all_f.js	Sat Feb 06 19:11:44 2021 +0100
   104.3 @@ -0,0 +1,67 @@
   104.4 +var searchData=
   104.5 +[
   104.6 +  ['s',['S',['../string_8h.html#a8fa17c8cf4c36df48f4108c36da8573e',1,'string.h']]],
   104.7 +  ['sc',['SC',['../string_8h.html#a7d261dd0bc358c957a368bc058c1ce53',1,'string.h']]],
   104.8 +  ['scstr',['SCSTR',['../string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed',1,'SCSTR():&#160;string.h'],['../string_8h.html#a2b1d6f1eca1c1549f37107b9c026c5a6',1,'scstr(const char *cstring):&#160;string.c']]],
   104.9 +  ['scstr_5ft',['scstr_t',['../structscstr__t.html',1,'']]],
  104.10 +  ['scstrcasecmp',['scstrcasecmp',['../string_8h.html#aca8142fb823d253054e17c17cfca05e0',1,'string.c']]],
  104.11 +  ['scstrcaseprefix',['scstrcaseprefix',['../string_8h.html#a3718ef4aa1e86cdb26bda2f07fb585df',1,'string.c']]],
  104.12 +  ['scstrcasesuffix',['scstrcasesuffix',['../string_8h.html#a6edb4b85f2b9efe79db7ffe6eccd7bc3',1,'string.c']]],
  104.13 +  ['scstrcat',['scstrcat',['../string_8h.html#a7376842c19e954b49215da81ef76ac0c',1,'string.c']]],
  104.14 +  ['scstrcat_5fa',['scstrcat_a',['../string_8h.html#abacce4cbd6f70fcb6453904ef08b02e9',1,'string.c']]],
  104.15 +  ['scstrchr',['scstrchr',['../string_8h.html#a5836d6a7a744791c35e5c17bdc394a87',1,'string.c']]],
  104.16 +  ['scstrcmp',['scstrcmp',['../string_8h.html#af35272a8e5408c88ed3e25a3a98f0a82',1,'string.c']]],
  104.17 +  ['scstrdup',['scstrdup',['../string_8h.html#a97dccce03af419596dbdd592ca46a164',1,'string.c']]],
  104.18 +  ['scstrdup_5fa',['scstrdup_a',['../string_8h.html#a8fe58921f51eb1fde038472377e63014',1,'string.c']]],
  104.19 +  ['scstrlower',['scstrlower',['../string_8h.html#abccf198bea3186ff2abb080cc88dcae6',1,'string.c']]],
  104.20 +  ['scstrlower_5fa',['scstrlower_a',['../string_8h.html#a3cf1e557df7ab58d03c78832c4060276',1,'string.c']]],
  104.21 +  ['scstrn',['scstrn',['../string_8h.html#ae594f6e222ea394cef6a26c0dfad000d',1,'string.c']]],
  104.22 +  ['scstrnlen',['scstrnlen',['../string_8h.html#ac1b000030d6d197eec48c15a182055d5',1,'string.c']]],
  104.23 +  ['scstrprefix',['scstrprefix',['../string_8h.html#a599ddc2f88dd1df68b72eefd91347393',1,'string.c']]],
  104.24 +  ['scstrrchr',['scstrrchr',['../string_8h.html#ae389835b97cd9382e7d6a6a075323376',1,'string.c']]],
  104.25 +  ['scstrscstr',['scstrscstr',['../string_8h.html#a54f256c3abe811c52d58b4ff1b23f051',1,'string.c']]],
  104.26 +  ['scstrsplit',['scstrsplit',['../string_8h.html#ae71cac352b00230848bde358f0fb05ea',1,'string.c']]],
  104.27 +  ['scstrsplit_5fa',['scstrsplit_a',['../string_8h.html#a52906455ae530c9cdc6812c8e6d9bdef',1,'string.c']]],
  104.28 +  ['scstrsstr',['scstrsstr',['../string_8h.html#aa4362cb36c6629f9d8484739fd827748',1,'string.c']]],
  104.29 +  ['scstrsubs',['scstrsubs',['../string_8h.html#a9a6c8d8db0dda0037c3c852cce1a5060',1,'string.c']]],
  104.30 +  ['scstrsubsl',['scstrsubsl',['../string_8h.html#ad50f0f67b906fad0744f46bcb51e144b',1,'string.c']]],
  104.31 +  ['scstrsuffix',['scstrsuffix',['../string_8h.html#a1f0ae316a2afe85d5b4655e6ece6721a',1,'string.c']]],
  104.32 +  ['scstrtrim',['scstrtrim',['../string_8h.html#ad374b16eb1be8b48019debad9b9f268c',1,'string.c']]],
  104.33 +  ['scstrupper',['scstrupper',['../string_8h.html#af3dd09ec9d11162fe0075f4e60f41240',1,'string.c']]],
  104.34 +  ['scstrupper_5fa',['scstrupper_a',['../string_8h.html#aea94613eb74668cc05d365803d32bfad',1,'string.c']]],
  104.35 +  ['sfmt',['SFMT',['../string_8h.html#a23ed51e87385886bb65e8cd19c839362',1,'string.h']]],
  104.36 +  ['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()']]],
  104.37 +  ['space',['space',['../structUcxBuffer.html#a1a5076e85acb84b715a53bc0f37fb721',1,'UcxBuffer::space()'],['../structUcxStack.html#af64d528744bf3a47fec87d2e45d2992f',1,'UcxStack::space()']]],
  104.38 +  ['sstr',['sstr',['../string_8h.html#a539eb7059251a051ee5d179526a23e9a',1,'string.c']]],
  104.39 +  ['sstr_5ft',['sstr_t',['../structsstr__t.html',1,'']]],
  104.40 +  ['sstrcasecmp',['sstrcasecmp',['../string_8h.html#a81b0f6df794152c2038703d4e9d0ad59',1,'string.h']]],
  104.41 +  ['sstrcaseprefix',['sstrcaseprefix',['../string_8h.html#acd3dc64e90db9b4046e14f115a815ff4',1,'string.h']]],
  104.42 +  ['sstrcasesuffix',['sstrcasesuffix',['../string_8h.html#a57eabd4862d531dd685bbf2feb8468bf',1,'string.h']]],
  104.43 +  ['sstrcat',['sstrcat',['../string_8h.html#a6af8a4c347c7fdb5980d4c4803be2759',1,'string.h']]],
  104.44 +  ['sstrcat_5fa',['sstrcat_a',['../string_8h.html#a6068d460f9bc05962666a917d26568b3',1,'string.h']]],
  104.45 +  ['sstrchr',['sstrchr',['../string_8h.html#af80898a0b75955eb2579298c3ae2c481',1,'string.c']]],
  104.46 +  ['sstrcmp',['sstrcmp',['../string_8h.html#a7ae7156c8de57454ca38d306100b8160',1,'string.h']]],
  104.47 +  ['sstrdup',['sstrdup',['../string_8h.html#accbfd2b459a028d7af9fb7df6f977d80',1,'string.h']]],
  104.48 +  ['sstrdup_5fa',['sstrdup_a',['../string_8h.html#a8d098baada4ea9ad5d8b6343b5aec007',1,'string.h']]],
  104.49 +  ['sstrlower',['sstrlower',['../string_8h.html#a89343ea3e719f00ee802b557db57b769',1,'string.h']]],
  104.50 +  ['sstrlower_5fa',['sstrlower_a',['../string_8h.html#a4bb4742fe71115f493991d307cb22b23',1,'string.h']]],
  104.51 +  ['sstrn',['sstrn',['../string_8h.html#a2744c38ac44abf3e01fa059056dcf36c',1,'string.c']]],
  104.52 +  ['sstrnlen',['sstrnlen',['../string_8h.html#a33fa945acc5ac2ce962e5ef13cf1638c',1,'string.h']]],
  104.53 +  ['sstrprefix',['sstrprefix',['../string_8h.html#a7d73b66256384b26927e787318fdefa2',1,'string.h']]],
  104.54 +  ['sstrrchr',['sstrrchr',['../string_8h.html#adae3f59957ca328e1da5285cb8b02a72',1,'string.c']]],
  104.55 +  ['sstrscstr',['sstrscstr',['../string_8h.html#aa696932213265e10f864678686f4ccde',1,'string.h']]],
  104.56 +  ['sstrsplit',['sstrsplit',['../string_8h.html#aa929984004c3576bfafb95031aca8eb7',1,'string.h']]],
  104.57 +  ['sstrsplit_5fa',['sstrsplit_a',['../string_8h.html#ac9f69fa3a17e26a3a5f9d985b5844601',1,'string.h']]],
  104.58 +  ['sstrstr',['sstrstr',['../string_8h.html#a9d03be026afa9447c52bb34b9e3b895a',1,'string.h']]],
  104.59 +  ['sstrsubs',['sstrsubs',['../string_8h.html#a5eb9e0e1f26cf7fbecc038cd90e8b258',1,'string.c']]],
  104.60 +  ['sstrsubsl',['sstrsubsl',['../string_8h.html#a78925c91af54f23cebd20ff99ef4331a',1,'string.c']]],
  104.61 +  ['sstrsuffix',['sstrsuffix',['../string_8h.html#ac6a5246f26be2e8a5f34d8995b7ec14e',1,'string.h']]],
  104.62 +  ['sstrtrim',['sstrtrim',['../string_8h.html#ae2d6da564d3fce51f2e0cac580fdbc56',1,'string.c']]],
  104.63 +  ['sstrupper',['sstrupper',['../string_8h.html#a084fe5a3a90d6fb6b15ecda03bb30824',1,'string.h']]],
  104.64 +  ['sstrupper_5fa',['sstrupper_a',['../string_8h.html#a5f0dd83c0176b812fb428004b2877a34',1,'string.h']]],
  104.65 +  ['st',['ST',['../string_8h.html#a9037956cca97a4e84b642f17f3d10378',1,'string.h']]],
  104.66 +  ['stack_2eh',['stack.h',['../stack_8h.html',1,'']]],
  104.67 +  ['stream',['stream',['../structUcxLogger.html#a33fddf4791e8d49e479ecc78bf5d1b9e',1,'UcxLogger']]],
  104.68 +  ['string_2eh',['string.h',['../string_8h.html',1,'']]],
  104.69 +  ['success',['success',['../structUcxTestSuite.html#a6cefa870a3c2e38d6ee682e38643dbbb',1,'UcxTestSuite']]]
  104.70 +];
   105.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   105.2 +++ b/docs/api-2.1/search/classes_0.html	Sat Feb 06 19:11:44 2021 +0100
   105.3 @@ -0,0 +1,26 @@
   105.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   105.5 +<html><head><title></title>
   105.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   105.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   105.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   105.9 +<script type="text/javascript" src="classes_0.js"></script>
  105.10 +<script type="text/javascript" src="search.js"></script>
  105.11 +</head>
  105.12 +<body class="SRPage">
  105.13 +<div id="SRIndex">
  105.14 +<div class="SRStatus" id="Loading">Loading...</div>
  105.15 +<div id="SRResults"></div>
  105.16 +<script type="text/javascript"><!--
  105.17 +createResults();
  105.18 +--></script>
  105.19 +<div class="SRStatus" id="Searching">Searching...</div>
  105.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  105.21 +<script type="text/javascript"><!--
  105.22 +document.getElementById("Loading").style.display="none";
  105.23 +document.getElementById("NoMatches").style.display="none";
  105.24 +var searchResults = new SearchResults("searchResults");
  105.25 +searchResults.Search();
  105.26 +--></script>
  105.27 +</div>
  105.28 +</body>
  105.29 +</html>
   106.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   106.2 +++ b/docs/api-2.1/search/classes_0.js	Sat Feb 06 19:11:44 2021 +0100
   106.3 @@ -0,0 +1,5 @@
   106.4 +var searchData=
   106.5 +[
   106.6 +  ['scstr_5ft',['scstr_t',['../structscstr__t.html',1,'']]],
   106.7 +  ['sstr_5ft',['sstr_t',['../structsstr__t.html',1,'']]]
   106.8 +];
   107.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   107.2 +++ b/docs/api-2.1/search/classes_1.html	Sat Feb 06 19:11:44 2021 +0100
   107.3 @@ -0,0 +1,26 @@
   107.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   107.5 +<html><head><title></title>
   107.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   107.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   107.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   107.9 +<script type="text/javascript" src="classes_1.js"></script>
  107.10 +<script type="text/javascript" src="search.js"></script>
  107.11 +</head>
  107.12 +<body class="SRPage">
  107.13 +<div id="SRIndex">
  107.14 +<div class="SRStatus" id="Loading">Loading...</div>
  107.15 +<div id="SRResults"></div>
  107.16 +<script type="text/javascript"><!--
  107.17 +createResults();
  107.18 +--></script>
  107.19 +<div class="SRStatus" id="Searching">Searching...</div>
  107.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  107.21 +<script type="text/javascript"><!--
  107.22 +document.getElementById("Loading").style.display="none";
  107.23 +document.getElementById("NoMatches").style.display="none";
  107.24 +var searchResults = new SearchResults("searchResults");
  107.25 +searchResults.Search();
  107.26 +--></script>
  107.27 +</div>
  107.28 +</body>
  107.29 +</html>
   108.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   108.2 +++ b/docs/api-2.1/search/classes_1.js	Sat Feb 06 19:11:44 2021 +0100
   108.3 @@ -0,0 +1,23 @@
   108.4 +var searchData=
   108.5 +[
   108.6 +  ['ucx_5fmemchunk',['ucx_memchunk',['../structucx__memchunk.html',1,'']]],
   108.7 +  ['ucx_5fregdestr',['ucx_regdestr',['../structucx__regdestr.html',1,'']]],
   108.8 +  ['ucx_5fstack_5fmetadata',['ucx_stack_metadata',['../structucx__stack__metadata.html',1,'']]],
   108.9 +  ['ucxallocator',['UcxAllocator',['../structUcxAllocator.html',1,'']]],
  108.10 +  ['ucxarray',['UcxArray',['../structUcxArray.html',1,'']]],
  108.11 +  ['ucxavlnode',['UcxAVLNode',['../structUcxAVLNode.html',1,'']]],
  108.12 +  ['ucxavltree',['UcxAVLTree',['../structUcxAVLTree.html',1,'']]],
  108.13 +  ['ucxbuffer',['UcxBuffer',['../structUcxBuffer.html',1,'']]],
  108.14 +  ['ucxkey',['UcxKey',['../structUcxKey.html',1,'']]],
  108.15 +  ['ucxlist',['UcxList',['../structUcxList.html',1,'']]],
  108.16 +  ['ucxlogger',['UcxLogger',['../structUcxLogger.html',1,'']]],
  108.17 +  ['ucxmap',['UcxMap',['../structUcxMap.html',1,'']]],
  108.18 +  ['ucxmapelement',['UcxMapElement',['../structUcxMapElement.html',1,'']]],
  108.19 +  ['ucxmapiterator',['UcxMapIterator',['../structUcxMapIterator.html',1,'']]],
  108.20 +  ['ucxmapkey',['UcxMapKey',['../structUcxMapKey.html',1,'']]],
  108.21 +  ['ucxmempool',['UcxMempool',['../structUcxMempool.html',1,'']]],
  108.22 +  ['ucxproperties',['UcxProperties',['../structUcxProperties.html',1,'']]],
  108.23 +  ['ucxstack',['UcxStack',['../structUcxStack.html',1,'']]],
  108.24 +  ['ucxtestlist',['UcxTestList',['../structUcxTestList.html',1,'']]],
  108.25 +  ['ucxtestsuite',['UcxTestSuite',['../structUcxTestSuite.html',1,'']]]
  108.26 +];
   109.1 Binary file docs/api-2.1/search/close.png has changed
   110.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   110.2 +++ b/docs/api-2.1/search/defines_0.html	Sat Feb 06 19:11:44 2021 +0100
   110.3 @@ -0,0 +1,26 @@
   110.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   110.5 +<html><head><title></title>
   110.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   110.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   110.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   110.9 +<script type="text/javascript" src="defines_0.js"></script>
  110.10 +<script type="text/javascript" src="search.js"></script>
  110.11 +</head>
  110.12 +<body class="SRPage">
  110.13 +<div id="SRIndex">
  110.14 +<div class="SRStatus" id="Loading">Loading...</div>
  110.15 +<div id="SRResults"></div>
  110.16 +<script type="text/javascript"><!--
  110.17 +createResults();
  110.18 +--></script>
  110.19 +<div class="SRStatus" id="Searching">Searching...</div>
  110.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  110.21 +<script type="text/javascript"><!--
  110.22 +document.getElementById("Loading").style.display="none";
  110.23 +document.getElementById("NoMatches").style.display="none";
  110.24 +var searchResults = new SearchResults("searchResults");
  110.25 +searchResults.Search();
  110.26 +--></script>
  110.27 +</div>
  110.28 +</body>
  110.29 +</html>
   111.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   111.2 +++ b/docs/api-2.1/search/defines_0.js	Sat Feb 06 19:11:44 2021 +0100
   111.3 @@ -0,0 +1,4 @@
   111.4 +var searchData=
   111.5 +[
   111.6 +  ['_5f_5ffunction_5f_5f',['__FUNCTION__',['../test_8h.html#a828bb1dfda1afd67ca795075903d227d',1,'test.h']]]
   111.7 +];
   112.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   112.2 +++ b/docs/api-2.1/search/defines_1.html	Sat Feb 06 19:11:44 2021 +0100
   112.3 @@ -0,0 +1,26 @@
   112.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   112.5 +<html><head><title></title>
   112.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   112.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   112.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   112.9 +<script type="text/javascript" src="defines_1.js"></script>
  112.10 +<script type="text/javascript" src="search.js"></script>
  112.11 +</head>
  112.12 +<body class="SRPage">
  112.13 +<div id="SRIndex">
  112.14 +<div class="SRStatus" id="Loading">Loading...</div>
  112.15 +<div id="SRResults"></div>
  112.16 +<script type="text/javascript"><!--
  112.17 +createResults();
  112.18 +--></script>
  112.19 +<div class="SRStatus" id="Searching">Searching...</div>
  112.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  112.21 +<script type="text/javascript"><!--
  112.22 +document.getElementById("Loading").style.display="none";
  112.23 +document.getElementById("NoMatches").style.display="none";
  112.24 +var searchResults = new SearchResults("searchResults");
  112.25 +searchResults.Search();
  112.26 +--></script>
  112.27 +</div>
  112.28 +</body>
  112.29 +</html>
   113.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   113.2 +++ b/docs/api-2.1/search/defines_1.js	Sat Feb 06 19:11:44 2021 +0100
   113.3 @@ -0,0 +1,7 @@
   113.4 +var searchData=
   113.5 +[
   113.6 +  ['alcalloc',['alcalloc',['../allocator_8h.html#a8d71470816f88f78cb9a9686c57e1b10',1,'allocator.h']]],
   113.7 +  ['alfree',['alfree',['../allocator_8h.html#acd775785b54e97dc2b33a432c12c8fb2',1,'allocator.h']]],
   113.8 +  ['almalloc',['almalloc',['../allocator_8h.html#ae1bc218fea8a35f4a3706f0beefcfb19',1,'allocator.h']]],
   113.9 +  ['alrealloc',['alrealloc',['../allocator_8h.html#a029ee5c9bcbb3f873571553f788c5820',1,'allocator.h']]]
  113.10 +];
   114.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   114.2 +++ b/docs/api-2.1/search/defines_2.html	Sat Feb 06 19:11:44 2021 +0100
   114.3 @@ -0,0 +1,26 @@
   114.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   114.5 +<html><head><title></title>
   114.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   114.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   114.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   114.9 +<script type="text/javascript" src="defines_2.js"></script>
  114.10 +<script type="text/javascript" src="search.js"></script>
  114.11 +</head>
  114.12 +<body class="SRPage">
  114.13 +<div id="SRIndex">
  114.14 +<div class="SRStatus" id="Loading">Loading...</div>
  114.15 +<div id="SRResults"></div>
  114.16 +<script type="text/javascript"><!--
  114.17 +createResults();
  114.18 +--></script>
  114.19 +<div class="SRStatus" id="Searching">Searching...</div>
  114.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  114.21 +<script type="text/javascript"><!--
  114.22 +document.getElementById("Loading").style.display="none";
  114.23 +document.getElementById("NoMatches").style.display="none";
  114.24 +var searchResults = new SearchResults("searchResults");
  114.25 +searchResults.Search();
  114.26 +--></script>
  114.27 +</div>
  114.28 +</body>
  114.29 +</html>
   115.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   115.2 +++ b/docs/api-2.1/search/defines_2.js	Sat Feb 06 19:11:44 2021 +0100
   115.3 @@ -0,0 +1,4 @@
   115.4 +var searchData=
   115.5 +[
   115.6 +  ['prisstr',['PRIsstr',['../string_8h.html#a7d5bc48708405a28b23667e32dfcecae',1,'string.h']]]
   115.7 +];
   116.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   116.2 +++ b/docs/api-2.1/search/defines_3.html	Sat Feb 06 19:11:44 2021 +0100
   116.3 @@ -0,0 +1,26 @@
   116.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   116.5 +<html><head><title></title>
   116.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   116.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   116.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   116.9 +<script type="text/javascript" src="defines_3.js"></script>
  116.10 +<script type="text/javascript" src="search.js"></script>
  116.11 +</head>
  116.12 +<body class="SRPage">
  116.13 +<div id="SRIndex">
  116.14 +<div class="SRStatus" id="Loading">Loading...</div>
  116.15 +<div id="SRResults"></div>
  116.16 +<script type="text/javascript"><!--
  116.17 +createResults();
  116.18 +--></script>
  116.19 +<div class="SRStatus" id="Searching">Searching...</div>
  116.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  116.21 +<script type="text/javascript"><!--
  116.22 +document.getElementById("Loading").style.display="none";
  116.23 +document.getElementById("NoMatches").style.display="none";
  116.24 +var searchResults = new SearchResults("searchResults");
  116.25 +searchResults.Search();
  116.26 +--></script>
  116.27 +</div>
  116.28 +</body>
  116.29 +</html>
   117.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   117.2 +++ b/docs/api-2.1/search/defines_3.js	Sat Feb 06 19:11:44 2021 +0100
   117.3 @@ -0,0 +1,27 @@
   117.4 +var searchData=
   117.5 +[
   117.6 +  ['s',['S',['../string_8h.html#a8fa17c8cf4c36df48f4108c36da8573e',1,'string.h']]],
   117.7 +  ['sc',['SC',['../string_8h.html#a7d261dd0bc358c957a368bc058c1ce53',1,'string.h']]],
   117.8 +  ['scstr',['SCSTR',['../string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed',1,'string.h']]],
   117.9 +  ['sfmt',['SFMT',['../string_8h.html#a23ed51e87385886bb65e8cd19c839362',1,'string.h']]],
  117.10 +  ['sstrcasecmp',['sstrcasecmp',['../string_8h.html#a81b0f6df794152c2038703d4e9d0ad59',1,'string.h']]],
  117.11 +  ['sstrcaseprefix',['sstrcaseprefix',['../string_8h.html#acd3dc64e90db9b4046e14f115a815ff4',1,'string.h']]],
  117.12 +  ['sstrcasesuffix',['sstrcasesuffix',['../string_8h.html#a57eabd4862d531dd685bbf2feb8468bf',1,'string.h']]],
  117.13 +  ['sstrcat',['sstrcat',['../string_8h.html#a6af8a4c347c7fdb5980d4c4803be2759',1,'string.h']]],
  117.14 +  ['sstrcat_5fa',['sstrcat_a',['../string_8h.html#a6068d460f9bc05962666a917d26568b3',1,'string.h']]],
  117.15 +  ['sstrcmp',['sstrcmp',['../string_8h.html#a7ae7156c8de57454ca38d306100b8160',1,'string.h']]],
  117.16 +  ['sstrdup',['sstrdup',['../string_8h.html#accbfd2b459a028d7af9fb7df6f977d80',1,'string.h']]],
  117.17 +  ['sstrdup_5fa',['sstrdup_a',['../string_8h.html#a8d098baada4ea9ad5d8b6343b5aec007',1,'string.h']]],
  117.18 +  ['sstrlower',['sstrlower',['../string_8h.html#a89343ea3e719f00ee802b557db57b769',1,'string.h']]],
  117.19 +  ['sstrlower_5fa',['sstrlower_a',['../string_8h.html#a4bb4742fe71115f493991d307cb22b23',1,'string.h']]],
  117.20 +  ['sstrnlen',['sstrnlen',['../string_8h.html#a33fa945acc5ac2ce962e5ef13cf1638c',1,'string.h']]],
  117.21 +  ['sstrprefix',['sstrprefix',['../string_8h.html#a7d73b66256384b26927e787318fdefa2',1,'string.h']]],
  117.22 +  ['sstrscstr',['sstrscstr',['../string_8h.html#aa696932213265e10f864678686f4ccde',1,'string.h']]],
  117.23 +  ['sstrsplit',['sstrsplit',['../string_8h.html#aa929984004c3576bfafb95031aca8eb7',1,'string.h']]],
  117.24 +  ['sstrsplit_5fa',['sstrsplit_a',['../string_8h.html#ac9f69fa3a17e26a3a5f9d985b5844601',1,'string.h']]],
  117.25 +  ['sstrstr',['sstrstr',['../string_8h.html#a9d03be026afa9447c52bb34b9e3b895a',1,'string.h']]],
  117.26 +  ['sstrsuffix',['sstrsuffix',['../string_8h.html#ac6a5246f26be2e8a5f34d8995b7ec14e',1,'string.h']]],
  117.27 +  ['sstrupper',['sstrupper',['../string_8h.html#a084fe5a3a90d6fb6b15ecda03bb30824',1,'string.h']]],
  117.28 +  ['sstrupper_5fa',['sstrupper_a',['../string_8h.html#a5f0dd83c0176b812fb428004b2877a34',1,'string.h']]],
  117.29 +  ['st',['ST',['../string_8h.html#a9037956cca97a4e84b642f17f3d10378',1,'string.h']]]
  117.30 +];
   118.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   118.2 +++ b/docs/api-2.1/search/defines_4.html	Sat Feb 06 19:11:44 2021 +0100
   118.3 @@ -0,0 +1,26 @@
   118.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   118.5 +<html><head><title></title>
   118.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   118.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   118.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   118.9 +<script type="text/javascript" src="defines_4.js"></script>
  118.10 +<script type="text/javascript" src="search.js"></script>
  118.11 +</head>
  118.12 +<body class="SRPage">
  118.13 +<div id="SRIndex">
  118.14 +<div class="SRStatus" id="Loading">Loading...</div>
  118.15 +<div id="SRResults"></div>
  118.16 +<script type="text/javascript"><!--
  118.17 +createResults();
  118.18 +--></script>
  118.19 +<div class="SRStatus" id="Searching">Searching...</div>
  118.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  118.21 +<script type="text/javascript"><!--
  118.22 +document.getElementById("Loading").style.display="none";
  118.23 +document.getElementById("NoMatches").style.display="none";
  118.24 +var searchResults = new SearchResults("searchResults");
  118.25 +searchResults.Search();
  118.26 +--></script>
  118.27 +</div>
  118.28 +</body>
  118.29 +</html>
   119.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   119.2 +++ b/docs/api-2.1/search/defines_4.js	Sat Feb 06 19:11:44 2021 +0100
   119.3 @@ -0,0 +1,59 @@
   119.4 +var searchData=
   119.5 +[
   119.6 +  ['ucx_5fallocator_5fdefault',['UCX_ALLOCATOR_DEFAULT',['../allocator_8h.html#a1283a8f875f90a7af3aba5e031fc2e3f',1,'allocator.h']]],
   119.7 +  ['ucx_5farray_5futil_5fset',['ucx_array_util_set',['../array_8h.html#a1d959c29af3125bdd37cde3a554e729c',1,'array.h']]],
   119.8 +  ['ucx_5farray_5futil_5fsetptr',['ucx_array_util_setptr',['../array_8h.html#a59a5b342965e790945f9c7a3f86b99f9',1,'array.h']]],
   119.9 +  ['ucx_5favl_5fdefault_5fnew',['ucx_avl_default_new',['../avl_8h.html#ac2886d4b79b48c9fabf6408873f84cd2',1,'avl.h']]],
  119.10 +  ['ucx_5favl_5ffind_5fclosest',['UCX_AVL_FIND_CLOSEST',['../avl_8h.html#af16f24d74fd6af0154de041566c6603b',1,'avl.h']]],
  119.11 +  ['ucx_5favl_5ffind_5fexact',['UCX_AVL_FIND_EXACT',['../avl_8h.html#aaaf4a6f6f661cda7791db239212285d9',1,'avl.h']]],
  119.12 +  ['ucx_5favl_5ffind_5flower_5fbounded',['UCX_AVL_FIND_LOWER_BOUNDED',['../avl_8h.html#abd2446d544d5412b6997ee8a17bd368c',1,'avl.h']]],
  119.13 +  ['ucx_5favl_5ffind_5fupper_5fbounded',['UCX_AVL_FIND_UPPER_BOUNDED',['../avl_8h.html#ac74ee7649c1e206b08b31f37dd68ca5e',1,'avl.h']]],
  119.14 +  ['ucx_5fbprintf',['ucx_bprintf',['../utils_8h.html#a9d7d65a420f026fcb6982803d5120519',1,'utils.h']]],
  119.15 +  ['ucx_5fbuffer_5fautoextend',['UCX_BUFFER_AUTOEXTEND',['../buffer_8h.html#a05f9565f2d04399168c3b1c152a632be',1,'buffer.h']]],
  119.16 +  ['ucx_5fbuffer_5fautofree',['UCX_BUFFER_AUTOFREE',['../buffer_8h.html#a8bab11ad8a76719228b9ee91e2e45535',1,'buffer.h']]],
  119.17 +  ['ucx_5fbuffer_5fclear',['ucx_buffer_clear',['../buffer_8h.html#a374abd5aabfcc3ee0777a79d5fe651ab',1,'buffer.h']]],
  119.18 +  ['ucx_5fbuffer_5fclone',['ucx_buffer_clone',['../buffer_8h.html#a828353846428c2c2f695f9938f059e52',1,'buffer.h']]],
  119.19 +  ['ucx_5fbuffer_5fdefault',['UCX_BUFFER_DEFAULT',['../buffer_8h.html#acc77c8ed7b26854f555d4a5d11e49ea2',1,'buffer.h']]],
  119.20 +  ['ucx_5fbuffer_5fto_5fsstr',['ucx_buffer_to_sstr',['../buffer_8h.html#a0f4b64f1b3a74c4f6c5d9409d6b6086a',1,'buffer.h']]],
  119.21 +  ['ucx_5fforeach',['UCX_FOREACH',['../list_8h.html#a4b143b6526a410aa4d22cb3bb9365d70',1,'list.h']]],
  119.22 +  ['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']]],
  119.23 +  ['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']]],
  119.24 +  ['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']]],
  119.25 +  ['ucx_5flogger_5flevel',['UCX_LOGGER_LEVEL',['../logging_8h.html#aee18bc20e58ffb69910121512c350839',1,'logging.h']]],
  119.26 +  ['ucx_5flogger_5flog',['ucx_logger_log',['../logging_8h.html#aa0245325031d95799b28def177fd14ec',1,'logging.h']]],
  119.27 +  ['ucx_5flogger_5fregister_5flevel',['ucx_logger_register_level',['../logging_8h.html#a5cffc19502c4c90bfb3bd3bbcd18170a',1,'logging.h']]],
  119.28 +  ['ucx_5flogger_5fsource',['UCX_LOGGER_SOURCE',['../logging_8h.html#a0e0d72b12616c1e49ff8834eaf4cb8a2',1,'logging.h']]],
  119.29 +  ['ucx_5flogger_5ftimestamp',['UCX_LOGGER_TIMESTAMP',['../logging_8h.html#a38607008268b4f776ee500fb95d2e823',1,'logging.h']]],
  119.30 +  ['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']]],
  119.31 +  ['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']]],
  119.32 +  ['ucx_5fmap_5fcstr_5fget',['ucx_map_cstr_get',['../map_8h.html#a64e1fb55498fa502dd2ed8ed69062cdd',1,'map.h']]],
  119.33 +  ['ucx_5fmap_5fcstr_5fput',['ucx_map_cstr_put',['../map_8h.html#ad9356b01425b934ab237b52339ac0cc3',1,'map.h']]],
  119.34 +  ['ucx_5fmap_5fcstr_5fremove',['ucx_map_cstr_remove',['../map_8h.html#a9c4405a5a75ecf64e2ef3d0c6501a9fe',1,'map.h']]],
  119.35 +  ['ucx_5fmap_5fforeach',['UCX_MAP_FOREACH',['../map_8h.html#a940896c4aa1b13e54c55c04c3efc186b',1,'map.h']]],
  119.36 +  ['ucx_5fmap_5fint_5fget',['ucx_map_int_get',['../map_8h.html#aa1681bd2178553cd092fd24c4d681d3c',1,'map.h']]],
  119.37 +  ['ucx_5fmap_5fint_5fput',['ucx_map_int_put',['../map_8h.html#aaa30af79b4068c923895619e83f44367',1,'map.h']]],
  119.38 +  ['ucx_5fmap_5fint_5fremove',['ucx_map_int_remove',['../map_8h.html#aa767958b5468737755c09f7185b1770c',1,'map.h']]],
  119.39 +  ['ucx_5fmap_5fsstr_5fget',['ucx_map_sstr_get',['../map_8h.html#a14d385f6b7f371f0507861cabd2eab4e',1,'map.h']]],
  119.40 +  ['ucx_5fmap_5fsstr_5fput',['ucx_map_sstr_put',['../map_8h.html#ac26a8615bfc8f47ee9eaceb47645f98e',1,'map.h']]],
  119.41 +  ['ucx_5fmap_5fsstr_5fremove',['ucx_map_sstr_remove',['../map_8h.html#a48700ea86fadb9ea54d13010f9124df2',1,'map.h']]],
  119.42 +  ['ucx_5fmempool_5fnew_5fdefault',['ucx_mempool_new_default',['../mempool_8h.html#a49f7bd1da5ac201d0cf54dc0f0d82dd2',1,'mempool.h']]],
  119.43 +  ['ucx_5fsprintf',['ucx_sprintf',['../utils_8h.html#af9f333b66ecd639c347c7235f4992e2e',1,'utils.h']]],
  119.44 +  ['ucx_5fstack_5fdim',['ucx_stack_dim',['../stack_8h.html#a3b761343c6491222604341ebfa443226',1,'stack.h']]],
  119.45 +  ['ucx_5fstack_5fempty',['ucx_stack_empty',['../stack_8h.html#a4f7239dbd6c032c56812e370b71c1985',1,'stack.h']]],
  119.46 +  ['ucx_5fstack_5fpop',['ucx_stack_pop',['../stack_8h.html#a506b82374734ec476d086ddfb561174d',1,'stack.h']]],
  119.47 +  ['ucx_5fstack_5ftopsize',['ucx_stack_topsize',['../stack_8h.html#a030197051a803e87d5eeac5adb80b15a',1,'stack.h']]],
  119.48 +  ['ucx_5fstream_5fbcopy',['ucx_stream_bcopy',['../utils_8h.html#a6003a1750a66234169bd1f8cc84b297b',1,'utils.h']]],
  119.49 +  ['ucx_5fstream_5fcopy',['ucx_stream_copy',['../utils_8h.html#a41ca1344f781c0d3bf7a414a6e811392',1,'utils.h']]],
  119.50 +  ['ucx_5fstream_5fcopy_5fbufsize',['UCX_STREAM_COPY_BUFSIZE',['../utils_8h.html#a23efd74fa5f701d4cf26ccbfd138a439',1,'utils.h']]],
  119.51 +  ['ucx_5fstream_5fncopy',['ucx_stream_ncopy',['../utils_8h.html#add13f39a8af440b4f7e6f74339eaada2',1,'utils.h']]],
  119.52 +  ['ucx_5fszmul',['ucx_szmul',['../ucx_8h.html#a0b5ed6c1a0b15356f4f948acfd32a4cc',1,'ucx.h']]],
  119.53 +  ['ucx_5ftest',['UCX_TEST',['../test_8h.html#a66cfb29c329fc9eaef071f2449836659',1,'test.h']]],
  119.54 +  ['ucx_5ftest_5fassert',['UCX_TEST_ASSERT',['../test_8h.html#a08f477cd12fc3fe741a92493e5df58a9',1,'test.h']]],
  119.55 +  ['ucx_5ftest_5fbegin',['UCX_TEST_BEGIN',['../test_8h.html#a0547b8d4f3bcdb0633fdd8925e8aa5d4',1,'test.h']]],
  119.56 +  ['ucx_5ftest_5fcall_5fsubroutine',['UCX_TEST_CALL_SUBROUTINE',['../test_8h.html#a0efbab91c54f5237a2ab207f48cf0e51',1,'test.h']]],
  119.57 +  ['ucx_5ftest_5fend',['UCX_TEST_END',['../test_8h.html#a86e64857c04f0447f8b16fb9c2b3b639',1,'test.h']]],
  119.58 +  ['ucx_5ftest_5fsubroutine',['UCX_TEST_SUBROUTINE',['../test_8h.html#ae073cf5ead22cb27d662da048e16f44a',1,'test.h']]],
  119.59 +  ['ucx_5fversion',['UCX_VERSION',['../ucx_8h.html#af12001920ca2fc1405615684e4dea284',1,'ucx.h']]],
  119.60 +  ['ucx_5fversion_5fmajor',['UCX_VERSION_MAJOR',['../ucx_8h.html#aa57e5dd22d42387d748cc16777df1383',1,'ucx.h']]],
  119.61 +  ['ucx_5fversion_5fminor',['UCX_VERSION_MINOR',['../ucx_8h.html#a9ac10d6353e23d4615a87fc737c65eb0',1,'ucx.h']]]
  119.62 +];
   120.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   120.2 +++ b/docs/api-2.1/search/files_0.html	Sat Feb 06 19:11:44 2021 +0100
   120.3 @@ -0,0 +1,26 @@
   120.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   120.5 +<html><head><title></title>
   120.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   120.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   120.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   120.9 +<script type="text/javascript" src="files_0.js"></script>
  120.10 +<script type="text/javascript" src="search.js"></script>
  120.11 +</head>
  120.12 +<body class="SRPage">
  120.13 +<div id="SRIndex">
  120.14 +<div class="SRStatus" id="Loading">Loading...</div>
  120.15 +<div id="SRResults"></div>
  120.16 +<script type="text/javascript"><!--
  120.17 +createResults();
  120.18 +--></script>
  120.19 +<div class="SRStatus" id="Searching">Searching...</div>
  120.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  120.21 +<script type="text/javascript"><!--
  120.22 +document.getElementById("Loading").style.display="none";
  120.23 +document.getElementById("NoMatches").style.display="none";
  120.24 +var searchResults = new SearchResults("searchResults");
  120.25 +searchResults.Search();
  120.26 +--></script>
  120.27 +</div>
  120.28 +</body>
  120.29 +</html>
   121.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   121.2 +++ b/docs/api-2.1/search/files_0.js	Sat Feb 06 19:11:44 2021 +0100
   121.3 @@ -0,0 +1,6 @@
   121.4 +var searchData=
   121.5 +[
   121.6 +  ['allocator_2eh',['allocator.h',['../allocator_8h.html',1,'']]],
   121.7 +  ['array_2eh',['array.h',['../array_8h.html',1,'']]],
   121.8 +  ['avl_2eh',['avl.h',['../avl_8h.html',1,'']]]
   121.9 +];
   122.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   122.2 +++ b/docs/api-2.1/search/files_1.html	Sat Feb 06 19:11:44 2021 +0100
   122.3 @@ -0,0 +1,26 @@
   122.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   122.5 +<html><head><title></title>
   122.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   122.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   122.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   122.9 +<script type="text/javascript" src="files_1.js"></script>
  122.10 +<script type="text/javascript" src="search.js"></script>
  122.11 +</head>
  122.12 +<body class="SRPage">
  122.13 +<div id="SRIndex">
  122.14 +<div class="SRStatus" id="Loading">Loading...</div>
  122.15 +<div id="SRResults"></div>
  122.16 +<script type="text/javascript"><!--
  122.17 +createResults();
  122.18 +--></script>
  122.19 +<div class="SRStatus" id="Searching">Searching...</div>
  122.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  122.21 +<script type="text/javascript"><!--
  122.22 +document.getElementById("Loading").style.display="none";
  122.23 +document.getElementById("NoMatches").style.display="none";
  122.24 +var searchResults = new SearchResults("searchResults");
  122.25 +searchResults.Search();
  122.26 +--></script>
  122.27 +</div>
  122.28 +</body>
  122.29 +</html>
   123.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   123.2 +++ b/docs/api-2.1/search/files_1.js	Sat Feb 06 19:11:44 2021 +0100
   123.3 @@ -0,0 +1,4 @@
   123.4 +var searchData=
   123.5 +[
   123.6 +  ['buffer_2eh',['buffer.h',['../buffer_8h.html',1,'']]]
   123.7 +];
   124.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   124.2 +++ b/docs/api-2.1/search/files_2.html	Sat Feb 06 19:11:44 2021 +0100
   124.3 @@ -0,0 +1,26 @@
   124.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   124.5 +<html><head><title></title>
   124.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   124.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   124.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   124.9 +<script type="text/javascript" src="files_2.js"></script>
  124.10 +<script type="text/javascript" src="search.js"></script>
  124.11 +</head>
  124.12 +<body class="SRPage">
  124.13 +<div id="SRIndex">
  124.14 +<div class="SRStatus" id="Loading">Loading...</div>
  124.15 +<div id="SRResults"></div>
  124.16 +<script type="text/javascript"><!--
  124.17 +createResults();
  124.18 +--></script>
  124.19 +<div class="SRStatus" id="Searching">Searching...</div>
  124.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  124.21 +<script type="text/javascript"><!--
  124.22 +document.getElementById("Loading").style.display="none";
  124.23 +document.getElementById("NoMatches").style.display="none";
  124.24 +var searchResults = new SearchResults("searchResults");
  124.25 +searchResults.Search();
  124.26 +--></script>
  124.27 +</div>
  124.28 +</body>
  124.29 +</html>
   125.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   125.2 +++ b/docs/api-2.1/search/files_2.js	Sat Feb 06 19:11:44 2021 +0100
   125.3 @@ -0,0 +1,5 @@
   125.4 +var searchData=
   125.5 +[
   125.6 +  ['list_2eh',['list.h',['../list_8h.html',1,'']]],
   125.7 +  ['logging_2eh',['logging.h',['../logging_8h.html',1,'']]]
   125.8 +];
   126.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   126.2 +++ b/docs/api-2.1/search/files_3.html	Sat Feb 06 19:11:44 2021 +0100
   126.3 @@ -0,0 +1,26 @@
   126.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   126.5 +<html><head><title></title>
   126.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   126.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   126.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   126.9 +<script type="text/javascript" src="files_3.js"></script>
  126.10 +<script type="text/javascript" src="search.js"></script>
  126.11 +</head>
  126.12 +<body class="SRPage">
  126.13 +<div id="SRIndex">
  126.14 +<div class="SRStatus" id="Loading">Loading...</div>
  126.15 +<div id="SRResults"></div>
  126.16 +<script type="text/javascript"><!--
  126.17 +createResults();
  126.18 +--></script>
  126.19 +<div class="SRStatus" id="Searching">Searching...</div>
  126.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  126.21 +<script type="text/javascript"><!--
  126.22 +document.getElementById("Loading").style.display="none";
  126.23 +document.getElementById("NoMatches").style.display="none";
  126.24 +var searchResults = new SearchResults("searchResults");
  126.25 +searchResults.Search();
  126.26 +--></script>
  126.27 +</div>
  126.28 +</body>
  126.29 +</html>
   127.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   127.2 +++ b/docs/api-2.1/search/files_3.js	Sat Feb 06 19:11:44 2021 +0100
   127.3 @@ -0,0 +1,5 @@
   127.4 +var searchData=
   127.5 +[
   127.6 +  ['map_2eh',['map.h',['../map_8h.html',1,'']]],
   127.7 +  ['mempool_2eh',['mempool.h',['../mempool_8h.html',1,'']]]
   127.8 +];
   128.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   128.2 +++ b/docs/api-2.1/search/files_4.html	Sat Feb 06 19:11:44 2021 +0100
   128.3 @@ -0,0 +1,26 @@
   128.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   128.5 +<html><head><title></title>
   128.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   128.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   128.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   128.9 +<script type="text/javascript" src="files_4.js"></script>
  128.10 +<script type="text/javascript" src="search.js"></script>
  128.11 +</head>
  128.12 +<body class="SRPage">
  128.13 +<div id="SRIndex">
  128.14 +<div class="SRStatus" id="Loading">Loading...</div>
  128.15 +<div id="SRResults"></div>
  128.16 +<script type="text/javascript"><!--
  128.17 +createResults();
  128.18 +--></script>
  128.19 +<div class="SRStatus" id="Searching">Searching...</div>
  128.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  128.21 +<script type="text/javascript"><!--
  128.22 +document.getElementById("Loading").style.display="none";
  128.23 +document.getElementById("NoMatches").style.display="none";
  128.24 +var searchResults = new SearchResults("searchResults");
  128.25 +searchResults.Search();
  128.26 +--></script>
  128.27 +</div>
  128.28 +</body>
  128.29 +</html>
   129.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   129.2 +++ b/docs/api-2.1/search/files_4.js	Sat Feb 06 19:11:44 2021 +0100
   129.3 @@ -0,0 +1,4 @@
   129.4 +var searchData=
   129.5 +[
   129.6 +  ['properties_2eh',['properties.h',['../properties_8h.html',1,'']]]
   129.7 +];
   130.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   130.2 +++ b/docs/api-2.1/search/files_5.html	Sat Feb 06 19:11:44 2021 +0100
   130.3 @@ -0,0 +1,26 @@
   130.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   130.5 +<html><head><title></title>
   130.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   130.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   130.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   130.9 +<script type="text/javascript" src="files_5.js"></script>
  130.10 +<script type="text/javascript" src="search.js"></script>
  130.11 +</head>
  130.12 +<body class="SRPage">
  130.13 +<div id="SRIndex">
  130.14 +<div class="SRStatus" id="Loading">Loading...</div>
  130.15 +<div id="SRResults"></div>
  130.16 +<script type="text/javascript"><!--
  130.17 +createResults();
  130.18 +--></script>
  130.19 +<div class="SRStatus" id="Searching">Searching...</div>
  130.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  130.21 +<script type="text/javascript"><!--
  130.22 +document.getElementById("Loading").style.display="none";
  130.23 +document.getElementById("NoMatches").style.display="none";
  130.24 +var searchResults = new SearchResults("searchResults");
  130.25 +searchResults.Search();
  130.26 +--></script>
  130.27 +</div>
  130.28 +</body>
  130.29 +</html>
   131.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   131.2 +++ b/docs/api-2.1/search/files_5.js	Sat Feb 06 19:11:44 2021 +0100
   131.3 @@ -0,0 +1,5 @@
   131.4 +var searchData=
   131.5 +[
   131.6 +  ['stack_2eh',['stack.h',['../stack_8h.html',1,'']]],
   131.7 +  ['string_2eh',['string.h',['../string_8h.html',1,'']]]
   131.8 +];
   132.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   132.2 +++ b/docs/api-2.1/search/files_6.html	Sat Feb 06 19:11:44 2021 +0100
   132.3 @@ -0,0 +1,26 @@
   132.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   132.5 +<html><head><title></title>
   132.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   132.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   132.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   132.9 +<script type="text/javascript" src="files_6.js"></script>
  132.10 +<script type="text/javascript" src="search.js"></script>
  132.11 +</head>
  132.12 +<body class="SRPage">
  132.13 +<div id="SRIndex">
  132.14 +<div class="SRStatus" id="Loading">Loading...</div>
  132.15 +<div id="SRResults"></div>
  132.16 +<script type="text/javascript"><!--
  132.17 +createResults();
  132.18 +--></script>
  132.19 +<div class="SRStatus" id="Searching">Searching...</div>
  132.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  132.21 +<script type="text/javascript"><!--
  132.22 +document.getElementById("Loading").style.display="none";
  132.23 +document.getElementById("NoMatches").style.display="none";
  132.24 +var searchResults = new SearchResults("searchResults");
  132.25 +searchResults.Search();
  132.26 +--></script>
  132.27 +</div>
  132.28 +</body>
  132.29 +</html>
   133.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   133.2 +++ b/docs/api-2.1/search/files_6.js	Sat Feb 06 19:11:44 2021 +0100
   133.3 @@ -0,0 +1,4 @@
   133.4 +var searchData=
   133.5 +[
   133.6 +  ['test_2eh',['test.h',['../test_8h.html',1,'']]]
   133.7 +];
   134.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   134.2 +++ b/docs/api-2.1/search/files_7.html	Sat Feb 06 19:11:44 2021 +0100
   134.3 @@ -0,0 +1,26 @@
   134.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   134.5 +<html><head><title></title>
   134.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   134.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   134.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   134.9 +<script type="text/javascript" src="files_7.js"></script>
  134.10 +<script type="text/javascript" src="search.js"></script>
  134.11 +</head>
  134.12 +<body class="SRPage">
  134.13 +<div id="SRIndex">
  134.14 +<div class="SRStatus" id="Loading">Loading...</div>
  134.15 +<div id="SRResults"></div>
  134.16 +<script type="text/javascript"><!--
  134.17 +createResults();
  134.18 +--></script>
  134.19 +<div class="SRStatus" id="Searching">Searching...</div>
  134.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  134.21 +<script type="text/javascript"><!--
  134.22 +document.getElementById("Loading").style.display="none";
  134.23 +document.getElementById("NoMatches").style.display="none";
  134.24 +var searchResults = new SearchResults("searchResults");
  134.25 +searchResults.Search();
  134.26 +--></script>
  134.27 +</div>
  134.28 +</body>
  134.29 +</html>
   135.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   135.2 +++ b/docs/api-2.1/search/files_7.js	Sat Feb 06 19:11:44 2021 +0100
   135.3 @@ -0,0 +1,5 @@
   135.4 +var searchData=
   135.5 +[
   135.6 +  ['ucx_2eh',['ucx.h',['../ucx_8h.html',1,'']]],
   135.7 +  ['utils_2eh',['utils.h',['../utils_8h.html',1,'']]]
   135.8 +];
   136.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   136.2 +++ b/docs/api-2.1/search/functions_0.html	Sat Feb 06 19:11:44 2021 +0100
   136.3 @@ -0,0 +1,26 @@
   136.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   136.5 +<html><head><title></title>
   136.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   136.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   136.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   136.9 +<script type="text/javascript" src="functions_0.js"></script>
  136.10 +<script type="text/javascript" src="search.js"></script>
  136.11 +</head>
  136.12 +<body class="SRPage">
  136.13 +<div id="SRIndex">
  136.14 +<div class="SRStatus" id="Loading">Loading...</div>
  136.15 +<div id="SRResults"></div>
  136.16 +<script type="text/javascript"><!--
  136.17 +createResults();
  136.18 +--></script>
  136.19 +<div class="SRStatus" id="Searching">Searching...</div>
  136.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  136.21 +<script type="text/javascript"><!--
  136.22 +document.getElementById("Loading").style.display="none";
  136.23 +document.getElementById("NoMatches").style.display="none";
  136.24 +var searchResults = new SearchResults("searchResults");
  136.25 +searchResults.Search();
  136.26 +--></script>
  136.27 +</div>
  136.28 +</body>
  136.29 +</html>
   137.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   137.2 +++ b/docs/api-2.1/search/functions_0.js	Sat Feb 06 19:11:44 2021 +0100
   137.3 @@ -0,0 +1,36 @@
   137.4 +var searchData=
   137.5 +[
   137.6 +  ['scstr',['scstr',['../string_8h.html#a2b1d6f1eca1c1549f37107b9c026c5a6',1,'string.c']]],
   137.7 +  ['scstrcasecmp',['scstrcasecmp',['../string_8h.html#aca8142fb823d253054e17c17cfca05e0',1,'string.c']]],
   137.8 +  ['scstrcaseprefix',['scstrcaseprefix',['../string_8h.html#a3718ef4aa1e86cdb26bda2f07fb585df',1,'string.c']]],
   137.9 +  ['scstrcasesuffix',['scstrcasesuffix',['../string_8h.html#a6edb4b85f2b9efe79db7ffe6eccd7bc3',1,'string.c']]],
  137.10 +  ['scstrcat',['scstrcat',['../string_8h.html#a7376842c19e954b49215da81ef76ac0c',1,'string.c']]],
  137.11 +  ['scstrcat_5fa',['scstrcat_a',['../string_8h.html#abacce4cbd6f70fcb6453904ef08b02e9',1,'string.c']]],
  137.12 +  ['scstrchr',['scstrchr',['../string_8h.html#a5836d6a7a744791c35e5c17bdc394a87',1,'string.c']]],
  137.13 +  ['scstrcmp',['scstrcmp',['../string_8h.html#af35272a8e5408c88ed3e25a3a98f0a82',1,'string.c']]],
  137.14 +  ['scstrdup',['scstrdup',['../string_8h.html#a97dccce03af419596dbdd592ca46a164',1,'string.c']]],
  137.15 +  ['scstrdup_5fa',['scstrdup_a',['../string_8h.html#a8fe58921f51eb1fde038472377e63014',1,'string.c']]],
  137.16 +  ['scstrlower',['scstrlower',['../string_8h.html#abccf198bea3186ff2abb080cc88dcae6',1,'string.c']]],
  137.17 +  ['scstrlower_5fa',['scstrlower_a',['../string_8h.html#a3cf1e557df7ab58d03c78832c4060276',1,'string.c']]],
  137.18 +  ['scstrn',['scstrn',['../string_8h.html#ae594f6e222ea394cef6a26c0dfad000d',1,'string.c']]],
  137.19 +  ['scstrnlen',['scstrnlen',['../string_8h.html#ac1b000030d6d197eec48c15a182055d5',1,'string.c']]],
  137.20 +  ['scstrprefix',['scstrprefix',['../string_8h.html#a599ddc2f88dd1df68b72eefd91347393',1,'string.c']]],
  137.21 +  ['scstrrchr',['scstrrchr',['../string_8h.html#ae389835b97cd9382e7d6a6a075323376',1,'string.c']]],
  137.22 +  ['scstrscstr',['scstrscstr',['../string_8h.html#a54f256c3abe811c52d58b4ff1b23f051',1,'string.c']]],
  137.23 +  ['scstrsplit',['scstrsplit',['../string_8h.html#ae71cac352b00230848bde358f0fb05ea',1,'string.c']]],
  137.24 +  ['scstrsplit_5fa',['scstrsplit_a',['../string_8h.html#a52906455ae530c9cdc6812c8e6d9bdef',1,'string.c']]],
  137.25 +  ['scstrsstr',['scstrsstr',['../string_8h.html#aa4362cb36c6629f9d8484739fd827748',1,'string.c']]],
  137.26 +  ['scstrsubs',['scstrsubs',['../string_8h.html#a9a6c8d8db0dda0037c3c852cce1a5060',1,'string.c']]],
  137.27 +  ['scstrsubsl',['scstrsubsl',['../string_8h.html#ad50f0f67b906fad0744f46bcb51e144b',1,'string.c']]],
  137.28 +  ['scstrsuffix',['scstrsuffix',['../string_8h.html#a1f0ae316a2afe85d5b4655e6ece6721a',1,'string.c']]],
  137.29 +  ['scstrtrim',['scstrtrim',['../string_8h.html#ad374b16eb1be8b48019debad9b9f268c',1,'string.c']]],
  137.30 +  ['scstrupper',['scstrupper',['../string_8h.html#af3dd09ec9d11162fe0075f4e60f41240',1,'string.c']]],
  137.31 +  ['scstrupper_5fa',['scstrupper_a',['../string_8h.html#aea94613eb74668cc05d365803d32bfad',1,'string.c']]],
  137.32 +  ['sstr',['sstr',['../string_8h.html#a539eb7059251a051ee5d179526a23e9a',1,'string.c']]],
  137.33 +  ['sstrchr',['sstrchr',['../string_8h.html#af80898a0b75955eb2579298c3ae2c481',1,'string.c']]],
  137.34 +  ['sstrn',['sstrn',['../string_8h.html#a2744c38ac44abf3e01fa059056dcf36c',1,'string.c']]],
  137.35 +  ['sstrrchr',['sstrrchr',['../string_8h.html#adae3f59957ca328e1da5285cb8b02a72',1,'string.c']]],
  137.36 +  ['sstrsubs',['sstrsubs',['../string_8h.html#a5eb9e0e1f26cf7fbecc038cd90e8b258',1,'string.c']]],
  137.37 +  ['sstrsubsl',['sstrsubsl',['../string_8h.html#a78925c91af54f23cebd20ff99ef4331a',1,'string.c']]],
  137.38 +  ['sstrtrim',['sstrtrim',['../string_8h.html#ae2d6da564d3fce51f2e0cac580fdbc56',1,'string.c']]]
  137.39 +];
   138.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   138.2 +++ b/docs/api-2.1/search/functions_1.html	Sat Feb 06 19:11:44 2021 +0100
   138.3 @@ -0,0 +1,26 @@
   138.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   138.5 +<html><head><title></title>
   138.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   138.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   138.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   138.9 +<script type="text/javascript" src="functions_1.js"></script>
  138.10 +<script type="text/javascript" src="search.js"></script>
  138.11 +</head>
  138.12 +<body class="SRPage">
  138.13 +<div id="SRIndex">
  138.14 +<div class="SRStatus" id="Loading">Loading...</div>
  138.15 +<div id="SRResults"></div>
  138.16 +<script type="text/javascript"><!--
  138.17 +createResults();
  138.18 +--></script>
  138.19 +<div class="SRStatus" id="Searching">Searching...</div>
  138.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  138.21 +<script type="text/javascript"><!--
  138.22 +document.getElementById("Loading").style.display="none";
  138.23 +document.getElementById("NoMatches").style.display="none";
  138.24 +var searchResults = new SearchResults("searchResults");
  138.25 +searchResults.Search();
  138.26 +--></script>
  138.27 +</div>
  138.28 +</body>
  138.29 +</html>
   139.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   139.2 +++ b/docs/api-2.1/search/functions_1.js	Sat Feb 06 19:11:44 2021 +0100
   139.3 @@ -0,0 +1,185 @@
   139.4 +var searchData=
   139.5 +[
   139.6 +  ['ucx_5farray_5fappend_5ffrom',['ucx_array_append_from',['../array_8h.html#aea01731ad94ea73c0c8fb1d1b7a35fcf',1,'array.c']]],
   139.7 +  ['ucx_5farray_5fat',['ucx_array_at',['../array_8h.html#aa698085fd1a8b70d6b709999c51b49e8',1,'array.c']]],
   139.8 +  ['ucx_5farray_5fclone',['ucx_array_clone',['../array_8h.html#a4a8c273370e4a3a3e2624e364f5ab410',1,'array.c']]],
   139.9 +  ['ucx_5farray_5fconcat',['ucx_array_concat',['../array_8h.html#aa5a0bf3d3f0df6406beb0e569021cc28',1,'array.c']]],
  139.10 +  ['ucx_5farray_5fcontains',['ucx_array_contains',['../array_8h.html#a5241058cd2329147bc5b1593ae7e51dc',1,'array.c']]],
  139.11 +  ['ucx_5farray_5fdestroy',['ucx_array_destroy',['../array_8h.html#a8e83681d8d5d8cddbf10f63ce5be4c10',1,'array.c']]],
  139.12 +  ['ucx_5farray_5fequals',['ucx_array_equals',['../array_8h.html#a43292b448adb1741677aa8c578bcc201',1,'array.c']]],
  139.13 +  ['ucx_5farray_5ffind',['ucx_array_find',['../array_8h.html#ae7bdbed94afee9b20b38b95e3ab470f0',1,'array.c']]],
  139.14 +  ['ucx_5farray_5ffree',['ucx_array_free',['../array_8h.html#ac01ee914468a16f470bf3071fffbe438',1,'array.c']]],
  139.15 +  ['ucx_5farray_5fgrow',['ucx_array_grow',['../array_8h.html#ab0cbf243824aaebee48277315e03afce',1,'array.c']]],
  139.16 +  ['ucx_5farray_5finit',['ucx_array_init',['../array_8h.html#ad921e85c28ffae32230777a53c5037e5',1,'array.c']]],
  139.17 +  ['ucx_5farray_5finit_5fa',['ucx_array_init_a',['../array_8h.html#a2451e61ebb15a7ba1c1319267ba75b8c',1,'array.c']]],
  139.18 +  ['ucx_5farray_5fnew',['ucx_array_new',['../array_8h.html#a994a2fbf1c33a3833e2a70cd9a4352b7',1,'array.c']]],
  139.19 +  ['ucx_5farray_5fnew_5fa',['ucx_array_new_a',['../array_8h.html#a177170258c215eb2e4f5a32e59f0cb1b',1,'array.c']]],
  139.20 +  ['ucx_5farray_5fprepend_5ffrom',['ucx_array_prepend_from',['../array_8h.html#a95b52acc2193b5c33cf0eaa4f2082477',1,'array.c']]],
  139.21 +  ['ucx_5farray_5fremove',['ucx_array_remove',['../array_8h.html#aa45eac6b697f83adac81c0860cf306b8',1,'array.c']]],
  139.22 +  ['ucx_5farray_5fremove_5ffast',['ucx_array_remove_fast',['../array_8h.html#a548d81b07612bae3ba8c4c4b49104b8e',1,'array.c']]],
  139.23 +  ['ucx_5farray_5freserve',['ucx_array_reserve',['../array_8h.html#a1c3bf8433c1de3c933f3854ab297fe1d',1,'array.c']]],
  139.24 +  ['ucx_5farray_5fresize',['ucx_array_resize',['../array_8h.html#a27762e7c06a6c781015e3c8ceeee0ce3',1,'array.c']]],
  139.25 +  ['ucx_5farray_5fset_5ffrom',['ucx_array_set_from',['../array_8h.html#a1bb545d065358d265d80d815ba382a28',1,'array.c']]],
  139.26 +  ['ucx_5farray_5fshrink',['ucx_array_shrink',['../array_8h.html#a2daf50e80aee9bccebee876a7efd2dfc',1,'array.c']]],
  139.27 +  ['ucx_5farray_5fsort',['ucx_array_sort',['../array_8h.html#add773514569b872a6624381b4b6af52c',1,'array.c']]],
  139.28 +  ['ucx_5farray_5futil_5fset_5fa',['ucx_array_util_set_a',['../array_8h.html#ad0a8d76980cf1c1910e64a245803fb9a',1,'array.c']]],
  139.29 +  ['ucx_5farray_5futil_5fsetptr_5fa',['ucx_array_util_setptr_a',['../array_8h.html#ad708b333c0c1b02c998309a58ea65e31',1,'array.c']]],
  139.30 +  ['ucx_5fasprintf',['ucx_asprintf',['../utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5',1,'utils.c']]],
  139.31 +  ['ucx_5favl_5fcount',['ucx_avl_count',['../avl_8h.html#a92c1d41c2b22fe4a029a486ab2153e35',1,'avl.c']]],
  139.32 +  ['ucx_5favl_5ffind',['ucx_avl_find',['../avl_8h.html#a51770e1614b28d7d22dea096c3704f83',1,'avl.c']]],
  139.33 +  ['ucx_5favl_5ffind_5fnode',['ucx_avl_find_node',['../avl_8h.html#a664986f64d6865605199fbff06e19cd5',1,'avl.c']]],
  139.34 +  ['ucx_5favl_5ffree',['ucx_avl_free',['../avl_8h.html#a2f92db538f25fce908d2cb3e5590944c',1,'avl.c']]],
  139.35 +  ['ucx_5favl_5ffree_5fcontent',['ucx_avl_free_content',['../avl_8h.html#a31ad7fb196ca211f1fc39f4e15f72279',1,'avl.c']]],
  139.36 +  ['ucx_5favl_5fget',['ucx_avl_get',['../avl_8h.html#adbcf7ceb3f014a30c7214f7304519efe',1,'avl.c']]],
  139.37 +  ['ucx_5favl_5fget_5fnode',['ucx_avl_get_node',['../avl_8h.html#acf42da9a4168e47dc10b4ba0d27ceb4e',1,'avl.c']]],
  139.38 +  ['ucx_5favl_5fnew',['ucx_avl_new',['../avl_8h.html#a11b043d65a11b7092d5d98b298e5ede3',1,'avl.c']]],
  139.39 +  ['ucx_5favl_5fnew_5fa',['ucx_avl_new_a',['../avl_8h.html#af0f868d67e9dc08b4867c02a06c23ee2',1,'avl.c']]],
  139.40 +  ['ucx_5favl_5fpred',['ucx_avl_pred',['../avl_8h.html#a0e739aeb66dda6a6a3f6eb51b50cf346',1,'avl.c']]],
  139.41 +  ['ucx_5favl_5fput',['ucx_avl_put',['../avl_8h.html#aec401fab4a24a7edffa734f9baf88577',1,'avl.c']]],
  139.42 +  ['ucx_5favl_5fput_5fs',['ucx_avl_put_s',['../avl_8h.html#a32cf8955cc0226a82bacfc7b76d6474c',1,'avl.c']]],
  139.43 +  ['ucx_5favl_5fremove',['ucx_avl_remove',['../avl_8h.html#a1d821119c805d7fbb7e424bc3effeba9',1,'avl.c']]],
  139.44 +  ['ucx_5favl_5fremove_5fnode',['ucx_avl_remove_node',['../avl_8h.html#a9a792b7d9e58073deef74a341f8bc720',1,'avl.c']]],
  139.45 +  ['ucx_5favl_5fremove_5fs',['ucx_avl_remove_s',['../avl_8h.html#a01aeeecd6415f0cc2b623486eb28f254',1,'avl.c']]],
  139.46 +  ['ucx_5favl_5fsucc',['ucx_avl_succ',['../avl_8h.html#aab1ad9b027ff5e50671aa0ee84e2d541',1,'avl.c']]],
  139.47 +  ['ucx_5fbuffer_5feof',['ucx_buffer_eof',['../buffer_8h.html#abad7fd9ad5061224c780b8d1d4c55f09',1,'buffer.c']]],
  139.48 +  ['ucx_5fbuffer_5fextend',['ucx_buffer_extend',['../buffer_8h.html#afaf97d2cd7e9faad79a9d35fe33e30c6',1,'buffer.c']]],
  139.49 +  ['ucx_5fbuffer_5fextract',['ucx_buffer_extract',['../buffer_8h.html#a33fa7bb35fe08bbb3542f227514332ef',1,'buffer.c']]],
  139.50 +  ['ucx_5fbuffer_5ffree',['ucx_buffer_free',['../buffer_8h.html#a2af8646d8905c22c7322e7540b0440af',1,'buffer.c']]],
  139.51 +  ['ucx_5fbuffer_5fgetc',['ucx_buffer_getc',['../buffer_8h.html#a396339022159ce4ca6d069de9f9209b0',1,'buffer.c']]],
  139.52 +  ['ucx_5fbuffer_5fnew',['ucx_buffer_new',['../buffer_8h.html#aacea876d692193ec6f859ce98da7351c',1,'buffer.c']]],
  139.53 +  ['ucx_5fbuffer_5fputc',['ucx_buffer_putc',['../buffer_8h.html#a7d6f01b9d631b0123475dfb98fb849ac',1,'buffer.c']]],
  139.54 +  ['ucx_5fbuffer_5fputs',['ucx_buffer_puts',['../buffer_8h.html#af1d4b478e04b3ae0bf30e7c2ea964ea2',1,'buffer.c']]],
  139.55 +  ['ucx_5fbuffer_5fread',['ucx_buffer_read',['../buffer_8h.html#ae5c3430759f0059547b35d5a254d4da5',1,'buffer.c']]],
  139.56 +  ['ucx_5fbuffer_5fseek',['ucx_buffer_seek',['../buffer_8h.html#a47d98482662073c74f35deb0957d15d1',1,'buffer.c']]],
  139.57 +  ['ucx_5fbuffer_5fshift',['ucx_buffer_shift',['../buffer_8h.html#a12a0c6a2379ef080043e6286bb8bad69',1,'buffer.c']]],
  139.58 +  ['ucx_5fbuffer_5fshift_5fleft',['ucx_buffer_shift_left',['../buffer_8h.html#a20431dd0ed6a6fe9f15333bd72afe4db',1,'buffer.c']]],
  139.59 +  ['ucx_5fbuffer_5fshift_5fright',['ucx_buffer_shift_right',['../buffer_8h.html#a4fa10b6471495547eb981248fd4f1bc2',1,'buffer.c']]],
  139.60 +  ['ucx_5fbuffer_5fwrite',['ucx_buffer_write',['../buffer_8h.html#af8aacc7401814392b58c1b7b81bffc05',1,'buffer.c']]],
  139.61 +  ['ucx_5fcmp_5fdouble',['ucx_cmp_double',['../utils_8h.html#ab804b7c27d0bfcd7bf3a3583140825b6',1,'utils.c']]],
  139.62 +  ['ucx_5fcmp_5ffloat',['ucx_cmp_float',['../utils_8h.html#ad1196b561bcdad76c393885819769a97',1,'utils.c']]],
  139.63 +  ['ucx_5fcmp_5fint',['ucx_cmp_int',['../utils_8h.html#a8ce7e11e6b3deafe89a32a091fde7f16',1,'utils.c']]],
  139.64 +  ['ucx_5fcmp_5fint16',['ucx_cmp_int16',['../utils_8h.html#aa29e6e559946375e34113e34e0b0bd0d',1,'utils.c']]],
  139.65 +  ['ucx_5fcmp_5fint32',['ucx_cmp_int32',['../utils_8h.html#a858b2ac443fb202643b71f6a7e9218dd',1,'utils.c']]],
  139.66 +  ['ucx_5fcmp_5fint64',['ucx_cmp_int64',['../utils_8h.html#a54701aea6a89fed1402dfb0bf56bc7f6',1,'utils.c']]],
  139.67 +  ['ucx_5fcmp_5flongint',['ucx_cmp_longint',['../utils_8h.html#aeb57a2b9a6aaa0460c7a6bec29accf2c',1,'utils.c']]],
  139.68 +  ['ucx_5fcmp_5flonglong',['ucx_cmp_longlong',['../utils_8h.html#a366b57def20f86a41eaedf575eea5375',1,'utils.c']]],
  139.69 +  ['ucx_5fcmp_5fmem',['ucx_cmp_mem',['../utils_8h.html#aff7d2bcded71196831a8c0664333f8e7',1,'utils.c']]],
  139.70 +  ['ucx_5fcmp_5fptr',['ucx_cmp_ptr',['../utils_8h.html#aa174d539de3ea59be4f9640f17ce53d8',1,'utils.c']]],
  139.71 +  ['ucx_5fcmp_5fsstr',['ucx_cmp_sstr',['../utils_8h.html#adee0739589166d272f8cb7c23aabf8ba',1,'utils.c']]],
  139.72 +  ['ucx_5fcmp_5fstr',['ucx_cmp_str',['../utils_8h.html#aa6a37b9d172b6a5b2803d152f9e1b258',1,'utils.c']]],
  139.73 +  ['ucx_5fcmp_5fstrn',['ucx_cmp_strn',['../utils_8h.html#ac6b354a878f551a3a5b20a167db3f308',1,'utils.c']]],
  139.74 +  ['ucx_5fcmp_5fuint',['ucx_cmp_uint',['../utils_8h.html#abd83a5da91c3dd026a6931bd80c12f1e',1,'utils.c']]],
  139.75 +  ['ucx_5fcmp_5fuint16',['ucx_cmp_uint16',['../utils_8h.html#acde5366437e886a459b7468f7a9e11f0',1,'utils.c']]],
  139.76 +  ['ucx_5fcmp_5fuint32',['ucx_cmp_uint32',['../utils_8h.html#a5879d1722330355914d8c9146fa549d3',1,'utils.c']]],
  139.77 +  ['ucx_5fcmp_5fuint64',['ucx_cmp_uint64',['../utils_8h.html#a1572a78b5b42f7151a5b2a5a7283d62d',1,'utils.c']]],
  139.78 +  ['ucx_5fcmp_5fulongint',['ucx_cmp_ulongint',['../utils_8h.html#a3f3cbae2594d6f722bae29acb0408a24',1,'utils.c']]],
  139.79 +  ['ucx_5fcmp_5fulonglong',['ucx_cmp_ulonglong',['../utils_8h.html#a6acfc359421f21f9a042a654ff7faac5',1,'utils.c']]],
  139.80 +  ['ucx_5fdefault_5fallocator',['ucx_default_allocator',['../allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf',1,'allocator.c']]],
  139.81 +  ['ucx_5fdefault_5fcalloc',['ucx_default_calloc',['../allocator_8h.html#a3a0bfdd13d887012309c459b339f338f',1,'allocator.c']]],
  139.82 +  ['ucx_5fdefault_5ffree',['ucx_default_free',['../allocator_8h.html#a646d83aaaadfe33ae414c0fad8bfc52a',1,'allocator.c']]],
  139.83 +  ['ucx_5fdefault_5fmalloc',['ucx_default_malloc',['../allocator_8h.html#a96403ebf3d2312d95f2fe7627a1cdbc0',1,'allocator.c']]],
  139.84 +  ['ucx_5fdefault_5frealloc',['ucx_default_realloc',['../allocator_8h.html#a47cfc8af626a86fcb93a2b14b90498ed',1,'allocator.c']]],
  139.85 +  ['ucx_5fdist_5fint',['ucx_dist_int',['../utils_8h.html#a4ab6753739d56c09cdf6079fdcabf7c6',1,'utils.c']]],
  139.86 +  ['ucx_5fdist_5fint16',['ucx_dist_int16',['../utils_8h.html#a81fb8434b70ca11bf2c14abfa21d16a9',1,'utils.c']]],
  139.87 +  ['ucx_5fdist_5fint32',['ucx_dist_int32',['../utils_8h.html#ab4a659cc46096f0490c1dafa57726476',1,'utils.c']]],
  139.88 +  ['ucx_5fdist_5fint64',['ucx_dist_int64',['../utils_8h.html#a54e7d06585bad3a899befc4e9c13853f',1,'utils.c']]],
  139.89 +  ['ucx_5fdist_5flongint',['ucx_dist_longint',['../utils_8h.html#a43e73d288b1553a0078bf4c98dd341f5',1,'utils.c']]],
  139.90 +  ['ucx_5fdist_5flonglong',['ucx_dist_longlong',['../utils_8h.html#a306778414a2427951ea263be92368627',1,'utils.c']]],
  139.91 +  ['ucx_5fdist_5fuint',['ucx_dist_uint',['../utils_8h.html#a37b7d471ca1679992afc11a0deda45f4',1,'utils.c']]],
  139.92 +  ['ucx_5fdist_5fuint16',['ucx_dist_uint16',['../utils_8h.html#a66e00a0703cbcde050ec922578e2f080',1,'utils.c']]],
  139.93 +  ['ucx_5fdist_5fuint32',['ucx_dist_uint32',['../utils_8h.html#add2b5c5507caba59d894b84e056b079b',1,'utils.c']]],
  139.94 +  ['ucx_5fdist_5fuint64',['ucx_dist_uint64',['../utils_8h.html#a3ba75e2e0b2479eef2b22fb219b42da7',1,'utils.c']]],
  139.95 +  ['ucx_5fdist_5fulongint',['ucx_dist_ulongint',['../utils_8h.html#abb13476228d0c16bfaba08469adbae2d',1,'utils.c']]],
  139.96 +  ['ucx_5fdist_5fulonglong',['ucx_dist_ulonglong',['../utils_8h.html#a59a5859272cb4b43cbdd58208c41e32b',1,'utils.c']]],
  139.97 +  ['ucx_5ffprintf',['ucx_fprintf',['../utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a',1,'utils.c']]],
  139.98 +  ['ucx_5fhash',['ucx_hash',['../map_8h.html#aea3be97254c05595d986ef6a9faae87b',1,'map.c']]],
  139.99 +  ['ucx_5fkey',['ucx_key',['../map_8h.html#a3e540bb46b8ee19789aed63fd8919200',1,'map.c']]],
 139.100 +  ['ucx_5flist_5fappend',['ucx_list_append',['../list_8h.html#a00c122c8a26d35b60676939df4161621',1,'list.c']]],
 139.101 +  ['ucx_5flist_5fappend_5fa',['ucx_list_append_a',['../list_8h.html#adf3b3e2e0ff977d8928671d6bd82fc60',1,'list.c']]],
 139.102 +  ['ucx_5flist_5fclone',['ucx_list_clone',['../list_8h.html#ae7054a41c289b24e6caf5cb07ac850ed',1,'list.c']]],
 139.103 +  ['ucx_5flist_5fclone_5fa',['ucx_list_clone_a',['../list_8h.html#a08ca1ba0d2e82258b0408714c1f4c425',1,'list.c']]],
 139.104 +  ['ucx_5flist_5fconcat',['ucx_list_concat',['../list_8h.html#a77163a0cc82fae52bec26c8c0c3674d9',1,'list.c']]],
 139.105 +  ['ucx_5flist_5fcontains',['ucx_list_contains',['../list_8h.html#a8b0fa051fcfe12e1a82cca1087973852',1,'list.c']]],
 139.106 +  ['ucx_5flist_5fdifference',['ucx_list_difference',['../list_8h.html#a6c5db5d1d11ad28b6fe1a80ee1c1e449',1,'list.c']]],
 139.107 +  ['ucx_5flist_5fdifference_5fa',['ucx_list_difference_a',['../list_8h.html#a4a2a2fc5cc41073c516db6235bbc51d5',1,'list.c']]],
 139.108 +  ['ucx_5flist_5fequals',['ucx_list_equals',['../list_8h.html#adc435447cecf885bc63d232191085bbe',1,'list.c']]],
 139.109 +  ['ucx_5flist_5ffind',['ucx_list_find',['../list_8h.html#a9b3b6842d3be572e06a7f519e198cb83',1,'list.c']]],
 139.110 +  ['ucx_5flist_5ffirst',['ucx_list_first',['../list_8h.html#a6aa0e34ebc5f0dca6f52d0f7626b4bd5',1,'list.c']]],
 139.111 +  ['ucx_5flist_5ffree',['ucx_list_free',['../list_8h.html#a1a0fa2c5b1e478a96da19b0c3f013668',1,'list.c']]],
 139.112 +  ['ucx_5flist_5ffree_5fa',['ucx_list_free_a',['../list_8h.html#a944e11f76c38767cd1100d72a4e3b25b',1,'list.c']]],
 139.113 +  ['ucx_5flist_5ffree_5fcontent',['ucx_list_free_content',['../list_8h.html#a4ba6c96642f72ea046cc22627c72979c',1,'list.c']]],
 139.114 +  ['ucx_5flist_5fget',['ucx_list_get',['../list_8h.html#a2509ffe19bce6a8708c77f89480c75fb',1,'list.c']]],
 139.115 +  ['ucx_5flist_5findexof',['ucx_list_indexof',['../list_8h.html#ae2ff2974812ca185870f80bc4ed9337e',1,'list.c']]],
 139.116 +  ['ucx_5flist_5fintersection',['ucx_list_intersection',['../list_8h.html#a259f9b754978aeca23dfabba16e20f39',1,'list.c']]],
 139.117 +  ['ucx_5flist_5fintersection_5fa',['ucx_list_intersection_a',['../list_8h.html#a1d0b00514dbb81ba6270b58da0c5b9a8',1,'list.c']]],
 139.118 +  ['ucx_5flist_5flast',['ucx_list_last',['../list_8h.html#add5ec40c5006e29c629d23c2eb5a6553',1,'list.c']]],
 139.119 +  ['ucx_5flist_5fprepend',['ucx_list_prepend',['../list_8h.html#a8fcb68e4556395b15180eec2d0b77aa4',1,'list.c']]],
 139.120 +  ['ucx_5flist_5fprepend_5fa',['ucx_list_prepend_a',['../list_8h.html#a54654e6dc60e1c3de9e886c150e404ec',1,'list.c']]],
 139.121 +  ['ucx_5flist_5fremove',['ucx_list_remove',['../list_8h.html#a410cb3e8260037ba56c72d14b899b468',1,'list.c']]],
 139.122 +  ['ucx_5flist_5fremove_5fa',['ucx_list_remove_a',['../list_8h.html#aca687b7c4e7170175f447e549125aa52',1,'list.c']]],
 139.123 +  ['ucx_5flist_5fsize',['ucx_list_size',['../list_8h.html#ae88001cc8ae40b946560f31434abed8f',1,'list.c']]],
 139.124 +  ['ucx_5flist_5fsort',['ucx_list_sort',['../list_8h.html#ac74962d9bd7cfc9d3e2e09651469377b',1,'list.c']]],
 139.125 +  ['ucx_5flist_5funion',['ucx_list_union',['../list_8h.html#a94ecdb0cea1633ad7074f027fa8485fa',1,'list.c']]],
 139.126 +  ['ucx_5flist_5funion_5fa',['ucx_list_union_a',['../list_8h.html#a65b4355536f4ebc4130211b46469f4c1',1,'list.c']]],
 139.127 +  ['ucx_5flogger_5ffree',['ucx_logger_free',['../logging_8h.html#ac4697b784e01ec990d2acea192e21658',1,'logging.c']]],
 139.128 +  ['ucx_5flogger_5flogf',['ucx_logger_logf',['../logging_8h.html#ac337e5d02ebea565012d4c11bd643801',1,'logging.c']]],
 139.129 +  ['ucx_5flogger_5fnew',['ucx_logger_new',['../logging_8h.html#ac560f8517d2172794c9d2691735ec48c',1,'logging.c']]],
 139.130 +  ['ucx_5fmap_5fclear',['ucx_map_clear',['../map_8h.html#a285e90e40681c6d9631c935dda0967f2',1,'map.c']]],
 139.131 +  ['ucx_5fmap_5fclone',['ucx_map_clone',['../map_8h.html#a62c6c30cbb0d824ba710f5030ff9a4e4',1,'map.c']]],
 139.132 +  ['ucx_5fmap_5fclone_5fa',['ucx_map_clone_a',['../map_8h.html#a9aea9103703d5c168420bb6bf85549ea',1,'map.c']]],
 139.133 +  ['ucx_5fmap_5fcopy',['ucx_map_copy',['../map_8h.html#adfeb2d61003fd2896bcfdc9a57f36425',1,'map.c']]],
 139.134 +  ['ucx_5fmap_5fdifference',['ucx_map_difference',['../map_8h.html#a774fcff87d1e58b6c5af77dd19a8c3dc',1,'map.c']]],
 139.135 +  ['ucx_5fmap_5fdifference_5fa',['ucx_map_difference_a',['../map_8h.html#ad0ba103494247d798ac3037c50fc8831',1,'map.c']]],
 139.136 +  ['ucx_5fmap_5ffree',['ucx_map_free',['../map_8h.html#abe3d9688e4224bf7bb962abf25ff8c2e',1,'map.c']]],
 139.137 +  ['ucx_5fmap_5ffree_5fcontent',['ucx_map_free_content',['../map_8h.html#a750f3d9d83e2f3788a14c17a9d160618',1,'map.c']]],
 139.138 +  ['ucx_5fmap_5fget',['ucx_map_get',['../map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6',1,'map.c']]],
 139.139 +  ['ucx_5fmap_5fintersection',['ucx_map_intersection',['../map_8h.html#aa594d7a5afebc3bed6bb265348cf6b0d',1,'map.c']]],
 139.140 +  ['ucx_5fmap_5fintersection_5fa',['ucx_map_intersection_a',['../map_8h.html#a169e0470a20484dd76425fdf77e3651e',1,'map.c']]],
 139.141 +  ['ucx_5fmap_5fiter_5fnext',['ucx_map_iter_next',['../map_8h.html#aceb8675abf44860b4bbc301bbada5b91',1,'map.c']]],
 139.142 +  ['ucx_5fmap_5fiterator',['ucx_map_iterator',['../map_8h.html#a9150e9c64fdf4dfcc2cad106b91aa110',1,'map.c']]],
 139.143 +  ['ucx_5fmap_5fnew',['ucx_map_new',['../map_8h.html#a79f31de8b93814493759dbc8b940cf0c',1,'map.c']]],
 139.144 +  ['ucx_5fmap_5fnew_5fa',['ucx_map_new_a',['../map_8h.html#aed508a94c66cc15372503c64b70eb03e',1,'map.c']]],
 139.145 +  ['ucx_5fmap_5fput',['ucx_map_put',['../map_8h.html#ac04a08b604217070254d4c58f0e82498',1,'map.c']]],
 139.146 +  ['ucx_5fmap_5frehash',['ucx_map_rehash',['../map_8h.html#a174bce9fad554dd92b8da354e0d32512',1,'map.c']]],
 139.147 +  ['ucx_5fmap_5fremove',['ucx_map_remove',['../map_8h.html#a17248a4888eb8f9ae18be522d64632aa',1,'map.c']]],
 139.148 +  ['ucx_5fmap_5funion',['ucx_map_union',['../map_8h.html#a3f65978c481af7f637cad021d93522d5',1,'map.c']]],
 139.149 +  ['ucx_5fmap_5funion_5fa',['ucx_map_union_a',['../map_8h.html#ab6370c3fa8113fdad593ce4b0460c9c6',1,'map.c']]],
 139.150 +  ['ucx_5fmemcpy',['ucx_memcpy',['../utils_8h.html#ab2e184e6a744941aab6b8058116baf30',1,'utils.c']]],
 139.151 +  ['ucx_5fmempool_5fcalloc',['ucx_mempool_calloc',['../mempool_8h.html#a4b9142011824ae24f00fabe128417d69',1,'mempool.c']]],
 139.152 +  ['ucx_5fmempool_5fchcap',['ucx_mempool_chcap',['../mempool_8h.html#aaf75b5016098723a9280531ccc3a6d77',1,'mempool.c']]],
 139.153 +  ['ucx_5fmempool_5fdestroy',['ucx_mempool_destroy',['../mempool_8h.html#af096378da7e9bfbed3088497cf4c15bf',1,'mempool.c']]],
 139.154 +  ['ucx_5fmempool_5ffree',['ucx_mempool_free',['../mempool_8h.html#aefa26e3015f5aefadbfc74221bd246ac',1,'mempool.c']]],
 139.155 +  ['ucx_5fmempool_5fmalloc',['ucx_mempool_malloc',['../mempool_8h.html#a2ae492b8f2878ccc9837ac213dced11e',1,'mempool.c']]],
 139.156 +  ['ucx_5fmempool_5fnew',['ucx_mempool_new',['../mempool_8h.html#ad71cb8c3b6fdb30360376a8b372ef22a',1,'mempool.c']]],
 139.157 +  ['ucx_5fmempool_5frealloc',['ucx_mempool_realloc',['../mempool_8h.html#a660ef42520ed6737c2e77aae18e3a7a4',1,'mempool.c']]],
 139.158 +  ['ucx_5fmempool_5freg_5fdestr',['ucx_mempool_reg_destr',['../mempool_8h.html#af47b6b7c40f8f263dc28cc9a4e77b27c',1,'mempool.c']]],
 139.159 +  ['ucx_5fmempool_5fset_5fdestr',['ucx_mempool_set_destr',['../mempool_8h.html#adb788e7ec24cd7dbdea6381539c549f2',1,'mempool.c']]],
 139.160 +  ['ucx_5fproperties2map',['ucx_properties2map',['../properties_8h.html#a5c7ff8bc3139960a3f3dc92072b742f3',1,'properties.c']]],
 139.161 +  ['ucx_5fproperties_5ffill',['ucx_properties_fill',['../properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d',1,'properties.c']]],
 139.162 +  ['ucx_5fproperties_5ffree',['ucx_properties_free',['../properties_8h.html#a38a2fe7bb2986bd87c7e69356ab05c05',1,'properties.c']]],
 139.163 +  ['ucx_5fproperties_5fload',['ucx_properties_load',['../properties_8h.html#ae1b600f839a6b2278b68fc314981a8a3',1,'properties.c']]],
 139.164 +  ['ucx_5fproperties_5fnew',['ucx_properties_new',['../properties_8h.html#a44d9dd12cab3aaa0084f1c8b89405796',1,'properties.c']]],
 139.165 +  ['ucx_5fproperties_5fnext',['ucx_properties_next',['../properties_8h.html#a7e03bc573d45d48c538cd721e810d33c',1,'properties.c']]],
 139.166 +  ['ucx_5fproperties_5fstore',['ucx_properties_store',['../properties_8h.html#a63c0c1b7648e675b21a1788917ff36fb',1,'properties.c']]],
 139.167 +  ['ucx_5fsc2sc',['ucx_sc2sc',['../string_8h.html#a69d5e3eeec783cc43314df71248768f5',1,'string.c']]],
 139.168 +  ['ucx_5fss2c_5fs',['ucx_ss2c_s',['../string_8h.html#aedeb5d7bddda54116101a8d68af8c56d',1,'string.h']]],
 139.169 +  ['ucx_5fss2sc',['ucx_ss2sc',['../string_8h.html#a9ce5ad1b2aa2dbeba204d452c2e64359',1,'string.c']]],
 139.170 +  ['ucx_5fstack_5favail',['ucx_stack_avail',['../stack_8h.html#a53cd2c7743dc8ad9cbd35ade0b4873e7',1,'stack.c']]],
 139.171 +  ['ucx_5fstack_5fcalloc',['ucx_stack_calloc',['../stack_8h.html#afdc467524b5e19a9a777c6bc03e17174',1,'stack.c']]],
 139.172 +  ['ucx_5fstack_5ffree',['ucx_stack_free',['../stack_8h.html#aabd55c14a3866b3782ba324f4d8b4c41',1,'stack.c']]],
 139.173 +  ['ucx_5fstack_5finit',['ucx_stack_init',['../stack_8h.html#abaef685df4e7ef95cd7218984a0618fe',1,'stack.c']]],
 139.174 +  ['ucx_5fstack_5fmalloc',['ucx_stack_malloc',['../stack_8h.html#af865b416802140f6b6e8ab3626d7d1ac',1,'stack.c']]],
 139.175 +  ['ucx_5fstack_5fpopn',['ucx_stack_popn',['../stack_8h.html#a07ea48f28eab474dcfefbb86fa66ef81',1,'stack.c']]],
 139.176 +  ['ucx_5fstack_5fpush',['ucx_stack_push',['../stack_8h.html#af85e6f77a8341beb6188f9ae1a8e9f92',1,'stack.c']]],
 139.177 +  ['ucx_5fstack_5fpusharr',['ucx_stack_pusharr',['../stack_8h.html#a7bb138979191bba138e76ea37488fae2',1,'stack.c']]],
 139.178 +  ['ucx_5fstack_5frealloc',['ucx_stack_realloc',['../stack_8h.html#a0c678f96f6fabab49b2b034a1fe91c3a',1,'stack.c']]],
 139.179 +  ['ucx_5fstrcpy',['ucx_strcpy',['../utils_8h.html#adeb6e8d0a53a829207cfa0a979d01fff',1,'utils.c']]],
 139.180 +  ['ucx_5fstream_5fbncopy',['ucx_stream_bncopy',['../utils_8h.html#a114ee7f7da62656ffd35e2dc23394201',1,'utils.c']]],
 139.181 +  ['ucx_5fszmul_5fimpl',['ucx_szmul_impl',['../ucx_8h.html#a6637171cc0ec097b297f731a3036dd3b',1,'ucx.c']]],
 139.182 +  ['ucx_5ftest_5fregister',['ucx_test_register',['../test_8h.html#a8dfabc42f183d3a4d79379a5d17bf67d',1,'test.c']]],
 139.183 +  ['ucx_5ftest_5frun',['ucx_test_run',['../test_8h.html#a3721458deeecb43aa322428f007714c3',1,'test.c']]],
 139.184 +  ['ucx_5ftest_5fsuite_5ffree',['ucx_test_suite_free',['../test_8h.html#a4a6ac61a6f72722273f8eaa7a343edde',1,'test.c']]],
 139.185 +  ['ucx_5ftest_5fsuite_5fnew',['ucx_test_suite_new',['../test_8h.html#a531f0df90363e0befbe900878f65f09e',1,'test.c']]],
 139.186 +  ['ucx_5fvasprintf',['ucx_vasprintf',['../utils_8h.html#a3ea1dfb856c741f3e8ec6bfdc9ad427e',1,'utils.c']]],
 139.187 +  ['ucx_5fvfprintf',['ucx_vfprintf',['../utils_8h.html#a4907967beb92c3ae351dd239abbb6927',1,'utils.c']]]
 139.188 +];
   140.1 Binary file docs/api-2.1/search/mag_sel.png has changed
   141.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   141.2 +++ b/docs/api-2.1/search/nomatches.html	Sat Feb 06 19:11:44 2021 +0100
   141.3 @@ -0,0 +1,12 @@
   141.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   141.5 +<html><head><title></title>
   141.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   141.7 +<link rel="stylesheet" type="text/css" href="search.css"/>
   141.8 +<script type="text/javascript" src="search.js"></script>
   141.9 +</head>
  141.10 +<body class="SRPage">
  141.11 +<div id="SRIndex">
  141.12 +<div class="SRStatus" id="NoMatches">No Matches</div>
  141.13 +</div>
  141.14 +</body>
  141.15 +</html>
   142.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   142.2 +++ b/docs/api-2.1/search/pages_0.html	Sat Feb 06 19:11:44 2021 +0100
   142.3 @@ -0,0 +1,26 @@
   142.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   142.5 +<html><head><title></title>
   142.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   142.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   142.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   142.9 +<script type="text/javascript" src="pages_0.js"></script>
  142.10 +<script type="text/javascript" src="search.js"></script>
  142.11 +</head>
  142.12 +<body class="SRPage">
  142.13 +<div id="SRIndex">
  142.14 +<div class="SRStatus" id="Loading">Loading...</div>
  142.15 +<div id="SRResults"></div>
  142.16 +<script type="text/javascript"><!--
  142.17 +createResults();
  142.18 +--></script>
  142.19 +<div class="SRStatus" id="Searching">Searching...</div>
  142.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  142.21 +<script type="text/javascript"><!--
  142.22 +document.getElementById("Loading").style.display="none";
  142.23 +document.getElementById("NoMatches").style.display="none";
  142.24 +var searchResults = new SearchResults("searchResults");
  142.25 +searchResults.Search();
  142.26 +--></script>
  142.27 +</div>
  142.28 +</body>
  142.29 +</html>
   143.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   143.2 +++ b/docs/api-2.1/search/pages_0.js	Sat Feb 06 19:11:44 2021 +0100
   143.3 @@ -0,0 +1,4 @@
   143.4 +var searchData=
   143.5 +[
   143.6 +  ['uap_20common_20extensions',['UAP Common Extensions',['../index.html',1,'']]]
   143.7 +];
   144.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   144.2 +++ b/docs/api-2.1/search/search.css	Sat Feb 06 19:11:44 2021 +0100
   144.3 @@ -0,0 +1,271 @@
   144.4 +/*---------------- Search Box */
   144.5 +
   144.6 +#FSearchBox {
   144.7 +    float: left;
   144.8 +}
   144.9 +
  144.10 +#MSearchBox {
  144.11 +    white-space : nowrap;
  144.12 +    float: none;
  144.13 +    margin-top: 8px;
  144.14 +    right: 0px;
  144.15 +    width: 170px;
  144.16 +    height: 24px;
  144.17 +    z-index: 102;
  144.18 +}
  144.19 +
  144.20 +#MSearchBox .left
  144.21 +{
  144.22 +    display:block;
  144.23 +    position:absolute;
  144.24 +    left:10px;
  144.25 +    width:20px;
  144.26 +    height:19px;
  144.27 +    background:url('search_l.png') no-repeat;
  144.28 +    background-position:right;
  144.29 +}
  144.30 +
  144.31 +#MSearchSelect {
  144.32 +    display:block;
  144.33 +    position:absolute;
  144.34 +    width:20px;
  144.35 +    height:19px;
  144.36 +}
  144.37 +
  144.38 +.left #MSearchSelect {
  144.39 +    left:4px;
  144.40 +}
  144.41 +
  144.42 +.right #MSearchSelect {
  144.43 +    right:5px;
  144.44 +}
  144.45 +
  144.46 +#MSearchField {
  144.47 +    display:block;
  144.48 +    position:absolute;
  144.49 +    height:19px;
  144.50 +    background:url('search_m.png') repeat-x;
  144.51 +    border:none;
  144.52 +    width:115px;
  144.53 +    margin-left:20px;
  144.54 +    padding-left:4px;
  144.55 +    color: #909090;
  144.56 +    outline: none;
  144.57 +    font: 9pt Arial, Verdana, sans-serif;
  144.58 +    -webkit-border-radius: 0px;
  144.59 +}
  144.60 +
  144.61 +#FSearchBox #MSearchField {
  144.62 +    margin-left:15px;
  144.63 +}
  144.64 +
  144.65 +#MSearchBox .right {
  144.66 +    display:block;
  144.67 +    position:absolute;
  144.68 +    right:10px;
  144.69 +    top:8px;
  144.70 +    width:20px;
  144.71 +    height:19px;
  144.72 +    background:url('search_r.png') no-repeat;
  144.73 +    background-position:left;
  144.74 +}
  144.75 +
  144.76 +#MSearchClose {
  144.77 +    display: none;
  144.78 +    position: absolute;
  144.79 +    top: 4px;
  144.80 +    background : none;
  144.81 +    border: none;
  144.82 +    margin: 0px 4px 0px 0px;
  144.83 +    padding: 0px 0px;
  144.84 +    outline: none;
  144.85 +}
  144.86 +
  144.87 +.left #MSearchClose {
  144.88 +    left: 6px;
  144.89 +}
  144.90 +
  144.91 +.right #MSearchClose {
  144.92 +    right: 2px;
  144.93 +}
  144.94 +
  144.95 +.MSearchBoxActive #MSearchField {
  144.96 +    color: #000000;
  144.97 +}
  144.98 +
  144.99 +/*---------------- Search filter selection */
 144.100 +
 144.101 +#MSearchSelectWindow {
 144.102 +    display: none;
 144.103 +    position: absolute;
 144.104 +    left: 0; top: 0;
 144.105 +    border: 1px solid #90A5CE;
 144.106 +    background-color: #F9FAFC;
 144.107 +    z-index: 10001;
 144.108 +    padding-top: 4px;
 144.109 +    padding-bottom: 4px;
 144.110 +    -moz-border-radius: 4px;
 144.111 +    -webkit-border-top-left-radius: 4px;
 144.112 +    -webkit-border-top-right-radius: 4px;
 144.113 +    -webkit-border-bottom-left-radius: 4px;
 144.114 +    -webkit-border-bottom-right-radius: 4px;
 144.115 +    -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
 144.116 +}
 144.117 +
 144.118 +.SelectItem {
 144.119 +    font: 8pt Arial, Verdana, sans-serif;
 144.120 +    padding-left:  2px;
 144.121 +    padding-right: 12px;
 144.122 +    border: 0px;
 144.123 +}
 144.124 +
 144.125 +span.SelectionMark {
 144.126 +    margin-right: 4px;
 144.127 +    font-family: monospace;
 144.128 +    outline-style: none;
 144.129 +    text-decoration: none;
 144.130 +}
 144.131 +
 144.132 +a.SelectItem {
 144.133 +    display: block;
 144.134 +    outline-style: none;
 144.135 +    color: #000000; 
 144.136 +    text-decoration: none;
 144.137 +    padding-left:   6px;
 144.138 +    padding-right: 12px;
 144.139 +}
 144.140 +
 144.141 +a.SelectItem:focus,
 144.142 +a.SelectItem:active {
 144.143 +    color: #000000; 
 144.144 +    outline-style: none;
 144.145 +    text-decoration: none;
 144.146 +}
 144.147 +
 144.148 +a.SelectItem:hover {
 144.149 +    color: #FFFFFF;
 144.150 +    background-color: #3D578C;
 144.151 +    outline-style: none;
 144.152 +    text-decoration: none;
 144.153 +    cursor: pointer;
 144.154 +    display: block;
 144.155 +}
 144.156 +
 144.157 +/*---------------- Search results window */
 144.158 +
 144.159 +iframe#MSearchResults {
 144.160 +    width: 60ex;
 144.161 +    height: 15em;
 144.162 +}
 144.163 +
 144.164 +#MSearchResultsWindow {
 144.165 +    display: none;
 144.166 +    position: absolute;
 144.167 +    left: 0; top: 0;
 144.168 +    border: 1px solid #000;
 144.169 +    background-color: #EEF1F7;
 144.170 +    z-index:10000;
 144.171 +}
 144.172 +
 144.173 +/* ----------------------------------- */
 144.174 +
 144.175 +
 144.176 +#SRIndex {
 144.177 +    clear:both; 
 144.178 +    padding-bottom: 15px;
 144.179 +}
 144.180 +
 144.181 +.SREntry {
 144.182 +    font-size: 10pt;
 144.183 +    padding-left: 1ex;
 144.184 +}
 144.185 +
 144.186 +.SRPage .SREntry {
 144.187 +    font-size: 8pt;
 144.188 +    padding: 1px 5px;
 144.189 +}
 144.190 +
 144.191 +body.SRPage {
 144.192 +    margin: 5px 2px;
 144.193 +}
 144.194 +
 144.195 +.SRChildren {
 144.196 +    padding-left: 3ex; padding-bottom: .5em 
 144.197 +}
 144.198 +
 144.199 +.SRPage .SRChildren {
 144.200 +    display: none;
 144.201 +}
 144.202 +
 144.203 +.SRSymbol {
 144.204 +    font-weight: bold; 
 144.205 +    color: #425E97;
 144.206 +    font-family: Arial, Verdana, sans-serif;
 144.207 +    text-decoration: none;
 144.208 +    outline: none;
 144.209 +}
 144.210 +
 144.211 +a.SRScope {
 144.212 +    display: block;
 144.213 +    color: #425E97; 
 144.214 +    font-family: Arial, Verdana, sans-serif;
 144.215 +    text-decoration: none;
 144.216 +    outline: none;
 144.217 +}
 144.218 +
 144.219 +a.SRSymbol:focus, a.SRSymbol:active,
 144.220 +a.SRScope:focus, a.SRScope:active {
 144.221 +    text-decoration: underline;
 144.222 +}
 144.223 +
 144.224 +span.SRScope {
 144.225 +    padding-left: 4px;
 144.226 +}
 144.227 +
 144.228 +.SRPage .SRStatus {
 144.229 +    padding: 2px 5px;
 144.230 +    font-size: 8pt;
 144.231 +    font-style: italic;
 144.232 +}
 144.233 +
 144.234 +.SRResult {
 144.235 +    display: none;
 144.236 +}
 144.237 +
 144.238 +DIV.searchresults {
 144.239 +    margin-left: 10px;
 144.240 +    margin-right: 10px;
 144.241 +}
 144.242 +
 144.243 +/*---------------- External search page results */
 144.244 +
 144.245 +.searchresult {
 144.246 +    background-color: #F0F3F8;
 144.247 +}
 144.248 +
 144.249 +.pages b {
 144.250 +   color: white;
 144.251 +   padding: 5px 5px 3px 5px;
 144.252 +   background-image: url("../tab_a.png");
 144.253 +   background-repeat: repeat-x;
 144.254 +   text-shadow: 0 1px 1px #000000;
 144.255 +}
 144.256 +
 144.257 +.pages {
 144.258 +    line-height: 17px;
 144.259 +    margin-left: 4px;
 144.260 +    text-decoration: none;
 144.261 +}
 144.262 +
 144.263 +.hl {
 144.264 +    font-weight: bold;
 144.265 +}
 144.266 +
 144.267 +#searchresults {
 144.268 +    margin-bottom: 20px;
 144.269 +}
 144.270 +
 144.271 +.searchpages {
 144.272 +    margin-top: 10px;
 144.273 +}
 144.274 +
   145.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   145.2 +++ b/docs/api-2.1/search/search.js	Sat Feb 06 19:11:44 2021 +0100
   145.3 @@ -0,0 +1,791 @@
   145.4 +function convertToId(search)
   145.5 +{
   145.6 +  var result = '';
   145.7 +  for (i=0;i<search.length;i++)
   145.8 +  {
   145.9 +    var c = search.charAt(i);
  145.10 +    var cn = c.charCodeAt(0);
  145.11 +    if (c.match(/[a-z0-9\u0080-\uFFFF]/))
  145.12 +    {
  145.13 +      result+=c;
  145.14 +    }
  145.15 +    else if (cn<16)
  145.16 +    {
  145.17 +      result+="_0"+cn.toString(16);
  145.18 +    }
  145.19 +    else
  145.20 +    {
  145.21 +      result+="_"+cn.toString(16);
  145.22 +    }
  145.23 +  }
  145.24 +  return result;
  145.25 +}
  145.26 +
  145.27 +function getXPos(item)
  145.28 +{
  145.29 +  var x = 0;
  145.30 +  if (item.offsetWidth)
  145.31 +  {
  145.32 +    while (item && item!=document.body)
  145.33 +    {
  145.34 +      x   += item.offsetLeft;
  145.35 +      item = item.offsetParent;
  145.36 +    }
  145.37 +  }
  145.38 +  return x;
  145.39 +}
  145.40 +
  145.41 +function getYPos(item)
  145.42 +{
  145.43 +  var y = 0;
  145.44 +  if (item.offsetWidth)
  145.45 +  {
  145.46 +     while (item && item!=document.body)
  145.47 +     {
  145.48 +       y   += item.offsetTop;
  145.49 +       item = item.offsetParent;
  145.50 +     }
  145.51 +  }
  145.52 +  return y;
  145.53 +}
  145.54 +
  145.55 +/* A class handling everything associated with the search panel.
  145.56 +
  145.57 +   Parameters:
  145.58 +   name - The name of the global variable that will be
  145.59 +          storing this instance.  Is needed to be able to set timeouts.
  145.60 +   resultPath - path to use for external files
  145.61 +*/
  145.62 +function SearchBox(name, resultsPath, inFrame, label)
  145.63 +{
  145.64 +  if (!name || !resultsPath) {  alert("Missing parameters to SearchBox."); }
  145.65 +
  145.66 +  // ---------- Instance variables
  145.67 +  this.name                  = name;
  145.68 +  this.resultsPath           = resultsPath;
  145.69 +  this.keyTimeout            = 0;
  145.70 +  this.keyTimeoutLength      = 500;
  145.71 +  this.closeSelectionTimeout = 300;
  145.72 +  this.lastSearchValue       = "";
  145.73 +  this.lastResultsPage       = "";
  145.74 +  this.hideTimeout           = 0;
  145.75 +  this.searchIndex           = 0;
  145.76 +  this.searchActive          = false;
  145.77 +  this.insideFrame           = inFrame;
  145.78 +  this.searchLabel           = label;
  145.79 +
  145.80 +  // ----------- DOM Elements
  145.81 +
  145.82 +  this.DOMSearchField = function()
  145.83 +  {  return document.getElementById("MSearchField");  }
  145.84 +
  145.85 +  this.DOMSearchSelect = function()
  145.86 +  {  return document.getElementById("MSearchSelect");  }
  145.87 +
  145.88 +  this.DOMSearchSelectWindow = function()
  145.89 +  {  return document.getElementById("MSearchSelectWindow");  }
  145.90 +
  145.91 +  this.DOMPopupSearchResults = function()
  145.92 +  {  return document.getElementById("MSearchResults");  }
  145.93 +
  145.94 +  this.DOMPopupSearchResultsWindow = function()
  145.95 +  {  return document.getElementById("MSearchResultsWindow");  }
  145.96 +
  145.97 +  this.DOMSearchClose = function()
  145.98 +  {  return document.getElementById("MSearchClose"); }
  145.99 +
 145.100 +  this.DOMSearchBox = function()
 145.101 +  {  return document.getElementById("MSearchBox");  }
 145.102 +
 145.103 +  // ------------ Event Handlers
 145.104 +
 145.105 +  // Called when focus is added or removed from the search field.
 145.106 +  this.OnSearchFieldFocus = function(isActive)
 145.107 +  {
 145.108 +    this.Activate(isActive);
 145.109 +  }
 145.110 +
 145.111 +  this.OnSearchSelectShow = function()
 145.112 +  {
 145.113 +    var searchSelectWindow = this.DOMSearchSelectWindow();
 145.114 +    var searchField        = this.DOMSearchSelect();
 145.115 +
 145.116 +    if (this.insideFrame)
 145.117 +    {
 145.118 +      var left = getXPos(searchField);
 145.119 +      var top  = getYPos(searchField);
 145.120 +      left += searchField.offsetWidth + 6;
 145.121 +      top += searchField.offsetHeight;
 145.122 +
 145.123 +      // show search selection popup
 145.124 +      searchSelectWindow.style.display='block';
 145.125 +      left -= searchSelectWindow.offsetWidth;
 145.126 +      searchSelectWindow.style.left =  left + 'px';
 145.127 +      searchSelectWindow.style.top  =  top  + 'px';
 145.128 +    }
 145.129 +    else
 145.130 +    {
 145.131 +      var left = getXPos(searchField);
 145.132 +      var top  = getYPos(searchField);
 145.133 +      top += searchField.offsetHeight;
 145.134 +
 145.135 +      // show search selection popup
 145.136 +      searchSelectWindow.style.display='block';
 145.137 +      searchSelectWindow.style.left =  left + 'px';
 145.138 +      searchSelectWindow.style.top  =  top  + 'px';
 145.139 +    }
 145.140 +
 145.141 +    // stop selection hide timer
 145.142 +    if (this.hideTimeout)
 145.143 +    {
 145.144 +      clearTimeout(this.hideTimeout);
 145.145 +      this.hideTimeout=0;
 145.146 +    }
 145.147 +    return false; // to avoid "image drag" default event
 145.148 +  }
 145.149 +
 145.150 +  this.OnSearchSelectHide = function()
 145.151 +  {
 145.152 +    this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()",
 145.153 +                                  this.closeSelectionTimeout);
 145.154 +  }
 145.155 +
 145.156 +  // Called when the content of the search field is changed.
 145.157 +  this.OnSearchFieldChange = function(evt)
 145.158 +  {
 145.159 +    if (this.keyTimeout) // kill running timer
 145.160 +    {
 145.161 +      clearTimeout(this.keyTimeout);
 145.162 +      this.keyTimeout = 0;
 145.163 +    }
 145.164 +
 145.165 +    var e  = (evt) ? evt : window.event; // for IE
 145.166 +    if (e.keyCode==40 || e.keyCode==13)
 145.167 +    {
 145.168 +      if (e.shiftKey==1)
 145.169 +      {
 145.170 +        this.OnSearchSelectShow();
 145.171 +        var win=this.DOMSearchSelectWindow();
 145.172 +        for (i=0;i<win.childNodes.length;i++)
 145.173 +        {
 145.174 +          var child = win.childNodes[i]; // get span within a
 145.175 +          if (child.className=='SelectItem')
 145.176 +          {
 145.177 +            child.focus();
 145.178 +            return;
 145.179 +          }
 145.180 +        }
 145.181 +        return;
 145.182 +      }
 145.183 +      else if (window.frames.MSearchResults.searchResults)
 145.184 +      {
 145.185 +        var elem = window.frames.MSearchResults.searchResults.NavNext(0);
 145.186 +        if (elem) elem.focus();
 145.187 +      }
 145.188 +    }
 145.189 +    else if (e.keyCode==27) // Escape out of the search field
 145.190 +    {
 145.191 +      this.DOMSearchField().blur();
 145.192 +      this.DOMPopupSearchResultsWindow().style.display = 'none';
 145.193 +      this.DOMSearchClose().style.display = 'none';
 145.194 +      this.lastSearchValue = '';
 145.195 +      this.Activate(false);
 145.196 +      return;
 145.197 +    }
 145.198 +
 145.199 +    // strip whitespaces
 145.200 +    var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
 145.201 +
 145.202 +    if (searchValue != this.lastSearchValue) // search value has changed
 145.203 +    {
 145.204 +      if (searchValue != "") // non-empty search
 145.205 +      {
 145.206 +        // set timer for search update
 145.207 +        this.keyTimeout = setTimeout(this.name + '.Search()',
 145.208 +                                     this.keyTimeoutLength);
 145.209 +      }
 145.210 +      else // empty search field
 145.211 +      {
 145.212 +        this.DOMPopupSearchResultsWindow().style.display = 'none';
 145.213 +        this.DOMSearchClose().style.display = 'none';
 145.214 +        this.lastSearchValue = '';
 145.215 +      }
 145.216 +    }
 145.217 +  }
 145.218 +
 145.219 +  this.SelectItemCount = function(id)
 145.220 +  {
 145.221 +    var count=0;
 145.222 +    var win=this.DOMSearchSelectWindow();
 145.223 +    for (i=0;i<win.childNodes.length;i++)
 145.224 +    {
 145.225 +      var child = win.childNodes[i]; // get span within a
 145.226 +      if (child.className=='SelectItem')
 145.227 +      {
 145.228 +        count++;
 145.229 +      }
 145.230 +    }
 145.231 +    return count;
 145.232 +  }
 145.233 +
 145.234 +  this.SelectItemSet = function(id)
 145.235 +  {
 145.236 +    var i,j=0;
 145.237 +    var win=this.DOMSearchSelectWindow();
 145.238 +    for (i=0;i<win.childNodes.length;i++)
 145.239 +    {
 145.240 +      var child = win.childNodes[i]; // get span within a
 145.241 +      if (child.className=='SelectItem')
 145.242 +      {
 145.243 +        var node = child.firstChild;
 145.244 +        if (j==id)
 145.245 +        {
 145.246 +          node.innerHTML='&#8226;';
 145.247 +        }
 145.248 +        else
 145.249 +        {
 145.250 +          node.innerHTML='&#160;';
 145.251 +        }
 145.252 +        j++;
 145.253 +      }
 145.254 +    }
 145.255 +  }
 145.256 +
 145.257 +  // Called when an search filter selection is made.
 145.258 +  // set item with index id as the active item
 145.259 +  this.OnSelectItem = function(id)
 145.260 +  {
 145.261 +    this.searchIndex = id;
 145.262 +    this.SelectItemSet(id);
 145.263 +    var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
 145.264 +    if (searchValue!="" && this.searchActive) // something was found -> do a search
 145.265 +    {
 145.266 +      this.Search();
 145.267 +    }
 145.268 +  }
 145.269 +
 145.270 +  this.OnSearchSelectKey = function(evt)
 145.271 +  {
 145.272 +    var e = (evt) ? evt : window.event; // for IE
 145.273 +    if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down
 145.274 +    {
 145.275 +      this.searchIndex++;
 145.276 +      this.OnSelectItem(this.searchIndex);
 145.277 +    }
 145.278 +    else if (e.keyCode==38 && this.searchIndex>0) // Up
 145.279 +    {
 145.280 +      this.searchIndex--;
 145.281 +      this.OnSelectItem(this.searchIndex);
 145.282 +    }
 145.283 +    else if (e.keyCode==13 || e.keyCode==27)
 145.284 +    {
 145.285 +      this.OnSelectItem(this.searchIndex);
 145.286 +      this.CloseSelectionWindow();
 145.287 +      this.DOMSearchField().focus();
 145.288 +    }
 145.289 +    return false;
 145.290 +  }
 145.291 +
 145.292 +  // --------- Actions
 145.293 +
 145.294 +  // Closes the results window.
 145.295 +  this.CloseResultsWindow = function()
 145.296 +  {
 145.297 +    this.DOMPopupSearchResultsWindow().style.display = 'none';
 145.298 +    this.DOMSearchClose().style.display = 'none';
 145.299 +    this.Activate(false);
 145.300 +  }
 145.301 +
 145.302 +  this.CloseSelectionWindow = function()
 145.303 +  {
 145.304 +    this.DOMSearchSelectWindow().style.display = 'none';
 145.305 +  }
 145.306 +
 145.307 +  // Performs a search.
 145.308 +  this.Search = function()
 145.309 +  {
 145.310 +    this.keyTimeout = 0;
 145.311 +
 145.312 +    // strip leading whitespace
 145.313 +    var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
 145.314 +
 145.315 +    var code = searchValue.toLowerCase().charCodeAt(0);
 145.316 +    var idxChar = searchValue.substr(0, 1).toLowerCase();
 145.317 +    if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair
 145.318 +    {
 145.319 +      idxChar = searchValue.substr(0, 2);
 145.320 +    }
 145.321 +
 145.322 +    var resultsPage;
 145.323 +    var resultsPageWithSearch;
 145.324 +    var hasResultsPage;
 145.325 +
 145.326 +    var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);
 145.327 +    if (idx!=-1)
 145.328 +    {
 145.329 +       var hexCode=idx.toString(16);
 145.330 +       resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
 145.331 +       resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
 145.332 +       hasResultsPage = true;
 145.333 +    }
 145.334 +    else // nothing available for this search term
 145.335 +    {
 145.336 +       resultsPage = this.resultsPath + '/nomatches.html';
 145.337 +       resultsPageWithSearch = resultsPage;
 145.338 +       hasResultsPage = false;
 145.339 +    }
 145.340 +
 145.341 +    window.frames.MSearchResults.location = resultsPageWithSearch;
 145.342 +    var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
 145.343 +
 145.344 +    if (domPopupSearchResultsWindow.style.display!='block')
 145.345 +    {
 145.346 +       var domSearchBox = this.DOMSearchBox();
 145.347 +       this.DOMSearchClose().style.display = 'inline';
 145.348 +       if (this.insideFrame)
 145.349 +       {
 145.350 +         var domPopupSearchResults = this.DOMPopupSearchResults();
 145.351 +         domPopupSearchResultsWindow.style.position = 'relative';
 145.352 +         domPopupSearchResultsWindow.style.display  = 'block';
 145.353 +         var width = document.body.clientWidth - 8; // the -8 is for IE :-(
 145.354 +         domPopupSearchResultsWindow.style.width    = width + 'px';
 145.355 +         domPopupSearchResults.style.width          = width + 'px';
 145.356 +       }
 145.357 +       else
 145.358 +       {
 145.359 +         var domPopupSearchResults = this.DOMPopupSearchResults();
 145.360 +         var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
 145.361 +         var top  = getYPos(domSearchBox) + 20;  // domSearchBox.offsetHeight + 1;
 145.362 +         domPopupSearchResultsWindow.style.display = 'block';
 145.363 +         left -= domPopupSearchResults.offsetWidth;
 145.364 +         domPopupSearchResultsWindow.style.top     = top  + 'px';
 145.365 +         domPopupSearchResultsWindow.style.left    = left + 'px';
 145.366 +       }
 145.367 +    }
 145.368 +
 145.369 +    this.lastSearchValue = searchValue;
 145.370 +    this.lastResultsPage = resultsPage;
 145.371 +  }
 145.372 +
 145.373 +  // -------- Activation Functions
 145.374 +
 145.375 +  // Activates or deactivates the search panel, resetting things to
 145.376 +  // their default values if necessary.
 145.377 +  this.Activate = function(isActive)
 145.378 +  {
 145.379 +    if (isActive || // open it
 145.380 +        this.DOMPopupSearchResultsWindow().style.display == 'block'
 145.381 +       )
 145.382 +    {
 145.383 +      this.DOMSearchBox().className = 'MSearchBoxActive';
 145.384 +
 145.385 +      var searchField = this.DOMSearchField();
 145.386 +
 145.387 +      if (searchField.value == this.searchLabel) // clear "Search" term upon entry
 145.388 +      {
 145.389 +        searchField.value = '';
 145.390 +        this.searchActive = true;
 145.391 +      }
 145.392 +    }
 145.393 +    else if (!isActive) // directly remove the panel
 145.394 +    {
 145.395 +      this.DOMSearchBox().className = 'MSearchBoxInactive';
 145.396 +      this.DOMSearchField().value   = this.searchLabel;
 145.397 +      this.searchActive             = false;
 145.398 +      this.lastSearchValue          = ''
 145.399 +      this.lastResultsPage          = '';
 145.400 +    }
 145.401 +  }
 145.402 +}
 145.403 +
 145.404 +// -----------------------------------------------------------------------
 145.405 +
 145.406 +// The class that handles everything on the search results page.
 145.407 +function SearchResults(name)
 145.408 +{
 145.409 +    // The number of matches from the last run of <Search()>.
 145.410 +    this.lastMatchCount = 0;
 145.411 +    this.lastKey = 0;
 145.412 +    this.repeatOn = false;
 145.413 +
 145.414 +    // Toggles the visibility of the passed element ID.
 145.415 +    this.FindChildElement = function(id)
 145.416 +    {
 145.417 +      var parentElement = document.getElementById(id);
 145.418 +      var element = parentElement.firstChild;
 145.419 +
 145.420 +      while (element && element!=parentElement)
 145.421 +      {
 145.422 +        if (element.nodeName == 'DIV' && element.className == 'SRChildren')
 145.423 +        {
 145.424 +          return element;
 145.425 +        }
 145.426 +
 145.427 +        if (element.nodeName == 'DIV' && element.hasChildNodes())
 145.428 +        {
 145.429 +           element = element.firstChild;
 145.430 +        }
 145.431 +        else if (element.nextSibling)
 145.432 +        {
 145.433 +           element = element.nextSibling;
 145.434 +        }
 145.435 +        else
 145.436 +        {
 145.437 +          do
 145.438 +          {
 145.439 +            element = element.parentNode;
 145.440 +          }
 145.441 +          while (element && element!=parentElement && !element.nextSibling);
 145.442 +
 145.443 +          if (element && element!=parentElement)
 145.444 +          {
 145.445 +            element = element.nextSibling;
 145.446 +          }
 145.447 +        }
 145.448 +      }
 145.449 +    }
 145.450 +
 145.451 +    this.Toggle = function(id)
 145.452 +    {
 145.453 +      var element = this.FindChildElement(id);
 145.454 +      if (element)
 145.455 +      {
 145.456 +        if (element.style.display == 'block')
 145.457 +        {
 145.458 +          element.style.display = 'none';
 145.459 +        }
 145.460 +        else
 145.461 +        {
 145.462 +          element.style.display = 'block';
 145.463 +        }
 145.464 +      }
 145.465 +    }
 145.466 +
 145.467 +    // Searches for the passed string.  If there is no parameter,
 145.468 +    // it takes it from the URL query.
 145.469 +    //
 145.470 +    // Always returns true, since other documents may try to call it
 145.471 +    // and that may or may not be possible.
 145.472 +    this.Search = function(search)
 145.473 +    {
 145.474 +      if (!search) // get search word from URL
 145.475 +      {
 145.476 +        search = window.location.search;
 145.477 +        search = search.substring(1);  // Remove the leading '?'
 145.478 +        search = unescape(search);
 145.479 +      }
 145.480 +
 145.481 +      search = search.replace(/^ +/, ""); // strip leading spaces
 145.482 +      search = search.replace(/ +$/, ""); // strip trailing spaces
 145.483 +      search = search.toLowerCase();
 145.484 +      search = convertToId(search);
 145.485 +
 145.486 +      var resultRows = document.getElementsByTagName("div");
 145.487 +      var matches = 0;
 145.488 +
 145.489 +      var i = 0;
 145.490 +      while (i < resultRows.length)
 145.491 +      {
 145.492 +        var row = resultRows.item(i);
 145.493 +        if (row.className == "SRResult")
 145.494 +        {
 145.495 +          var rowMatchName = row.id.toLowerCase();
 145.496 +          rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
 145.497 +
 145.498 +          if (search.length<=rowMatchName.length &&
 145.499 +             rowMatchName.substr(0, search.length)==search)
 145.500 +          {
 145.501 +            row.style.display = 'block';
 145.502 +            matches++;
 145.503 +          }
 145.504 +          else
 145.505 +          {
 145.506 +            row.style.display = 'none';
 145.507 +          }
 145.508 +        }
 145.509 +        i++;
 145.510 +      }
 145.511 +      document.getElementById("Searching").style.display='none';
 145.512 +      if (matches == 0) // no results
 145.513 +      {
 145.514 +        document.getElementById("NoMatches").style.display='block';
 145.515 +      }
 145.516 +      else // at least one result
 145.517 +      {
 145.518 +        document.getElementById("NoMatches").style.display='none';
 145.519 +      }
 145.520 +      this.lastMatchCount = matches;
 145.521 +      return true;
 145.522 +    }
 145.523 +
 145.524 +    // return the first item with index index or higher that is visible
 145.525 +    this.NavNext = function(index)
 145.526 +    {
 145.527 +      var focusItem;
 145.528 +      while (1)
 145.529 +      {
 145.530 +        var focusName = 'Item'+index;
 145.531 +        focusItem = document.getElementById(focusName);
 145.532 +        if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
 145.533 +        {
 145.534 +          break;
 145.535 +        }
 145.536 +        else if (!focusItem) // last element
 145.537 +        {
 145.538 +          break;
 145.539 +        }
 145.540 +        focusItem=null;
 145.541 +        index++;
 145.542 +      }
 145.543 +      return focusItem;
 145.544 +    }
 145.545 +
 145.546 +    this.NavPrev = function(index)
 145.547 +    {
 145.548 +      var focusItem;
 145.549 +      while (1)
 145.550 +      {
 145.551 +        var focusName = 'Item'+index;
 145.552 +        focusItem = document.getElementById(focusName);
 145.553 +        if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
 145.554 +        {
 145.555 +          break;
 145.556 +        }
 145.557 +        else if (!focusItem) // last element
 145.558 +        {
 145.559 +          break;
 145.560 +        }
 145.561 +        focusItem=null;
 145.562 +        index--;
 145.563 +      }
 145.564 +      return focusItem;
 145.565 +    }
 145.566 +
 145.567 +    this.ProcessKeys = function(e)
 145.568 +    {
 145.569 +      if (e.type == "keydown")
 145.570 +      {
 145.571 +        this.repeatOn = false;
 145.572 +        this.lastKey = e.keyCode;
 145.573 +      }
 145.574 +      else if (e.type == "keypress")
 145.575 +      {
 145.576 +        if (!this.repeatOn)
 145.577 +        {
 145.578 +          if (this.lastKey) this.repeatOn = true;
 145.579 +          return false; // ignore first keypress after keydown
 145.580 +        }
 145.581 +      }
 145.582 +      else if (e.type == "keyup")
 145.583 +      {
 145.584 +        this.lastKey = 0;
 145.585 +        this.repeatOn = false;
 145.586 +      }
 145.587 +      return this.lastKey!=0;
 145.588 +    }
 145.589 +
 145.590 +    this.Nav = function(evt,itemIndex)
 145.591 +    {
 145.592 +      var e  = (evt) ? evt : window.event; // for IE
 145.593 +      if (e.keyCode==13) return true;
 145.594 +      if (!this.ProcessKeys(e)) return false;
 145.595 +
 145.596 +      if (this.lastKey==38) // Up
 145.597 +      {
 145.598 +        var newIndex = itemIndex-1;
 145.599 +        var focusItem = this.NavPrev(newIndex);
 145.600 +        if (focusItem)
 145.601 +        {
 145.602 +          var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
 145.603 +          if (child && child.style.display == 'block') // children visible
 145.604 +          {
 145.605 +            var n=0;
 145.606 +            var tmpElem;
 145.607 +            while (1) // search for last child
 145.608 +            {
 145.609 +              tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
 145.610 +              if (tmpElem)
 145.611 +              {
 145.612 +                focusItem = tmpElem;
 145.613 +              }
 145.614 +              else // found it!
 145.615 +              {
 145.616 +                break;
 145.617 +              }
 145.618 +              n++;
 145.619 +            }
 145.620 +          }
 145.621 +        }
 145.622 +        if (focusItem)
 145.623 +        {
 145.624 +          focusItem.focus();
 145.625 +        }
 145.626 +        else // return focus to search field
 145.627 +        {
 145.628 +           parent.document.getElementById("MSearchField").focus();
 145.629 +        }
 145.630 +      }
 145.631 +      else if (this.lastKey==40) // Down
 145.632 +      {
 145.633 +        var newIndex = itemIndex+1;
 145.634 +        var focusItem;
 145.635 +        var item = document.getElementById('Item'+itemIndex);
 145.636 +        var elem = this.FindChildElement(item.parentNode.parentNode.id);
 145.637 +        if (elem && elem.style.display == 'block') // children visible
 145.638 +        {
 145.639 +          focusItem = document.getElementById('Item'+itemIndex+'_c0');
 145.640 +        }
 145.641 +        if (!focusItem) focusItem = this.NavNext(newIndex);
 145.642 +        if (focusItem)  focusItem.focus();
 145.643 +      }
 145.644 +      else if (this.lastKey==39) // Right
 145.645 +      {
 145.646 +        var item = document.getElementById('Item'+itemIndex);
 145.647 +        var elem = this.FindChildElement(item.parentNode.parentNode.id);
 145.648 +        if (elem) elem.style.display = 'block';
 145.649 +      }
 145.650 +      else if (this.lastKey==37) // Left
 145.651 +      {
 145.652 +        var item = document.getElementById('Item'+itemIndex);
 145.653 +        var elem = this.FindChildElement(item.parentNode.parentNode.id);
 145.654 +        if (elem) elem.style.display = 'none';
 145.655 +      }
 145.656 +      else if (this.lastKey==27) // Escape
 145.657 +      {
 145.658 +        parent.searchBox.CloseResultsWindow();
 145.659 +        parent.document.getElementById("MSearchField").focus();
 145.660 +      }
 145.661 +      else if (this.lastKey==13) // Enter
 145.662 +      {
 145.663 +        return true;
 145.664 +      }
 145.665 +      return false;
 145.666 +    }
 145.667 +
 145.668 +    this.NavChild = function(evt,itemIndex,childIndex)
 145.669 +    {
 145.670 +      var e  = (evt) ? evt : window.event; // for IE
 145.671 +      if (e.keyCode==13) return true;
 145.672 +      if (!this.ProcessKeys(e)) return false;
 145.673 +
 145.674 +      if (this.lastKey==38) // Up
 145.675 +      {
 145.676 +        if (childIndex>0)
 145.677 +        {
 145.678 +          var newIndex = childIndex-1;
 145.679 +          document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
 145.680 +        }
 145.681 +        else // already at first child, jump to parent
 145.682 +        {
 145.683 +          document.getElementById('Item'+itemIndex).focus();
 145.684 +        }
 145.685 +      }
 145.686 +      else if (this.lastKey==40) // Down
 145.687 +      {
 145.688 +        var newIndex = childIndex+1;
 145.689 +        var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
 145.690 +        if (!elem) // last child, jump to parent next parent
 145.691 +        {
 145.692 +          elem = this.NavNext(itemIndex+1);
 145.693 +        }
 145.694 +        if (elem)
 145.695 +        {
 145.696 +          elem.focus();
 145.697 +        }
 145.698 +      }
 145.699 +      else if (this.lastKey==27) // Escape
 145.700 +      {
 145.701 +        parent.searchBox.CloseResultsWindow();
 145.702 +        parent.document.getElementById("MSearchField").focus();
 145.703 +      }
 145.704 +      else if (this.lastKey==13) // Enter
 145.705 +      {
 145.706 +        return true;
 145.707 +      }
 145.708 +      return false;
 145.709 +    }
 145.710 +}
 145.711 +
 145.712 +function setKeyActions(elem,action)
 145.713 +{
 145.714 +  elem.setAttribute('onkeydown',action);
 145.715 +  elem.setAttribute('onkeypress',action);
 145.716 +  elem.setAttribute('onkeyup',action);
 145.717 +}
 145.718 +
 145.719 +function setClassAttr(elem,attr)
 145.720 +{
 145.721 +  elem.setAttribute('class',attr);
 145.722 +  elem.setAttribute('className',attr);
 145.723 +}
 145.724 +
 145.725 +function createResults()
 145.726 +{
 145.727 +  var results = document.getElementById("SRResults");
 145.728 +  for (var e=0; e<searchData.length; e++)
 145.729 +  {
 145.730 +    var id = searchData[e][0];
 145.731 +    var srResult = document.createElement('div');
 145.732 +    srResult.setAttribute('id','SR_'+id);
 145.733 +    setClassAttr(srResult,'SRResult');
 145.734 +    var srEntry = document.createElement('div');
 145.735 +    setClassAttr(srEntry,'SREntry');
 145.736 +    var srLink = document.createElement('a');
 145.737 +    srLink.setAttribute('id','Item'+e);
 145.738 +    setKeyActions(srLink,'return searchResults.Nav(event,'+e+')');
 145.739 +    setClassAttr(srLink,'SRSymbol');
 145.740 +    srLink.innerHTML = searchData[e][1][0];
 145.741 +    srEntry.appendChild(srLink);
 145.742 +    if (searchData[e][1].length==2) // single result
 145.743 +    {
 145.744 +      srLink.setAttribute('href',searchData[e][1][1][0]);
 145.745 +      if (searchData[e][1][1][1])
 145.746 +      {
 145.747 +       srLink.setAttribute('target','_parent');
 145.748 +      }
 145.749 +      var srScope = document.createElement('span');
 145.750 +      setClassAttr(srScope,'SRScope');
 145.751 +      srScope.innerHTML = searchData[e][1][1][2];
 145.752 +      srEntry.appendChild(srScope);
 145.753 +    }
 145.754 +    else // multiple results
 145.755 +    {
 145.756 +      srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")');
 145.757 +      var srChildren = document.createElement('div');
 145.758 +      setClassAttr(srChildren,'SRChildren');
 145.759 +      for (var c=0; c<searchData[e][1].length-1; c++)
 145.760 +      {
 145.761 +        var srChild = document.createElement('a');
 145.762 +        srChild.setAttribute('id','Item'+e+'_c'+c);
 145.763 +        setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');
 145.764 +        setClassAttr(srChild,'SRScope');
 145.765 +        srChild.setAttribute('href',searchData[e][1][c+1][0]);
 145.766 +        if (searchData[e][1][c+1][1])
 145.767 +        {
 145.768 +         srChild.setAttribute('target','_parent');
 145.769 +        }
 145.770 +        srChild.innerHTML = searchData[e][1][c+1][2];
 145.771 +        srChildren.appendChild(srChild);
 145.772 +      }
 145.773 +      srEntry.appendChild(srChildren);
 145.774 +    }
 145.775 +    srResult.appendChild(srEntry);
 145.776 +    results.appendChild(srResult);
 145.777 +  }
 145.778 +}
 145.779 +
 145.780 +function init_search()
 145.781 +{
 145.782 +  var results = document.getElementById("MSearchSelectWindow");
 145.783 +  for (var key in indexSectionLabels)
 145.784 +  {
 145.785 +    var link = document.createElement('a');
 145.786 +    link.setAttribute('class','SelectItem');
 145.787 +    link.setAttribute('onclick','searchBox.OnSelectItem('+key+')');
 145.788 +    link.href='javascript:void(0)';
 145.789 +    link.innerHTML='<span class="SelectionMark">&#160;</span>'+indexSectionLabels[key];
 145.790 +    results.appendChild(link);
 145.791 +  }
 145.792 +  searchBox.OnSelectItem(0);
 145.793 +}
 145.794 +
   146.1 Binary file docs/api-2.1/search/search_l.png has changed
   147.1 Binary file docs/api-2.1/search/search_m.png has changed
   148.1 Binary file docs/api-2.1/search/search_r.png has changed
   149.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   149.2 +++ b/docs/api-2.1/search/searchdata.js	Sat Feb 06 19:11:44 2021 +0100
   149.3 @@ -0,0 +1,36 @@
   149.4 +var indexSectionsWithContent =
   149.5 +{
   149.6 +  0: "_abcdefhiklmnprstuvw",
   149.7 +  1: "su",
   149.8 +  2: "ablmpstu",
   149.9 +  3: "su",
  149.10 +  4: "abcdefhiklmnprstuvw",
  149.11 +  5: "cdruw",
  149.12 +  6: "_apsu",
  149.13 +  7: "u"
  149.14 +};
  149.15 +
  149.16 +var indexSectionNames =
  149.17 +{
  149.18 +  0: "all",
  149.19 +  1: "classes",
  149.20 +  2: "files",
  149.21 +  3: "functions",
  149.22 +  4: "variables",
  149.23 +  5: "typedefs",
  149.24 +  6: "defines",
  149.25 +  7: "pages"
  149.26 +};
  149.27 +
  149.28 +var indexSectionLabels =
  149.29 +{
  149.30 +  0: "All",
  149.31 +  1: "Data Structures",
  149.32 +  2: "Files",
  149.33 +  3: "Functions",
  149.34 +  4: "Variables",
  149.35 +  5: "Typedefs",
  149.36 +  6: "Macros",
  149.37 +  7: "Pages"
  149.38 +};
  149.39 +
   150.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   150.2 +++ b/docs/api-2.1/search/typedefs_0.html	Sat Feb 06 19:11:44 2021 +0100
   150.3 @@ -0,0 +1,26 @@
   150.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   150.5 +<html><head><title></title>
   150.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   150.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   150.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   150.9 +<script type="text/javascript" src="typedefs_0.js"></script>
  150.10 +<script type="text/javascript" src="search.js"></script>
  150.11 +</head>
  150.12 +<body class="SRPage">
  150.13 +<div id="SRIndex">
  150.14 +<div class="SRStatus" id="Loading">Loading...</div>
  150.15 +<div id="SRResults"></div>
  150.16 +<script type="text/javascript"><!--
  150.17 +createResults();
  150.18 +--></script>
  150.19 +<div class="SRStatus" id="Searching">Searching...</div>
  150.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  150.21 +<script type="text/javascript"><!--
  150.22 +document.getElementById("Loading").style.display="none";
  150.23 +document.getElementById("NoMatches").style.display="none";
  150.24 +var searchResults = new SearchResults("searchResults");
  150.25 +searchResults.Search();
  150.26 +--></script>
  150.27 +</div>
  150.28 +</body>
  150.29 +</html>
   151.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   151.2 +++ b/docs/api-2.1/search/typedefs_0.js	Sat Feb 06 19:11:44 2021 +0100
   151.3 @@ -0,0 +1,5 @@
   151.4 +var searchData=
   151.5 +[
   151.6 +  ['cmp_5ffunc',['cmp_func',['../ucx_8h.html#afe5e2d5dbf34778e0e97852051570791',1,'ucx.h']]],
   151.7 +  ['copy_5ffunc',['copy_func',['../ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967',1,'ucx.h']]]
   151.8 +];
   152.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   152.2 +++ b/docs/api-2.1/search/typedefs_1.html	Sat Feb 06 19:11:44 2021 +0100
   152.3 @@ -0,0 +1,26 @@
   152.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   152.5 +<html><head><title></title>
   152.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   152.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   152.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   152.9 +<script type="text/javascript" src="typedefs_1.js"></script>
  152.10 +<script type="text/javascript" src="search.js"></script>
  152.11 +</head>
  152.12 +<body class="SRPage">
  152.13 +<div id="SRIndex">
  152.14 +<div class="SRStatus" id="Loading">Loading...</div>
  152.15 +<div id="SRResults"></div>
  152.16 +<script type="text/javascript"><!--
  152.17 +createResults();
  152.18 +--></script>
  152.19 +<div class="SRStatus" id="Searching">Searching...</div>
  152.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  152.21 +<script type="text/javascript"><!--
  152.22 +document.getElementById("Loading").style.display="none";
  152.23 +document.getElementById("NoMatches").style.display="none";
  152.24 +var searchResults = new SearchResults("searchResults");
  152.25 +searchResults.Search();
  152.26 +--></script>
  152.27 +</div>
  152.28 +</body>
  152.29 +</html>
   153.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   153.2 +++ b/docs/api-2.1/search/typedefs_1.js	Sat Feb 06 19:11:44 2021 +0100
   153.3 @@ -0,0 +1,4 @@
   153.4 +var searchData=
   153.5 +[
   153.6 +  ['distance_5ffunc',['distance_func',['../ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9',1,'ucx.h']]]
   153.7 +];
   154.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   154.2 +++ b/docs/api-2.1/search/typedefs_2.html	Sat Feb 06 19:11:44 2021 +0100
   154.3 @@ -0,0 +1,26 @@
   154.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   154.5 +<html><head><title></title>
   154.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   154.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   154.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   154.9 +<script type="text/javascript" src="typedefs_2.js"></script>
  154.10 +<script type="text/javascript" src="search.js"></script>
  154.11 +</head>
  154.12 +<body class="SRPage">
  154.13 +<div id="SRIndex">
  154.14 +<div class="SRStatus" id="Loading">Loading...</div>
  154.15 +<div id="SRResults"></div>
  154.16 +<script type="text/javascript"><!--
  154.17 +createResults();
  154.18 +--></script>
  154.19 +<div class="SRStatus" id="Searching">Searching...</div>
  154.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  154.21 +<script type="text/javascript"><!--
  154.22 +document.getElementById("Loading").style.display="none";
  154.23 +document.getElementById("NoMatches").style.display="none";
  154.24 +var searchResults = new SearchResults("searchResults");
  154.25 +searchResults.Search();
  154.26 +--></script>
  154.27 +</div>
  154.28 +</body>
  154.29 +</html>
   155.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   155.2 +++ b/docs/api-2.1/search/typedefs_2.js	Sat Feb 06 19:11:44 2021 +0100
   155.3 @@ -0,0 +1,4 @@
   155.4 +var searchData=
   155.5 +[
   155.6 +  ['read_5ffunc',['read_func',['../ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5',1,'ucx.h']]]
   155.7 +];
   156.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   156.2 +++ b/docs/api-2.1/search/typedefs_3.html	Sat Feb 06 19:11:44 2021 +0100
   156.3 @@ -0,0 +1,26 @@
   156.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   156.5 +<html><head><title></title>
   156.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   156.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   156.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   156.9 +<script type="text/javascript" src="typedefs_3.js"></script>
  156.10 +<script type="text/javascript" src="search.js"></script>
  156.11 +</head>
  156.12 +<body class="SRPage">
  156.13 +<div id="SRIndex">
  156.14 +<div class="SRStatus" id="Loading">Loading...</div>
  156.15 +<div id="SRResults"></div>
  156.16 +<script type="text/javascript"><!--
  156.17 +createResults();
  156.18 +--></script>
  156.19 +<div class="SRStatus" id="Searching">Searching...</div>
  156.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  156.21 +<script type="text/javascript"><!--
  156.22 +document.getElementById("Loading").style.display="none";
  156.23 +document.getElementById("NoMatches").style.display="none";
  156.24 +var searchResults = new SearchResults("searchResults");
  156.25 +searchResults.Search();
  156.26 +--></script>
  156.27 +</div>
  156.28 +</body>
  156.29 +</html>
   157.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   157.2 +++ b/docs/api-2.1/search/typedefs_3.js	Sat Feb 06 19:11:44 2021 +0100
   157.3 @@ -0,0 +1,17 @@
   157.4 +var searchData=
   157.5 +[
   157.6 +  ['ucx_5fallocator_5fcalloc',['ucx_allocator_calloc',['../allocator_8h.html#a2c0aba4221c1ac6801f03ed799f15b12',1,'allocator.h']]],
   157.7 +  ['ucx_5fallocator_5ffree',['ucx_allocator_free',['../allocator_8h.html#aaf2387ddaddd8ab4b267e6b00e5d6f7e',1,'allocator.h']]],
   157.8 +  ['ucx_5fallocator_5fmalloc',['ucx_allocator_malloc',['../allocator_8h.html#a29f0f6a23a70db3b60635cd6dc384473',1,'allocator.h']]],
   157.9 +  ['ucx_5fallocator_5frealloc',['ucx_allocator_realloc',['../allocator_8h.html#a6d7cf038a806e327c5da37321d04e426',1,'allocator.h']]],
  157.10 +  ['ucx_5fdestructor',['ucx_destructor',['../ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3',1,'ucx.h']]],
  157.11 +  ['ucxavlnode',['UcxAVLNode',['../avl_8h.html#a08ba2496c2316df58548c3cc29712add',1,'avl.h']]],
  157.12 +  ['ucxkey',['UcxKey',['../map_8h.html#ad63828bb23123fc01a5315a2bac3b142',1,'map.h']]],
  157.13 +  ['ucxlist',['UcxList',['../list_8h.html#aa6f89f91c1081c9a7c6866c298f497a2',1,'list.h']]],
  157.14 +  ['ucxmap',['UcxMap',['../map_8h.html#a18e21948725b2da68c35da587a722033',1,'map.h']]],
  157.15 +  ['ucxmapelement',['UcxMapElement',['../map_8h.html#ad7d7a910a32113eb93eae11c3dc97b4b',1,'map.h']]],
  157.16 +  ['ucxmapiterator',['UcxMapIterator',['../map_8h.html#ae36aff5f645948c54f51578b11fd87fb',1,'map.h']]],
  157.17 +  ['ucxtest',['UcxTest',['../test_8h.html#ae906817354c010b83c2784260cce7a1c',1,'test.h']]],
  157.18 +  ['ucxtestlist',['UcxTestList',['../test_8h.html#a8048c50ae73ea690b776edfd63bd6a5d',1,'test.h']]],
  157.19 +  ['ucxtestsuite',['UcxTestSuite',['../test_8h.html#a52115d1d0f1c4a565ed6ef7c1bfd0363',1,'test.h']]]
  157.20 +];
   158.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   158.2 +++ b/docs/api-2.1/search/typedefs_4.html	Sat Feb 06 19:11:44 2021 +0100
   158.3 @@ -0,0 +1,26 @@
   158.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   158.5 +<html><head><title></title>
   158.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   158.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   158.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   158.9 +<script type="text/javascript" src="typedefs_4.js"></script>
  158.10 +<script type="text/javascript" src="search.js"></script>
  158.11 +</head>
  158.12 +<body class="SRPage">
  158.13 +<div id="SRIndex">
  158.14 +<div class="SRStatus" id="Loading">Loading...</div>
  158.15 +<div id="SRResults"></div>
  158.16 +<script type="text/javascript"><!--
  158.17 +createResults();
  158.18 +--></script>
  158.19 +<div class="SRStatus" id="Searching">Searching...</div>
  158.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  158.21 +<script type="text/javascript"><!--
  158.22 +document.getElementById("Loading").style.display="none";
  158.23 +document.getElementById("NoMatches").style.display="none";
  158.24 +var searchResults = new SearchResults("searchResults");
  158.25 +searchResults.Search();
  158.26 +--></script>
  158.27 +</div>
  158.28 +</body>
  158.29 +</html>
   159.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   159.2 +++ b/docs/api-2.1/search/typedefs_4.js	Sat Feb 06 19:11:44 2021 +0100
   159.3 @@ -0,0 +1,4 @@
   159.4 +var searchData=
   159.5 +[
   159.6 +  ['write_5ffunc',['write_func',['../ucx_8h.html#a989b3f0fa4d307d278378fde435641ed',1,'ucx.h']]]
   159.7 +];
   160.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   160.2 +++ b/docs/api-2.1/search/variables_0.html	Sat Feb 06 19:11:44 2021 +0100
   160.3 @@ -0,0 +1,26 @@
   160.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   160.5 +<html><head><title></title>
   160.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   160.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   160.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   160.9 +<script type="text/javascript" src="variables_0.js"></script>
  160.10 +<script type="text/javascript" src="search.js"></script>
  160.11 +</head>
  160.12 +<body class="SRPage">
  160.13 +<div id="SRIndex">
  160.14 +<div class="SRStatus" id="Loading">Loading...</div>
  160.15 +<div id="SRResults"></div>
  160.16 +<script type="text/javascript"><!--
  160.17 +createResults();
  160.18 +--></script>
  160.19 +<div class="SRStatus" id="Searching">Searching...</div>
  160.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  160.21 +<script type="text/javascript"><!--
  160.22 +document.getElementById("Loading").style.display="none";
  160.23 +document.getElementById("NoMatches").style.display="none";
  160.24 +var searchResults = new SearchResults("searchResults");
  160.25 +searchResults.Search();
  160.26 +--></script>
  160.27 +</div>
  160.28 +</body>
  160.29 +</html>
   161.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   161.2 +++ b/docs/api-2.1/search/variables_0.js	Sat Feb 06 19:11:44 2021 +0100
   161.3 @@ -0,0 +1,4 @@
   161.4 +var searchData=
   161.5 +[
   161.6 +  ['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()']]]
   161.7 +];
   162.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   162.2 +++ b/docs/api-2.1/search/variables_1.html	Sat Feb 06 19:11:44 2021 +0100
   162.3 @@ -0,0 +1,26 @@
   162.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   162.5 +<html><head><title></title>
   162.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   162.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   162.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   162.9 +<script type="text/javascript" src="variables_1.js"></script>
  162.10 +<script type="text/javascript" src="search.js"></script>
  162.11 +</head>
  162.12 +<body class="SRPage">
  162.13 +<div id="SRIndex">
  162.14 +<div class="SRStatus" id="Loading">Loading...</div>
  162.15 +<div id="SRResults"></div>
  162.16 +<script type="text/javascript"><!--
  162.17 +createResults();
  162.18 +--></script>
  162.19 +<div class="SRStatus" id="Searching">Searching...</div>
  162.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  162.21 +<script type="text/javascript"><!--
  162.22 +document.getElementById("Loading").style.display="none";
  162.23 +document.getElementById("NoMatches").style.display="none";
  162.24 +var searchResults = new SearchResults("searchResults");
  162.25 +searchResults.Search();
  162.26 +--></script>
  162.27 +</div>
  162.28 +</body>
  162.29 +</html>
   163.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   163.2 +++ b/docs/api-2.1/search/variables_1.js	Sat Feb 06 19:11:44 2021 +0100
   163.3 @@ -0,0 +1,5 @@
   163.4 +var searchData=
   163.5 +[
   163.6 +  ['buffer',['buffer',['../structUcxProperties.html#a6bb4d29686df41a0f42641ee15232bfd',1,'UcxProperties']]],
   163.7 +  ['buflen',['buflen',['../structUcxProperties.html#a4e7524434525267e29f493a25dcca6b5',1,'UcxProperties']]]
   163.8 +];
   164.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   164.2 +++ b/docs/api-2.1/search/variables_10.html	Sat Feb 06 19:11:44 2021 +0100
   164.3 @@ -0,0 +1,26 @@
   164.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   164.5 +<html><head><title></title>
   164.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   164.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   164.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   164.9 +<script type="text/javascript" src="variables_10.js"></script>
  164.10 +<script type="text/javascript" src="search.js"></script>
  164.11 +</head>
  164.12 +<body class="SRPage">
  164.13 +<div id="SRIndex">
  164.14 +<div class="SRStatus" id="Loading">Loading...</div>
  164.15 +<div id="SRResults"></div>
  164.16 +<script type="text/javascript"><!--
  164.17 +createResults();
  164.18 +--></script>
  164.19 +<div class="SRStatus" id="Searching">Searching...</div>
  164.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  164.21 +<script type="text/javascript"><!--
  164.22 +document.getElementById("Loading").style.display="none";
  164.23 +document.getElementById("NoMatches").style.display="none";
  164.24 +var searchResults = new SearchResults("searchResults");
  164.25 +searchResults.Search();
  164.26 +--></script>
  164.27 +</div>
  164.28 +</body>
  164.29 +</html>
   165.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   165.2 +++ b/docs/api-2.1/search/variables_10.js	Sat Feb 06 19:11:44 2021 +0100
   165.3 @@ -0,0 +1,4 @@
   165.4 +var searchData=
   165.5 +[
   165.6 +  ['userdata',['userdata',['../structUcxAVLTree.html#ae92a3bfad3fe33c8dcbdad85112f83fd',1,'UcxAVLTree']]]
   165.7 +];
   166.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   166.2 +++ b/docs/api-2.1/search/variables_11.html	Sat Feb 06 19:11:44 2021 +0100
   166.3 @@ -0,0 +1,26 @@
   166.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   166.5 +<html><head><title></title>
   166.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   166.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   166.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   166.9 +<script type="text/javascript" src="variables_11.js"></script>
  166.10 +<script type="text/javascript" src="search.js"></script>
  166.11 +</head>
  166.12 +<body class="SRPage">
  166.13 +<div id="SRIndex">
  166.14 +<div class="SRStatus" id="Loading">Loading...</div>
  166.15 +<div id="SRResults"></div>
  166.16 +<script type="text/javascript"><!--
  166.17 +createResults();
  166.18 +--></script>
  166.19 +<div class="SRStatus" id="Searching">Searching...</div>
  166.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  166.21 +<script type="text/javascript"><!--
  166.22 +document.getElementById("Loading").style.display="none";
  166.23 +document.getElementById("NoMatches").style.display="none";
  166.24 +var searchResults = new SearchResults("searchResults");
  166.25 +searchResults.Search();
  166.26 +--></script>
  166.27 +</div>
  166.28 +</body>
  166.29 +</html>
   167.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   167.2 +++ b/docs/api-2.1/search/variables_11.js	Sat Feb 06 19:11:44 2021 +0100
   167.3 @@ -0,0 +1,4 @@
   167.4 +var searchData=
   167.5 +[
   167.6 +  ['value',['value',['../structUcxAVLNode.html#a302501b8c04c3fde668fe72249871258',1,'UcxAVLNode']]]
   167.7 +];
   168.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   168.2 +++ b/docs/api-2.1/search/variables_12.html	Sat Feb 06 19:11:44 2021 +0100
   168.3 @@ -0,0 +1,26 @@
   168.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   168.5 +<html><head><title></title>
   168.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   168.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   168.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   168.9 +<script type="text/javascript" src="variables_12.js"></script>
  168.10 +<script type="text/javascript" src="search.js"></script>
  168.11 +</head>
  168.12 +<body class="SRPage">
  168.13 +<div id="SRIndex">
  168.14 +<div class="SRStatus" id="Loading">Loading...</div>
  168.15 +<div id="SRResults"></div>
  168.16 +<script type="text/javascript"><!--
  168.17 +createResults();
  168.18 +--></script>
  168.19 +<div class="SRStatus" id="Searching">Searching...</div>
  168.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  168.21 +<script type="text/javascript"><!--
  168.22 +document.getElementById("Loading").style.display="none";
  168.23 +document.getElementById("NoMatches").style.display="none";
  168.24 +var searchResults = new SearchResults("searchResults");
  168.25 +searchResults.Search();
  168.26 +--></script>
  168.27 +</div>
  168.28 +</body>
  168.29 +</html>
   169.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   169.2 +++ b/docs/api-2.1/search/variables_12.js	Sat Feb 06 19:11:44 2021 +0100
   169.3 @@ -0,0 +1,4 @@
   169.4 +var searchData=
   169.5 +[
   169.6 +  ['writer',['writer',['../structUcxLogger.html#ada13bba090a9dc4f8d6cd9be73c60930',1,'UcxLogger']]]
   169.7 +];
   170.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   170.2 +++ b/docs/api-2.1/search/variables_2.html	Sat Feb 06 19:11:44 2021 +0100
   170.3 @@ -0,0 +1,26 @@
   170.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   170.5 +<html><head><title></title>
   170.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   170.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   170.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   170.9 +<script type="text/javascript" src="variables_2.js"></script>
  170.10 +<script type="text/javascript" src="search.js"></script>
  170.11 +</head>
  170.12 +<body class="SRPage">
  170.13 +<div id="SRIndex">
  170.14 +<div class="SRStatus" id="Loading">Loading...</div>
  170.15 +<div id="SRResults"></div>
  170.16 +<script type="text/javascript"><!--
  170.17 +createResults();
  170.18 +--></script>
  170.19 +<div class="SRStatus" id="Searching">Searching...</div>
  170.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  170.21 +<script type="text/javascript"><!--
  170.22 +document.getElementById("Loading").style.display="none";
  170.23 +document.getElementById("NoMatches").style.display="none";
  170.24 +var searchResults = new SearchResults("searchResults");
  170.25 +searchResults.Search();
  170.26 +--></script>
  170.27 +</div>
  170.28 +</body>
  170.29 +</html>
   171.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   171.2 +++ b/docs/api-2.1/search/variables_2.js	Sat Feb 06 19:11:44 2021 +0100
   171.3 @@ -0,0 +1,12 @@
   171.4 +var searchData=
   171.5 +[
   171.6 +  ['c',['c',['../structucx__memchunk.html#ab86550503e5f019bfa61a1e91f1c40da',1,'ucx_memchunk']]],
   171.7 +  ['calloc',['calloc',['../structUcxAllocator.html#ab94ec1cba45cc4e7d81e1588a11cbb62',1,'UcxAllocator']]],
   171.8 +  ['capacity',['capacity',['../structUcxArray.html#a7ed074887908e45bde7e1fbc67b31c18',1,'UcxArray::capacity()'],['../structUcxBuffer.html#a385661894f3cee9c549bfe07a8b316bf',1,'UcxBuffer::capacity()']]],
   171.9 +  ['cmpfunc',['cmpfunc',['../structUcxAVLTree.html#a87aff25cb726cb9eb88eb815a10d1004',1,'UcxAVLTree']]],
  171.10 +  ['comment1',['comment1',['../structUcxProperties.html#afaa2e6a289fa6949b7b01df35fa5def8',1,'UcxProperties']]],
  171.11 +  ['comment2',['comment2',['../structUcxProperties.html#a9ea7ecb414ca8bc7bef62cdd19cc6363',1,'UcxProperties']]],
  171.12 +  ['comment3',['comment3',['../structUcxProperties.html#a5f3e561e32bac03e36a191a6940cca92',1,'UcxProperties']]],
  171.13 +  ['count',['count',['../structUcxMap.html#a14e9163f71f6c014dfa2103de70ae9cd',1,'UcxMap']]],
  171.14 +  ['cur',['cur',['../structUcxMapIterator.html#af1fc40f899f37280adb5b85acf6e742f',1,'UcxMapIterator']]]
  171.15 +];
   172.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   172.2 +++ b/docs/api-2.1/search/variables_3.html	Sat Feb 06 19:11:44 2021 +0100
   172.3 @@ -0,0 +1,26 @@
   172.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   172.5 +<html><head><title></title>
   172.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   172.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   172.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   172.9 +<script type="text/javascript" src="variables_3.js"></script>
  172.10 +<script type="text/javascript" src="search.js"></script>
  172.11 +</head>
  172.12 +<body class="SRPage">
  172.13 +<div id="SRIndex">
  172.14 +<div class="SRStatus" id="Loading">Loading...</div>
  172.15 +<div id="SRResults"></div>
  172.16 +<script type="text/javascript"><!--
  172.17 +createResults();
  172.18 +--></script>
  172.19 +<div class="SRStatus" id="Searching">Searching...</div>
  172.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  172.21 +<script type="text/javascript"><!--
  172.22 +document.getElementById("Loading").style.display="none";
  172.23 +document.getElementById("NoMatches").style.display="none";
  172.24 +var searchResults = new SearchResults("searchResults");
  172.25 +searchResults.Search();
  172.26 +--></script>
  172.27 +</div>
  172.28 +</body>
  172.29 +</html>
   173.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   173.2 +++ b/docs/api-2.1/search/variables_3.js	Sat Feb 06 19:11:44 2021 +0100
   173.3 @@ -0,0 +1,7 @@
   173.4 +var searchData=
   173.5 +[
   173.6 +  ['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()']]],
   173.7 +  ['dateformat',['dateformat',['../structUcxLogger.html#a086f75df0f6c81ec491f25c0a4d9262b',1,'UcxLogger']]],
   173.8 +  ['delimiter',['delimiter',['../structUcxProperties.html#af6adb3f69616cf9d2bb5ea7b4d837ca5',1,'UcxProperties']]],
   173.9 +  ['destructor',['destructor',['../structucx__memchunk.html#ac7b5e3fda47b917d6fb2a1d7ea28447b',1,'ucx_memchunk::destructor()'],['../structucx__regdestr.html#acea2a3bb66909aa800a931ac8b0cce56',1,'ucx_regdestr::destructor()']]]
  173.10 +];
   174.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   174.2 +++ b/docs/api-2.1/search/variables_4.html	Sat Feb 06 19:11:44 2021 +0100
   174.3 @@ -0,0 +1,26 @@
   174.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   174.5 +<html><head><title></title>
   174.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   174.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   174.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   174.9 +<script type="text/javascript" src="variables_4.js"></script>
  174.10 +<script type="text/javascript" src="search.js"></script>
  174.11 +</head>
  174.12 +<body class="SRPage">
  174.13 +<div id="SRIndex">
  174.14 +<div class="SRStatus" id="Loading">Loading...</div>
  174.15 +<div id="SRResults"></div>
  174.16 +<script type="text/javascript"><!--
  174.17 +createResults();
  174.18 +--></script>
  174.19 +<div class="SRStatus" id="Searching">Searching...</div>
  174.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  174.21 +<script type="text/javascript"><!--
  174.22 +document.getElementById("Loading").style.display="none";
  174.23 +document.getElementById("NoMatches").style.display="none";
  174.24 +var searchResults = new SearchResults("searchResults");
  174.25 +searchResults.Search();
  174.26 +--></script>
  174.27 +</div>
  174.28 +</body>
  174.29 +</html>
   175.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   175.2 +++ b/docs/api-2.1/search/variables_4.js	Sat Feb 06 19:11:44 2021 +0100
   175.3 @@ -0,0 +1,5 @@
   175.4 +var searchData=
   175.5 +[
   175.6 +  ['elemsize',['elemsize',['../structUcxArray.html#ac4e9ecdf8a8d010644f6e44dfef8190f',1,'UcxArray']]],
   175.7 +  ['error',['error',['../structUcxProperties.html#a34f71a6ab6dcb6892e3b4eb802e75bff',1,'UcxProperties']]]
   175.8 +];
   176.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   176.2 +++ b/docs/api-2.1/search/variables_5.html	Sat Feb 06 19:11:44 2021 +0100
   176.3 @@ -0,0 +1,26 @@
   176.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   176.5 +<html><head><title></title>
   176.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   176.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   176.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   176.9 +<script type="text/javascript" src="variables_5.js"></script>
  176.10 +<script type="text/javascript" src="search.js"></script>
  176.11 +</head>
  176.12 +<body class="SRPage">
  176.13 +<div id="SRIndex">
  176.14 +<div class="SRStatus" id="Loading">Loading...</div>
  176.15 +<div id="SRResults"></div>
  176.16 +<script type="text/javascript"><!--
  176.17 +createResults();
  176.18 +--></script>
  176.19 +<div class="SRStatus" id="Searching">Searching...</div>
  176.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  176.21 +<script type="text/javascript"><!--
  176.22 +document.getElementById("Loading").style.display="none";
  176.23 +document.getElementById("NoMatches").style.display="none";
  176.24 +var searchResults = new SearchResults("searchResults");
  176.25 +searchResults.Search();
  176.26 +--></script>
  176.27 +</div>
  176.28 +</body>
  176.29 +</html>
   177.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   177.2 +++ b/docs/api-2.1/search/variables_5.js	Sat Feb 06 19:11:44 2021 +0100
   177.3 @@ -0,0 +1,6 @@
   177.4 +var searchData=
   177.5 +[
   177.6 +  ['failure',['failure',['../structUcxTestSuite.html#abfd240541d1e956e49cde0ac36286951',1,'UcxTestSuite']]],
   177.7 +  ['flags',['flags',['../structUcxBuffer.html#ac642e07b0a03be5aac48eb4aa5bec2f7',1,'UcxBuffer']]],
   177.8 +  ['free',['free',['../structUcxAllocator.html#aecce1840378ed53f1002190f4f87026f',1,'UcxAllocator']]]
   177.9 +];
   178.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   178.2 +++ b/docs/api-2.1/search/variables_6.html	Sat Feb 06 19:11:44 2021 +0100
   178.3 @@ -0,0 +1,26 @@
   178.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   178.5 +<html><head><title></title>
   178.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   178.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   178.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   178.9 +<script type="text/javascript" src="variables_6.js"></script>
  178.10 +<script type="text/javascript" src="search.js"></script>
  178.11 +</head>
  178.12 +<body class="SRPage">
  178.13 +<div id="SRIndex">
  178.14 +<div class="SRStatus" id="Loading">Loading...</div>
  178.15 +<div id="SRResults"></div>
  178.16 +<script type="text/javascript"><!--
  178.17 +createResults();
  178.18 +--></script>
  178.19 +<div class="SRStatus" id="Searching">Searching...</div>
  178.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  178.21 +<script type="text/javascript"><!--
  178.22 +document.getElementById("Loading").style.display="none";
  178.23 +document.getElementById("NoMatches").style.display="none";
  178.24 +var searchResults = new SearchResults("searchResults");
  178.25 +searchResults.Search();
  178.26 +--></script>
  178.27 +</div>
  178.28 +</body>
  178.29 +</html>
   179.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   179.2 +++ b/docs/api-2.1/search/variables_6.js	Sat Feb 06 19:11:44 2021 +0100
   179.3 @@ -0,0 +1,5 @@
   179.4 +var searchData=
   179.5 +[
   179.6 +  ['hash',['hash',['../structUcxKey.html#aac9d372ac34a4cbd8459e2b04e505752',1,'UcxKey::hash()'],['../structUcxMapKey.html#a34c1f8fec98174583944fffd30e7c913',1,'UcxMapKey::hash()']]],
   179.7 +  ['height',['height',['../structUcxAVLNode.html#af129fd32863a7c35e82c5cd9d11dc95a',1,'UcxAVLNode']]]
   179.8 +];
   180.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   180.2 +++ b/docs/api-2.1/search/variables_7.html	Sat Feb 06 19:11:44 2021 +0100
   180.3 @@ -0,0 +1,26 @@
   180.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   180.5 +<html><head><title></title>
   180.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   180.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   180.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   180.9 +<script type="text/javascript" src="variables_7.js"></script>
  180.10 +<script type="text/javascript" src="search.js"></script>
  180.11 +</head>
  180.12 +<body class="SRPage">
  180.13 +<div id="SRIndex">
  180.14 +<div class="SRStatus" id="Loading">Loading...</div>
  180.15 +<div id="SRResults"></div>
  180.16 +<script type="text/javascript"><!--
  180.17 +createResults();
  180.18 +--></script>
  180.19 +<div class="SRStatus" id="Searching">Searching...</div>
  180.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  180.21 +<script type="text/javascript"><!--
  180.22 +document.getElementById("Loading").style.display="none";
  180.23 +document.getElementById("NoMatches").style.display="none";
  180.24 +var searchResults = new SearchResults("searchResults");
  180.25 +searchResults.Search();
  180.26 +--></script>
  180.27 +</div>
  180.28 +</body>
  180.29 +</html>
   181.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   181.2 +++ b/docs/api-2.1/search/variables_7.js	Sat Feb 06 19:11:44 2021 +0100
   181.3 @@ -0,0 +1,4 @@
   181.4 +var searchData=
   181.5 +[
   181.6 +  ['index',['index',['../structUcxMapIterator.html#ac2376545c8816dd6895de4995e558c65',1,'UcxMapIterator']]]
   181.7 +];
   182.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   182.2 +++ b/docs/api-2.1/search/variables_8.html	Sat Feb 06 19:11:44 2021 +0100
   182.3 @@ -0,0 +1,26 @@
   182.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   182.5 +<html><head><title></title>
   182.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   182.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   182.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   182.9 +<script type="text/javascript" src="variables_8.js"></script>
  182.10 +<script type="text/javascript" src="search.js"></script>
  182.11 +</head>
  182.12 +<body class="SRPage">
  182.13 +<div id="SRIndex">
  182.14 +<div class="SRStatus" id="Loading">Loading...</div>
  182.15 +<div id="SRResults"></div>
  182.16 +<script type="text/javascript"><!--
  182.17 +createResults();
  182.18 +--></script>
  182.19 +<div class="SRStatus" id="Searching">Searching...</div>
  182.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  182.21 +<script type="text/javascript"><!--
  182.22 +document.getElementById("Loading").style.display="none";
  182.23 +document.getElementById("NoMatches").style.display="none";
  182.24 +var searchResults = new SearchResults("searchResults");
  182.25 +searchResults.Search();
  182.26 +--></script>
  182.27 +</div>
  182.28 +</body>
  182.29 +</html>
   183.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   183.2 +++ b/docs/api-2.1/search/variables_8.js	Sat Feb 06 19:11:44 2021 +0100
   183.3 @@ -0,0 +1,4 @@
   183.4 +var searchData=
   183.5 +[
   183.6 +  ['key',['key',['../structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6',1,'UcxAVLNode::key()'],['../structUcxMapElement.html#aa446141b708e106e2c8de1303318187c',1,'UcxMapElement::key()']]]
   183.7 +];
   184.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   184.2 +++ b/docs/api-2.1/search/variables_9.html	Sat Feb 06 19:11:44 2021 +0100
   184.3 @@ -0,0 +1,26 @@
   184.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   184.5 +<html><head><title></title>
   184.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   184.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   184.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   184.9 +<script type="text/javascript" src="variables_9.js"></script>
  184.10 +<script type="text/javascript" src="search.js"></script>
  184.11 +</head>
  184.12 +<body class="SRPage">
  184.13 +<div id="SRIndex">
  184.14 +<div class="SRStatus" id="Loading">Loading...</div>
  184.15 +<div id="SRResults"></div>
  184.16 +<script type="text/javascript"><!--
  184.17 +createResults();
  184.18 +--></script>
  184.19 +<div class="SRStatus" id="Searching">Searching...</div>
  184.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  184.21 +<script type="text/javascript"><!--
  184.22 +document.getElementById("Loading").style.display="none";
  184.23 +document.getElementById("NoMatches").style.display="none";
  184.24 +var searchResults = new SearchResults("searchResults");
  184.25 +searchResults.Search();
  184.26 +--></script>
  184.27 +</div>
  184.28 +</body>
  184.29 +</html>
   185.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   185.2 +++ b/docs/api-2.1/search/variables_9.js	Sat Feb 06 19:11:44 2021 +0100
   185.3 @@ -0,0 +1,8 @@
   185.4 +var searchData=
   185.5 +[
   185.6 +  ['left',['left',['../structUcxAVLNode.html#ad3a1c733f2c1cc81ac527f846fc24b9c',1,'UcxAVLNode']]],
   185.7 +  ['len',['len',['../structUcxKey.html#abef01de37f355688f2ac797d2c280683',1,'UcxKey::len()'],['../structUcxMapKey.html#a504d46caa45c79cd87ff8cd835654270',1,'UcxMapKey::len()']]],
   185.8 +  ['length',['length',['../structsstr__t.html#a5cf571708cdff92e45f08458f2b98229',1,'sstr_t::length()'],['../structscstr__t.html#aaa0229f64f1057b6f65adededaa5a172',1,'scstr_t::length()']]],
   185.9 +  ['level',['level',['../structUcxLogger.html#a2e0ee94c25b2307096c7970280d189cd',1,'UcxLogger']]],
  185.10 +  ['levels',['levels',['../structUcxLogger.html#a187129f7bc6e5064b3d92a5f1217f396',1,'UcxLogger']]]
  185.11 +];
   186.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   186.2 +++ b/docs/api-2.1/search/variables_a.html	Sat Feb 06 19:11:44 2021 +0100
   186.3 @@ -0,0 +1,26 @@
   186.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   186.5 +<html><head><title></title>
   186.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   186.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   186.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   186.9 +<script type="text/javascript" src="variables_a.js"></script>
  186.10 +<script type="text/javascript" src="search.js"></script>
  186.11 +</head>
  186.12 +<body class="SRPage">
  186.13 +<div id="SRIndex">
  186.14 +<div class="SRStatus" id="Loading">Loading...</div>
  186.15 +<div id="SRResults"></div>
  186.16 +<script type="text/javascript"><!--
  186.17 +createResults();
  186.18 +--></script>
  186.19 +<div class="SRStatus" id="Searching">Searching...</div>
  186.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  186.21 +<script type="text/javascript"><!--
  186.22 +document.getElementById("Loading").style.display="none";
  186.23 +document.getElementById("NoMatches").style.display="none";
  186.24 +var searchResults = new SearchResults("searchResults");
  186.25 +searchResults.Search();
  186.26 +--></script>
  186.27 +</div>
  186.28 +</body>
  186.29 +</html>
   187.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   187.2 +++ b/docs/api-2.1/search/variables_a.js	Sat Feb 06 19:11:44 2021 +0100
   187.3 @@ -0,0 +1,6 @@
   187.4 +var searchData=
   187.5 +[
   187.6 +  ['malloc',['malloc',['../structUcxAllocator.html#a013376172be39ed54f77c4be6898845a',1,'UcxAllocator']]],
   187.7 +  ['map',['map',['../structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790',1,'UcxMap::map()'],['../structUcxMapIterator.html#af88d6e22547d09fe1d665dd650dcdb95',1,'UcxMapIterator::map()']]],
   187.8 +  ['mask',['mask',['../structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c',1,'UcxLogger']]]
   187.9 +];
   188.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   188.2 +++ b/docs/api-2.1/search/variables_b.html	Sat Feb 06 19:11:44 2021 +0100
   188.3 @@ -0,0 +1,26 @@
   188.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   188.5 +<html><head><title></title>
   188.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   188.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   188.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   188.9 +<script type="text/javascript" src="variables_b.js"></script>
  188.10 +<script type="text/javascript" src="search.js"></script>
  188.11 +</head>
  188.12 +<body class="SRPage">
  188.13 +<div id="SRIndex">
  188.14 +<div class="SRStatus" id="Loading">Loading...</div>
  188.15 +<div id="SRResults"></div>
  188.16 +<script type="text/javascript"><!--
  188.17 +createResults();
  188.18 +--></script>
  188.19 +<div class="SRStatus" id="Searching">Searching...</div>
  188.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  188.21 +<script type="text/javascript"><!--
  188.22 +document.getElementById("Loading").style.display="none";
  188.23 +document.getElementById("NoMatches").style.display="none";
  188.24 +var searchResults = new SearchResults("searchResults");
  188.25 +searchResults.Search();
  188.26 +--></script>
  188.27 +</div>
  188.28 +</body>
  188.29 +</html>
   189.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   189.2 +++ b/docs/api-2.1/search/variables_b.js	Sat Feb 06 19:11:44 2021 +0100
   189.3 @@ -0,0 +1,5 @@
   189.4 +var searchData=
   189.5 +[
   189.6 +  ['ndata',['ndata',['../structUcxMempool.html#aa3a73ab231e1bc207d526f46f1c1e23a',1,'UcxMempool']]],
   189.7 +  ['next',['next',['../structUcxList.html#a82a1818f1abf765b026fa91478569a8f',1,'UcxList::next()'],['../structUcxMapElement.html#a99fe8188b0889201d70ff5f922deef51',1,'UcxMapElement::next()'],['../structUcxTestList.html#aeebb80ff75d9f6f82ab6dc2641a3c74e',1,'UcxTestList::next()']]]
   189.8 +];
   190.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   190.2 +++ b/docs/api-2.1/search/variables_c.html	Sat Feb 06 19:11:44 2021 +0100
   190.3 @@ -0,0 +1,26 @@
   190.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   190.5 +<html><head><title></title>
   190.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   190.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   190.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   190.9 +<script type="text/javascript" src="variables_c.js"></script>
  190.10 +<script type="text/javascript" src="search.js"></script>
  190.11 +</head>
  190.12 +<body class="SRPage">
  190.13 +<div id="SRIndex">
  190.14 +<div class="SRStatus" id="Loading">Loading...</div>
  190.15 +<div id="SRResults"></div>
  190.16 +<script type="text/javascript"><!--
  190.17 +createResults();
  190.18 +--></script>
  190.19 +<div class="SRStatus" id="Searching">Searching...</div>
  190.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  190.21 +<script type="text/javascript"><!--
  190.22 +document.getElementById("Loading").style.display="none";
  190.23 +document.getElementById("NoMatches").style.display="none";
  190.24 +var searchResults = new SearchResults("searchResults");
  190.25 +searchResults.Search();
  190.26 +--></script>
  190.27 +</div>
  190.28 +</body>
  190.29 +</html>
   191.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   191.2 +++ b/docs/api-2.1/search/variables_c.js	Sat Feb 06 19:11:44 2021 +0100
   191.3 @@ -0,0 +1,8 @@
   191.4 +var searchData=
   191.5 +[
   191.6 +  ['parent',['parent',['../structUcxAVLNode.html#afc4e3b4f452aa2d91cabb2135b9d42f7',1,'UcxAVLNode']]],
   191.7 +  ['pool',['pool',['../structUcxAllocator.html#a1b78012998d1c28be86dc595f8f0aac9',1,'UcxAllocator']]],
   191.8 +  ['pos',['pos',['../structUcxBuffer.html#a7a64288f002cf62b492e2ea49c79615c',1,'UcxBuffer::pos()'],['../structUcxProperties.html#addd36ac8e5e42241c0a57453633970db',1,'UcxProperties::pos()']]],
   191.9 +  ['prev',['prev',['../structUcxList.html#a0f1fddce9088b9c1414745d0b1b5c08b',1,'UcxList::prev()'],['../structucx__stack__metadata.html#ad46d2e8e5b0acf05f2def41d451c5579',1,'ucx_stack_metadata::prev()']]],
  191.10 +  ['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()']]]
  191.11 +];
   192.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   192.2 +++ b/docs/api-2.1/search/variables_d.html	Sat Feb 06 19:11:44 2021 +0100
   192.3 @@ -0,0 +1,26 @@
   192.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   192.5 +<html><head><title></title>
   192.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   192.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   192.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   192.9 +<script type="text/javascript" src="variables_d.js"></script>
  192.10 +<script type="text/javascript" src="search.js"></script>
  192.11 +</head>
  192.12 +<body class="SRPage">
  192.13 +<div id="SRIndex">
  192.14 +<div class="SRStatus" id="Loading">Loading...</div>
  192.15 +<div id="SRResults"></div>
  192.16 +<script type="text/javascript"><!--
  192.17 +createResults();
  192.18 +--></script>
  192.19 +<div class="SRStatus" id="Searching">Searching...</div>
  192.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  192.21 +<script type="text/javascript"><!--
  192.22 +document.getElementById("Loading").style.display="none";
  192.23 +document.getElementById("NoMatches").style.display="none";
  192.24 +var searchResults = new SearchResults("searchResults");
  192.25 +searchResults.Search();
  192.26 +--></script>
  192.27 +</div>
  192.28 +</body>
  192.29 +</html>
   193.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   193.2 +++ b/docs/api-2.1/search/variables_d.js	Sat Feb 06 19:11:44 2021 +0100
   193.3 @@ -0,0 +1,6 @@
   193.4 +var searchData=
   193.5 +[
   193.6 +  ['realloc',['realloc',['../structUcxAllocator.html#a3550e3847f31d9e9ce3ffcb0d3440c15',1,'UcxAllocator']]],
   193.7 +  ['right',['right',['../structUcxAVLNode.html#a7cbaa31dba8c7a89f4f8f7905f6fd238',1,'UcxAVLNode']]],
   193.8 +  ['root',['root',['../structUcxAVLTree.html#a393a8fc99eb2c290d3cb67170081d742',1,'UcxAVLTree']]]
   193.9 +];
   194.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   194.2 +++ b/docs/api-2.1/search/variables_e.html	Sat Feb 06 19:11:44 2021 +0100
   194.3 @@ -0,0 +1,26 @@
   194.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   194.5 +<html><head><title></title>
   194.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   194.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   194.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   194.9 +<script type="text/javascript" src="variables_e.js"></script>
  194.10 +<script type="text/javascript" src="search.js"></script>
  194.11 +</head>
  194.12 +<body class="SRPage">
  194.13 +<div id="SRIndex">
  194.14 +<div class="SRStatus" id="Loading">Loading...</div>
  194.15 +<div id="SRResults"></div>
  194.16 +<script type="text/javascript"><!--
  194.17 +createResults();
  194.18 +--></script>
  194.19 +<div class="SRStatus" id="Searching">Searching...</div>
  194.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  194.21 +<script type="text/javascript"><!--
  194.22 +document.getElementById("Loading").style.display="none";
  194.23 +document.getElementById("NoMatches").style.display="none";
  194.24 +var searchResults = new SearchResults("searchResults");
  194.25 +searchResults.Search();
  194.26 +--></script>
  194.27 +</div>
  194.28 +</body>
  194.29 +</html>
   195.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   195.2 +++ b/docs/api-2.1/search/variables_e.js	Sat Feb 06 19:11:44 2021 +0100
   195.3 @@ -0,0 +1,7 @@
   195.4 +var searchData=
   195.5 +[
   195.6 +  ['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()']]],
   195.7 +  ['space',['space',['../structUcxBuffer.html#a1a5076e85acb84b715a53bc0f37fb721',1,'UcxBuffer::space()'],['../structUcxStack.html#af64d528744bf3a47fec87d2e45d2992f',1,'UcxStack::space()']]],
   195.8 +  ['stream',['stream',['../structUcxLogger.html#a33fddf4791e8d49e479ecc78bf5d1b9e',1,'UcxLogger']]],
   195.9 +  ['success',['success',['../structUcxTestSuite.html#a6cefa870a3c2e38d6ee682e38643dbbb',1,'UcxTestSuite']]]
  195.10 +];
   196.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   196.2 +++ b/docs/api-2.1/search/variables_f.html	Sat Feb 06 19:11:44 2021 +0100
   196.3 @@ -0,0 +1,26 @@
   196.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   196.5 +<html><head><title></title>
   196.6 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   196.7 +<meta name="generator" content="Doxygen 1.8.13"/>
   196.8 +<link rel="stylesheet" type="text/css" href="search.css"/>
   196.9 +<script type="text/javascript" src="variables_f.js"></script>
  196.10 +<script type="text/javascript" src="search.js"></script>
  196.11 +</head>
  196.12 +<body class="SRPage">
  196.13 +<div id="SRIndex">
  196.14 +<div class="SRStatus" id="Loading">Loading...</div>
  196.15 +<div id="SRResults"></div>
  196.16 +<script type="text/javascript"><!--
  196.17 +createResults();
  196.18 +--></script>
  196.19 +<div class="SRStatus" id="Searching">Searching...</div>
  196.20 +<div class="SRStatus" id="NoMatches">No Matches</div>
  196.21 +<script type="text/javascript"><!--
  196.22 +document.getElementById("Loading").style.display="none";
  196.23 +document.getElementById("NoMatches").style.display="none";
  196.24 +var searchResults = new SearchResults("searchResults");
  196.25 +searchResults.Search();
  196.26 +--></script>
  196.27 +</div>
  196.28 +</body>
  196.29 +</html>
   197.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   197.2 +++ b/docs/api-2.1/search/variables_f.js	Sat Feb 06 19:11:44 2021 +0100
   197.3 @@ -0,0 +1,9 @@
   197.4 +var searchData=
   197.5 +[
   197.6 +  ['test',['test',['../structUcxTestList.html#a6022faa52e772b073141ca0a2f5a56c9',1,'UcxTestList']]],
   197.7 +  ['tests',['tests',['../structUcxTestSuite.html#a630677a70ebc2c3296704cda3196492b',1,'UcxTestSuite']]],
   197.8 +  ['tmp',['tmp',['../structUcxProperties.html#a68556d4260153f58dde44e4c365edce6',1,'UcxProperties']]],
   197.9 +  ['tmpcap',['tmpcap',['../structUcxProperties.html#a5af10131ea9f679b4ee174499f92e210',1,'UcxProperties']]],
  197.10 +  ['tmplen',['tmplen',['../structUcxProperties.html#a8a81853d5903bee2f4e1fa53fdffae6e',1,'UcxProperties']]],
  197.11 +  ['top',['top',['../structUcxStack.html#af0ff6f58edce469f17683013b86ade27',1,'UcxStack']]]
  197.12 +];
   198.1 Binary file docs/api-2.1/splitbar.png has changed
   199.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   199.2 +++ b/docs/api-2.1/stack_8h.html	Sat Feb 06 19:11:44 2021 +0100
   199.3 @@ -0,0 +1,677 @@
   199.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   199.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   199.6 +<head>
   199.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   199.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   199.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  199.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  199.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/stack.h File Reference</title>
  199.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  199.13 +<script type="text/javascript" src="jquery.js"></script>
  199.14 +<script type="text/javascript" src="dynsections.js"></script>
  199.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  199.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  199.17 +<script type="text/javascript" src="search/search.js"></script>
  199.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  199.19 +</head>
  199.20 +<body>
  199.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  199.22 +<div id="titlearea">
  199.23 +<table cellspacing="0" cellpadding="0">
  199.24 + <tbody>
  199.25 + <tr style="height: 56px;">
  199.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  199.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  199.28 +   <div id="projectname">ucx
  199.29 +   </div>
  199.30 +   <div id="projectbrief">UAP Common Extensions</div>
  199.31 +  </td>
  199.32 + </tr>
  199.33 + </tbody>
  199.34 +</table>
  199.35 +</div>
  199.36 +<!-- end header part -->
  199.37 +<!-- Generated by Doxygen 1.8.13 -->
  199.38 +<script type="text/javascript">
  199.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  199.40 +</script>
  199.41 +<script type="text/javascript" src="menudata.js"></script>
  199.42 +<script type="text/javascript" src="menu.js"></script>
  199.43 +<script type="text/javascript">
  199.44 +$(function() {
  199.45 +  initMenu('',true,false,'search.php','Search');
  199.46 +  $(document).ready(function() { init_search(); });
  199.47 +});
  199.48 +</script>
  199.49 +<div id="main-nav"></div>
  199.50 +<!-- window showing the filter options -->
  199.51 +<div id="MSearchSelectWindow"
  199.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  199.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  199.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  199.55 +</div>
  199.56 +
  199.57 +<!-- iframe showing the search results (closed by default) -->
  199.58 +<div id="MSearchResultsWindow">
  199.59 +<iframe src="javascript:void(0)" frameborder="0" 
  199.60 +        name="MSearchResults" id="MSearchResults">
  199.61 +</iframe>
  199.62 +</div>
  199.63 +
  199.64 +<div id="nav-path" class="navpath">
  199.65 +  <ul>
  199.66 +<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>
  199.67 +</div>
  199.68 +</div><!-- top -->
  199.69 +<div class="header">
  199.70 +  <div class="summary">
  199.71 +<a href="#nested-classes">Data Structures</a> &#124;
  199.72 +<a href="#define-members">Macros</a> &#124;
  199.73 +<a href="#func-members">Functions</a>  </div>
  199.74 +  <div class="headertitle">
  199.75 +<div class="title">stack.h File Reference</div>  </div>
  199.76 +</div><!--header-->
  199.77 +<div class="contents">
  199.78 +
  199.79 +<p>Default stack memory allocation implementation.  
  199.80 +<a href="#details">More...</a></p>
  199.81 +<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
  199.82 +<code>#include &quot;<a class="el" href="allocator_8h_source.html">allocator.h</a>&quot;</code><br />
  199.83 +</div>
  199.84 +<p><a href="stack_8h_source.html">Go to the source code of this file.</a></p>
  199.85 +<table class="memberdecls">
  199.86 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
  199.87 +Data Structures</h2></td></tr>
  199.88 +<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>
  199.89 +<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX stack structure.  <a href="structUcxStack.html#details">More...</a><br /></td></tr>
  199.90 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
  199.91 +<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>
  199.92 +<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>
  199.93 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
  199.94 +</table><table class="memberdecls">
  199.95 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
  199.96 +Macros</h2></td></tr>
  199.97 +<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>
  199.98 +<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>
  199.99 +<tr class="separator:a030197051a803e87d5eeac5adb80b15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 199.100 +<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>
 199.101 +<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>
 199.102 +<tr class="separator:a506b82374734ec476d086ddfb561174d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 199.103 +<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>
 199.104 +<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>
 199.105 +<tr class="separator:a4f7239dbd6c032c56812e370b71c1985"><td class="memSeparator" colspan="2">&#160;</td></tr>
 199.106 +<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>
 199.107 +<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>
 199.108 +<tr class="separator:a3b761343c6491222604341ebfa443226"><td class="memSeparator" colspan="2">&#160;</td></tr>
 199.109 +</table><table class="memberdecls">
 199.110 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
 199.111 +Functions</h2></td></tr>
 199.112 +<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>
 199.113 +<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>
 199.114 +<tr class="separator:abaef685df4e7ef95cd7218984a0618fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
 199.115 +<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>
 199.116 +<tr class="memdesc:af865b416802140f6b6e8ab3626d7d1ac"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocates stack memory.  <a href="#af865b416802140f6b6e8ab3626d7d1ac">More...</a><br /></td></tr>
 199.117 +<tr class="separator:af865b416802140f6b6e8ab3626d7d1ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
 199.118 +<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>
 199.119 +<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>
 199.120 +<tr class="separator:af85e6f77a8341beb6188f9ae1a8e9f92"><td class="memSeparator" colspan="2">&#160;</td></tr>
 199.121 +<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>
 199.122 +<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>
 199.123 +<tr class="separator:afdc467524b5e19a9a777c6bc03e17174"><td class="memSeparator" colspan="2">&#160;</td></tr>
 199.124 +<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>
 199.125 +<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>
 199.126 +<tr class="separator:a7bb138979191bba138e76ea37488fae2"><td class="memSeparator" colspan="2">&#160;</td></tr>
 199.127 +<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>
 199.128 +<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>
 199.129 +<tr class="separator:a0c678f96f6fabab49b2b034a1fe91c3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 199.130 +<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>
 199.131 +<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>
 199.132 +<tr class="separator:aabd55c14a3866b3782ba324f4d8b4c41"><td class="memSeparator" colspan="2">&#160;</td></tr>
 199.133 +<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>
 199.134 +<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>
 199.135 +<tr class="separator:a07ea48f28eab474dcfefbb86fa66ef81"><td class="memSeparator" colspan="2">&#160;</td></tr>
 199.136 +<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>
 199.137 +<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>
 199.138 +<tr class="separator:a53cd2c7743dc8ad9cbd35ade0b4873e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 199.139 +</table>
 199.140 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 199.141 +<div class="textblock"><p>Default stack memory allocation implementation. </p>
 199.142 +<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
 199.143 +<dd>
 199.144 +Olaf Wintermann </dd></dl>
 199.145 +</div><h2 class="groupheader">Macro Definition Documentation</h2>
 199.146 +<a id="a3b761343c6491222604341ebfa443226"></a>
 199.147 +<h2 class="memtitle"><span class="permalink"><a href="#a3b761343c6491222604341ebfa443226">&#9670;&nbsp;</a></span>ucx_stack_dim</h2>
 199.148 +
 199.149 +<div class="memitem">
 199.150 +<div class="memproto">
 199.151 +      <table class="memname">
 199.152 +        <tr>
 199.153 +          <td class="memname">#define ucx_stack_dim</td>
 199.154 +          <td>(</td>
 199.155 +          <td class="paramtype">&#160;</td>
 199.156 +          <td class="paramname">size, </td>
 199.157 +        </tr>
 199.158 +        <tr>
 199.159 +          <td class="paramkey"></td>
 199.160 +          <td></td>
 199.161 +          <td class="paramtype">&#160;</td>
 199.162 +          <td class="paramname">elems&#160;</td>
 199.163 +        </tr>
 199.164 +        <tr>
 199.165 +          <td></td>
 199.166 +          <td>)</td>
 199.167 +          <td></td><td></td>
 199.168 +        </tr>
 199.169 +      </table>
 199.170 +</div><div class="memdoc">
 199.171 +<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>
 199.172 +</div><!-- fragment -->
 199.173 +<p>Computes a recommended size for the stack memory area. </p>
 199.174 +<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>
 199.175 +<dl class="params"><dt>Parameters</dt><dd>
 199.176 +  <table class="params">
 199.177 +    <tr><td class="paramname">size</td><td>the approximate payload </td></tr>
 199.178 +    <tr><td class="paramname">elems</td><td>the approximate count of element allocations </td></tr>
 199.179 +  </table>
 199.180 +  </dd>
 199.181 +</dl>
 199.182 +<dl class="section return"><dt>Returns</dt><dd>a recommended size for the stack space based on the information provided </dd></dl>
 199.183 +
 199.184 +</div>
 199.185 +</div>
 199.186 +<a id="a4f7239dbd6c032c56812e370b71c1985"></a>
 199.187 +<h2 class="memtitle"><span class="permalink"><a href="#a4f7239dbd6c032c56812e370b71c1985">&#9670;&nbsp;</a></span>ucx_stack_empty</h2>
 199.188 +
 199.189 +<div class="memitem">
 199.190 +<div class="memproto">
 199.191 +      <table class="memname">
 199.192 +        <tr>
 199.193 +          <td class="memname">#define ucx_stack_empty</td>
 199.194 +          <td>(</td>
 199.195 +          <td class="paramtype">&#160;</td>
 199.196 +          <td class="paramname">stack</td><td>)</td>
 199.197 +          <td>&#160;&#160;&#160;(!(stack)-&gt;top)</td>
 199.198 +        </tr>
 199.199 +      </table>
 199.200 +</div><div class="memdoc">
 199.201 +
 199.202 +<p>Checks, if the stack is empty. </p>
 199.203 +<dl class="params"><dt>Parameters</dt><dd>
 199.204 +  <table class="params">
 199.205 +    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
 199.206 +  </table>
 199.207 +  </dd>
 199.208 +</dl>
 199.209 +<dl class="section return"><dt>Returns</dt><dd>nonzero, if the stack is empty, zero otherwise </dd></dl>
 199.210 +
 199.211 +</div>
 199.212 +</div>
 199.213 +<a id="a506b82374734ec476d086ddfb561174d"></a>
 199.214 +<h2 class="memtitle"><span class="permalink"><a href="#a506b82374734ec476d086ddfb561174d">&#9670;&nbsp;</a></span>ucx_stack_pop</h2>
 199.215 +
 199.216 +<div class="memitem">
 199.217 +<div class="memproto">
 199.218 +      <table class="memname">
 199.219 +        <tr>
 199.220 +          <td class="memname">#define ucx_stack_pop</td>
 199.221 +          <td>(</td>
 199.222 +          <td class="paramtype">&#160;</td>
 199.223 +          <td class="paramname">stack, </td>
 199.224 +        </tr>
 199.225 +        <tr>
 199.226 +          <td class="paramkey"></td>
 199.227 +          <td></td>
 199.228 +          <td class="paramtype">&#160;</td>
 199.229 +          <td class="paramname">dest&#160;</td>
 199.230 +        </tr>
 199.231 +        <tr>
 199.232 +          <td></td>
 199.233 +          <td>)</td>
 199.234 +          <td></td><td>&#160;&#160;&#160;<a class="el" href="stack_8h.html#a07ea48f28eab474dcfefbb86fa66ef81">ucx_stack_popn</a>(stack, dest, (size_t)-1)</td>
 199.235 +        </tr>
 199.236 +      </table>
 199.237 +</div><div class="memdoc">
 199.238 +
 199.239 +<p>Removes the top most element from the stack and copies the content to <code> dest</code>, if specified. </p>
 199.240 +<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>
 199.241 +<dl class="params"><dt>Parameters</dt><dd>
 199.242 +  <table class="params">
 199.243 +    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
 199.244 +    <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>
 199.245 +  </table>
 199.246 +  </dd>
 199.247 +</dl>
 199.248 +<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>
 199.249 +<dd>
 199.250 +<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>
 199.251 +
 199.252 +</div>
 199.253 +</div>
 199.254 +<a id="a030197051a803e87d5eeac5adb80b15a"></a>
 199.255 +<h2 class="memtitle"><span class="permalink"><a href="#a030197051a803e87d5eeac5adb80b15a">&#9670;&nbsp;</a></span>ucx_stack_topsize</h2>
 199.256 +
 199.257 +<div class="memitem">
 199.258 +<div class="memproto">
 199.259 +      <table class="memname">
 199.260 +        <tr>
 199.261 +          <td class="memname">#define ucx_stack_topsize</td>
 199.262 +          <td>(</td>
 199.263 +          <td class="paramtype">&#160;</td>
 199.264 +          <td class="paramname">stack</td><td>)</td>
 199.265 +          <td></td>
 199.266 +        </tr>
 199.267 +      </table>
 199.268 +</div><div class="memdoc">
 199.269 +<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>
 199.270 +</div><!-- fragment -->
 199.271 +<p>Returns the size of the top most element. </p>
 199.272 +<dl class="params"><dt>Parameters</dt><dd>
 199.273 +  <table class="params">
 199.274 +    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
 199.275 +  </table>
 199.276 +  </dd>
 199.277 +</dl>
 199.278 +<dl class="section return"><dt>Returns</dt><dd>the size of the top most element </dd></dl>
 199.279 +
 199.280 +</div>
 199.281 +</div>
 199.282 +<h2 class="groupheader">Function Documentation</h2>
 199.283 +<a id="a53cd2c7743dc8ad9cbd35ade0b4873e7"></a>
 199.284 +<h2 class="memtitle"><span class="permalink"><a href="#a53cd2c7743dc8ad9cbd35ade0b4873e7">&#9670;&nbsp;</a></span>ucx_stack_avail()</h2>
 199.285 +
 199.286 +<div class="memitem">
 199.287 +<div class="memproto">
 199.288 +      <table class="memname">
 199.289 +        <tr>
 199.290 +          <td class="memname">size_t ucx_stack_avail </td>
 199.291 +          <td>(</td>
 199.292 +          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
 199.293 +          <td class="paramname"><em>stack</em></td><td>)</td>
 199.294 +          <td></td>
 199.295 +        </tr>
 199.296 +      </table>
 199.297 +</div><div class="memdoc">
 199.298 +
 199.299 +<p>Returns the remaining available memory on the specified stack. </p>
 199.300 +<dl class="params"><dt>Parameters</dt><dd>
 199.301 +  <table class="params">
 199.302 +    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
 199.303 +  </table>
 199.304 +  </dd>
 199.305 +</dl>
 199.306 +<dl class="section return"><dt>Returns</dt><dd>the remaining available memory </dd></dl>
 199.307 +
 199.308 +</div>
 199.309 +</div>
 199.310 +<a id="afdc467524b5e19a9a777c6bc03e17174"></a>
 199.311 +<h2 class="memtitle"><span class="permalink"><a href="#afdc467524b5e19a9a777c6bc03e17174">&#9670;&nbsp;</a></span>ucx_stack_calloc()</h2>
 199.312 +
 199.313 +<div class="memitem">
 199.314 +<div class="memproto">
 199.315 +      <table class="memname">
 199.316 +        <tr>
 199.317 +          <td class="memname">void* ucx_stack_calloc </td>
 199.318 +          <td>(</td>
 199.319 +          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
 199.320 +          <td class="paramname"><em>stack</em>, </td>
 199.321 +        </tr>
 199.322 +        <tr>
 199.323 +          <td class="paramkey"></td>
 199.324 +          <td></td>
 199.325 +          <td class="paramtype">size_t&#160;</td>
 199.326 +          <td class="paramname"><em>nelem</em>, </td>
 199.327 +        </tr>
 199.328 +        <tr>
 199.329 +          <td class="paramkey"></td>
 199.330 +          <td></td>
 199.331 +          <td class="paramtype">size_t&#160;</td>
 199.332 +          <td class="paramname"><em>elsize</em>&#160;</td>
 199.333 +        </tr>
 199.334 +        <tr>
 199.335 +          <td></td>
 199.336 +          <td>)</td>
 199.337 +          <td></td><td></td>
 199.338 +        </tr>
 199.339 +      </table>
 199.340 +</div><div class="memdoc">
 199.341 +
 199.342 +<p>Allocates an array of stack memory. </p>
 199.343 +<p>The content of the allocated memory is set to zero.</p>
 199.344 +<dl class="params"><dt>Parameters</dt><dd>
 199.345 +  <table class="params">
 199.346 +    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
 199.347 +    <tr><td class="paramname">nelem</td><td>amount of elements to allocate </td></tr>
 199.348 +    <tr><td class="paramname">elsize</td><td>amount of memory per element </td></tr>
 199.349 +  </table>
 199.350 +  </dd>
 199.351 +</dl>
 199.352 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory </dd></dl>
 199.353 +<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>
 199.354 +
 199.355 +</div>
 199.356 +</div>
 199.357 +<a id="aabd55c14a3866b3782ba324f4d8b4c41"></a>
 199.358 +<h2 class="memtitle"><span class="permalink"><a href="#aabd55c14a3866b3782ba324f4d8b4c41">&#9670;&nbsp;</a></span>ucx_stack_free()</h2>
 199.359 +
 199.360 +<div class="memitem">
 199.361 +<div class="memproto">
 199.362 +      <table class="memname">
 199.363 +        <tr>
 199.364 +          <td class="memname">void ucx_stack_free </td>
 199.365 +          <td>(</td>
 199.366 +          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
 199.367 +          <td class="paramname"><em>stack</em>, </td>
 199.368 +        </tr>
 199.369 +        <tr>
 199.370 +          <td class="paramkey"></td>
 199.371 +          <td></td>
 199.372 +          <td class="paramtype">void *&#160;</td>
 199.373 +          <td class="paramname"><em>ptr</em>&#160;</td>
 199.374 +        </tr>
 199.375 +        <tr>
 199.376 +          <td></td>
 199.377 +          <td>)</td>
 199.378 +          <td></td><td></td>
 199.379 +        </tr>
 199.380 +      </table>
 199.381 +</div><div class="memdoc">
 199.382 +
 199.383 +<p>Frees memory on the stack. </p>
 199.384 +<p>Freeing stack memory behaves in a special way.</p>
 199.385 +<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>
 199.386 +<dl class="params"><dt>Parameters</dt><dd>
 199.387 +  <table class="params">
 199.388 +    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
 199.389 +    <tr><td class="paramname">ptr</td><td>a pointer to the memory that shall be freed </td></tr>
 199.390 +  </table>
 199.391 +  </dd>
 199.392 +</dl>
 199.393 +
 199.394 +</div>
 199.395 +</div>
 199.396 +<a id="abaef685df4e7ef95cd7218984a0618fe"></a>
 199.397 +<h2 class="memtitle"><span class="permalink"><a href="#abaef685df4e7ef95cd7218984a0618fe">&#9670;&nbsp;</a></span>ucx_stack_init()</h2>
 199.398 +
 199.399 +<div class="memitem">
 199.400 +<div class="memproto">
 199.401 +      <table class="memname">
 199.402 +        <tr>
 199.403 +          <td class="memname">void ucx_stack_init </td>
 199.404 +          <td>(</td>
 199.405 +          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
 199.406 +          <td class="paramname"><em>stack</em>, </td>
 199.407 +        </tr>
 199.408 +        <tr>
 199.409 +          <td class="paramkey"></td>
 199.410 +          <td></td>
 199.411 +          <td class="paramtype">char *&#160;</td>
 199.412 +          <td class="paramname"><em>space</em>, </td>
 199.413 +        </tr>
 199.414 +        <tr>
 199.415 +          <td class="paramkey"></td>
 199.416 +          <td></td>
 199.417 +          <td class="paramtype">size_t&#160;</td>
 199.418 +          <td class="paramname"><em>size</em>&#160;</td>
 199.419 +        </tr>
 199.420 +        <tr>
 199.421 +          <td></td>
 199.422 +          <td>)</td>
 199.423 +          <td></td><td></td>
 199.424 +        </tr>
 199.425 +      </table>
 199.426 +</div><div class="memdoc">
 199.427 +
 199.428 +<p>Initializes <a class="el" href="structUcxStack.html" title="UCX stack structure. ">UcxStack</a> structure with memory. </p>
 199.429 +<dl class="params"><dt>Parameters</dt><dd>
 199.430 +  <table class="params">
 199.431 +    <tr><td class="paramname">stack</td><td>a pointer to an uninitialized stack structure </td></tr>
 199.432 +    <tr><td class="paramname">space</td><td>the memory area that shall be managed </td></tr>
 199.433 +    <tr><td class="paramname">size</td><td>size of the memory area </td></tr>
 199.434 +  </table>
 199.435 +  </dd>
 199.436 +</dl>
 199.437 +<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>
 199.438 +
 199.439 +</div>
 199.440 +</div>
 199.441 +<a id="af865b416802140f6b6e8ab3626d7d1ac"></a>
 199.442 +<h2 class="memtitle"><span class="permalink"><a href="#af865b416802140f6b6e8ab3626d7d1ac">&#9670;&nbsp;</a></span>ucx_stack_malloc()</h2>
 199.443 +
 199.444 +<div class="memitem">
 199.445 +<div class="memproto">
 199.446 +      <table class="memname">
 199.447 +        <tr>
 199.448 +          <td class="memname">void* ucx_stack_malloc </td>
 199.449 +          <td>(</td>
 199.450 +          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
 199.451 +          <td class="paramname"><em>stack</em>, </td>
 199.452 +        </tr>
 199.453 +        <tr>
 199.454 +          <td class="paramkey"></td>
 199.455 +          <td></td>
 199.456 +          <td class="paramtype">size_t&#160;</td>
 199.457 +          <td class="paramname"><em>n</em>&#160;</td>
 199.458 +        </tr>
 199.459 +        <tr>
 199.460 +          <td></td>
 199.461 +          <td>)</td>
 199.462 +          <td></td><td></td>
 199.463 +        </tr>
 199.464 +      </table>
 199.465 +</div><div class="memdoc">
 199.466 +
 199.467 +<p>Allocates stack memory. </p>
 199.468 +<dl class="params"><dt>Parameters</dt><dd>
 199.469 +  <table class="params">
 199.470 +    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
 199.471 +    <tr><td class="paramname">n</td><td>amount of memory to allocate </td></tr>
 199.472 +  </table>
 199.473 +  </dd>
 199.474 +</dl>
 199.475 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory or <code>NULL</code> on stack overflow </dd></dl>
 199.476 +<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>
 199.477 +
 199.478 +</div>
 199.479 +</div>
 199.480 +<a id="a07ea48f28eab474dcfefbb86fa66ef81"></a>
 199.481 +<h2 class="memtitle"><span class="permalink"><a href="#a07ea48f28eab474dcfefbb86fa66ef81">&#9670;&nbsp;</a></span>ucx_stack_popn()</h2>
 199.482 +
 199.483 +<div class="memitem">
 199.484 +<div class="memproto">
 199.485 +      <table class="memname">
 199.486 +        <tr>
 199.487 +          <td class="memname">void ucx_stack_popn </td>
 199.488 +          <td>(</td>
 199.489 +          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
 199.490 +          <td class="paramname"><em>stack</em>, </td>
 199.491 +        </tr>
 199.492 +        <tr>
 199.493 +          <td class="paramkey"></td>
 199.494 +          <td></td>
 199.495 +          <td class="paramtype">void *&#160;</td>
 199.496 +          <td class="paramname"><em>dest</em>, </td>
 199.497 +        </tr>
 199.498 +        <tr>
 199.499 +          <td class="paramkey"></td>
 199.500 +          <td></td>
 199.501 +          <td class="paramtype">size_t&#160;</td>
 199.502 +          <td class="paramname"><em>n</em>&#160;</td>
 199.503 +        </tr>
 199.504 +        <tr>
 199.505 +          <td></td>
 199.506 +          <td>)</td>
 199.507 +          <td></td><td></td>
 199.508 +        </tr>
 199.509 +      </table>
 199.510 +</div><div class="memdoc">
 199.511 +
 199.512 +<p>Removes the top most element from the stack and copies the content to <code> dest</code>. </p>
 199.513 +<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>
 199.514 +<dl class="params"><dt>Parameters</dt><dd>
 199.515 +  <table class="params">
 199.516 +    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
 199.517 +    <tr><td class="paramname">dest</td><td>the location where the contents shall be written to </td></tr>
 199.518 +    <tr><td class="paramname">n</td><td>copies at most n bytes to <code>dest</code> </td></tr>
 199.519 +  </table>
 199.520 +  </dd>
 199.521 +</dl>
 199.522 +<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>
 199.523 +
 199.524 +</div>
 199.525 +</div>
 199.526 +<a id="af85e6f77a8341beb6188f9ae1a8e9f92"></a>
 199.527 +<h2 class="memtitle"><span class="permalink"><a href="#af85e6f77a8341beb6188f9ae1a8e9f92">&#9670;&nbsp;</a></span>ucx_stack_push()</h2>
 199.528 +
 199.529 +<div class="memitem">
 199.530 +<div class="memproto">
 199.531 +      <table class="memname">
 199.532 +        <tr>
 199.533 +          <td class="memname">void* ucx_stack_push </td>
 199.534 +          <td>(</td>
 199.535 +          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
 199.536 +          <td class="paramname"><em>stack</em>, </td>
 199.537 +        </tr>
 199.538 +        <tr>
 199.539 +          <td class="paramkey"></td>
 199.540 +          <td></td>
 199.541 +          <td class="paramtype">size_t&#160;</td>
 199.542 +          <td class="paramname"><em>n</em>, </td>
 199.543 +        </tr>
 199.544 +        <tr>
 199.545 +          <td class="paramkey"></td>
 199.546 +          <td></td>
 199.547 +          <td class="paramtype">const void *&#160;</td>
 199.548 +          <td class="paramname"><em>data</em>&#160;</td>
 199.549 +        </tr>
 199.550 +        <tr>
 199.551 +          <td></td>
 199.552 +          <td>)</td>
 199.553 +          <td></td><td></td>
 199.554 +        </tr>
 199.555 +      </table>
 199.556 +</div><div class="memdoc">
 199.557 +
 199.558 +<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>
 199.559 +<dl class="params"><dt>Parameters</dt><dd>
 199.560 +  <table class="params">
 199.561 +    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
 199.562 +    <tr><td class="paramname">n</td><td>amount of memory to allocate </td></tr>
 199.563 +    <tr><td class="paramname">data</td><td>a pointer to the data to copy </td></tr>
 199.564 +  </table>
 199.565 +  </dd>
 199.566 +</dl>
 199.567 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory </dd></dl>
 199.568 +<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>
 199.569 +
 199.570 +</div>
 199.571 +</div>
 199.572 +<a id="a7bb138979191bba138e76ea37488fae2"></a>
 199.573 +<h2 class="memtitle"><span class="permalink"><a href="#a7bb138979191bba138e76ea37488fae2">&#9670;&nbsp;</a></span>ucx_stack_pusharr()</h2>
 199.574 +
 199.575 +<div class="memitem">
 199.576 +<div class="memproto">
 199.577 +      <table class="memname">
 199.578 +        <tr>
 199.579 +          <td class="memname">void* ucx_stack_pusharr </td>
 199.580 +          <td>(</td>
 199.581 +          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
 199.582 +          <td class="paramname"><em>stack</em>, </td>
 199.583 +        </tr>
 199.584 +        <tr>
 199.585 +          <td class="paramkey"></td>
 199.586 +          <td></td>
 199.587 +          <td class="paramtype">size_t&#160;</td>
 199.588 +          <td class="paramname"><em>nelem</em>, </td>
 199.589 +        </tr>
 199.590 +        <tr>
 199.591 +          <td class="paramkey"></td>
 199.592 +          <td></td>
 199.593 +          <td class="paramtype">size_t&#160;</td>
 199.594 +          <td class="paramname"><em>elsize</em>, </td>
 199.595 +        </tr>
 199.596 +        <tr>
 199.597 +          <td class="paramkey"></td>
 199.598 +          <td></td>
 199.599 +          <td class="paramtype">const void *&#160;</td>
 199.600 +          <td class="paramname"><em>data</em>&#160;</td>
 199.601 +        </tr>
 199.602 +        <tr>
 199.603 +          <td></td>
 199.604 +          <td>)</td>
 199.605 +          <td></td><td></td>
 199.606 +        </tr>
 199.607 +      </table>
 199.608 +</div><div class="memdoc">
 199.609 +
 199.610 +<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>
 199.611 +<dl class="params"><dt>Parameters</dt><dd>
 199.612 +  <table class="params">
 199.613 +    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
 199.614 +    <tr><td class="paramname">nelem</td><td>amount of elements to allocate </td></tr>
 199.615 +    <tr><td class="paramname">elsize</td><td>amount of memory per element </td></tr>
 199.616 +    <tr><td class="paramname">data</td><td>a pointer to the data </td></tr>
 199.617 +  </table>
 199.618 +  </dd>
 199.619 +</dl>
 199.620 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory </dd></dl>
 199.621 +<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>
 199.622 +
 199.623 +</div>
 199.624 +</div>
 199.625 +<a id="a0c678f96f6fabab49b2b034a1fe91c3a"></a>
 199.626 +<h2 class="memtitle"><span class="permalink"><a href="#a0c678f96f6fabab49b2b034a1fe91c3a">&#9670;&nbsp;</a></span>ucx_stack_realloc()</h2>
 199.627 +
 199.628 +<div class="memitem">
 199.629 +<div class="memproto">
 199.630 +      <table class="memname">
 199.631 +        <tr>
 199.632 +          <td class="memname">void* ucx_stack_realloc </td>
 199.633 +          <td>(</td>
 199.634 +          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
 199.635 +          <td class="paramname"><em>stack</em>, </td>
 199.636 +        </tr>
 199.637 +        <tr>
 199.638 +          <td class="paramkey"></td>
 199.639 +          <td></td>
 199.640 +          <td class="paramtype">void *&#160;</td>
 199.641 +          <td class="paramname"><em>ptr</em>, </td>
 199.642 +        </tr>
 199.643 +        <tr>
 199.644 +          <td class="paramkey"></td>
 199.645 +          <td></td>
 199.646 +          <td class="paramtype">size_t&#160;</td>
 199.647 +          <td class="paramname"><em>n</em>&#160;</td>
 199.648 +        </tr>
 199.649 +        <tr>
 199.650 +          <td></td>
 199.651 +          <td>)</td>
 199.652 +          <td></td><td></td>
 199.653 +        </tr>
 199.654 +      </table>
 199.655 +</div><div class="memdoc">
 199.656 +
 199.657 +<p>Reallocates memory on the stack. </p>
 199.658 +<p>Shrinking memory is always safe. Extending memory can be very expensive.</p>
 199.659 +<dl class="params"><dt>Parameters</dt><dd>
 199.660 +  <table class="params">
 199.661 +    <tr><td class="paramname">stack</td><td>the stack </td></tr>
 199.662 +    <tr><td class="paramname">ptr</td><td>a pointer to the memory that shall be reallocated </td></tr>
 199.663 +    <tr><td class="paramname">n</td><td>the new size of the memory </td></tr>
 199.664 +  </table>
 199.665 +  </dd>
 199.666 +</dl>
 199.667 +<dl class="section return"><dt>Returns</dt><dd>a pointer to the new location of the memory </dd></dl>
 199.668 +<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>
 199.669 +
 199.670 +</div>
 199.671 +</div>
 199.672 +</div><!-- contents -->
 199.673 +<!-- start footer part -->
 199.674 +<hr class="footer"/><address class="footer"><small>
 199.675 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 199.676 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 199.677 +</a> 1.8.13
 199.678 +</small></address>
 199.679 +</body>
 199.680 +</html>
   200.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   200.2 +++ b/docs/api-2.1/stack_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
   200.3 @@ -0,0 +1,99 @@
   200.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   200.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   200.6 +<head>
   200.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   200.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   200.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  200.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  200.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/stack.h Source File</title>
  200.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  200.13 +<script type="text/javascript" src="jquery.js"></script>
  200.14 +<script type="text/javascript" src="dynsections.js"></script>
  200.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  200.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  200.17 +<script type="text/javascript" src="search/search.js"></script>
  200.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  200.19 +</head>
  200.20 +<body>
  200.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  200.22 +<div id="titlearea">
  200.23 +<table cellspacing="0" cellpadding="0">
  200.24 + <tbody>
  200.25 + <tr style="height: 56px;">
  200.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  200.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  200.28 +   <div id="projectname">ucx
  200.29 +   </div>
  200.30 +   <div id="projectbrief">UAP Common Extensions</div>
  200.31 +  </td>
  200.32 + </tr>
  200.33 + </tbody>
  200.34 +</table>
  200.35 +</div>
  200.36 +<!-- end header part -->
  200.37 +<!-- Generated by Doxygen 1.8.13 -->
  200.38 +<script type="text/javascript">
  200.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  200.40 +</script>
  200.41 +<script type="text/javascript" src="menudata.js"></script>
  200.42 +<script type="text/javascript" src="menu.js"></script>
  200.43 +<script type="text/javascript">
  200.44 +$(function() {
  200.45 +  initMenu('',true,false,'search.php','Search');
  200.46 +  $(document).ready(function() { init_search(); });
  200.47 +});
  200.48 +</script>
  200.49 +<div id="main-nav"></div>
  200.50 +<!-- window showing the filter options -->
  200.51 +<div id="MSearchSelectWindow"
  200.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  200.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  200.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  200.55 +</div>
  200.56 +
  200.57 +<!-- iframe showing the search results (closed by default) -->
  200.58 +<div id="MSearchResultsWindow">
  200.59 +<iframe src="javascript:void(0)" frameborder="0" 
  200.60 +        name="MSearchResults" id="MSearchResults">
  200.61 +</iframe>
  200.62 +</div>
  200.63 +
  200.64 +<div id="nav-path" class="navpath">
  200.65 +  <ul>
  200.66 +<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>
  200.67 +</div>
  200.68 +</div><!-- top -->
  200.69 +<div class="header">
  200.70 +  <div class="headertitle">
  200.71 +<div class="title">stack.h</div>  </div>
  200.72 +</div><!--header-->
  200.73 +<div class="contents">
  200.74 +<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>
  200.75 +<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>
  200.76 +<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>
  200.77 +<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>
  200.78 +<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>
  200.79 +<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>
  200.80 +<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>
  200.81 +<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>
  200.82 +<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>
  200.83 +<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>
  200.84 +<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>
  200.85 +<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>
  200.86 +<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>
  200.87 +<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>
  200.88 +<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>
  200.89 +<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>
  200.90 +<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>
  200.91 +<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>
  200.92 +<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>
  200.93 +<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>
  200.94 +</div><!-- fragment --></div><!-- contents -->
  200.95 +<!-- start footer part -->
  200.96 +<hr class="footer"/><address class="footer"><small>
  200.97 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  200.98 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  200.99 +</a> 1.8.13
 200.100 +</small></address>
 200.101 +</body>
 200.102 +</html>
   201.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   201.2 +++ b/docs/api-2.1/string_8h.html	Sat Feb 06 19:11:44 2021 +0100
   201.3 @@ -0,0 +1,2598 @@
   201.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   201.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   201.6 +<head>
   201.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   201.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   201.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  201.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  201.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/string.h File Reference</title>
  201.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  201.13 +<script type="text/javascript" src="jquery.js"></script>
  201.14 +<script type="text/javascript" src="dynsections.js"></script>
  201.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  201.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  201.17 +<script type="text/javascript" src="search/search.js"></script>
  201.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  201.19 +</head>
  201.20 +<body>
  201.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  201.22 +<div id="titlearea">
  201.23 +<table cellspacing="0" cellpadding="0">
  201.24 + <tbody>
  201.25 + <tr style="height: 56px;">
  201.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  201.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  201.28 +   <div id="projectname">ucx
  201.29 +   </div>
  201.30 +   <div id="projectbrief">UAP Common Extensions</div>
  201.31 +  </td>
  201.32 + </tr>
  201.33 + </tbody>
  201.34 +</table>
  201.35 +</div>
  201.36 +<!-- end header part -->
  201.37 +<!-- Generated by Doxygen 1.8.13 -->
  201.38 +<script type="text/javascript">
  201.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  201.40 +</script>
  201.41 +<script type="text/javascript" src="menudata.js"></script>
  201.42 +<script type="text/javascript" src="menu.js"></script>
  201.43 +<script type="text/javascript">
  201.44 +$(function() {
  201.45 +  initMenu('',true,false,'search.php','Search');
  201.46 +  $(document).ready(function() { init_search(); });
  201.47 +});
  201.48 +</script>
  201.49 +<div id="main-nav"></div>
  201.50 +<!-- window showing the filter options -->
  201.51 +<div id="MSearchSelectWindow"
  201.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  201.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  201.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  201.55 +</div>
  201.56 +
  201.57 +<!-- iframe showing the search results (closed by default) -->
  201.58 +<div id="MSearchResultsWindow">
  201.59 +<iframe src="javascript:void(0)" frameborder="0" 
  201.60 +        name="MSearchResults" id="MSearchResults">
  201.61 +</iframe>
  201.62 +</div>
  201.63 +
  201.64 +<div id="nav-path" class="navpath">
  201.65 +  <ul>
  201.66 +<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>
  201.67 +</div>
  201.68 +</div><!-- top -->
  201.69 +<div class="header">
  201.70 +  <div class="summary">
  201.71 +<a href="#nested-classes">Data Structures</a> &#124;
  201.72 +<a href="#define-members">Macros</a> &#124;
  201.73 +<a href="#func-members">Functions</a>  </div>
  201.74 +  <div class="headertitle">
  201.75 +<div class="title">string.h File Reference</div>  </div>
  201.76 +</div><!--header-->
  201.77 +<div class="contents">
  201.78 +
  201.79 +<p>Bounded string implementation.  
  201.80 +<a href="#details">More...</a></p>
  201.81 +<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
  201.82 +<code>#include &quot;<a class="el" href="allocator_8h_source.html">allocator.h</a>&quot;</code><br />
  201.83 +<code>#include &lt;stddef.h&gt;</code><br />
  201.84 +</div>
  201.85 +<p><a href="string_8h_source.html">Go to the source code of this file.</a></p>
  201.86 +<table class="memberdecls">
  201.87 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
  201.88 +Data Structures</h2></td></tr>
  201.89 +<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>
  201.90 +<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>
  201.91 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
  201.92 +<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>
  201.93 +<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>
  201.94 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
  201.95 +</table><table class="memberdecls">
  201.96 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
  201.97 +Macros</h2></td></tr>
  201.98 +<tr class="memitem:a9037956cca97a4e84b642f17f3d10378"><td class="memItemLeft" align="right" valign="top"><a id="a9037956cca97a4e84b642f17f3d10378"></a>
  201.99 +#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>
 201.100 +<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>
 201.101 +<tr class="separator:a9037956cca97a4e84b642f17f3d10378"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.102 +<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>
 201.103 +<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>
 201.104 +<tr class="separator:a8fa17c8cf4c36df48f4108c36da8573e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.105 +<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>
 201.106 +<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>
 201.107 +<tr class="separator:a7d261dd0bc358c957a368bc058c1ce53"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.108 +<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>
 201.109 +<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>
 201.110 +<tr class="separator:a23ed51e87385886bb65e8cd19c839362"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.111 +<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>
 201.112 +<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>
 201.113 +<tr class="separator:a7d5bc48708405a28b23667e32dfcecae"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.114 +<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>
 201.115 +<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>
 201.116 +<tr class="separator:ad4293350a9b39a23a6546bd0fef2aeed"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.117 +<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>
 201.118 +<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>
 201.119 +<tr class="separator:a33fa945acc5ac2ce962e5ef13cf1638c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.120 +<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>
 201.121 +<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>
 201.122 +<tr class="separator:a6af8a4c347c7fdb5980d4c4803be2759"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.123 +<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>
 201.124 +<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>
 201.125 +<tr class="separator:a6068d460f9bc05962666a917d26568b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.126 +<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>
 201.127 +<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>
 201.128 +<tr class="separator:a9d03be026afa9447c52bb34b9e3b895a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.129 +<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>
 201.130 +<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>
 201.131 +<tr class="separator:aa696932213265e10f864678686f4ccde"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.132 +<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>
 201.133 +<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>
 201.134 +<tr class="separator:aa929984004c3576bfafb95031aca8eb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.135 +<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>
 201.136 +<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>
 201.137 +<tr class="separator:ac9f69fa3a17e26a3a5f9d985b5844601"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.138 +<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>
 201.139 +<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>
 201.140 +<tr class="separator:a7ae7156c8de57454ca38d306100b8160"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.141 +<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>
 201.142 +<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>
 201.143 +<tr class="separator:a81b0f6df794152c2038703d4e9d0ad59"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.144 +<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>
 201.145 +<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>
 201.146 +<tr class="separator:accbfd2b459a028d7af9fb7df6f977d80"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.147 +<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>
 201.148 +<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>
 201.149 +<tr class="separator:a8d098baada4ea9ad5d8b6343b5aec007"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.150 +<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>
 201.151 +<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>
 201.152 +<tr class="separator:a7d73b66256384b26927e787318fdefa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.153 +<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>
 201.154 +<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>
 201.155 +<tr class="separator:ac6a5246f26be2e8a5f34d8995b7ec14e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.156 +<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>
 201.157 +<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>
 201.158 +<tr class="separator:acd3dc64e90db9b4046e14f115a815ff4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.159 +<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>
 201.160 +<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>
 201.161 +<tr class="separator:a57eabd4862d531dd685bbf2feb8468bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.162 +<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>
 201.163 +<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>
 201.164 +<tr class="separator:a89343ea3e719f00ee802b557db57b769"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.165 +<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>
 201.166 +<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>
 201.167 +<tr class="separator:a4bb4742fe71115f493991d307cb22b23"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.168 +<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>
 201.169 +<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>
 201.170 +<tr class="separator:a084fe5a3a90d6fb6b15ecda03bb30824"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.171 +<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>
 201.172 +<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>
 201.173 +<tr class="separator:a5f0dd83c0176b812fb428004b2877a34"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.174 +</table><table class="memberdecls">
 201.175 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
 201.176 +Functions</h2></td></tr>
 201.177 +<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>
 201.178 +<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>
 201.179 +<tr class="separator:a69d5e3eeec783cc43314df71248768f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.180 +<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>
 201.181 +<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>
 201.182 +<tr class="separator:a9ce5ad1b2aa2dbeba204d452c2e64359"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.183 +<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>
 201.184 +<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>
 201.185 +<tr class="separator:aedeb5d7bddda54116101a8d68af8c56d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.186 +<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>
 201.187 +<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>
 201.188 +<tr class="separator:a539eb7059251a051ee5d179526a23e9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.189 +<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>
 201.190 +<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>
 201.191 +<tr class="separator:a2744c38ac44abf3e01fa059056dcf36c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.192 +<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>
 201.193 +<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>
 201.194 +<tr class="separator:a2b1d6f1eca1c1549f37107b9c026c5a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.195 +<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>
 201.196 +<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>
 201.197 +<tr class="separator:ae594f6e222ea394cef6a26c0dfad000d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.198 +<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>
 201.199 +<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>
 201.200 +<tr class="separator:ac1b000030d6d197eec48c15a182055d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.201 +<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>
 201.202 +<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>
 201.203 +<tr class="separator:a7376842c19e954b49215da81ef76ac0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.204 +<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>
 201.205 +<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>
 201.206 +<tr class="separator:abacce4cbd6f70fcb6453904ef08b02e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.207 +<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>
 201.208 +<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>
 201.209 +<tr class="separator:a5eb9e0e1f26cf7fbecc038cd90e8b258"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.210 +<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>
 201.211 +<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>
 201.212 +<tr class="separator:a78925c91af54f23cebd20ff99ef4331a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.213 +<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>
 201.214 +<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>
 201.215 +<tr class="separator:a9a6c8d8db0dda0037c3c852cce1a5060"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.216 +<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>
 201.217 +<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>
 201.218 +<tr class="separator:ad50f0f67b906fad0744f46bcb51e144b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.219 +<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>
 201.220 +<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>
 201.221 +<tr class="separator:af80898a0b75955eb2579298c3ae2c481"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.222 +<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>
 201.223 +<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>
 201.224 +<tr class="separator:adae3f59957ca328e1da5285cb8b02a72"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.225 +<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>
 201.226 +<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>
 201.227 +<tr class="separator:a5836d6a7a744791c35e5c17bdc394a87"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.228 +<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>
 201.229 +<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>
 201.230 +<tr class="separator:ae389835b97cd9382e7d6a6a075323376"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.231 +<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>
 201.232 +<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>
 201.233 +<tr class="separator:aa4362cb36c6629f9d8484739fd827748"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.234 +<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>
 201.235 +<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>
 201.236 +<tr class="separator:a54f256c3abe811c52d58b4ff1b23f051"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.237 +<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>
 201.238 +<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>
 201.239 +<tr class="separator:ae71cac352b00230848bde358f0fb05ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.240 +<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>
 201.241 +<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>
 201.242 +<tr class="separator:a52906455ae530c9cdc6812c8e6d9bdef"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.243 +<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>
 201.244 +<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>
 201.245 +<tr class="separator:af35272a8e5408c88ed3e25a3a98f0a82"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.246 +<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>
 201.247 +<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>
 201.248 +<tr class="separator:aca8142fb823d253054e17c17cfca05e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.249 +<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>
 201.250 +<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>
 201.251 +<tr class="separator:a97dccce03af419596dbdd592ca46a164"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.252 +<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>
 201.253 +<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>
 201.254 +<tr class="separator:a8fe58921f51eb1fde038472377e63014"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.255 +<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>
 201.256 +<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>
 201.257 +<tr class="separator:ae2d6da564d3fce51f2e0cac580fdbc56"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.258 +<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>
 201.259 +<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>
 201.260 +<tr class="separator:ad374b16eb1be8b48019debad9b9f268c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.261 +<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>
 201.262 +<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>
 201.263 +<tr class="separator:a599ddc2f88dd1df68b72eefd91347393"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.264 +<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>
 201.265 +<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>
 201.266 +<tr class="separator:a1f0ae316a2afe85d5b4655e6ece6721a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.267 +<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>
 201.268 +<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>
 201.269 +<tr class="separator:a3718ef4aa1e86cdb26bda2f07fb585df"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.270 +<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>
 201.271 +<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>
 201.272 +<tr class="separator:a6edb4b85f2b9efe79db7ffe6eccd7bc3"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.273 +<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>
 201.274 +<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>
 201.275 +<tr class="separator:abccf198bea3186ff2abb080cc88dcae6"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.276 +<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>
 201.277 +<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>
 201.278 +<tr class="separator:a3cf1e557df7ab58d03c78832c4060276"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.279 +<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>
 201.280 +<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>
 201.281 +<tr class="separator:af3dd09ec9d11162fe0075f4e60f41240"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.282 +<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>
 201.283 +<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>
 201.284 +<tr class="separator:aea94613eb74668cc05d365803d32bfad"><td class="memSeparator" colspan="2">&#160;</td></tr>
 201.285 +</table>
 201.286 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 201.287 +<div class="textblock"><p>Bounded string implementation. </p>
 201.288 +<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>
 201.289 +<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>
 201.290 +<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>
 201.291 +<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
 201.292 +<dd>
 201.293 +Olaf Wintermann </dd></dl>
 201.294 +</div><h2 class="groupheader">Macro Definition Documentation</h2>
 201.295 +<a id="a7d5bc48708405a28b23667e32dfcecae"></a>
 201.296 +<h2 class="memtitle"><span class="permalink"><a href="#a7d5bc48708405a28b23667e32dfcecae">&#9670;&nbsp;</a></span>PRIsstr</h2>
 201.297 +
 201.298 +<div class="memitem">
 201.299 +<div class="memproto">
 201.300 +      <table class="memname">
 201.301 +        <tr>
 201.302 +          <td class="memname">#define PRIsstr&#160;&#160;&#160;&quot;.*s&quot;</td>
 201.303 +        </tr>
 201.304 +      </table>
 201.305 +</div><div class="memdoc">
 201.306 +
 201.307 +<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>
 201.308 +
 201.309 +</div>
 201.310 +</div>
 201.311 +<a id="a8fa17c8cf4c36df48f4108c36da8573e"></a>
 201.312 +<h2 class="memtitle"><span class="permalink"><a href="#a8fa17c8cf4c36df48f4108c36da8573e">&#9670;&nbsp;</a></span>S</h2>
 201.313 +
 201.314 +<div class="memitem">
 201.315 +<div class="memproto">
 201.316 +      <table class="memname">
 201.317 +        <tr>
 201.318 +          <td class="memname">#define S</td>
 201.319 +          <td>(</td>
 201.320 +          <td class="paramtype">&#160;</td>
 201.321 +          <td class="paramname">s</td><td>)</td>
 201.322 +          <td>&#160;&#160;&#160;<a class="el" href="string_8h.html#a2744c38ac44abf3e01fa059056dcf36c">sstrn</a>(s, sizeof(s)-1)</td>
 201.323 +        </tr>
 201.324 +      </table>
 201.325 +</div><div class="memdoc">
 201.326 +
 201.327 +<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>
 201.328 +
 201.329 +</div>
 201.330 +</div>
 201.331 +<a id="a7d261dd0bc358c957a368bc058c1ce53"></a>
 201.332 +<h2 class="memtitle"><span class="permalink"><a href="#a7d261dd0bc358c957a368bc058c1ce53">&#9670;&nbsp;</a></span>SC</h2>
 201.333 +
 201.334 +<div class="memitem">
 201.335 +<div class="memproto">
 201.336 +      <table class="memname">
 201.337 +        <tr>
 201.338 +          <td class="memname">#define SC</td>
 201.339 +          <td>(</td>
 201.340 +          <td class="paramtype">&#160;</td>
 201.341 +          <td class="paramname">s</td><td>)</td>
 201.342 +          <td>&#160;&#160;&#160;<a class="el" href="string_8h.html#ae594f6e222ea394cef6a26c0dfad000d">scstrn</a>(s, sizeof(s)-1)</td>
 201.343 +        </tr>
 201.344 +      </table>
 201.345 +</div><div class="memdoc">
 201.346 +
 201.347 +<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>
 201.348 +
 201.349 +</div>
 201.350 +</div>
 201.351 +<a id="ad4293350a9b39a23a6546bd0fef2aeed"></a>
 201.352 +<h2 class="memtitle"><span class="permalink"><a href="#ad4293350a9b39a23a6546bd0fef2aeed">&#9670;&nbsp;</a></span>SCSTR</h2>
 201.353 +
 201.354 +<div class="memitem">
 201.355 +<div class="memproto">
 201.356 +      <table class="memname">
 201.357 +        <tr>
 201.358 +          <td class="memname">#define SCSTR</td>
 201.359 +          <td>(</td>
 201.360 +          <td class="paramtype">&#160;</td>
 201.361 +          <td class="paramname">str</td><td>)</td>
 201.362 +          <td>&#160;&#160;&#160;<a class="el" href="string_8h.html#aedeb5d7bddda54116101a8d68af8c56d">ucx_ss2c_s</a>(str)</td>
 201.363 +        </tr>
 201.364 +      </table>
 201.365 +</div><div class="memdoc">
 201.366 +
 201.367 +<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>
 201.368 +<dl class="params"><dt>Parameters</dt><dd>
 201.369 +  <table class="params">
 201.370 +    <tr><td class="paramname">str</td><td>some UCX string </td></tr>
 201.371 +  </table>
 201.372 +  </dd>
 201.373 +</dl>
 201.374 +<dl class="section return"><dt>Returns</dt><dd>the an immutable version of the provided string </dd></dl>
 201.375 +
 201.376 +</div>
 201.377 +</div>
 201.378 +<a id="a23ed51e87385886bb65e8cd19c839362"></a>
 201.379 +<h2 class="memtitle"><span class="permalink"><a href="#a23ed51e87385886bb65e8cd19c839362">&#9670;&nbsp;</a></span>SFMT</h2>
 201.380 +
 201.381 +<div class="memitem">
 201.382 +<div class="memproto">
 201.383 +      <table class="memname">
 201.384 +        <tr>
 201.385 +          <td class="memname">#define SFMT</td>
 201.386 +          <td>(</td>
 201.387 +          <td class="paramtype">&#160;</td>
 201.388 +          <td class="paramname">s</td><td>)</td>
 201.389 +          <td>&#160;&#160;&#160;(int) (s).length, (s).ptr</td>
 201.390 +        </tr>
 201.391 +      </table>
 201.392 +</div><div class="memdoc">
 201.393 +
 201.394 +<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>
 201.395 +
 201.396 +</div>
 201.397 +</div>
 201.398 +<a id="a81b0f6df794152c2038703d4e9d0ad59"></a>
 201.399 +<h2 class="memtitle"><span class="permalink"><a href="#a81b0f6df794152c2038703d4e9d0ad59">&#9670;&nbsp;</a></span>sstrcasecmp</h2>
 201.400 +
 201.401 +<div class="memitem">
 201.402 +<div class="memproto">
 201.403 +      <table class="memname">
 201.404 +        <tr>
 201.405 +          <td class="memname">#define sstrcasecmp</td>
 201.406 +          <td>(</td>
 201.407 +          <td class="paramtype">&#160;</td>
 201.408 +          <td class="paramname">s1, </td>
 201.409 +        </tr>
 201.410 +        <tr>
 201.411 +          <td class="paramkey"></td>
 201.412 +          <td></td>
 201.413 +          <td class="paramtype">&#160;</td>
 201.414 +          <td class="paramname">s2&#160;</td>
 201.415 +        </tr>
 201.416 +        <tr>
 201.417 +          <td></td>
 201.418 +          <td>)</td>
 201.419 +          <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>
 201.420 +        </tr>
 201.421 +      </table>
 201.422 +</div><div class="memdoc">
 201.423 +
 201.424 +<p>Compares two UCX strings ignoring the case. </p>
 201.425 +<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>
 201.426 +<dl class="params"><dt>Parameters</dt><dd>
 201.427 +  <table class="params">
 201.428 +    <tr><td class="paramname">s1</td><td>the first string </td></tr>
 201.429 +    <tr><td class="paramname">s2</td><td>the second string </td></tr>
 201.430 +  </table>
 201.431 +  </dd>
 201.432 +</dl>
 201.433 +<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>
 201.434 +
 201.435 +</div>
 201.436 +</div>
 201.437 +<a id="acd3dc64e90db9b4046e14f115a815ff4"></a>
 201.438 +<h2 class="memtitle"><span class="permalink"><a href="#acd3dc64e90db9b4046e14f115a815ff4">&#9670;&nbsp;</a></span>sstrcaseprefix</h2>
 201.439 +
 201.440 +<div class="memitem">
 201.441 +<div class="memproto">
 201.442 +      <table class="memname">
 201.443 +        <tr>
 201.444 +          <td class="memname">#define sstrcaseprefix</td>
 201.445 +          <td>(</td>
 201.446 +          <td class="paramtype">&#160;</td>
 201.447 +          <td class="paramname">string, </td>
 201.448 +        </tr>
 201.449 +        <tr>
 201.450 +          <td class="paramkey"></td>
 201.451 +          <td></td>
 201.452 +          <td class="paramtype">&#160;</td>
 201.453 +          <td class="paramname">prefix&#160;</td>
 201.454 +        </tr>
 201.455 +        <tr>
 201.456 +          <td></td>
 201.457 +          <td>)</td>
 201.458 +          <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>
 201.459 +        </tr>
 201.460 +      </table>
 201.461 +</div><div class="memdoc">
 201.462 +
 201.463 +<p>Checks, if a string has a specific prefix, ignoring the case. </p>
 201.464 +<dl class="params"><dt>Parameters</dt><dd>
 201.465 +  <table class="params">
 201.466 +    <tr><td class="paramname">string</td><td>the string to check </td></tr>
 201.467 +    <tr><td class="paramname">prefix</td><td>the prefix the string should have </td></tr>
 201.468 +  </table>
 201.469 +  </dd>
 201.470 +</dl>
 201.471 +<dl class="section return"><dt>Returns</dt><dd>1, if and only if the string has the specified prefix, 0 otherwise </dd></dl>
 201.472 +
 201.473 +</div>
 201.474 +</div>
 201.475 +<a id="a57eabd4862d531dd685bbf2feb8468bf"></a>
 201.476 +<h2 class="memtitle"><span class="permalink"><a href="#a57eabd4862d531dd685bbf2feb8468bf">&#9670;&nbsp;</a></span>sstrcasesuffix</h2>
 201.477 +
 201.478 +<div class="memitem">
 201.479 +<div class="memproto">
 201.480 +      <table class="memname">
 201.481 +        <tr>
 201.482 +          <td class="memname">#define sstrcasesuffix</td>
 201.483 +          <td>(</td>
 201.484 +          <td class="paramtype">&#160;</td>
 201.485 +          <td class="paramname">string, </td>
 201.486 +        </tr>
 201.487 +        <tr>
 201.488 +          <td class="paramkey"></td>
 201.489 +          <td></td>
 201.490 +          <td class="paramtype">&#160;</td>
 201.491 +          <td class="paramname">suffix&#160;</td>
 201.492 +        </tr>
 201.493 +        <tr>
 201.494 +          <td></td>
 201.495 +          <td>)</td>
 201.496 +          <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>
 201.497 +        </tr>
 201.498 +      </table>
 201.499 +</div><div class="memdoc">
 201.500 +
 201.501 +<p>Checks, if a string has a specific suffix, ignoring the case. </p>
 201.502 +<dl class="params"><dt>Parameters</dt><dd>
 201.503 +  <table class="params">
 201.504 +    <tr><td class="paramname">string</td><td>the string to check </td></tr>
 201.505 +    <tr><td class="paramname">suffix</td><td>the suffix the string should have </td></tr>
 201.506 +  </table>
 201.507 +  </dd>
 201.508 +</dl>
 201.509 +<dl class="section return"><dt>Returns</dt><dd>1, if and only if the string has the specified suffix, 0 otherwise </dd></dl>
 201.510 +
 201.511 +</div>
 201.512 +</div>
 201.513 +<a id="a6af8a4c347c7fdb5980d4c4803be2759"></a>
 201.514 +<h2 class="memtitle"><span class="permalink"><a href="#a6af8a4c347c7fdb5980d4c4803be2759">&#9670;&nbsp;</a></span>sstrcat</h2>
 201.515 +
 201.516 +<div class="memitem">
 201.517 +<div class="memproto">
 201.518 +      <table class="memname">
 201.519 +        <tr>
 201.520 +          <td class="memname">#define sstrcat</td>
 201.521 +          <td>(</td>
 201.522 +          <td class="paramtype">&#160;</td>
 201.523 +          <td class="paramname">count, </td>
 201.524 +        </tr>
 201.525 +        <tr>
 201.526 +          <td class="paramkey"></td>
 201.527 +          <td></td>
 201.528 +          <td class="paramtype">&#160;</td>
 201.529 +          <td class="paramname">s1, </td>
 201.530 +        </tr>
 201.531 +        <tr>
 201.532 +          <td class="paramkey"></td>
 201.533 +          <td></td>
 201.534 +          <td class="paramtype">&#160;</td>
 201.535 +          <td class="paramname"><em>...</em>&#160;</td>
 201.536 +        </tr>
 201.537 +        <tr>
 201.538 +          <td></td>
 201.539 +          <td>)</td>
 201.540 +          <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>
 201.541 +        </tr>
 201.542 +      </table>
 201.543 +</div><div class="memdoc">
 201.544 +
 201.545 +<p>Concatenates two or more strings. </p>
 201.546 +<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>
 201.547 +<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>
 201.548 +<dl class="params"><dt>Parameters</dt><dd>
 201.549 +  <table class="params">
 201.550 +    <tr><td class="paramname">count</td><td>the total number of strings to concatenate </td></tr>
 201.551 +    <tr><td class="paramname">s1</td><td>first string </td></tr>
 201.552 +    <tr><td class="paramname">...</td><td>all remaining strings </td></tr>
 201.553 +  </table>
 201.554 +  </dd>
 201.555 +</dl>
 201.556 +<dl class="section return"><dt>Returns</dt><dd>the concatenated string </dd></dl>
 201.557 +
 201.558 +</div>
 201.559 +</div>
 201.560 +<a id="a6068d460f9bc05962666a917d26568b3"></a>
 201.561 +<h2 class="memtitle"><span class="permalink"><a href="#a6068d460f9bc05962666a917d26568b3">&#9670;&nbsp;</a></span>sstrcat_a</h2>
 201.562 +
 201.563 +<div class="memitem">
 201.564 +<div class="memproto">
 201.565 +      <table class="memname">
 201.566 +        <tr>
 201.567 +          <td class="memname">#define sstrcat_a</td>
 201.568 +          <td>(</td>
 201.569 +          <td class="paramtype">&#160;</td>
 201.570 +          <td class="paramname">alloc, </td>
 201.571 +        </tr>
 201.572 +        <tr>
 201.573 +          <td class="paramkey"></td>
 201.574 +          <td></td>
 201.575 +          <td class="paramtype">&#160;</td>
 201.576 +          <td class="paramname">count, </td>
 201.577 +        </tr>
 201.578 +        <tr>
 201.579 +          <td class="paramkey"></td>
 201.580 +          <td></td>
 201.581 +          <td class="paramtype">&#160;</td>
 201.582 +          <td class="paramname">s1, </td>
 201.583 +        </tr>
 201.584 +        <tr>
 201.585 +          <td class="paramkey"></td>
 201.586 +          <td></td>
 201.587 +          <td class="paramtype">&#160;</td>
 201.588 +          <td class="paramname"><em>...</em>&#160;</td>
 201.589 +        </tr>
 201.590 +        <tr>
 201.591 +          <td></td>
 201.592 +          <td>)</td>
 201.593 +          <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>
 201.594 +        </tr>
 201.595 +      </table>
 201.596 +</div><div class="memdoc">
 201.597 +
 201.598 +<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>
 201.599 +<p>The resulting string must be freed by the allocators <code>free()</code> implementation.</p>
 201.600 +<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>
 201.601 +<dl class="params"><dt>Parameters</dt><dd>
 201.602 +  <table class="params">
 201.603 +    <tr><td class="paramname">alloc</td><td>the allocator to use </td></tr>
 201.604 +    <tr><td class="paramname">count</td><td>the total number of strings to concatenate </td></tr>
 201.605 +    <tr><td class="paramname">s1</td><td>first string </td></tr>
 201.606 +    <tr><td class="paramname">...</td><td>all remaining strings </td></tr>
 201.607 +  </table>
 201.608 +  </dd>
 201.609 +</dl>
 201.610 +<dl class="section return"><dt>Returns</dt><dd>the concatenated string</dd></dl>
 201.611 +<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>
 201.612 +
 201.613 +</div>
 201.614 +</div>
 201.615 +<a id="a7ae7156c8de57454ca38d306100b8160"></a>
 201.616 +<h2 class="memtitle"><span class="permalink"><a href="#a7ae7156c8de57454ca38d306100b8160">&#9670;&nbsp;</a></span>sstrcmp</h2>
 201.617 +
 201.618 +<div class="memitem">
 201.619 +<div class="memproto">
 201.620 +      <table class="memname">
 201.621 +        <tr>
 201.622 +          <td class="memname">#define sstrcmp</td>
 201.623 +          <td>(</td>
 201.624 +          <td class="paramtype">&#160;</td>
 201.625 +          <td class="paramname">s1, </td>
 201.626 +        </tr>
 201.627 +        <tr>
 201.628 +          <td class="paramkey"></td>
 201.629 +          <td></td>
 201.630 +          <td class="paramtype">&#160;</td>
 201.631 +          <td class="paramname">s2&#160;</td>
 201.632 +        </tr>
 201.633 +        <tr>
 201.634 +          <td></td>
 201.635 +          <td>)</td>
 201.636 +          <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>
 201.637 +        </tr>
 201.638 +      </table>
 201.639 +</div><div class="memdoc">
 201.640 +
 201.641 +<p>Compares two UCX strings with standard <code>memcmp()</code>. </p>
 201.642 +<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>
 201.643 +<dl class="params"><dt>Parameters</dt><dd>
 201.644 +  <table class="params">
 201.645 +    <tr><td class="paramname">s1</td><td>the first string </td></tr>
 201.646 +    <tr><td class="paramname">s2</td><td>the second string </td></tr>
 201.647 +  </table>
 201.648 +  </dd>
 201.649 +</dl>
 201.650 +<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>
 201.651 +
 201.652 +</div>
 201.653 +</div>
 201.654 +<a id="accbfd2b459a028d7af9fb7df6f977d80"></a>
 201.655 +<h2 class="memtitle"><span class="permalink"><a href="#accbfd2b459a028d7af9fb7df6f977d80">&#9670;&nbsp;</a></span>sstrdup</h2>
 201.656 +
 201.657 +<div class="memitem">
 201.658 +<div class="memproto">
 201.659 +      <table class="memname">
 201.660 +        <tr>
 201.661 +          <td class="memname">#define sstrdup</td>
 201.662 +          <td>(</td>
 201.663 +          <td class="paramtype">&#160;</td>
 201.664 +          <td class="paramname">string</td><td>)</td>
 201.665 +          <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>
 201.666 +        </tr>
 201.667 +      </table>
 201.668 +</div><div class="memdoc">
 201.669 +
 201.670 +<p>Creates a duplicate of the specified string. </p>
 201.671 +<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>
 201.672 +<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>
 201.673 +<dl class="params"><dt>Parameters</dt><dd>
 201.674 +  <table class="params">
 201.675 +    <tr><td class="paramname">string</td><td>the string to duplicate </td></tr>
 201.676 +  </table>
 201.677 +  </dd>
 201.678 +</dl>
 201.679 +<dl class="section return"><dt>Returns</dt><dd>a duplicate of the string </dd></dl>
 201.680 +<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>
 201.681 +
 201.682 +</div>
 201.683 +</div>
 201.684 +<a id="a8d098baada4ea9ad5d8b6343b5aec007"></a>
 201.685 +<h2 class="memtitle"><span class="permalink"><a href="#a8d098baada4ea9ad5d8b6343b5aec007">&#9670;&nbsp;</a></span>sstrdup_a</h2>
 201.686 +
 201.687 +<div class="memitem">
 201.688 +<div class="memproto">
 201.689 +      <table class="memname">
 201.690 +        <tr>
 201.691 +          <td class="memname">#define sstrdup_a</td>
 201.692 +          <td>(</td>
 201.693 +          <td class="paramtype">&#160;</td>
 201.694 +          <td class="paramname">allocator, </td>
 201.695 +        </tr>
 201.696 +        <tr>
 201.697 +          <td class="paramkey"></td>
 201.698 +          <td></td>
 201.699 +          <td class="paramtype">&#160;</td>
 201.700 +          <td class="paramname">string&#160;</td>
 201.701 +        </tr>
 201.702 +        <tr>
 201.703 +          <td></td>
 201.704 +          <td>)</td>
 201.705 +          <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>
 201.706 +        </tr>
 201.707 +      </table>
 201.708 +</div><div class="memdoc">
 201.709 +
 201.710 +<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>
 201.711 +<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>
 201.712 +<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>
 201.713 +<dl class="params"><dt>Parameters</dt><dd>
 201.714 +  <table class="params">
 201.715 +    <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>
 201.716 +    <tr><td class="paramname">string</td><td>the string to duplicate </td></tr>
 201.717 +  </table>
 201.718 +  </dd>
 201.719 +</dl>
 201.720 +<dl class="section return"><dt>Returns</dt><dd>a duplicate of the string </dd></dl>
 201.721 +<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>
 201.722 +
 201.723 +</div>
 201.724 +</div>
 201.725 +<a id="a89343ea3e719f00ee802b557db57b769"></a>
 201.726 +<h2 class="memtitle"><span class="permalink"><a href="#a89343ea3e719f00ee802b557db57b769">&#9670;&nbsp;</a></span>sstrlower</h2>
 201.727 +
 201.728 +<div class="memitem">
 201.729 +<div class="memproto">
 201.730 +      <table class="memname">
 201.731 +        <tr>
 201.732 +          <td class="memname">#define sstrlower</td>
 201.733 +          <td>(</td>
 201.734 +          <td class="paramtype">&#160;</td>
 201.735 +          <td class="paramname">string</td><td>)</td>
 201.736 +          <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>
 201.737 +        </tr>
 201.738 +      </table>
 201.739 +</div><div class="memdoc">
 201.740 +
 201.741 +<p>Returns a lower case version of a string. </p>
 201.742 +<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>
 201.743 +<dl class="params"><dt>Parameters</dt><dd>
 201.744 +  <table class="params">
 201.745 +    <tr><td class="paramname">string</td><td>the input string </td></tr>
 201.746 +  </table>
 201.747 +  </dd>
 201.748 +</dl>
 201.749 +<dl class="section return"><dt>Returns</dt><dd>the resulting lower case string </dd></dl>
 201.750 +
 201.751 +</div>
 201.752 +</div>
 201.753 +<a id="a4bb4742fe71115f493991d307cb22b23"></a>
 201.754 +<h2 class="memtitle"><span class="permalink"><a href="#a4bb4742fe71115f493991d307cb22b23">&#9670;&nbsp;</a></span>sstrlower_a</h2>
 201.755 +
 201.756 +<div class="memitem">
 201.757 +<div class="memproto">
 201.758 +      <table class="memname">
 201.759 +        <tr>
 201.760 +          <td class="memname">#define sstrlower_a</td>
 201.761 +          <td>(</td>
 201.762 +          <td class="paramtype">&#160;</td>
 201.763 +          <td class="paramname">allocator, </td>
 201.764 +        </tr>
 201.765 +        <tr>
 201.766 +          <td class="paramkey"></td>
 201.767 +          <td></td>
 201.768 +          <td class="paramtype">&#160;</td>
 201.769 +          <td class="paramname">string&#160;</td>
 201.770 +        </tr>
 201.771 +        <tr>
 201.772 +          <td></td>
 201.773 +          <td>)</td>
 201.774 +          <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>
 201.775 +        </tr>
 201.776 +      </table>
 201.777 +</div><div class="memdoc">
 201.778 +
 201.779 +<p>Returns a lower case version of a string. </p>
 201.780 +<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>
 201.781 +<dl class="params"><dt>Parameters</dt><dd>
 201.782 +  <table class="params">
 201.783 +    <tr><td class="paramname">allocator</td><td>the allocator used for duplicating the string </td></tr>
 201.784 +    <tr><td class="paramname">string</td><td>the input string </td></tr>
 201.785 +  </table>
 201.786 +  </dd>
 201.787 +</dl>
 201.788 +<dl class="section return"><dt>Returns</dt><dd>the resulting lower case string </dd></dl>
 201.789 +
 201.790 +</div>
 201.791 +</div>
 201.792 +<a id="a33fa945acc5ac2ce962e5ef13cf1638c"></a>
 201.793 +<h2 class="memtitle"><span class="permalink"><a href="#a33fa945acc5ac2ce962e5ef13cf1638c">&#9670;&nbsp;</a></span>sstrnlen</h2>
 201.794 +
 201.795 +<div class="memitem">
 201.796 +<div class="memproto">
 201.797 +      <table class="memname">
 201.798 +        <tr>
 201.799 +          <td class="memname">#define sstrnlen</td>
 201.800 +          <td>(</td>
 201.801 +          <td class="paramtype">&#160;</td>
 201.802 +          <td class="paramname">count, </td>
 201.803 +        </tr>
 201.804 +        <tr>
 201.805 +          <td class="paramkey"></td>
 201.806 +          <td></td>
 201.807 +          <td class="paramtype">&#160;</td>
 201.808 +          <td class="paramname"><em>...</em>&#160;</td>
 201.809 +        </tr>
 201.810 +        <tr>
 201.811 +          <td></td>
 201.812 +          <td>)</td>
 201.813 +          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#ac1b000030d6d197eec48c15a182055d5">scstrnlen</a>(count, __VA_ARGS__)</td>
 201.814 +        </tr>
 201.815 +      </table>
 201.816 +</div><div class="memdoc">
 201.817 +
 201.818 +<p>Returns the accumulated length of all specified strings. </p>
 201.819 +<p><b>Attention:</b> if the count argument is larger than the count of the specified strings, the behavior is undefined.</p>
 201.820 +<dl class="params"><dt>Parameters</dt><dd>
 201.821 +  <table class="params">
 201.822 +    <tr><td class="paramname">count</td><td>the total number of specified strings </td></tr>
 201.823 +    <tr><td class="paramname">...</td><td>all strings </td></tr>
 201.824 +  </table>
 201.825 +  </dd>
 201.826 +</dl>
 201.827 +<dl class="section return"><dt>Returns</dt><dd>the cumulated length of all strings </dd></dl>
 201.828 +
 201.829 +</div>
 201.830 +</div>
 201.831 +<a id="a7d73b66256384b26927e787318fdefa2"></a>
 201.832 +<h2 class="memtitle"><span class="permalink"><a href="#a7d73b66256384b26927e787318fdefa2">&#9670;&nbsp;</a></span>sstrprefix</h2>
 201.833 +
 201.834 +<div class="memitem">
 201.835 +<div class="memproto">
 201.836 +      <table class="memname">
 201.837 +        <tr>
 201.838 +          <td class="memname">#define sstrprefix</td>
 201.839 +          <td>(</td>
 201.840 +          <td class="paramtype">&#160;</td>
 201.841 +          <td class="paramname">string, </td>
 201.842 +        </tr>
 201.843 +        <tr>
 201.844 +          <td class="paramkey"></td>
 201.845 +          <td></td>
 201.846 +          <td class="paramtype">&#160;</td>
 201.847 +          <td class="paramname">prefix&#160;</td>
 201.848 +        </tr>
 201.849 +        <tr>
 201.850 +          <td></td>
 201.851 +          <td>)</td>
 201.852 +          <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>
 201.853 +        </tr>
 201.854 +      </table>
 201.855 +</div><div class="memdoc">
 201.856 +
 201.857 +<p>Checks, if a string has a specific prefix. </p>
 201.858 +<dl class="params"><dt>Parameters</dt><dd>
 201.859 +  <table class="params">
 201.860 +    <tr><td class="paramname">string</td><td>the string to check </td></tr>
 201.861 +    <tr><td class="paramname">prefix</td><td>the prefix the string should have </td></tr>
 201.862 +  </table>
 201.863 +  </dd>
 201.864 +</dl>
 201.865 +<dl class="section return"><dt>Returns</dt><dd>1, if and only if the string has the specified prefix, 0 otherwise </dd></dl>
 201.866 +
 201.867 +</div>
 201.868 +</div>
 201.869 +<a id="aa696932213265e10f864678686f4ccde"></a>
 201.870 +<h2 class="memtitle"><span class="permalink"><a href="#aa696932213265e10f864678686f4ccde">&#9670;&nbsp;</a></span>sstrscstr</h2>
 201.871 +
 201.872 +<div class="memitem">
 201.873 +<div class="memproto">
 201.874 +      <table class="memname">
 201.875 +        <tr>
 201.876 +          <td class="memname">#define sstrscstr</td>
 201.877 +          <td>(</td>
 201.878 +          <td class="paramtype">&#160;</td>
 201.879 +          <td class="paramname">string, </td>
 201.880 +        </tr>
 201.881 +        <tr>
 201.882 +          <td class="paramkey"></td>
 201.883 +          <td></td>
 201.884 +          <td class="paramtype">&#160;</td>
 201.885 +          <td class="paramname">match&#160;</td>
 201.886 +        </tr>
 201.887 +        <tr>
 201.888 +          <td></td>
 201.889 +          <td>)</td>
 201.890 +          <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>
 201.891 +        </tr>
 201.892 +      </table>
 201.893 +</div><div class="memdoc">
 201.894 +
 201.895 +<p>Returns an immutable substring starting at the location of the first occurrence of the specified immutable string. </p>
 201.896 +<p>If the string does not contain the other string, an empty string is returned.</p>
 201.897 +<p>If <code>match</code> is an empty string, the complete <code>string</code> is returned.</p>
 201.898 +<dl class="params"><dt>Parameters</dt><dd>
 201.899 +  <table class="params">
 201.900 +    <tr><td class="paramname">string</td><td>the string to be scanned </td></tr>
 201.901 +    <tr><td class="paramname">match</td><td>string containing the sequence of characters to match </td></tr>
 201.902 +  </table>
 201.903 +  </dd>
 201.904 +</dl>
 201.905 +<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>
 201.906 +
 201.907 +</div>
 201.908 +</div>
 201.909 +<a id="aa929984004c3576bfafb95031aca8eb7"></a>
 201.910 +<h2 class="memtitle"><span class="permalink"><a href="#aa929984004c3576bfafb95031aca8eb7">&#9670;&nbsp;</a></span>sstrsplit</h2>
 201.911 +
 201.912 +<div class="memitem">
 201.913 +<div class="memproto">
 201.914 +      <table class="memname">
 201.915 +        <tr>
 201.916 +          <td class="memname">#define sstrsplit</td>
 201.917 +          <td>(</td>
 201.918 +          <td class="paramtype">&#160;</td>
 201.919 +          <td class="paramname">string, </td>
 201.920 +        </tr>
 201.921 +        <tr>
 201.922 +          <td class="paramkey"></td>
 201.923 +          <td></td>
 201.924 +          <td class="paramtype">&#160;</td>
 201.925 +          <td class="paramname">delim, </td>
 201.926 +        </tr>
 201.927 +        <tr>
 201.928 +          <td class="paramkey"></td>
 201.929 +          <td></td>
 201.930 +          <td class="paramtype">&#160;</td>
 201.931 +          <td class="paramname">count&#160;</td>
 201.932 +        </tr>
 201.933 +        <tr>
 201.934 +          <td></td>
 201.935 +          <td>)</td>
 201.936 +          <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>
 201.937 +        </tr>
 201.938 +      </table>
 201.939 +</div><div class="memdoc">
 201.940 +
 201.941 +<p>Splits a string into parts by using a delimiter string. </p>
 201.942 +<p>This function will return <code>NULL</code>, if one of the following happens: </p><ul>
 201.943 +<li>
 201.944 +the string length is zero </li>
 201.945 +<li>
 201.946 +the delimeter length is zero </li>
 201.947 +<li>
 201.948 +the string equals the delimeter </li>
 201.949 +<li>
 201.950 +memory allocation fails </li>
 201.951 +</ul>
 201.952 +<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>
 201.953 +<p>The integer referenced by <code>count</code> is also used as output and is set to </p><ul>
 201.954 +<li>
 201.955 +-2, on memory allocation errors </li>
 201.956 +<li>
 201.957 +-1, if either the string or the delimiter is an empty string </li>
 201.958 +<li>
 201.959 +0, if the string equals the delimiter </li>
 201.960 +<li>
 201.961 +1, if the string does not contain the delimiter </li>
 201.962 +<li>
 201.963 +the count of array items, otherwise </li>
 201.964 +</ul>
 201.965 +<p>If the string starts with the delimiter, the first item of the resulting array will be an empty string.</p>
 201.966 +<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>
 201.967 +<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>
 201.968 +<dl class="params"><dt>Parameters</dt><dd>
 201.969 +  <table class="params">
 201.970 +    <tr><td class="paramname">string</td><td>the string to split </td></tr>
 201.971 +    <tr><td class="paramname">delim</td><td>the delimiter string </td></tr>
 201.972 +    <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>
 201.973 +  </table>
 201.974 +  </dd>
 201.975 +</dl>
 201.976 +<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>
 201.977 +<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>
 201.978 +
 201.979 +</div>
 201.980 +</div>
 201.981 +<a id="ac9f69fa3a17e26a3a5f9d985b5844601"></a>
 201.982 +<h2 class="memtitle"><span class="permalink"><a href="#ac9f69fa3a17e26a3a5f9d985b5844601">&#9670;&nbsp;</a></span>sstrsplit_a</h2>
 201.983 +
 201.984 +<div class="memitem">
 201.985 +<div class="memproto">
 201.986 +      <table class="memname">
 201.987 +        <tr>
 201.988 +          <td class="memname">#define sstrsplit_a</td>
 201.989 +          <td>(</td>
 201.990 +          <td class="paramtype">&#160;</td>
 201.991 +          <td class="paramname">allocator, </td>
 201.992 +        </tr>
 201.993 +        <tr>
 201.994 +          <td class="paramkey"></td>
 201.995 +          <td></td>
 201.996 +          <td class="paramtype">&#160;</td>
 201.997 +          <td class="paramname">string, </td>
 201.998 +        </tr>
 201.999 +        <tr>
201.1000 +          <td class="paramkey"></td>
201.1001 +          <td></td>
201.1002 +          <td class="paramtype">&#160;</td>
201.1003 +          <td class="paramname">delim, </td>
201.1004 +        </tr>
201.1005 +        <tr>
201.1006 +          <td class="paramkey"></td>
201.1007 +          <td></td>
201.1008 +          <td class="paramtype">&#160;</td>
201.1009 +          <td class="paramname">count&#160;</td>
201.1010 +        </tr>
201.1011 +        <tr>
201.1012 +          <td></td>
201.1013 +          <td>)</td>
201.1014 +          <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>
201.1015 +        </tr>
201.1016 +      </table>
201.1017 +</div><div class="memdoc">
201.1018 +
201.1019 +<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>
201.1020 +<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>
201.1021 +<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>
201.1022 +<dl class="params"><dt>Parameters</dt><dd>
201.1023 +  <table class="params">
201.1024 +    <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>
201.1025 +    <tr><td class="paramname">string</td><td>the string to split </td></tr>
201.1026 +    <tr><td class="paramname">delim</td><td>the delimiter string </td></tr>
201.1027 +    <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>
201.1028 +  </table>
201.1029 +  </dd>
201.1030 +</dl>
201.1031 +<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>
201.1032 +<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>
201.1033 +
201.1034 +</div>
201.1035 +</div>
201.1036 +<a id="a9d03be026afa9447c52bb34b9e3b895a"></a>
201.1037 +<h2 class="memtitle"><span class="permalink"><a href="#a9d03be026afa9447c52bb34b9e3b895a">&#9670;&nbsp;</a></span>sstrstr</h2>
201.1038 +
201.1039 +<div class="memitem">
201.1040 +<div class="memproto">
201.1041 +      <table class="memname">
201.1042 +        <tr>
201.1043 +          <td class="memname">#define sstrstr</td>
201.1044 +          <td>(</td>
201.1045 +          <td class="paramtype">&#160;</td>
201.1046 +          <td class="paramname">string, </td>
201.1047 +        </tr>
201.1048 +        <tr>
201.1049 +          <td class="paramkey"></td>
201.1050 +          <td></td>
201.1051 +          <td class="paramtype">&#160;</td>
201.1052 +          <td class="paramname">match&#160;</td>
201.1053 +        </tr>
201.1054 +        <tr>
201.1055 +          <td></td>
201.1056 +          <td>)</td>
201.1057 +          <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>
201.1058 +        </tr>
201.1059 +      </table>
201.1060 +</div><div class="memdoc">
201.1061 +
201.1062 +<p>Returns a substring starting at the location of the first occurrence of the specified string. </p>
201.1063 +<p>If the string does not contain the other string, an empty string is returned.</p>
201.1064 +<p>If <code>match</code> is an empty string, the complete <code>string</code> is returned.</p>
201.1065 +<dl class="params"><dt>Parameters</dt><dd>
201.1066 +  <table class="params">
201.1067 +    <tr><td class="paramname">string</td><td>the string to be scanned </td></tr>
201.1068 +    <tr><td class="paramname">match</td><td>string containing the sequence of characters to match </td></tr>
201.1069 +  </table>
201.1070 +  </dd>
201.1071 +</dl>
201.1072 +<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>
201.1073 +
201.1074 +</div>
201.1075 +</div>
201.1076 +<a id="ac6a5246f26be2e8a5f34d8995b7ec14e"></a>
201.1077 +<h2 class="memtitle"><span class="permalink"><a href="#ac6a5246f26be2e8a5f34d8995b7ec14e">&#9670;&nbsp;</a></span>sstrsuffix</h2>
201.1078 +
201.1079 +<div class="memitem">
201.1080 +<div class="memproto">
201.1081 +      <table class="memname">
201.1082 +        <tr>
201.1083 +          <td class="memname">#define sstrsuffix</td>
201.1084 +          <td>(</td>
201.1085 +          <td class="paramtype">&#160;</td>
201.1086 +          <td class="paramname">string, </td>
201.1087 +        </tr>
201.1088 +        <tr>
201.1089 +          <td class="paramkey"></td>
201.1090 +          <td></td>
201.1091 +          <td class="paramtype">&#160;</td>
201.1092 +          <td class="paramname">suffix&#160;</td>
201.1093 +        </tr>
201.1094 +        <tr>
201.1095 +          <td></td>
201.1096 +          <td>)</td>
201.1097 +          <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>
201.1098 +        </tr>
201.1099 +      </table>
201.1100 +</div><div class="memdoc">
201.1101 +
201.1102 +<p>Checks, if a string has a specific suffix. </p>
201.1103 +<dl class="params"><dt>Parameters</dt><dd>
201.1104 +  <table class="params">
201.1105 +    <tr><td class="paramname">string</td><td>the string to check </td></tr>
201.1106 +    <tr><td class="paramname">suffix</td><td>the suffix the string should have </td></tr>
201.1107 +  </table>
201.1108 +  </dd>
201.1109 +</dl>
201.1110 +<dl class="section return"><dt>Returns</dt><dd>1, if and only if the string has the specified suffix, 0 otherwise </dd></dl>
201.1111 +
201.1112 +</div>
201.1113 +</div>
201.1114 +<a id="a084fe5a3a90d6fb6b15ecda03bb30824"></a>
201.1115 +<h2 class="memtitle"><span class="permalink"><a href="#a084fe5a3a90d6fb6b15ecda03bb30824">&#9670;&nbsp;</a></span>sstrupper</h2>
201.1116 +
201.1117 +<div class="memitem">
201.1118 +<div class="memproto">
201.1119 +      <table class="memname">
201.1120 +        <tr>
201.1121 +          <td class="memname">#define sstrupper</td>
201.1122 +          <td>(</td>
201.1123 +          <td class="paramtype">&#160;</td>
201.1124 +          <td class="paramname">string</td><td>)</td>
201.1125 +          <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>
201.1126 +        </tr>
201.1127 +      </table>
201.1128 +</div><div class="memdoc">
201.1129 +
201.1130 +<p>Returns a upper case version of a string. </p>
201.1131 +<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>
201.1132 +<dl class="params"><dt>Parameters</dt><dd>
201.1133 +  <table class="params">
201.1134 +    <tr><td class="paramname">string</td><td>the input string </td></tr>
201.1135 +  </table>
201.1136 +  </dd>
201.1137 +</dl>
201.1138 +<dl class="section return"><dt>Returns</dt><dd>the resulting upper case string </dd></dl>
201.1139 +
201.1140 +</div>
201.1141 +</div>
201.1142 +<a id="a5f0dd83c0176b812fb428004b2877a34"></a>
201.1143 +<h2 class="memtitle"><span class="permalink"><a href="#a5f0dd83c0176b812fb428004b2877a34">&#9670;&nbsp;</a></span>sstrupper_a</h2>
201.1144 +
201.1145 +<div class="memitem">
201.1146 +<div class="memproto">
201.1147 +      <table class="memname">
201.1148 +        <tr>
201.1149 +          <td class="memname">#define sstrupper_a</td>
201.1150 +          <td>(</td>
201.1151 +          <td class="paramtype">&#160;</td>
201.1152 +          <td class="paramname">allocator, </td>
201.1153 +        </tr>
201.1154 +        <tr>
201.1155 +          <td class="paramkey"></td>
201.1156 +          <td></td>
201.1157 +          <td class="paramtype">&#160;</td>
201.1158 +          <td class="paramname">string&#160;</td>
201.1159 +        </tr>
201.1160 +        <tr>
201.1161 +          <td></td>
201.1162 +          <td>)</td>
201.1163 +          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#aea94613eb74668cc05d365803d32bfad">scstrupper_a</a>(allocator, string)</td>
201.1164 +        </tr>
201.1165 +      </table>
201.1166 +</div><div class="memdoc">
201.1167 +
201.1168 +<p>Returns a upper case version of a string. </p>
201.1169 +<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>
201.1170 +<dl class="params"><dt>Parameters</dt><dd>
201.1171 +  <table class="params">
201.1172 +    <tr><td class="paramname">allocator</td><td>the allocator used for duplicating the string </td></tr>
201.1173 +    <tr><td class="paramname">string</td><td>the input string </td></tr>
201.1174 +  </table>
201.1175 +  </dd>
201.1176 +</dl>
201.1177 +<dl class="section return"><dt>Returns</dt><dd>the resulting upper case string </dd></dl>
201.1178 +
201.1179 +</div>
201.1180 +</div>
201.1181 +<h2 class="groupheader">Function Documentation</h2>
201.1182 +<a id="a2b1d6f1eca1c1549f37107b9c026c5a6"></a>
201.1183 +<h2 class="memtitle"><span class="permalink"><a href="#a2b1d6f1eca1c1549f37107b9c026c5a6">&#9670;&nbsp;</a></span>scstr()</h2>
201.1184 +
201.1185 +<div class="memitem">
201.1186 +<div class="memproto">
201.1187 +      <table class="memname">
201.1188 +        <tr>
201.1189 +          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> scstr </td>
201.1190 +          <td>(</td>
201.1191 +          <td class="paramtype">const char *&#160;</td>
201.1192 +          <td class="paramname"><em>cstring</em></td><td>)</td>
201.1193 +          <td></td>
201.1194 +        </tr>
201.1195 +      </table>
201.1196 +</div><div class="memdoc">
201.1197 +
201.1198 +<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>
201.1199 +<p>The length is implicitly inferred by using a call to <code>strlen()</code>.</p>
201.1200 +<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>
201.1201 +<dl class="params"><dt>Parameters</dt><dd>
201.1202 +  <table class="params">
201.1203 +    <tr><td class="paramname">cstring</td><td>the C string to wrap </td></tr>
201.1204 +  </table>
201.1205 +  </dd>
201.1206 +</dl>
201.1207 +<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>
201.1208 +<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>
201.1209 +
201.1210 +</div>
201.1211 +</div>
201.1212 +<a id="aca8142fb823d253054e17c17cfca05e0"></a>
201.1213 +<h2 class="memtitle"><span class="permalink"><a href="#aca8142fb823d253054e17c17cfca05e0">&#9670;&nbsp;</a></span>scstrcasecmp()</h2>
201.1214 +
201.1215 +<div class="memitem">
201.1216 +<div class="memproto">
201.1217 +      <table class="memname">
201.1218 +        <tr>
201.1219 +          <td class="memname">int scstrcasecmp </td>
201.1220 +          <td>(</td>
201.1221 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1222 +          <td class="paramname"><em>s1</em>, </td>
201.1223 +        </tr>
201.1224 +        <tr>
201.1225 +          <td class="paramkey"></td>
201.1226 +          <td></td>
201.1227 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1228 +          <td class="paramname"><em>s2</em>&#160;</td>
201.1229 +        </tr>
201.1230 +        <tr>
201.1231 +          <td></td>
201.1232 +          <td>)</td>
201.1233 +          <td></td><td></td>
201.1234 +        </tr>
201.1235 +      </table>
201.1236 +</div><div class="memdoc">
201.1237 +
201.1238 +<p>Compares two UCX strings ignoring the case. </p>
201.1239 +<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>
201.1240 +<dl class="params"><dt>Parameters</dt><dd>
201.1241 +  <table class="params">
201.1242 +    <tr><td class="paramname">s1</td><td>the first string </td></tr>
201.1243 +    <tr><td class="paramname">s2</td><td>the second string </td></tr>
201.1244 +  </table>
201.1245 +  </dd>
201.1246 +</dl>
201.1247 +<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>
201.1248 +
201.1249 +</div>
201.1250 +</div>
201.1251 +<a id="a3718ef4aa1e86cdb26bda2f07fb585df"></a>
201.1252 +<h2 class="memtitle"><span class="permalink"><a href="#a3718ef4aa1e86cdb26bda2f07fb585df">&#9670;&nbsp;</a></span>scstrcaseprefix()</h2>
201.1253 +
201.1254 +<div class="memitem">
201.1255 +<div class="memproto">
201.1256 +      <table class="memname">
201.1257 +        <tr>
201.1258 +          <td class="memname">int scstrcaseprefix </td>
201.1259 +          <td>(</td>
201.1260 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1261 +          <td class="paramname"><em>string</em>, </td>
201.1262 +        </tr>
201.1263 +        <tr>
201.1264 +          <td class="paramkey"></td>
201.1265 +          <td></td>
201.1266 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1267 +          <td class="paramname"><em>prefix</em>&#160;</td>
201.1268 +        </tr>
201.1269 +        <tr>
201.1270 +          <td></td>
201.1271 +          <td>)</td>
201.1272 +          <td></td><td></td>
201.1273 +        </tr>
201.1274 +      </table>
201.1275 +</div><div class="memdoc">
201.1276 +
201.1277 +<p>Checks, if a string has a specific prefix, ignoring the case. </p>
201.1278 +<dl class="params"><dt>Parameters</dt><dd>
201.1279 +  <table class="params">
201.1280 +    <tr><td class="paramname">string</td><td>the string to check </td></tr>
201.1281 +    <tr><td class="paramname">prefix</td><td>the prefix the string should have </td></tr>
201.1282 +  </table>
201.1283 +  </dd>
201.1284 +</dl>
201.1285 +<dl class="section return"><dt>Returns</dt><dd>1, if and only if the string has the specified prefix, 0 otherwise </dd></dl>
201.1286 +
201.1287 +</div>
201.1288 +</div>
201.1289 +<a id="a6edb4b85f2b9efe79db7ffe6eccd7bc3"></a>
201.1290 +<h2 class="memtitle"><span class="permalink"><a href="#a6edb4b85f2b9efe79db7ffe6eccd7bc3">&#9670;&nbsp;</a></span>scstrcasesuffix()</h2>
201.1291 +
201.1292 +<div class="memitem">
201.1293 +<div class="memproto">
201.1294 +      <table class="memname">
201.1295 +        <tr>
201.1296 +          <td class="memname">int scstrcasesuffix </td>
201.1297 +          <td>(</td>
201.1298 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1299 +          <td class="paramname"><em>string</em>, </td>
201.1300 +        </tr>
201.1301 +        <tr>
201.1302 +          <td class="paramkey"></td>
201.1303 +          <td></td>
201.1304 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1305 +          <td class="paramname"><em>suffix</em>&#160;</td>
201.1306 +        </tr>
201.1307 +        <tr>
201.1308 +          <td></td>
201.1309 +          <td>)</td>
201.1310 +          <td></td><td></td>
201.1311 +        </tr>
201.1312 +      </table>
201.1313 +</div><div class="memdoc">
201.1314 +
201.1315 +<p>Checks, if a string has a specific suffix, ignoring the case. </p>
201.1316 +<dl class="params"><dt>Parameters</dt><dd>
201.1317 +  <table class="params">
201.1318 +    <tr><td class="paramname">string</td><td>the string to check </td></tr>
201.1319 +    <tr><td class="paramname">suffix</td><td>the suffix the string should have </td></tr>
201.1320 +  </table>
201.1321 +  </dd>
201.1322 +</dl>
201.1323 +<dl class="section return"><dt>Returns</dt><dd>1, if and only if the string has the specified suffix, 0 otherwise </dd></dl>
201.1324 +
201.1325 +</div>
201.1326 +</div>
201.1327 +<a id="a7376842c19e954b49215da81ef76ac0c"></a>
201.1328 +<h2 class="memtitle"><span class="permalink"><a href="#a7376842c19e954b49215da81ef76ac0c">&#9670;&nbsp;</a></span>scstrcat()</h2>
201.1329 +
201.1330 +<div class="memitem">
201.1331 +<div class="memproto">
201.1332 +      <table class="memname">
201.1333 +        <tr>
201.1334 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrcat </td>
201.1335 +          <td>(</td>
201.1336 +          <td class="paramtype">size_t&#160;</td>
201.1337 +          <td class="paramname"><em>count</em>, </td>
201.1338 +        </tr>
201.1339 +        <tr>
201.1340 +          <td class="paramkey"></td>
201.1341 +          <td></td>
201.1342 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1343 +          <td class="paramname"><em>s1</em>, </td>
201.1344 +        </tr>
201.1345 +        <tr>
201.1346 +          <td class="paramkey"></td>
201.1347 +          <td></td>
201.1348 +          <td class="paramtype">&#160;</td>
201.1349 +          <td class="paramname"><em>...</em>&#160;</td>
201.1350 +        </tr>
201.1351 +        <tr>
201.1352 +          <td></td>
201.1353 +          <td>)</td>
201.1354 +          <td></td><td></td>
201.1355 +        </tr>
201.1356 +      </table>
201.1357 +</div><div class="memdoc">
201.1358 +
201.1359 +<p>Concatenates two or more strings. </p>
201.1360 +<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>
201.1361 +<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>
201.1362 +<dl class="params"><dt>Parameters</dt><dd>
201.1363 +  <table class="params">
201.1364 +    <tr><td class="paramname">count</td><td>the total number of strings to concatenate </td></tr>
201.1365 +    <tr><td class="paramname">s1</td><td>first string </td></tr>
201.1366 +    <tr><td class="paramname">...</td><td>all remaining strings </td></tr>
201.1367 +  </table>
201.1368 +  </dd>
201.1369 +</dl>
201.1370 +<dl class="section return"><dt>Returns</dt><dd>the concatenated string </dd></dl>
201.1371 +
201.1372 +</div>
201.1373 +</div>
201.1374 +<a id="abacce4cbd6f70fcb6453904ef08b02e9"></a>
201.1375 +<h2 class="memtitle"><span class="permalink"><a href="#abacce4cbd6f70fcb6453904ef08b02e9">&#9670;&nbsp;</a></span>scstrcat_a()</h2>
201.1376 +
201.1377 +<div class="memitem">
201.1378 +<div class="memproto">
201.1379 +      <table class="memname">
201.1380 +        <tr>
201.1381 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrcat_a </td>
201.1382 +          <td>(</td>
201.1383 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
201.1384 +          <td class="paramname"><em>alloc</em>, </td>
201.1385 +        </tr>
201.1386 +        <tr>
201.1387 +          <td class="paramkey"></td>
201.1388 +          <td></td>
201.1389 +          <td class="paramtype">size_t&#160;</td>
201.1390 +          <td class="paramname"><em>count</em>, </td>
201.1391 +        </tr>
201.1392 +        <tr>
201.1393 +          <td class="paramkey"></td>
201.1394 +          <td></td>
201.1395 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1396 +          <td class="paramname"><em>s1</em>, </td>
201.1397 +        </tr>
201.1398 +        <tr>
201.1399 +          <td class="paramkey"></td>
201.1400 +          <td></td>
201.1401 +          <td class="paramtype">&#160;</td>
201.1402 +          <td class="paramname"><em>...</em>&#160;</td>
201.1403 +        </tr>
201.1404 +        <tr>
201.1405 +          <td></td>
201.1406 +          <td>)</td>
201.1407 +          <td></td><td></td>
201.1408 +        </tr>
201.1409 +      </table>
201.1410 +</div><div class="memdoc">
201.1411 +
201.1412 +<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>
201.1413 +<p>The resulting string must be freed by the allocators <code>free()</code> implementation.</p>
201.1414 +<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>
201.1415 +<dl class="params"><dt>Parameters</dt><dd>
201.1416 +  <table class="params">
201.1417 +    <tr><td class="paramname">alloc</td><td>the allocator to use </td></tr>
201.1418 +    <tr><td class="paramname">count</td><td>the total number of strings to concatenate </td></tr>
201.1419 +    <tr><td class="paramname">s1</td><td>first string </td></tr>
201.1420 +    <tr><td class="paramname">...</td><td>all remaining strings </td></tr>
201.1421 +  </table>
201.1422 +  </dd>
201.1423 +</dl>
201.1424 +<dl class="section return"><dt>Returns</dt><dd>the concatenated string</dd></dl>
201.1425 +<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>
201.1426 +
201.1427 +</div>
201.1428 +</div>
201.1429 +<a id="a5836d6a7a744791c35e5c17bdc394a87"></a>
201.1430 +<h2 class="memtitle"><span class="permalink"><a href="#a5836d6a7a744791c35e5c17bdc394a87">&#9670;&nbsp;</a></span>scstrchr()</h2>
201.1431 +
201.1432 +<div class="memitem">
201.1433 +<div class="memproto">
201.1434 +      <table class="memname">
201.1435 +        <tr>
201.1436 +          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> scstrchr </td>
201.1437 +          <td>(</td>
201.1438 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1439 +          <td class="paramname"><em>string</em>, </td>
201.1440 +        </tr>
201.1441 +        <tr>
201.1442 +          <td class="paramkey"></td>
201.1443 +          <td></td>
201.1444 +          <td class="paramtype">int&#160;</td>
201.1445 +          <td class="paramname"><em>chr</em>&#160;</td>
201.1446 +        </tr>
201.1447 +        <tr>
201.1448 +          <td></td>
201.1449 +          <td>)</td>
201.1450 +          <td></td><td></td>
201.1451 +        </tr>
201.1452 +      </table>
201.1453 +</div><div class="memdoc">
201.1454 +
201.1455 +<p>Returns an immutable substring starting at the location of the first occurrence of the specified character. </p>
201.1456 +<p>If the string does not contain the character, an empty string is returned.</p>
201.1457 +<dl class="params"><dt>Parameters</dt><dd>
201.1458 +  <table class="params">
201.1459 +    <tr><td class="paramname">string</td><td>the string where to locate the character </td></tr>
201.1460 +    <tr><td class="paramname">chr</td><td>the character to locate </td></tr>
201.1461 +  </table>
201.1462 +  </dd>
201.1463 +</dl>
201.1464 +<dl class="section return"><dt>Returns</dt><dd>a substring starting at the first location of <code>chr</code></dd></dl>
201.1465 +<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>
201.1466 +
201.1467 +</div>
201.1468 +</div>
201.1469 +<a id="af35272a8e5408c88ed3e25a3a98f0a82"></a>
201.1470 +<h2 class="memtitle"><span class="permalink"><a href="#af35272a8e5408c88ed3e25a3a98f0a82">&#9670;&nbsp;</a></span>scstrcmp()</h2>
201.1471 +
201.1472 +<div class="memitem">
201.1473 +<div class="memproto">
201.1474 +      <table class="memname">
201.1475 +        <tr>
201.1476 +          <td class="memname">int scstrcmp </td>
201.1477 +          <td>(</td>
201.1478 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1479 +          <td class="paramname"><em>s1</em>, </td>
201.1480 +        </tr>
201.1481 +        <tr>
201.1482 +          <td class="paramkey"></td>
201.1483 +          <td></td>
201.1484 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1485 +          <td class="paramname"><em>s2</em>&#160;</td>
201.1486 +        </tr>
201.1487 +        <tr>
201.1488 +          <td></td>
201.1489 +          <td>)</td>
201.1490 +          <td></td><td></td>
201.1491 +        </tr>
201.1492 +      </table>
201.1493 +</div><div class="memdoc">
201.1494 +
201.1495 +<p>Compares two UCX strings with standard <code>memcmp()</code>. </p>
201.1496 +<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>
201.1497 +<dl class="params"><dt>Parameters</dt><dd>
201.1498 +  <table class="params">
201.1499 +    <tr><td class="paramname">s1</td><td>the first string </td></tr>
201.1500 +    <tr><td class="paramname">s2</td><td>the second string </td></tr>
201.1501 +  </table>
201.1502 +  </dd>
201.1503 +</dl>
201.1504 +<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>
201.1505 +
201.1506 +</div>
201.1507 +</div>
201.1508 +<a id="a97dccce03af419596dbdd592ca46a164"></a>
201.1509 +<h2 class="memtitle"><span class="permalink"><a href="#a97dccce03af419596dbdd592ca46a164">&#9670;&nbsp;</a></span>scstrdup()</h2>
201.1510 +
201.1511 +<div class="memitem">
201.1512 +<div class="memproto">
201.1513 +      <table class="memname">
201.1514 +        <tr>
201.1515 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrdup </td>
201.1516 +          <td>(</td>
201.1517 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1518 +          <td class="paramname"><em>string</em></td><td>)</td>
201.1519 +          <td></td>
201.1520 +        </tr>
201.1521 +      </table>
201.1522 +</div><div class="memdoc">
201.1523 +
201.1524 +<p>Creates a duplicate of the specified string. </p>
201.1525 +<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>
201.1526 +<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>
201.1527 +<dl class="params"><dt>Parameters</dt><dd>
201.1528 +  <table class="params">
201.1529 +    <tr><td class="paramname">string</td><td>the string to duplicate </td></tr>
201.1530 +  </table>
201.1531 +  </dd>
201.1532 +</dl>
201.1533 +<dl class="section return"><dt>Returns</dt><dd>a duplicate of the string </dd></dl>
201.1534 +<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>
201.1535 +
201.1536 +</div>
201.1537 +</div>
201.1538 +<a id="a8fe58921f51eb1fde038472377e63014"></a>
201.1539 +<h2 class="memtitle"><span class="permalink"><a href="#a8fe58921f51eb1fde038472377e63014">&#9670;&nbsp;</a></span>scstrdup_a()</h2>
201.1540 +
201.1541 +<div class="memitem">
201.1542 +<div class="memproto">
201.1543 +      <table class="memname">
201.1544 +        <tr>
201.1545 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrdup_a </td>
201.1546 +          <td>(</td>
201.1547 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
201.1548 +          <td class="paramname"><em>allocator</em>, </td>
201.1549 +        </tr>
201.1550 +        <tr>
201.1551 +          <td class="paramkey"></td>
201.1552 +          <td></td>
201.1553 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1554 +          <td class="paramname"><em>string</em>&#160;</td>
201.1555 +        </tr>
201.1556 +        <tr>
201.1557 +          <td></td>
201.1558 +          <td>)</td>
201.1559 +          <td></td><td></td>
201.1560 +        </tr>
201.1561 +      </table>
201.1562 +</div><div class="memdoc">
201.1563 +
201.1564 +<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>
201.1565 +<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>
201.1566 +<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>
201.1567 +<dl class="params"><dt>Parameters</dt><dd>
201.1568 +  <table class="params">
201.1569 +    <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>
201.1570 +    <tr><td class="paramname">string</td><td>the string to duplicate </td></tr>
201.1571 +  </table>
201.1572 +  </dd>
201.1573 +</dl>
201.1574 +<dl class="section return"><dt>Returns</dt><dd>a duplicate of the string </dd></dl>
201.1575 +<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>
201.1576 +
201.1577 +</div>
201.1578 +</div>
201.1579 +<a id="abccf198bea3186ff2abb080cc88dcae6"></a>
201.1580 +<h2 class="memtitle"><span class="permalink"><a href="#abccf198bea3186ff2abb080cc88dcae6">&#9670;&nbsp;</a></span>scstrlower()</h2>
201.1581 +
201.1582 +<div class="memitem">
201.1583 +<div class="memproto">
201.1584 +      <table class="memname">
201.1585 +        <tr>
201.1586 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrlower </td>
201.1587 +          <td>(</td>
201.1588 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1589 +          <td class="paramname"><em>string</em></td><td>)</td>
201.1590 +          <td></td>
201.1591 +        </tr>
201.1592 +      </table>
201.1593 +</div><div class="memdoc">
201.1594 +
201.1595 +<p>Returns a lower case version of a string. </p>
201.1596 +<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>
201.1597 +<dl class="params"><dt>Parameters</dt><dd>
201.1598 +  <table class="params">
201.1599 +    <tr><td class="paramname">string</td><td>the input string </td></tr>
201.1600 +  </table>
201.1601 +  </dd>
201.1602 +</dl>
201.1603 +<dl class="section return"><dt>Returns</dt><dd>the resulting lower case string </dd></dl>
201.1604 +<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>
201.1605 +
201.1606 +</div>
201.1607 +</div>
201.1608 +<a id="a3cf1e557df7ab58d03c78832c4060276"></a>
201.1609 +<h2 class="memtitle"><span class="permalink"><a href="#a3cf1e557df7ab58d03c78832c4060276">&#9670;&nbsp;</a></span>scstrlower_a()</h2>
201.1610 +
201.1611 +<div class="memitem">
201.1612 +<div class="memproto">
201.1613 +      <table class="memname">
201.1614 +        <tr>
201.1615 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrlower_a </td>
201.1616 +          <td>(</td>
201.1617 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
201.1618 +          <td class="paramname"><em>allocator</em>, </td>
201.1619 +        </tr>
201.1620 +        <tr>
201.1621 +          <td class="paramkey"></td>
201.1622 +          <td></td>
201.1623 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1624 +          <td class="paramname"><em>string</em>&#160;</td>
201.1625 +        </tr>
201.1626 +        <tr>
201.1627 +          <td></td>
201.1628 +          <td>)</td>
201.1629 +          <td></td><td></td>
201.1630 +        </tr>
201.1631 +      </table>
201.1632 +</div><div class="memdoc">
201.1633 +
201.1634 +<p>Returns a lower case version of a string. </p>
201.1635 +<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>
201.1636 +<dl class="params"><dt>Parameters</dt><dd>
201.1637 +  <table class="params">
201.1638 +    <tr><td class="paramname">allocator</td><td>the allocator used for duplicating the string </td></tr>
201.1639 +    <tr><td class="paramname">string</td><td>the input string </td></tr>
201.1640 +  </table>
201.1641 +  </dd>
201.1642 +</dl>
201.1643 +<dl class="section return"><dt>Returns</dt><dd>the resulting lower case string </dd></dl>
201.1644 +<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>
201.1645 +
201.1646 +</div>
201.1647 +</div>
201.1648 +<a id="ae594f6e222ea394cef6a26c0dfad000d"></a>
201.1649 +<h2 class="memtitle"><span class="permalink"><a href="#ae594f6e222ea394cef6a26c0dfad000d">&#9670;&nbsp;</a></span>scstrn()</h2>
201.1650 +
201.1651 +<div class="memitem">
201.1652 +<div class="memproto">
201.1653 +      <table class="memname">
201.1654 +        <tr>
201.1655 +          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> scstrn </td>
201.1656 +          <td>(</td>
201.1657 +          <td class="paramtype">const char *&#160;</td>
201.1658 +          <td class="paramname"><em>cstring</em>, </td>
201.1659 +        </tr>
201.1660 +        <tr>
201.1661 +          <td class="paramkey"></td>
201.1662 +          <td></td>
201.1663 +          <td class="paramtype">size_t&#160;</td>
201.1664 +          <td class="paramname"><em>length</em>&#160;</td>
201.1665 +        </tr>
201.1666 +        <tr>
201.1667 +          <td></td>
201.1668 +          <td>)</td>
201.1669 +          <td></td><td></td>
201.1670 +        </tr>
201.1671 +      </table>
201.1672 +</div><div class="memdoc">
201.1673 +
201.1674 +<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>
201.1675 +<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>
201.1676 +<dl class="params"><dt>Parameters</dt><dd>
201.1677 +  <table class="params">
201.1678 +    <tr><td class="paramname">cstring</td><td>the C string to wrap </td></tr>
201.1679 +    <tr><td class="paramname">length</td><td>the length of the string </td></tr>
201.1680 +  </table>
201.1681 +  </dd>
201.1682 +</dl>
201.1683 +<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>
201.1684 +<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>
201.1685 +
201.1686 +</div>
201.1687 +</div>
201.1688 +<a id="ac1b000030d6d197eec48c15a182055d5"></a>
201.1689 +<h2 class="memtitle"><span class="permalink"><a href="#ac1b000030d6d197eec48c15a182055d5">&#9670;&nbsp;</a></span>scstrnlen()</h2>
201.1690 +
201.1691 +<div class="memitem">
201.1692 +<div class="memproto">
201.1693 +      <table class="memname">
201.1694 +        <tr>
201.1695 +          <td class="memname">size_t scstrnlen </td>
201.1696 +          <td>(</td>
201.1697 +          <td class="paramtype">size_t&#160;</td>
201.1698 +          <td class="paramname"><em>count</em>, </td>
201.1699 +        </tr>
201.1700 +        <tr>
201.1701 +          <td class="paramkey"></td>
201.1702 +          <td></td>
201.1703 +          <td class="paramtype">&#160;</td>
201.1704 +          <td class="paramname"><em>...</em>&#160;</td>
201.1705 +        </tr>
201.1706 +        <tr>
201.1707 +          <td></td>
201.1708 +          <td>)</td>
201.1709 +          <td></td><td></td>
201.1710 +        </tr>
201.1711 +      </table>
201.1712 +</div><div class="memdoc">
201.1713 +
201.1714 +<p>Returns the accumulated length of all specified strings. </p>
201.1715 +<p><b>Attention:</b> if the count argument is larger than the count of the specified strings, the behavior is undefined.</p>
201.1716 +<dl class="params"><dt>Parameters</dt><dd>
201.1717 +  <table class="params">
201.1718 +    <tr><td class="paramname">count</td><td>the total number of specified strings </td></tr>
201.1719 +    <tr><td class="paramname">...</td><td>all strings </td></tr>
201.1720 +  </table>
201.1721 +  </dd>
201.1722 +</dl>
201.1723 +<dl class="section return"><dt>Returns</dt><dd>the accumulated length of all strings </dd></dl>
201.1724 +
201.1725 +</div>
201.1726 +</div>
201.1727 +<a id="a599ddc2f88dd1df68b72eefd91347393"></a>
201.1728 +<h2 class="memtitle"><span class="permalink"><a href="#a599ddc2f88dd1df68b72eefd91347393">&#9670;&nbsp;</a></span>scstrprefix()</h2>
201.1729 +
201.1730 +<div class="memitem">
201.1731 +<div class="memproto">
201.1732 +      <table class="memname">
201.1733 +        <tr>
201.1734 +          <td class="memname">int scstrprefix </td>
201.1735 +          <td>(</td>
201.1736 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1737 +          <td class="paramname"><em>string</em>, </td>
201.1738 +        </tr>
201.1739 +        <tr>
201.1740 +          <td class="paramkey"></td>
201.1741 +          <td></td>
201.1742 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1743 +          <td class="paramname"><em>prefix</em>&#160;</td>
201.1744 +        </tr>
201.1745 +        <tr>
201.1746 +          <td></td>
201.1747 +          <td>)</td>
201.1748 +          <td></td><td></td>
201.1749 +        </tr>
201.1750 +      </table>
201.1751 +</div><div class="memdoc">
201.1752 +
201.1753 +<p>Checks, if a string has a specific prefix. </p>
201.1754 +<dl class="params"><dt>Parameters</dt><dd>
201.1755 +  <table class="params">
201.1756 +    <tr><td class="paramname">string</td><td>the string to check </td></tr>
201.1757 +    <tr><td class="paramname">prefix</td><td>the prefix the string should have </td></tr>
201.1758 +  </table>
201.1759 +  </dd>
201.1760 +</dl>
201.1761 +<dl class="section return"><dt>Returns</dt><dd>1, if and only if the string has the specified prefix, 0 otherwise </dd></dl>
201.1762 +
201.1763 +</div>
201.1764 +</div>
201.1765 +<a id="ae389835b97cd9382e7d6a6a075323376"></a>
201.1766 +<h2 class="memtitle"><span class="permalink"><a href="#ae389835b97cd9382e7d6a6a075323376">&#9670;&nbsp;</a></span>scstrrchr()</h2>
201.1767 +
201.1768 +<div class="memitem">
201.1769 +<div class="memproto">
201.1770 +      <table class="memname">
201.1771 +        <tr>
201.1772 +          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> scstrrchr </td>
201.1773 +          <td>(</td>
201.1774 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1775 +          <td class="paramname"><em>string</em>, </td>
201.1776 +        </tr>
201.1777 +        <tr>
201.1778 +          <td class="paramkey"></td>
201.1779 +          <td></td>
201.1780 +          <td class="paramtype">int&#160;</td>
201.1781 +          <td class="paramname"><em>chr</em>&#160;</td>
201.1782 +        </tr>
201.1783 +        <tr>
201.1784 +          <td></td>
201.1785 +          <td>)</td>
201.1786 +          <td></td><td></td>
201.1787 +        </tr>
201.1788 +      </table>
201.1789 +</div><div class="memdoc">
201.1790 +
201.1791 +<p>Returns an immutable substring starting at the location of the last occurrence of the specified character. </p>
201.1792 +<p>If the string does not contain the character, an empty string is returned.</p>
201.1793 +<dl class="params"><dt>Parameters</dt><dd>
201.1794 +  <table class="params">
201.1795 +    <tr><td class="paramname">string</td><td>the string where to locate the character </td></tr>
201.1796 +    <tr><td class="paramname">chr</td><td>the character to locate </td></tr>
201.1797 +  </table>
201.1798 +  </dd>
201.1799 +</dl>
201.1800 +<dl class="section return"><dt>Returns</dt><dd>a substring starting at the last location of <code>chr</code></dd></dl>
201.1801 +<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>
201.1802 +
201.1803 +</div>
201.1804 +</div>
201.1805 +<a id="a54f256c3abe811c52d58b4ff1b23f051"></a>
201.1806 +<h2 class="memtitle"><span class="permalink"><a href="#a54f256c3abe811c52d58b4ff1b23f051">&#9670;&nbsp;</a></span>scstrscstr()</h2>
201.1807 +
201.1808 +<div class="memitem">
201.1809 +<div class="memproto">
201.1810 +      <table class="memname">
201.1811 +        <tr>
201.1812 +          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> scstrscstr </td>
201.1813 +          <td>(</td>
201.1814 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1815 +          <td class="paramname"><em>string</em>, </td>
201.1816 +        </tr>
201.1817 +        <tr>
201.1818 +          <td class="paramkey"></td>
201.1819 +          <td></td>
201.1820 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1821 +          <td class="paramname"><em>match</em>&#160;</td>
201.1822 +        </tr>
201.1823 +        <tr>
201.1824 +          <td></td>
201.1825 +          <td>)</td>
201.1826 +          <td></td><td></td>
201.1827 +        </tr>
201.1828 +      </table>
201.1829 +</div><div class="memdoc">
201.1830 +
201.1831 +<p>Returns an immutable substring starting at the location of the first occurrence of the specified immutable string. </p>
201.1832 +<p>If the string does not contain the other string, an empty string is returned.</p>
201.1833 +<p>If <code>match</code> is an empty string, the complete <code>string</code> is returned.</p>
201.1834 +<dl class="params"><dt>Parameters</dt><dd>
201.1835 +  <table class="params">
201.1836 +    <tr><td class="paramname">string</td><td>the string to be scanned </td></tr>
201.1837 +    <tr><td class="paramname">match</td><td>string containing the sequence of characters to match </td></tr>
201.1838 +  </table>
201.1839 +  </dd>
201.1840 +</dl>
201.1841 +<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>
201.1842 +
201.1843 +</div>
201.1844 +</div>
201.1845 +<a id="ae71cac352b00230848bde358f0fb05ea"></a>
201.1846 +<h2 class="memtitle"><span class="permalink"><a href="#ae71cac352b00230848bde358f0fb05ea">&#9670;&nbsp;</a></span>scstrsplit()</h2>
201.1847 +
201.1848 +<div class="memitem">
201.1849 +<div class="memproto">
201.1850 +      <table class="memname">
201.1851 +        <tr>
201.1852 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a>* scstrsplit </td>
201.1853 +          <td>(</td>
201.1854 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1855 +          <td class="paramname"><em>string</em>, </td>
201.1856 +        </tr>
201.1857 +        <tr>
201.1858 +          <td class="paramkey"></td>
201.1859 +          <td></td>
201.1860 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1861 +          <td class="paramname"><em>delim</em>, </td>
201.1862 +        </tr>
201.1863 +        <tr>
201.1864 +          <td class="paramkey"></td>
201.1865 +          <td></td>
201.1866 +          <td class="paramtype">ssize_t *&#160;</td>
201.1867 +          <td class="paramname"><em>count</em>&#160;</td>
201.1868 +        </tr>
201.1869 +        <tr>
201.1870 +          <td></td>
201.1871 +          <td>)</td>
201.1872 +          <td></td><td></td>
201.1873 +        </tr>
201.1874 +      </table>
201.1875 +</div><div class="memdoc">
201.1876 +
201.1877 +<p>Splits a string into parts by using a delimiter string. </p>
201.1878 +<p>This function will return <code>NULL</code>, if one of the following happens: </p><ul>
201.1879 +<li>
201.1880 +the string length is zero </li>
201.1881 +<li>
201.1882 +the delimeter length is zero </li>
201.1883 +<li>
201.1884 +the string equals the delimeter </li>
201.1885 +<li>
201.1886 +memory allocation fails </li>
201.1887 +</ul>
201.1888 +<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>
201.1889 +<p>The integer referenced by <code>count</code> is also used as output and is set to </p><ul>
201.1890 +<li>
201.1891 +-2, on memory allocation errors </li>
201.1892 +<li>
201.1893 +-1, if either the string or the delimiter is an empty string </li>
201.1894 +<li>
201.1895 +0, if the string equals the delimiter </li>
201.1896 +<li>
201.1897 +1, if the string does not contain the delimiter </li>
201.1898 +<li>
201.1899 +the count of array items, otherwise </li>
201.1900 +</ul>
201.1901 +<p>If the string starts with the delimiter, the first item of the resulting array will be an empty string.</p>
201.1902 +<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>
201.1903 +<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>
201.1904 +<dl class="params"><dt>Parameters</dt><dd>
201.1905 +  <table class="params">
201.1906 +    <tr><td class="paramname">string</td><td>the string to split </td></tr>
201.1907 +    <tr><td class="paramname">delim</td><td>the delimiter string </td></tr>
201.1908 +    <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>
201.1909 +  </table>
201.1910 +  </dd>
201.1911 +</dl>
201.1912 +<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>
201.1913 +<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>
201.1914 +
201.1915 +</div>
201.1916 +</div>
201.1917 +<a id="a52906455ae530c9cdc6812c8e6d9bdef"></a>
201.1918 +<h2 class="memtitle"><span class="permalink"><a href="#a52906455ae530c9cdc6812c8e6d9bdef">&#9670;&nbsp;</a></span>scstrsplit_a()</h2>
201.1919 +
201.1920 +<div class="memitem">
201.1921 +<div class="memproto">
201.1922 +      <table class="memname">
201.1923 +        <tr>
201.1924 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a>* scstrsplit_a </td>
201.1925 +          <td>(</td>
201.1926 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
201.1927 +          <td class="paramname"><em>allocator</em>, </td>
201.1928 +        </tr>
201.1929 +        <tr>
201.1930 +          <td class="paramkey"></td>
201.1931 +          <td></td>
201.1932 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1933 +          <td class="paramname"><em>string</em>, </td>
201.1934 +        </tr>
201.1935 +        <tr>
201.1936 +          <td class="paramkey"></td>
201.1937 +          <td></td>
201.1938 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1939 +          <td class="paramname"><em>delim</em>, </td>
201.1940 +        </tr>
201.1941 +        <tr>
201.1942 +          <td class="paramkey"></td>
201.1943 +          <td></td>
201.1944 +          <td class="paramtype">ssize_t *&#160;</td>
201.1945 +          <td class="paramname"><em>count</em>&#160;</td>
201.1946 +        </tr>
201.1947 +        <tr>
201.1948 +          <td></td>
201.1949 +          <td>)</td>
201.1950 +          <td></td><td></td>
201.1951 +        </tr>
201.1952 +      </table>
201.1953 +</div><div class="memdoc">
201.1954 +
201.1955 +<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>
201.1956 +<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>
201.1957 +<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>
201.1958 +<dl class="params"><dt>Parameters</dt><dd>
201.1959 +  <table class="params">
201.1960 +    <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>
201.1961 +    <tr><td class="paramname">string</td><td>the string to split </td></tr>
201.1962 +    <tr><td class="paramname">delim</td><td>the delimiter string </td></tr>
201.1963 +    <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>
201.1964 +  </table>
201.1965 +  </dd>
201.1966 +</dl>
201.1967 +<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>
201.1968 +<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>
201.1969 +
201.1970 +</div>
201.1971 +</div>
201.1972 +<a id="aa4362cb36c6629f9d8484739fd827748"></a>
201.1973 +<h2 class="memtitle"><span class="permalink"><a href="#aa4362cb36c6629f9d8484739fd827748">&#9670;&nbsp;</a></span>scstrsstr()</h2>
201.1974 +
201.1975 +<div class="memitem">
201.1976 +<div class="memproto">
201.1977 +      <table class="memname">
201.1978 +        <tr>
201.1979 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrsstr </td>
201.1980 +          <td>(</td>
201.1981 +          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td>
201.1982 +          <td class="paramname"><em>string</em>, </td>
201.1983 +        </tr>
201.1984 +        <tr>
201.1985 +          <td class="paramkey"></td>
201.1986 +          <td></td>
201.1987 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.1988 +          <td class="paramname"><em>match</em>&#160;</td>
201.1989 +        </tr>
201.1990 +        <tr>
201.1991 +          <td></td>
201.1992 +          <td>)</td>
201.1993 +          <td></td><td></td>
201.1994 +        </tr>
201.1995 +      </table>
201.1996 +</div><div class="memdoc">
201.1997 +
201.1998 +<p>Returns a substring starting at the location of the first occurrence of the specified string. </p>
201.1999 +<p>If the string does not contain the other string, an empty string is returned.</p>
201.2000 +<p>If <code>match</code> is an empty string, the complete <code>string</code> is returned.</p>
201.2001 +<dl class="params"><dt>Parameters</dt><dd>
201.2002 +  <table class="params">
201.2003 +    <tr><td class="paramname">string</td><td>the string to be scanned </td></tr>
201.2004 +    <tr><td class="paramname">match</td><td>string containing the sequence of characters to match </td></tr>
201.2005 +  </table>
201.2006 +  </dd>
201.2007 +</dl>
201.2008 +<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>
201.2009 +
201.2010 +</div>
201.2011 +</div>
201.2012 +<a id="a9a6c8d8db0dda0037c3c852cce1a5060"></a>
201.2013 +<h2 class="memtitle"><span class="permalink"><a href="#a9a6c8d8db0dda0037c3c852cce1a5060">&#9670;&nbsp;</a></span>scstrsubs()</h2>
201.2014 +
201.2015 +<div class="memitem">
201.2016 +<div class="memproto">
201.2017 +      <table class="memname">
201.2018 +        <tr>
201.2019 +          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> scstrsubs </td>
201.2020 +          <td>(</td>
201.2021 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.2022 +          <td class="paramname"><em>string</em>, </td>
201.2023 +        </tr>
201.2024 +        <tr>
201.2025 +          <td class="paramkey"></td>
201.2026 +          <td></td>
201.2027 +          <td class="paramtype">size_t&#160;</td>
201.2028 +          <td class="paramname"><em>start</em>&#160;</td>
201.2029 +        </tr>
201.2030 +        <tr>
201.2031 +          <td></td>
201.2032 +          <td>)</td>
201.2033 +          <td></td><td></td>
201.2034 +        </tr>
201.2035 +      </table>
201.2036 +</div><div class="memdoc">
201.2037 +
201.2038 +<p>Returns a substring of an immutable string starting at the specified location. </p>
201.2039 +<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>
201.2040 +<dl class="params"><dt>Parameters</dt><dd>
201.2041 +  <table class="params">
201.2042 +    <tr><td class="paramname">string</td><td>input string </td></tr>
201.2043 +    <tr><td class="paramname">start</td><td>start location of the substring </td></tr>
201.2044 +  </table>
201.2045 +  </dd>
201.2046 +</dl>
201.2047 +<dl class="section return"><dt>Returns</dt><dd>a substring of <code>string</code> starting at <code>start</code></dd></dl>
201.2048 +<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>
201.2049 +<dd>
201.2050 +<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>
201.2051 +
201.2052 +</div>
201.2053 +</div>
201.2054 +<a id="ad50f0f67b906fad0744f46bcb51e144b"></a>
201.2055 +<h2 class="memtitle"><span class="permalink"><a href="#ad50f0f67b906fad0744f46bcb51e144b">&#9670;&nbsp;</a></span>scstrsubsl()</h2>
201.2056 +
201.2057 +<div class="memitem">
201.2058 +<div class="memproto">
201.2059 +      <table class="memname">
201.2060 +        <tr>
201.2061 +          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> scstrsubsl </td>
201.2062 +          <td>(</td>
201.2063 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.2064 +          <td class="paramname"><em>string</em>, </td>
201.2065 +        </tr>
201.2066 +        <tr>
201.2067 +          <td class="paramkey"></td>
201.2068 +          <td></td>
201.2069 +          <td class="paramtype">size_t&#160;</td>
201.2070 +          <td class="paramname"><em>start</em>, </td>
201.2071 +        </tr>
201.2072 +        <tr>
201.2073 +          <td class="paramkey"></td>
201.2074 +          <td></td>
201.2075 +          <td class="paramtype">size_t&#160;</td>
201.2076 +          <td class="paramname"><em>length</em>&#160;</td>
201.2077 +        </tr>
201.2078 +        <tr>
201.2079 +          <td></td>
201.2080 +          <td>)</td>
201.2081 +          <td></td><td></td>
201.2082 +        </tr>
201.2083 +      </table>
201.2084 +</div><div class="memdoc">
201.2085 +
201.2086 +<p>Returns a substring of an immutable string with a maximum length starting at the specified location. </p>
201.2087 +<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>
201.2088 +<dl class="params"><dt>Parameters</dt><dd>
201.2089 +  <table class="params">
201.2090 +    <tr><td class="paramname">string</td><td>input string </td></tr>
201.2091 +    <tr><td class="paramname">start</td><td>start location of the substring </td></tr>
201.2092 +    <tr><td class="paramname">length</td><td>the maximum length of the substring </td></tr>
201.2093 +  </table>
201.2094 +  </dd>
201.2095 +</dl>
201.2096 +<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>
201.2097 +<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>
201.2098 +<dd>
201.2099 +<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>
201.2100 +
201.2101 +</div>
201.2102 +</div>
201.2103 +<a id="a1f0ae316a2afe85d5b4655e6ece6721a"></a>
201.2104 +<h2 class="memtitle"><span class="permalink"><a href="#a1f0ae316a2afe85d5b4655e6ece6721a">&#9670;&nbsp;</a></span>scstrsuffix()</h2>
201.2105 +
201.2106 +<div class="memitem">
201.2107 +<div class="memproto">
201.2108 +      <table class="memname">
201.2109 +        <tr>
201.2110 +          <td class="memname">int scstrsuffix </td>
201.2111 +          <td>(</td>
201.2112 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.2113 +          <td class="paramname"><em>string</em>, </td>
201.2114 +        </tr>
201.2115 +        <tr>
201.2116 +          <td class="paramkey"></td>
201.2117 +          <td></td>
201.2118 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.2119 +          <td class="paramname"><em>suffix</em>&#160;</td>
201.2120 +        </tr>
201.2121 +        <tr>
201.2122 +          <td></td>
201.2123 +          <td>)</td>
201.2124 +          <td></td><td></td>
201.2125 +        </tr>
201.2126 +      </table>
201.2127 +</div><div class="memdoc">
201.2128 +
201.2129 +<p>Checks, if a string has a specific suffix. </p>
201.2130 +<dl class="params"><dt>Parameters</dt><dd>
201.2131 +  <table class="params">
201.2132 +    <tr><td class="paramname">string</td><td>the string to check </td></tr>
201.2133 +    <tr><td class="paramname">suffix</td><td>the suffix the string should have </td></tr>
201.2134 +  </table>
201.2135 +  </dd>
201.2136 +</dl>
201.2137 +<dl class="section return"><dt>Returns</dt><dd>1, if and only if the string has the specified suffix, 0 otherwise </dd></dl>
201.2138 +
201.2139 +</div>
201.2140 +</div>
201.2141 +<a id="ad374b16eb1be8b48019debad9b9f268c"></a>
201.2142 +<h2 class="memtitle"><span class="permalink"><a href="#ad374b16eb1be8b48019debad9b9f268c">&#9670;&nbsp;</a></span>scstrtrim()</h2>
201.2143 +
201.2144 +<div class="memitem">
201.2145 +<div class="memproto">
201.2146 +      <table class="memname">
201.2147 +        <tr>
201.2148 +          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> scstrtrim </td>
201.2149 +          <td>(</td>
201.2150 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.2151 +          <td class="paramname"><em>string</em></td><td>)</td>
201.2152 +          <td></td>
201.2153 +        </tr>
201.2154 +      </table>
201.2155 +</div><div class="memdoc">
201.2156 +
201.2157 +<p>Omits leading and trailing spaces. </p>
201.2158 +<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>
201.2159 +<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>
201.2160 +<dl class="params"><dt>Parameters</dt><dd>
201.2161 +  <table class="params">
201.2162 +    <tr><td class="paramname">string</td><td>the string that shall be trimmed </td></tr>
201.2163 +  </table>
201.2164 +  </dd>
201.2165 +</dl>
201.2166 +<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>
201.2167 +
201.2168 +</div>
201.2169 +</div>
201.2170 +<a id="af3dd09ec9d11162fe0075f4e60f41240"></a>
201.2171 +<h2 class="memtitle"><span class="permalink"><a href="#af3dd09ec9d11162fe0075f4e60f41240">&#9670;&nbsp;</a></span>scstrupper()</h2>
201.2172 +
201.2173 +<div class="memitem">
201.2174 +<div class="memproto">
201.2175 +      <table class="memname">
201.2176 +        <tr>
201.2177 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrupper </td>
201.2178 +          <td>(</td>
201.2179 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.2180 +          <td class="paramname"><em>string</em></td><td>)</td>
201.2181 +          <td></td>
201.2182 +        </tr>
201.2183 +      </table>
201.2184 +</div><div class="memdoc">
201.2185 +
201.2186 +<p>Returns a upper case version of a string. </p>
201.2187 +<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>
201.2188 +<dl class="params"><dt>Parameters</dt><dd>
201.2189 +  <table class="params">
201.2190 +    <tr><td class="paramname">string</td><td>the input string </td></tr>
201.2191 +  </table>
201.2192 +  </dd>
201.2193 +</dl>
201.2194 +<dl class="section return"><dt>Returns</dt><dd>the resulting upper case string </dd></dl>
201.2195 +<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>
201.2196 +
201.2197 +</div>
201.2198 +</div>
201.2199 +<a id="aea94613eb74668cc05d365803d32bfad"></a>
201.2200 +<h2 class="memtitle"><span class="permalink"><a href="#aea94613eb74668cc05d365803d32bfad">&#9670;&nbsp;</a></span>scstrupper_a()</h2>
201.2201 +
201.2202 +<div class="memitem">
201.2203 +<div class="memproto">
201.2204 +      <table class="memname">
201.2205 +        <tr>
201.2206 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrupper_a </td>
201.2207 +          <td>(</td>
201.2208 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
201.2209 +          <td class="paramname"><em>allocator</em>, </td>
201.2210 +        </tr>
201.2211 +        <tr>
201.2212 +          <td class="paramkey"></td>
201.2213 +          <td></td>
201.2214 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.2215 +          <td class="paramname"><em>string</em>&#160;</td>
201.2216 +        </tr>
201.2217 +        <tr>
201.2218 +          <td></td>
201.2219 +          <td>)</td>
201.2220 +          <td></td><td></td>
201.2221 +        </tr>
201.2222 +      </table>
201.2223 +</div><div class="memdoc">
201.2224 +
201.2225 +<p>Returns a upper case version of a string. </p>
201.2226 +<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>
201.2227 +<dl class="params"><dt>Parameters</dt><dd>
201.2228 +  <table class="params">
201.2229 +    <tr><td class="paramname">allocator</td><td>the allocator used for duplicating the string </td></tr>
201.2230 +    <tr><td class="paramname">string</td><td>the input string </td></tr>
201.2231 +  </table>
201.2232 +  </dd>
201.2233 +</dl>
201.2234 +<dl class="section return"><dt>Returns</dt><dd>the resulting upper case string </dd></dl>
201.2235 +<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>
201.2236 +
201.2237 +</div>
201.2238 +</div>
201.2239 +<a id="a539eb7059251a051ee5d179526a23e9a"></a>
201.2240 +<h2 class="memtitle"><span class="permalink"><a href="#a539eb7059251a051ee5d179526a23e9a">&#9670;&nbsp;</a></span>sstr()</h2>
201.2241 +
201.2242 +<div class="memitem">
201.2243 +<div class="memproto">
201.2244 +      <table class="memname">
201.2245 +        <tr>
201.2246 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> sstr </td>
201.2247 +          <td>(</td>
201.2248 +          <td class="paramtype">char *&#160;</td>
201.2249 +          <td class="paramname"><em>cstring</em></td><td>)</td>
201.2250 +          <td></td>
201.2251 +        </tr>
201.2252 +      </table>
201.2253 +</div><div class="memdoc">
201.2254 +
201.2255 +<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>
201.2256 +<p>The length is implicitly inferred by using a call to <code>strlen()</code>.</p>
201.2257 +<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>
201.2258 +<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>
201.2259 +<dl class="params"><dt>Parameters</dt><dd>
201.2260 +  <table class="params">
201.2261 +    <tr><td class="paramname">cstring</td><td>the C string to wrap </td></tr>
201.2262 +  </table>
201.2263 +  </dd>
201.2264 +</dl>
201.2265 +<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>
201.2266 +<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>
201.2267 +
201.2268 +</div>
201.2269 +</div>
201.2270 +<a id="af80898a0b75955eb2579298c3ae2c481"></a>
201.2271 +<h2 class="memtitle"><span class="permalink"><a href="#af80898a0b75955eb2579298c3ae2c481">&#9670;&nbsp;</a></span>sstrchr()</h2>
201.2272 +
201.2273 +<div class="memitem">
201.2274 +<div class="memproto">
201.2275 +      <table class="memname">
201.2276 +        <tr>
201.2277 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> sstrchr </td>
201.2278 +          <td>(</td>
201.2279 +          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td>
201.2280 +          <td class="paramname"><em>string</em>, </td>
201.2281 +        </tr>
201.2282 +        <tr>
201.2283 +          <td class="paramkey"></td>
201.2284 +          <td></td>
201.2285 +          <td class="paramtype">int&#160;</td>
201.2286 +          <td class="paramname"><em>chr</em>&#160;</td>
201.2287 +        </tr>
201.2288 +        <tr>
201.2289 +          <td></td>
201.2290 +          <td>)</td>
201.2291 +          <td></td><td></td>
201.2292 +        </tr>
201.2293 +      </table>
201.2294 +</div><div class="memdoc">
201.2295 +
201.2296 +<p>Returns a substring starting at the location of the first occurrence of the specified character. </p>
201.2297 +<p>If the string does not contain the character, an empty string is returned.</p>
201.2298 +<dl class="params"><dt>Parameters</dt><dd>
201.2299 +  <table class="params">
201.2300 +    <tr><td class="paramname">string</td><td>the string where to locate the character </td></tr>
201.2301 +    <tr><td class="paramname">chr</td><td>the character to locate </td></tr>
201.2302 +  </table>
201.2303 +  </dd>
201.2304 +</dl>
201.2305 +<dl class="section return"><dt>Returns</dt><dd>a substring starting at the first location of <code>chr</code></dd></dl>
201.2306 +<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>
201.2307 +
201.2308 +</div>
201.2309 +</div>
201.2310 +<a id="a2744c38ac44abf3e01fa059056dcf36c"></a>
201.2311 +<h2 class="memtitle"><span class="permalink"><a href="#a2744c38ac44abf3e01fa059056dcf36c">&#9670;&nbsp;</a></span>sstrn()</h2>
201.2312 +
201.2313 +<div class="memitem">
201.2314 +<div class="memproto">
201.2315 +      <table class="memname">
201.2316 +        <tr>
201.2317 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> sstrn </td>
201.2318 +          <td>(</td>
201.2319 +          <td class="paramtype">char *&#160;</td>
201.2320 +          <td class="paramname"><em>cstring</em>, </td>
201.2321 +        </tr>
201.2322 +        <tr>
201.2323 +          <td class="paramkey"></td>
201.2324 +          <td></td>
201.2325 +          <td class="paramtype">size_t&#160;</td>
201.2326 +          <td class="paramname"><em>length</em>&#160;</td>
201.2327 +        </tr>
201.2328 +        <tr>
201.2329 +          <td></td>
201.2330 +          <td>)</td>
201.2331 +          <td></td><td></td>
201.2332 +        </tr>
201.2333 +      </table>
201.2334 +</div><div class="memdoc">
201.2335 +
201.2336 +<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>
201.2337 +<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>
201.2338 +<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>
201.2339 +<dl class="params"><dt>Parameters</dt><dd>
201.2340 +  <table class="params">
201.2341 +    <tr><td class="paramname">cstring</td><td>the C string to wrap </td></tr>
201.2342 +    <tr><td class="paramname">length</td><td>the length of the string </td></tr>
201.2343 +  </table>
201.2344 +  </dd>
201.2345 +</dl>
201.2346 +<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>
201.2347 +<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>
201.2348 +<dd>
201.2349 +<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>
201.2350 +
201.2351 +</div>
201.2352 +</div>
201.2353 +<a id="adae3f59957ca328e1da5285cb8b02a72"></a>
201.2354 +<h2 class="memtitle"><span class="permalink"><a href="#adae3f59957ca328e1da5285cb8b02a72">&#9670;&nbsp;</a></span>sstrrchr()</h2>
201.2355 +
201.2356 +<div class="memitem">
201.2357 +<div class="memproto">
201.2358 +      <table class="memname">
201.2359 +        <tr>
201.2360 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> sstrrchr </td>
201.2361 +          <td>(</td>
201.2362 +          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td>
201.2363 +          <td class="paramname"><em>string</em>, </td>
201.2364 +        </tr>
201.2365 +        <tr>
201.2366 +          <td class="paramkey"></td>
201.2367 +          <td></td>
201.2368 +          <td class="paramtype">int&#160;</td>
201.2369 +          <td class="paramname"><em>chr</em>&#160;</td>
201.2370 +        </tr>
201.2371 +        <tr>
201.2372 +          <td></td>
201.2373 +          <td>)</td>
201.2374 +          <td></td><td></td>
201.2375 +        </tr>
201.2376 +      </table>
201.2377 +</div><div class="memdoc">
201.2378 +
201.2379 +<p>Returns a substring starting at the location of the last occurrence of the specified character. </p>
201.2380 +<p>If the string does not contain the character, an empty string is returned.</p>
201.2381 +<dl class="params"><dt>Parameters</dt><dd>
201.2382 +  <table class="params">
201.2383 +    <tr><td class="paramname">string</td><td>the string where to locate the character </td></tr>
201.2384 +    <tr><td class="paramname">chr</td><td>the character to locate </td></tr>
201.2385 +  </table>
201.2386 +  </dd>
201.2387 +</dl>
201.2388 +<dl class="section return"><dt>Returns</dt><dd>a substring starting at the last location of <code>chr</code></dd></dl>
201.2389 +<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>
201.2390 +
201.2391 +</div>
201.2392 +</div>
201.2393 +<a id="a5eb9e0e1f26cf7fbecc038cd90e8b258"></a>
201.2394 +<h2 class="memtitle"><span class="permalink"><a href="#a5eb9e0e1f26cf7fbecc038cd90e8b258">&#9670;&nbsp;</a></span>sstrsubs()</h2>
201.2395 +
201.2396 +<div class="memitem">
201.2397 +<div class="memproto">
201.2398 +      <table class="memname">
201.2399 +        <tr>
201.2400 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> sstrsubs </td>
201.2401 +          <td>(</td>
201.2402 +          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td>
201.2403 +          <td class="paramname"><em>string</em>, </td>
201.2404 +        </tr>
201.2405 +        <tr>
201.2406 +          <td class="paramkey"></td>
201.2407 +          <td></td>
201.2408 +          <td class="paramtype">size_t&#160;</td>
201.2409 +          <td class="paramname"><em>start</em>&#160;</td>
201.2410 +        </tr>
201.2411 +        <tr>
201.2412 +          <td></td>
201.2413 +          <td>)</td>
201.2414 +          <td></td><td></td>
201.2415 +        </tr>
201.2416 +      </table>
201.2417 +</div><div class="memdoc">
201.2418 +
201.2419 +<p>Returns a substring starting at the specified location. </p>
201.2420 +<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>
201.2421 +<dl class="params"><dt>Parameters</dt><dd>
201.2422 +  <table class="params">
201.2423 +    <tr><td class="paramname">string</td><td>input string </td></tr>
201.2424 +    <tr><td class="paramname">start</td><td>start location of the substring </td></tr>
201.2425 +  </table>
201.2426 +  </dd>
201.2427 +</dl>
201.2428 +<dl class="section return"><dt>Returns</dt><dd>a substring of <code>string</code> starting at <code>start</code></dd></dl>
201.2429 +<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>
201.2430 +<dd>
201.2431 +<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>
201.2432 +
201.2433 +</div>
201.2434 +</div>
201.2435 +<a id="a78925c91af54f23cebd20ff99ef4331a"></a>
201.2436 +<h2 class="memtitle"><span class="permalink"><a href="#a78925c91af54f23cebd20ff99ef4331a">&#9670;&nbsp;</a></span>sstrsubsl()</h2>
201.2437 +
201.2438 +<div class="memitem">
201.2439 +<div class="memproto">
201.2440 +      <table class="memname">
201.2441 +        <tr>
201.2442 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> sstrsubsl </td>
201.2443 +          <td>(</td>
201.2444 +          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td>
201.2445 +          <td class="paramname"><em>string</em>, </td>
201.2446 +        </tr>
201.2447 +        <tr>
201.2448 +          <td class="paramkey"></td>
201.2449 +          <td></td>
201.2450 +          <td class="paramtype">size_t&#160;</td>
201.2451 +          <td class="paramname"><em>start</em>, </td>
201.2452 +        </tr>
201.2453 +        <tr>
201.2454 +          <td class="paramkey"></td>
201.2455 +          <td></td>
201.2456 +          <td class="paramtype">size_t&#160;</td>
201.2457 +          <td class="paramname"><em>length</em>&#160;</td>
201.2458 +        </tr>
201.2459 +        <tr>
201.2460 +          <td></td>
201.2461 +          <td>)</td>
201.2462 +          <td></td><td></td>
201.2463 +        </tr>
201.2464 +      </table>
201.2465 +</div><div class="memdoc">
201.2466 +
201.2467 +<p>Returns a substring with the given length starting at the specified location. </p>
201.2468 +<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>
201.2469 +<dl class="params"><dt>Parameters</dt><dd>
201.2470 +  <table class="params">
201.2471 +    <tr><td class="paramname">string</td><td>input string </td></tr>
201.2472 +    <tr><td class="paramname">start</td><td>start location of the substring </td></tr>
201.2473 +    <tr><td class="paramname">length</td><td>the maximum length of the substring </td></tr>
201.2474 +  </table>
201.2475 +  </dd>
201.2476 +</dl>
201.2477 +<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>
201.2478 +<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>
201.2479 +<dd>
201.2480 +<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>
201.2481 +
201.2482 +</div>
201.2483 +</div>
201.2484 +<a id="ae2d6da564d3fce51f2e0cac580fdbc56"></a>
201.2485 +<h2 class="memtitle"><span class="permalink"><a href="#ae2d6da564d3fce51f2e0cac580fdbc56">&#9670;&nbsp;</a></span>sstrtrim()</h2>
201.2486 +
201.2487 +<div class="memitem">
201.2488 +<div class="memproto">
201.2489 +      <table class="memname">
201.2490 +        <tr>
201.2491 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> sstrtrim </td>
201.2492 +          <td>(</td>
201.2493 +          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td>
201.2494 +          <td class="paramname"><em>string</em></td><td>)</td>
201.2495 +          <td></td>
201.2496 +        </tr>
201.2497 +      </table>
201.2498 +</div><div class="memdoc">
201.2499 +
201.2500 +<p>Omits leading and trailing spaces. </p>
201.2501 +<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>
201.2502 +<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>
201.2503 +<dl class="params"><dt>Parameters</dt><dd>
201.2504 +  <table class="params">
201.2505 +    <tr><td class="paramname">string</td><td>the string that shall be trimmed </td></tr>
201.2506 +  </table>
201.2507 +  </dd>
201.2508 +</dl>
201.2509 +<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>
201.2510 +
201.2511 +</div>
201.2512 +</div>
201.2513 +<a id="a69d5e3eeec783cc43314df71248768f5"></a>
201.2514 +<h2 class="memtitle"><span class="permalink"><a href="#a69d5e3eeec783cc43314df71248768f5">&#9670;&nbsp;</a></span>ucx_sc2sc()</h2>
201.2515 +
201.2516 +<div class="memitem">
201.2517 +<div class="memproto">
201.2518 +      <table class="memname">
201.2519 +        <tr>
201.2520 +          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> ucx_sc2sc </td>
201.2521 +          <td>(</td>
201.2522 +          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
201.2523 +          <td class="paramname"><em>str</em></td><td>)</td>
201.2524 +          <td></td>
201.2525 +        </tr>
201.2526 +      </table>
201.2527 +</div><div class="memdoc">
201.2528 +
201.2529 +<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>
201.2530 +<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>
201.2531 +<p><b>Do not use this function manually.</b></p>
201.2532 +<dl class="params"><dt>Parameters</dt><dd>
201.2533 +  <table class="params">
201.2534 +    <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>
201.2535 +  </table>
201.2536 +  </dd>
201.2537 +</dl>
201.2538 +<dl class="section return"><dt>Returns</dt><dd>the argument itself </dd></dl>
201.2539 +
201.2540 +</div>
201.2541 +</div>
201.2542 +<a id="aedeb5d7bddda54116101a8d68af8c56d"></a>
201.2543 +<h2 class="memtitle"><span class="permalink"><a href="#aedeb5d7bddda54116101a8d68af8c56d">&#9670;&nbsp;</a></span>ucx_ss2c_s()</h2>
201.2544 +
201.2545 +<div class="memitem">
201.2546 +<div class="memproto">
201.2547 +      <table class="memname">
201.2548 +        <tr>
201.2549 +          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> ucx_ss2c_s </td>
201.2550 +          <td>(</td>
201.2551 +          <td class="paramname"></td><td>)</td>
201.2552 +          <td></td>
201.2553 +        </tr>
201.2554 +      </table>
201.2555 +</div><div class="memdoc">
201.2556 +
201.2557 +<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>
201.2558 +<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>
201.2559 +<p><b>Do not use this function manually.</b></p>
201.2560 +<dl class="section return"><dt>Returns</dt><dd>the an immutable version of the provided string </dd></dl>
201.2561 +
201.2562 +</div>
201.2563 +</div>
201.2564 +<a id="a9ce5ad1b2aa2dbeba204d452c2e64359"></a>
201.2565 +<h2 class="memtitle"><span class="permalink"><a href="#a9ce5ad1b2aa2dbeba204d452c2e64359">&#9670;&nbsp;</a></span>ucx_ss2sc()</h2>
201.2566 +
201.2567 +<div class="memitem">
201.2568 +<div class="memproto">
201.2569 +      <table class="memname">
201.2570 +        <tr>
201.2571 +          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> ucx_ss2sc </td>
201.2572 +          <td>(</td>
201.2573 +          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td>
201.2574 +          <td class="paramname"><em>str</em></td><td>)</td>
201.2575 +          <td></td>
201.2576 +        </tr>
201.2577 +      </table>
201.2578 +</div><div class="memdoc">
201.2579 +
201.2580 +<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>
201.2581 +<p>Used <b>internally</b> to convert a UCX string to an immutable UCX string.</p>
201.2582 +<p><b>Do not use this function manually.</b></p>
201.2583 +<dl class="params"><dt>Parameters</dt><dd>
201.2584 +  <table class="params">
201.2585 +    <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>
201.2586 +  </table>
201.2587 +  </dd>
201.2588 +</dl>
201.2589 +<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>
201.2590 +
201.2591 +</div>
201.2592 +</div>
201.2593 +</div><!-- contents -->
201.2594 +<!-- start footer part -->
201.2595 +<hr class="footer"/><address class="footer"><small>
201.2596 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
201.2597 +<img class="footer" src="doxygen.png" alt="doxygen"/>
201.2598 +</a> 1.8.13
201.2599 +</small></address>
201.2600 +</body>
201.2601 +</html>
   202.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   202.2 +++ b/docs/api-2.1/string_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
   202.3 @@ -0,0 +1,124 @@
   202.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   202.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   202.6 +<head>
   202.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   202.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   202.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  202.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  202.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/string.h Source File</title>
  202.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  202.13 +<script type="text/javascript" src="jquery.js"></script>
  202.14 +<script type="text/javascript" src="dynsections.js"></script>
  202.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  202.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  202.17 +<script type="text/javascript" src="search/search.js"></script>
  202.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  202.19 +</head>
  202.20 +<body>
  202.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  202.22 +<div id="titlearea">
  202.23 +<table cellspacing="0" cellpadding="0">
  202.24 + <tbody>
  202.25 + <tr style="height: 56px;">
  202.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  202.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  202.28 +   <div id="projectname">ucx
  202.29 +   </div>
  202.30 +   <div id="projectbrief">UAP Common Extensions</div>
  202.31 +  </td>
  202.32 + </tr>
  202.33 + </tbody>
  202.34 +</table>
  202.35 +</div>
  202.36 +<!-- end header part -->
  202.37 +<!-- Generated by Doxygen 1.8.13 -->
  202.38 +<script type="text/javascript">
  202.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  202.40 +</script>
  202.41 +<script type="text/javascript" src="menudata.js"></script>
  202.42 +<script type="text/javascript" src="menu.js"></script>
  202.43 +<script type="text/javascript">
  202.44 +$(function() {
  202.45 +  initMenu('',true,false,'search.php','Search');
  202.46 +  $(document).ready(function() { init_search(); });
  202.47 +});
  202.48 +</script>
  202.49 +<div id="main-nav"></div>
  202.50 +<!-- window showing the filter options -->
  202.51 +<div id="MSearchSelectWindow"
  202.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  202.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  202.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  202.55 +</div>
  202.56 +
  202.57 +<!-- iframe showing the search results (closed by default) -->
  202.58 +<div id="MSearchResultsWindow">
  202.59 +<iframe src="javascript:void(0)" frameborder="0" 
  202.60 +        name="MSearchResults" id="MSearchResults">
  202.61 +</iframe>
  202.62 +</div>
  202.63 +
  202.64 +<div id="nav-path" class="navpath">
  202.65 +  <ul>
  202.66 +<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>
  202.67 +</div>
  202.68 +</div><!-- top -->
  202.69 +<div class="header">
  202.70 +  <div class="headertitle">
  202.71 +<div class="title">string.h</div>  </div>
  202.72 +</div><!--header-->
  202.73 +<div class="contents">
  202.74 +<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>
  202.75 +<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>
  202.76 +<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>
  202.77 +<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>
  202.78 +<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>
  202.79 +<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>
  202.80 +<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>
  202.81 +<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>
  202.82 +<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>
  202.83 +<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>
  202.84 +<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>
  202.85 +<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>
  202.86 +<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>
  202.87 +<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>
  202.88 +<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>
  202.89 +<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>
  202.90 +<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>
  202.91 +<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>
  202.92 +<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>
  202.93 +<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>
  202.94 +<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>
  202.95 +<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>
  202.96 +<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>
  202.97 +<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>
  202.98 +<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>
  202.99 +<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>
 202.100 +<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>
 202.101 +<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>
 202.102 +<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>
 202.103 +<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>
 202.104 +<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>
 202.105 +<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>
 202.106 +<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>
 202.107 +<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>
 202.108 +<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>
 202.109 +<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>
 202.110 +<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>
 202.111 +<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>
 202.112 +<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>
 202.113 +<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>
 202.114 +<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>
 202.115 +<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>
 202.116 +<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>
 202.117 +<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>
 202.118 +<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>
 202.119 +</div><!-- fragment --></div><!-- contents -->
 202.120 +<!-- start footer part -->
 202.121 +<hr class="footer"/><address class="footer"><small>
 202.122 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 202.123 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 202.124 +</a> 1.8.13
 202.125 +</small></address>
 202.126 +</body>
 202.127 +</html>
   203.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   203.2 +++ b/docs/api-2.1/structUcxAVLNode.html	Sat Feb 06 19:11:44 2021 +0100
   203.3 @@ -0,0 +1,115 @@
   203.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   203.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   203.6 +<head>
   203.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   203.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   203.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  203.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  203.11 +<title>ucx: UcxAVLNode Struct Reference</title>
  203.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  203.13 +<script type="text/javascript" src="jquery.js"></script>
  203.14 +<script type="text/javascript" src="dynsections.js"></script>
  203.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  203.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  203.17 +<script type="text/javascript" src="search/search.js"></script>
  203.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  203.19 +</head>
  203.20 +<body>
  203.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  203.22 +<div id="titlearea">
  203.23 +<table cellspacing="0" cellpadding="0">
  203.24 + <tbody>
  203.25 + <tr style="height: 56px;">
  203.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  203.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  203.28 +   <div id="projectname">ucx
  203.29 +   </div>
  203.30 +   <div id="projectbrief">UAP Common Extensions</div>
  203.31 +  </td>
  203.32 + </tr>
  203.33 + </tbody>
  203.34 +</table>
  203.35 +</div>
  203.36 +<!-- end header part -->
  203.37 +<!-- Generated by Doxygen 1.8.13 -->
  203.38 +<script type="text/javascript">
  203.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  203.40 +</script>
  203.41 +<script type="text/javascript" src="menudata.js"></script>
  203.42 +<script type="text/javascript" src="menu.js"></script>
  203.43 +<script type="text/javascript">
  203.44 +$(function() {
  203.45 +  initMenu('',true,false,'search.php','Search');
  203.46 +  $(document).ready(function() { init_search(); });
  203.47 +});
  203.48 +</script>
  203.49 +<div id="main-nav"></div>
  203.50 +<!-- window showing the filter options -->
  203.51 +<div id="MSearchSelectWindow"
  203.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  203.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  203.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  203.55 +</div>
  203.56 +
  203.57 +<!-- iframe showing the search results (closed by default) -->
  203.58 +<div id="MSearchResultsWindow">
  203.59 +<iframe src="javascript:void(0)" frameborder="0" 
  203.60 +        name="MSearchResults" id="MSearchResults">
  203.61 +</iframe>
  203.62 +</div>
  203.63 +
  203.64 +</div><!-- top -->
  203.65 +<div class="header">
  203.66 +  <div class="summary">
  203.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  203.68 +  <div class="headertitle">
  203.69 +<div class="title">UcxAVLNode Struct Reference</div>  </div>
  203.70 +</div><!--header-->
  203.71 +<div class="contents">
  203.72 +
  203.73 +<p>UCX AVL Node.  
  203.74 + <a href="structUcxAVLNode.html#details">More...</a></p>
  203.75 +
  203.76 +<p><code>#include &lt;<a class="el" href="avl_8h_source.html">avl.h</a>&gt;</code></p>
  203.77 +<table class="memberdecls">
  203.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  203.79 +Data Fields</h2></td></tr>
  203.80 +<tr class="memitem:ab65a31010d26a3df898e6ba534702af6"><td class="memItemLeft" align="right" valign="top"><a id="ab65a31010d26a3df898e6ba534702af6"></a>
  203.81 +intptr_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">key</a></td></tr>
  203.82 +<tr class="memdesc:ab65a31010d26a3df898e6ba534702af6"><td class="mdescLeft">&#160;</td><td class="mdescRight">The key for this node. <br /></td></tr>
  203.83 +<tr class="separator:ab65a31010d26a3df898e6ba534702af6"><td class="memSeparator" colspan="2">&#160;</td></tr>
  203.84 +<tr class="memitem:a302501b8c04c3fde668fe72249871258"><td class="memItemLeft" align="right" valign="top"><a id="a302501b8c04c3fde668fe72249871258"></a>
  203.85 +void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAVLNode.html#a302501b8c04c3fde668fe72249871258">value</a></td></tr>
  203.86 +<tr class="memdesc:a302501b8c04c3fde668fe72249871258"><td class="mdescLeft">&#160;</td><td class="mdescRight">Data contained by this node. <br /></td></tr>
  203.87 +<tr class="separator:a302501b8c04c3fde668fe72249871258"><td class="memSeparator" colspan="2">&#160;</td></tr>
  203.88 +<tr class="memitem:af129fd32863a7c35e82c5cd9d11dc95a"><td class="memItemLeft" align="right" valign="top"><a id="af129fd32863a7c35e82c5cd9d11dc95a"></a>
  203.89 +size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAVLNode.html#af129fd32863a7c35e82c5cd9d11dc95a">height</a></td></tr>
  203.90 +<tr class="memdesc:af129fd32863a7c35e82c5cd9d11dc95a"><td class="mdescLeft">&#160;</td><td class="mdescRight">The height of this (sub)-tree. <br /></td></tr>
  203.91 +<tr class="separator:af129fd32863a7c35e82c5cd9d11dc95a"><td class="memSeparator" colspan="2">&#160;</td></tr>
  203.92 +<tr class="memitem:afc4e3b4f452aa2d91cabb2135b9d42f7"><td class="memItemLeft" align="right" valign="top"><a id="afc4e3b4f452aa2d91cabb2135b9d42f7"></a>
  203.93 +<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>
  203.94 +<tr class="memdesc:afc4e3b4f452aa2d91cabb2135b9d42f7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parent node. <br /></td></tr>
  203.95 +<tr class="separator:afc4e3b4f452aa2d91cabb2135b9d42f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
  203.96 +<tr class="memitem:ad3a1c733f2c1cc81ac527f846fc24b9c"><td class="memItemLeft" align="right" valign="top"><a id="ad3a1c733f2c1cc81ac527f846fc24b9c"></a>
  203.97 +<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>
  203.98 +<tr class="memdesc:ad3a1c733f2c1cc81ac527f846fc24b9c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Root node of left subtree. <br /></td></tr>
  203.99 +<tr class="separator:ad3a1c733f2c1cc81ac527f846fc24b9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 203.100 +<tr class="memitem:a7cbaa31dba8c7a89f4f8f7905f6fd238"><td class="memItemLeft" align="right" valign="top"><a id="a7cbaa31dba8c7a89f4f8f7905f6fd238"></a>
 203.101 +<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>
 203.102 +<tr class="memdesc:a7cbaa31dba8c7a89f4f8f7905f6fd238"><td class="mdescLeft">&#160;</td><td class="mdescRight">Root node of right subtree. <br /></td></tr>
 203.103 +<tr class="separator:a7cbaa31dba8c7a89f4f8f7905f6fd238"><td class="memSeparator" colspan="2">&#160;</td></tr>
 203.104 +</table>
 203.105 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 203.106 +<div class="textblock"><p>UCX AVL Node. </p>
 203.107 +</div><hr/>The documentation for this struct was generated from the following file:<ul>
 203.108 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="avl_8h_source.html">avl.h</a></li>
 203.109 +</ul>
 203.110 +</div><!-- contents -->
 203.111 +<!-- start footer part -->
 203.112 +<hr class="footer"/><address class="footer"><small>
 203.113 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 203.114 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 203.115 +</a> 1.8.13
 203.116 +</small></address>
 203.117 +</body>
 203.118 +</html>
   204.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   204.2 +++ b/docs/api-2.1/structUcxAVLTree.html	Sat Feb 06 19:11:44 2021 +0100
   204.3 @@ -0,0 +1,140 @@
   204.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   204.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   204.6 +<head>
   204.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   204.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   204.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  204.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  204.11 +<title>ucx: UcxAVLTree Struct Reference</title>
  204.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  204.13 +<script type="text/javascript" src="jquery.js"></script>
  204.14 +<script type="text/javascript" src="dynsections.js"></script>
  204.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  204.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  204.17 +<script type="text/javascript" src="search/search.js"></script>
  204.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  204.19 +</head>
  204.20 +<body>
  204.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  204.22 +<div id="titlearea">
  204.23 +<table cellspacing="0" cellpadding="0">
  204.24 + <tbody>
  204.25 + <tr style="height: 56px;">
  204.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  204.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  204.28 +   <div id="projectname">ucx
  204.29 +   </div>
  204.30 +   <div id="projectbrief">UAP Common Extensions</div>
  204.31 +  </td>
  204.32 + </tr>
  204.33 + </tbody>
  204.34 +</table>
  204.35 +</div>
  204.36 +<!-- end header part -->
  204.37 +<!-- Generated by Doxygen 1.8.13 -->
  204.38 +<script type="text/javascript">
  204.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  204.40 +</script>
  204.41 +<script type="text/javascript" src="menudata.js"></script>
  204.42 +<script type="text/javascript" src="menu.js"></script>
  204.43 +<script type="text/javascript">
  204.44 +$(function() {
  204.45 +  initMenu('',true,false,'search.php','Search');
  204.46 +  $(document).ready(function() { init_search(); });
  204.47 +});
  204.48 +</script>
  204.49 +<div id="main-nav"></div>
  204.50 +<!-- window showing the filter options -->
  204.51 +<div id="MSearchSelectWindow"
  204.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  204.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  204.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  204.55 +</div>
  204.56 +
  204.57 +<!-- iframe showing the search results (closed by default) -->
  204.58 +<div id="MSearchResultsWindow">
  204.59 +<iframe src="javascript:void(0)" frameborder="0" 
  204.60 +        name="MSearchResults" id="MSearchResults">
  204.61 +</iframe>
  204.62 +</div>
  204.63 +
  204.64 +</div><!-- top -->
  204.65 +<div class="header">
  204.66 +  <div class="summary">
  204.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  204.68 +  <div class="headertitle">
  204.69 +<div class="title">UcxAVLTree Struct Reference</div>  </div>
  204.70 +</div><!--header-->
  204.71 +<div class="contents">
  204.72 +
  204.73 +<p>UCX AVL Tree.  
  204.74 + <a href="structUcxAVLTree.html#details">More...</a></p>
  204.75 +
  204.76 +<p><code>#include &lt;<a class="el" href="avl_8h_source.html">avl.h</a>&gt;</code></p>
  204.77 +<table class="memberdecls">
  204.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  204.79 +Data Fields</h2></td></tr>
  204.80 +<tr class="memitem:a30652776b540156ad54c7d52833e4e28"><td class="memItemLeft" align="right" valign="top"><a id="a30652776b540156ad54c7d52833e4e28"></a>
  204.81 +<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>
  204.82 +<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>
  204.83 +<tr class="separator:a30652776b540156ad54c7d52833e4e28"><td class="memSeparator" colspan="2">&#160;</td></tr>
  204.84 +<tr class="memitem:a393a8fc99eb2c290d3cb67170081d742"><td class="memItemLeft" align="right" valign="top"><a id="a393a8fc99eb2c290d3cb67170081d742"></a>
  204.85 +<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>
  204.86 +<tr class="memdesc:a393a8fc99eb2c290d3cb67170081d742"><td class="mdescLeft">&#160;</td><td class="mdescRight">Root node of the tree. <br /></td></tr>
  204.87 +<tr class="separator:a393a8fc99eb2c290d3cb67170081d742"><td class="memSeparator" colspan="2">&#160;</td></tr>
  204.88 +<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>
  204.89 +<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>
  204.90 +<tr class="separator:a87aff25cb726cb9eb88eb815a10d1004"><td class="memSeparator" colspan="2">&#160;</td></tr>
  204.91 +<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>
  204.92 +<tr class="memdesc:ae92a3bfad3fe33c8dcbdad85112f83fd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom user data.  <a href="#ae92a3bfad3fe33c8dcbdad85112f83fd">More...</a><br /></td></tr>
  204.93 +<tr class="separator:ae92a3bfad3fe33c8dcbdad85112f83fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
  204.94 +</table>
  204.95 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  204.96 +<div class="textblock"><p>UCX AVL Tree. </p>
  204.97 +</div><h2 class="groupheader">Field Documentation</h2>
  204.98 +<a id="a87aff25cb726cb9eb88eb815a10d1004"></a>
  204.99 +<h2 class="memtitle"><span class="permalink"><a href="#a87aff25cb726cb9eb88eb815a10d1004">&#9670;&nbsp;</a></span>cmpfunc</h2>
 204.100 +
 204.101 +<div class="memitem">
 204.102 +<div class="memproto">
 204.103 +      <table class="memname">
 204.104 +        <tr>
 204.105 +          <td class="memname"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> UcxAVLTree::cmpfunc</td>
 204.106 +        </tr>
 204.107 +      </table>
 204.108 +</div><div class="memdoc">
 204.109 +
 204.110 +<p>Compare function that shall be used to compare the <a class="el" href="structUcxAVLNode.html" title="UCX AVL Node. ">UcxAVLNode</a> keys. </p>
 204.111 +<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>
 204.112 +
 204.113 +</div>
 204.114 +</div>
 204.115 +<a id="ae92a3bfad3fe33c8dcbdad85112f83fd"></a>
 204.116 +<h2 class="memtitle"><span class="permalink"><a href="#ae92a3bfad3fe33c8dcbdad85112f83fd">&#9670;&nbsp;</a></span>userdata</h2>
 204.117 +
 204.118 +<div class="memitem">
 204.119 +<div class="memproto">
 204.120 +      <table class="memname">
 204.121 +        <tr>
 204.122 +          <td class="memname">void* UcxAVLTree::userdata</td>
 204.123 +        </tr>
 204.124 +      </table>
 204.125 +</div><div class="memdoc">
 204.126 +
 204.127 +<p>Custom user data. </p>
 204.128 +<p>This data will also be provided to the cmpfunc. </p>
 204.129 +
 204.130 +</div>
 204.131 +</div>
 204.132 +<hr/>The documentation for this struct was generated from the following file:<ul>
 204.133 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="avl_8h_source.html">avl.h</a></li>
 204.134 +</ul>
 204.135 +</div><!-- contents -->
 204.136 +<!-- start footer part -->
 204.137 +<hr class="footer"/><address class="footer"><small>
 204.138 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 204.139 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 204.140 +</a> 1.8.13
 204.141 +</small></address>
 204.142 +</body>
 204.143 +</html>
   205.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   205.2 +++ b/docs/api-2.1/structUcxAllocator.html	Sat Feb 06 19:11:44 2021 +0100
   205.3 @@ -0,0 +1,128 @@
   205.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   205.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   205.6 +<head>
   205.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   205.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   205.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  205.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  205.11 +<title>ucx: UcxAllocator Struct Reference</title>
  205.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  205.13 +<script type="text/javascript" src="jquery.js"></script>
  205.14 +<script type="text/javascript" src="dynsections.js"></script>
  205.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  205.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  205.17 +<script type="text/javascript" src="search/search.js"></script>
  205.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  205.19 +</head>
  205.20 +<body>
  205.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  205.22 +<div id="titlearea">
  205.23 +<table cellspacing="0" cellpadding="0">
  205.24 + <tbody>
  205.25 + <tr style="height: 56px;">
  205.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  205.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  205.28 +   <div id="projectname">ucx
  205.29 +   </div>
  205.30 +   <div id="projectbrief">UAP Common Extensions</div>
  205.31 +  </td>
  205.32 + </tr>
  205.33 + </tbody>
  205.34 +</table>
  205.35 +</div>
  205.36 +<!-- end header part -->
  205.37 +<!-- Generated by Doxygen 1.8.13 -->
  205.38 +<script type="text/javascript">
  205.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  205.40 +</script>
  205.41 +<script type="text/javascript" src="menudata.js"></script>
  205.42 +<script type="text/javascript" src="menu.js"></script>
  205.43 +<script type="text/javascript">
  205.44 +$(function() {
  205.45 +  initMenu('',true,false,'search.php','Search');
  205.46 +  $(document).ready(function() { init_search(); });
  205.47 +});
  205.48 +</script>
  205.49 +<div id="main-nav"></div>
  205.50 +<!-- window showing the filter options -->
  205.51 +<div id="MSearchSelectWindow"
  205.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  205.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  205.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  205.55 +</div>
  205.56 +
  205.57 +<!-- iframe showing the search results (closed by default) -->
  205.58 +<div id="MSearchResultsWindow">
  205.59 +<iframe src="javascript:void(0)" frameborder="0" 
  205.60 +        name="MSearchResults" id="MSearchResults">
  205.61 +</iframe>
  205.62 +</div>
  205.63 +
  205.64 +</div><!-- top -->
  205.65 +<div class="header">
  205.66 +  <div class="summary">
  205.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  205.68 +  <div class="headertitle">
  205.69 +<div class="title">UcxAllocator Struct Reference</div>  </div>
  205.70 +</div><!--header-->
  205.71 +<div class="contents">
  205.72 +
  205.73 +<p>UCX allocator data structure containing memory management functions.  
  205.74 + <a href="structUcxAllocator.html#details">More...</a></p>
  205.75 +
  205.76 +<p><code>#include &lt;<a class="el" href="allocator_8h_source.html">allocator.h</a>&gt;</code></p>
  205.77 +<table class="memberdecls">
  205.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  205.79 +Data Fields</h2></td></tr>
  205.80 +<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>
  205.81 +<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>
  205.82 +<tr class="separator:a1b78012998d1c28be86dc595f8f0aac9"><td class="memSeparator" colspan="2">&#160;</td></tr>
  205.83 +<tr class="memitem:a013376172be39ed54f77c4be6898845a"><td class="memItemLeft" align="right" valign="top"><a id="a013376172be39ed54f77c4be6898845a"></a>
  205.84 +<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>
  205.85 +<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>
  205.86 +<tr class="separator:a013376172be39ed54f77c4be6898845a"><td class="memSeparator" colspan="2">&#160;</td></tr>
  205.87 +<tr class="memitem:ab94ec1cba45cc4e7d81e1588a11cbb62"><td class="memItemLeft" align="right" valign="top"><a id="ab94ec1cba45cc4e7d81e1588a11cbb62"></a>
  205.88 +<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>
  205.89 +<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>
  205.90 +<tr class="separator:ab94ec1cba45cc4e7d81e1588a11cbb62"><td class="memSeparator" colspan="2">&#160;</td></tr>
  205.91 +<tr class="memitem:a3550e3847f31d9e9ce3ffcb0d3440c15"><td class="memItemLeft" align="right" valign="top"><a id="a3550e3847f31d9e9ce3ffcb0d3440c15"></a>
  205.92 +<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>
  205.93 +<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>
  205.94 +<tr class="separator:a3550e3847f31d9e9ce3ffcb0d3440c15"><td class="memSeparator" colspan="2">&#160;</td></tr>
  205.95 +<tr class="memitem:aecce1840378ed53f1002190f4f87026f"><td class="memItemLeft" align="right" valign="top"><a id="aecce1840378ed53f1002190f4f87026f"></a>
  205.96 +<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>
  205.97 +<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>
  205.98 +<tr class="separator:aecce1840378ed53f1002190f4f87026f"><td class="memSeparator" colspan="2">&#160;</td></tr>
  205.99 +</table>
 205.100 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 205.101 +<div class="textblock"><p>UCX allocator data structure containing memory management functions. </p>
 205.102 +</div><h2 class="groupheader">Field Documentation</h2>
 205.103 +<a id="a1b78012998d1c28be86dc595f8f0aac9"></a>
 205.104 +<h2 class="memtitle"><span class="permalink"><a href="#a1b78012998d1c28be86dc595f8f0aac9">&#9670;&nbsp;</a></span>pool</h2>
 205.105 +
 205.106 +<div class="memitem">
 205.107 +<div class="memproto">
 205.108 +      <table class="memname">
 205.109 +        <tr>
 205.110 +          <td class="memname">void* UcxAllocator::pool</td>
 205.111 +        </tr>
 205.112 +      </table>
 205.113 +</div><div class="memdoc">
 205.114 +
 205.115 +<p>Pointer to an area of memory or a complex memory pool. </p>
 205.116 +<p>This pointer will be passed to any memory management function as first argument. </p>
 205.117 +
 205.118 +</div>
 205.119 +</div>
 205.120 +<hr/>The documentation for this struct was generated from the following file:<ul>
 205.121 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="allocator_8h_source.html">allocator.h</a></li>
 205.122 +</ul>
 205.123 +</div><!-- contents -->
 205.124 +<!-- start footer part -->
 205.125 +<hr class="footer"/><address class="footer"><small>
 205.126 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 205.127 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 205.128 +</a> 1.8.13
 205.129 +</small></address>
 205.130 +</body>
 205.131 +</html>
   206.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   206.2 +++ b/docs/api-2.1/structUcxArray.html	Sat Feb 06 19:11:44 2021 +0100
   206.3 @@ -0,0 +1,111 @@
   206.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   206.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   206.6 +<head>
   206.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   206.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   206.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  206.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  206.11 +<title>ucx: UcxArray Struct Reference</title>
  206.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  206.13 +<script type="text/javascript" src="jquery.js"></script>
  206.14 +<script type="text/javascript" src="dynsections.js"></script>
  206.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  206.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  206.17 +<script type="text/javascript" src="search/search.js"></script>
  206.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  206.19 +</head>
  206.20 +<body>
  206.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  206.22 +<div id="titlearea">
  206.23 +<table cellspacing="0" cellpadding="0">
  206.24 + <tbody>
  206.25 + <tr style="height: 56px;">
  206.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  206.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  206.28 +   <div id="projectname">ucx
  206.29 +   </div>
  206.30 +   <div id="projectbrief">UAP Common Extensions</div>
  206.31 +  </td>
  206.32 + </tr>
  206.33 + </tbody>
  206.34 +</table>
  206.35 +</div>
  206.36 +<!-- end header part -->
  206.37 +<!-- Generated by Doxygen 1.8.13 -->
  206.38 +<script type="text/javascript">
  206.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  206.40 +</script>
  206.41 +<script type="text/javascript" src="menudata.js"></script>
  206.42 +<script type="text/javascript" src="menu.js"></script>
  206.43 +<script type="text/javascript">
  206.44 +$(function() {
  206.45 +  initMenu('',true,false,'search.php','Search');
  206.46 +  $(document).ready(function() { init_search(); });
  206.47 +});
  206.48 +</script>
  206.49 +<div id="main-nav"></div>
  206.50 +<!-- window showing the filter options -->
  206.51 +<div id="MSearchSelectWindow"
  206.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  206.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  206.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  206.55 +</div>
  206.56 +
  206.57 +<!-- iframe showing the search results (closed by default) -->
  206.58 +<div id="MSearchResultsWindow">
  206.59 +<iframe src="javascript:void(0)" frameborder="0" 
  206.60 +        name="MSearchResults" id="MSearchResults">
  206.61 +</iframe>
  206.62 +</div>
  206.63 +
  206.64 +</div><!-- top -->
  206.65 +<div class="header">
  206.66 +  <div class="summary">
  206.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  206.68 +  <div class="headertitle">
  206.69 +<div class="title">UcxArray Struct Reference</div>  </div>
  206.70 +</div><!--header-->
  206.71 +<div class="contents">
  206.72 +
  206.73 +<p>UCX array type.  
  206.74 + <a href="structUcxArray.html#details">More...</a></p>
  206.75 +
  206.76 +<p><code>#include &lt;<a class="el" href="array_8h_source.html">array.h</a>&gt;</code></p>
  206.77 +<table class="memberdecls">
  206.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  206.79 +Data Fields</h2></td></tr>
  206.80 +<tr class="memitem:a7ed074887908e45bde7e1fbc67b31c18"><td class="memItemLeft" align="right" valign="top"><a id="a7ed074887908e45bde7e1fbc67b31c18"></a>
  206.81 +size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxArray.html#a7ed074887908e45bde7e1fbc67b31c18">capacity</a></td></tr>
  206.82 +<tr class="memdesc:a7ed074887908e45bde7e1fbc67b31c18"><td class="mdescLeft">&#160;</td><td class="mdescRight">The current capacity of the array. <br /></td></tr>
  206.83 +<tr class="separator:a7ed074887908e45bde7e1fbc67b31c18"><td class="memSeparator" colspan="2">&#160;</td></tr>
  206.84 +<tr class="memitem:a20c11f2c9048cda80062842b7c094e20"><td class="memItemLeft" align="right" valign="top"><a id="a20c11f2c9048cda80062842b7c094e20"></a>
  206.85 +size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxArray.html#a20c11f2c9048cda80062842b7c094e20">size</a></td></tr>
  206.86 +<tr class="memdesc:a20c11f2c9048cda80062842b7c094e20"><td class="mdescLeft">&#160;</td><td class="mdescRight">The actual number of elements in the array. <br /></td></tr>
  206.87 +<tr class="separator:a20c11f2c9048cda80062842b7c094e20"><td class="memSeparator" colspan="2">&#160;</td></tr>
  206.88 +<tr class="memitem:ac4e9ecdf8a8d010644f6e44dfef8190f"><td class="memItemLeft" align="right" valign="top"><a id="ac4e9ecdf8a8d010644f6e44dfef8190f"></a>
  206.89 +size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxArray.html#ac4e9ecdf8a8d010644f6e44dfef8190f">elemsize</a></td></tr>
  206.90 +<tr class="memdesc:ac4e9ecdf8a8d010644f6e44dfef8190f"><td class="mdescLeft">&#160;</td><td class="mdescRight">The size of an individual element in bytes. <br /></td></tr>
  206.91 +<tr class="separator:ac4e9ecdf8a8d010644f6e44dfef8190f"><td class="memSeparator" colspan="2">&#160;</td></tr>
  206.92 +<tr class="memitem:a04d2b03d0a45af1fab19b4216602075a"><td class="memItemLeft" align="right" valign="top"><a id="a04d2b03d0a45af1fab19b4216602075a"></a>
  206.93 +void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxArray.html#a04d2b03d0a45af1fab19b4216602075a">data</a></td></tr>
  206.94 +<tr class="memdesc:a04d2b03d0a45af1fab19b4216602075a"><td class="mdescLeft">&#160;</td><td class="mdescRight">A pointer to the data. <br /></td></tr>
  206.95 +<tr class="separator:a04d2b03d0a45af1fab19b4216602075a"><td class="memSeparator" colspan="2">&#160;</td></tr>
  206.96 +<tr class="memitem:a2ef31303b7548b9aa8e2b9187e295212"><td class="memItemLeft" align="right" valign="top"><a id="a2ef31303b7548b9aa8e2b9187e295212"></a>
  206.97 +<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>
  206.98 +<tr class="memdesc:a2ef31303b7548b9aa8e2b9187e295212"><td class="mdescLeft">&#160;</td><td class="mdescRight">The allocator used for the data. <br /></td></tr>
  206.99 +<tr class="separator:a2ef31303b7548b9aa8e2b9187e295212"><td class="memSeparator" colspan="2">&#160;</td></tr>
 206.100 +</table>
 206.101 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 206.102 +<div class="textblock"><p>UCX array type. </p>
 206.103 +</div><hr/>The documentation for this struct was generated from the following file:<ul>
 206.104 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="array_8h_source.html">array.h</a></li>
 206.105 +</ul>
 206.106 +</div><!-- contents -->
 206.107 +<!-- start footer part -->
 206.108 +<hr class="footer"/><address class="footer"><small>
 206.109 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 206.110 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 206.111 +</a> 1.8.13
 206.112 +</small></address>
 206.113 +</body>
 206.114 +</html>
   207.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   207.2 +++ b/docs/api-2.1/structUcxBuffer.html	Sat Feb 06 19:11:44 2021 +0100
   207.3 @@ -0,0 +1,193 @@
   207.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   207.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   207.6 +<head>
   207.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   207.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   207.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  207.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  207.11 +<title>ucx: UcxBuffer Struct Reference</title>
  207.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  207.13 +<script type="text/javascript" src="jquery.js"></script>
  207.14 +<script type="text/javascript" src="dynsections.js"></script>
  207.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  207.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  207.17 +<script type="text/javascript" src="search/search.js"></script>
  207.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  207.19 +</head>
  207.20 +<body>
  207.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  207.22 +<div id="titlearea">
  207.23 +<table cellspacing="0" cellpadding="0">
  207.24 + <tbody>
  207.25 + <tr style="height: 56px;">
  207.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  207.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  207.28 +   <div id="projectname">ucx
  207.29 +   </div>
  207.30 +   <div id="projectbrief">UAP Common Extensions</div>
  207.31 +  </td>
  207.32 + </tr>
  207.33 + </tbody>
  207.34 +</table>
  207.35 +</div>
  207.36 +<!-- end header part -->
  207.37 +<!-- Generated by Doxygen 1.8.13 -->
  207.38 +<script type="text/javascript">
  207.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  207.40 +</script>
  207.41 +<script type="text/javascript" src="menudata.js"></script>
  207.42 +<script type="text/javascript" src="menu.js"></script>
  207.43 +<script type="text/javascript">
  207.44 +$(function() {
  207.45 +  initMenu('',true,false,'search.php','Search');
  207.46 +  $(document).ready(function() { init_search(); });
  207.47 +});
  207.48 +</script>
  207.49 +<div id="main-nav"></div>
  207.50 +<!-- window showing the filter options -->
  207.51 +<div id="MSearchSelectWindow"
  207.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  207.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  207.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  207.55 +</div>
  207.56 +
  207.57 +<!-- iframe showing the search results (closed by default) -->
  207.58 +<div id="MSearchResultsWindow">
  207.59 +<iframe src="javascript:void(0)" frameborder="0" 
  207.60 +        name="MSearchResults" id="MSearchResults">
  207.61 +</iframe>
  207.62 +</div>
  207.63 +
  207.64 +</div><!-- top -->
  207.65 +<div class="header">
  207.66 +  <div class="summary">
  207.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  207.68 +  <div class="headertitle">
  207.69 +<div class="title">UcxBuffer Struct Reference</div>  </div>
  207.70 +</div><!--header-->
  207.71 +<div class="contents">
  207.72 +
  207.73 +<p>UCX Buffer.  
  207.74 + <a href="structUcxBuffer.html#details">More...</a></p>
  207.75 +
  207.76 +<p><code>#include &lt;<a class="el" href="buffer_8h_source.html">buffer.h</a>&gt;</code></p>
  207.77 +<table class="memberdecls">
  207.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  207.79 +Data Fields</h2></td></tr>
  207.80 +<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>
  207.81 +<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>
  207.82 +<tr class="separator:a1a5076e85acb84b715a53bc0f37fb721"><td class="memSeparator" colspan="2">&#160;</td></tr>
  207.83 +<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>
  207.84 +<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>
  207.85 +<tr class="separator:a7a64288f002cf62b492e2ea49c79615c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  207.86 +<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>
  207.87 +<tr class="memdesc:a385661894f3cee9c549bfe07a8b316bf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Current capacity (i.e.  <a href="#a385661894f3cee9c549bfe07a8b316bf">More...</a><br /></td></tr>
  207.88 +<tr class="separator:a385661894f3cee9c549bfe07a8b316bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
  207.89 +<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>
  207.90 +<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>
  207.91 +<tr class="separator:aec0aea8325394951d5ad4a9fbb8e1ac7"><td class="memSeparator" colspan="2">&#160;</td></tr>
  207.92 +<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>
  207.93 +<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>
  207.94 +<tr class="separator:ac642e07b0a03be5aac48eb4aa5bec2f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
  207.95 +</table>
  207.96 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  207.97 +<div class="textblock"><p>UCX Buffer. </p>
  207.98 +</div><h2 class="groupheader">Field Documentation</h2>
  207.99 +<a id="a385661894f3cee9c549bfe07a8b316bf"></a>
 207.100 +<h2 class="memtitle"><span class="permalink"><a href="#a385661894f3cee9c549bfe07a8b316bf">&#9670;&nbsp;</a></span>capacity</h2>
 207.101 +
 207.102 +<div class="memitem">
 207.103 +<div class="memproto">
 207.104 +      <table class="memname">
 207.105 +        <tr>
 207.106 +          <td class="memname">size_t UcxBuffer::capacity</td>
 207.107 +        </tr>
 207.108 +      </table>
 207.109 +</div><div class="memdoc">
 207.110 +
 207.111 +<p>Current capacity (i.e. </p>
 207.112 +<p>maximum size) of the buffer. </p>
 207.113 +
 207.114 +</div>
 207.115 +</div>
 207.116 +<a id="ac642e07b0a03be5aac48eb4aa5bec2f7"></a>
 207.117 +<h2 class="memtitle"><span class="permalink"><a href="#ac642e07b0a03be5aac48eb4aa5bec2f7">&#9670;&nbsp;</a></span>flags</h2>
 207.118 +
 207.119 +<div class="memitem">
 207.120 +<div class="memproto">
 207.121 +      <table class="memname">
 207.122 +        <tr>
 207.123 +          <td class="memname">int UcxBuffer::flags</td>
 207.124 +        </tr>
 207.125 +      </table>
 207.126 +</div><div class="memdoc">
 207.127 +
 207.128 +<p>Flag register for buffer features. </p>
 207.129 +<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>
 207.130 +<dd>
 207.131 +<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>
 207.132 +<dd>
 207.133 +<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>
 207.134 +
 207.135 +</div>
 207.136 +</div>
 207.137 +<a id="a7a64288f002cf62b492e2ea49c79615c"></a>
 207.138 +<h2 class="memtitle"><span class="permalink"><a href="#a7a64288f002cf62b492e2ea49c79615c">&#9670;&nbsp;</a></span>pos</h2>
 207.139 +
 207.140 +<div class="memitem">
 207.141 +<div class="memproto">
 207.142 +      <table class="memname">
 207.143 +        <tr>
 207.144 +          <td class="memname">size_t UcxBuffer::pos</td>
 207.145 +        </tr>
 207.146 +      </table>
 207.147 +</div><div class="memdoc">
 207.148 +
 207.149 +<p>Current position of the buffer. </p>
 207.150 +
 207.151 +</div>
 207.152 +</div>
 207.153 +<a id="aec0aea8325394951d5ad4a9fbb8e1ac7"></a>
 207.154 +<h2 class="memtitle"><span class="permalink"><a href="#aec0aea8325394951d5ad4a9fbb8e1ac7">&#9670;&nbsp;</a></span>size</h2>
 207.155 +
 207.156 +<div class="memitem">
 207.157 +<div class="memproto">
 207.158 +      <table class="memname">
 207.159 +        <tr>
 207.160 +          <td class="memname">size_t UcxBuffer::size</td>
 207.161 +        </tr>
 207.162 +      </table>
 207.163 +</div><div class="memdoc">
 207.164 +
 207.165 +<p>Current size of the buffer content. </p>
 207.166 +
 207.167 +</div>
 207.168 +</div>
 207.169 +<a id="a1a5076e85acb84b715a53bc0f37fb721"></a>
 207.170 +<h2 class="memtitle"><span class="permalink"><a href="#a1a5076e85acb84b715a53bc0f37fb721">&#9670;&nbsp;</a></span>space</h2>
 207.171 +
 207.172 +<div class="memitem">
 207.173 +<div class="memproto">
 207.174 +      <table class="memname">
 207.175 +        <tr>
 207.176 +          <td class="memname">char* UcxBuffer::space</td>
 207.177 +        </tr>
 207.178 +      </table>
 207.179 +</div><div class="memdoc">
 207.180 +
 207.181 +<p>A pointer to the buffer contents. </p>
 207.182 +
 207.183 +</div>
 207.184 +</div>
 207.185 +<hr/>The documentation for this struct was generated from the following file:<ul>
 207.186 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="buffer_8h_source.html">buffer.h</a></li>
 207.187 +</ul>
 207.188 +</div><!-- contents -->
 207.189 +<!-- start footer part -->
 207.190 +<hr class="footer"/><address class="footer"><small>
 207.191 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 207.192 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 207.193 +</a> 1.8.13
 207.194 +</small></address>
 207.195 +</body>
 207.196 +</html>
   208.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   208.2 +++ b/docs/api-2.1/structUcxKey.html	Sat Feb 06 19:11:44 2021 +0100
   208.3 @@ -0,0 +1,149 @@
   208.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   208.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   208.6 +<head>
   208.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   208.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   208.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  208.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  208.11 +<title>ucx: UcxKey Struct Reference</title>
  208.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  208.13 +<script type="text/javascript" src="jquery.js"></script>
  208.14 +<script type="text/javascript" src="dynsections.js"></script>
  208.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  208.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  208.17 +<script type="text/javascript" src="search/search.js"></script>
  208.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  208.19 +</head>
  208.20 +<body>
  208.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  208.22 +<div id="titlearea">
  208.23 +<table cellspacing="0" cellpadding="0">
  208.24 + <tbody>
  208.25 + <tr style="height: 56px;">
  208.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  208.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  208.28 +   <div id="projectname">ucx
  208.29 +   </div>
  208.30 +   <div id="projectbrief">UAP Common Extensions</div>
  208.31 +  </td>
  208.32 + </tr>
  208.33 + </tbody>
  208.34 +</table>
  208.35 +</div>
  208.36 +<!-- end header part -->
  208.37 +<!-- Generated by Doxygen 1.8.13 -->
  208.38 +<script type="text/javascript">
  208.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  208.40 +</script>
  208.41 +<script type="text/javascript" src="menudata.js"></script>
  208.42 +<script type="text/javascript" src="menu.js"></script>
  208.43 +<script type="text/javascript">
  208.44 +$(function() {
  208.45 +  initMenu('',true,false,'search.php','Search');
  208.46 +  $(document).ready(function() { init_search(); });
  208.47 +});
  208.48 +</script>
  208.49 +<div id="main-nav"></div>
  208.50 +<!-- window showing the filter options -->
  208.51 +<div id="MSearchSelectWindow"
  208.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  208.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  208.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  208.55 +</div>
  208.56 +
  208.57 +<!-- iframe showing the search results (closed by default) -->
  208.58 +<div id="MSearchResultsWindow">
  208.59 +<iframe src="javascript:void(0)" frameborder="0" 
  208.60 +        name="MSearchResults" id="MSearchResults">
  208.61 +</iframe>
  208.62 +</div>
  208.63 +
  208.64 +</div><!-- top -->
  208.65 +<div class="header">
  208.66 +  <div class="summary">
  208.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  208.68 +  <div class="headertitle">
  208.69 +<div class="title">UcxKey Struct Reference</div>  </div>
  208.70 +</div><!--header-->
  208.71 +<div class="contents">
  208.72 +
  208.73 +<p>Structure to publicly denote a key of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  
  208.74 + <a href="structUcxKey.html#details">More...</a></p>
  208.75 +
  208.76 +<p><code>#include &lt;<a class="el" href="map_8h_source.html">map.h</a>&gt;</code></p>
  208.77 +<table class="memberdecls">
  208.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  208.79 +Data Fields</h2></td></tr>
  208.80 +<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>
  208.81 +<tr class="memdesc:a6176109f25b34f3fa92bcfbc8ae7a88c"><td class="mdescLeft">&#160;</td><td class="mdescRight">The key data.  <a href="#a6176109f25b34f3fa92bcfbc8ae7a88c">More...</a><br /></td></tr>
  208.82 +<tr class="separator:a6176109f25b34f3fa92bcfbc8ae7a88c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  208.83 +<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>
  208.84 +<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>
  208.85 +<tr class="separator:abef01de37f355688f2ac797d2c280683"><td class="memSeparator" colspan="2">&#160;</td></tr>
  208.86 +<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>
  208.87 +<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>
  208.88 +<tr class="separator:aac9d372ac34a4cbd8459e2b04e505752"><td class="memSeparator" colspan="2">&#160;</td></tr>
  208.89 +</table>
  208.90 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  208.91 +<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>
  208.92 +</div><h2 class="groupheader">Field Documentation</h2>
  208.93 +<a id="a6176109f25b34f3fa92bcfbc8ae7a88c"></a>
  208.94 +<h2 class="memtitle"><span class="permalink"><a href="#a6176109f25b34f3fa92bcfbc8ae7a88c">&#9670;&nbsp;</a></span>data</h2>
  208.95 +
  208.96 +<div class="memitem">
  208.97 +<div class="memproto">
  208.98 +      <table class="memname">
  208.99 +        <tr>
 208.100 +          <td class="memname">const void* UcxKey::data</td>
 208.101 +        </tr>
 208.102 +      </table>
 208.103 +</div><div class="memdoc">
 208.104 +
 208.105 +<p>The key data. </p>
 208.106 +
 208.107 +</div>
 208.108 +</div>
 208.109 +<a id="aac9d372ac34a4cbd8459e2b04e505752"></a>
 208.110 +<h2 class="memtitle"><span class="permalink"><a href="#aac9d372ac34a4cbd8459e2b04e505752">&#9670;&nbsp;</a></span>hash</h2>
 208.111 +
 208.112 +<div class="memitem">
 208.113 +<div class="memproto">
 208.114 +      <table class="memname">
 208.115 +        <tr>
 208.116 +          <td class="memname">int UcxKey::hash</td>
 208.117 +        </tr>
 208.118 +      </table>
 208.119 +</div><div class="memdoc">
 208.120 +
 208.121 +<p>A cache for the hash value of the key data. </p>
 208.122 +
 208.123 +</div>
 208.124 +</div>
 208.125 +<a id="abef01de37f355688f2ac797d2c280683"></a>
 208.126 +<h2 class="memtitle"><span class="permalink"><a href="#abef01de37f355688f2ac797d2c280683">&#9670;&nbsp;</a></span>len</h2>
 208.127 +
 208.128 +<div class="memitem">
 208.129 +<div class="memproto">
 208.130 +      <table class="memname">
 208.131 +        <tr>
 208.132 +          <td class="memname">size_t UcxKey::len</td>
 208.133 +        </tr>
 208.134 +      </table>
 208.135 +</div><div class="memdoc">
 208.136 +
 208.137 +<p>The length of the key data. </p>
 208.138 +
 208.139 +</div>
 208.140 +</div>
 208.141 +<hr/>The documentation for this struct was generated from the following file:<ul>
 208.142 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="map_8h_source.html">map.h</a></li>
 208.143 +</ul>
 208.144 +</div><!-- contents -->
 208.145 +<!-- start footer part -->
 208.146 +<hr class="footer"/><address class="footer"><small>
 208.147 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 208.148 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 208.149 +</a> 1.8.13
 208.150 +</small></address>
 208.151 +</body>
 208.152 +</html>
   209.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   209.2 +++ b/docs/api-2.1/structUcxList.html	Sat Feb 06 19:11:44 2021 +0100
   209.3 @@ -0,0 +1,103 @@
   209.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   209.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   209.6 +<head>
   209.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   209.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   209.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  209.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  209.11 +<title>ucx: UcxList Struct Reference</title>
  209.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  209.13 +<script type="text/javascript" src="jquery.js"></script>
  209.14 +<script type="text/javascript" src="dynsections.js"></script>
  209.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  209.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  209.17 +<script type="text/javascript" src="search/search.js"></script>
  209.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  209.19 +</head>
  209.20 +<body>
  209.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  209.22 +<div id="titlearea">
  209.23 +<table cellspacing="0" cellpadding="0">
  209.24 + <tbody>
  209.25 + <tr style="height: 56px;">
  209.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  209.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  209.28 +   <div id="projectname">ucx
  209.29 +   </div>
  209.30 +   <div id="projectbrief">UAP Common Extensions</div>
  209.31 +  </td>
  209.32 + </tr>
  209.33 + </tbody>
  209.34 +</table>
  209.35 +</div>
  209.36 +<!-- end header part -->
  209.37 +<!-- Generated by Doxygen 1.8.13 -->
  209.38 +<script type="text/javascript">
  209.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  209.40 +</script>
  209.41 +<script type="text/javascript" src="menudata.js"></script>
  209.42 +<script type="text/javascript" src="menu.js"></script>
  209.43 +<script type="text/javascript">
  209.44 +$(function() {
  209.45 +  initMenu('',true,false,'search.php','Search');
  209.46 +  $(document).ready(function() { init_search(); });
  209.47 +});
  209.48 +</script>
  209.49 +<div id="main-nav"></div>
  209.50 +<!-- window showing the filter options -->
  209.51 +<div id="MSearchSelectWindow"
  209.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  209.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  209.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  209.55 +</div>
  209.56 +
  209.57 +<!-- iframe showing the search results (closed by default) -->
  209.58 +<div id="MSearchResultsWindow">
  209.59 +<iframe src="javascript:void(0)" frameborder="0" 
  209.60 +        name="MSearchResults" id="MSearchResults">
  209.61 +</iframe>
  209.62 +</div>
  209.63 +
  209.64 +</div><!-- top -->
  209.65 +<div class="header">
  209.66 +  <div class="summary">
  209.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  209.68 +  <div class="headertitle">
  209.69 +<div class="title">UcxList Struct Reference</div>  </div>
  209.70 +</div><!--header-->
  209.71 +<div class="contents">
  209.72 +
  209.73 +<p>UCX list structure.  
  209.74 + <a href="structUcxList.html#details">More...</a></p>
  209.75 +
  209.76 +<p><code>#include &lt;<a class="el" href="list_8h_source.html">list.h</a>&gt;</code></p>
  209.77 +<table class="memberdecls">
  209.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  209.79 +Data Fields</h2></td></tr>
  209.80 +<tr class="memitem:a4a44905121b6fc2a088084ce578a9ea2"><td class="memItemLeft" align="right" valign="top"><a id="a4a44905121b6fc2a088084ce578a9ea2"></a>
  209.81 +void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">data</a></td></tr>
  209.82 +<tr class="memdesc:a4a44905121b6fc2a088084ce578a9ea2"><td class="mdescLeft">&#160;</td><td class="mdescRight">List element payload. <br /></td></tr>
  209.83 +<tr class="separator:a4a44905121b6fc2a088084ce578a9ea2"><td class="memSeparator" colspan="2">&#160;</td></tr>
  209.84 +<tr class="memitem:a82a1818f1abf765b026fa91478569a8f"><td class="memItemLeft" align="right" valign="top"><a id="a82a1818f1abf765b026fa91478569a8f"></a>
  209.85 +<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>
  209.86 +<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>
  209.87 +<tr class="separator:a82a1818f1abf765b026fa91478569a8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
  209.88 +<tr class="memitem:a0f1fddce9088b9c1414745d0b1b5c08b"><td class="memItemLeft" align="right" valign="top"><a id="a0f1fddce9088b9c1414745d0b1b5c08b"></a>
  209.89 +<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>
  209.90 +<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>
  209.91 +<tr class="separator:a0f1fddce9088b9c1414745d0b1b5c08b"><td class="memSeparator" colspan="2">&#160;</td></tr>
  209.92 +</table>
  209.93 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  209.94 +<div class="textblock"><p>UCX list structure. </p>
  209.95 +</div><hr/>The documentation for this struct was generated from the following file:<ul>
  209.96 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="list_8h_source.html">list.h</a></li>
  209.97 +</ul>
  209.98 +</div><!-- contents -->
  209.99 +<!-- start footer part -->
 209.100 +<hr class="footer"/><address class="footer"><small>
 209.101 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 209.102 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 209.103 +</a> 1.8.13
 209.104 +</small></address>
 209.105 +</body>
 209.106 +</html>
   210.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   210.2 +++ b/docs/api-2.1/structUcxLogger.html	Sat Feb 06 19:11:44 2021 +0100
   210.3 @@ -0,0 +1,213 @@
   210.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   210.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   210.6 +<head>
   210.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   210.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   210.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  210.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  210.11 +<title>ucx: UcxLogger Struct Reference</title>
  210.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  210.13 +<script type="text/javascript" src="jquery.js"></script>
  210.14 +<script type="text/javascript" src="dynsections.js"></script>
  210.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  210.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  210.17 +<script type="text/javascript" src="search/search.js"></script>
  210.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  210.19 +</head>
  210.20 +<body>
  210.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  210.22 +<div id="titlearea">
  210.23 +<table cellspacing="0" cellpadding="0">
  210.24 + <tbody>
  210.25 + <tr style="height: 56px;">
  210.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  210.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  210.28 +   <div id="projectname">ucx
  210.29 +   </div>
  210.30 +   <div id="projectbrief">UAP Common Extensions</div>
  210.31 +  </td>
  210.32 + </tr>
  210.33 + </tbody>
  210.34 +</table>
  210.35 +</div>
  210.36 +<!-- end header part -->
  210.37 +<!-- Generated by Doxygen 1.8.13 -->
  210.38 +<script type="text/javascript">
  210.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  210.40 +</script>
  210.41 +<script type="text/javascript" src="menudata.js"></script>
  210.42 +<script type="text/javascript" src="menu.js"></script>
  210.43 +<script type="text/javascript">
  210.44 +$(function() {
  210.45 +  initMenu('',true,false,'search.php','Search');
  210.46 +  $(document).ready(function() { init_search(); });
  210.47 +});
  210.48 +</script>
  210.49 +<div id="main-nav"></div>
  210.50 +<!-- window showing the filter options -->
  210.51 +<div id="MSearchSelectWindow"
  210.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  210.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  210.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  210.55 +</div>
  210.56 +
  210.57 +<!-- iframe showing the search results (closed by default) -->
  210.58 +<div id="MSearchResultsWindow">
  210.59 +<iframe src="javascript:void(0)" frameborder="0" 
  210.60 +        name="MSearchResults" id="MSearchResults">
  210.61 +</iframe>
  210.62 +</div>
  210.63 +
  210.64 +</div><!-- top -->
  210.65 +<div class="header">
  210.66 +  <div class="summary">
  210.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  210.68 +  <div class="headertitle">
  210.69 +<div class="title">UcxLogger Struct Reference</div>  </div>
  210.70 +</div><!--header-->
  210.71 +<div class="contents">
  210.72 +
  210.73 +<p>The UCX Logger object.  
  210.74 + <a href="structUcxLogger.html#details">More...</a></p>
  210.75 +
  210.76 +<p><code>#include &lt;<a class="el" href="logging_8h_source.html">logging.h</a>&gt;</code></p>
  210.77 +<table class="memberdecls">
  210.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  210.79 +Data Fields</h2></td></tr>
  210.80 +<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>
  210.81 +<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>
  210.82 +<tr class="separator:a33fddf4791e8d49e479ecc78bf5d1b9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
  210.83 +<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>
  210.84 +<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>
  210.85 +<tr class="separator:ada13bba090a9dc4f8d6cd9be73c60930"><td class="memSeparator" colspan="2">&#160;</td></tr>
  210.86 +<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>
  210.87 +<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>
  210.88 +<tr class="separator:a086f75df0f6c81ec491f25c0a4d9262b"><td class="memSeparator" colspan="2">&#160;</td></tr>
  210.89 +<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>
  210.90 +<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>
  210.91 +<tr class="separator:a2e0ee94c25b2307096c7970280d189cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
  210.92 +<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>
  210.93 +<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>
  210.94 +<tr class="separator:a1de0db2e02dcf03366268f6943f8b97c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  210.95 +<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>
  210.96 +<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>
  210.97 +<tr class="separator:a187129f7bc6e5064b3d92a5f1217f396"><td class="memSeparator" colspan="2">&#160;</td></tr>
  210.98 +</table>
  210.99 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 210.100 +<div class="textblock"><p>The UCX Logger object. </p>
 210.101 +</div><h2 class="groupheader">Field Documentation</h2>
 210.102 +<a id="a086f75df0f6c81ec491f25c0a4d9262b"></a>
 210.103 +<h2 class="memtitle"><span class="permalink"><a href="#a086f75df0f6c81ec491f25c0a4d9262b">&#9670;&nbsp;</a></span>dateformat</h2>
 210.104 +
 210.105 +<div class="memitem">
 210.106 +<div class="memproto">
 210.107 +      <table class="memname">
 210.108 +        <tr>
 210.109 +          <td class="memname">char* UcxLogger::dateformat</td>
 210.110 +        </tr>
 210.111 +      </table>
 210.112 +</div><div class="memdoc">
 210.113 +
 210.114 +<p>The date format for timestamp outputs including the delimiter (default: <code>"%F %T %z "</code>). </p>
 210.115 +<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>
 210.116 +
 210.117 +</div>
 210.118 +</div>
 210.119 +<a id="a2e0ee94c25b2307096c7970280d189cd"></a>
 210.120 +<h2 class="memtitle"><span class="permalink"><a href="#a2e0ee94c25b2307096c7970280d189cd">&#9670;&nbsp;</a></span>level</h2>
 210.121 +
 210.122 +<div class="memitem">
 210.123 +<div class="memproto">
 210.124 +      <table class="memname">
 210.125 +        <tr>
 210.126 +          <td class="memname">unsigned int UcxLogger::level</td>
 210.127 +        </tr>
 210.128 +      </table>
 210.129 +</div><div class="memdoc">
 210.130 +
 210.131 +<p>The level, this logger operates on. </p>
 210.132 +<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>
 210.133 +
 210.134 +</div>
 210.135 +</div>
 210.136 +<a id="a187129f7bc6e5064b3d92a5f1217f396"></a>
 210.137 +<h2 class="memtitle"><span class="permalink"><a href="#a187129f7bc6e5064b3d92a5f1217f396">&#9670;&nbsp;</a></span>levels</h2>
 210.138 +
 210.139 +<div class="memitem">
 210.140 +<div class="memproto">
 210.141 +      <table class="memname">
 210.142 +        <tr>
 210.143 +          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* UcxLogger::levels</td>
 210.144 +        </tr>
 210.145 +      </table>
 210.146 +</div><div class="memdoc">
 210.147 +
 210.148 +<p>A map of valid log levels for this logger. </p>
 210.149 +<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>
 210.150 +<p>The exact data types are <code>unsigned int</code> for the key and <code>const char*</code> for the value.</p>
 210.151 +<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>
 210.152 +
 210.153 +</div>
 210.154 +</div>
 210.155 +<a id="a1de0db2e02dcf03366268f6943f8b97c"></a>
 210.156 +<h2 class="memtitle"><span class="permalink"><a href="#a1de0db2e02dcf03366268f6943f8b97c">&#9670;&nbsp;</a></span>mask</h2>
 210.157 +
 210.158 +<div class="memitem">
 210.159 +<div class="memproto">
 210.160 +      <table class="memname">
 210.161 +        <tr>
 210.162 +          <td class="memname">unsigned int UcxLogger::mask</td>
 210.163 +        </tr>
 210.164 +      </table>
 210.165 +</div><div class="memdoc">
 210.166 +
 210.167 +<p>A configuration mask for automatic output. </p>
 210.168 +<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>
 210.169 +
 210.170 +</div>
 210.171 +</div>
 210.172 +<a id="a33fddf4791e8d49e479ecc78bf5d1b9e"></a>
 210.173 +<h2 class="memtitle"><span class="permalink"><a href="#a33fddf4791e8d49e479ecc78bf5d1b9e">&#9670;&nbsp;</a></span>stream</h2>
 210.174 +
 210.175 +<div class="memitem">
 210.176 +<div class="memproto">
 210.177 +      <table class="memname">
 210.178 +        <tr>
 210.179 +          <td class="memname">void* UcxLogger::stream</td>
 210.180 +        </tr>
 210.181 +      </table>
 210.182 +</div><div class="memdoc">
 210.183 +
 210.184 +<p>The stream this logger writes its messages to. </p>
 210.185 +
 210.186 +</div>
 210.187 +</div>
 210.188 +<a id="ada13bba090a9dc4f8d6cd9be73c60930"></a>
 210.189 +<h2 class="memtitle"><span class="permalink"><a href="#ada13bba090a9dc4f8d6cd9be73c60930">&#9670;&nbsp;</a></span>writer</h2>
 210.190 +
 210.191 +<div class="memitem">
 210.192 +<div class="memproto">
 210.193 +      <table class="memname">
 210.194 +        <tr>
 210.195 +          <td class="memname"><a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a> UcxLogger::writer</td>
 210.196 +        </tr>
 210.197 +      </table>
 210.198 +</div><div class="memdoc">
 210.199 +
 210.200 +<p>The write function that shall be used. </p>
 210.201 +<p>For standard file or stdout loggers this might be standard fwrite (default). </p>
 210.202 +
 210.203 +</div>
 210.204 +</div>
 210.205 +<hr/>The documentation for this struct was generated from the following file:<ul>
 210.206 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="logging_8h_source.html">logging.h</a></li>
 210.207 +</ul>
 210.208 +</div><!-- contents -->
 210.209 +<!-- start footer part -->
 210.210 +<hr class="footer"/><address class="footer"><small>
 210.211 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 210.212 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 210.213 +</a> 1.8.13
 210.214 +</small></address>
 210.215 +</body>
 210.216 +</html>
   211.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   211.2 +++ b/docs/api-2.1/structUcxMap.html	Sat Feb 06 19:11:44 2021 +0100
   211.3 @@ -0,0 +1,168 @@
   211.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   211.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   211.6 +<head>
   211.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   211.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   211.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  211.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  211.11 +<title>ucx: UcxMap Struct Reference</title>
  211.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  211.13 +<script type="text/javascript" src="jquery.js"></script>
  211.14 +<script type="text/javascript" src="dynsections.js"></script>
  211.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  211.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  211.17 +<script type="text/javascript" src="search/search.js"></script>
  211.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  211.19 +</head>
  211.20 +<body>
  211.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  211.22 +<div id="titlearea">
  211.23 +<table cellspacing="0" cellpadding="0">
  211.24 + <tbody>
  211.25 + <tr style="height: 56px;">
  211.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  211.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  211.28 +   <div id="projectname">ucx
  211.29 +   </div>
  211.30 +   <div id="projectbrief">UAP Common Extensions</div>
  211.31 +  </td>
  211.32 + </tr>
  211.33 + </tbody>
  211.34 +</table>
  211.35 +</div>
  211.36 +<!-- end header part -->
  211.37 +<!-- Generated by Doxygen 1.8.13 -->
  211.38 +<script type="text/javascript">
  211.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  211.40 +</script>
  211.41 +<script type="text/javascript" src="menudata.js"></script>
  211.42 +<script type="text/javascript" src="menu.js"></script>
  211.43 +<script type="text/javascript">
  211.44 +$(function() {
  211.45 +  initMenu('',true,false,'search.php','Search');
  211.46 +  $(document).ready(function() { init_search(); });
  211.47 +});
  211.48 +</script>
  211.49 +<div id="main-nav"></div>
  211.50 +<!-- window showing the filter options -->
  211.51 +<div id="MSearchSelectWindow"
  211.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  211.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  211.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  211.55 +</div>
  211.56 +
  211.57 +<!-- iframe showing the search results (closed by default) -->
  211.58 +<div id="MSearchResultsWindow">
  211.59 +<iframe src="javascript:void(0)" frameborder="0" 
  211.60 +        name="MSearchResults" id="MSearchResults">
  211.61 +</iframe>
  211.62 +</div>
  211.63 +
  211.64 +</div><!-- top -->
  211.65 +<div class="header">
  211.66 +  <div class="summary">
  211.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  211.68 +  <div class="headertitle">
  211.69 +<div class="title">UcxMap Struct Reference</div>  </div>
  211.70 +</div><!--header-->
  211.71 +<div class="contents">
  211.72 +
  211.73 +<p>Structure for the UCX map.  
  211.74 + <a href="structUcxMap.html#details">More...</a></p>
  211.75 +
  211.76 +<p><code>#include &lt;<a class="el" href="map_8h_source.html">map.h</a>&gt;</code></p>
  211.77 +<table class="memberdecls">
  211.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  211.79 +Data Fields</h2></td></tr>
  211.80 +<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>
  211.81 +<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>
  211.82 +<tr class="separator:a531f3e481c1c331cf037b916192e974d"><td class="memSeparator" colspan="2">&#160;</td></tr>
  211.83 +<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>
  211.84 +<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>
  211.85 +<tr class="separator:a5792b5037c4f77ea3cb144b66c9b8790"><td class="memSeparator" colspan="2">&#160;</td></tr>
  211.86 +<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>
  211.87 +<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>
  211.88 +<tr class="separator:afe120846b26d99580a7ff1276464e838"><td class="memSeparator" colspan="2">&#160;</td></tr>
  211.89 +<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>
  211.90 +<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>
  211.91 +<tr class="separator:a14e9163f71f6c014dfa2103de70ae9cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
  211.92 +</table>
  211.93 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  211.94 +<div class="textblock"><p>Structure for the UCX map. </p>
  211.95 +</div><h2 class="groupheader">Field Documentation</h2>
  211.96 +<a id="a531f3e481c1c331cf037b916192e974d"></a>
  211.97 +<h2 class="memtitle"><span class="permalink"><a href="#a531f3e481c1c331cf037b916192e974d">&#9670;&nbsp;</a></span>allocator</h2>
  211.98 +
  211.99 +<div class="memitem">
 211.100 +<div class="memproto">
 211.101 +      <table class="memname">
 211.102 +        <tr>
 211.103 +          <td class="memname"><a class="el" href="structUcxAllocator.html">UcxAllocator</a>* UcxMap::allocator</td>
 211.104 +        </tr>
 211.105 +      </table>
 211.106 +</div><div class="memdoc">
 211.107 +
 211.108 +<p>An allocator that is used for the map elements. </p>
 211.109 +
 211.110 +</div>
 211.111 +</div>
 211.112 +<a id="a14e9163f71f6c014dfa2103de70ae9cd"></a>
 211.113 +<h2 class="memtitle"><span class="permalink"><a href="#a14e9163f71f6c014dfa2103de70ae9cd">&#9670;&nbsp;</a></span>count</h2>
 211.114 +
 211.115 +<div class="memitem">
 211.116 +<div class="memproto">
 211.117 +      <table class="memname">
 211.118 +        <tr>
 211.119 +          <td class="memname">size_t UcxMap::count</td>
 211.120 +        </tr>
 211.121 +      </table>
 211.122 +</div><div class="memdoc">
 211.123 +
 211.124 +<p>The count of elements currently stored in this map. </p>
 211.125 +
 211.126 +</div>
 211.127 +</div>
 211.128 +<a id="a5792b5037c4f77ea3cb144b66c9b8790"></a>
 211.129 +<h2 class="memtitle"><span class="permalink"><a href="#a5792b5037c4f77ea3cb144b66c9b8790">&#9670;&nbsp;</a></span>map</h2>
 211.130 +
 211.131 +<div class="memitem">
 211.132 +<div class="memproto">
 211.133 +      <table class="memname">
 211.134 +        <tr>
 211.135 +          <td class="memname"><a class="el" href="structUcxMapElement.html">UcxMapElement</a>** UcxMap::map</td>
 211.136 +        </tr>
 211.137 +      </table>
 211.138 +</div><div class="memdoc">
 211.139 +
 211.140 +<p>The array of map element lists. </p>
 211.141 +
 211.142 +</div>
 211.143 +</div>
 211.144 +<a id="afe120846b26d99580a7ff1276464e838"></a>
 211.145 +<h2 class="memtitle"><span class="permalink"><a href="#afe120846b26d99580a7ff1276464e838">&#9670;&nbsp;</a></span>size</h2>
 211.146 +
 211.147 +<div class="memitem">
 211.148 +<div class="memproto">
 211.149 +      <table class="memname">
 211.150 +        <tr>
 211.151 +          <td class="memname">size_t UcxMap::size</td>
 211.152 +        </tr>
 211.153 +      </table>
 211.154 +</div><div class="memdoc">
 211.155 +
 211.156 +<p>The size of the map is the length of the element list array. </p>
 211.157 +
 211.158 +</div>
 211.159 +</div>
 211.160 +<hr/>The documentation for this struct was generated from the following file:<ul>
 211.161 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="map_8h_source.html">map.h</a></li>
 211.162 +</ul>
 211.163 +</div><!-- contents -->
 211.164 +<!-- start footer part -->
 211.165 +<hr class="footer"/><address class="footer"><small>
 211.166 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 211.167 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 211.168 +</a> 1.8.13
 211.169 +</small></address>
 211.170 +</body>
 211.171 +</html>
   212.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   212.2 +++ b/docs/api-2.1/structUcxMapElement.html	Sat Feb 06 19:11:44 2021 +0100
   212.3 @@ -0,0 +1,149 @@
   212.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   212.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   212.6 +<head>
   212.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   212.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   212.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  212.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  212.11 +<title>ucx: UcxMapElement Struct Reference</title>
  212.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  212.13 +<script type="text/javascript" src="jquery.js"></script>
  212.14 +<script type="text/javascript" src="dynsections.js"></script>
  212.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  212.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  212.17 +<script type="text/javascript" src="search/search.js"></script>
  212.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  212.19 +</head>
  212.20 +<body>
  212.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  212.22 +<div id="titlearea">
  212.23 +<table cellspacing="0" cellpadding="0">
  212.24 + <tbody>
  212.25 + <tr style="height: 56px;">
  212.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  212.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  212.28 +   <div id="projectname">ucx
  212.29 +   </div>
  212.30 +   <div id="projectbrief">UAP Common Extensions</div>
  212.31 +  </td>
  212.32 + </tr>
  212.33 + </tbody>
  212.34 +</table>
  212.35 +</div>
  212.36 +<!-- end header part -->
  212.37 +<!-- Generated by Doxygen 1.8.13 -->
  212.38 +<script type="text/javascript">
  212.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  212.40 +</script>
  212.41 +<script type="text/javascript" src="menudata.js"></script>
  212.42 +<script type="text/javascript" src="menu.js"></script>
  212.43 +<script type="text/javascript">
  212.44 +$(function() {
  212.45 +  initMenu('',true,false,'search.php','Search');
  212.46 +  $(document).ready(function() { init_search(); });
  212.47 +});
  212.48 +</script>
  212.49 +<div id="main-nav"></div>
  212.50 +<!-- window showing the filter options -->
  212.51 +<div id="MSearchSelectWindow"
  212.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  212.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  212.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  212.55 +</div>
  212.56 +
  212.57 +<!-- iframe showing the search results (closed by default) -->
  212.58 +<div id="MSearchResultsWindow">
  212.59 +<iframe src="javascript:void(0)" frameborder="0" 
  212.60 +        name="MSearchResults" id="MSearchResults">
  212.61 +</iframe>
  212.62 +</div>
  212.63 +
  212.64 +</div><!-- top -->
  212.65 +<div class="header">
  212.66 +  <div class="summary">
  212.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  212.68 +  <div class="headertitle">
  212.69 +<div class="title">UcxMapElement Struct Reference</div>  </div>
  212.70 +</div><!--header-->
  212.71 +<div class="contents">
  212.72 +
  212.73 +<p>Structure for an element of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  
  212.74 + <a href="structUcxMapElement.html#details">More...</a></p>
  212.75 +
  212.76 +<p><code>#include &lt;<a class="el" href="map_8h_source.html">map.h</a>&gt;</code></p>
  212.77 +<table class="memberdecls">
  212.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  212.79 +Data Fields</h2></td></tr>
  212.80 +<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>
  212.81 +<tr class="memdesc:abbd7f3bf5beef370f702d2d5bb07733c"><td class="mdescLeft">&#160;</td><td class="mdescRight">The value data.  <a href="#abbd7f3bf5beef370f702d2d5bb07733c">More...</a><br /></td></tr>
  212.82 +<tr class="separator:abbd7f3bf5beef370f702d2d5bb07733c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  212.83 +<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>
  212.84 +<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>
  212.85 +<tr class="separator:a99fe8188b0889201d70ff5f922deef51"><td class="memSeparator" colspan="2">&#160;</td></tr>
  212.86 +<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>
  212.87 +<tr class="memdesc:aa446141b708e106e2c8de1303318187c"><td class="mdescLeft">&#160;</td><td class="mdescRight">The corresponding key.  <a href="#aa446141b708e106e2c8de1303318187c">More...</a><br /></td></tr>
  212.88 +<tr class="separator:aa446141b708e106e2c8de1303318187c"><td class="memSeparator" colspan="2">&#160;</td></tr>
  212.89 +</table>
  212.90 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  212.91 +<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>
  212.92 +</div><h2 class="groupheader">Field Documentation</h2>
  212.93 +<a id="abbd7f3bf5beef370f702d2d5bb07733c"></a>
  212.94 +<h2 class="memtitle"><span class="permalink"><a href="#abbd7f3bf5beef370f702d2d5bb07733c">&#9670;&nbsp;</a></span>data</h2>
  212.95 +
  212.96 +<div class="memitem">
  212.97 +<div class="memproto">
  212.98 +      <table class="memname">
  212.99 +        <tr>
 212.100 +          <td class="memname">void* UcxMapElement::data</td>
 212.101 +        </tr>
 212.102 +      </table>
 212.103 +</div><div class="memdoc">
 212.104 +
 212.105 +<p>The value data. </p>
 212.106 +
 212.107 +</div>
 212.108 +</div>
 212.109 +<a id="aa446141b708e106e2c8de1303318187c"></a>
 212.110 +<h2 class="memtitle"><span class="permalink"><a href="#aa446141b708e106e2c8de1303318187c">&#9670;&nbsp;</a></span>key</h2>
 212.111 +
 212.112 +<div class="memitem">
 212.113 +<div class="memproto">
 212.114 +      <table class="memname">
 212.115 +        <tr>
 212.116 +          <td class="memname">struct <a class="el" href="structUcxMapKey.html">UcxMapKey</a> UcxMapElement::key</td>
 212.117 +        </tr>
 212.118 +      </table>
 212.119 +</div><div class="memdoc">
 212.120 +
 212.121 +<p>The corresponding key. </p>
 212.122 +
 212.123 +</div>
 212.124 +</div>
 212.125 +<a id="a99fe8188b0889201d70ff5f922deef51"></a>
 212.126 +<h2 class="memtitle"><span class="permalink"><a href="#a99fe8188b0889201d70ff5f922deef51">&#9670;&nbsp;</a></span>next</h2>
 212.127 +
 212.128 +<div class="memitem">
 212.129 +<div class="memproto">
 212.130 +      <table class="memname">
 212.131 +        <tr>
 212.132 +          <td class="memname"><a class="el" href="structUcxMapElement.html">UcxMapElement</a>* UcxMapElement::next</td>
 212.133 +        </tr>
 212.134 +      </table>
 212.135 +</div><div class="memdoc">
 212.136 +
 212.137 +<p>A pointer to the next element in the current list. </p>
 212.138 +
 212.139 +</div>
 212.140 +</div>
 212.141 +<hr/>The documentation for this struct was generated from the following file:<ul>
 212.142 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="map_8h_source.html">map.h</a></li>
 212.143 +</ul>
 212.144 +</div><!-- contents -->
 212.145 +<!-- start footer part -->
 212.146 +<hr class="footer"/><address class="footer"><small>
 212.147 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 212.148 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 212.149 +</a> 1.8.13
 212.150 +</small></address>
 212.151 +</body>
 212.152 +</html>
   213.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   213.2 +++ b/docs/api-2.1/structUcxMapIterator.html	Sat Feb 06 19:11:44 2021 +0100
   213.3 @@ -0,0 +1,150 @@
   213.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   213.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   213.6 +<head>
   213.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   213.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   213.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  213.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  213.11 +<title>ucx: UcxMapIterator Struct Reference</title>
  213.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  213.13 +<script type="text/javascript" src="jquery.js"></script>
  213.14 +<script type="text/javascript" src="dynsections.js"></script>
  213.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  213.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  213.17 +<script type="text/javascript" src="search/search.js"></script>
  213.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  213.19 +</head>
  213.20 +<body>
  213.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  213.22 +<div id="titlearea">
  213.23 +<table cellspacing="0" cellpadding="0">
  213.24 + <tbody>
  213.25 + <tr style="height: 56px;">
  213.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  213.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  213.28 +   <div id="projectname">ucx
  213.29 +   </div>
  213.30 +   <div id="projectbrief">UAP Common Extensions</div>
  213.31 +  </td>
  213.32 + </tr>
  213.33 + </tbody>
  213.34 +</table>
  213.35 +</div>
  213.36 +<!-- end header part -->
  213.37 +<!-- Generated by Doxygen 1.8.13 -->
  213.38 +<script type="text/javascript">
  213.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  213.40 +</script>
  213.41 +<script type="text/javascript" src="menudata.js"></script>
  213.42 +<script type="text/javascript" src="menu.js"></script>
  213.43 +<script type="text/javascript">
  213.44 +$(function() {
  213.45 +  initMenu('',true,false,'search.php','Search');
  213.46 +  $(document).ready(function() { init_search(); });
  213.47 +});
  213.48 +</script>
  213.49 +<div id="main-nav"></div>
  213.50 +<!-- window showing the filter options -->
  213.51 +<div id="MSearchSelectWindow"
  213.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  213.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  213.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  213.55 +</div>
  213.56 +
  213.57 +<!-- iframe showing the search results (closed by default) -->
  213.58 +<div id="MSearchResultsWindow">
  213.59 +<iframe src="javascript:void(0)" frameborder="0" 
  213.60 +        name="MSearchResults" id="MSearchResults">
  213.61 +</iframe>
  213.62 +</div>
  213.63 +
  213.64 +</div><!-- top -->
  213.65 +<div class="header">
  213.66 +  <div class="summary">
  213.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  213.68 +  <div class="headertitle">
  213.69 +<div class="title">UcxMapIterator Struct Reference</div>  </div>
  213.70 +</div><!--header-->
  213.71 +<div class="contents">
  213.72 +
  213.73 +<p>Structure for an iterator over a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  
  213.74 + <a href="structUcxMapIterator.html#details">More...</a></p>
  213.75 +
  213.76 +<p><code>#include &lt;<a class="el" href="map_8h_source.html">map.h</a>&gt;</code></p>
  213.77 +<table class="memberdecls">
  213.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  213.79 +Data Fields</h2></td></tr>
  213.80 +<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>
  213.81 +<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>
  213.82 +<tr class="separator:af88d6e22547d09fe1d665dd650dcdb95"><td class="memSeparator" colspan="2">&#160;</td></tr>
  213.83 +<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>
  213.84 +<tr class="memdesc:af1fc40f899f37280adb5b85acf6e742f"><td class="mdescLeft">&#160;</td><td class="mdescRight">The current map element.  <a href="#af1fc40f899f37280adb5b85acf6e742f">More...</a><br /></td></tr>
  213.85 +<tr class="separator:af1fc40f899f37280adb5b85acf6e742f"><td class="memSeparator" colspan="2">&#160;</td></tr>
  213.86 +<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>
  213.87 +<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>
  213.88 +<tr class="separator:ac2376545c8816dd6895de4995e558c65"><td class="memSeparator" colspan="2">&#160;</td></tr>
  213.89 +</table>
  213.90 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  213.91 +<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>
  213.92 +</div><h2 class="groupheader">Field Documentation</h2>
  213.93 +<a id="af1fc40f899f37280adb5b85acf6e742f"></a>
  213.94 +<h2 class="memtitle"><span class="permalink"><a href="#af1fc40f899f37280adb5b85acf6e742f">&#9670;&nbsp;</a></span>cur</h2>
  213.95 +
  213.96 +<div class="memitem">
  213.97 +<div class="memproto">
  213.98 +      <table class="memname">
  213.99 +        <tr>
 213.100 +          <td class="memname"><a class="el" href="structUcxMapElement.html">UcxMapElement</a>* UcxMapIterator::cur</td>
 213.101 +        </tr>
 213.102 +      </table>
 213.103 +</div><div class="memdoc">
 213.104 +
 213.105 +<p>The current map element. </p>
 213.106 +
 213.107 +</div>
 213.108 +</div>
 213.109 +<a id="ac2376545c8816dd6895de4995e558c65"></a>
 213.110 +<h2 class="memtitle"><span class="permalink"><a href="#ac2376545c8816dd6895de4995e558c65">&#9670;&nbsp;</a></span>index</h2>
 213.111 +
 213.112 +<div class="memitem">
 213.113 +<div class="memproto">
 213.114 +      <table class="memname">
 213.115 +        <tr>
 213.116 +          <td class="memname">size_t UcxMapIterator::index</td>
 213.117 +        </tr>
 213.118 +      </table>
 213.119 +</div><div class="memdoc">
 213.120 +
 213.121 +<p>The current index of the element list array. </p>
 213.122 +<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>
 213.123 +
 213.124 +</div>
 213.125 +</div>
 213.126 +<a id="af88d6e22547d09fe1d665dd650dcdb95"></a>
 213.127 +<h2 class="memtitle"><span class="permalink"><a href="#af88d6e22547d09fe1d665dd650dcdb95">&#9670;&nbsp;</a></span>map</h2>
 213.128 +
 213.129 +<div class="memitem">
 213.130 +<div class="memproto">
 213.131 +      <table class="memname">
 213.132 +        <tr>
 213.133 +          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a> const* UcxMapIterator::map</td>
 213.134 +        </tr>
 213.135 +      </table>
 213.136 +</div><div class="memdoc">
 213.137 +
 213.138 +<p>The map to iterate over. </p>
 213.139 +
 213.140 +</div>
 213.141 +</div>
 213.142 +<hr/>The documentation for this struct was generated from the following file:<ul>
 213.143 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="map_8h_source.html">map.h</a></li>
 213.144 +</ul>
 213.145 +</div><!-- contents -->
 213.146 +<!-- start footer part -->
 213.147 +<hr class="footer"/><address class="footer"><small>
 213.148 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 213.149 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 213.150 +</a> 1.8.13
 213.151 +</small></address>
 213.152 +</body>
 213.153 +</html>
   214.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   214.2 +++ b/docs/api-2.1/structUcxMapKey.html	Sat Feb 06 19:11:44 2021 +0100
   214.3 @@ -0,0 +1,149 @@
   214.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   214.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   214.6 +<head>
   214.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   214.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   214.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  214.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  214.11 +<title>ucx: UcxMapKey Struct Reference</title>
  214.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  214.13 +<script type="text/javascript" src="jquery.js"></script>
  214.14 +<script type="text/javascript" src="dynsections.js"></script>
  214.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  214.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  214.17 +<script type="text/javascript" src="search/search.js"></script>
  214.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  214.19 +</head>
  214.20 +<body>
  214.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  214.22 +<div id="titlearea">
  214.23 +<table cellspacing="0" cellpadding="0">
  214.24 + <tbody>
  214.25 + <tr style="height: 56px;">
  214.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  214.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  214.28 +   <div id="projectname">ucx
  214.29 +   </div>
  214.30 +   <div id="projectbrief">UAP Common Extensions</div>
  214.31 +  </td>
  214.32 + </tr>
  214.33 + </tbody>
  214.34 +</table>
  214.35 +</div>
  214.36 +<!-- end header part -->
  214.37 +<!-- Generated by Doxygen 1.8.13 -->
  214.38 +<script type="text/javascript">
  214.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  214.40 +</script>
  214.41 +<script type="text/javascript" src="menudata.js"></script>
  214.42 +<script type="text/javascript" src="menu.js"></script>
  214.43 +<script type="text/javascript">
  214.44 +$(function() {
  214.45 +  initMenu('',true,false,'search.php','Search');
  214.46 +  $(document).ready(function() { init_search(); });
  214.47 +});
  214.48 +</script>
  214.49 +<div id="main-nav"></div>
  214.50 +<!-- window showing the filter options -->
  214.51 +<div id="MSearchSelectWindow"
  214.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  214.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  214.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  214.55 +</div>
  214.56 +
  214.57 +<!-- iframe showing the search results (closed by default) -->
  214.58 +<div id="MSearchResultsWindow">
  214.59 +<iframe src="javascript:void(0)" frameborder="0" 
  214.60 +        name="MSearchResults" id="MSearchResults">
  214.61 +</iframe>
  214.62 +</div>
  214.63 +
  214.64 +</div><!-- top -->
  214.65 +<div class="header">
  214.66 +  <div class="summary">
  214.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  214.68 +  <div class="headertitle">
  214.69 +<div class="title">UcxMapKey Struct Reference</div>  </div>
  214.70 +</div><!--header-->
  214.71 +<div class="contents">
  214.72 +
  214.73 +<p>Internal structure for a key of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  
  214.74 + <a href="structUcxMapKey.html#details">More...</a></p>
  214.75 +
  214.76 +<p><code>#include &lt;<a class="el" href="map_8h_source.html">map.h</a>&gt;</code></p>
  214.77 +<table class="memberdecls">
  214.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  214.79 +Data Fields</h2></td></tr>
  214.80 +<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>
  214.81 +<tr class="memdesc:ab71d1841e4f538628c00f782267fb6d5"><td class="mdescLeft">&#160;</td><td class="mdescRight">The key data.  <a href="#ab71d1841e4f538628c00f782267fb6d5">More...</a><br /></td></tr>
  214.82 +<tr class="separator:ab71d1841e4f538628c00f782267fb6d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
  214.83 +<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>
  214.84 +<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>
  214.85 +<tr class="separator:a504d46caa45c79cd87ff8cd835654270"><td class="memSeparator" colspan="2">&#160;</td></tr>
  214.86 +<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>
  214.87 +<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>
  214.88 +<tr class="separator:a34c1f8fec98174583944fffd30e7c913"><td class="memSeparator" colspan="2">&#160;</td></tr>
  214.89 +</table>
  214.90 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  214.91 +<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>
  214.92 +</div><h2 class="groupheader">Field Documentation</h2>
  214.93 +<a id="ab71d1841e4f538628c00f782267fb6d5"></a>
  214.94 +<h2 class="memtitle"><span class="permalink"><a href="#ab71d1841e4f538628c00f782267fb6d5">&#9670;&nbsp;</a></span>data</h2>
  214.95 +
  214.96 +<div class="memitem">
  214.97 +<div class="memproto">
  214.98 +      <table class="memname">
  214.99 +        <tr>
 214.100 +          <td class="memname">void* UcxMapKey::data</td>
 214.101 +        </tr>
 214.102 +      </table>
 214.103 +</div><div class="memdoc">
 214.104 +
 214.105 +<p>The key data. </p>
 214.106 +
 214.107 +</div>
 214.108 +</div>
 214.109 +<a id="a34c1f8fec98174583944fffd30e7c913"></a>
 214.110 +<h2 class="memtitle"><span class="permalink"><a href="#a34c1f8fec98174583944fffd30e7c913">&#9670;&nbsp;</a></span>hash</h2>
 214.111 +
 214.112 +<div class="memitem">
 214.113 +<div class="memproto">
 214.114 +      <table class="memname">
 214.115 +        <tr>
 214.116 +          <td class="memname">int UcxMapKey::hash</td>
 214.117 +        </tr>
 214.118 +      </table>
 214.119 +</div><div class="memdoc">
 214.120 +
 214.121 +<p>The hash value of the key data. </p>
 214.122 +
 214.123 +</div>
 214.124 +</div>
 214.125 +<a id="a504d46caa45c79cd87ff8cd835654270"></a>
 214.126 +<h2 class="memtitle"><span class="permalink"><a href="#a504d46caa45c79cd87ff8cd835654270">&#9670;&nbsp;</a></span>len</h2>
 214.127 +
 214.128 +<div class="memitem">
 214.129 +<div class="memproto">
 214.130 +      <table class="memname">
 214.131 +        <tr>
 214.132 +          <td class="memname">size_t UcxMapKey::len</td>
 214.133 +        </tr>
 214.134 +      </table>
 214.135 +</div><div class="memdoc">
 214.136 +
 214.137 +<p>The length of the key data. </p>
 214.138 +
 214.139 +</div>
 214.140 +</div>
 214.141 +<hr/>The documentation for this struct was generated from the following file:<ul>
 214.142 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="map_8h_source.html">map.h</a></li>
 214.143 +</ul>
 214.144 +</div><!-- contents -->
 214.145 +<!-- start footer part -->
 214.146 +<hr class="footer"/><address class="footer"><small>
 214.147 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 214.148 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 214.149 +</a> 1.8.13
 214.150 +</small></address>
 214.151 +</body>
 214.152 +</html>
   215.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   215.2 +++ b/docs/api-2.1/structUcxMempool.html	Sat Feb 06 19:11:44 2021 +0100
   215.3 @@ -0,0 +1,153 @@
   215.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   215.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   215.6 +<head>
   215.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   215.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   215.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  215.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  215.11 +<title>ucx: UcxMempool Struct Reference</title>
  215.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  215.13 +<script type="text/javascript" src="jquery.js"></script>
  215.14 +<script type="text/javascript" src="dynsections.js"></script>
  215.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  215.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  215.17 +<script type="text/javascript" src="search/search.js"></script>
  215.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  215.19 +</head>
  215.20 +<body>
  215.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  215.22 +<div id="titlearea">
  215.23 +<table cellspacing="0" cellpadding="0">
  215.24 + <tbody>
  215.25 + <tr style="height: 56px;">
  215.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  215.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  215.28 +   <div id="projectname">ucx
  215.29 +   </div>
  215.30 +   <div id="projectbrief">UAP Common Extensions</div>
  215.31 +  </td>
  215.32 + </tr>
  215.33 + </tbody>
  215.34 +</table>
  215.35 +</div>
  215.36 +<!-- end header part -->
  215.37 +<!-- Generated by Doxygen 1.8.13 -->
  215.38 +<script type="text/javascript">
  215.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  215.40 +</script>
  215.41 +<script type="text/javascript" src="menudata.js"></script>
  215.42 +<script type="text/javascript" src="menu.js"></script>
  215.43 +<script type="text/javascript">
  215.44 +$(function() {
  215.45 +  initMenu('',true,false,'search.php','Search');
  215.46 +  $(document).ready(function() { init_search(); });
  215.47 +});
  215.48 +</script>
  215.49 +<div id="main-nav"></div>
  215.50 +<!-- window showing the filter options -->
  215.51 +<div id="MSearchSelectWindow"
  215.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  215.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  215.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  215.55 +</div>
  215.56 +
  215.57 +<!-- iframe showing the search results (closed by default) -->
  215.58 +<div id="MSearchResultsWindow">
  215.59 +<iframe src="javascript:void(0)" frameborder="0" 
  215.60 +        name="MSearchResults" id="MSearchResults">
  215.61 +</iframe>
  215.62 +</div>
  215.63 +
  215.64 +</div><!-- top -->
  215.65 +<div class="header">
  215.66 +  <div class="summary">
  215.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  215.68 +  <div class="headertitle">
  215.69 +<div class="title">UcxMempool Struct Reference</div>  </div>
  215.70 +</div><!--header-->
  215.71 +<div class="contents">
  215.72 +
  215.73 +<p>UCX mempool structure.  
  215.74 + <a href="structUcxMempool.html#details">More...</a></p>
  215.75 +
  215.76 +<p><code>#include &lt;<a class="el" href="mempool_8h_source.html">mempool.h</a>&gt;</code></p>
  215.77 +<table class="memberdecls">
  215.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  215.79 +Data Fields</h2></td></tr>
  215.80 +<tr class="memitem:ac45fd1e9269399e4c434d6bdaa770d92"><td class="memItemLeft" align="right" valign="top"><a id="ac45fd1e9269399e4c434d6bdaa770d92"></a>
  215.81 +<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>
  215.82 +<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>
  215.83 +<tr class="separator:ac45fd1e9269399e4c434d6bdaa770d92"><td class="memSeparator" colspan="2">&#160;</td></tr>
  215.84 +<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>
  215.85 +<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>
  215.86 +<tr class="separator:ae98c1b0150bb119ee0a8506a6f310d6e"><td class="memSeparator" colspan="2">&#160;</td></tr>
  215.87 +<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>
  215.88 +<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>
  215.89 +<tr class="separator:aa3a73ab231e1bc207d526f46f1c1e23a"><td class="memSeparator" colspan="2">&#160;</td></tr>
  215.90 +<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>
  215.91 +<tr class="memdesc:a304729986f2894971d0469e71e196bf0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Memory pool size.  <a href="#a304729986f2894971d0469e71e196bf0">More...</a><br /></td></tr>
  215.92 +<tr class="separator:a304729986f2894971d0469e71e196bf0"><td class="memSeparator" colspan="2">&#160;</td></tr>
  215.93 +</table>
  215.94 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  215.95 +<div class="textblock"><p>UCX mempool structure. </p>
  215.96 +</div><h2 class="groupheader">Field Documentation</h2>
  215.97 +<a id="ae98c1b0150bb119ee0a8506a6f310d6e"></a>
  215.98 +<h2 class="memtitle"><span class="permalink"><a href="#ae98c1b0150bb119ee0a8506a6f310d6e">&#9670;&nbsp;</a></span>data</h2>
  215.99 +
 215.100 +<div class="memitem">
 215.101 +<div class="memproto">
 215.102 +      <table class="memname">
 215.103 +        <tr>
 215.104 +          <td class="memname">void** UcxMempool::data</td>
 215.105 +        </tr>
 215.106 +      </table>
 215.107 +</div><div class="memdoc">
 215.108 +
 215.109 +<p>List of pointers to pooled memory. </p>
 215.110 +
 215.111 +</div>
 215.112 +</div>
 215.113 +<a id="aa3a73ab231e1bc207d526f46f1c1e23a"></a>
 215.114 +<h2 class="memtitle"><span class="permalink"><a href="#aa3a73ab231e1bc207d526f46f1c1e23a">&#9670;&nbsp;</a></span>ndata</h2>
 215.115 +
 215.116 +<div class="memitem">
 215.117 +<div class="memproto">
 215.118 +      <table class="memname">
 215.119 +        <tr>
 215.120 +          <td class="memname">size_t UcxMempool::ndata</td>
 215.121 +        </tr>
 215.122 +      </table>
 215.123 +</div><div class="memdoc">
 215.124 +
 215.125 +<p>Count of pooled memory items. </p>
 215.126 +
 215.127 +</div>
 215.128 +</div>
 215.129 +<a id="a304729986f2894971d0469e71e196bf0"></a>
 215.130 +<h2 class="memtitle"><span class="permalink"><a href="#a304729986f2894971d0469e71e196bf0">&#9670;&nbsp;</a></span>size</h2>
 215.131 +
 215.132 +<div class="memitem">
 215.133 +<div class="memproto">
 215.134 +      <table class="memname">
 215.135 +        <tr>
 215.136 +          <td class="memname">size_t UcxMempool::size</td>
 215.137 +        </tr>
 215.138 +      </table>
 215.139 +</div><div class="memdoc">
 215.140 +
 215.141 +<p>Memory pool size. </p>
 215.142 +
 215.143 +</div>
 215.144 +</div>
 215.145 +<hr/>The documentation for this struct was generated from the following file:<ul>
 215.146 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="mempool_8h_source.html">mempool.h</a></li>
 215.147 +</ul>
 215.148 +</div><!-- contents -->
 215.149 +<!-- start footer part -->
 215.150 +<hr class="footer"/><address class="footer"><small>
 215.151 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 215.152 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 215.153 +</a> 1.8.13
 215.154 +</small></address>
 215.155 +</body>
 215.156 +</html>
   216.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   216.2 +++ b/docs/api-2.1/structUcxProperties.html	Sat Feb 06 19:11:44 2021 +0100
   216.3 @@ -0,0 +1,313 @@
   216.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   216.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   216.6 +<head>
   216.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   216.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   216.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  216.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  216.11 +<title>ucx: UcxProperties Struct Reference</title>
  216.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  216.13 +<script type="text/javascript" src="jquery.js"></script>
  216.14 +<script type="text/javascript" src="dynsections.js"></script>
  216.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  216.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  216.17 +<script type="text/javascript" src="search/search.js"></script>
  216.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  216.19 +</head>
  216.20 +<body>
  216.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  216.22 +<div id="titlearea">
  216.23 +<table cellspacing="0" cellpadding="0">
  216.24 + <tbody>
  216.25 + <tr style="height: 56px;">
  216.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  216.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  216.28 +   <div id="projectname">ucx
  216.29 +   </div>
  216.30 +   <div id="projectbrief">UAP Common Extensions</div>
  216.31 +  </td>
  216.32 + </tr>
  216.33 + </tbody>
  216.34 +</table>
  216.35 +</div>
  216.36 +<!-- end header part -->
  216.37 +<!-- Generated by Doxygen 1.8.13 -->
  216.38 +<script type="text/javascript">
  216.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  216.40 +</script>
  216.41 +<script type="text/javascript" src="menudata.js"></script>
  216.42 +<script type="text/javascript" src="menu.js"></script>
  216.43 +<script type="text/javascript">
  216.44 +$(function() {
  216.45 +  initMenu('',true,false,'search.php','Search');
  216.46 +  $(document).ready(function() { init_search(); });
  216.47 +});
  216.48 +</script>
  216.49 +<div id="main-nav"></div>
  216.50 +<!-- window showing the filter options -->
  216.51 +<div id="MSearchSelectWindow"
  216.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  216.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  216.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  216.55 +</div>
  216.56 +
  216.57 +<!-- iframe showing the search results (closed by default) -->
  216.58 +<div id="MSearchResultsWindow">
  216.59 +<iframe src="javascript:void(0)" frameborder="0" 
  216.60 +        name="MSearchResults" id="MSearchResults">
  216.61 +</iframe>
  216.62 +</div>
  216.63 +
  216.64 +</div><!-- top -->
  216.65 +<div class="header">
  216.66 +  <div class="summary">
  216.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  216.68 +  <div class="headertitle">
  216.69 +<div class="title">UcxProperties Struct Reference</div>  </div>
  216.70 +</div><!--header-->
  216.71 +<div class="contents">
  216.72 +
  216.73 +<p><a class="el" href="structUcxProperties.html" title="UcxProperties object for parsing properties data. ">UcxProperties</a> object for parsing properties data.  
  216.74 + <a href="structUcxProperties.html#details">More...</a></p>
  216.75 +
  216.76 +<p><code>#include &lt;<a class="el" href="properties_8h_source.html">properties.h</a>&gt;</code></p>
  216.77 +<table class="memberdecls">
  216.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  216.79 +Data Fields</h2></td></tr>
  216.80 +<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>
  216.81 +<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>
  216.82 +<tr class="separator:a6bb4d29686df41a0f42641ee15232bfd"><td class="memSeparator" colspan="2">&#160;</td></tr>
  216.83 +<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>
  216.84 +<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>
  216.85 +<tr class="separator:a4e7524434525267e29f493a25dcca6b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
  216.86 +<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>
  216.87 +<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>
  216.88 +<tr class="separator:addd36ac8e5e42241c0a57453633970db"><td class="memSeparator" colspan="2">&#160;</td></tr>
  216.89 +<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>
  216.90 +<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>
  216.91 +<tr class="separator:a68556d4260153f58dde44e4c365edce6"><td class="memSeparator" colspan="2">&#160;</td></tr>
  216.92 +<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>
  216.93 +<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>
  216.94 +<tr class="separator:a8a81853d5903bee2f4e1fa53fdffae6e"><td class="memSeparator" colspan="2">&#160;</td></tr>
  216.95 +<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>
  216.96 +<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>
  216.97 +<tr class="separator:a5af10131ea9f679b4ee174499f92e210"><td class="memSeparator" colspan="2">&#160;</td></tr>
  216.98 +<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>
  216.99 +<tr class="memdesc:a34f71a6ab6dcb6892e3b4eb802e75bff"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parser error code.  <a href="#a34f71a6ab6dcb6892e3b4eb802e75bff">More...</a><br /></td></tr>
 216.100 +<tr class="separator:a34f71a6ab6dcb6892e3b4eb802e75bff"><td class="memSeparator" colspan="2">&#160;</td></tr>
 216.101 +<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>
 216.102 +<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>
 216.103 +<tr class="separator:af6adb3f69616cf9d2bb5ea7b4d837ca5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 216.104 +<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>
 216.105 +<tr class="memdesc:afaa2e6a289fa6949b7b01df35fa5def8"><td class="mdescLeft">&#160;</td><td class="mdescRight">The first comment character.  <a href="#afaa2e6a289fa6949b7b01df35fa5def8">More...</a><br /></td></tr>
 216.106 +<tr class="separator:afaa2e6a289fa6949b7b01df35fa5def8"><td class="memSeparator" colspan="2">&#160;</td></tr>
 216.107 +<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>
 216.108 +<tr class="memdesc:a9ea7ecb414ca8bc7bef62cdd19cc6363"><td class="mdescLeft">&#160;</td><td class="mdescRight">The second comment character.  <a href="#a9ea7ecb414ca8bc7bef62cdd19cc6363">More...</a><br /></td></tr>
 216.109 +<tr class="separator:a9ea7ecb414ca8bc7bef62cdd19cc6363"><td class="memSeparator" colspan="2">&#160;</td></tr>
 216.110 +<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>
 216.111 +<tr class="memdesc:a5f3e561e32bac03e36a191a6940cca92"><td class="mdescLeft">&#160;</td><td class="mdescRight">The third comment character.  <a href="#a5f3e561e32bac03e36a191a6940cca92">More...</a><br /></td></tr>
 216.112 +<tr class="separator:a5f3e561e32bac03e36a191a6940cca92"><td class="memSeparator" colspan="2">&#160;</td></tr>
 216.113 +</table>
 216.114 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 216.115 +<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>
 216.116 +<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>
 216.117 +</div><h2 class="groupheader">Field Documentation</h2>
 216.118 +<a id="a6bb4d29686df41a0f42641ee15232bfd"></a>
 216.119 +<h2 class="memtitle"><span class="permalink"><a href="#a6bb4d29686df41a0f42641ee15232bfd">&#9670;&nbsp;</a></span>buffer</h2>
 216.120 +
 216.121 +<div class="memitem">
 216.122 +<div class="memproto">
 216.123 +      <table class="memname">
 216.124 +        <tr>
 216.125 +          <td class="memname">char* UcxProperties::buffer</td>
 216.126 +        </tr>
 216.127 +      </table>
 216.128 +</div><div class="memdoc">
 216.129 +
 216.130 +<p>Input buffer (don't set manually). </p>
 216.131 +<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>
 216.132 +
 216.133 +</div>
 216.134 +</div>
 216.135 +<a id="a4e7524434525267e29f493a25dcca6b5"></a>
 216.136 +<h2 class="memtitle"><span class="permalink"><a href="#a4e7524434525267e29f493a25dcca6b5">&#9670;&nbsp;</a></span>buflen</h2>
 216.137 +
 216.138 +<div class="memitem">
 216.139 +<div class="memproto">
 216.140 +      <table class="memname">
 216.141 +        <tr>
 216.142 +          <td class="memname">size_t UcxProperties::buflen</td>
 216.143 +        </tr>
 216.144 +      </table>
 216.145 +</div><div class="memdoc">
 216.146 +
 216.147 +<p>Length of the input buffer (don't set manually). </p>
 216.148 +<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>
 216.149 +
 216.150 +</div>
 216.151 +</div>
 216.152 +<a id="afaa2e6a289fa6949b7b01df35fa5def8"></a>
 216.153 +<h2 class="memtitle"><span class="permalink"><a href="#afaa2e6a289fa6949b7b01df35fa5def8">&#9670;&nbsp;</a></span>comment1</h2>
 216.154 +
 216.155 +<div class="memitem">
 216.156 +<div class="memproto">
 216.157 +      <table class="memname">
 216.158 +        <tr>
 216.159 +          <td class="memname">char UcxProperties::comment1</td>
 216.160 +        </tr>
 216.161 +      </table>
 216.162 +</div><div class="memdoc">
 216.163 +
 216.164 +<p>The first comment character. </p>
 216.165 +<p>This is '#' by default. </p>
 216.166 +
 216.167 +</div>
 216.168 +</div>
 216.169 +<a id="a9ea7ecb414ca8bc7bef62cdd19cc6363"></a>
 216.170 +<h2 class="memtitle"><span class="permalink"><a href="#a9ea7ecb414ca8bc7bef62cdd19cc6363">&#9670;&nbsp;</a></span>comment2</h2>
 216.171 +
 216.172 +<div class="memitem">
 216.173 +<div class="memproto">
 216.174 +      <table class="memname">
 216.175 +        <tr>
 216.176 +          <td class="memname">char UcxProperties::comment2</td>
 216.177 +        </tr>
 216.178 +      </table>
 216.179 +</div><div class="memdoc">
 216.180 +
 216.181 +<p>The second comment character. </p>
 216.182 +<p>This is not set by default. </p>
 216.183 +
 216.184 +</div>
 216.185 +</div>
 216.186 +<a id="a5f3e561e32bac03e36a191a6940cca92"></a>
 216.187 +<h2 class="memtitle"><span class="permalink"><a href="#a5f3e561e32bac03e36a191a6940cca92">&#9670;&nbsp;</a></span>comment3</h2>
 216.188 +
 216.189 +<div class="memitem">
 216.190 +<div class="memproto">
 216.191 +      <table class="memname">
 216.192 +        <tr>
 216.193 +          <td class="memname">char UcxProperties::comment3</td>
 216.194 +        </tr>
 216.195 +      </table>
 216.196 +</div><div class="memdoc">
 216.197 +
 216.198 +<p>The third comment character. </p>
 216.199 +<p>This is not set by default. </p>
 216.200 +
 216.201 +</div>
 216.202 +</div>
 216.203 +<a id="af6adb3f69616cf9d2bb5ea7b4d837ca5"></a>
 216.204 +<h2 class="memtitle"><span class="permalink"><a href="#af6adb3f69616cf9d2bb5ea7b4d837ca5">&#9670;&nbsp;</a></span>delimiter</h2>
 216.205 +
 216.206 +<div class="memitem">
 216.207 +<div class="memproto">
 216.208 +      <table class="memname">
 216.209 +        <tr>
 216.210 +          <td class="memname">char UcxProperties::delimiter</td>
 216.211 +        </tr>
 216.212 +      </table>
 216.213 +</div><div class="memdoc">
 216.214 +
 216.215 +<p>The delimiter that shall be used. </p>
 216.216 +<p>This is '=' by default. </p>
 216.217 +
 216.218 +</div>
 216.219 +</div>
 216.220 +<a id="a34f71a6ab6dcb6892e3b4eb802e75bff"></a>
 216.221 +<h2 class="memtitle"><span class="permalink"><a href="#a34f71a6ab6dcb6892e3b4eb802e75bff">&#9670;&nbsp;</a></span>error</h2>
 216.222 +
 216.223 +<div class="memitem">
 216.224 +<div class="memproto">
 216.225 +      <table class="memname">
 216.226 +        <tr>
 216.227 +          <td class="memname">int UcxProperties::error</td>
 216.228 +        </tr>
 216.229 +      </table>
 216.230 +</div><div class="memdoc">
 216.231 +
 216.232 +<p>Parser error code. </p>
 216.233 +<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>
 216.234 +
 216.235 +</div>
 216.236 +</div>
 216.237 +<a id="addd36ac8e5e42241c0a57453633970db"></a>
 216.238 +<h2 class="memtitle"><span class="permalink"><a href="#addd36ac8e5e42241c0a57453633970db">&#9670;&nbsp;</a></span>pos</h2>
 216.239 +
 216.240 +<div class="memitem">
 216.241 +<div class="memproto">
 216.242 +      <table class="memname">
 216.243 +        <tr>
 216.244 +          <td class="memname">size_t UcxProperties::pos</td>
 216.245 +        </tr>
 216.246 +      </table>
 216.247 +</div><div class="memdoc">
 216.248 +
 216.249 +<p>Current buffer position (don't set manually). </p>
 216.250 +<p>Used by <a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c" title="Retrieves the next key/value-pair. ">ucx_properties_next()</a>. </p>
 216.251 +
 216.252 +</div>
 216.253 +</div>
 216.254 +<a id="a68556d4260153f58dde44e4c365edce6"></a>
 216.255 +<h2 class="memtitle"><span class="permalink"><a href="#a68556d4260153f58dde44e4c365edce6">&#9670;&nbsp;</a></span>tmp</h2>
 216.256 +
 216.257 +<div class="memitem">
 216.258 +<div class="memproto">
 216.259 +      <table class="memname">
 216.260 +        <tr>
 216.261 +          <td class="memname">char* UcxProperties::tmp</td>
 216.262 +        </tr>
 216.263 +      </table>
 216.264 +</div><div class="memdoc">
 216.265 +
 216.266 +<p>Internal temporary buffer (don't set manually). </p>
 216.267 +<p>Used by <a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c" title="Retrieves the next key/value-pair. ">ucx_properties_next()</a>. </p>
 216.268 +
 216.269 +</div>
 216.270 +</div>
 216.271 +<a id="a5af10131ea9f679b4ee174499f92e210"></a>
 216.272 +<h2 class="memtitle"><span class="permalink"><a href="#a5af10131ea9f679b4ee174499f92e210">&#9670;&nbsp;</a></span>tmpcap</h2>
 216.273 +
 216.274 +<div class="memitem">
 216.275 +<div class="memproto">
 216.276 +      <table class="memname">
 216.277 +        <tr>
 216.278 +          <td class="memname">size_t UcxProperties::tmpcap</td>
 216.279 +        </tr>
 216.280 +      </table>
 216.281 +</div><div class="memdoc">
 216.282 +
 216.283 +<p>Internal temporary buffer capacity (don't set manually). </p>
 216.284 +<p>Used by <a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c" title="Retrieves the next key/value-pair. ">ucx_properties_next()</a>. </p>
 216.285 +
 216.286 +</div>
 216.287 +</div>
 216.288 +<a id="a8a81853d5903bee2f4e1fa53fdffae6e"></a>
 216.289 +<h2 class="memtitle"><span class="permalink"><a href="#a8a81853d5903bee2f4e1fa53fdffae6e">&#9670;&nbsp;</a></span>tmplen</h2>
 216.290 +
 216.291 +<div class="memitem">
 216.292 +<div class="memproto">
 216.293 +      <table class="memname">
 216.294 +        <tr>
 216.295 +          <td class="memname">size_t UcxProperties::tmplen</td>
 216.296 +        </tr>
 216.297 +      </table>
 216.298 +</div><div class="memdoc">
 216.299 +
 216.300 +<p>Internal temporary buffer length (don't set manually). </p>
 216.301 +<p>Used by <a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c" title="Retrieves the next key/value-pair. ">ucx_properties_next()</a>. </p>
 216.302 +
 216.303 +</div>
 216.304 +</div>
 216.305 +<hr/>The documentation for this struct was generated from the following file:<ul>
 216.306 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="properties_8h_source.html">properties.h</a></li>
 216.307 +</ul>
 216.308 +</div><!-- contents -->
 216.309 +<!-- start footer part -->
 216.310 +<hr class="footer"/><address class="footer"><small>
 216.311 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 216.312 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 216.313 +</a> 1.8.13
 216.314 +</small></address>
 216.315 +</body>
 216.316 +</html>
   217.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   217.2 +++ b/docs/api-2.1/structUcxStack.html	Sat Feb 06 19:11:44 2021 +0100
   217.3 @@ -0,0 +1,123 @@
   217.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   217.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   217.6 +<head>
   217.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   217.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   217.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  217.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  217.11 +<title>ucx: UcxStack Struct Reference</title>
  217.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  217.13 +<script type="text/javascript" src="jquery.js"></script>
  217.14 +<script type="text/javascript" src="dynsections.js"></script>
  217.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  217.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  217.17 +<script type="text/javascript" src="search/search.js"></script>
  217.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  217.19 +</head>
  217.20 +<body>
  217.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  217.22 +<div id="titlearea">
  217.23 +<table cellspacing="0" cellpadding="0">
  217.24 + <tbody>
  217.25 + <tr style="height: 56px;">
  217.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  217.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  217.28 +   <div id="projectname">ucx
  217.29 +   </div>
  217.30 +   <div id="projectbrief">UAP Common Extensions</div>
  217.31 +  </td>
  217.32 + </tr>
  217.33 + </tbody>
  217.34 +</table>
  217.35 +</div>
  217.36 +<!-- end header part -->
  217.37 +<!-- Generated by Doxygen 1.8.13 -->
  217.38 +<script type="text/javascript">
  217.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  217.40 +</script>
  217.41 +<script type="text/javascript" src="menudata.js"></script>
  217.42 +<script type="text/javascript" src="menu.js"></script>
  217.43 +<script type="text/javascript">
  217.44 +$(function() {
  217.45 +  initMenu('',true,false,'search.php','Search');
  217.46 +  $(document).ready(function() { init_search(); });
  217.47 +});
  217.48 +</script>
  217.49 +<div id="main-nav"></div>
  217.50 +<!-- window showing the filter options -->
  217.51 +<div id="MSearchSelectWindow"
  217.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  217.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  217.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  217.55 +</div>
  217.56 +
  217.57 +<!-- iframe showing the search results (closed by default) -->
  217.58 +<div id="MSearchResultsWindow">
  217.59 +<iframe src="javascript:void(0)" frameborder="0" 
  217.60 +        name="MSearchResults" id="MSearchResults">
  217.61 +</iframe>
  217.62 +</div>
  217.63 +
  217.64 +</div><!-- top -->
  217.65 +<div class="header">
  217.66 +  <div class="summary">
  217.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  217.68 +  <div class="headertitle">
  217.69 +<div class="title">UcxStack Struct Reference</div>  </div>
  217.70 +</div><!--header-->
  217.71 +<div class="contents">
  217.72 +
  217.73 +<p>UCX stack structure.  
  217.74 + <a href="structUcxStack.html#details">More...</a></p>
  217.75 +
  217.76 +<p><code>#include &lt;<a class="el" href="stack_8h_source.html">stack.h</a>&gt;</code></p>
  217.77 +<table class="memberdecls">
  217.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  217.79 +Data Fields</h2></td></tr>
  217.80 +<tr class="memitem:a33cda4f6890ac56ab31701598bc1ae10"><td class="memItemLeft" align="right" valign="top"><a id="a33cda4f6890ac56ab31701598bc1ae10"></a>
  217.81 +<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>
  217.82 +<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>
  217.83 +<tr class="separator:a33cda4f6890ac56ab31701598bc1ae10"><td class="memSeparator" colspan="2">&#160;</td></tr>
  217.84 +<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>
  217.85 +<tr class="memdesc:a4df86b1917bfc3bbf760220870638143"><td class="mdescLeft">&#160;</td><td class="mdescRight">Stack size.  <a href="#a4df86b1917bfc3bbf760220870638143">More...</a><br /></td></tr>
  217.86 +<tr class="separator:a4df86b1917bfc3bbf760220870638143"><td class="memSeparator" colspan="2">&#160;</td></tr>
  217.87 +<tr class="memitem:af64d528744bf3a47fec87d2e45d2992f"><td class="memItemLeft" align="right" valign="top"><a id="af64d528744bf3a47fec87d2e45d2992f"></a>
  217.88 +char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxStack.html#af64d528744bf3a47fec87d2e45d2992f">space</a></td></tr>
  217.89 +<tr class="memdesc:af64d528744bf3a47fec87d2e45d2992f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointer to the bottom of the stack. <br /></td></tr>
  217.90 +<tr class="separator:af64d528744bf3a47fec87d2e45d2992f"><td class="memSeparator" colspan="2">&#160;</td></tr>
  217.91 +<tr class="memitem:af0ff6f58edce469f17683013b86ade27"><td class="memItemLeft" align="right" valign="top"><a id="af0ff6f58edce469f17683013b86ade27"></a>
  217.92 +char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxStack.html#af0ff6f58edce469f17683013b86ade27">top</a></td></tr>
  217.93 +<tr class="memdesc:af0ff6f58edce469f17683013b86ade27"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointer to the top of the stack. <br /></td></tr>
  217.94 +<tr class="separator:af0ff6f58edce469f17683013b86ade27"><td class="memSeparator" colspan="2">&#160;</td></tr>
  217.95 +</table>
  217.96 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  217.97 +<div class="textblock"><p>UCX stack structure. </p>
  217.98 +</div><h2 class="groupheader">Field Documentation</h2>
  217.99 +<a id="a4df86b1917bfc3bbf760220870638143"></a>
 217.100 +<h2 class="memtitle"><span class="permalink"><a href="#a4df86b1917bfc3bbf760220870638143">&#9670;&nbsp;</a></span>size</h2>
 217.101 +
 217.102 +<div class="memitem">
 217.103 +<div class="memproto">
 217.104 +      <table class="memname">
 217.105 +        <tr>
 217.106 +          <td class="memname">size_t UcxStack::size</td>
 217.107 +        </tr>
 217.108 +      </table>
 217.109 +</div><div class="memdoc">
 217.110 +
 217.111 +<p>Stack size. </p>
 217.112 +
 217.113 +</div>
 217.114 +</div>
 217.115 +<hr/>The documentation for this struct was generated from the following file:<ul>
 217.116 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="stack_8h_source.html">stack.h</a></li>
 217.117 +</ul>
 217.118 +</div><!-- contents -->
 217.119 +<!-- start footer part -->
 217.120 +<hr class="footer"/><address class="footer"><small>
 217.121 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 217.122 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 217.123 +</a> 1.8.13
 217.124 +</small></address>
 217.125 +</body>
 217.126 +</html>
   218.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   218.2 +++ b/docs/api-2.1/structUcxTestList.html	Sat Feb 06 19:11:44 2021 +0100
   218.3 @@ -0,0 +1,130 @@
   218.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   218.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   218.6 +<head>
   218.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   218.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   218.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  218.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  218.11 +<title>ucx: UcxTestList Struct Reference</title>
  218.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  218.13 +<script type="text/javascript" src="jquery.js"></script>
  218.14 +<script type="text/javascript" src="dynsections.js"></script>
  218.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  218.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  218.17 +<script type="text/javascript" src="search/search.js"></script>
  218.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  218.19 +</head>
  218.20 +<body>
  218.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  218.22 +<div id="titlearea">
  218.23 +<table cellspacing="0" cellpadding="0">
  218.24 + <tbody>
  218.25 + <tr style="height: 56px;">
  218.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  218.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  218.28 +   <div id="projectname">ucx
  218.29 +   </div>
  218.30 +   <div id="projectbrief">UAP Common Extensions</div>
  218.31 +  </td>
  218.32 + </tr>
  218.33 + </tbody>
  218.34 +</table>
  218.35 +</div>
  218.36 +<!-- end header part -->
  218.37 +<!-- Generated by Doxygen 1.8.13 -->
  218.38 +<script type="text/javascript">
  218.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  218.40 +</script>
  218.41 +<script type="text/javascript" src="menudata.js"></script>
  218.42 +<script type="text/javascript" src="menu.js"></script>
  218.43 +<script type="text/javascript">
  218.44 +$(function() {
  218.45 +  initMenu('',true,false,'search.php','Search');
  218.46 +  $(document).ready(function() { init_search(); });
  218.47 +});
  218.48 +</script>
  218.49 +<div id="main-nav"></div>
  218.50 +<!-- window showing the filter options -->
  218.51 +<div id="MSearchSelectWindow"
  218.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  218.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  218.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  218.55 +</div>
  218.56 +
  218.57 +<!-- iframe showing the search results (closed by default) -->
  218.58 +<div id="MSearchResultsWindow">
  218.59 +<iframe src="javascript:void(0)" frameborder="0" 
  218.60 +        name="MSearchResults" id="MSearchResults">
  218.61 +</iframe>
  218.62 +</div>
  218.63 +
  218.64 +</div><!-- top -->
  218.65 +<div class="header">
  218.66 +  <div class="summary">
  218.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  218.68 +  <div class="headertitle">
  218.69 +<div class="title">UcxTestList Struct Reference</div>  </div>
  218.70 +</div><!--header-->
  218.71 +<div class="contents">
  218.72 +
  218.73 +<p>Structure for the internal list of test cases.  
  218.74 + <a href="structUcxTestList.html#details">More...</a></p>
  218.75 +
  218.76 +<p><code>#include &lt;<a class="el" href="test_8h_source.html">test.h</a>&gt;</code></p>
  218.77 +<table class="memberdecls">
  218.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  218.79 +Data Fields</h2></td></tr>
  218.80 +<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>
  218.81 +<tr class="memdesc:a6022faa52e772b073141ca0a2f5a56c9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test case.  <a href="#a6022faa52e772b073141ca0a2f5a56c9">More...</a><br /></td></tr>
  218.82 +<tr class="separator:a6022faa52e772b073141ca0a2f5a56c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
  218.83 +<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>
  218.84 +<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>
  218.85 +<tr class="separator:aeebb80ff75d9f6f82ab6dc2641a3c74e"><td class="memSeparator" colspan="2">&#160;</td></tr>
  218.86 +</table>
  218.87 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  218.88 +<div class="textblock"><p>Structure for the internal list of test cases. </p>
  218.89 +</div><h2 class="groupheader">Field Documentation</h2>
  218.90 +<a id="aeebb80ff75d9f6f82ab6dc2641a3c74e"></a>
  218.91 +<h2 class="memtitle"><span class="permalink"><a href="#aeebb80ff75d9f6f82ab6dc2641a3c74e">&#9670;&nbsp;</a></span>next</h2>
  218.92 +
  218.93 +<div class="memitem">
  218.94 +<div class="memproto">
  218.95 +      <table class="memname">
  218.96 +        <tr>
  218.97 +          <td class="memname"><a class="el" href="structUcxTestList.html">UcxTestList</a>* UcxTestList::next</td>
  218.98 +        </tr>
  218.99 +      </table>
 218.100 +</div><div class="memdoc">
 218.101 +
 218.102 +<p>Pointer to the next list element. </p>
 218.103 +
 218.104 +</div>
 218.105 +</div>
 218.106 +<a id="a6022faa52e772b073141ca0a2f5a56c9"></a>
 218.107 +<h2 class="memtitle"><span class="permalink"><a href="#a6022faa52e772b073141ca0a2f5a56c9">&#9670;&nbsp;</a></span>test</h2>
 218.108 +
 218.109 +<div class="memitem">
 218.110 +<div class="memproto">
 218.111 +      <table class="memname">
 218.112 +        <tr>
 218.113 +          <td class="memname"><a class="el" href="test_8h.html#ae906817354c010b83c2784260cce7a1c">UcxTest</a> UcxTestList::test</td>
 218.114 +        </tr>
 218.115 +      </table>
 218.116 +</div><div class="memdoc">
 218.117 +
 218.118 +<p>Test case. </p>
 218.119 +
 218.120 +</div>
 218.121 +</div>
 218.122 +<hr/>The documentation for this struct was generated from the following file:<ul>
 218.123 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="test_8h_source.html">test.h</a></li>
 218.124 +</ul>
 218.125 +</div><!-- contents -->
 218.126 +<!-- start footer part -->
 218.127 +<hr class="footer"/><address class="footer"><small>
 218.128 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 218.129 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 218.130 +</a> 1.8.13
 218.131 +</small></address>
 218.132 +</body>
 218.133 +</html>
   219.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   219.2 +++ b/docs/api-2.1/structUcxTestSuite.html	Sat Feb 06 19:11:44 2021 +0100
   219.3 @@ -0,0 +1,150 @@
   219.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   219.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   219.6 +<head>
   219.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   219.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   219.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  219.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  219.11 +<title>ucx: UcxTestSuite Struct Reference</title>
  219.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  219.13 +<script type="text/javascript" src="jquery.js"></script>
  219.14 +<script type="text/javascript" src="dynsections.js"></script>
  219.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  219.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  219.17 +<script type="text/javascript" src="search/search.js"></script>
  219.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  219.19 +</head>
  219.20 +<body>
  219.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  219.22 +<div id="titlearea">
  219.23 +<table cellspacing="0" cellpadding="0">
  219.24 + <tbody>
  219.25 + <tr style="height: 56px;">
  219.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  219.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  219.28 +   <div id="projectname">ucx
  219.29 +   </div>
  219.30 +   <div id="projectbrief">UAP Common Extensions</div>
  219.31 +  </td>
  219.32 + </tr>
  219.33 + </tbody>
  219.34 +</table>
  219.35 +</div>
  219.36 +<!-- end header part -->
  219.37 +<!-- Generated by Doxygen 1.8.13 -->
  219.38 +<script type="text/javascript">
  219.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  219.40 +</script>
  219.41 +<script type="text/javascript" src="menudata.js"></script>
  219.42 +<script type="text/javascript" src="menu.js"></script>
  219.43 +<script type="text/javascript">
  219.44 +$(function() {
  219.45 +  initMenu('',true,false,'search.php','Search');
  219.46 +  $(document).ready(function() { init_search(); });
  219.47 +});
  219.48 +</script>
  219.49 +<div id="main-nav"></div>
  219.50 +<!-- window showing the filter options -->
  219.51 +<div id="MSearchSelectWindow"
  219.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  219.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  219.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  219.55 +</div>
  219.56 +
  219.57 +<!-- iframe showing the search results (closed by default) -->
  219.58 +<div id="MSearchResultsWindow">
  219.59 +<iframe src="javascript:void(0)" frameborder="0" 
  219.60 +        name="MSearchResults" id="MSearchResults">
  219.61 +</iframe>
  219.62 +</div>
  219.63 +
  219.64 +</div><!-- top -->
  219.65 +<div class="header">
  219.66 +  <div class="summary">
  219.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  219.68 +  <div class="headertitle">
  219.69 +<div class="title">UcxTestSuite Struct Reference</div>  </div>
  219.70 +</div><!--header-->
  219.71 +<div class="contents">
  219.72 +
  219.73 +<p>A test suite containing multiple test cases.  
  219.74 + <a href="structUcxTestSuite.html#details">More...</a></p>
  219.75 +
  219.76 +<p><code>#include &lt;<a class="el" href="test_8h_source.html">test.h</a>&gt;</code></p>
  219.77 +<table class="memberdecls">
  219.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  219.79 +Data Fields</h2></td></tr>
  219.80 +<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>
  219.81 +<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>
  219.82 +<tr class="separator:a6cefa870a3c2e38d6ee682e38643dbbb"><td class="memSeparator" colspan="2">&#160;</td></tr>
  219.83 +<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>
  219.84 +<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>
  219.85 +<tr class="separator:abfd240541d1e956e49cde0ac36286951"><td class="memSeparator" colspan="2">&#160;</td></tr>
  219.86 +<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>
  219.87 +<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>
  219.88 +<tr class="separator:a630677a70ebc2c3296704cda3196492b"><td class="memSeparator" colspan="2">&#160;</td></tr>
  219.89 +</table>
  219.90 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  219.91 +<div class="textblock"><p>A test suite containing multiple test cases. </p>
  219.92 +</div><h2 class="groupheader">Field Documentation</h2>
  219.93 +<a id="abfd240541d1e956e49cde0ac36286951"></a>
  219.94 +<h2 class="memtitle"><span class="permalink"><a href="#abfd240541d1e956e49cde0ac36286951">&#9670;&nbsp;</a></span>failure</h2>
  219.95 +
  219.96 +<div class="memitem">
  219.97 +<div class="memproto">
  219.98 +      <table class="memname">
  219.99 +        <tr>
 219.100 +          <td class="memname">unsigned int UcxTestSuite::failure</td>
 219.101 +        </tr>
 219.102 +      </table>
 219.103 +</div><div class="memdoc">
 219.104 +
 219.105 +<p>The number of failed tests after the suite has been run. </p>
 219.106 +
 219.107 +</div>
 219.108 +</div>
 219.109 +<a id="a6cefa870a3c2e38d6ee682e38643dbbb"></a>
 219.110 +<h2 class="memtitle"><span class="permalink"><a href="#a6cefa870a3c2e38d6ee682e38643dbbb">&#9670;&nbsp;</a></span>success</h2>
 219.111 +
 219.112 +<div class="memitem">
 219.113 +<div class="memproto">
 219.114 +      <table class="memname">
 219.115 +        <tr>
 219.116 +          <td class="memname">unsigned int UcxTestSuite::success</td>
 219.117 +        </tr>
 219.118 +      </table>
 219.119 +</div><div class="memdoc">
 219.120 +
 219.121 +<p>The number of successful tests after the suite has been run. </p>
 219.122 +
 219.123 +</div>
 219.124 +</div>
 219.125 +<a id="a630677a70ebc2c3296704cda3196492b"></a>
 219.126 +<h2 class="memtitle"><span class="permalink"><a href="#a630677a70ebc2c3296704cda3196492b">&#9670;&nbsp;</a></span>tests</h2>
 219.127 +
 219.128 +<div class="memitem">
 219.129 +<div class="memproto">
 219.130 +      <table class="memname">
 219.131 +        <tr>
 219.132 +          <td class="memname"><a class="el" href="structUcxTestList.html">UcxTestList</a>* UcxTestSuite::tests</td>
 219.133 +        </tr>
 219.134 +      </table>
 219.135 +</div><div class="memdoc">
 219.136 +
 219.137 +<p>Internal list of test cases. </p>
 219.138 +<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>
 219.139 +
 219.140 +</div>
 219.141 +</div>
 219.142 +<hr/>The documentation for this struct was generated from the following file:<ul>
 219.143 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="test_8h_source.html">test.h</a></li>
 219.144 +</ul>
 219.145 +</div><!-- contents -->
 219.146 +<!-- start footer part -->
 219.147 +<hr class="footer"/><address class="footer"><small>
 219.148 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 219.149 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 219.150 +</a> 1.8.13
 219.151 +</small></address>
 219.152 +</body>
 219.153 +</html>
   220.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   220.2 +++ b/docs/api-2.1/structscstr__t.html	Sat Feb 06 19:11:44 2021 +0100
   220.3 @@ -0,0 +1,99 @@
   220.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   220.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   220.6 +<head>
   220.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   220.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   220.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  220.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  220.11 +<title>ucx: scstr_t Struct Reference</title>
  220.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  220.13 +<script type="text/javascript" src="jquery.js"></script>
  220.14 +<script type="text/javascript" src="dynsections.js"></script>
  220.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  220.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  220.17 +<script type="text/javascript" src="search/search.js"></script>
  220.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  220.19 +</head>
  220.20 +<body>
  220.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  220.22 +<div id="titlearea">
  220.23 +<table cellspacing="0" cellpadding="0">
  220.24 + <tbody>
  220.25 + <tr style="height: 56px;">
  220.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  220.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  220.28 +   <div id="projectname">ucx
  220.29 +   </div>
  220.30 +   <div id="projectbrief">UAP Common Extensions</div>
  220.31 +  </td>
  220.32 + </tr>
  220.33 + </tbody>
  220.34 +</table>
  220.35 +</div>
  220.36 +<!-- end header part -->
  220.37 +<!-- Generated by Doxygen 1.8.13 -->
  220.38 +<script type="text/javascript">
  220.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  220.40 +</script>
  220.41 +<script type="text/javascript" src="menudata.js"></script>
  220.42 +<script type="text/javascript" src="menu.js"></script>
  220.43 +<script type="text/javascript">
  220.44 +$(function() {
  220.45 +  initMenu('',true,false,'search.php','Search');
  220.46 +  $(document).ready(function() { init_search(); });
  220.47 +});
  220.48 +</script>
  220.49 +<div id="main-nav"></div>
  220.50 +<!-- window showing the filter options -->
  220.51 +<div id="MSearchSelectWindow"
  220.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  220.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  220.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  220.55 +</div>
  220.56 +
  220.57 +<!-- iframe showing the search results (closed by default) -->
  220.58 +<div id="MSearchResultsWindow">
  220.59 +<iframe src="javascript:void(0)" frameborder="0" 
  220.60 +        name="MSearchResults" id="MSearchResults">
  220.61 +</iframe>
  220.62 +</div>
  220.63 +
  220.64 +</div><!-- top -->
  220.65 +<div class="header">
  220.66 +  <div class="summary">
  220.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  220.68 +  <div class="headertitle">
  220.69 +<div class="title">scstr_t Struct Reference</div>  </div>
  220.70 +</div><!--header-->
  220.71 +<div class="contents">
  220.72 +
  220.73 +<p>The UCX string structure for immutable (constant) strings.  
  220.74 + <a href="structscstr__t.html#details">More...</a></p>
  220.75 +
  220.76 +<p><code>#include &lt;<a class="el" href="string_8h_source.html">string.h</a>&gt;</code></p>
  220.77 +<table class="memberdecls">
  220.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  220.79 +Data Fields</h2></td></tr>
  220.80 +<tr class="memitem:a305fd48934b474a9bf4a40869030e391"><td class="memItemLeft" align="right" valign="top"><a id="a305fd48934b474a9bf4a40869030e391"></a>
  220.81 +const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structscstr__t.html#a305fd48934b474a9bf4a40869030e391">ptr</a></td></tr>
  220.82 +<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>
  220.83 +<tr class="separator:a305fd48934b474a9bf4a40869030e391"><td class="memSeparator" colspan="2">&#160;</td></tr>
  220.84 +<tr class="memitem:aaa0229f64f1057b6f65adededaa5a172"><td class="memItemLeft" align="right" valign="top"><a id="aaa0229f64f1057b6f65adededaa5a172"></a>
  220.85 +size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structscstr__t.html#aaa0229f64f1057b6f65adededaa5a172">length</a></td></tr>
  220.86 +<tr class="memdesc:aaa0229f64f1057b6f65adededaa5a172"><td class="mdescLeft">&#160;</td><td class="mdescRight">The length of the string. <br /></td></tr>
  220.87 +<tr class="separator:aaa0229f64f1057b6f65adededaa5a172"><td class="memSeparator" colspan="2">&#160;</td></tr>
  220.88 +</table>
  220.89 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  220.90 +<div class="textblock"><p>The UCX string structure for immutable (constant) strings. </p>
  220.91 +</div><hr/>The documentation for this struct was generated from the following file:<ul>
  220.92 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="string_8h_source.html">string.h</a></li>
  220.93 +</ul>
  220.94 +</div><!-- contents -->
  220.95 +<!-- start footer part -->
  220.96 +<hr class="footer"/><address class="footer"><small>
  220.97 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  220.98 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  220.99 +</a> 1.8.13
 220.100 +</small></address>
 220.101 +</body>
 220.102 +</html>
   221.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   221.2 +++ b/docs/api-2.1/structsstr__t.html	Sat Feb 06 19:11:44 2021 +0100
   221.3 @@ -0,0 +1,99 @@
   221.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   221.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   221.6 +<head>
   221.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   221.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   221.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  221.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  221.11 +<title>ucx: sstr_t Struct Reference</title>
  221.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  221.13 +<script type="text/javascript" src="jquery.js"></script>
  221.14 +<script type="text/javascript" src="dynsections.js"></script>
  221.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  221.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  221.17 +<script type="text/javascript" src="search/search.js"></script>
  221.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  221.19 +</head>
  221.20 +<body>
  221.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  221.22 +<div id="titlearea">
  221.23 +<table cellspacing="0" cellpadding="0">
  221.24 + <tbody>
  221.25 + <tr style="height: 56px;">
  221.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  221.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  221.28 +   <div id="projectname">ucx
  221.29 +   </div>
  221.30 +   <div id="projectbrief">UAP Common Extensions</div>
  221.31 +  </td>
  221.32 + </tr>
  221.33 + </tbody>
  221.34 +</table>
  221.35 +</div>
  221.36 +<!-- end header part -->
  221.37 +<!-- Generated by Doxygen 1.8.13 -->
  221.38 +<script type="text/javascript">
  221.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  221.40 +</script>
  221.41 +<script type="text/javascript" src="menudata.js"></script>
  221.42 +<script type="text/javascript" src="menu.js"></script>
  221.43 +<script type="text/javascript">
  221.44 +$(function() {
  221.45 +  initMenu('',true,false,'search.php','Search');
  221.46 +  $(document).ready(function() { init_search(); });
  221.47 +});
  221.48 +</script>
  221.49 +<div id="main-nav"></div>
  221.50 +<!-- window showing the filter options -->
  221.51 +<div id="MSearchSelectWindow"
  221.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  221.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  221.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  221.55 +</div>
  221.56 +
  221.57 +<!-- iframe showing the search results (closed by default) -->
  221.58 +<div id="MSearchResultsWindow">
  221.59 +<iframe src="javascript:void(0)" frameborder="0" 
  221.60 +        name="MSearchResults" id="MSearchResults">
  221.61 +</iframe>
  221.62 +</div>
  221.63 +
  221.64 +</div><!-- top -->
  221.65 +<div class="header">
  221.66 +  <div class="summary">
  221.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  221.68 +  <div class="headertitle">
  221.69 +<div class="title">sstr_t Struct Reference</div>  </div>
  221.70 +</div><!--header-->
  221.71 +<div class="contents">
  221.72 +
  221.73 +<p>The UCX string structure.  
  221.74 + <a href="structsstr__t.html#details">More...</a></p>
  221.75 +
  221.76 +<p><code>#include &lt;<a class="el" href="string_8h_source.html">string.h</a>&gt;</code></p>
  221.77 +<table class="memberdecls">
  221.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  221.79 +Data Fields</h2></td></tr>
  221.80 +<tr class="memitem:af8049914efc1e67f7de3ee55ec0611b0"><td class="memItemLeft" align="right" valign="top"><a id="af8049914efc1e67f7de3ee55ec0611b0"></a>
  221.81 +char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0">ptr</a></td></tr>
  221.82 +<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>
  221.83 +<tr class="separator:af8049914efc1e67f7de3ee55ec0611b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
  221.84 +<tr class="memitem:a5cf571708cdff92e45f08458f2b98229"><td class="memItemLeft" align="right" valign="top"><a id="a5cf571708cdff92e45f08458f2b98229"></a>
  221.85 +size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsstr__t.html#a5cf571708cdff92e45f08458f2b98229">length</a></td></tr>
  221.86 +<tr class="memdesc:a5cf571708cdff92e45f08458f2b98229"><td class="mdescLeft">&#160;</td><td class="mdescRight">The length of the string. <br /></td></tr>
  221.87 +<tr class="separator:a5cf571708cdff92e45f08458f2b98229"><td class="memSeparator" colspan="2">&#160;</td></tr>
  221.88 +</table>
  221.89 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  221.90 +<div class="textblock"><p>The UCX string structure. </p>
  221.91 +</div><hr/>The documentation for this struct was generated from the following file:<ul>
  221.92 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="string_8h_source.html">string.h</a></li>
  221.93 +</ul>
  221.94 +</div><!-- contents -->
  221.95 +<!-- start footer part -->
  221.96 +<hr class="footer"/><address class="footer"><small>
  221.97 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  221.98 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  221.99 +</a> 1.8.13
 221.100 +</small></address>
 221.101 +</body>
 221.102 +</html>
   222.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   222.2 +++ b/docs/api-2.1/structucx__memchunk.html	Sat Feb 06 19:11:44 2021 +0100
   222.3 @@ -0,0 +1,129 @@
   222.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   222.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   222.6 +<head>
   222.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   222.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   222.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  222.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  222.11 +<title>ucx: ucx_memchunk Struct Reference</title>
  222.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  222.13 +<script type="text/javascript" src="jquery.js"></script>
  222.14 +<script type="text/javascript" src="dynsections.js"></script>
  222.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  222.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  222.17 +<script type="text/javascript" src="search/search.js"></script>
  222.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  222.19 +</head>
  222.20 +<body>
  222.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  222.22 +<div id="titlearea">
  222.23 +<table cellspacing="0" cellpadding="0">
  222.24 + <tbody>
  222.25 + <tr style="height: 56px;">
  222.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  222.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  222.28 +   <div id="projectname">ucx
  222.29 +   </div>
  222.30 +   <div id="projectbrief">UAP Common Extensions</div>
  222.31 +  </td>
  222.32 + </tr>
  222.33 + </tbody>
  222.34 +</table>
  222.35 +</div>
  222.36 +<!-- end header part -->
  222.37 +<!-- Generated by Doxygen 1.8.13 -->
  222.38 +<script type="text/javascript">
  222.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  222.40 +</script>
  222.41 +<script type="text/javascript" src="menudata.js"></script>
  222.42 +<script type="text/javascript" src="menu.js"></script>
  222.43 +<script type="text/javascript">
  222.44 +$(function() {
  222.45 +  initMenu('',true,false,'search.php','Search');
  222.46 +  $(document).ready(function() { init_search(); });
  222.47 +});
  222.48 +</script>
  222.49 +<div id="main-nav"></div>
  222.50 +<!-- window showing the filter options -->
  222.51 +<div id="MSearchSelectWindow"
  222.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  222.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  222.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  222.55 +</div>
  222.56 +
  222.57 +<!-- iframe showing the search results (closed by default) -->
  222.58 +<div id="MSearchResultsWindow">
  222.59 +<iframe src="javascript:void(0)" frameborder="0" 
  222.60 +        name="MSearchResults" id="MSearchResults">
  222.61 +</iframe>
  222.62 +</div>
  222.63 +
  222.64 +</div><!-- top -->
  222.65 +<div class="header">
  222.66 +  <div class="summary">
  222.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  222.68 +  <div class="headertitle">
  222.69 +<div class="title">ucx_memchunk Struct Reference</div>  </div>
  222.70 +</div><!--header-->
  222.71 +<div class="contents">
  222.72 +
  222.73 +<p>Capsule for destructible memory chunks.  
  222.74 + <a href="structucx__memchunk.html#details">More...</a></p>
  222.75 +<table class="memberdecls">
  222.76 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  222.77 +Data Fields</h2></td></tr>
  222.78 +<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>
  222.79 +<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>
  222.80 +<tr class="separator:ac7b5e3fda47b917d6fb2a1d7ea28447b"><td class="memSeparator" colspan="2">&#160;</td></tr>
  222.81 +<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>
  222.82 +<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>
  222.83 +<tr class="separator:ab86550503e5f019bfa61a1e91f1c40da"><td class="memSeparator" colspan="2">&#160;</td></tr>
  222.84 +</table>
  222.85 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  222.86 +<div class="textblock"><p>Capsule for destructible memory chunks. </p>
  222.87 +</div><h2 class="groupheader">Field Documentation</h2>
  222.88 +<a id="ab86550503e5f019bfa61a1e91f1c40da"></a>
  222.89 +<h2 class="memtitle"><span class="permalink"><a href="#ab86550503e5f019bfa61a1e91f1c40da">&#9670;&nbsp;</a></span>c</h2>
  222.90 +
  222.91 +<div class="memitem">
  222.92 +<div class="memproto">
  222.93 +      <table class="memname">
  222.94 +        <tr>
  222.95 +          <td class="memname">char ucx_memchunk::c</td>
  222.96 +        </tr>
  222.97 +      </table>
  222.98 +</div><div class="memdoc">
  222.99 +
 222.100 +<p>First byte of the memory chunk. </p>
 222.101 +<p>Note, that the address <code>&amp;c</code> is also the address of the whole memory chunk. </p>
 222.102 +
 222.103 +</div>
 222.104 +</div>
 222.105 +<a id="ac7b5e3fda47b917d6fb2a1d7ea28447b"></a>
 222.106 +<h2 class="memtitle"><span class="permalink"><a href="#ac7b5e3fda47b917d6fb2a1d7ea28447b">&#9670;&nbsp;</a></span>destructor</h2>
 222.107 +
 222.108 +<div class="memitem">
 222.109 +<div class="memproto">
 222.110 +      <table class="memname">
 222.111 +        <tr>
 222.112 +          <td class="memname"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a> ucx_memchunk::destructor</td>
 222.113 +        </tr>
 222.114 +      </table>
 222.115 +</div><div class="memdoc">
 222.116 +
 222.117 +<p>The destructor for the memory chunk. </p>
 222.118 +
 222.119 +</div>
 222.120 +</div>
 222.121 +<hr/>The documentation for this struct was generated from the following file:<ul>
 222.122 +<li>/home/mike/workspace/c/ucx/src/mempool.c</li>
 222.123 +</ul>
 222.124 +</div><!-- contents -->
 222.125 +<!-- start footer part -->
 222.126 +<hr class="footer"/><address class="footer"><small>
 222.127 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 222.128 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 222.129 +</a> 1.8.13
 222.130 +</small></address>
 222.131 +</body>
 222.132 +</html>
   223.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   223.2 +++ b/docs/api-2.1/structucx__regdestr.html	Sat Feb 06 19:11:44 2021 +0100
   223.3 @@ -0,0 +1,128 @@
   223.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   223.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   223.6 +<head>
   223.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   223.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   223.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  223.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  223.11 +<title>ucx: ucx_regdestr Struct Reference</title>
  223.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  223.13 +<script type="text/javascript" src="jquery.js"></script>
  223.14 +<script type="text/javascript" src="dynsections.js"></script>
  223.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  223.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  223.17 +<script type="text/javascript" src="search/search.js"></script>
  223.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  223.19 +</head>
  223.20 +<body>
  223.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  223.22 +<div id="titlearea">
  223.23 +<table cellspacing="0" cellpadding="0">
  223.24 + <tbody>
  223.25 + <tr style="height: 56px;">
  223.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  223.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  223.28 +   <div id="projectname">ucx
  223.29 +   </div>
  223.30 +   <div id="projectbrief">UAP Common Extensions</div>
  223.31 +  </td>
  223.32 + </tr>
  223.33 + </tbody>
  223.34 +</table>
  223.35 +</div>
  223.36 +<!-- end header part -->
  223.37 +<!-- Generated by Doxygen 1.8.13 -->
  223.38 +<script type="text/javascript">
  223.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  223.40 +</script>
  223.41 +<script type="text/javascript" src="menudata.js"></script>
  223.42 +<script type="text/javascript" src="menu.js"></script>
  223.43 +<script type="text/javascript">
  223.44 +$(function() {
  223.45 +  initMenu('',true,false,'search.php','Search');
  223.46 +  $(document).ready(function() { init_search(); });
  223.47 +});
  223.48 +</script>
  223.49 +<div id="main-nav"></div>
  223.50 +<!-- window showing the filter options -->
  223.51 +<div id="MSearchSelectWindow"
  223.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  223.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  223.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  223.55 +</div>
  223.56 +
  223.57 +<!-- iframe showing the search results (closed by default) -->
  223.58 +<div id="MSearchResultsWindow">
  223.59 +<iframe src="javascript:void(0)" frameborder="0" 
  223.60 +        name="MSearchResults" id="MSearchResults">
  223.61 +</iframe>
  223.62 +</div>
  223.63 +
  223.64 +</div><!-- top -->
  223.65 +<div class="header">
  223.66 +  <div class="summary">
  223.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  223.68 +  <div class="headertitle">
  223.69 +<div class="title">ucx_regdestr Struct Reference</div>  </div>
  223.70 +</div><!--header-->
  223.71 +<div class="contents">
  223.72 +
  223.73 +<p>Capsule for data and its destructor.  
  223.74 + <a href="structucx__regdestr.html#details">More...</a></p>
  223.75 +<table class="memberdecls">
  223.76 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  223.77 +Data Fields</h2></td></tr>
  223.78 +<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>
  223.79 +<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>
  223.80 +<tr class="separator:acea2a3bb66909aa800a931ac8b0cce56"><td class="memSeparator" colspan="2">&#160;</td></tr>
  223.81 +<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>
  223.82 +<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>
  223.83 +<tr class="separator:aac0e9ec8df4aab08728b4f8292b5f5e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
  223.84 +</table>
  223.85 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  223.86 +<div class="textblock"><p>Capsule for data and its destructor. </p>
  223.87 +</div><h2 class="groupheader">Field Documentation</h2>
  223.88 +<a id="acea2a3bb66909aa800a931ac8b0cce56"></a>
  223.89 +<h2 class="memtitle"><span class="permalink"><a href="#acea2a3bb66909aa800a931ac8b0cce56">&#9670;&nbsp;</a></span>destructor</h2>
  223.90 +
  223.91 +<div class="memitem">
  223.92 +<div class="memproto">
  223.93 +      <table class="memname">
  223.94 +        <tr>
  223.95 +          <td class="memname"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a> ucx_regdestr::destructor</td>
  223.96 +        </tr>
  223.97 +      </table>
  223.98 +</div><div class="memdoc">
  223.99 +
 223.100 +<p>The destructor for the data. </p>
 223.101 +
 223.102 +</div>
 223.103 +</div>
 223.104 +<a id="aac0e9ec8df4aab08728b4f8292b5f5e7"></a>
 223.105 +<h2 class="memtitle"><span class="permalink"><a href="#aac0e9ec8df4aab08728b4f8292b5f5e7">&#9670;&nbsp;</a></span>ptr</h2>
 223.106 +
 223.107 +<div class="memitem">
 223.108 +<div class="memproto">
 223.109 +      <table class="memname">
 223.110 +        <tr>
 223.111 +          <td class="memname">void* ucx_regdestr::ptr</td>
 223.112 +        </tr>
 223.113 +      </table>
 223.114 +</div><div class="memdoc">
 223.115 +
 223.116 +<p>A pointer to the data. </p>
 223.117 +
 223.118 +</div>
 223.119 +</div>
 223.120 +<hr/>The documentation for this struct was generated from the following file:<ul>
 223.121 +<li>/home/mike/workspace/c/ucx/src/mempool.c</li>
 223.122 +</ul>
 223.123 +</div><!-- contents -->
 223.124 +<!-- start footer part -->
 223.125 +<hr class="footer"/><address class="footer"><small>
 223.126 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 223.127 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 223.128 +</a> 1.8.13
 223.129 +</small></address>
 223.130 +</body>
 223.131 +</html>
   224.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   224.2 +++ b/docs/api-2.1/structucx__stack__metadata.html	Sat Feb 06 19:11:44 2021 +0100
   224.3 @@ -0,0 +1,99 @@
   224.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   224.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   224.6 +<head>
   224.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   224.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   224.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  224.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  224.11 +<title>ucx: ucx_stack_metadata Struct Reference</title>
  224.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  224.13 +<script type="text/javascript" src="jquery.js"></script>
  224.14 +<script type="text/javascript" src="dynsections.js"></script>
  224.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  224.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  224.17 +<script type="text/javascript" src="search/search.js"></script>
  224.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  224.19 +</head>
  224.20 +<body>
  224.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  224.22 +<div id="titlearea">
  224.23 +<table cellspacing="0" cellpadding="0">
  224.24 + <tbody>
  224.25 + <tr style="height: 56px;">
  224.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  224.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  224.28 +   <div id="projectname">ucx
  224.29 +   </div>
  224.30 +   <div id="projectbrief">UAP Common Extensions</div>
  224.31 +  </td>
  224.32 + </tr>
  224.33 + </tbody>
  224.34 +</table>
  224.35 +</div>
  224.36 +<!-- end header part -->
  224.37 +<!-- Generated by Doxygen 1.8.13 -->
  224.38 +<script type="text/javascript">
  224.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  224.40 +</script>
  224.41 +<script type="text/javascript" src="menudata.js"></script>
  224.42 +<script type="text/javascript" src="menu.js"></script>
  224.43 +<script type="text/javascript">
  224.44 +$(function() {
  224.45 +  initMenu('',true,false,'search.php','Search');
  224.46 +  $(document).ready(function() { init_search(); });
  224.47 +});
  224.48 +</script>
  224.49 +<div id="main-nav"></div>
  224.50 +<!-- window showing the filter options -->
  224.51 +<div id="MSearchSelectWindow"
  224.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  224.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  224.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  224.55 +</div>
  224.56 +
  224.57 +<!-- iframe showing the search results (closed by default) -->
  224.58 +<div id="MSearchResultsWindow">
  224.59 +<iframe src="javascript:void(0)" frameborder="0" 
  224.60 +        name="MSearchResults" id="MSearchResults">
  224.61 +</iframe>
  224.62 +</div>
  224.63 +
  224.64 +</div><!-- top -->
  224.65 +<div class="header">
  224.66 +  <div class="summary">
  224.67 +<a href="#pub-attribs">Data Fields</a>  </div>
  224.68 +  <div class="headertitle">
  224.69 +<div class="title">ucx_stack_metadata Struct Reference</div>  </div>
  224.70 +</div><!--header-->
  224.71 +<div class="contents">
  224.72 +
  224.73 +<p>Metadata for each UCX stack element.  
  224.74 + <a href="structucx__stack__metadata.html#details">More...</a></p>
  224.75 +
  224.76 +<p><code>#include &lt;<a class="el" href="stack_8h_source.html">stack.h</a>&gt;</code></p>
  224.77 +<table class="memberdecls">
  224.78 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
  224.79 +Data Fields</h2></td></tr>
  224.80 +<tr class="memitem:ad46d2e8e5b0acf05f2def41d451c5579"><td class="memItemLeft" align="right" valign="top"><a id="ad46d2e8e5b0acf05f2def41d451c5579"></a>
  224.81 +char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structucx__stack__metadata.html#ad46d2e8e5b0acf05f2def41d451c5579">prev</a></td></tr>
  224.82 +<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>
  224.83 +<tr class="separator:ad46d2e8e5b0acf05f2def41d451c5579"><td class="memSeparator" colspan="2">&#160;</td></tr>
  224.84 +<tr class="memitem:ae2a2848b721cfa44a7e963484c5e4b28"><td class="memItemLeft" align="right" valign="top"><a id="ae2a2848b721cfa44a7e963484c5e4b28"></a>
  224.85 +size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structucx__stack__metadata.html#ae2a2848b721cfa44a7e963484c5e4b28">size</a></td></tr>
  224.86 +<tr class="memdesc:ae2a2848b721cfa44a7e963484c5e4b28"><td class="mdescLeft">&#160;</td><td class="mdescRight">Size of this element. <br /></td></tr>
  224.87 +<tr class="separator:ae2a2848b721cfa44a7e963484c5e4b28"><td class="memSeparator" colspan="2">&#160;</td></tr>
  224.88 +</table>
  224.89 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
  224.90 +<div class="textblock"><p>Metadata for each UCX stack element. </p>
  224.91 +</div><hr/>The documentation for this struct was generated from the following file:<ul>
  224.92 +<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="stack_8h_source.html">stack.h</a></li>
  224.93 +</ul>
  224.94 +</div><!-- contents -->
  224.95 +<!-- start footer part -->
  224.96 +<hr class="footer"/><address class="footer"><small>
  224.97 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  224.98 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  224.99 +</a> 1.8.13
 224.100 +</small></address>
 224.101 +</body>
 224.102 +</html>
   225.1 Binary file docs/api-2.1/sync_off.png has changed
   226.1 Binary file docs/api-2.1/sync_on.png has changed
   227.1 Binary file docs/api-2.1/tab_a.png has changed
   228.1 Binary file docs/api-2.1/tab_b.png has changed
   229.1 Binary file docs/api-2.1/tab_h.png has changed
   230.1 Binary file docs/api-2.1/tab_s.png has changed
   231.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   231.2 +++ b/docs/api-2.1/tabs.css	Sat Feb 06 19:11:44 2021 +0100
   231.3 @@ -0,0 +1,1 @@
   231.4 +.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}}
   232.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   232.2 +++ b/docs/api-2.1/test_8h.html	Sat Feb 06 19:11:44 2021 +0100
   232.3 @@ -0,0 +1,547 @@
   232.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   232.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   232.6 +<head>
   232.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   232.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   232.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  232.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  232.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/test.h File Reference</title>
  232.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  232.13 +<script type="text/javascript" src="jquery.js"></script>
  232.14 +<script type="text/javascript" src="dynsections.js"></script>
  232.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  232.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  232.17 +<script type="text/javascript" src="search/search.js"></script>
  232.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  232.19 +</head>
  232.20 +<body>
  232.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  232.22 +<div id="titlearea">
  232.23 +<table cellspacing="0" cellpadding="0">
  232.24 + <tbody>
  232.25 + <tr style="height: 56px;">
  232.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  232.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  232.28 +   <div id="projectname">ucx
  232.29 +   </div>
  232.30 +   <div id="projectbrief">UAP Common Extensions</div>
  232.31 +  </td>
  232.32 + </tr>
  232.33 + </tbody>
  232.34 +</table>
  232.35 +</div>
  232.36 +<!-- end header part -->
  232.37 +<!-- Generated by Doxygen 1.8.13 -->
  232.38 +<script type="text/javascript">
  232.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  232.40 +</script>
  232.41 +<script type="text/javascript" src="menudata.js"></script>
  232.42 +<script type="text/javascript" src="menu.js"></script>
  232.43 +<script type="text/javascript">
  232.44 +$(function() {
  232.45 +  initMenu('',true,false,'search.php','Search');
  232.46 +  $(document).ready(function() { init_search(); });
  232.47 +});
  232.48 +</script>
  232.49 +<div id="main-nav"></div>
  232.50 +<!-- window showing the filter options -->
  232.51 +<div id="MSearchSelectWindow"
  232.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  232.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  232.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  232.55 +</div>
  232.56 +
  232.57 +<!-- iframe showing the search results (closed by default) -->
  232.58 +<div id="MSearchResultsWindow">
  232.59 +<iframe src="javascript:void(0)" frameborder="0" 
  232.60 +        name="MSearchResults" id="MSearchResults">
  232.61 +</iframe>
  232.62 +</div>
  232.63 +
  232.64 +<div id="nav-path" class="navpath">
  232.65 +  <ul>
  232.66 +<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>
  232.67 +</div>
  232.68 +</div><!-- top -->
  232.69 +<div class="header">
  232.70 +  <div class="summary">
  232.71 +<a href="#nested-classes">Data Structures</a> &#124;
  232.72 +<a href="#define-members">Macros</a> &#124;
  232.73 +<a href="#typedef-members">Typedefs</a> &#124;
  232.74 +<a href="#func-members">Functions</a>  </div>
  232.75 +  <div class="headertitle">
  232.76 +<div class="title">test.h File Reference</div>  </div>
  232.77 +</div><!--header-->
  232.78 +<div class="contents">
  232.79 +
  232.80 +<p>UCX Test Framework.  
  232.81 +<a href="#details">More...</a></p>
  232.82 +<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
  232.83 +<code>#include &lt;stdio.h&gt;</code><br />
  232.84 +<code>#include &lt;<a class="el" href="string_8h_source.html">string.h</a>&gt;</code><br />
  232.85 +<code>#include &lt;setjmp.h&gt;</code><br />
  232.86 +</div>
  232.87 +<p><a href="test_8h_source.html">Go to the source code of this file.</a></p>
  232.88 +<table class="memberdecls">
  232.89 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
  232.90 +Data Structures</h2></td></tr>
  232.91 +<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>
  232.92 +<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>
  232.93 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
  232.94 +<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>
  232.95 +<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>
  232.96 +<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
  232.97 +</table><table class="memberdecls">
  232.98 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
  232.99 +Macros</h2></td></tr>
 232.100 +<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>
 232.101 +<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>
 232.102 +<tr class="separator:a828bb1dfda1afd67ca795075903d227d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 232.103 +<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>
 232.104 +<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>
 232.105 +<tr class="separator:a66cfb29c329fc9eaef071f2449836659"><td class="memSeparator" colspan="2">&#160;</td></tr>
 232.106 +<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>
 232.107 +<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>
 232.108 +<tr class="separator:a0547b8d4f3bcdb0633fdd8925e8aa5d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 232.109 +<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>
 232.110 +<tr class="memdesc:a08f477cd12fc3fe741a92493e5df58a9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks a test assertion.  <a href="#a08f477cd12fc3fe741a92493e5df58a9">More...</a><br /></td></tr>
 232.111 +<tr class="separator:a08f477cd12fc3fe741a92493e5df58a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
 232.112 +<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>
 232.113 +<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>
 232.114 +<tr class="separator:ae073cf5ead22cb27d662da048e16f44a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 232.115 +<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>
 232.116 +<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>
 232.117 +<tr class="separator:a0efbab91c54f5237a2ab207f48cf0e51"><td class="memSeparator" colspan="2">&#160;</td></tr>
 232.118 +<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>
 232.119 +<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>
 232.120 +<tr class="separator:a86e64857c04f0447f8b16fb9c2b3b639"><td class="memSeparator" colspan="2">&#160;</td></tr>
 232.121 +</table><table class="memberdecls">
 232.122 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
 232.123 +Typedefs</h2></td></tr>
 232.124 +<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>
 232.125 +<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>
 232.126 +<tr class="separator:a52115d1d0f1c4a565ed6ef7c1bfd0363"><td class="memSeparator" colspan="2">&#160;</td></tr>
 232.127 +<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>
 232.128 +<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>
 232.129 +<tr class="separator:ae906817354c010b83c2784260cce7a1c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 232.130 +<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>
 232.131 +<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>
 232.132 +<tr class="separator:a8048c50ae73ea690b776edfd63bd6a5d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 232.133 +</table><table class="memberdecls">
 232.134 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
 232.135 +Functions</h2></td></tr>
 232.136 +<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>
 232.137 +<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>
 232.138 +<tr class="separator:a531f0df90363e0befbe900878f65f09e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 232.139 +<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>
 232.140 +<tr class="memdesc:a4a6ac61a6f72722273f8eaa7a343edde"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys a test suite.  <a href="#a4a6ac61a6f72722273f8eaa7a343edde">More...</a><br /></td></tr>
 232.141 +<tr class="separator:a4a6ac61a6f72722273f8eaa7a343edde"><td class="memSeparator" colspan="2">&#160;</td></tr>
 232.142 +<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>
 232.143 +<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>
 232.144 +<tr class="separator:a8dfabc42f183d3a4d79379a5d17bf67d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 232.145 +<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>
 232.146 +<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>
 232.147 +<tr class="separator:a3721458deeecb43aa322428f007714c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
 232.148 +</table>
 232.149 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 232.150 +<div class="textblock"><p>UCX Test Framework. </p>
 232.151 +<p>Usage of this test framework:</p>
 232.152 +<p>**** IN HEADER FILE: ****</p>
 232.153 +<pre>
 232.154 +<a class="el" href="test_8h.html#a66cfb29c329fc9eaef071f2449836659" title="Macro for a UcxTest function header. ">UCX_TEST(function_name)</a>;
 232.155 +<a class="el" href="test_8h.html#ae073cf5ead22cb27d662da048e16f44a" title="Macro for a test subroutine function header. ">UCX_TEST_SUBROUTINE(subroutine_name, paramlist)</a>; // optional
 232.156 +</pre><p>**** IN SOURCE FILE: **** </p><pre>
 232.157 +<a class="el" href="test_8h.html#ae073cf5ead22cb27d662da048e16f44a" title="Macro for a test subroutine function header. ">UCX_TEST_SUBROUTINE(subroutine_name, paramlist)</a> {
 232.158 +  // tests with <a class="el" href="test_8h.html#a08f477cd12fc3fe741a92493e5df58a9" title="Checks a test assertion. ">UCX_TEST_ASSERT()</a>
 232.159 +}</pre><pre><a class="el" href="test_8h.html#a66cfb29c329fc9eaef071f2449836659" title="Macro for a UcxTest function header. ">UCX_TEST(function_name)</a> {
 232.160 +  // memory allocation and other stuff here
 232.161 +  <a class="el" href="test_8h.html#a0547b8d4f3bcdb0633fdd8925e8aa5d4" title="Marks the begin of a test. ">UCX_TEST_BEGIN</a>
 232.162 +  // tests with <a class="el" href="test_8h.html#a08f477cd12fc3fe741a92493e5df58a9" title="Checks a test assertion. ">UCX_TEST_ASSERT()</a> and/or
 232.163 +  // calls with <a class="el" href="test_8h.html#a0efbab91c54f5237a2ab207f48cf0e51" title="Macro for calling a test subroutine. ">UCX_TEST_CALL_SUBROUTINE()</a> here
 232.164 +  <a class="el" href="test_8h.html#a86e64857c04f0447f8b16fb9c2b3b639" title="Marks the end of a test. ">UCX_TEST_END</a>
 232.165 +  // cleanup of memory here
 232.166 +}
 232.167 +</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>
 232.168 +<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>
 232.169 +<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
 232.170 +<dd>
 232.171 +Olaf Wintermann </dd></dl>
 232.172 +</div><h2 class="groupheader">Macro Definition Documentation</h2>
 232.173 +<a id="a828bb1dfda1afd67ca795075903d227d"></a>
 232.174 +<h2 class="memtitle"><span class="permalink"><a href="#a828bb1dfda1afd67ca795075903d227d">&#9670;&nbsp;</a></span>__FUNCTION__</h2>
 232.175 +
 232.176 +<div class="memitem">
 232.177 +<div class="memproto">
 232.178 +      <table class="memname">
 232.179 +        <tr>
 232.180 +          <td class="memname">#define __FUNCTION__&#160;&#160;&#160;__func__</td>
 232.181 +        </tr>
 232.182 +      </table>
 232.183 +</div><div class="memdoc">
 232.184 +
 232.185 +<p>Alias for the <code>__func__</code> preprocessor macro. </p>
 232.186 +<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>
 232.187 +
 232.188 +</div>
 232.189 +</div>
 232.190 +<a id="a66cfb29c329fc9eaef071f2449836659"></a>
 232.191 +<h2 class="memtitle"><span class="permalink"><a href="#a66cfb29c329fc9eaef071f2449836659">&#9670;&nbsp;</a></span>UCX_TEST</h2>
 232.192 +
 232.193 +<div class="memitem">
 232.194 +<div class="memproto">
 232.195 +      <table class="memname">
 232.196 +        <tr>
 232.197 +          <td class="memname">#define UCX_TEST</td>
 232.198 +          <td>(</td>
 232.199 +          <td class="paramtype">&#160;</td>
 232.200 +          <td class="paramname">name</td><td>)</td>
 232.201 +          <td>&#160;&#160;&#160;void name(<a class="el" href="structUcxTestSuite.html">UcxTestSuite</a>* _suite_,FILE *_output_)</td>
 232.202 +        </tr>
 232.203 +      </table>
 232.204 +</div><div class="memdoc">
 232.205 +
 232.206 +<p>Macro for a <a class="el" href="test_8h.html#ae906817354c010b83c2784260cce7a1c" title="Pointer to a test function. ">UcxTest</a> function header. </p>
 232.207 +<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>
 232.208 +<dl class="params"><dt>Parameters</dt><dd>
 232.209 +  <table class="params">
 232.210 +    <tr><td class="paramname">name</td><td>the name of the test function </td></tr>
 232.211 +  </table>
 232.212 +  </dd>
 232.213 +</dl>
 232.214 +
 232.215 +</div>
 232.216 +</div>
 232.217 +<a id="a08f477cd12fc3fe741a92493e5df58a9"></a>
 232.218 +<h2 class="memtitle"><span class="permalink"><a href="#a08f477cd12fc3fe741a92493e5df58a9">&#9670;&nbsp;</a></span>UCX_TEST_ASSERT</h2>
 232.219 +
 232.220 +<div class="memitem">
 232.221 +<div class="memproto">
 232.222 +      <table class="memname">
 232.223 +        <tr>
 232.224 +          <td class="memname">#define UCX_TEST_ASSERT</td>
 232.225 +          <td>(</td>
 232.226 +          <td class="paramtype">&#160;</td>
 232.227 +          <td class="paramname">condition, </td>
 232.228 +        </tr>
 232.229 +        <tr>
 232.230 +          <td class="paramkey"></td>
 232.231 +          <td></td>
 232.232 +          <td class="paramtype">&#160;</td>
 232.233 +          <td class="paramname">message&#160;</td>
 232.234 +        </tr>
 232.235 +        <tr>
 232.236 +          <td></td>
 232.237 +          <td>)</td>
 232.238 +          <td></td><td></td>
 232.239 +        </tr>
 232.240 +      </table>
 232.241 +</div><div class="memdoc">
 232.242 +<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 -->
 232.243 +<p>Checks a test assertion. </p>
 232.244 +<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>
 232.245 +  <table class="params">
 232.246 +    <tr><td class="paramname">condition</td><td>the condition to check </td></tr>
 232.247 +    <tr><td class="paramname">message</td><td>the message that shall be printed out on failure </td></tr>
 232.248 +  </table>
 232.249 +  </dd>
 232.250 +</dl>
 232.251 +
 232.252 +</div>
 232.253 +</div>
 232.254 +<a id="a0547b8d4f3bcdb0633fdd8925e8aa5d4"></a>
 232.255 +<h2 class="memtitle"><span class="permalink"><a href="#a0547b8d4f3bcdb0633fdd8925e8aa5d4">&#9670;&nbsp;</a></span>UCX_TEST_BEGIN</h2>
 232.256 +
 232.257 +<div class="memitem">
 232.258 +<div class="memproto">
 232.259 +      <table class="memname">
 232.260 +        <tr>
 232.261 +          <td class="memname">#define UCX_TEST_BEGIN</td>
 232.262 +        </tr>
 232.263 +      </table>
 232.264 +</div><div class="memdoc">
 232.265 +<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>
 232.266 +</div><!-- fragment -->
 232.267 +<p>Marks the begin of a test. </p>
 232.268 +<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>
 232.269 +<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>
 232.270 +
 232.271 +</div>
 232.272 +</div>
 232.273 +<a id="a0efbab91c54f5237a2ab207f48cf0e51"></a>
 232.274 +<h2 class="memtitle"><span class="permalink"><a href="#a0efbab91c54f5237a2ab207f48cf0e51">&#9670;&nbsp;</a></span>UCX_TEST_CALL_SUBROUTINE</h2>
 232.275 +
 232.276 +<div class="memitem">
 232.277 +<div class="memproto">
 232.278 +      <table class="memname">
 232.279 +        <tr>
 232.280 +          <td class="memname">#define UCX_TEST_CALL_SUBROUTINE</td>
 232.281 +          <td>(</td>
 232.282 +          <td class="paramtype">&#160;</td>
 232.283 +          <td class="paramname">name, </td>
 232.284 +        </tr>
 232.285 +        <tr>
 232.286 +          <td class="paramkey"></td>
 232.287 +          <td></td>
 232.288 +          <td class="paramtype">&#160;</td>
 232.289 +          <td class="paramname"><em>...</em>&#160;</td>
 232.290 +        </tr>
 232.291 +        <tr>
 232.292 +          <td></td>
 232.293 +          <td>)</td>
 232.294 +          <td></td><td>&#160;&#160;&#160;name(_suite_,_output_,_env_,__VA_ARGS__);</td>
 232.295 +        </tr>
 232.296 +      </table>
 232.297 +</div><div class="memdoc">
 232.298 +
 232.299 +<p>Macro for calling a test subroutine. </p>
 232.300 +<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>
 232.301 +<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>
 232.302 +<dl class="params"><dt>Parameters</dt><dd>
 232.303 +  <table class="params">
 232.304 +    <tr><td class="paramname">name</td><td>the name of the subroutine </td></tr>
 232.305 +    <tr><td class="paramname">...</td><td>the argument list</td></tr>
 232.306 +  </table>
 232.307 +  </dd>
 232.308 +</dl>
 232.309 +<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>
 232.310 +
 232.311 +</div>
 232.312 +</div>
 232.313 +<a id="a86e64857c04f0447f8b16fb9c2b3b639"></a>
 232.314 +<h2 class="memtitle"><span class="permalink"><a href="#a86e64857c04f0447f8b16fb9c2b3b639">&#9670;&nbsp;</a></span>UCX_TEST_END</h2>
 232.315 +
 232.316 +<div class="memitem">
 232.317 +<div class="memproto">
 232.318 +      <table class="memname">
 232.319 +        <tr>
 232.320 +          <td class="memname">#define UCX_TEST_END&#160;&#160;&#160;fwrite(&quot;success.\n&quot;, 1, 9, _output_); _suite_-&gt;success++;}</td>
 232.321 +        </tr>
 232.322 +      </table>
 232.323 +</div><div class="memdoc">
 232.324 +
 232.325 +<p>Marks the end of a test. </p>
 232.326 +<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>
 232.327 +<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>
 232.328 +
 232.329 +</div>
 232.330 +</div>
 232.331 +<a id="ae073cf5ead22cb27d662da048e16f44a"></a>
 232.332 +<h2 class="memtitle"><span class="permalink"><a href="#ae073cf5ead22cb27d662da048e16f44a">&#9670;&nbsp;</a></span>UCX_TEST_SUBROUTINE</h2>
 232.333 +
 232.334 +<div class="memitem">
 232.335 +<div class="memproto">
 232.336 +      <table class="memname">
 232.337 +        <tr>
 232.338 +          <td class="memname">#define UCX_TEST_SUBROUTINE</td>
 232.339 +          <td>(</td>
 232.340 +          <td class="paramtype">&#160;</td>
 232.341 +          <td class="paramname">name, </td>
 232.342 +        </tr>
 232.343 +        <tr>
 232.344 +          <td class="paramkey"></td>
 232.345 +          <td></td>
 232.346 +          <td class="paramtype">&#160;</td>
 232.347 +          <td class="paramname"><em>...</em>&#160;</td>
 232.348 +        </tr>
 232.349 +        <tr>
 232.350 +          <td></td>
 232.351 +          <td>)</td>
 232.352 +          <td></td><td></td>
 232.353 +        </tr>
 232.354 +      </table>
 232.355 +</div><div class="memdoc">
 232.356 +<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>
 232.357 +</div><!-- fragment -->
 232.358 +<p>Macro for a test subroutine function header. </p>
 232.359 +<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>
 232.360 +<dl class="params"><dt>Parameters</dt><dd>
 232.361 +  <table class="params">
 232.362 +    <tr><td class="paramname">name</td><td>the name of the subroutine </td></tr>
 232.363 +    <tr><td class="paramname">...</td><td>the parameter list</td></tr>
 232.364 +  </table>
 232.365 +  </dd>
 232.366 +</dl>
 232.367 +<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>
 232.368 +
 232.369 +</div>
 232.370 +</div>
 232.371 +<h2 class="groupheader">Typedef Documentation</h2>
 232.372 +<a id="ae906817354c010b83c2784260cce7a1c"></a>
 232.373 +<h2 class="memtitle"><span class="permalink"><a href="#ae906817354c010b83c2784260cce7a1c">&#9670;&nbsp;</a></span>UcxTest</h2>
 232.374 +
 232.375 +<div class="memitem">
 232.376 +<div class="memproto">
 232.377 +      <table class="memname">
 232.378 +        <tr>
 232.379 +          <td class="memname">typedef void(* UcxTest) (<a class="el" href="structUcxTestSuite.html">UcxTestSuite</a> *, FILE *)</td>
 232.380 +        </tr>
 232.381 +      </table>
 232.382 +</div><div class="memdoc">
 232.383 +
 232.384 +<p>Pointer to a test function. </p>
 232.385 +
 232.386 +</div>
 232.387 +</div>
 232.388 +<a id="a8048c50ae73ea690b776edfd63bd6a5d"></a>
 232.389 +<h2 class="memtitle"><span class="permalink"><a href="#a8048c50ae73ea690b776edfd63bd6a5d">&#9670;&nbsp;</a></span>UcxTestList</h2>
 232.390 +
 232.391 +<div class="memitem">
 232.392 +<div class="memproto">
 232.393 +      <table class="memname">
 232.394 +        <tr>
 232.395 +          <td class="memname">typedef struct <a class="el" href="structUcxTestList.html">UcxTestList</a> <a class="el" href="structUcxTestList.html">UcxTestList</a></td>
 232.396 +        </tr>
 232.397 +      </table>
 232.398 +</div><div class="memdoc">
 232.399 +
 232.400 +<p>Type for the internal list of test cases. </p>
 232.401 +
 232.402 +</div>
 232.403 +</div>
 232.404 +<a id="a52115d1d0f1c4a565ed6ef7c1bfd0363"></a>
 232.405 +<h2 class="memtitle"><span class="permalink"><a href="#a52115d1d0f1c4a565ed6ef7c1bfd0363">&#9670;&nbsp;</a></span>UcxTestSuite</h2>
 232.406 +
 232.407 +<div class="memitem">
 232.408 +<div class="memproto">
 232.409 +      <table class="memname">
 232.410 +        <tr>
 232.411 +          <td class="memname">typedef struct <a class="el" href="structUcxTestSuite.html">UcxTestSuite</a> <a class="el" href="structUcxTestSuite.html">UcxTestSuite</a></td>
 232.412 +        </tr>
 232.413 +      </table>
 232.414 +</div><div class="memdoc">
 232.415 +
 232.416 +<p>Type for the <a class="el" href="structUcxTestSuite.html" title="A test suite containing multiple test cases. ">UcxTestSuite</a>. </p>
 232.417 +
 232.418 +</div>
 232.419 +</div>
 232.420 +<h2 class="groupheader">Function Documentation</h2>
 232.421 +<a id="a8dfabc42f183d3a4d79379a5d17bf67d"></a>
 232.422 +<h2 class="memtitle"><span class="permalink"><a href="#a8dfabc42f183d3a4d79379a5d17bf67d">&#9670;&nbsp;</a></span>ucx_test_register()</h2>
 232.423 +
 232.424 +<div class="memitem">
 232.425 +<div class="memproto">
 232.426 +      <table class="memname">
 232.427 +        <tr>
 232.428 +          <td class="memname">int ucx_test_register </td>
 232.429 +          <td>(</td>
 232.430 +          <td class="paramtype"><a class="el" href="structUcxTestSuite.html">UcxTestSuite</a> *&#160;</td>
 232.431 +          <td class="paramname"><em>suite</em>, </td>
 232.432 +        </tr>
 232.433 +        <tr>
 232.434 +          <td class="paramkey"></td>
 232.435 +          <td></td>
 232.436 +          <td class="paramtype"><a class="el" href="test_8h.html#ae906817354c010b83c2784260cce7a1c">UcxTest</a>&#160;</td>
 232.437 +          <td class="paramname"><em>test</em>&#160;</td>
 232.438 +        </tr>
 232.439 +        <tr>
 232.440 +          <td></td>
 232.441 +          <td>)</td>
 232.442 +          <td></td><td></td>
 232.443 +        </tr>
 232.444 +      </table>
 232.445 +</div><div class="memdoc">
 232.446 +
 232.447 +<p>Registers a test function with the specified test suite. </p>
 232.448 +<dl class="params"><dt>Parameters</dt><dd>
 232.449 +  <table class="params">
 232.450 +    <tr><td class="paramname">suite</td><td>the suite, the test function shall be added to </td></tr>
 232.451 +    <tr><td class="paramname">test</td><td>the test function to register </td></tr>
 232.452 +  </table>
 232.453 +  </dd>
 232.454 +</dl>
 232.455 +<dl class="section return"><dt>Returns</dt><dd><code>EXIT_SUCCESS</code> on success or <code>EXIT_FAILURE</code> on failure </dd></dl>
 232.456 +
 232.457 +</div>
 232.458 +</div>
 232.459 +<a id="a3721458deeecb43aa322428f007714c3"></a>
 232.460 +<h2 class="memtitle"><span class="permalink"><a href="#a3721458deeecb43aa322428f007714c3">&#9670;&nbsp;</a></span>ucx_test_run()</h2>
 232.461 +
 232.462 +<div class="memitem">
 232.463 +<div class="memproto">
 232.464 +      <table class="memname">
 232.465 +        <tr>
 232.466 +          <td class="memname">void ucx_test_run </td>
 232.467 +          <td>(</td>
 232.468 +          <td class="paramtype"><a class="el" href="structUcxTestSuite.html">UcxTestSuite</a> *&#160;</td>
 232.469 +          <td class="paramname"><em>suite</em>, </td>
 232.470 +        </tr>
 232.471 +        <tr>
 232.472 +          <td class="paramkey"></td>
 232.473 +          <td></td>
 232.474 +          <td class="paramtype">FILE *&#160;</td>
 232.475 +          <td class="paramname"><em>outstream</em>&#160;</td>
 232.476 +        </tr>
 232.477 +        <tr>
 232.478 +          <td></td>
 232.479 +          <td>)</td>
 232.480 +          <td></td><td></td>
 232.481 +        </tr>
 232.482 +      </table>
 232.483 +</div><div class="memdoc">
 232.484 +
 232.485 +<p>Runs a test suite and writes the test log to the specified stream. </p>
 232.486 +<dl class="params"><dt>Parameters</dt><dd>
 232.487 +  <table class="params">
 232.488 +    <tr><td class="paramname">suite</td><td>the test suite to run </td></tr>
 232.489 +    <tr><td class="paramname">outstream</td><td>the stream the log shall be written to </td></tr>
 232.490 +  </table>
 232.491 +  </dd>
 232.492 +</dl>
 232.493 +
 232.494 +</div>
 232.495 +</div>
 232.496 +<a id="a4a6ac61a6f72722273f8eaa7a343edde"></a>
 232.497 +<h2 class="memtitle"><span class="permalink"><a href="#a4a6ac61a6f72722273f8eaa7a343edde">&#9670;&nbsp;</a></span>ucx_test_suite_free()</h2>
 232.498 +
 232.499 +<div class="memitem">
 232.500 +<div class="memproto">
 232.501 +      <table class="memname">
 232.502 +        <tr>
 232.503 +          <td class="memname">void ucx_test_suite_free </td>
 232.504 +          <td>(</td>
 232.505 +          <td class="paramtype"><a class="el" href="structUcxTestSuite.html">UcxTestSuite</a> *&#160;</td>
 232.506 +          <td class="paramname"><em>suite</em></td><td>)</td>
 232.507 +          <td></td>
 232.508 +        </tr>
 232.509 +      </table>
 232.510 +</div><div class="memdoc">
 232.511 +
 232.512 +<p>Destroys a test suite. </p>
 232.513 +<dl class="params"><dt>Parameters</dt><dd>
 232.514 +  <table class="params">
 232.515 +    <tr><td class="paramname">suite</td><td>the test suite to destroy </td></tr>
 232.516 +  </table>
 232.517 +  </dd>
 232.518 +</dl>
 232.519 +
 232.520 +</div>
 232.521 +</div>
 232.522 +<a id="a531f0df90363e0befbe900878f65f09e"></a>
 232.523 +<h2 class="memtitle"><span class="permalink"><a href="#a531f0df90363e0befbe900878f65f09e">&#9670;&nbsp;</a></span>ucx_test_suite_new()</h2>
 232.524 +
 232.525 +<div class="memitem">
 232.526 +<div class="memproto">
 232.527 +      <table class="memname">
 232.528 +        <tr>
 232.529 +          <td class="memname"><a class="el" href="structUcxTestSuite.html">UcxTestSuite</a>* ucx_test_suite_new </td>
 232.530 +          <td>(</td>
 232.531 +          <td class="paramname"></td><td>)</td>
 232.532 +          <td></td>
 232.533 +        </tr>
 232.534 +      </table>
 232.535 +</div><div class="memdoc">
 232.536 +
 232.537 +<p>Creates a new test suite. </p>
 232.538 +<dl class="section return"><dt>Returns</dt><dd>a new test suite </dd></dl>
 232.539 +
 232.540 +</div>
 232.541 +</div>
 232.542 +</div><!-- contents -->
 232.543 +<!-- start footer part -->
 232.544 +<hr class="footer"/><address class="footer"><small>
 232.545 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 232.546 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 232.547 +</a> 1.8.13
 232.548 +</small></address>
 232.549 +</body>
 232.550 +</html>
   233.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   233.2 +++ b/docs/api-2.1/test_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
   233.3 @@ -0,0 +1,93 @@
   233.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   233.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   233.6 +<head>
   233.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   233.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   233.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  233.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  233.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/test.h Source File</title>
  233.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  233.13 +<script type="text/javascript" src="jquery.js"></script>
  233.14 +<script type="text/javascript" src="dynsections.js"></script>
  233.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  233.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  233.17 +<script type="text/javascript" src="search/search.js"></script>
  233.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  233.19 +</head>
  233.20 +<body>
  233.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  233.22 +<div id="titlearea">
  233.23 +<table cellspacing="0" cellpadding="0">
  233.24 + <tbody>
  233.25 + <tr style="height: 56px;">
  233.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  233.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  233.28 +   <div id="projectname">ucx
  233.29 +   </div>
  233.30 +   <div id="projectbrief">UAP Common Extensions</div>
  233.31 +  </td>
  233.32 + </tr>
  233.33 + </tbody>
  233.34 +</table>
  233.35 +</div>
  233.36 +<!-- end header part -->
  233.37 +<!-- Generated by Doxygen 1.8.13 -->
  233.38 +<script type="text/javascript">
  233.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  233.40 +</script>
  233.41 +<script type="text/javascript" src="menudata.js"></script>
  233.42 +<script type="text/javascript" src="menu.js"></script>
  233.43 +<script type="text/javascript">
  233.44 +$(function() {
  233.45 +  initMenu('',true,false,'search.php','Search');
  233.46 +  $(document).ready(function() { init_search(); });
  233.47 +});
  233.48 +</script>
  233.49 +<div id="main-nav"></div>
  233.50 +<!-- window showing the filter options -->
  233.51 +<div id="MSearchSelectWindow"
  233.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  233.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  233.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  233.55 +</div>
  233.56 +
  233.57 +<!-- iframe showing the search results (closed by default) -->
  233.58 +<div id="MSearchResultsWindow">
  233.59 +<iframe src="javascript:void(0)" frameborder="0" 
  233.60 +        name="MSearchResults" id="MSearchResults">
  233.61 +</iframe>
  233.62 +</div>
  233.63 +
  233.64 +<div id="nav-path" class="navpath">
  233.65 +  <ul>
  233.66 +<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>
  233.67 +</div>
  233.68 +</div><!-- top -->
  233.69 +<div class="header">
  233.70 +  <div class="headertitle">
  233.71 +<div class="title">test.h</div>  </div>
  233.72 +</div><!--header-->
  233.73 +<div class="contents">
  233.74 +<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>
  233.75 +<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>
  233.76 +<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>
  233.77 +<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>
  233.78 +<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>
  233.79 +<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>
  233.80 +<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>
  233.81 +<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>
  233.82 +<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>
  233.83 +<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>
  233.84 +<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>
  233.85 +<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>
  233.86 +<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>
  233.87 +<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>
  233.88 +</div><!-- fragment --></div><!-- contents -->
  233.89 +<!-- start footer part -->
  233.90 +<hr class="footer"/><address class="footer"><small>
  233.91 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  233.92 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  233.93 +</a> 1.8.13
  233.94 +</small></address>
  233.95 +</body>
  233.96 +</html>
   234.1 Binary file docs/api-2.1/uaplogo.png has changed
   235.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   235.2 +++ b/docs/api-2.1/ucx_8h.html	Sat Feb 06 19:11:44 2021 +0100
   235.3 @@ -0,0 +1,388 @@
   235.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   235.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   235.6 +<head>
   235.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   235.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   235.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  235.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  235.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/ucx.h File Reference</title>
  235.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  235.13 +<script type="text/javascript" src="jquery.js"></script>
  235.14 +<script type="text/javascript" src="dynsections.js"></script>
  235.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  235.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  235.17 +<script type="text/javascript" src="search/search.js"></script>
  235.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  235.19 +</head>
  235.20 +<body>
  235.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  235.22 +<div id="titlearea">
  235.23 +<table cellspacing="0" cellpadding="0">
  235.24 + <tbody>
  235.25 + <tr style="height: 56px;">
  235.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  235.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  235.28 +   <div id="projectname">ucx
  235.29 +   </div>
  235.30 +   <div id="projectbrief">UAP Common Extensions</div>
  235.31 +  </td>
  235.32 + </tr>
  235.33 + </tbody>
  235.34 +</table>
  235.35 +</div>
  235.36 +<!-- end header part -->
  235.37 +<!-- Generated by Doxygen 1.8.13 -->
  235.38 +<script type="text/javascript">
  235.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  235.40 +</script>
  235.41 +<script type="text/javascript" src="menudata.js"></script>
  235.42 +<script type="text/javascript" src="menu.js"></script>
  235.43 +<script type="text/javascript">
  235.44 +$(function() {
  235.45 +  initMenu('',true,false,'search.php','Search');
  235.46 +  $(document).ready(function() { init_search(); });
  235.47 +});
  235.48 +</script>
  235.49 +<div id="main-nav"></div>
  235.50 +<!-- window showing the filter options -->
  235.51 +<div id="MSearchSelectWindow"
  235.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  235.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  235.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  235.55 +</div>
  235.56 +
  235.57 +<!-- iframe showing the search results (closed by default) -->
  235.58 +<div id="MSearchResultsWindow">
  235.59 +<iframe src="javascript:void(0)" frameborder="0" 
  235.60 +        name="MSearchResults" id="MSearchResults">
  235.61 +</iframe>
  235.62 +</div>
  235.63 +
  235.64 +<div id="nav-path" class="navpath">
  235.65 +  <ul>
  235.66 +<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>
  235.67 +</div>
  235.68 +</div><!-- top -->
  235.69 +<div class="header">
  235.70 +  <div class="summary">
  235.71 +<a href="#define-members">Macros</a> &#124;
  235.72 +<a href="#typedef-members">Typedefs</a> &#124;
  235.73 +<a href="#func-members">Functions</a>  </div>
  235.74 +  <div class="headertitle">
  235.75 +<div class="title">ucx.h File Reference</div>  </div>
  235.76 +</div><!--header-->
  235.77 +<div class="contents">
  235.78 +
  235.79 +<p>Main UCX Header providing most common definitions.  
  235.80 +<a href="#details">More...</a></p>
  235.81 +<div class="textblock"><code>#include &lt;stdlib.h&gt;</code><br />
  235.82 +<code>#include &lt;stdint.h&gt;</code><br />
  235.83 +<code>#include &lt;sys/types.h&gt;</code><br />
  235.84 +</div>
  235.85 +<p><a href="ucx_8h_source.html">Go to the source code of this file.</a></p>
  235.86 +<table class="memberdecls">
  235.87 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
  235.88 +Macros</h2></td></tr>
  235.89 +<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>
  235.90 +<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>
  235.91 +<tr class="separator:aa57e5dd22d42387d748cc16777df1383"><td class="memSeparator" colspan="2">&#160;</td></tr>
  235.92 +<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>
  235.93 +<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>
  235.94 +<tr class="separator:a9ac10d6353e23d4615a87fc737c65eb0"><td class="memSeparator" colspan="2">&#160;</td></tr>
  235.95 +<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>
  235.96 +<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>
  235.97 +<tr class="separator:af12001920ca2fc1405615684e4dea284"><td class="memSeparator" colspan="2">&#160;</td></tr>
  235.98 +<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>
  235.99 +<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>
 235.100 +<tr class="separator:a0b5ed6c1a0b15356f4f948acfd32a4cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
 235.101 +</table><table class="memberdecls">
 235.102 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
 235.103 +Typedefs</h2></td></tr>
 235.104 +<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>
 235.105 +<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>
 235.106 +<tr class="separator:ad2b370c2809914c8b7fedab163c266b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
 235.107 +<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>
 235.108 +<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>
 235.109 +<tr class="separator:afe5e2d5dbf34778e0e97852051570791"><td class="memSeparator" colspan="2">&#160;</td></tr>
 235.110 +<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>
 235.111 +<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>
 235.112 +<tr class="separator:a0bc5bf89e556c1d45d10863d52728ac9"><td class="memSeparator" colspan="2">&#160;</td></tr>
 235.113 +<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>
 235.114 +<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>
 235.115 +<tr class="separator:aab917a5fe0965673c73e8ebd0a1fc967"><td class="memSeparator" colspan="2">&#160;</td></tr>
 235.116 +<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>
 235.117 +<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>
 235.118 +<tr class="separator:a989b3f0fa4d307d278378fde435641ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
 235.119 +<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>
 235.120 +<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>
 235.121 +<tr class="separator:a6a67e255e460acb58f802067b3ff5fd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 235.122 +</table><table class="memberdecls">
 235.123 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
 235.124 +Functions</h2></td></tr>
 235.125 +<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>
 235.126 +<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>
 235.127 +<tr class="separator:a6637171cc0ec097b297f731a3036dd3b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 235.128 +</table>
 235.129 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 235.130 +<div class="textblock"><p>Main UCX Header providing most common definitions. </p>
 235.131 +<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
 235.132 +<dd>
 235.133 +Olaf Wintermann </dd></dl>
 235.134 +</div><h2 class="groupheader">Macro Definition Documentation</h2>
 235.135 +<a id="a0b5ed6c1a0b15356f4f948acfd32a4cc"></a>
 235.136 +<h2 class="memtitle"><span class="permalink"><a href="#a0b5ed6c1a0b15356f4f948acfd32a4cc">&#9670;&nbsp;</a></span>ucx_szmul</h2>
 235.137 +
 235.138 +<div class="memitem">
 235.139 +<div class="memproto">
 235.140 +      <table class="memname">
 235.141 +        <tr>
 235.142 +          <td class="memname">#define ucx_szmul</td>
 235.143 +          <td>(</td>
 235.144 +          <td class="paramtype">&#160;</td>
 235.145 +          <td class="paramname">a, </td>
 235.146 +        </tr>
 235.147 +        <tr>
 235.148 +          <td class="paramkey"></td>
 235.149 +          <td></td>
 235.150 +          <td class="paramtype">&#160;</td>
 235.151 +          <td class="paramname">b, </td>
 235.152 +        </tr>
 235.153 +        <tr>
 235.154 +          <td class="paramkey"></td>
 235.155 +          <td></td>
 235.156 +          <td class="paramtype">&#160;</td>
 235.157 +          <td class="paramname">result&#160;</td>
 235.158 +        </tr>
 235.159 +        <tr>
 235.160 +          <td></td>
 235.161 +          <td>)</td>
 235.162 +          <td></td><td>&#160;&#160;&#160;<a class="el" href="ucx_8h.html#a6637171cc0ec097b297f731a3036dd3b">ucx_szmul_impl</a>(a, b, result)</td>
 235.163 +        </tr>
 235.164 +      </table>
 235.165 +</div><div class="memdoc">
 235.166 +
 235.167 +<p>Performs a multiplication of size_t values and checks for overflow. </p>
 235.168 +<dl class="params"><dt>Parameters</dt><dd>
 235.169 +  <table class="params">
 235.170 +    <tr><td class="paramname">a</td><td>first operand </td></tr>
 235.171 +    <tr><td class="paramname">b</td><td>second operand </td></tr>
 235.172 +    <tr><td class="paramname">result</td><td>a pointer to a size_t, where the result should be stored </td></tr>
 235.173 +  </table>
 235.174 +  </dd>
 235.175 +</dl>
 235.176 +<dl class="section return"><dt>Returns</dt><dd>zero, if no overflow occurred and the result is correct, non-zero otherwise </dd></dl>
 235.177 +
 235.178 +</div>
 235.179 +</div>
 235.180 +<a id="af12001920ca2fc1405615684e4dea284"></a>
 235.181 +<h2 class="memtitle"><span class="permalink"><a href="#af12001920ca2fc1405615684e4dea284">&#9670;&nbsp;</a></span>UCX_VERSION</h2>
 235.182 +
 235.183 +<div class="memitem">
 235.184 +<div class="memproto">
 235.185 +      <table class="memname">
 235.186 +        <tr>
 235.187 +          <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>
 235.188 +        </tr>
 235.189 +      </table>
 235.190 +</div><div class="memdoc">
 235.191 +
 235.192 +<p>Version constant which ensures to increase monotonically. </p>
 235.193 +
 235.194 +</div>
 235.195 +</div>
 235.196 +<a id="aa57e5dd22d42387d748cc16777df1383"></a>
 235.197 +<h2 class="memtitle"><span class="permalink"><a href="#aa57e5dd22d42387d748cc16777df1383">&#9670;&nbsp;</a></span>UCX_VERSION_MAJOR</h2>
 235.198 +
 235.199 +<div class="memitem">
 235.200 +<div class="memproto">
 235.201 +      <table class="memname">
 235.202 +        <tr>
 235.203 +          <td class="memname">#define UCX_VERSION_MAJOR&#160;&#160;&#160;2</td>
 235.204 +        </tr>
 235.205 +      </table>
 235.206 +</div><div class="memdoc">
 235.207 +
 235.208 +<p>Major UCX version as integer constant. </p>
 235.209 +
 235.210 +</div>
 235.211 +</div>
 235.212 +<a id="a9ac10d6353e23d4615a87fc737c65eb0"></a>
 235.213 +<h2 class="memtitle"><span class="permalink"><a href="#a9ac10d6353e23d4615a87fc737c65eb0">&#9670;&nbsp;</a></span>UCX_VERSION_MINOR</h2>
 235.214 +
 235.215 +<div class="memitem">
 235.216 +<div class="memproto">
 235.217 +      <table class="memname">
 235.218 +        <tr>
 235.219 +          <td class="memname">#define UCX_VERSION_MINOR&#160;&#160;&#160;1</td>
 235.220 +        </tr>
 235.221 +      </table>
 235.222 +</div><div class="memdoc">
 235.223 +
 235.224 +<p>Minor UCX version as integer constant. </p>
 235.225 +
 235.226 +</div>
 235.227 +</div>
 235.228 +<h2 class="groupheader">Typedef Documentation</h2>
 235.229 +<a id="afe5e2d5dbf34778e0e97852051570791"></a>
 235.230 +<h2 class="memtitle"><span class="permalink"><a href="#afe5e2d5dbf34778e0e97852051570791">&#9670;&nbsp;</a></span>cmp_func</h2>
 235.231 +
 235.232 +<div class="memitem">
 235.233 +<div class="memproto">
 235.234 +      <table class="memname">
 235.235 +        <tr>
 235.236 +          <td class="memname">typedef int(* cmp_func) (const void *, const void *, void *)</td>
 235.237 +        </tr>
 235.238 +      </table>
 235.239 +</div><div class="memdoc">
 235.240 +
 235.241 +<p>Function pointer to a compare function. </p>
 235.242 +<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>
 235.243 +
 235.244 +</div>
 235.245 +</div>
 235.246 +<a id="aab917a5fe0965673c73e8ebd0a1fc967"></a>
 235.247 +<h2 class="memtitle"><span class="permalink"><a href="#aab917a5fe0965673c73e8ebd0a1fc967">&#9670;&nbsp;</a></span>copy_func</h2>
 235.248 +
 235.249 +<div class="memitem">
 235.250 +<div class="memproto">
 235.251 +      <table class="memname">
 235.252 +        <tr>
 235.253 +          <td class="memname">typedef void*(* copy_func) (const void *, void *)</td>
 235.254 +        </tr>
 235.255 +      </table>
 235.256 +</div><div class="memdoc">
 235.257 +
 235.258 +<p>Function pointer to a copy function. </p>
 235.259 +<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>
 235.260 +<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>
 235.261 +
 235.262 +</div>
 235.263 +</div>
 235.264 +<a id="a0bc5bf89e556c1d45d10863d52728ac9"></a>
 235.265 +<h2 class="memtitle"><span class="permalink"><a href="#a0bc5bf89e556c1d45d10863d52728ac9">&#9670;&nbsp;</a></span>distance_func</h2>
 235.266 +
 235.267 +<div class="memitem">
 235.268 +<div class="memproto">
 235.269 +      <table class="memname">
 235.270 +        <tr>
 235.271 +          <td class="memname">typedef intmax_t(* distance_func) (const void *, const void *, void *)</td>
 235.272 +        </tr>
 235.273 +      </table>
 235.274 +</div><div class="memdoc">
 235.275 +
 235.276 +<p>Function pointer to a distance function. </p>
 235.277 +<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>
 235.278 +
 235.279 +</div>
 235.280 +</div>
 235.281 +<a id="a6a67e255e460acb58f802067b3ff5fd5"></a>
 235.282 +<h2 class="memtitle"><span class="permalink"><a href="#a6a67e255e460acb58f802067b3ff5fd5">&#9670;&nbsp;</a></span>read_func</h2>
 235.283 +
 235.284 +<div class="memitem">
 235.285 +<div class="memproto">
 235.286 +      <table class="memname">
 235.287 +        <tr>
 235.288 +          <td class="memname">typedef size_t(* read_func) (void *, size_t, size_t, void *)</td>
 235.289 +        </tr>
 235.290 +      </table>
 235.291 +</div><div class="memdoc">
 235.292 +
 235.293 +<p>Function pointer to a read function. </p>
 235.294 +<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>
 235.295 +<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>
 235.296 +
 235.297 +</div>
 235.298 +</div>
 235.299 +<a id="ad2b370c2809914c8b7fedab163c266b3"></a>
 235.300 +<h2 class="memtitle"><span class="permalink"><a href="#ad2b370c2809914c8b7fedab163c266b3">&#9670;&nbsp;</a></span>ucx_destructor</h2>
 235.301 +
 235.302 +<div class="memitem">
 235.303 +<div class="memproto">
 235.304 +      <table class="memname">
 235.305 +        <tr>
 235.306 +          <td class="memname">typedef void(* ucx_destructor) (void *)</td>
 235.307 +        </tr>
 235.308 +      </table>
 235.309 +</div><div class="memdoc">
 235.310 +
 235.311 +<p>A function pointer to a destructor function. </p>
 235.312 +<dl class="section see"><dt>See also</dt><dd>ucx_mempool_setdestr() </dd>
 235.313 +<dd>
 235.314 +ucx_mempool_regdestr() </dd></dl>
 235.315 +
 235.316 +</div>
 235.317 +</div>
 235.318 +<a id="a989b3f0fa4d307d278378fde435641ed"></a>
 235.319 +<h2 class="memtitle"><span class="permalink"><a href="#a989b3f0fa4d307d278378fde435641ed">&#9670;&nbsp;</a></span>write_func</h2>
 235.320 +
 235.321 +<div class="memitem">
 235.322 +<div class="memproto">
 235.323 +      <table class="memname">
 235.324 +        <tr>
 235.325 +          <td class="memname">typedef size_t(* write_func) (const void *, size_t, size_t, void *)</td>
 235.326 +        </tr>
 235.327 +      </table>
 235.328 +</div><div class="memdoc">
 235.329 +
 235.330 +<p>Function pointer to a write function. </p>
 235.331 +<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>
 235.332 +<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>
 235.333 +
 235.334 +</div>
 235.335 +</div>
 235.336 +<h2 class="groupheader">Function Documentation</h2>
 235.337 +<a id="a6637171cc0ec097b297f731a3036dd3b"></a>
 235.338 +<h2 class="memtitle"><span class="permalink"><a href="#a6637171cc0ec097b297f731a3036dd3b">&#9670;&nbsp;</a></span>ucx_szmul_impl()</h2>
 235.339 +
 235.340 +<div class="memitem">
 235.341 +<div class="memproto">
 235.342 +      <table class="memname">
 235.343 +        <tr>
 235.344 +          <td class="memname">int ucx_szmul_impl </td>
 235.345 +          <td>(</td>
 235.346 +          <td class="paramtype">size_t&#160;</td>
 235.347 +          <td class="paramname"><em>a</em>, </td>
 235.348 +        </tr>
 235.349 +        <tr>
 235.350 +          <td class="paramkey"></td>
 235.351 +          <td></td>
 235.352 +          <td class="paramtype">size_t&#160;</td>
 235.353 +          <td class="paramname"><em>b</em>, </td>
 235.354 +        </tr>
 235.355 +        <tr>
 235.356 +          <td class="paramkey"></td>
 235.357 +          <td></td>
 235.358 +          <td class="paramtype">size_t *&#160;</td>
 235.359 +          <td class="paramname"><em>result</em>&#160;</td>
 235.360 +        </tr>
 235.361 +        <tr>
 235.362 +          <td></td>
 235.363 +          <td>)</td>
 235.364 +          <td></td><td></td>
 235.365 +        </tr>
 235.366 +      </table>
 235.367 +</div><div class="memdoc">
 235.368 +
 235.369 +<p>Performs a multiplication of size_t values and checks for overflow. </p>
 235.370 +<p>This is a custom implementation in case there is no compiler builtin available.</p>
 235.371 +<dl class="params"><dt>Parameters</dt><dd>
 235.372 +  <table class="params">
 235.373 +    <tr><td class="paramname">a</td><td>first operand </td></tr>
 235.374 +    <tr><td class="paramname">b</td><td>second operand </td></tr>
 235.375 +    <tr><td class="paramname">result</td><td>a pointer to a size_t where the result should be stored </td></tr>
 235.376 +  </table>
 235.377 +  </dd>
 235.378 +</dl>
 235.379 +<dl class="section return"><dt>Returns</dt><dd>zero, if no overflow occurred and the result is correct, non-zero otherwise </dd></dl>
 235.380 +
 235.381 +</div>
 235.382 +</div>
 235.383 +</div><!-- contents -->
 235.384 +<!-- start footer part -->
 235.385 +<hr class="footer"/><address class="footer"><small>
 235.386 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 235.387 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 235.388 +</a> 1.8.13
 235.389 +</small></address>
 235.390 +</body>
 235.391 +</html>
   236.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   236.2 +++ b/docs/api-2.1/ucx_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
   236.3 @@ -0,0 +1,85 @@
   236.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   236.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   236.6 +<head>
   236.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   236.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   236.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  236.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  236.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/ucx.h Source File</title>
  236.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  236.13 +<script type="text/javascript" src="jquery.js"></script>
  236.14 +<script type="text/javascript" src="dynsections.js"></script>
  236.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  236.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  236.17 +<script type="text/javascript" src="search/search.js"></script>
  236.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  236.19 +</head>
  236.20 +<body>
  236.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  236.22 +<div id="titlearea">
  236.23 +<table cellspacing="0" cellpadding="0">
  236.24 + <tbody>
  236.25 + <tr style="height: 56px;">
  236.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  236.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  236.28 +   <div id="projectname">ucx
  236.29 +   </div>
  236.30 +   <div id="projectbrief">UAP Common Extensions</div>
  236.31 +  </td>
  236.32 + </tr>
  236.33 + </tbody>
  236.34 +</table>
  236.35 +</div>
  236.36 +<!-- end header part -->
  236.37 +<!-- Generated by Doxygen 1.8.13 -->
  236.38 +<script type="text/javascript">
  236.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  236.40 +</script>
  236.41 +<script type="text/javascript" src="menudata.js"></script>
  236.42 +<script type="text/javascript" src="menu.js"></script>
  236.43 +<script type="text/javascript">
  236.44 +$(function() {
  236.45 +  initMenu('',true,false,'search.php','Search');
  236.46 +  $(document).ready(function() { init_search(); });
  236.47 +});
  236.48 +</script>
  236.49 +<div id="main-nav"></div>
  236.50 +<!-- window showing the filter options -->
  236.51 +<div id="MSearchSelectWindow"
  236.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  236.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  236.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  236.55 +</div>
  236.56 +
  236.57 +<!-- iframe showing the search results (closed by default) -->
  236.58 +<div id="MSearchResultsWindow">
  236.59 +<iframe src="javascript:void(0)" frameborder="0" 
  236.60 +        name="MSearchResults" id="MSearchResults">
  236.61 +</iframe>
  236.62 +</div>
  236.63 +
  236.64 +<div id="nav-path" class="navpath">
  236.65 +  <ul>
  236.66 +<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>
  236.67 +</div>
  236.68 +</div><!-- top -->
  236.69 +<div class="header">
  236.70 +  <div class="headertitle">
  236.71 +<div class="title">ucx.h</div>  </div>
  236.72 +</div><!--header-->
  236.73 +<div class="contents">
  236.74 +<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>
  236.75 +<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>
  236.76 +<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>
  236.77 +<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>
  236.78 +<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>
  236.79 +<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>
  236.80 +</div><!-- fragment --></div><!-- contents -->
  236.81 +<!-- start footer part -->
  236.82 +<hr class="footer"/><address class="footer"><small>
  236.83 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
  236.84 +<img class="footer" src="doxygen.png" alt="doxygen"/>
  236.85 +</a> 1.8.13
  236.86 +</small></address>
  236.87 +</body>
  236.88 +</html>
   237.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   237.2 +++ b/docs/api-2.1/utils_8h.html	Sat Feb 06 19:11:44 2021 +0100
   237.3 @@ -0,0 +1,2233 @@
   237.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   237.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   237.6 +<head>
   237.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   237.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   237.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  237.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  237.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/utils.h File Reference</title>
  237.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  237.13 +<script type="text/javascript" src="jquery.js"></script>
  237.14 +<script type="text/javascript" src="dynsections.js"></script>
  237.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  237.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  237.17 +<script type="text/javascript" src="search/search.js"></script>
  237.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  237.19 +</head>
  237.20 +<body>
  237.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  237.22 +<div id="titlearea">
  237.23 +<table cellspacing="0" cellpadding="0">
  237.24 + <tbody>
  237.25 + <tr style="height: 56px;">
  237.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  237.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  237.28 +   <div id="projectname">ucx
  237.29 +   </div>
  237.30 +   <div id="projectbrief">UAP Common Extensions</div>
  237.31 +  </td>
  237.32 + </tr>
  237.33 + </tbody>
  237.34 +</table>
  237.35 +</div>
  237.36 +<!-- end header part -->
  237.37 +<!-- Generated by Doxygen 1.8.13 -->
  237.38 +<script type="text/javascript">
  237.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  237.40 +</script>
  237.41 +<script type="text/javascript" src="menudata.js"></script>
  237.42 +<script type="text/javascript" src="menu.js"></script>
  237.43 +<script type="text/javascript">
  237.44 +$(function() {
  237.45 +  initMenu('',true,false,'search.php','Search');
  237.46 +  $(document).ready(function() { init_search(); });
  237.47 +});
  237.48 +</script>
  237.49 +<div id="main-nav"></div>
  237.50 +<!-- window showing the filter options -->
  237.51 +<div id="MSearchSelectWindow"
  237.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  237.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  237.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  237.55 +</div>
  237.56 +
  237.57 +<!-- iframe showing the search results (closed by default) -->
  237.58 +<div id="MSearchResultsWindow">
  237.59 +<iframe src="javascript:void(0)" frameborder="0" 
  237.60 +        name="MSearchResults" id="MSearchResults">
  237.61 +</iframe>
  237.62 +</div>
  237.63 +
  237.64 +<div id="nav-path" class="navpath">
  237.65 +  <ul>
  237.66 +<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>
  237.67 +</div>
  237.68 +</div><!-- top -->
  237.69 +<div class="header">
  237.70 +  <div class="summary">
  237.71 +<a href="#define-members">Macros</a> &#124;
  237.72 +<a href="#func-members">Functions</a>  </div>
  237.73 +  <div class="headertitle">
  237.74 +<div class="title">utils.h File Reference</div>  </div>
  237.75 +</div><!--header-->
  237.76 +<div class="contents">
  237.77 +
  237.78 +<p>Compare, copy and printf functions.  
  237.79 +<a href="#details">More...</a></p>
  237.80 +<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
  237.81 +<code>#include &quot;<a class="el" href="string_8h_source.html">string.h</a>&quot;</code><br />
  237.82 +<code>#include &quot;<a class="el" href="allocator_8h_source.html">allocator.h</a>&quot;</code><br />
  237.83 +<code>#include &lt;inttypes.h&gt;</code><br />
  237.84 +<code>#include &lt;stdarg.h&gt;</code><br />
  237.85 +</div>
  237.86 +<p><a href="utils_8h_source.html">Go to the source code of this file.</a></p>
  237.87 +<table class="memberdecls">
  237.88 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
  237.89 +Macros</h2></td></tr>
  237.90 +<tr class="memitem:a23efd74fa5f701d4cf26ccbfd138a439"><td class="memItemLeft" align="right" valign="top"><a id="a23efd74fa5f701d4cf26ccbfd138a439"></a>
  237.91 +#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>
  237.92 +<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>
  237.93 +<tr class="separator:a23efd74fa5f701d4cf26ccbfd138a439"><td class="memSeparator" colspan="2">&#160;</td></tr>
  237.94 +<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>
  237.95 +<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>
  237.96 +<tr class="separator:a41ca1344f781c0d3bf7a414a6e811392"><td class="memSeparator" colspan="2">&#160;</td></tr>
  237.97 +<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>
  237.98 +<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>
  237.99 +<tr class="separator:add13f39a8af440b4f7e6f74339eaada2"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.100 +<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>
 237.101 +<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>
 237.102 +<tr class="separator:a6003a1750a66234169bd1f8cc84b297b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.103 +<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>
 237.104 +<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>
 237.105 +<tr class="separator:af9f333b66ecd639c347c7235f4992e2e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.106 +<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>
 237.107 +<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>
 237.108 +<tr class="separator:a9d7d65a420f026fcb6982803d5120519"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.109 +</table><table class="memberdecls">
 237.110 +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
 237.111 +Functions</h2></td></tr>
 237.112 +<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>
 237.113 +<tr class="memdesc:adeb6e8d0a53a829207cfa0a979d01fff"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copies a string.  <a href="#adeb6e8d0a53a829207cfa0a979d01fff">More...</a><br /></td></tr>
 237.114 +<tr class="separator:adeb6e8d0a53a829207cfa0a979d01fff"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.115 +<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>
 237.116 +<tr class="memdesc:ab2e184e6a744941aab6b8058116baf30"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copies a memory area.  <a href="#ab2e184e6a744941aab6b8058116baf30">More...</a><br /></td></tr>
 237.117 +<tr class="separator:ab2e184e6a744941aab6b8058116baf30"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.118 +<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>
 237.119 +<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>
 237.120 +<tr class="separator:a114ee7f7da62656ffd35e2dc23394201"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.121 +<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>
 237.122 +<tr class="memdesc:aa6a37b9d172b6a5b2803d152f9e1b258"><td class="mdescLeft">&#160;</td><td class="mdescRight">Wraps the strcmp function.  <a href="#aa6a37b9d172b6a5b2803d152f9e1b258">More...</a><br /></td></tr>
 237.123 +<tr class="separator:aa6a37b9d172b6a5b2803d152f9e1b258"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.124 +<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>
 237.125 +<tr class="memdesc:ac6b354a878f551a3a5b20a167db3f308"><td class="mdescLeft">&#160;</td><td class="mdescRight">Wraps the strncmp function.  <a href="#ac6b354a878f551a3a5b20a167db3f308">More...</a><br /></td></tr>
 237.126 +<tr class="separator:ac6b354a878f551a3a5b20a167db3f308"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.127 +<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>
 237.128 +<tr class="memdesc:adee0739589166d272f8cb7c23aabf8ba"><td class="mdescLeft">&#160;</td><td class="mdescRight">Wraps the sstrcmp function.  <a href="#adee0739589166d272f8cb7c23aabf8ba">More...</a><br /></td></tr>
 237.129 +<tr class="separator:adee0739589166d272f8cb7c23aabf8ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.130 +<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>
 237.131 +<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>
 237.132 +<tr class="separator:a8ce7e11e6b3deafe89a32a091fde7f16"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.133 +<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>
 237.134 +<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>
 237.135 +<tr class="separator:aeb57a2b9a6aaa0460c7a6bec29accf2c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.136 +<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>
 237.137 +<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>
 237.138 +<tr class="separator:a366b57def20f86a41eaedf575eea5375"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.139 +<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>
 237.140 +<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>
 237.141 +<tr class="separator:aa29e6e559946375e34113e34e0b0bd0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.142 +<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>
 237.143 +<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>
 237.144 +<tr class="separator:a858b2ac443fb202643b71f6a7e9218dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.145 +<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>
 237.146 +<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>
 237.147 +<tr class="separator:a54701aea6a89fed1402dfb0bf56bc7f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.148 +<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>
 237.149 +<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>
 237.150 +<tr class="separator:abd83a5da91c3dd026a6931bd80c12f1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.151 +<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>
 237.152 +<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>
 237.153 +<tr class="separator:a3f3cbae2594d6f722bae29acb0408a24"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.154 +<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>
 237.155 +<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>
 237.156 +<tr class="separator:a6acfc359421f21f9a042a654ff7faac5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.157 +<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>
 237.158 +<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>
 237.159 +<tr class="separator:acde5366437e886a459b7468f7a9e11f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.160 +<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>
 237.161 +<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>
 237.162 +<tr class="separator:a5879d1722330355914d8c9146fa549d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.163 +<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>
 237.164 +<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>
 237.165 +<tr class="separator:a1572a78b5b42f7151a5b2a5a7283d62d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.166 +<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>
 237.167 +<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>
 237.168 +<tr class="separator:a4ab6753739d56c09cdf6079fdcabf7c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.169 +<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>
 237.170 +<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>
 237.171 +<tr class="separator:a43e73d288b1553a0078bf4c98dd341f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.172 +<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>
 237.173 +<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>
 237.174 +<tr class="separator:a306778414a2427951ea263be92368627"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.175 +<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>
 237.176 +<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>
 237.177 +<tr class="separator:a81fb8434b70ca11bf2c14abfa21d16a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.178 +<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>
 237.179 +<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>
 237.180 +<tr class="separator:ab4a659cc46096f0490c1dafa57726476"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.181 +<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>
 237.182 +<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>
 237.183 +<tr class="separator:a54e7d06585bad3a899befc4e9c13853f"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.184 +<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>
 237.185 +<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>
 237.186 +<tr class="separator:a37b7d471ca1679992afc11a0deda45f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.187 +<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>
 237.188 +<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>
 237.189 +<tr class="separator:abb13476228d0c16bfaba08469adbae2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.190 +<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>
 237.191 +<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>
 237.192 +<tr class="separator:a59a5859272cb4b43cbdd58208c41e32b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.193 +<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>
 237.194 +<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>
 237.195 +<tr class="separator:a66e00a0703cbcde050ec922578e2f080"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.196 +<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>
 237.197 +<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>
 237.198 +<tr class="separator:add2b5c5507caba59d894b84e056b079b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.199 +<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>
 237.200 +<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>
 237.201 +<tr class="separator:a3ba75e2e0b2479eef2b22fb219b42da7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.202 +<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>
 237.203 +<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>
 237.204 +<tr class="separator:ad1196b561bcdad76c393885819769a97"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.205 +<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>
 237.206 +<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>
 237.207 +<tr class="separator:ab804b7c27d0bfcd7bf3a3583140825b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.208 +<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>
 237.209 +<tr class="memdesc:aa174d539de3ea59be4f9640f17ce53d8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two pointers.  <a href="#aa174d539de3ea59be4f9640f17ce53d8">More...</a><br /></td></tr>
 237.210 +<tr class="separator:aa174d539de3ea59be4f9640f17ce53d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.211 +<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>
 237.212 +<tr class="memdesc:aff7d2bcded71196831a8c0664333f8e7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two memory areas.  <a href="#aff7d2bcded71196831a8c0664333f8e7">More...</a><br /></td></tr>
 237.213 +<tr class="separator:aff7d2bcded71196831a8c0664333f8e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.214 +<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>
 237.215 +<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>
 237.216 +<tr class="separator:aa0bec80e1c67f769ff5e112a7d4ce72a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.217 +<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>
 237.218 +<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>
 237.219 +<tr class="separator:a4907967beb92c3ae351dd239abbb6927"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.220 +<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>
 237.221 +<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>
 237.222 +<tr class="separator:a9f9cf0e89ffdc256ecb35429907f51f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.223 +<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>
 237.224 +<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>
 237.225 +<tr class="separator:a3ea1dfb856c741f3e8ec6bfdc9ad427e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 237.226 +</table>
 237.227 +<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 237.228 +<div class="textblock"><p>Compare, copy and printf functions. </p>
 237.229 +<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
 237.230 +<dd>
 237.231 +Olaf Wintermann </dd></dl>
 237.232 +</div><h2 class="groupheader">Macro Definition Documentation</h2>
 237.233 +<a id="a9d7d65a420f026fcb6982803d5120519"></a>
 237.234 +<h2 class="memtitle"><span class="permalink"><a href="#a9d7d65a420f026fcb6982803d5120519">&#9670;&nbsp;</a></span>ucx_bprintf</h2>
 237.235 +
 237.236 +<div class="memitem">
 237.237 +<div class="memproto">
 237.238 +      <table class="memname">
 237.239 +        <tr>
 237.240 +          <td class="memname">#define ucx_bprintf</td>
 237.241 +          <td>(</td>
 237.242 +          <td class="paramtype">&#160;</td>
 237.243 +          <td class="paramname">buffer, </td>
 237.244 +        </tr>
 237.245 +        <tr>
 237.246 +          <td class="paramkey"></td>
 237.247 +          <td></td>
 237.248 +          <td class="paramtype">&#160;</td>
 237.249 +          <td class="paramname"><em>...</em>&#160;</td>
 237.250 +        </tr>
 237.251 +        <tr>
 237.252 +          <td></td>
 237.253 +          <td>)</td>
 237.254 +          <td></td><td></td>
 237.255 +        </tr>
 237.256 +      </table>
 237.257 +</div><div class="memdoc">
 237.258 +<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>
 237.259 +<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>
 237.260 +<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>
 237.261 +<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>
 237.262 +</div><!-- fragment -->
 237.263 +<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>
 237.264 +<dl class="params"><dt>Parameters</dt><dd>
 237.265 +  <table class="params">
 237.266 +    <tr><td class="paramname">buffer</td><td>the buffer the data is written to </td></tr>
 237.267 +    <tr><td class="paramname">...</td><td>format string and additional arguments </td></tr>
 237.268 +  </table>
 237.269 +  </dd>
 237.270 +</dl>
 237.271 +<dl class="section return"><dt>Returns</dt><dd>the total number of bytes written </dd></dl>
 237.272 +<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>
 237.273 +
 237.274 +</div>
 237.275 +</div>
 237.276 +<a id="af9f333b66ecd639c347c7235f4992e2e"></a>
 237.277 +<h2 class="memtitle"><span class="permalink"><a href="#af9f333b66ecd639c347c7235f4992e2e">&#9670;&nbsp;</a></span>ucx_sprintf</h2>
 237.278 +
 237.279 +<div class="memitem">
 237.280 +<div class="memproto">
 237.281 +      <table class="memname">
 237.282 +        <tr>
 237.283 +          <td class="memname">#define ucx_sprintf</td>
 237.284 +          <td>(</td>
 237.285 +          <td class="paramtype">&#160;</td>
 237.286 +          <td class="paramname"><em>...</em></td><td>)</td>
 237.287 +          <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>
 237.288 +        </tr>
 237.289 +      </table>
 237.290 +</div><div class="memdoc">
 237.291 +
 237.292 +<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>
 237.293 +
 237.294 +</div>
 237.295 +</div>
 237.296 +<a id="a6003a1750a66234169bd1f8cc84b297b"></a>
 237.297 +<h2 class="memtitle"><span class="permalink"><a href="#a6003a1750a66234169bd1f8cc84b297b">&#9670;&nbsp;</a></span>ucx_stream_bcopy</h2>
 237.298 +
 237.299 +<div class="memitem">
 237.300 +<div class="memproto">
 237.301 +      <table class="memname">
 237.302 +        <tr>
 237.303 +          <td class="memname">#define ucx_stream_bcopy</td>
 237.304 +          <td>(</td>
 237.305 +          <td class="paramtype">&#160;</td>
 237.306 +          <td class="paramname">src, </td>
 237.307 +        </tr>
 237.308 +        <tr>
 237.309 +          <td class="paramkey"></td>
 237.310 +          <td></td>
 237.311 +          <td class="paramtype">&#160;</td>
 237.312 +          <td class="paramname">dest, </td>
 237.313 +        </tr>
 237.314 +        <tr>
 237.315 +          <td class="paramkey"></td>
 237.316 +          <td></td>
 237.317 +          <td class="paramtype">&#160;</td>
 237.318 +          <td class="paramname">rfnc, </td>
 237.319 +        </tr>
 237.320 +        <tr>
 237.321 +          <td class="paramkey"></td>
 237.322 +          <td></td>
 237.323 +          <td class="paramtype">&#160;</td>
 237.324 +          <td class="paramname">wfnc, </td>
 237.325 +        </tr>
 237.326 +        <tr>
 237.327 +          <td class="paramkey"></td>
 237.328 +          <td></td>
 237.329 +          <td class="paramtype">&#160;</td>
 237.330 +          <td class="paramname">buf, </td>
 237.331 +        </tr>
 237.332 +        <tr>
 237.333 +          <td class="paramkey"></td>
 237.334 +          <td></td>
 237.335 +          <td class="paramtype">&#160;</td>
 237.336 +          <td class="paramname">bufsize&#160;</td>
 237.337 +        </tr>
 237.338 +        <tr>
 237.339 +          <td></td>
 237.340 +          <td>)</td>
 237.341 +          <td></td><td></td>
 237.342 +        </tr>
 237.343 +      </table>
 237.344 +</div><div class="memdoc">
 237.345 +<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>
 237.346 +<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>
 237.347 +<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>
 237.348 +</div><!-- fragment -->
 237.349 +<p>Shorthand for an unbounded ucx_stream_bncopy call using the specified buffer. </p>
 237.350 +<dl class="params"><dt>Parameters</dt><dd>
 237.351 +  <table class="params">
 237.352 +    <tr><td class="paramname">src</td><td>the source stream </td></tr>
 237.353 +    <tr><td class="paramname">dest</td><td>the destination stream </td></tr>
 237.354 +    <tr><td class="paramname">rfnc</td><td>the read function </td></tr>
 237.355 +    <tr><td class="paramname">wfnc</td><td>the write function </td></tr>
 237.356 +    <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>
 237.357 +    <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>
 237.358 +  </table>
 237.359 +  </dd>
 237.360 +</dl>
 237.361 +<dl class="section return"><dt>Returns</dt><dd>total number of bytes copied </dd></dl>
 237.362 +
 237.363 +</div>
 237.364 +</div>
 237.365 +<a id="a41ca1344f781c0d3bf7a414a6e811392"></a>
 237.366 +<h2 class="memtitle"><span class="permalink"><a href="#a41ca1344f781c0d3bf7a414a6e811392">&#9670;&nbsp;</a></span>ucx_stream_copy</h2>
 237.367 +
 237.368 +<div class="memitem">
 237.369 +<div class="memproto">
 237.370 +      <table class="memname">
 237.371 +        <tr>
 237.372 +          <td class="memname">#define ucx_stream_copy</td>
 237.373 +          <td>(</td>
 237.374 +          <td class="paramtype">&#160;</td>
 237.375 +          <td class="paramname">src, </td>
 237.376 +        </tr>
 237.377 +        <tr>
 237.378 +          <td class="paramkey"></td>
 237.379 +          <td></td>
 237.380 +          <td class="paramtype">&#160;</td>
 237.381 +          <td class="paramname">dest, </td>
 237.382 +        </tr>
 237.383 +        <tr>
 237.384 +          <td class="paramkey"></td>
 237.385 +          <td></td>
 237.386 +          <td class="paramtype">&#160;</td>
 237.387 +          <td class="paramname">rfnc, </td>
 237.388 +        </tr>
 237.389 +        <tr>
 237.390 +          <td class="paramkey"></td>
 237.391 +          <td></td>
 237.392 +          <td class="paramtype">&#160;</td>
 237.393 +          <td class="paramname">wfnc&#160;</td>
 237.394 +        </tr>
 237.395 +        <tr>
 237.396 +          <td></td>
 237.397 +          <td>)</td>
 237.398 +          <td></td><td></td>
 237.399 +        </tr>
 237.400 +      </table>
 237.401 +</div><div class="memdoc">
 237.402 +<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>
 237.403 +<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>
 237.404 +<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>
 237.405 +<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>
 237.406 +</div><!-- fragment -->
 237.407 +<p>Shorthand for an unbounded ucx_stream_bncopy call using a default buffer. </p>
 237.408 +<dl class="params"><dt>Parameters</dt><dd>
 237.409 +  <table class="params">
 237.410 +    <tr><td class="paramname">src</td><td>the source stream </td></tr>
 237.411 +    <tr><td class="paramname">dest</td><td>the destination stream </td></tr>
 237.412 +    <tr><td class="paramname">rfnc</td><td>the read function </td></tr>
 237.413 +    <tr><td class="paramname">wfnc</td><td>the write function </td></tr>
 237.414 +  </table>
 237.415 +  </dd>
 237.416 +</dl>
 237.417 +<dl class="section return"><dt>Returns</dt><dd>total number of bytes copied</dd></dl>
 237.418 +<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>
 237.419 +
 237.420 +</div>
 237.421 +</div>
 237.422 +<a id="add13f39a8af440b4f7e6f74339eaada2"></a>
 237.423 +<h2 class="memtitle"><span class="permalink"><a href="#add13f39a8af440b4f7e6f74339eaada2">&#9670;&nbsp;</a></span>ucx_stream_ncopy</h2>
 237.424 +
 237.425 +<div class="memitem">
 237.426 +<div class="memproto">
 237.427 +      <table class="memname">
 237.428 +        <tr>
 237.429 +          <td class="memname">#define ucx_stream_ncopy</td>
 237.430 +          <td>(</td>
 237.431 +          <td class="paramtype">&#160;</td>
 237.432 +          <td class="paramname">src, </td>
 237.433 +        </tr>
 237.434 +        <tr>
 237.435 +          <td class="paramkey"></td>
 237.436 +          <td></td>
 237.437 +          <td class="paramtype">&#160;</td>
 237.438 +          <td class="paramname">dest, </td>
 237.439 +        </tr>
 237.440 +        <tr>
 237.441 +          <td class="paramkey"></td>
 237.442 +          <td></td>
 237.443 +          <td class="paramtype">&#160;</td>
 237.444 +          <td class="paramname">rfnc, </td>
 237.445 +        </tr>
 237.446 +        <tr>
 237.447 +          <td class="paramkey"></td>
 237.448 +          <td></td>
 237.449 +          <td class="paramtype">&#160;</td>
 237.450 +          <td class="paramname">wfnc, </td>
 237.451 +        </tr>
 237.452 +        <tr>
 237.453 +          <td class="paramkey"></td>
 237.454 +          <td></td>
 237.455 +          <td class="paramtype">&#160;</td>
 237.456 +          <td class="paramname">n&#160;</td>
 237.457 +        </tr>
 237.458 +        <tr>
 237.459 +          <td></td>
 237.460 +          <td>)</td>
 237.461 +          <td></td><td></td>
 237.462 +        </tr>
 237.463 +      </table>
 237.464 +</div><div class="memdoc">
 237.465 +<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>
 237.466 +<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>
 237.467 +<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>
 237.468 +<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>
 237.469 +</div><!-- fragment -->
 237.470 +<p>Shorthand for ucx_stream_bncopy using a default copy buffer. </p>
 237.471 +<dl class="params"><dt>Parameters</dt><dd>
 237.472 +  <table class="params">
 237.473 +    <tr><td class="paramname">src</td><td>the source stream </td></tr>
 237.474 +    <tr><td class="paramname">dest</td><td>the destination stream </td></tr>
 237.475 +    <tr><td class="paramname">rfnc</td><td>the read function </td></tr>
 237.476 +    <tr><td class="paramname">wfnc</td><td>the write function </td></tr>
 237.477 +    <tr><td class="paramname">n</td><td>maximum number of bytes that shall be copied </td></tr>
 237.478 +  </table>
 237.479 +  </dd>
 237.480 +</dl>
 237.481 +<dl class="section return"><dt>Returns</dt><dd>total number of bytes copied </dd></dl>
 237.482 +
 237.483 +</div>
 237.484 +</div>
 237.485 +<h2 class="groupheader">Function Documentation</h2>
 237.486 +<a id="a9f9cf0e89ffdc256ecb35429907f51f5"></a>
 237.487 +<h2 class="memtitle"><span class="permalink"><a href="#a9f9cf0e89ffdc256ecb35429907f51f5">&#9670;&nbsp;</a></span>ucx_asprintf()</h2>
 237.488 +
 237.489 +<div class="memitem">
 237.490 +<div class="memproto">
 237.491 +      <table class="memname">
 237.492 +        <tr>
 237.493 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> ucx_asprintf </td>
 237.494 +          <td>(</td>
 237.495 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
 237.496 +          <td class="paramname"><em>allocator</em>, </td>
 237.497 +        </tr>
 237.498 +        <tr>
 237.499 +          <td class="paramkey"></td>
 237.500 +          <td></td>
 237.501 +          <td class="paramtype">const char *&#160;</td>
 237.502 +          <td class="paramname"><em>fmt</em>, </td>
 237.503 +        </tr>
 237.504 +        <tr>
 237.505 +          <td class="paramkey"></td>
 237.506 +          <td></td>
 237.507 +          <td class="paramtype">&#160;</td>
 237.508 +          <td class="paramname"><em>...</em>&#160;</td>
 237.509 +        </tr>
 237.510 +        <tr>
 237.511 +          <td></td>
 237.512 +          <td>)</td>
 237.513 +          <td></td><td></td>
 237.514 +        </tr>
 237.515 +      </table>
 237.516 +</div><div class="memdoc">
 237.517 +
 237.518 +<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>
 237.519 +<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>
 237.520 +<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>
 237.521 +<dl class="params"><dt>Parameters</dt><dd>
 237.522 +  <table class="params">
 237.523 +    <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>
 237.524 +    <tr><td class="paramname">fmt</td><td>format string </td></tr>
 237.525 +    <tr><td class="paramname">...</td><td>additional arguments </td></tr>
 237.526 +  </table>
 237.527 +  </dd>
 237.528 +</dl>
 237.529 +<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>
 237.530 +
 237.531 +</div>
 237.532 +</div>
 237.533 +<a id="ab804b7c27d0bfcd7bf3a3583140825b6"></a>
 237.534 +<h2 class="memtitle"><span class="permalink"><a href="#ab804b7c27d0bfcd7bf3a3583140825b6">&#9670;&nbsp;</a></span>ucx_cmp_double()</h2>
 237.535 +
 237.536 +<div class="memitem">
 237.537 +<div class="memproto">
 237.538 +      <table class="memname">
 237.539 +        <tr>
 237.540 +          <td class="memname">int ucx_cmp_double </td>
 237.541 +          <td>(</td>
 237.542 +          <td class="paramtype">const void *&#160;</td>
 237.543 +          <td class="paramname"><em>d1</em>, </td>
 237.544 +        </tr>
 237.545 +        <tr>
 237.546 +          <td class="paramkey"></td>
 237.547 +          <td></td>
 237.548 +          <td class="paramtype">const void *&#160;</td>
 237.549 +          <td class="paramname"><em>d2</em>, </td>
 237.550 +        </tr>
 237.551 +        <tr>
 237.552 +          <td class="paramkey"></td>
 237.553 +          <td></td>
 237.554 +          <td class="paramtype">void *&#160;</td>
 237.555 +          <td class="paramname"><em>data</em>&#160;</td>
 237.556 +        </tr>
 237.557 +        <tr>
 237.558 +          <td></td>
 237.559 +          <td>)</td>
 237.560 +          <td></td><td></td>
 237.561 +        </tr>
 237.562 +      </table>
 237.563 +</div><div class="memdoc">
 237.564 +
 237.565 +<p>Compares two real numbers of type double. </p>
 237.566 +<dl class="params"><dt>Parameters</dt><dd>
 237.567 +  <table class="params">
 237.568 +    <tr><td class="paramname">d1</td><td>pointer to double one </td></tr>
 237.569 +    <tr><td class="paramname">d2</td><td>pointer to double two </td></tr>
 237.570 +    <tr><td class="paramname">data</td><td>if provided: a pointer to precision (default: 1e-14) </td></tr>
 237.571 +  </table>
 237.572 +  </dd>
 237.573 +</dl>
 237.574 +<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>
 237.575 +
 237.576 +</div>
 237.577 +</div>
 237.578 +<a id="ad1196b561bcdad76c393885819769a97"></a>
 237.579 +<h2 class="memtitle"><span class="permalink"><a href="#ad1196b561bcdad76c393885819769a97">&#9670;&nbsp;</a></span>ucx_cmp_float()</h2>
 237.580 +
 237.581 +<div class="memitem">
 237.582 +<div class="memproto">
 237.583 +      <table class="memname">
 237.584 +        <tr>
 237.585 +          <td class="memname">int ucx_cmp_float </td>
 237.586 +          <td>(</td>
 237.587 +          <td class="paramtype">const void *&#160;</td>
 237.588 +          <td class="paramname"><em>f1</em>, </td>
 237.589 +        </tr>
 237.590 +        <tr>
 237.591 +          <td class="paramkey"></td>
 237.592 +          <td></td>
 237.593 +          <td class="paramtype">const void *&#160;</td>
 237.594 +          <td class="paramname"><em>f2</em>, </td>
 237.595 +        </tr>
 237.596 +        <tr>
 237.597 +          <td class="paramkey"></td>
 237.598 +          <td></td>
 237.599 +          <td class="paramtype">void *&#160;</td>
 237.600 +          <td class="paramname"><em>data</em>&#160;</td>
 237.601 +        </tr>
 237.602 +        <tr>
 237.603 +          <td></td>
 237.604 +          <td>)</td>
 237.605 +          <td></td><td></td>
 237.606 +        </tr>
 237.607 +      </table>
 237.608 +</div><div class="memdoc">
 237.609 +
 237.610 +<p>Compares two real numbers of type float. </p>
 237.611 +<dl class="params"><dt>Parameters</dt><dd>
 237.612 +  <table class="params">
 237.613 +    <tr><td class="paramname">f1</td><td>pointer to float one </td></tr>
 237.614 +    <tr><td class="paramname">f2</td><td>pointer to float two </td></tr>
 237.615 +    <tr><td class="paramname">data</td><td>if provided: a pointer to precision (default: 1e-6f) </td></tr>
 237.616 +  </table>
 237.617 +  </dd>
 237.618 +</dl>
 237.619 +<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>
 237.620 +
 237.621 +</div>
 237.622 +</div>
 237.623 +<a id="a8ce7e11e6b3deafe89a32a091fde7f16"></a>
 237.624 +<h2 class="memtitle"><span class="permalink"><a href="#a8ce7e11e6b3deafe89a32a091fde7f16">&#9670;&nbsp;</a></span>ucx_cmp_int()</h2>
 237.625 +
 237.626 +<div class="memitem">
 237.627 +<div class="memproto">
 237.628 +      <table class="memname">
 237.629 +        <tr>
 237.630 +          <td class="memname">int ucx_cmp_int </td>
 237.631 +          <td>(</td>
 237.632 +          <td class="paramtype">const void *&#160;</td>
 237.633 +          <td class="paramname"><em>i1</em>, </td>
 237.634 +        </tr>
 237.635 +        <tr>
 237.636 +          <td class="paramkey"></td>
 237.637 +          <td></td>
 237.638 +          <td class="paramtype">const void *&#160;</td>
 237.639 +          <td class="paramname"><em>i2</em>, </td>
 237.640 +        </tr>
 237.641 +        <tr>
 237.642 +          <td class="paramkey"></td>
 237.643 +          <td></td>
 237.644 +          <td class="paramtype">void *&#160;</td>
 237.645 +          <td class="paramname"><em>data</em>&#160;</td>
 237.646 +        </tr>
 237.647 +        <tr>
 237.648 +          <td></td>
 237.649 +          <td>)</td>
 237.650 +          <td></td><td></td>
 237.651 +        </tr>
 237.652 +      </table>
 237.653 +</div><div class="memdoc">
 237.654 +
 237.655 +<p>Compares two integers of type int. </p>
 237.656 +<dl class="params"><dt>Parameters</dt><dd>
 237.657 +  <table class="params">
 237.658 +    <tr><td class="paramname">i1</td><td>pointer to integer one </td></tr>
 237.659 +    <tr><td class="paramname">i2</td><td>pointer to integer two </td></tr>
 237.660 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
 237.661 +  </table>
 237.662 +  </dd>
 237.663 +</dl>
 237.664 +<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>
 237.665 +
 237.666 +</div>
 237.667 +</div>
 237.668 +<a id="aa29e6e559946375e34113e34e0b0bd0d"></a>
 237.669 +<h2 class="memtitle"><span class="permalink"><a href="#aa29e6e559946375e34113e34e0b0bd0d">&#9670;&nbsp;</a></span>ucx_cmp_int16()</h2>
 237.670 +
 237.671 +<div class="memitem">
 237.672 +<div class="memproto">
 237.673 +      <table class="memname">
 237.674 +        <tr>
 237.675 +          <td class="memname">int ucx_cmp_int16 </td>
 237.676 +          <td>(</td>
 237.677 +          <td class="paramtype">const void *&#160;</td>
 237.678 +          <td class="paramname"><em>i1</em>, </td>
 237.679 +        </tr>
 237.680 +        <tr>
 237.681 +          <td class="paramkey"></td>
 237.682 +          <td></td>
 237.683 +          <td class="paramtype">const void *&#160;</td>
 237.684 +          <td class="paramname"><em>i2</em>, </td>
 237.685 +        </tr>
 237.686 +        <tr>
 237.687 +          <td class="paramkey"></td>
 237.688 +          <td></td>
 237.689 +          <td class="paramtype">void *&#160;</td>
 237.690 +          <td class="paramname"><em>data</em>&#160;</td>
 237.691 +        </tr>
 237.692 +        <tr>
 237.693 +          <td></td>
 237.694 +          <td>)</td>
 237.695 +          <td></td><td></td>
 237.696 +        </tr>
 237.697 +      </table>
 237.698 +</div><div class="memdoc">
 237.699 +
 237.700 +<p>Compares two integers of type int16_t. </p>
 237.701 +<dl class="params"><dt>Parameters</dt><dd>
 237.702 +  <table class="params">
 237.703 +    <tr><td class="paramname">i1</td><td>pointer to int16_t one </td></tr>
 237.704 +    <tr><td class="paramname">i2</td><td>pointer to int16_t two </td></tr>
 237.705 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
 237.706 +  </table>
 237.707 +  </dd>
 237.708 +</dl>
 237.709 +<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>
 237.710 +
 237.711 +</div>
 237.712 +</div>
 237.713 +<a id="a858b2ac443fb202643b71f6a7e9218dd"></a>
 237.714 +<h2 class="memtitle"><span class="permalink"><a href="#a858b2ac443fb202643b71f6a7e9218dd">&#9670;&nbsp;</a></span>ucx_cmp_int32()</h2>
 237.715 +
 237.716 +<div class="memitem">
 237.717 +<div class="memproto">
 237.718 +      <table class="memname">
 237.719 +        <tr>
 237.720 +          <td class="memname">int ucx_cmp_int32 </td>
 237.721 +          <td>(</td>
 237.722 +          <td class="paramtype">const void *&#160;</td>
 237.723 +          <td class="paramname"><em>i1</em>, </td>
 237.724 +        </tr>
 237.725 +        <tr>
 237.726 +          <td class="paramkey"></td>
 237.727 +          <td></td>
 237.728 +          <td class="paramtype">const void *&#160;</td>
 237.729 +          <td class="paramname"><em>i2</em>, </td>
 237.730 +        </tr>
 237.731 +        <tr>
 237.732 +          <td class="paramkey"></td>
 237.733 +          <td></td>
 237.734 +          <td class="paramtype">void *&#160;</td>
 237.735 +          <td class="paramname"><em>data</em>&#160;</td>
 237.736 +        </tr>
 237.737 +        <tr>
 237.738 +          <td></td>
 237.739 +          <td>)</td>
 237.740 +          <td></td><td></td>
 237.741 +        </tr>
 237.742 +      </table>
 237.743 +</div><div class="memdoc">
 237.744 +
 237.745 +<p>Compares two integers of type int32_t. </p>
 237.746 +<dl class="params"><dt>Parameters</dt><dd>
 237.747 +  <table class="params">
 237.748 +    <tr><td class="paramname">i1</td><td>pointer to int32_t one </td></tr>
 237.749 +    <tr><td class="paramname">i2</td><td>pointer to int32_t two </td></tr>
 237.750 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
 237.751 +  </table>
 237.752 +  </dd>
 237.753 +</dl>
 237.754 +<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>
 237.755 +
 237.756 +</div>
 237.757 +</div>
 237.758 +<a id="a54701aea6a89fed1402dfb0bf56bc7f6"></a>
 237.759 +<h2 class="memtitle"><span class="permalink"><a href="#a54701aea6a89fed1402dfb0bf56bc7f6">&#9670;&nbsp;</a></span>ucx_cmp_int64()</h2>
 237.760 +
 237.761 +<div class="memitem">
 237.762 +<div class="memproto">
 237.763 +      <table class="memname">
 237.764 +        <tr>
 237.765 +          <td class="memname">int ucx_cmp_int64 </td>
 237.766 +          <td>(</td>
 237.767 +          <td class="paramtype">const void *&#160;</td>
 237.768 +          <td class="paramname"><em>i1</em>, </td>
 237.769 +        </tr>
 237.770 +        <tr>
 237.771 +          <td class="paramkey"></td>
 237.772 +          <td></td>
 237.773 +          <td class="paramtype">const void *&#160;</td>
 237.774 +          <td class="paramname"><em>i2</em>, </td>
 237.775 +        </tr>
 237.776 +        <tr>
 237.777 +          <td class="paramkey"></td>
 237.778 +          <td></td>
 237.779 +          <td class="paramtype">void *&#160;</td>
 237.780 +          <td class="paramname"><em>data</em>&#160;</td>
 237.781 +        </tr>
 237.782 +        <tr>
 237.783 +          <td></td>
 237.784 +          <td>)</td>
 237.785 +          <td></td><td></td>
 237.786 +        </tr>
 237.787 +      </table>
 237.788 +</div><div class="memdoc">
 237.789 +
 237.790 +<p>Compares two integers of type int64_t. </p>
 237.791 +<dl class="params"><dt>Parameters</dt><dd>
 237.792 +  <table class="params">
 237.793 +    <tr><td class="paramname">i1</td><td>pointer to int64_t one </td></tr>
 237.794 +    <tr><td class="paramname">i2</td><td>pointer to int64_t two </td></tr>
 237.795 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
 237.796 +  </table>
 237.797 +  </dd>
 237.798 +</dl>
 237.799 +<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>
 237.800 +
 237.801 +</div>
 237.802 +</div>
 237.803 +<a id="aeb57a2b9a6aaa0460c7a6bec29accf2c"></a>
 237.804 +<h2 class="memtitle"><span class="permalink"><a href="#aeb57a2b9a6aaa0460c7a6bec29accf2c">&#9670;&nbsp;</a></span>ucx_cmp_longint()</h2>
 237.805 +
 237.806 +<div class="memitem">
 237.807 +<div class="memproto">
 237.808 +      <table class="memname">
 237.809 +        <tr>
 237.810 +          <td class="memname">int ucx_cmp_longint </td>
 237.811 +          <td>(</td>
 237.812 +          <td class="paramtype">const void *&#160;</td>
 237.813 +          <td class="paramname"><em>i1</em>, </td>
 237.814 +        </tr>
 237.815 +        <tr>
 237.816 +          <td class="paramkey"></td>
 237.817 +          <td></td>
 237.818 +          <td class="paramtype">const void *&#160;</td>
 237.819 +          <td class="paramname"><em>i2</em>, </td>
 237.820 +        </tr>
 237.821 +        <tr>
 237.822 +          <td class="paramkey"></td>
 237.823 +          <td></td>
 237.824 +          <td class="paramtype">void *&#160;</td>
 237.825 +          <td class="paramname"><em>data</em>&#160;</td>
 237.826 +        </tr>
 237.827 +        <tr>
 237.828 +          <td></td>
 237.829 +          <td>)</td>
 237.830 +          <td></td><td></td>
 237.831 +        </tr>
 237.832 +      </table>
 237.833 +</div><div class="memdoc">
 237.834 +
 237.835 +<p>Compares two integers of type long int. </p>
 237.836 +<dl class="params"><dt>Parameters</dt><dd>
 237.837 +  <table class="params">
 237.838 +    <tr><td class="paramname">i1</td><td>pointer to long integer one </td></tr>
 237.839 +    <tr><td class="paramname">i2</td><td>pointer to long integer two </td></tr>
 237.840 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
 237.841 +  </table>
 237.842 +  </dd>
 237.843 +</dl>
 237.844 +<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>
 237.845 +
 237.846 +</div>
 237.847 +</div>
 237.848 +<a id="a366b57def20f86a41eaedf575eea5375"></a>
 237.849 +<h2 class="memtitle"><span class="permalink"><a href="#a366b57def20f86a41eaedf575eea5375">&#9670;&nbsp;</a></span>ucx_cmp_longlong()</h2>
 237.850 +
 237.851 +<div class="memitem">
 237.852 +<div class="memproto">
 237.853 +      <table class="memname">
 237.854 +        <tr>
 237.855 +          <td class="memname">int ucx_cmp_longlong </td>
 237.856 +          <td>(</td>
 237.857 +          <td class="paramtype">const void *&#160;</td>
 237.858 +          <td class="paramname"><em>i1</em>, </td>
 237.859 +        </tr>
 237.860 +        <tr>
 237.861 +          <td class="paramkey"></td>
 237.862 +          <td></td>
 237.863 +          <td class="paramtype">const void *&#160;</td>
 237.864 +          <td class="paramname"><em>i2</em>, </td>
 237.865 +        </tr>
 237.866 +        <tr>
 237.867 +          <td class="paramkey"></td>
 237.868 +          <td></td>
 237.869 +          <td class="paramtype">void *&#160;</td>
 237.870 +          <td class="paramname"><em>data</em>&#160;</td>
 237.871 +        </tr>
 237.872 +        <tr>
 237.873 +          <td></td>
 237.874 +          <td>)</td>
 237.875 +          <td></td><td></td>
 237.876 +        </tr>
 237.877 +      </table>
 237.878 +</div><div class="memdoc">
 237.879 +
 237.880 +<p>Compares two integers of type long long. </p>
 237.881 +<dl class="params"><dt>Parameters</dt><dd>
 237.882 +  <table class="params">
 237.883 +    <tr><td class="paramname">i1</td><td>pointer to long long one </td></tr>
 237.884 +    <tr><td class="paramname">i2</td><td>pointer to long long two </td></tr>
 237.885 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
 237.886 +  </table>
 237.887 +  </dd>
 237.888 +</dl>
 237.889 +<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>
 237.890 +
 237.891 +</div>
 237.892 +</div>
 237.893 +<a id="aff7d2bcded71196831a8c0664333f8e7"></a>
 237.894 +<h2 class="memtitle"><span class="permalink"><a href="#aff7d2bcded71196831a8c0664333f8e7">&#9670;&nbsp;</a></span>ucx_cmp_mem()</h2>
 237.895 +
 237.896 +<div class="memitem">
 237.897 +<div class="memproto">
 237.898 +      <table class="memname">
 237.899 +        <tr>
 237.900 +          <td class="memname">int ucx_cmp_mem </td>
 237.901 +          <td>(</td>
 237.902 +          <td class="paramtype">const void *&#160;</td>
 237.903 +          <td class="paramname"><em>ptr1</em>, </td>
 237.904 +        </tr>
 237.905 +        <tr>
 237.906 +          <td class="paramkey"></td>
 237.907 +          <td></td>
 237.908 +          <td class="paramtype">const void *&#160;</td>
 237.909 +          <td class="paramname"><em>ptr2</em>, </td>
 237.910 +        </tr>
 237.911 +        <tr>
 237.912 +          <td class="paramkey"></td>
 237.913 +          <td></td>
 237.914 +          <td class="paramtype">void *&#160;</td>
 237.915 +          <td class="paramname"><em>n</em>&#160;</td>
 237.916 +        </tr>
 237.917 +        <tr>
 237.918 +          <td></td>
 237.919 +          <td>)</td>
 237.920 +          <td></td><td></td>
 237.921 +        </tr>
 237.922 +      </table>
 237.923 +</div><div class="memdoc">
 237.924 +
 237.925 +<p>Compares two memory areas. </p>
 237.926 +<dl class="params"><dt>Parameters</dt><dd>
 237.927 +  <table class="params">
 237.928 +    <tr><td class="paramname">ptr1</td><td>pointer one </td></tr>
 237.929 +    <tr><td class="paramname">ptr2</td><td>pointer two </td></tr>
 237.930 +    <tr><td class="paramname">n</td><td>a pointer to the size_t containing the third parameter for memcmp </td></tr>
 237.931 +  </table>
 237.932 +  </dd>
 237.933 +</dl>
 237.934 +<dl class="section return"><dt>Returns</dt><dd>the result of memcmp(ptr1, ptr2, *n) </dd></dl>
 237.935 +
 237.936 +</div>
 237.937 +</div>
 237.938 +<a id="aa174d539de3ea59be4f9640f17ce53d8"></a>
 237.939 +<h2 class="memtitle"><span class="permalink"><a href="#aa174d539de3ea59be4f9640f17ce53d8">&#9670;&nbsp;</a></span>ucx_cmp_ptr()</h2>
 237.940 +
 237.941 +<div class="memitem">
 237.942 +<div class="memproto">
 237.943 +      <table class="memname">
 237.944 +        <tr>
 237.945 +          <td class="memname">int ucx_cmp_ptr </td>
 237.946 +          <td>(</td>
 237.947 +          <td class="paramtype">const void *&#160;</td>
 237.948 +          <td class="paramname"><em>ptr1</em>, </td>
 237.949 +        </tr>
 237.950 +        <tr>
 237.951 +          <td class="paramkey"></td>
 237.952 +          <td></td>
 237.953 +          <td class="paramtype">const void *&#160;</td>
 237.954 +          <td class="paramname"><em>ptr2</em>, </td>
 237.955 +        </tr>
 237.956 +        <tr>
 237.957 +          <td class="paramkey"></td>
 237.958 +          <td></td>
 237.959 +          <td class="paramtype">void *&#160;</td>
 237.960 +          <td class="paramname"><em>data</em>&#160;</td>
 237.961 +        </tr>
 237.962 +        <tr>
 237.963 +          <td></td>
 237.964 +          <td>)</td>
 237.965 +          <td></td><td></td>
 237.966 +        </tr>
 237.967 +      </table>
 237.968 +</div><div class="memdoc">
 237.969 +
 237.970 +<p>Compares two pointers. </p>
 237.971 +<dl class="params"><dt>Parameters</dt><dd>
 237.972 +  <table class="params">
 237.973 +    <tr><td class="paramname">ptr1</td><td>pointer one </td></tr>
 237.974 +    <tr><td class="paramname">ptr2</td><td>pointer two </td></tr>
 237.975 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
 237.976 +  </table>
 237.977 +  </dd>
 237.978 +</dl>
 237.979 +<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>
 237.980 +
 237.981 +</div>
 237.982 +</div>
 237.983 +<a id="adee0739589166d272f8cb7c23aabf8ba"></a>
 237.984 +<h2 class="memtitle"><span class="permalink"><a href="#adee0739589166d272f8cb7c23aabf8ba">&#9670;&nbsp;</a></span>ucx_cmp_sstr()</h2>
 237.985 +
 237.986 +<div class="memitem">
 237.987 +<div class="memproto">
 237.988 +      <table class="memname">
 237.989 +        <tr>
 237.990 +          <td class="memname">int ucx_cmp_sstr </td>
 237.991 +          <td>(</td>
 237.992 +          <td class="paramtype">const void *&#160;</td>
 237.993 +          <td class="paramname"><em>s1</em>, </td>
 237.994 +        </tr>
 237.995 +        <tr>
 237.996 +          <td class="paramkey"></td>
 237.997 +          <td></td>
 237.998 +          <td class="paramtype">const void *&#160;</td>
 237.999 +          <td class="paramname"><em>s2</em>, </td>
237.1000 +        </tr>
237.1001 +        <tr>
237.1002 +          <td class="paramkey"></td>
237.1003 +          <td></td>
237.1004 +          <td class="paramtype">void *&#160;</td>
237.1005 +          <td class="paramname"><em>data</em>&#160;</td>
237.1006 +        </tr>
237.1007 +        <tr>
237.1008 +          <td></td>
237.1009 +          <td>)</td>
237.1010 +          <td></td><td></td>
237.1011 +        </tr>
237.1012 +      </table>
237.1013 +</div><div class="memdoc">
237.1014 +
237.1015 +<p>Wraps the sstrcmp function. </p>
237.1016 +<dl class="params"><dt>Parameters</dt><dd>
237.1017 +  <table class="params">
237.1018 +    <tr><td class="paramname">s1</td><td>sstr one </td></tr>
237.1019 +    <tr><td class="paramname">s2</td><td>sstr two </td></tr>
237.1020 +    <tr><td class="paramname">data</td><td>ignored </td></tr>
237.1021 +  </table>
237.1022 +  </dd>
237.1023 +</dl>
237.1024 +<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>
237.1025 +
237.1026 +</div>
237.1027 +</div>
237.1028 +<a id="aa6a37b9d172b6a5b2803d152f9e1b258"></a>
237.1029 +<h2 class="memtitle"><span class="permalink"><a href="#aa6a37b9d172b6a5b2803d152f9e1b258">&#9670;&nbsp;</a></span>ucx_cmp_str()</h2>
237.1030 +
237.1031 +<div class="memitem">
237.1032 +<div class="memproto">
237.1033 +      <table class="memname">
237.1034 +        <tr>
237.1035 +          <td class="memname">int ucx_cmp_str </td>
237.1036 +          <td>(</td>
237.1037 +          <td class="paramtype">const void *&#160;</td>
237.1038 +          <td class="paramname"><em>s1</em>, </td>
237.1039 +        </tr>
237.1040 +        <tr>
237.1041 +          <td class="paramkey"></td>
237.1042 +          <td></td>
237.1043 +          <td class="paramtype">const void *&#160;</td>
237.1044 +          <td class="paramname"><em>s2</em>, </td>
237.1045 +        </tr>
237.1046 +        <tr>
237.1047 +          <td class="paramkey"></td>
237.1048 +          <td></td>
237.1049 +          <td class="paramtype">void *&#160;</td>
237.1050 +          <td class="paramname"><em>data</em>&#160;</td>
237.1051 +        </tr>
237.1052 +        <tr>
237.1053 +          <td></td>
237.1054 +          <td>)</td>
237.1055 +          <td></td><td></td>
237.1056 +        </tr>
237.1057 +      </table>
237.1058 +</div><div class="memdoc">
237.1059 +
237.1060 +<p>Wraps the strcmp function. </p>
237.1061 +<dl class="params"><dt>Parameters</dt><dd>
237.1062 +  <table class="params">
237.1063 +    <tr><td class="paramname">s1</td><td>string one </td></tr>
237.1064 +    <tr><td class="paramname">s2</td><td>string two </td></tr>
237.1065 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1066 +  </table>
237.1067 +  </dd>
237.1068 +</dl>
237.1069 +<dl class="section return"><dt>Returns</dt><dd>the result of strcmp(s1, s2) </dd></dl>
237.1070 +
237.1071 +</div>
237.1072 +</div>
237.1073 +<a id="ac6b354a878f551a3a5b20a167db3f308"></a>
237.1074 +<h2 class="memtitle"><span class="permalink"><a href="#ac6b354a878f551a3a5b20a167db3f308">&#9670;&nbsp;</a></span>ucx_cmp_strn()</h2>
237.1075 +
237.1076 +<div class="memitem">
237.1077 +<div class="memproto">
237.1078 +      <table class="memname">
237.1079 +        <tr>
237.1080 +          <td class="memname">int ucx_cmp_strn </td>
237.1081 +          <td>(</td>
237.1082 +          <td class="paramtype">const void *&#160;</td>
237.1083 +          <td class="paramname"><em>s1</em>, </td>
237.1084 +        </tr>
237.1085 +        <tr>
237.1086 +          <td class="paramkey"></td>
237.1087 +          <td></td>
237.1088 +          <td class="paramtype">const void *&#160;</td>
237.1089 +          <td class="paramname"><em>s2</em>, </td>
237.1090 +        </tr>
237.1091 +        <tr>
237.1092 +          <td class="paramkey"></td>
237.1093 +          <td></td>
237.1094 +          <td class="paramtype">void *&#160;</td>
237.1095 +          <td class="paramname"><em>n</em>&#160;</td>
237.1096 +        </tr>
237.1097 +        <tr>
237.1098 +          <td></td>
237.1099 +          <td>)</td>
237.1100 +          <td></td><td></td>
237.1101 +        </tr>
237.1102 +      </table>
237.1103 +</div><div class="memdoc">
237.1104 +
237.1105 +<p>Wraps the strncmp function. </p>
237.1106 +<dl class="params"><dt>Parameters</dt><dd>
237.1107 +  <table class="params">
237.1108 +    <tr><td class="paramname">s1</td><td>string one </td></tr>
237.1109 +    <tr><td class="paramname">s2</td><td>string two </td></tr>
237.1110 +    <tr><td class="paramname">n</td><td>a pointer to the size_t containing the third strncmp parameter </td></tr>
237.1111 +  </table>
237.1112 +  </dd>
237.1113 +</dl>
237.1114 +<dl class="section return"><dt>Returns</dt><dd>the result of strncmp(s1, s2, *n) </dd></dl>
237.1115 +
237.1116 +</div>
237.1117 +</div>
237.1118 +<a id="abd83a5da91c3dd026a6931bd80c12f1e"></a>
237.1119 +<h2 class="memtitle"><span class="permalink"><a href="#abd83a5da91c3dd026a6931bd80c12f1e">&#9670;&nbsp;</a></span>ucx_cmp_uint()</h2>
237.1120 +
237.1121 +<div class="memitem">
237.1122 +<div class="memproto">
237.1123 +      <table class="memname">
237.1124 +        <tr>
237.1125 +          <td class="memname">int ucx_cmp_uint </td>
237.1126 +          <td>(</td>
237.1127 +          <td class="paramtype">const void *&#160;</td>
237.1128 +          <td class="paramname"><em>i1</em>, </td>
237.1129 +        </tr>
237.1130 +        <tr>
237.1131 +          <td class="paramkey"></td>
237.1132 +          <td></td>
237.1133 +          <td class="paramtype">const void *&#160;</td>
237.1134 +          <td class="paramname"><em>i2</em>, </td>
237.1135 +        </tr>
237.1136 +        <tr>
237.1137 +          <td class="paramkey"></td>
237.1138 +          <td></td>
237.1139 +          <td class="paramtype">void *&#160;</td>
237.1140 +          <td class="paramname"><em>data</em>&#160;</td>
237.1141 +        </tr>
237.1142 +        <tr>
237.1143 +          <td></td>
237.1144 +          <td>)</td>
237.1145 +          <td></td><td></td>
237.1146 +        </tr>
237.1147 +      </table>
237.1148 +</div><div class="memdoc">
237.1149 +
237.1150 +<p>Compares two integers of type unsigned int. </p>
237.1151 +<dl class="params"><dt>Parameters</dt><dd>
237.1152 +  <table class="params">
237.1153 +    <tr><td class="paramname">i1</td><td>pointer to unsigned integer one </td></tr>
237.1154 +    <tr><td class="paramname">i2</td><td>pointer to unsigned integer two </td></tr>
237.1155 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1156 +  </table>
237.1157 +  </dd>
237.1158 +</dl>
237.1159 +<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>
237.1160 +
237.1161 +</div>
237.1162 +</div>
237.1163 +<a id="acde5366437e886a459b7468f7a9e11f0"></a>
237.1164 +<h2 class="memtitle"><span class="permalink"><a href="#acde5366437e886a459b7468f7a9e11f0">&#9670;&nbsp;</a></span>ucx_cmp_uint16()</h2>
237.1165 +
237.1166 +<div class="memitem">
237.1167 +<div class="memproto">
237.1168 +      <table class="memname">
237.1169 +        <tr>
237.1170 +          <td class="memname">int ucx_cmp_uint16 </td>
237.1171 +          <td>(</td>
237.1172 +          <td class="paramtype">const void *&#160;</td>
237.1173 +          <td class="paramname"><em>i1</em>, </td>
237.1174 +        </tr>
237.1175 +        <tr>
237.1176 +          <td class="paramkey"></td>
237.1177 +          <td></td>
237.1178 +          <td class="paramtype">const void *&#160;</td>
237.1179 +          <td class="paramname"><em>i2</em>, </td>
237.1180 +        </tr>
237.1181 +        <tr>
237.1182 +          <td class="paramkey"></td>
237.1183 +          <td></td>
237.1184 +          <td class="paramtype">void *&#160;</td>
237.1185 +          <td class="paramname"><em>data</em>&#160;</td>
237.1186 +        </tr>
237.1187 +        <tr>
237.1188 +          <td></td>
237.1189 +          <td>)</td>
237.1190 +          <td></td><td></td>
237.1191 +        </tr>
237.1192 +      </table>
237.1193 +</div><div class="memdoc">
237.1194 +
237.1195 +<p>Compares two integers of type uint16_t. </p>
237.1196 +<dl class="params"><dt>Parameters</dt><dd>
237.1197 +  <table class="params">
237.1198 +    <tr><td class="paramname">i1</td><td>pointer to uint16_t one </td></tr>
237.1199 +    <tr><td class="paramname">i2</td><td>pointer to uint16_t two </td></tr>
237.1200 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1201 +  </table>
237.1202 +  </dd>
237.1203 +</dl>
237.1204 +<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>
237.1205 +
237.1206 +</div>
237.1207 +</div>
237.1208 +<a id="a5879d1722330355914d8c9146fa549d3"></a>
237.1209 +<h2 class="memtitle"><span class="permalink"><a href="#a5879d1722330355914d8c9146fa549d3">&#9670;&nbsp;</a></span>ucx_cmp_uint32()</h2>
237.1210 +
237.1211 +<div class="memitem">
237.1212 +<div class="memproto">
237.1213 +      <table class="memname">
237.1214 +        <tr>
237.1215 +          <td class="memname">int ucx_cmp_uint32 </td>
237.1216 +          <td>(</td>
237.1217 +          <td class="paramtype">const void *&#160;</td>
237.1218 +          <td class="paramname"><em>i1</em>, </td>
237.1219 +        </tr>
237.1220 +        <tr>
237.1221 +          <td class="paramkey"></td>
237.1222 +          <td></td>
237.1223 +          <td class="paramtype">const void *&#160;</td>
237.1224 +          <td class="paramname"><em>i2</em>, </td>
237.1225 +        </tr>
237.1226 +        <tr>
237.1227 +          <td class="paramkey"></td>
237.1228 +          <td></td>
237.1229 +          <td class="paramtype">void *&#160;</td>
237.1230 +          <td class="paramname"><em>data</em>&#160;</td>
237.1231 +        </tr>
237.1232 +        <tr>
237.1233 +          <td></td>
237.1234 +          <td>)</td>
237.1235 +          <td></td><td></td>
237.1236 +        </tr>
237.1237 +      </table>
237.1238 +</div><div class="memdoc">
237.1239 +
237.1240 +<p>Compares two integers of type uint32_t. </p>
237.1241 +<dl class="params"><dt>Parameters</dt><dd>
237.1242 +  <table class="params">
237.1243 +    <tr><td class="paramname">i1</td><td>pointer to uint32_t one </td></tr>
237.1244 +    <tr><td class="paramname">i2</td><td>pointer to uint32_t two </td></tr>
237.1245 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1246 +  </table>
237.1247 +  </dd>
237.1248 +</dl>
237.1249 +<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>
237.1250 +
237.1251 +</div>
237.1252 +</div>
237.1253 +<a id="a1572a78b5b42f7151a5b2a5a7283d62d"></a>
237.1254 +<h2 class="memtitle"><span class="permalink"><a href="#a1572a78b5b42f7151a5b2a5a7283d62d">&#9670;&nbsp;</a></span>ucx_cmp_uint64()</h2>
237.1255 +
237.1256 +<div class="memitem">
237.1257 +<div class="memproto">
237.1258 +      <table class="memname">
237.1259 +        <tr>
237.1260 +          <td class="memname">int ucx_cmp_uint64 </td>
237.1261 +          <td>(</td>
237.1262 +          <td class="paramtype">const void *&#160;</td>
237.1263 +          <td class="paramname"><em>i1</em>, </td>
237.1264 +        </tr>
237.1265 +        <tr>
237.1266 +          <td class="paramkey"></td>
237.1267 +          <td></td>
237.1268 +          <td class="paramtype">const void *&#160;</td>
237.1269 +          <td class="paramname"><em>i2</em>, </td>
237.1270 +        </tr>
237.1271 +        <tr>
237.1272 +          <td class="paramkey"></td>
237.1273 +          <td></td>
237.1274 +          <td class="paramtype">void *&#160;</td>
237.1275 +          <td class="paramname"><em>data</em>&#160;</td>
237.1276 +        </tr>
237.1277 +        <tr>
237.1278 +          <td></td>
237.1279 +          <td>)</td>
237.1280 +          <td></td><td></td>
237.1281 +        </tr>
237.1282 +      </table>
237.1283 +</div><div class="memdoc">
237.1284 +
237.1285 +<p>Compares two integers of type uint64_t. </p>
237.1286 +<dl class="params"><dt>Parameters</dt><dd>
237.1287 +  <table class="params">
237.1288 +    <tr><td class="paramname">i1</td><td>pointer to uint64_t one </td></tr>
237.1289 +    <tr><td class="paramname">i2</td><td>pointer to uint64_t two </td></tr>
237.1290 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1291 +  </table>
237.1292 +  </dd>
237.1293 +</dl>
237.1294 +<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>
237.1295 +
237.1296 +</div>
237.1297 +</div>
237.1298 +<a id="a3f3cbae2594d6f722bae29acb0408a24"></a>
237.1299 +<h2 class="memtitle"><span class="permalink"><a href="#a3f3cbae2594d6f722bae29acb0408a24">&#9670;&nbsp;</a></span>ucx_cmp_ulongint()</h2>
237.1300 +
237.1301 +<div class="memitem">
237.1302 +<div class="memproto">
237.1303 +      <table class="memname">
237.1304 +        <tr>
237.1305 +          <td class="memname">int ucx_cmp_ulongint </td>
237.1306 +          <td>(</td>
237.1307 +          <td class="paramtype">const void *&#160;</td>
237.1308 +          <td class="paramname"><em>i1</em>, </td>
237.1309 +        </tr>
237.1310 +        <tr>
237.1311 +          <td class="paramkey"></td>
237.1312 +          <td></td>
237.1313 +          <td class="paramtype">const void *&#160;</td>
237.1314 +          <td class="paramname"><em>i2</em>, </td>
237.1315 +        </tr>
237.1316 +        <tr>
237.1317 +          <td class="paramkey"></td>
237.1318 +          <td></td>
237.1319 +          <td class="paramtype">void *&#160;</td>
237.1320 +          <td class="paramname"><em>data</em>&#160;</td>
237.1321 +        </tr>
237.1322 +        <tr>
237.1323 +          <td></td>
237.1324 +          <td>)</td>
237.1325 +          <td></td><td></td>
237.1326 +        </tr>
237.1327 +      </table>
237.1328 +</div><div class="memdoc">
237.1329 +
237.1330 +<p>Compares two integers of type unsigned long int. </p>
237.1331 +<dl class="params"><dt>Parameters</dt><dd>
237.1332 +  <table class="params">
237.1333 +    <tr><td class="paramname">i1</td><td>pointer to unsigned long integer one </td></tr>
237.1334 +    <tr><td class="paramname">i2</td><td>pointer to unsigned long integer two </td></tr>
237.1335 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1336 +  </table>
237.1337 +  </dd>
237.1338 +</dl>
237.1339 +<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>
237.1340 +
237.1341 +</div>
237.1342 +</div>
237.1343 +<a id="a6acfc359421f21f9a042a654ff7faac5"></a>
237.1344 +<h2 class="memtitle"><span class="permalink"><a href="#a6acfc359421f21f9a042a654ff7faac5">&#9670;&nbsp;</a></span>ucx_cmp_ulonglong()</h2>
237.1345 +
237.1346 +<div class="memitem">
237.1347 +<div class="memproto">
237.1348 +      <table class="memname">
237.1349 +        <tr>
237.1350 +          <td class="memname">int ucx_cmp_ulonglong </td>
237.1351 +          <td>(</td>
237.1352 +          <td class="paramtype">const void *&#160;</td>
237.1353 +          <td class="paramname"><em>i1</em>, </td>
237.1354 +        </tr>
237.1355 +        <tr>
237.1356 +          <td class="paramkey"></td>
237.1357 +          <td></td>
237.1358 +          <td class="paramtype">const void *&#160;</td>
237.1359 +          <td class="paramname"><em>i2</em>, </td>
237.1360 +        </tr>
237.1361 +        <tr>
237.1362 +          <td class="paramkey"></td>
237.1363 +          <td></td>
237.1364 +          <td class="paramtype">void *&#160;</td>
237.1365 +          <td class="paramname"><em>data</em>&#160;</td>
237.1366 +        </tr>
237.1367 +        <tr>
237.1368 +          <td></td>
237.1369 +          <td>)</td>
237.1370 +          <td></td><td></td>
237.1371 +        </tr>
237.1372 +      </table>
237.1373 +</div><div class="memdoc">
237.1374 +
237.1375 +<p>Compares two integers of type unsigned long long. </p>
237.1376 +<dl class="params"><dt>Parameters</dt><dd>
237.1377 +  <table class="params">
237.1378 +    <tr><td class="paramname">i1</td><td>pointer to unsigned long long one </td></tr>
237.1379 +    <tr><td class="paramname">i2</td><td>pointer to unsigned long long two </td></tr>
237.1380 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1381 +  </table>
237.1382 +  </dd>
237.1383 +</dl>
237.1384 +<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>
237.1385 +
237.1386 +</div>
237.1387 +</div>
237.1388 +<a id="a4ab6753739d56c09cdf6079fdcabf7c6"></a>
237.1389 +<h2 class="memtitle"><span class="permalink"><a href="#a4ab6753739d56c09cdf6079fdcabf7c6">&#9670;&nbsp;</a></span>ucx_dist_int()</h2>
237.1390 +
237.1391 +<div class="memitem">
237.1392 +<div class="memproto">
237.1393 +      <table class="memname">
237.1394 +        <tr>
237.1395 +          <td class="memname">intmax_t ucx_dist_int </td>
237.1396 +          <td>(</td>
237.1397 +          <td class="paramtype">const void *&#160;</td>
237.1398 +          <td class="paramname"><em>i1</em>, </td>
237.1399 +        </tr>
237.1400 +        <tr>
237.1401 +          <td class="paramkey"></td>
237.1402 +          <td></td>
237.1403 +          <td class="paramtype">const void *&#160;</td>
237.1404 +          <td class="paramname"><em>i2</em>, </td>
237.1405 +        </tr>
237.1406 +        <tr>
237.1407 +          <td class="paramkey"></td>
237.1408 +          <td></td>
237.1409 +          <td class="paramtype">void *&#160;</td>
237.1410 +          <td class="paramname"><em>data</em>&#160;</td>
237.1411 +        </tr>
237.1412 +        <tr>
237.1413 +          <td></td>
237.1414 +          <td>)</td>
237.1415 +          <td></td><td></td>
237.1416 +        </tr>
237.1417 +      </table>
237.1418 +</div><div class="memdoc">
237.1419 +
237.1420 +<p>Distance function for integers of type int. </p>
237.1421 +<dl class="params"><dt>Parameters</dt><dd>
237.1422 +  <table class="params">
237.1423 +    <tr><td class="paramname">i1</td><td>pointer to integer one </td></tr>
237.1424 +    <tr><td class="paramname">i2</td><td>pointer to integer two </td></tr>
237.1425 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1426 +  </table>
237.1427 +  </dd>
237.1428 +</dl>
237.1429 +<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
237.1430 +
237.1431 +</div>
237.1432 +</div>
237.1433 +<a id="a81fb8434b70ca11bf2c14abfa21d16a9"></a>
237.1434 +<h2 class="memtitle"><span class="permalink"><a href="#a81fb8434b70ca11bf2c14abfa21d16a9">&#9670;&nbsp;</a></span>ucx_dist_int16()</h2>
237.1435 +
237.1436 +<div class="memitem">
237.1437 +<div class="memproto">
237.1438 +      <table class="memname">
237.1439 +        <tr>
237.1440 +          <td class="memname">intmax_t ucx_dist_int16 </td>
237.1441 +          <td>(</td>
237.1442 +          <td class="paramtype">const void *&#160;</td>
237.1443 +          <td class="paramname"><em>i1</em>, </td>
237.1444 +        </tr>
237.1445 +        <tr>
237.1446 +          <td class="paramkey"></td>
237.1447 +          <td></td>
237.1448 +          <td class="paramtype">const void *&#160;</td>
237.1449 +          <td class="paramname"><em>i2</em>, </td>
237.1450 +        </tr>
237.1451 +        <tr>
237.1452 +          <td class="paramkey"></td>
237.1453 +          <td></td>
237.1454 +          <td class="paramtype">void *&#160;</td>
237.1455 +          <td class="paramname"><em>data</em>&#160;</td>
237.1456 +        </tr>
237.1457 +        <tr>
237.1458 +          <td></td>
237.1459 +          <td>)</td>
237.1460 +          <td></td><td></td>
237.1461 +        </tr>
237.1462 +      </table>
237.1463 +</div><div class="memdoc">
237.1464 +
237.1465 +<p>Distance function for integers of type int16_t. </p>
237.1466 +<dl class="params"><dt>Parameters</dt><dd>
237.1467 +  <table class="params">
237.1468 +    <tr><td class="paramname">i1</td><td>pointer to int16_t one </td></tr>
237.1469 +    <tr><td class="paramname">i2</td><td>pointer to int16_t two </td></tr>
237.1470 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1471 +  </table>
237.1472 +  </dd>
237.1473 +</dl>
237.1474 +<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
237.1475 +
237.1476 +</div>
237.1477 +</div>
237.1478 +<a id="ab4a659cc46096f0490c1dafa57726476"></a>
237.1479 +<h2 class="memtitle"><span class="permalink"><a href="#ab4a659cc46096f0490c1dafa57726476">&#9670;&nbsp;</a></span>ucx_dist_int32()</h2>
237.1480 +
237.1481 +<div class="memitem">
237.1482 +<div class="memproto">
237.1483 +      <table class="memname">
237.1484 +        <tr>
237.1485 +          <td class="memname">intmax_t ucx_dist_int32 </td>
237.1486 +          <td>(</td>
237.1487 +          <td class="paramtype">const void *&#160;</td>
237.1488 +          <td class="paramname"><em>i1</em>, </td>
237.1489 +        </tr>
237.1490 +        <tr>
237.1491 +          <td class="paramkey"></td>
237.1492 +          <td></td>
237.1493 +          <td class="paramtype">const void *&#160;</td>
237.1494 +          <td class="paramname"><em>i2</em>, </td>
237.1495 +        </tr>
237.1496 +        <tr>
237.1497 +          <td class="paramkey"></td>
237.1498 +          <td></td>
237.1499 +          <td class="paramtype">void *&#160;</td>
237.1500 +          <td class="paramname"><em>data</em>&#160;</td>
237.1501 +        </tr>
237.1502 +        <tr>
237.1503 +          <td></td>
237.1504 +          <td>)</td>
237.1505 +          <td></td><td></td>
237.1506 +        </tr>
237.1507 +      </table>
237.1508 +</div><div class="memdoc">
237.1509 +
237.1510 +<p>Distance function for integers of type int32_t. </p>
237.1511 +<dl class="params"><dt>Parameters</dt><dd>
237.1512 +  <table class="params">
237.1513 +    <tr><td class="paramname">i1</td><td>pointer to int32_t one </td></tr>
237.1514 +    <tr><td class="paramname">i2</td><td>pointer to int32_t two </td></tr>
237.1515 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1516 +  </table>
237.1517 +  </dd>
237.1518 +</dl>
237.1519 +<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
237.1520 +
237.1521 +</div>
237.1522 +</div>
237.1523 +<a id="a54e7d06585bad3a899befc4e9c13853f"></a>
237.1524 +<h2 class="memtitle"><span class="permalink"><a href="#a54e7d06585bad3a899befc4e9c13853f">&#9670;&nbsp;</a></span>ucx_dist_int64()</h2>
237.1525 +
237.1526 +<div class="memitem">
237.1527 +<div class="memproto">
237.1528 +      <table class="memname">
237.1529 +        <tr>
237.1530 +          <td class="memname">intmax_t ucx_dist_int64 </td>
237.1531 +          <td>(</td>
237.1532 +          <td class="paramtype">const void *&#160;</td>
237.1533 +          <td class="paramname"><em>i1</em>, </td>
237.1534 +        </tr>
237.1535 +        <tr>
237.1536 +          <td class="paramkey"></td>
237.1537 +          <td></td>
237.1538 +          <td class="paramtype">const void *&#160;</td>
237.1539 +          <td class="paramname"><em>i2</em>, </td>
237.1540 +        </tr>
237.1541 +        <tr>
237.1542 +          <td class="paramkey"></td>
237.1543 +          <td></td>
237.1544 +          <td class="paramtype">void *&#160;</td>
237.1545 +          <td class="paramname"><em>data</em>&#160;</td>
237.1546 +        </tr>
237.1547 +        <tr>
237.1548 +          <td></td>
237.1549 +          <td>)</td>
237.1550 +          <td></td><td></td>
237.1551 +        </tr>
237.1552 +      </table>
237.1553 +</div><div class="memdoc">
237.1554 +
237.1555 +<p>Distance function for integers of type int64_t. </p>
237.1556 +<dl class="params"><dt>Parameters</dt><dd>
237.1557 +  <table class="params">
237.1558 +    <tr><td class="paramname">i1</td><td>pointer to int64_t one </td></tr>
237.1559 +    <tr><td class="paramname">i2</td><td>pointer to int64_t two </td></tr>
237.1560 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1561 +  </table>
237.1562 +  </dd>
237.1563 +</dl>
237.1564 +<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
237.1565 +
237.1566 +</div>
237.1567 +</div>
237.1568 +<a id="a43e73d288b1553a0078bf4c98dd341f5"></a>
237.1569 +<h2 class="memtitle"><span class="permalink"><a href="#a43e73d288b1553a0078bf4c98dd341f5">&#9670;&nbsp;</a></span>ucx_dist_longint()</h2>
237.1570 +
237.1571 +<div class="memitem">
237.1572 +<div class="memproto">
237.1573 +      <table class="memname">
237.1574 +        <tr>
237.1575 +          <td class="memname">intmax_t ucx_dist_longint </td>
237.1576 +          <td>(</td>
237.1577 +          <td class="paramtype">const void *&#160;</td>
237.1578 +          <td class="paramname"><em>i1</em>, </td>
237.1579 +        </tr>
237.1580 +        <tr>
237.1581 +          <td class="paramkey"></td>
237.1582 +          <td></td>
237.1583 +          <td class="paramtype">const void *&#160;</td>
237.1584 +          <td class="paramname"><em>i2</em>, </td>
237.1585 +        </tr>
237.1586 +        <tr>
237.1587 +          <td class="paramkey"></td>
237.1588 +          <td></td>
237.1589 +          <td class="paramtype">void *&#160;</td>
237.1590 +          <td class="paramname"><em>data</em>&#160;</td>
237.1591 +        </tr>
237.1592 +        <tr>
237.1593 +          <td></td>
237.1594 +          <td>)</td>
237.1595 +          <td></td><td></td>
237.1596 +        </tr>
237.1597 +      </table>
237.1598 +</div><div class="memdoc">
237.1599 +
237.1600 +<p>Distance function for integers of type long int. </p>
237.1601 +<dl class="params"><dt>Parameters</dt><dd>
237.1602 +  <table class="params">
237.1603 +    <tr><td class="paramname">i1</td><td>pointer to long integer one </td></tr>
237.1604 +    <tr><td class="paramname">i2</td><td>pointer to long integer two </td></tr>
237.1605 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1606 +  </table>
237.1607 +  </dd>
237.1608 +</dl>
237.1609 +<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
237.1610 +
237.1611 +</div>
237.1612 +</div>
237.1613 +<a id="a306778414a2427951ea263be92368627"></a>
237.1614 +<h2 class="memtitle"><span class="permalink"><a href="#a306778414a2427951ea263be92368627">&#9670;&nbsp;</a></span>ucx_dist_longlong()</h2>
237.1615 +
237.1616 +<div class="memitem">
237.1617 +<div class="memproto">
237.1618 +      <table class="memname">
237.1619 +        <tr>
237.1620 +          <td class="memname">intmax_t ucx_dist_longlong </td>
237.1621 +          <td>(</td>
237.1622 +          <td class="paramtype">const void *&#160;</td>
237.1623 +          <td class="paramname"><em>i1</em>, </td>
237.1624 +        </tr>
237.1625 +        <tr>
237.1626 +          <td class="paramkey"></td>
237.1627 +          <td></td>
237.1628 +          <td class="paramtype">const void *&#160;</td>
237.1629 +          <td class="paramname"><em>i2</em>, </td>
237.1630 +        </tr>
237.1631 +        <tr>
237.1632 +          <td class="paramkey"></td>
237.1633 +          <td></td>
237.1634 +          <td class="paramtype">void *&#160;</td>
237.1635 +          <td class="paramname"><em>data</em>&#160;</td>
237.1636 +        </tr>
237.1637 +        <tr>
237.1638 +          <td></td>
237.1639 +          <td>)</td>
237.1640 +          <td></td><td></td>
237.1641 +        </tr>
237.1642 +      </table>
237.1643 +</div><div class="memdoc">
237.1644 +
237.1645 +<p>Distance function for integers of type long long. </p>
237.1646 +<dl class="params"><dt>Parameters</dt><dd>
237.1647 +  <table class="params">
237.1648 +    <tr><td class="paramname">i1</td><td>pointer to long long one </td></tr>
237.1649 +    <tr><td class="paramname">i2</td><td>pointer to long long two </td></tr>
237.1650 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1651 +  </table>
237.1652 +  </dd>
237.1653 +</dl>
237.1654 +<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
237.1655 +
237.1656 +</div>
237.1657 +</div>
237.1658 +<a id="a37b7d471ca1679992afc11a0deda45f4"></a>
237.1659 +<h2 class="memtitle"><span class="permalink"><a href="#a37b7d471ca1679992afc11a0deda45f4">&#9670;&nbsp;</a></span>ucx_dist_uint()</h2>
237.1660 +
237.1661 +<div class="memitem">
237.1662 +<div class="memproto">
237.1663 +      <table class="memname">
237.1664 +        <tr>
237.1665 +          <td class="memname">intmax_t ucx_dist_uint </td>
237.1666 +          <td>(</td>
237.1667 +          <td class="paramtype">const void *&#160;</td>
237.1668 +          <td class="paramname"><em>i1</em>, </td>
237.1669 +        </tr>
237.1670 +        <tr>
237.1671 +          <td class="paramkey"></td>
237.1672 +          <td></td>
237.1673 +          <td class="paramtype">const void *&#160;</td>
237.1674 +          <td class="paramname"><em>i2</em>, </td>
237.1675 +        </tr>
237.1676 +        <tr>
237.1677 +          <td class="paramkey"></td>
237.1678 +          <td></td>
237.1679 +          <td class="paramtype">void *&#160;</td>
237.1680 +          <td class="paramname"><em>data</em>&#160;</td>
237.1681 +        </tr>
237.1682 +        <tr>
237.1683 +          <td></td>
237.1684 +          <td>)</td>
237.1685 +          <td></td><td></td>
237.1686 +        </tr>
237.1687 +      </table>
237.1688 +</div><div class="memdoc">
237.1689 +
237.1690 +<p>Distance function for integers of type unsigned int. </p>
237.1691 +<dl class="params"><dt>Parameters</dt><dd>
237.1692 +  <table class="params">
237.1693 +    <tr><td class="paramname">i1</td><td>pointer to unsigned integer one </td></tr>
237.1694 +    <tr><td class="paramname">i2</td><td>pointer to unsigned integer two </td></tr>
237.1695 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1696 +  </table>
237.1697 +  </dd>
237.1698 +</dl>
237.1699 +<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
237.1700 +
237.1701 +</div>
237.1702 +</div>
237.1703 +<a id="a66e00a0703cbcde050ec922578e2f080"></a>
237.1704 +<h2 class="memtitle"><span class="permalink"><a href="#a66e00a0703cbcde050ec922578e2f080">&#9670;&nbsp;</a></span>ucx_dist_uint16()</h2>
237.1705 +
237.1706 +<div class="memitem">
237.1707 +<div class="memproto">
237.1708 +      <table class="memname">
237.1709 +        <tr>
237.1710 +          <td class="memname">intmax_t ucx_dist_uint16 </td>
237.1711 +          <td>(</td>
237.1712 +          <td class="paramtype">const void *&#160;</td>
237.1713 +          <td class="paramname"><em>i1</em>, </td>
237.1714 +        </tr>
237.1715 +        <tr>
237.1716 +          <td class="paramkey"></td>
237.1717 +          <td></td>
237.1718 +          <td class="paramtype">const void *&#160;</td>
237.1719 +          <td class="paramname"><em>i2</em>, </td>
237.1720 +        </tr>
237.1721 +        <tr>
237.1722 +          <td class="paramkey"></td>
237.1723 +          <td></td>
237.1724 +          <td class="paramtype">void *&#160;</td>
237.1725 +          <td class="paramname"><em>data</em>&#160;</td>
237.1726 +        </tr>
237.1727 +        <tr>
237.1728 +          <td></td>
237.1729 +          <td>)</td>
237.1730 +          <td></td><td></td>
237.1731 +        </tr>
237.1732 +      </table>
237.1733 +</div><div class="memdoc">
237.1734 +
237.1735 +<p>Distance function for integers of type uint16_t. </p>
237.1736 +<dl class="params"><dt>Parameters</dt><dd>
237.1737 +  <table class="params">
237.1738 +    <tr><td class="paramname">i1</td><td>pointer to uint16_t one </td></tr>
237.1739 +    <tr><td class="paramname">i2</td><td>pointer to uint16_t two </td></tr>
237.1740 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1741 +  </table>
237.1742 +  </dd>
237.1743 +</dl>
237.1744 +<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
237.1745 +
237.1746 +</div>
237.1747 +</div>
237.1748 +<a id="add2b5c5507caba59d894b84e056b079b"></a>
237.1749 +<h2 class="memtitle"><span class="permalink"><a href="#add2b5c5507caba59d894b84e056b079b">&#9670;&nbsp;</a></span>ucx_dist_uint32()</h2>
237.1750 +
237.1751 +<div class="memitem">
237.1752 +<div class="memproto">
237.1753 +      <table class="memname">
237.1754 +        <tr>
237.1755 +          <td class="memname">intmax_t ucx_dist_uint32 </td>
237.1756 +          <td>(</td>
237.1757 +          <td class="paramtype">const void *&#160;</td>
237.1758 +          <td class="paramname"><em>i1</em>, </td>
237.1759 +        </tr>
237.1760 +        <tr>
237.1761 +          <td class="paramkey"></td>
237.1762 +          <td></td>
237.1763 +          <td class="paramtype">const void *&#160;</td>
237.1764 +          <td class="paramname"><em>i2</em>, </td>
237.1765 +        </tr>
237.1766 +        <tr>
237.1767 +          <td class="paramkey"></td>
237.1768 +          <td></td>
237.1769 +          <td class="paramtype">void *&#160;</td>
237.1770 +          <td class="paramname"><em>data</em>&#160;</td>
237.1771 +        </tr>
237.1772 +        <tr>
237.1773 +          <td></td>
237.1774 +          <td>)</td>
237.1775 +          <td></td><td></td>
237.1776 +        </tr>
237.1777 +      </table>
237.1778 +</div><div class="memdoc">
237.1779 +
237.1780 +<p>Distance function for integers of type uint32_t. </p>
237.1781 +<dl class="params"><dt>Parameters</dt><dd>
237.1782 +  <table class="params">
237.1783 +    <tr><td class="paramname">i1</td><td>pointer to uint32_t one </td></tr>
237.1784 +    <tr><td class="paramname">i2</td><td>pointer to uint32_t two </td></tr>
237.1785 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1786 +  </table>
237.1787 +  </dd>
237.1788 +</dl>
237.1789 +<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
237.1790 +
237.1791 +</div>
237.1792 +</div>
237.1793 +<a id="a3ba75e2e0b2479eef2b22fb219b42da7"></a>
237.1794 +<h2 class="memtitle"><span class="permalink"><a href="#a3ba75e2e0b2479eef2b22fb219b42da7">&#9670;&nbsp;</a></span>ucx_dist_uint64()</h2>
237.1795 +
237.1796 +<div class="memitem">
237.1797 +<div class="memproto">
237.1798 +      <table class="memname">
237.1799 +        <tr>
237.1800 +          <td class="memname">intmax_t ucx_dist_uint64 </td>
237.1801 +          <td>(</td>
237.1802 +          <td class="paramtype">const void *&#160;</td>
237.1803 +          <td class="paramname"><em>i1</em>, </td>
237.1804 +        </tr>
237.1805 +        <tr>
237.1806 +          <td class="paramkey"></td>
237.1807 +          <td></td>
237.1808 +          <td class="paramtype">const void *&#160;</td>
237.1809 +          <td class="paramname"><em>i2</em>, </td>
237.1810 +        </tr>
237.1811 +        <tr>
237.1812 +          <td class="paramkey"></td>
237.1813 +          <td></td>
237.1814 +          <td class="paramtype">void *&#160;</td>
237.1815 +          <td class="paramname"><em>data</em>&#160;</td>
237.1816 +        </tr>
237.1817 +        <tr>
237.1818 +          <td></td>
237.1819 +          <td>)</td>
237.1820 +          <td></td><td></td>
237.1821 +        </tr>
237.1822 +      </table>
237.1823 +</div><div class="memdoc">
237.1824 +
237.1825 +<p>Distance function for integers of type uint64_t. </p>
237.1826 +<dl class="params"><dt>Parameters</dt><dd>
237.1827 +  <table class="params">
237.1828 +    <tr><td class="paramname">i1</td><td>pointer to uint64_t one </td></tr>
237.1829 +    <tr><td class="paramname">i2</td><td>pointer to uint64_t two </td></tr>
237.1830 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1831 +  </table>
237.1832 +  </dd>
237.1833 +</dl>
237.1834 +<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
237.1835 +
237.1836 +</div>
237.1837 +</div>
237.1838 +<a id="abb13476228d0c16bfaba08469adbae2d"></a>
237.1839 +<h2 class="memtitle"><span class="permalink"><a href="#abb13476228d0c16bfaba08469adbae2d">&#9670;&nbsp;</a></span>ucx_dist_ulongint()</h2>
237.1840 +
237.1841 +<div class="memitem">
237.1842 +<div class="memproto">
237.1843 +      <table class="memname">
237.1844 +        <tr>
237.1845 +          <td class="memname">intmax_t ucx_dist_ulongint </td>
237.1846 +          <td>(</td>
237.1847 +          <td class="paramtype">const void *&#160;</td>
237.1848 +          <td class="paramname"><em>i1</em>, </td>
237.1849 +        </tr>
237.1850 +        <tr>
237.1851 +          <td class="paramkey"></td>
237.1852 +          <td></td>
237.1853 +          <td class="paramtype">const void *&#160;</td>
237.1854 +          <td class="paramname"><em>i2</em>, </td>
237.1855 +        </tr>
237.1856 +        <tr>
237.1857 +          <td class="paramkey"></td>
237.1858 +          <td></td>
237.1859 +          <td class="paramtype">void *&#160;</td>
237.1860 +          <td class="paramname"><em>data</em>&#160;</td>
237.1861 +        </tr>
237.1862 +        <tr>
237.1863 +          <td></td>
237.1864 +          <td>)</td>
237.1865 +          <td></td><td></td>
237.1866 +        </tr>
237.1867 +      </table>
237.1868 +</div><div class="memdoc">
237.1869 +
237.1870 +<p>Distance function for integers of type unsigned long int. </p>
237.1871 +<dl class="params"><dt>Parameters</dt><dd>
237.1872 +  <table class="params">
237.1873 +    <tr><td class="paramname">i1</td><td>pointer to unsigned long integer one </td></tr>
237.1874 +    <tr><td class="paramname">i2</td><td>pointer to unsigned long integer two </td></tr>
237.1875 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1876 +  </table>
237.1877 +  </dd>
237.1878 +</dl>
237.1879 +<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
237.1880 +
237.1881 +</div>
237.1882 +</div>
237.1883 +<a id="a59a5859272cb4b43cbdd58208c41e32b"></a>
237.1884 +<h2 class="memtitle"><span class="permalink"><a href="#a59a5859272cb4b43cbdd58208c41e32b">&#9670;&nbsp;</a></span>ucx_dist_ulonglong()</h2>
237.1885 +
237.1886 +<div class="memitem">
237.1887 +<div class="memproto">
237.1888 +      <table class="memname">
237.1889 +        <tr>
237.1890 +          <td class="memname">intmax_t ucx_dist_ulonglong </td>
237.1891 +          <td>(</td>
237.1892 +          <td class="paramtype">const void *&#160;</td>
237.1893 +          <td class="paramname"><em>i1</em>, </td>
237.1894 +        </tr>
237.1895 +        <tr>
237.1896 +          <td class="paramkey"></td>
237.1897 +          <td></td>
237.1898 +          <td class="paramtype">const void *&#160;</td>
237.1899 +          <td class="paramname"><em>i2</em>, </td>
237.1900 +        </tr>
237.1901 +        <tr>
237.1902 +          <td class="paramkey"></td>
237.1903 +          <td></td>
237.1904 +          <td class="paramtype">void *&#160;</td>
237.1905 +          <td class="paramname"><em>data</em>&#160;</td>
237.1906 +        </tr>
237.1907 +        <tr>
237.1908 +          <td></td>
237.1909 +          <td>)</td>
237.1910 +          <td></td><td></td>
237.1911 +        </tr>
237.1912 +      </table>
237.1913 +</div><div class="memdoc">
237.1914 +
237.1915 +<p>Distance function for integers of type unsigned long long. </p>
237.1916 +<dl class="params"><dt>Parameters</dt><dd>
237.1917 +  <table class="params">
237.1918 +    <tr><td class="paramname">i1</td><td>pointer to unsigned long long one </td></tr>
237.1919 +    <tr><td class="paramname">i2</td><td>pointer to unsigned long long two </td></tr>
237.1920 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.1921 +  </table>
237.1922 +  </dd>
237.1923 +</dl>
237.1924 +<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
237.1925 +
237.1926 +</div>
237.1927 +</div>
237.1928 +<a id="aa0bec80e1c67f769ff5e112a7d4ce72a"></a>
237.1929 +<h2 class="memtitle"><span class="permalink"><a href="#aa0bec80e1c67f769ff5e112a7d4ce72a">&#9670;&nbsp;</a></span>ucx_fprintf()</h2>
237.1930 +
237.1931 +<div class="memitem">
237.1932 +<div class="memproto">
237.1933 +      <table class="memname">
237.1934 +        <tr>
237.1935 +          <td class="memname">int ucx_fprintf </td>
237.1936 +          <td>(</td>
237.1937 +          <td class="paramtype">void *&#160;</td>
237.1938 +          <td class="paramname"><em>stream</em>, </td>
237.1939 +        </tr>
237.1940 +        <tr>
237.1941 +          <td class="paramkey"></td>
237.1942 +          <td></td>
237.1943 +          <td class="paramtype"><a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a>&#160;</td>
237.1944 +          <td class="paramname"><em>wfc</em>, </td>
237.1945 +        </tr>
237.1946 +        <tr>
237.1947 +          <td class="paramkey"></td>
237.1948 +          <td></td>
237.1949 +          <td class="paramtype">const char *&#160;</td>
237.1950 +          <td class="paramname"><em>fmt</em>, </td>
237.1951 +        </tr>
237.1952 +        <tr>
237.1953 +          <td class="paramkey"></td>
237.1954 +          <td></td>
237.1955 +          <td class="paramtype">&#160;</td>
237.1956 +          <td class="paramname"><em>...</em>&#160;</td>
237.1957 +        </tr>
237.1958 +        <tr>
237.1959 +          <td></td>
237.1960 +          <td>)</td>
237.1961 +          <td></td><td></td>
237.1962 +        </tr>
237.1963 +      </table>
237.1964 +</div><div class="memdoc">
237.1965 +
237.1966 +<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>
237.1967 +<dl class="params"><dt>Parameters</dt><dd>
237.1968 +  <table class="params">
237.1969 +    <tr><td class="paramname">stream</td><td>the stream the data is written to </td></tr>
237.1970 +    <tr><td class="paramname">wfc</td><td>the write function </td></tr>
237.1971 +    <tr><td class="paramname">fmt</td><td>format string </td></tr>
237.1972 +    <tr><td class="paramname">...</td><td>additional arguments </td></tr>
237.1973 +  </table>
237.1974 +  </dd>
237.1975 +</dl>
237.1976 +<dl class="section return"><dt>Returns</dt><dd>the total number of bytes written </dd></dl>
237.1977 +
237.1978 +</div>
237.1979 +</div>
237.1980 +<a id="ab2e184e6a744941aab6b8058116baf30"></a>
237.1981 +<h2 class="memtitle"><span class="permalink"><a href="#ab2e184e6a744941aab6b8058116baf30">&#9670;&nbsp;</a></span>ucx_memcpy()</h2>
237.1982 +
237.1983 +<div class="memitem">
237.1984 +<div class="memproto">
237.1985 +      <table class="memname">
237.1986 +        <tr>
237.1987 +          <td class="memname">void* ucx_memcpy </td>
237.1988 +          <td>(</td>
237.1989 +          <td class="paramtype">const void *&#160;</td>
237.1990 +          <td class="paramname"><em>m</em>, </td>
237.1991 +        </tr>
237.1992 +        <tr>
237.1993 +          <td class="paramkey"></td>
237.1994 +          <td></td>
237.1995 +          <td class="paramtype">void *&#160;</td>
237.1996 +          <td class="paramname"><em>n</em>&#160;</td>
237.1997 +        </tr>
237.1998 +        <tr>
237.1999 +          <td></td>
237.2000 +          <td>)</td>
237.2001 +          <td></td><td></td>
237.2002 +        </tr>
237.2003 +      </table>
237.2004 +</div><div class="memdoc">
237.2005 +
237.2006 +<p>Copies a memory area. </p>
237.2007 +<dl class="params"><dt>Parameters</dt><dd>
237.2008 +  <table class="params">
237.2009 +    <tr><td class="paramname">m</td><td>a pointer to the memory area </td></tr>
237.2010 +    <tr><td class="paramname">n</td><td>a pointer to the size_t containing the size of the memory area </td></tr>
237.2011 +  </table>
237.2012 +  </dd>
237.2013 +</dl>
237.2014 +<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>
237.2015 +
237.2016 +</div>
237.2017 +</div>
237.2018 +<a id="adeb6e8d0a53a829207cfa0a979d01fff"></a>
237.2019 +<h2 class="memtitle"><span class="permalink"><a href="#adeb6e8d0a53a829207cfa0a979d01fff">&#9670;&nbsp;</a></span>ucx_strcpy()</h2>
237.2020 +
237.2021 +<div class="memitem">
237.2022 +<div class="memproto">
237.2023 +      <table class="memname">
237.2024 +        <tr>
237.2025 +          <td class="memname">void* ucx_strcpy </td>
237.2026 +          <td>(</td>
237.2027 +          <td class="paramtype">const void *&#160;</td>
237.2028 +          <td class="paramname"><em>s</em>, </td>
237.2029 +        </tr>
237.2030 +        <tr>
237.2031 +          <td class="paramkey"></td>
237.2032 +          <td></td>
237.2033 +          <td class="paramtype">void *&#160;</td>
237.2034 +          <td class="paramname"><em>data</em>&#160;</td>
237.2035 +        </tr>
237.2036 +        <tr>
237.2037 +          <td></td>
237.2038 +          <td>)</td>
237.2039 +          <td></td><td></td>
237.2040 +        </tr>
237.2041 +      </table>
237.2042 +</div><div class="memdoc">
237.2043 +
237.2044 +<p>Copies a string. </p>
237.2045 +<dl class="params"><dt>Parameters</dt><dd>
237.2046 +  <table class="params">
237.2047 +    <tr><td class="paramname">s</td><td>the string to copy </td></tr>
237.2048 +    <tr><td class="paramname">data</td><td>omitted </td></tr>
237.2049 +  </table>
237.2050 +  </dd>
237.2051 +</dl>
237.2052 +<dl class="section return"><dt>Returns</dt><dd>a pointer to a copy of s1 that can be passed to free(void*) </dd></dl>
237.2053 +
237.2054 +</div>
237.2055 +</div>
237.2056 +<a id="a114ee7f7da62656ffd35e2dc23394201"></a>
237.2057 +<h2 class="memtitle"><span class="permalink"><a href="#a114ee7f7da62656ffd35e2dc23394201">&#9670;&nbsp;</a></span>ucx_stream_bncopy()</h2>
237.2058 +
237.2059 +<div class="memitem">
237.2060 +<div class="memproto">
237.2061 +      <table class="memname">
237.2062 +        <tr>
237.2063 +          <td class="memname">size_t ucx_stream_bncopy </td>
237.2064 +          <td>(</td>
237.2065 +          <td class="paramtype">void *&#160;</td>
237.2066 +          <td class="paramname"><em>src</em>, </td>
237.2067 +        </tr>
237.2068 +        <tr>
237.2069 +          <td class="paramkey"></td>
237.2070 +          <td></td>
237.2071 +          <td class="paramtype">void *&#160;</td>
237.2072 +          <td class="paramname"><em>dest</em>, </td>
237.2073 +        </tr>
237.2074 +        <tr>
237.2075 +          <td class="paramkey"></td>
237.2076 +          <td></td>
237.2077 +          <td class="paramtype"><a class="el" href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">read_func</a>&#160;</td>
237.2078 +          <td class="paramname"><em>rfnc</em>, </td>
237.2079 +        </tr>
237.2080 +        <tr>
237.2081 +          <td class="paramkey"></td>
237.2082 +          <td></td>
237.2083 +          <td class="paramtype"><a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a>&#160;</td>
237.2084 +          <td class="paramname"><em>wfnc</em>, </td>
237.2085 +        </tr>
237.2086 +        <tr>
237.2087 +          <td class="paramkey"></td>
237.2088 +          <td></td>
237.2089 +          <td class="paramtype">char *&#160;</td>
237.2090 +          <td class="paramname"><em>buf</em>, </td>
237.2091 +        </tr>
237.2092 +        <tr>
237.2093 +          <td class="paramkey"></td>
237.2094 +          <td></td>
237.2095 +          <td class="paramtype">size_t&#160;</td>
237.2096 +          <td class="paramname"><em>bufsize</em>, </td>
237.2097 +        </tr>
237.2098 +        <tr>
237.2099 +          <td class="paramkey"></td>
237.2100 +          <td></td>
237.2101 +          <td class="paramtype">size_t&#160;</td>
237.2102 +          <td class="paramname"><em>n</em>&#160;</td>
237.2103 +        </tr>
237.2104 +        <tr>
237.2105 +          <td></td>
237.2106 +          <td>)</td>
237.2107 +          <td></td><td></td>
237.2108 +        </tr>
237.2109 +      </table>
237.2110 +</div><div class="memdoc">
237.2111 +
237.2112 +<p>Reads data from a stream and writes it to another stream. </p>
237.2113 +<dl class="params"><dt>Parameters</dt><dd>
237.2114 +  <table class="params">
237.2115 +    <tr><td class="paramname">src</td><td>the source stream </td></tr>
237.2116 +    <tr><td class="paramname">dest</td><td>the destination stream </td></tr>
237.2117 +    <tr><td class="paramname">rfnc</td><td>the read function </td></tr>
237.2118 +    <tr><td class="paramname">wfnc</td><td>the write function </td></tr>
237.2119 +    <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>
237.2120 +    <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>
237.2121 +    <tr><td class="paramname">n</td><td>the maximum number of bytes that shall be copied </td></tr>
237.2122 +  </table>
237.2123 +  </dd>
237.2124 +</dl>
237.2125 +<dl class="section return"><dt>Returns</dt><dd>the total number of bytes copied </dd></dl>
237.2126 +
237.2127 +</div>
237.2128 +</div>
237.2129 +<a id="a3ea1dfb856c741f3e8ec6bfdc9ad427e"></a>
237.2130 +<h2 class="memtitle"><span class="permalink"><a href="#a3ea1dfb856c741f3e8ec6bfdc9ad427e">&#9670;&nbsp;</a></span>ucx_vasprintf()</h2>
237.2131 +
237.2132 +<div class="memitem">
237.2133 +<div class="memproto">
237.2134 +      <table class="memname">
237.2135 +        <tr>
237.2136 +          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> ucx_vasprintf </td>
237.2137 +          <td>(</td>
237.2138 +          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
237.2139 +          <td class="paramname"><em>allocator</em>, </td>
237.2140 +        </tr>
237.2141 +        <tr>
237.2142 +          <td class="paramkey"></td>
237.2143 +          <td></td>
237.2144 +          <td class="paramtype">const char *&#160;</td>
237.2145 +          <td class="paramname"><em>fmt</em>, </td>
237.2146 +        </tr>
237.2147 +        <tr>
237.2148 +          <td class="paramkey"></td>
237.2149 +          <td></td>
237.2150 +          <td class="paramtype">va_list&#160;</td>
237.2151 +          <td class="paramname"><em>ap</em>&#160;</td>
237.2152 +        </tr>
237.2153 +        <tr>
237.2154 +          <td></td>
237.2155 +          <td>)</td>
237.2156 +          <td></td><td></td>
237.2157 +        </tr>
237.2158 +      </table>
237.2159 +</div><div class="memdoc">
237.2160 +
237.2161 +<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>
237.2162 +<dl class="params"><dt>Parameters</dt><dd>
237.2163 +  <table class="params">
237.2164 +    <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>
237.2165 +    <tr><td class="paramname">fmt</td><td>format string </td></tr>
237.2166 +    <tr><td class="paramname">ap</td><td>argument list </td></tr>
237.2167 +  </table>
237.2168 +  </dd>
237.2169 +</dl>
237.2170 +<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>
237.2171 +<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>
237.2172 +
237.2173 +</div>
237.2174 +</div>
237.2175 +<a id="a4907967beb92c3ae351dd239abbb6927"></a>
237.2176 +<h2 class="memtitle"><span class="permalink"><a href="#a4907967beb92c3ae351dd239abbb6927">&#9670;&nbsp;</a></span>ucx_vfprintf()</h2>
237.2177 +
237.2178 +<div class="memitem">
237.2179 +<div class="memproto">
237.2180 +      <table class="memname">
237.2181 +        <tr>
237.2182 +          <td class="memname">int ucx_vfprintf </td>
237.2183 +          <td>(</td>
237.2184 +          <td class="paramtype">void *&#160;</td>
237.2185 +          <td class="paramname"><em>stream</em>, </td>
237.2186 +        </tr>
237.2187 +        <tr>
237.2188 +          <td class="paramkey"></td>
237.2189 +          <td></td>
237.2190 +          <td class="paramtype"><a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a>&#160;</td>
237.2191 +          <td class="paramname"><em>wfc</em>, </td>
237.2192 +        </tr>
237.2193 +        <tr>
237.2194 +          <td class="paramkey"></td>
237.2195 +          <td></td>
237.2196 +          <td class="paramtype">const char *&#160;</td>
237.2197 +          <td class="paramname"><em>fmt</em>, </td>
237.2198 +        </tr>
237.2199 +        <tr>
237.2200 +          <td class="paramkey"></td>
237.2201 +          <td></td>
237.2202 +          <td class="paramtype">va_list&#160;</td>
237.2203 +          <td class="paramname"><em>ap</em>&#160;</td>
237.2204 +        </tr>
237.2205 +        <tr>
237.2206 +          <td></td>
237.2207 +          <td>)</td>
237.2208 +          <td></td><td></td>
237.2209 +        </tr>
237.2210 +      </table>
237.2211 +</div><div class="memdoc">
237.2212 +
237.2213 +<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>
237.2214 +<dl class="params"><dt>Parameters</dt><dd>
237.2215 +  <table class="params">
237.2216 +    <tr><td class="paramname">stream</td><td>the stream the data is written to </td></tr>
237.2217 +    <tr><td class="paramname">wfc</td><td>the write function </td></tr>
237.2218 +    <tr><td class="paramname">fmt</td><td>format string </td></tr>
237.2219 +    <tr><td class="paramname">ap</td><td>argument list </td></tr>
237.2220 +  </table>
237.2221 +  </dd>
237.2222 +</dl>
237.2223 +<dl class="section return"><dt>Returns</dt><dd>the total number of bytes written </dd></dl>
237.2224 +<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>
237.2225 +
237.2226 +</div>
237.2227 +</div>
237.2228 +</div><!-- contents -->
237.2229 +<!-- start footer part -->
237.2230 +<hr class="footer"/><address class="footer"><small>
237.2231 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
237.2232 +<img class="footer" src="doxygen.png" alt="doxygen"/>
237.2233 +</a> 1.8.13
237.2234 +</small></address>
237.2235 +</body>
237.2236 +</html>
   238.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   238.2 +++ b/docs/api-2.1/utils_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
   238.3 @@ -0,0 +1,124 @@
   238.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   238.5 +<html xmlns="http://www.w3.org/1999/xhtml">
   238.6 +<head>
   238.7 +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
   238.8 +<meta http-equiv="X-UA-Compatible" content="IE=9"/>
   238.9 +<meta name="generator" content="Doxygen 1.8.13"/>
  238.10 +<meta name="viewport" content="width=device-width, initial-scale=1"/>
  238.11 +<title>ucx: /home/mike/workspace/c/ucx/src/ucx/utils.h Source File</title>
  238.12 +<link href="tabs.css" rel="stylesheet" type="text/css"/>
  238.13 +<script type="text/javascript" src="jquery.js"></script>
  238.14 +<script type="text/javascript" src="dynsections.js"></script>
  238.15 +<link href="search/search.css" rel="stylesheet" type="text/css"/>
  238.16 +<script type="text/javascript" src="search/searchdata.js"></script>
  238.17 +<script type="text/javascript" src="search/search.js"></script>
  238.18 +<link href="doxygen.css" rel="stylesheet" type="text/css" />
  238.19 +</head>
  238.20 +<body>
  238.21 +<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  238.22 +<div id="titlearea">
  238.23 +<table cellspacing="0" cellpadding="0">
  238.24 + <tbody>
  238.25 + <tr style="height: 56px;">
  238.26 +  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
  238.27 +  <td id="projectalign" style="padding-left: 0.5em;">
  238.28 +   <div id="projectname">ucx
  238.29 +   </div>
  238.30 +   <div id="projectbrief">UAP Common Extensions</div>
  238.31 +  </td>
  238.32 + </tr>
  238.33 + </tbody>
  238.34 +</table>
  238.35 +</div>
  238.36 +<!-- end header part -->
  238.37 +<!-- Generated by Doxygen 1.8.13 -->
  238.38 +<script type="text/javascript">
  238.39 +var searchBox = new SearchBox("searchBox", "search",false,'Search');
  238.40 +</script>
  238.41 +<script type="text/javascript" src="menudata.js"></script>
  238.42 +<script type="text/javascript" src="menu.js"></script>
  238.43 +<script type="text/javascript">
  238.44 +$(function() {
  238.45 +  initMenu('',true,false,'search.php','Search');
  238.46 +  $(document).ready(function() { init_search(); });
  238.47 +});
  238.48 +</script>
  238.49 +<div id="main-nav"></div>
  238.50 +<!-- window showing the filter options -->
  238.51 +<div id="MSearchSelectWindow"
  238.52 +     onmouseover="return searchBox.OnSearchSelectShow()"
  238.53 +     onmouseout="return searchBox.OnSearchSelectHide()"
  238.54 +     onkeydown="return searchBox.OnSearchSelectKey(event)">
  238.55 +</div>
  238.56 +
  238.57 +<!-- iframe showing the search results (closed by default) -->
  238.58 +<div id="MSearchResultsWindow">
  238.59 +<iframe src="javascript:void(0)" frameborder="0" 
  238.60 +        name="MSearchResults" id="MSearchResults">
  238.61 +</iframe>
  238.62 +</div>
  238.63 +
  238.64 +<div id="nav-path" class="navpath">
  238.65 +  <ul>
  238.66 +<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>
  238.67 +</div>
  238.68 +</div><!-- top -->
  238.69 +<div class="header">
  238.70 +  <div class="headertitle">
  238.71 +<div class="title">utils.h</div>  </div>
  238.72 +</div><!--header-->
  238.73 +<div class="contents">
  238.74 +<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>
  238.75 +<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>
  238.76 +<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>
  238.77 +<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>
  238.78 +<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>
  238.79 +<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>
  238.80 +<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>
  238.81 +<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>
  238.82 +<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>
  238.83 +<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>
  238.84 +<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>
  238.85 +<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>
  238.86 +<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>
  238.87 +<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>
  238.88 +<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>
  238.89 +<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>
  238.90 +<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>
  238.91 +<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>
  238.92 +<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>
  238.93 +<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>
  238.94 +<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>
  238.95 +<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>
  238.96 +<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>
  238.97 +<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>
  238.98 +<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>
  238.99 +<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>
 238.100 +<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>
 238.101 +<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>
 238.102 +<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>
 238.103 +<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>
 238.104 +<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>
 238.105 +<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>
 238.106 +<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>
 238.107 +<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>
 238.108 +<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>
 238.109 +<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>
 238.110 +<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>
 238.111 +<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>
 238.112 +<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>
 238.113 +<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>
 238.114 +<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>
 238.115 +<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>
 238.116 +<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>
 238.117 +<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>
 238.118 +<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>
 238.119 +</div><!-- fragment --></div><!-- contents -->
 238.120 +<!-- start footer part -->
 238.121 +<hr class="footer"/><address class="footer"><small>
 238.122 +Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
 238.123 +<img class="footer" src="doxygen.png" alt="doxygen"/>
 238.124 +</a> 1.8.13
 238.125 +</small></address>
 238.126 +</body>
 238.127 +</html>
   239.1 --- a/docs/src/CMakeLists.txt	Mon Dec 30 09:54:10 2019 +0100
   239.2 +++ b/docs/src/CMakeLists.txt	Sat Feb 06 19:11:44 2021 +0100
   239.3 @@ -1,7 +1,7 @@
   239.4  #
   239.5  # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   239.6  #
   239.7 -# Copyright 2019 Mike Becker, Olaf Wintermann All rights reserved.
   239.8 +# Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
   239.9  #
  239.10  # Redistribution and use in source and binary forms, with or without
  239.11  # modification, are permitted provided that the following conditions are met:
  239.12 @@ -28,7 +28,7 @@
  239.13  
  239.14  set(PANDOC_DESTDIR ${CMAKE_BINARY_DIR}/docs/web)
  239.15  set(PANDOC_ARGS -c ucx.css -B header.html -A footer.html -T 'UAP Common Extensions')
  239.16 -set(PANDOC_SRC index.md license.md modules.md install.md)
  239.17 +set(PANDOC_SRC index.md license.md install.md)
  239.18  set(LOGO_PATH ../../uaplogo.png)
  239.19  
  239.20  if (NOT EXISTS ${PANDOC_EXECUTABLE})
  239.21 @@ -42,6 +42,7 @@
  239.22  message(STATUS "HTML Documentation will be generated at: ${PANDOC_DESTDIR}.")
  239.23  file(MAKE_DIRECTORY ${PANDOC_DESTDIR})
  239.24  
  239.25 +# UCX 3.0 documentation
  239.26  foreach(source_file ${PANDOC_SRC})
  239.27      string(REPLACE .md .html dest_file ${source_file})
  239.28      string(PREPEND dest_file "${PANDOC_DESTDIR}/")
  239.29 @@ -54,10 +55,20 @@
  239.30      )
  239.31  endforeach()
  239.32  
  239.33 +# UCX 2.1 documentation
  239.34 +add_custom_target(docs-html-21
  239.35 +        COMMAND ${PANDOC_EXECUTABLE} -c ucx.css -B header-ucx2.html -A footer.html
  239.36 +            -T 'UAP Common Extensions' -o ${PANDOC_DESTDIR}/modules-ucx2.html modules-ucx2.md
  239.37 +        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  239.38 +        DEPENDS modules-ucx2.md
  239.39 +        COMMENT "Adding UCX 2.1 HTML documentation."
  239.40 +)
  239.41 +
  239.42 +# Collect all HTML documentation
  239.43  add_custom_target(docs-html
  239.44          COMMAND ${CMAKE_COMMAND} -E copy ucx.css ${PANDOC_DESTDIR}/ucx.css
  239.45          COMMAND ${CMAKE_COMMAND} -E copy ${LOGO_PATH} ${PANDOC_DESTDIR}/uaplogo.png
  239.46 -        DEPENDS ${PANDOC_DEST}
  239.47 +        DEPENDS ${PANDOC_DEST} docs-html-21
  239.48          WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  239.49          COMMENT "Generating HTML documentation with pandoc."
  239.50  )
   240.1 --- a/docs/src/Makefile	Mon Dec 30 09:54:10 2019 +0100
   240.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   240.3 @@ -1,66 +0,0 @@
   240.4 -#
   240.5 -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   240.6 -#
   240.7 -# Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   240.8 -#
   240.9 -# Redistribution and use in source and binary forms, with or without
  240.10 -# modification, are permitted provided that the following conditions are met:
  240.11 -#
  240.12 -#   1. Redistributions of source code must retain the above copyright
  240.13 -#      notice, this list of conditions and the following disclaimer.
  240.14 -#
  240.15 -#   2. Redistributions in binary form must reproduce the above copyright
  240.16 -#      notice, this list of conditions and the following disclaimer in the
  240.17 -#      documentation and/or other materials provided with the distribution.
  240.18 -#
  240.19 -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  240.20 -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  240.21 -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  240.22 -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  240.23 -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  240.24 -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  240.25 -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  240.26 -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  240.27 -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  240.28 -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  240.29 -# POSSIBILITY OF SUCH DAMAGE.
  240.30 -#
  240.31 -
  240.32 -PD=pandoc
  240.33 -PFLAGS=-c ucx.css -B header.html -A footer.html -T 'UAP Common Extensions'
  240.34 -
  240.35 -SRC  = index.md
  240.36 -SRC += install.md
  240.37 -SRC += license.md
  240.38 -SRC += modules.md
  240.39 -
  240.40 -DEST = ../web
  240.41 -
  240.42 -PROJROOT = ../..
  240.43 -LOGO = uaplogo.png
  240.44 -
  240.45 -HTML = $(SRC:%.md=$(DEST)/%.html)
  240.46 -
  240.47 -all:  html api
  240.48 -	
  240.49 -
  240.50 -html: $(DEST) $(DEST)/ucx.css $(DEST)/$(LOGO) $(HTML)
  240.51 -	
  240.52 -
  240.53 -api: $(DEST)
  240.54 -	cd $(PROJROOT); doxygen
  240.55 -
  240.56 -$(DEST):
  240.57 -	mkdir -p $@
  240.58 -
  240.59 -$(DEST)/%.html: %.md
  240.60 -	$(PD) $(PFLAGS) $< -o $@
  240.61 -
  240.62 -$(DEST)/ucx.css: ucx.css
  240.63 -	cp $< $@
  240.64 -	
  240.65 -$(DEST)/$(LOGO): $(PROJROOT)/$(LOGO)
  240.66 -	cp $< $@
  240.67 -
  240.68 -clean:
  240.69 -	rm -Rf $(DEST) 
   241.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   241.2 +++ b/docs/src/header-ucx2.html	Sat Feb 06 19:11:44 2021 +0100
   241.3 @@ -0,0 +1,58 @@
   241.4 +        <!-- begin header -->
   241.5 +        <div id="page-header">
   241.6 +            <span>UAP Common Extensions</span>
   241.7 +            <img src="uaplogo.png" alt="UAP Core">
   241.8 +        </div>
   241.9 +        <!-- end header -->
  241.10 +
  241.11 +        <!-- begin navigation -->
  241.12 +        <div id="sidebar">
  241.13 +            <div class="nav">
  241.14 +                <h3>Getting Started</h3>
  241.15 +                <ul>
  241.16 +                    <li><a href="index.html">Overview</a></li>
  241.17 +                    <li><a href="install.html">Build Instructions</a></li>
  241.18 +                    <li><a href="license.html">License</a></li>
  241.19 +                </ul>
  241.20 +            </div>
  241.21 +            <div class="nav">
  241.22 +                <h3>Documentation</h3>
  241.23 +                <ul>
  241.24 +                    <li><a href="modules.html">Modules</a>
  241.25 +                    <ul>
  241.26 +                        <li><a href="modules.html#allocator">Allocator</a></li>
  241.27 +                        <li><a href="modules.html#array">Array</a></li>
  241.28 +                        <li><a href="modules.html#avl-tree">AVL Tree</a></li>
  241.29 +                        <li><a href="modules.html#buffer">Buffer</a></li>
  241.30 +                        <li><a href="modules.html#list">List</a></li>
  241.31 +                        <li><a href="modules.html#logging">Logging</a></li>
  241.32 +                        <li><a href="modules.html#map">Map</a></li>
  241.33 +                        <li><a href="modules.html#memory-pool">Memory Pool</a></li>
  241.34 +                        <li><a href="modules.html#properties">Properties</a></li>
  241.35 +                        <li><a href="modules.html#stack">Stack</a></li>
  241.36 +                        <li><a href="modules.html#string">String</a></li>
  241.37 +                        <li><a href="modules.html#testing">Testing</a></li>
  241.38 +                        <li><a href="modules.html#utilities">Utilities</a></li>
  241.39 +                    </ul>
  241.40 +                    </li>
  241.41 +                    <li><a target="_blank" href="api-2.1/index.html">API Reference</a></li>
  241.42 +                </ul>
  241.43 +            </div>
  241.44 +            <div class="nav">
  241.45 +                <h3>Repositories</h3>
  241.46 +                <ul>
  241.47 +                    <li><a target="_blank" href="https://develop.uap-core.de/hg/ucx/">UAP Core Repository</a></li>
  241.48 +                    <li><a target="_blank" href="https://sourceforge.net/p/ucx/">Source Forge</a></li>
  241.49 +                </ul>
  241.50 +            </div>
  241.51 +            <div class="nav">
  241.52 +                <h3>Partners</h3>
  241.53 +                <ul>
  241.54 +                    <li><a target="_blank" href="https://www.unixwork.de">UNIXwork</a></li>
  241.55 +                </ul>
  241.56 +            </div>
  241.57 +        </div>
  241.58 +        <!-- end navigation -->
  241.59 +
  241.60 +        <!-- begin content -->
  241.61 +        <div id="content">
  241.62 \ No newline at end of file
   242.1 --- a/docs/src/header.html	Mon Dec 30 09:54:10 2019 +0100
   242.2 +++ b/docs/src/header.html	Sat Feb 06 19:11:44 2021 +0100
   242.3 @@ -18,24 +18,9 @@
   242.4              <div class="nav">
   242.5                  <h3>Documentation</h3>
   242.6                  <ul>
   242.7 -                    <li><a href="modules.html">Modules</a>
   242.8 -                    <ul>
   242.9 -                        <li><a href="modules.html#allocator">Allocator</a></li>
  242.10 -                        <li><a href="modules.html#array">Array</a></li>
  242.11 -                        <li><a href="modules.html#avl-tree">AVL Tree</a></li>
  242.12 -                        <li><a href="modules.html#buffer">Buffer</a></li>
  242.13 -                        <li><a href="modules.html#list">List</a></li>
  242.14 -                        <li><a href="modules.html#logging">Logging</a></li>
  242.15 -                        <li><a href="modules.html#map">Map</a></li>
  242.16 -                        <li><a href="modules.html#memory-pool">Memory Pool</a></li>
  242.17 -                        <li><a href="modules.html#properties">Properties</a></li>
  242.18 -                        <li><a href="modules.html#stack">Stack</a></li>
  242.19 -                        <li><a href="modules.html#string">String</a></li>
  242.20 -                        <li><a href="modules.html#testing">Testing</a></li>
  242.21 -                        <li><a href="modules.html#utilities">Utilities</a></li>
  242.22 -                    </ul>
  242.23 -                    </li>
  242.24 +                    <li>Under construction...</li>
  242.25                      <li><a target="_blank" href="api/index.html">API Reference</a></li>
  242.26 +                    <li><a href="modules-ucx2.html">UCX 2.1</a>
  242.27                  </ul>
  242.28              </div>
  242.29              <div class="nav">
   243.1 --- a/docs/src/index.md	Mon Dec 30 09:54:10 2019 +0100
   243.2 +++ b/docs/src/index.md	Sat Feb 06 19:11:44 2021 +0100
   243.3 @@ -29,6 +29,10 @@
   243.4  Changelog
   243.5  ---------
   243.6  
   243.7 +### Version 3.0
   243.8 +
   243.9 + * under construction...
  243.10 +
  243.11  ### Version 2.1 - 2019-12-30
  243.12   
  243.13   * adds string replace functions
   244.1 --- a/docs/src/install.md	Mon Dec 30 09:54:10 2019 +0100
   244.2 +++ b/docs/src/install.md	Sat Feb 06 19:11:44 2021 +0100
   244.3 @@ -2,14 +2,32 @@
   244.4  title: Build Instructions
   244.5  ---
   244.6  
   244.7 -The install procedure is the same on all supported platforms.
   244.8 -For Microsoft Windows, however, you will need an appropriate port of the linux
   244.9 -tools (like MinGW or Cygwin).
  244.10 +The build processes uses CMake starting with UCX 3.0.
  244.11  First, download the source code from [Source Forge][1].
  244.12  
  244.13      wget https://sourceforge.net/projects/ucx/files/ucx-latest.tar.gz
  244.14      tar -xzf ucx-latest.tar.gz
  244.15      cd ucx-latest
  244.16 +    
  244.17 +Then create a build directory and issue the cmake command and then make.
  244.18 +
  244.19 +    mkdir build
  244.20 +    cd build
  244.21 +    cmake ..
  244.22 +    make
  244.23 +
  244.24 +---
  244.25 +
  244.26 +### UCX 2.1
  244.27 +
  244.28 +The build procedure for UCX 2.1 uses a configure script.
  244.29 +For Microsoft Windows, you will need an appropriate port of the linux
  244.30 +tools (like MinGW or Cygwin).
  244.31 +First, download the source code from [Source Forge][1].
  244.32 +
  244.33 +    wget https://sourceforge.net/projects/ucx/files/ucx-2.1.0.tar.gz
  244.34 +    tar -xzf ucx-2.1.0.tar.gz
  244.35 +    cd ucx-2.1.0
  244.36  
  244.37  Then issue the `configure` and `make` commands.
  244.38  
   245.1 --- a/docs/src/license.md	Mon Dec 30 09:54:10 2019 +0100
   245.2 +++ b/docs/src/license.md	Sat Feb 06 19:11:44 2021 +0100
   245.3 @@ -2,7 +2,7 @@
   245.4  title: License
   245.5  ---
   245.6  
   245.7 -Copyright 2017 Mike Becker, Olaf Wintermann. All rights reserved.
   245.8 +Copyright 2021 Mike Becker, Olaf Wintermann. All rights reserved.
   245.9  
  245.10  Redistribution and use in source and binary forms, with or without
  245.11  modification, are permitted provided that the following conditions are met:
   246.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   246.2 +++ b/docs/src/modules-ucx2.md	Sat Feb 06 19:11:44 2021 +0100
   246.3 @@ -0,0 +1,873 @@
   246.4 +---
   246.5 +title: UCX 2.1 Modules
   246.6 +---
   246.7 +
   246.8 +UCX 2.1 provided several modules for data structures and algorithms.
   246.9 +You may choose to use specific modules by inclueding the corresponding header
  246.10 +file.
  246.11 +Please note, that some modules make use of other UCX 2.1 modules.
  246.12 +For instance, the [Allocator](#allocator) module is used by many other modules
  246.13 +to allow flexible memory allocation.
  246.14 +By default the header files are placed into an `ucx` directory within your
  246.15 +systems include directory. In this case you can use a module by including it
  246.16 +via `#include <ucx/MODULENAME.h>`.
  246.17 +Required modules are included automatically.
  246.18 +
  246.19 +<div id="modules" align="center">
  246.20 +    
  246.21 +----------------------- ----------------------  --------------------------------  ---------------------------
  246.22 +[String](#string)       [Buffer](#buffer)
  246.23 +[Allocator](#allocator) [Stack](#stack)         [Memory&nbsp;Pool](#memory-pool)     
  246.24 +[Array](#array)         [List](#list)           [Map](#map)                       [AVL&nbsp;Tree](#avl-tree)
  246.25 +[Logging](#logging)     [Testing](#testing)     [Utilities](#utilities)           [Properties](#properties)                         
  246.26 +----------------------- ----------------------  --------------------------------  ---------------------------
  246.27 +
  246.28 +</div>
  246.29 +
  246.30 +## Allocator
  246.31 +
  246.32 +*Header file:* [allocator.h](api-2.1/allocator_8h.html)  
  246.33 +*Required modules:* None.
  246.34 +
  246.35 +A UCX allocator consists of a pointer to the memory area / pool and four
  246.36 +function pointers to memory management functions operating on this memory
  246.37 +area / pool. These functions shall behave equivalent to the standard libc
  246.38 +functions `malloc`, `calloc`, `realloc` and `free`.
  246.39 +
  246.40 +The signature of the memory management functions is based on the signature
  246.41 +of the respective libc function but each of them takes the pointer to the
  246.42 +memory area / pool as first argument.
  246.43 +
  246.44 +As the pointer to the memory area / pool can be arbitrarily chosen, any data
  246.45 +can be provided to the memory management functions. One example is the
  246.46 +[UCX Memory Pool](#memory-pool).
  246.47 +
  246.48 +## Array
  246.49 +
  246.50 +*Header file:* [array.h](api-2.1/array_8h.html)  
  246.51 +*Required modules:* [Allocator](#allocator)
  246.52 +
  246.53 +The UCX Array is an implementation of a dynamic array with automatic
  246.54 +reallocation. The array structure contains a capacity, the current size,
  246.55 +the size of each element, the raw pointer to the memory area and an allocator.
  246.56 +Arrays are in most cases much faster than linked list.
  246.57 +One can decide, whether to create a new array on the heap with `ucx_array_new()`
  246.58 +or to save one indirection by initializing a `UcxArray` structure on the stack
  246.59 +with `ucx_array_init()`.
  246.60 +
  246.61 +### Remove duplicates from an array of strings
  246.62 +
  246.63 +The following example shows, how a `UcxArray` can be built with
  246.64 +a standard dynamic C array (pointer+length) as basis.
  246.65 +
  246.66 +```C
  246.67 +UcxArray* create_unique(sstr_t* array, size_t arrlen) {
  246.68 +    // worst case is no duplicates, hence the capacity is set to arrlen
  246.69 +    UcxArray* result = ucx_array_new(arrlen, sizeof(sstr_t));
  246.70 +    // only append elements, if they are not already present in the array
  246.71 +    for (size_t i = 0 ; i < arrlen ; ++i) {
  246.72 +        if (!ucx_array_contains(result, array+i, ucx_cmp_sstr, NULL)) {
  246.73 +            ucx_array_append_from(result, array+i, 1);
  246.74 +        }
  246.75 +    }
  246.76 +    // make the array as small as possible
  246.77 +    ucx_array_shrink(result);
  246.78 +    return result;
  246.79 +}
  246.80 +
  246.81 +/* ... */
  246.82 +
  246.83 +sstr_t* array = /* some standard array of strings */
  246.84 +size_t arrlen = /* the length of the array */
  246.85 +
  246.86 +UcxArray* result = create_unique(array,arrlen);
  246.87 +
  246.88 +/* Iterate over the array and print the elements */
  246.89 +sstr_t* unique = result->data;
  246.90 +for (size_t i = 0 ; i < result->size ; i++) {
  246.91 +    printf("%" PRIsstr "\n", SFMT(unique[i]));
  246.92 +}
  246.93 +
  246.94 +/* Free the array. */
  246.95 +ucx_array_free(result);
  246.96 +```
  246.97 +### Preventing out of bounds writes
  246.98 +
  246.99 +The functions `ucx_array_reserve()`, `ucx_array_resize()`, `ucx_array_grow()`,
 246.100 +and `ucx_array_shrink()` allow easy management of the array capacity.
 246.101 +Imagine you want to add `n` elements to an array. If your `n` elements are
 246.102 +already somewhere else consecutively in memory, you can use
 246.103 +`ucx_array_append_from()` and benefit from the autogrow facility in this family
 246.104 +of functions. Otherwise, you can ask the array to have enough capacity for
 246.105 +holding additional `n` elements.
 246.106 +
 246.107 +```C
 246.108 +size_t n = // ... elements to add
 246.109 +if (ucx_array_grow(array, n)) {
 246.110 +   fprintf(stderr, "Cannot add %zu elements to the array.\n", n);
 246.111 +   return 1;
 246.112 +}
 246.113 +for (size_t i = 0 ; i < n ; i++) {
 246.114 +    ((int*)array->data)[array->size++] = 80;
 246.115 +}
 246.116 +```
 246.117 +
 246.118 +## AVL Tree
 246.119 +
 246.120 +*Header file:* [avl.h](api-2.1/avl_8h.html)  
 246.121 +*Required modules:* [Allocator](#allocator)
 246.122 +
 246.123 +This binary search tree implementation allows average O(1) insertion and
 246.124 +removal of elements (excluding binary search time).
 246.125 +All common binary tree operations are implemented. Furthermore, this module
 246.126 +provides search functions via lower and upper bounds.
 246.127 +
 246.128 +### Filtering items with a time window
 246.129 +
 246.130 +Suppose you have a list of items which contain a `time_t` value and your task
 246.131 +is to find all items within a time window `[t_start, t_end]`.
 246.132 +With AVL Trees this is easy:
 246.133 +```C
 246.134 +/* ---------------------
 246.135 + * Somewhere in a header
 246.136 + */
 246.137 +typedef struct {
 246.138 +    time_t ts;
 246.139 +    /* other important data */
 246.140 +} MyObject;
 246.141 +
 246.142 +/* -----------
 246.143 + * Source code
 246.144 + */
 246.145 +
 246.146 +UcxAVLTree* tree = ucx_avl_new(ucx_cmp_longint);
 246.147 +/* ... populate tree with objects, use '& MyObject.ts' as key ... */
 246.148 +
 246.149 +
 246.150 +/* Now find every item, with 30 <= ts <= 70 */
 246.151 +time_t ts_start = 30;
 246.152 +time_t ts_end = 70;
 246.153 +
 246.154 +printf("Values in range:\n");
 246.155 +for (
 246.156 +        UcxAVLNode* node = ucx_avl_find_node(
 246.157 +            tree, (intptr_t) &ts_start,
 246.158 +            ucx_dist_longint, UCX_AVL_FIND_LOWER_BOUNDED);
 246.159 +        node && (*(time_t*)node->key) <= ts_end;
 246.160 +        node = ucx_avl_succ(node)
 246.161 +    ) {
 246.162 +    printf(" ts: %ld\n", ((MyObject*)node->value)->ts);
 246.163 +}
 246.164 +
 246.165 +ucx_avl_free_content(tree, free);
 246.166 +ucx_avl_free(tree);
 246.167 +```
 246.168 +
 246.169 +## Buffer
 246.170 +
 246.171 +*Header file:* [buffer.h](api-2.1/buffer_8h.html)  
 246.172 +*Required modules:* None.
 246.173 +
 246.174 +Instances of this buffer implementation can be used to read from or to write to
 246.175 +memory like you would do with a stream. This allows the use of
 246.176 +`ucx_stream_copy()` from the [Utilities](#utilities) module to copy contents
 246.177 +from one buffer to another or from file or network streams to the buffer and
 246.178 +vice-versa.
 246.179 +
 246.180 +More features for convenient use of the buffer can be enabled, like automatic
 246.181 +memory management and automatic resizing of the buffer space.
 246.182 +See the documentation of the macro constants in the header file for more
 246.183 +information.
 246.184 +
 246.185 +### Add line numbers to a file
 246.186 +
 246.187 +When reading a file line by line, you have three options: first, you could limit
 246.188 +the maximum supported line length.
 246.189 +Second, you allocate a god buffer large
 246.190 +enough for the most lines a text file could have.
 246.191 +And third, undoubtedly the best option, you start with a small buffer, which
 246.192 +adjusts on demand.
 246.193 +An `UcxBuffer` can be created to do just that for you.
 246.194 +Just pass the `UCX_BUFFER_AUTOEXTEND` option to the initialization function.
 246.195 +Here is a full working program, which adds line numbers to a file.
 246.196 +```C
 246.197 +#include <stdio.h>
 246.198 +#include <ucx/buffer.h>
 246.199 +#include <ucx/utils.h>
 246.200 +
 246.201 +int main(int argc, char** argv) {
 246.202 +
 246.203 +    if (argc != 2) {
 246.204 +        fprintf(stderr, "Usage: %s <file>\n", argv[0]);
 246.205 +        return 1;
 246.206 +    }
 246.207 +
 246.208 +    FILE* input = fopen(argv[1], "r");
 246.209 +    if (!input) {
 246.210 +        perror("Canno read input");
 246.211 +        return 1;
 246.212 +    }
 246.213 +
 246.214 +    const size_t chunksize = 256;
 246.215 +
 246.216 +    UcxBuffer* linebuf =
 246.217 +        ucx_buffer_new(
 246.218 +            NULL,       /* the buffer should manage the memory area for us */
 246.219 +            2*chunksize,  /* initial size should be twice the chunk size */
 246.220 +            UCX_BUFFER_AUTOEXTEND); /* the buffer will grow when necessary */
 246.221 +
 246.222 +    size_t lineno = 1;
 246.223 +    do {
 246.224 +        /* read line chunk */
 246.225 +        size_t read = ucx_stream_ncopy(
 246.226 +                input, linebuf, fread, ucx_buffer_write, chunksize);
 246.227 +        if (read == 0) break;
 246.228 +        
 246.229 +        /* handle line endings */
 246.230 +        do {
 246.231 +            sstr_t bufstr = ucx_buffer_to_sstr(linebuf);
 246.232 +            sstr_t nl = sstrchr(bufstr, '\n');
 246.233 +            if (nl.length == 0) break;
 246.234 +
 246.235 +            size_t linelen = bufstr.length - nl.length;
 246.236 +            sstr_t linestr = sstrsubsl(bufstr, 0, linelen);
 246.237 +
 246.238 +            printf("%zu: %" PRIsstr "\n", lineno++, SFMT(linestr));
 246.239 +
 246.240 +            /* shift the buffer to the next line */
 246.241 +            ucx_buffer_shift_left(linebuf, linelen+1);
 246.242 +        } while(1);
 246.243 +
 246.244 +    } while(1);
 246.245 +
 246.246 +    /* print the 'noeol' line, if any */
 246.247 +    sstr_t lastline = ucx_buffer_to_sstr(linebuf);
 246.248 +    if (lastline.length > 0) {
 246.249 +        printf("%zu: %" PRIsstr, lineno, SFMT(lastline));
 246.250 +    }
 246.251 +
 246.252 +    fclose(input);
 246.253 +    ucx_buffer_free(linebuf);
 246.254 +
 246.255 +    return 0;
 246.256 +}
 246.257 +```
 246.258 +
 246.259 +## List
 246.260 +
 246.261 +*Header file:* [list.h](api-2.1/list_8h.html)  
 246.262 +*Required modules:* [Allocator](#allocator)
 246.263 +
 246.264 +This module provides the data structure and several functions for a doubly
 246.265 +linked list. Among the common operations like insert, remove, search and sort,
 246.266 +we allow convenient iteration via a special `UCX_FOREACH` macro.
 246.267 +
 246.268 +### Remove duplicates from an array of strings
 246.269 +
 246.270 +Assume you are given an array of `sstr_t` and want to create a list of these
 246.271 +strings without duplicates.
 246.272 +This is a similar example to the one [above](#array), but here we are
 246.273 +using a `UcxList`.
 246.274 +```C
 246.275 +#include <stdio.h>
 246.276 +#include <ucx/list.h>
 246.277 +#include <ucx/string.h>
 246.278 +#include <ucx/utils.h>
 246.279 +
 246.280 +UcxList* remove_duplicates(sstr_t* array, size_t arrlen) {
 246.281 +    UcxList* list = NULL;
 246.282 +    for (size_t i = 0 ; i < arrlen ; ++i) {
 246.283 +        if (ucx_list_find(list, array+i, ucx_cmp_sstr, NULL) == -1) {
 246.284 +            sstr_t* s = malloc(sizeof(sstr_t));
 246.285 +            *s = sstrdup(array[i]);
 246.286 +            list = ucx_list_append(list, s);
 246.287 +        }
 246.288 +    }
 246.289 +    return list;
 246.290 +}
 246.291 +
 246.292 +/* we will need this function to clean up the list contents later */
 246.293 +void free_sstr(void* ptr) {
 246.294 +    sstr_t* s = ptr;
 246.295 +    free(s->ptr);
 246.296 +    free(s);
 246.297 +}
 246.298 +
 246.299 +/* ... */
 246.300 +
 246.301 +sstr_t* array = /* some array of strings */
 246.302 +size_t arrlen = /* the length of the array */
 246.303 +
 246.304 +UcxList* list = remove_duplicates(array,arrlen);
 246.305 +
 246.306 +/* Iterate over the list and print the elements */
 246.307 +UCX_FOREACH(elem, list) {
 246.308 +    sstr_t s = *((sstr_t*)elem->data);
 246.309 +    printf("%" PRIsstr "\n", SFMT(s));
 246.310 +}
 246.311 +
 246.312 +/* Use our free function to free the duplicated strings. */
 246.313 +ucx_list_free_content(list, free_sstr);
 246.314 +ucx_list_free(list);
 246.315 +```
 246.316 +
 246.317 +## Logging
 246.318 +
 246.319 +*Header file:* [logging.h](api-2.1/logging_8h.html)  
 246.320 +*Required modules:* [Map](#map), [String](#string)
 246.321 +
 246.322 +The logging module comes with some predefined log levels and allows some more
 246.323 +customization. You may choose if you want to get timestamps or source file and
 246.324 +line number logged automatically when outputting a message.
 246.325 +The following function call initializes a debug logger with all of the above
 246.326 +information:
 246.327 +```C
 246.328 +    log = ucx_logger_new(stdout, UCX_LOGGER_DEBUG,
 246.329 +            UCX_LOGGER_LEVEL | UCX_LOGGER_TIMESTAMP | UCX_LOGGER_SOURCE);
 246.330 +```
 246.331 +Afterwards you can use this logger with the predefined macros
 246.332 +```C
 246.333 +    ucx_logger_trace(log, "Verbose output");
 246.334 +    ucx_logger_debug(log, "Debug message");
 246.335 +    ucx_logger_info(log, "Information");
 246.336 +    ucx_logger_warn(log, "Warning");
 246.337 +    ucx_logger_error(log, "Error message");
 246.338 +```
 246.339 +or you use
 246.340 +```C
 246.341 +    ucx_logger_log(log, CUSTOM_LEVEL, "Some message")
 246.342 +```
 246.343 +When you use your custom log level, don't forget to register it with
 246.344 +```C
 246.345 +    ucx_logger_register_level(log, CUSTOM_LEVEL, "CUSTOM")
 246.346 +```
 246.347 +where the last argument must be a string literal.
 246.348 +
 246.349 +## Map
 246.350 +
 246.351 +*Header file:* [map.h](api-2.1/map_8h.html)  
 246.352 +*Required modules:* [Allocator](#allocator), [String](#string)
 246.353 +
 246.354 +This module provides a hash map implementation using murmur hash 2 and separate
 246.355 +chaining with linked lists. Similarly to the list module, we provide a
 246.356 +`UCX_MAP_FOREACH` macro to conveniently iterate through the key/value pairs.
 246.357 +
 246.358 +### Parsing command line options
 246.359 +
 246.360 +Assume you want to parse command line options and record them within a map.
 246.361 +One way to do this is shown by the following code sample:
 246.362 +```C
 246.363 +    UcxMap* options = ucx_map_new(16);
 246.364 +    const char *NOARG = "";
 246.365 +    
 246.366 +    char *option = NULL;
 246.367 +    char optchar = 0;
 246.368 +    for(int i=1;i<argc;i++) {
 246.369 +        char *arg = argv[i];
 246.370 +        size_t len = strlen(arg);
 246.371 +        if(len > 1 && arg[0] == '-') {
 246.372 +            for(int c=1;c<len;c++) {
 246.373 +                if(option) {
 246.374 +                    fprintf(stderr,
 246.375 +                            "Missing argument for option -%c\n", optchar);
 246.376 +                    return 1;
 246.377 +                }
 246.378 +                switch(arg[c]) {
 246.379 +                    default: {
 246.380 +                        fprintf(stderr, "Unknown option -%c\n\n", arg[c]);
 246.381 +                        return 1;
 246.382 +                    }
 246.383 +                    case 'v': {
 246.384 +                        ucx_map_cstr_put(options, "verbose", NOARG);
 246.385 +                        break;
 246.386 +                    }
 246.387 +                    case 'o': {
 246.388 +                        option = "output";
 246.389 +                        optchar = 'o';
 246.390 +                        break;
 246.391 +                    }
 246.392 +                }
 246.393 +            }
 246.394 +        } else if(option) {
 246.395 +            ucx_map_cstr_put(options, option, arg);
 246.396 +            option = NULL;
 246.397 +        } else {
 246.398 +            /* ... handle argument that is not an option ... */
 246.399 +        }
 246.400 +    }
 246.401 +    if(option) {
 246.402 +        fprintf(stderr,
 246.403 +                "Missing argument for option -%c\n", optchar);
 246.404 +        return 1;
 246.405 +    }
 246.406 +```
 246.407 +With the following loop, you can access the previously recorded options:
 246.408 +```C
 246.409 +    UcxMapIterator iter = ucx_map_iterator(options);
 246.410 +    char *arg;
 246.411 +    UCX_MAP_FOREACH(optkey, arg, iter) {
 246.412 +        char* opt = optkey.data;
 246.413 +        if (*arg) {
 246.414 +            printf("%s = %s\n", opt, arg);
 246.415 +        } else {
 246.416 +            printf("%s active\n", opt);
 246.417 +        }
 246.418 +    }
 246.419 +```
 246.420 +Don't forget to call `ucx_map_free()`, when you are done with the map.
 246.421 +
 246.422 +## Memory Pool
 246.423 +
 246.424 +*Header file:* [mempool.h](api-2.1/mempool_8h.html)  
 246.425 +*Required modules:* [Allocator](#allocator)
 246.426 +
 246.427 +Here we have a concrete allocator implementation in the sense of a memory pool.
 246.428 +This pool allows you to register destructor functions for the allocated memory,
 246.429 +which are automatically called on the destruction of the pool.
 246.430 +But you may also register *independent* destructor functions within a pool in
 246.431 +case some external library allocated memory for you, which should be
 246.432 +destroyed together with this pool.
 246.433 +
 246.434 +Many UCX modules support the use of an allocator.
 246.435 +The [String Module](#string), for instance, provides the `sstrdup_a()` function,
 246.436 +which uses the specified allocator to allocate the memory for the duplicated
 246.437 +string.
 246.438 +This way, you can use a `UcxMempool` to keep track of the memory occupied by
 246.439 +duplicated strings and cleanup everything with just a single call to
 246.440 +`ucx_mempool_destroy()`.
 246.441 +
 246.442 +### Read CSV data into a structure
 246.443 +
 246.444 +The following code example shows some of the basic memory pool functions and
 246.445 +how they can be used with other UCX modules.
 246.446 +```C
 246.447 +#include <stdio.h>
 246.448 +#include <ucx/mempool.h>
 246.449 +#include <ucx/list.h>
 246.450 +#include <ucx/string.h>
 246.451 +#include <ucx/buffer.h>
 246.452 +#include <ucx/utils.h>
 246.453 +
 246.454 +typedef struct {
 246.455 +    sstr_t column_a;
 246.456 +    sstr_t column_b;
 246.457 +    sstr_t column_c;
 246.458 +} CSVData;
 246.459 +
 246.460 +int main(int argc, char** argv) {
 246.461 +
 246.462 +    UcxMempool* pool = ucx_mempool_new(128);
 246.463 +
 246.464 +    FILE *f = fopen("test.csv", "r");
 246.465 +    if (!f) {
 246.466 +        perror("Cannot open file");
 246.467 +        return 1;
 246.468 +    }
 246.469 +    /* close the file automatically at pool destruction*/
 246.470 +    ucx_mempool_reg_destr(pool, f, (ucx_destructor) fclose);
 246.471 +
 246.472 +    /* create a buffer and register it at the memory pool for destruction */
 246.473 +    UcxBuffer* content = ucx_buffer_new(NULL, 256, UCX_BUFFER_AUTOEXTEND);
 246.474 +    ucx_mempool_reg_destr(pool, content, (ucx_destructor) ucx_buffer_free);
 246.475 +
 246.476 +    /* read the file and split it by lines first */
 246.477 +    ucx_stream_copy(f, content, fread, ucx_buffer_write);
 246.478 +    sstr_t contentstr = ucx_buffer_to_sstr(content);
 246.479 +    ssize_t lc = 0;
 246.480 +    sstr_t* lines = sstrsplit_a(pool->allocator, contentstr, S("\n"), &lc);
 246.481 +
 246.482 +    /* skip the header and parse the remaining data */
 246.483 +    UcxList* datalist = NULL;
 246.484 +    for (size_t i = 1 ; i < lc ; i++) {
 246.485 +        if (lines[i].length == 0) continue;
 246.486 +        ssize_t fc = 3;
 246.487 +        sstr_t* fields = sstrsplit_a(pool->allocator, lines[i], S(";"), &fc);
 246.488 +        if (fc != 3) {
 246.489 +            fprintf(stderr, "Syntax error in line %zu.\n", i);
 246.490 +            ucx_mempool_destroy(pool);
 246.491 +            return 1;
 246.492 +        }
 246.493 +        CSVData* data = ucx_mempool_malloc(pool, sizeof(CSVData));
 246.494 +        data->column_a = fields[0];
 246.495 +        data->column_b = fields[1];
 246.496 +        data->column_c = fields[2];
 246.497 +        datalist = ucx_list_append_a(pool->allocator, datalist, data);
 246.498 +    }
 246.499 +
 246.500 +    /* control output */
 246.501 +    UCX_FOREACH(elem, datalist) {
 246.502 +        CSVData* data = elem->data;
 246.503 +        printf("Column A: %" PRIsstr " | "
 246.504 +               "Column B: %" PRIsstr " | "
 246.505 +               "Column C: %" PRIsstr "\n",
 246.506 +               SFMT(data->column_a), SFMT(data->column_b), SFMT(data->column_c)
 246.507 +        );
 246.508 +    }
 246.509 +
 246.510 +    /* cleanup everything, no manual free() needed */
 246.511 +    ucx_mempool_destroy(pool);
 246.512 +
 246.513 +    return 0;
 246.514 +} 
 246.515 +```
 246.516 +
 246.517 +### Overriding the default destructor
 246.518 +
 246.519 +Sometimes you need to allocate memory with `ucx_mempool_malloc()`, but the
 246.520 +memory is not supposed to be freed with a simple call to `free()`.
 246.521 +In this case, you can overwrite the default destructor as follows:
 246.522 +```C
 246.523 +    MyObject* obj = ucx_mempool_malloc(pool, sizeof(MyObject));
 246.524 +
 246.525 +    /* some special initialization with own resource management */
 246.526 +    my_object_init(obj);
 246.527 +
 246.528 +    /* register destructor function */
 246.529 +    ucx_mempool_set_destr(obj, (ucx_destructor) my_object_destroy);
 246.530 +```
 246.531 +Be aware, that your destructor function should not free any memory, that is
 246.532 +also managed by the pool.
 246.533 +Otherwise you might be risking a double-free.
 246.534 +More precisely, a destructor function set with `ucx_mempool_set_destr()` MUST
 246.535 +NOT call `free()` on the specified pointer whereas a desructor function
 246.536 +registered with `ucx_mempool_reg_destr()` MAY (and in most cases will) call
 246.537 +`free()`.
 246.538 +
 246.539 +## Properties
 246.540 +
 246.541 +*Header file:* [properties.h](api-2.1/properties_8h.html)  
 246.542 +*Required modules:* [Map](#map)
 246.543 +
 246.544 +This module provides load and store function for `*.properties` files.
 246.545 +The key/value pairs are stored within an UCX Map.
 246.546 +
 246.547 +### Example: Loading properties from a file
 246.548 +
 246.549 +```C
 246.550 +/* Open the file as usual */
 246.551 +FILE* file = fopen("myprops.properties", "r");
 246.552 +if (!file) {
 246.553 +    // error handling
 246.554 +    return 1;
 246.555 +}
 246.556 +
 246.557 +/* Load the properties from the file */
 246.558 +UcxMap* myprops = ucx_map_new(16);
 246.559 +if (ucx_properties_load(myprops, file)) {
 246.560 +    /* ... error handling ... */
 246.561 +    fclose(file);
 246.562 +    ucx_map_free(myprops);
 246.563 +    return 1;
 246.564 +}
 246.565 +
 246.566 +/* Print out the key/value pairs */
 246.567 +char* propval;
 246.568 +UcxMapIterator propiter = ucx_map_iterator(myprops);
 246.569 +UCX_MAP_FOREACH(key, propval, propiter) {
 246.570 +    printf("%s = %s\n", (char*)key.data, propval);
 246.571 +}
 246.572 +
 246.573 +/* Don't forget to free the values before freeing the map */
 246.574 +ucx_map_free_content(myprops, NULL);
 246.575 +ucx_map_free(myprops);
 246.576 +fclose(file);
 246.577 +```
 246.578 +
 246.579 +## Stack
 246.580 +
 246.581 +*Header file:* [stack.h](api-2.1/stack_8h.html)  
 246.582 +*Required modules:* [Allocator](#allocator)
 246.583 +
 246.584 +This concrete implementation of an UCX Allocator allows you to grab some amount
 246.585 +of memory which is then handled as a stack.
 246.586 +Please note, that the term *stack* only refers to the behavior of this
 246.587 +allocator. You may still choose to use either stack or heap memory
 246.588 +for the underlying space.
 246.589 +A typical use case is an algorithm where you need to allocate and free large
 246.590 +amounts of memory very frequently.
 246.591 +
 246.592 +The following code sample shows how to initialize a stack and push and pop
 246.593 +simple data.
 246.594 +```C
 246.595 +    const size_t len = 1024;
 246.596 +    char space[len];
 246.597 +    UcxStack stack;
 246.598 +    ucx_stack_init(&stack, space, len);
 246.599 +
 246.600 +    int i = 42;
 246.601 +    float f = 3.14f;
 246.602 +    const char* str = "Hello!";
 246.603 +    size_t strn = 7;
 246.604 +
 246.605 +    /* push the integer */
 246.606 +    ucx_stack_push(&stack, sizeof(int), &i);
 246.607 +
 246.608 +    /* push the float and rember the address */
 246.609 +    float* remember = ucx_stack_push(&stack, sizeof(float), &f);
 246.610 +
 246.611 +    /* push the string with zero terminator */
 246.612 +    ucx_stack_push(&stack, strn, str);
 246.613 +
 246.614 +    /* if we forget, how big an element was, we can ask the stack */
 246.615 +    printf("Length of string: %zu\n", ucx_stack_topsize(&stack)-1);
 246.616 +
 246.617 +    /* retrieve the string as sstr_t, without zero terminator! */
 246.618 +    sstr_t s;
 246.619 +    s.length = ucx_stack_topsize(&stack)-1;
 246.620 +    s.ptr = malloc(s.length);
 246.621 +    ucx_stack_popn(&stack, s.ptr, s.length);
 246.622 +    printf("%" PRIsstr "\n", SFMT(s));
 246.623 +
 246.624 +    /* print the float directly from the stack and free it */
 246.625 +    printf("Float: %f\n", *remember);
 246.626 +    ucx_stack_free(&stack, remember);
 246.627 +
 246.628 +    /* the last element is the integer */
 246.629 +    int j;
 246.630 +    ucx_stack_pop(&stack, &j);
 246.631 +    printf("Integer: %d\n", j);
 246.632 +```
 246.633 +
 246.634 +
 246.635 +
 246.636 +## String
 246.637 +
 246.638 +*Header file:* [string.h](api-2.1/string_8h.html)  
 246.639 +*Required modules:* [Allocator](#allocator)
 246.640 +
 246.641 +This module provides a safe implementation of bounded string.
 246.642 +Usually C strings do not carry a length. While for zero-terminated strings you
 246.643 +can easily get the length with `strlen`, this is not generally possible for
 246.644 +arbitrary strings.
 246.645 +The `sstr_t` type of this module always carries the string and its length to
 246.646 +reduce the risk of buffer overflows dramatically.
 246.647 +
 246.648 +### Initialization
 246.649 +
 246.650 +There are several ways to create an `sstr_t`:
 246.651 +
 246.652 +```C
 246.653 +/* (1) sstr() uses strlen() internally, hence cstr MUST be zero-terminated */
 246.654 +sstr_t a = sstr(cstr);
 246.655 +
 246.656 +/* (2) cstr does not need to be zero-terminated, if length is specified */
 246.657 +sstr_t b = sstrn(cstr, len);
 246.658 +
 246.659 +/* (3) S() macro creates sstr_t from a string using sizeof() and using sstrn().
 246.660 +       This version is especially useful for function arguments */
 246.661 +sstr_t c = S("hello");
 246.662 +
 246.663 +/* (4) SC() macro works like S(), but makes the string immutable using scstr_t.
 246.664 +       (available since UCX 2.0) */
 246.665 +scstr_t d = SC("hello");
 246.666 +
 246.667 +/* (5) ST() macro creates sstr_t struct literal using sizeof() */
 246.668 +sstr_t e = ST("hello");
 246.669 +```
 246.670 +
 246.671 +You should not use the `S()`, `SC()`, or `ST()` macro with string of unknown
 246.672 +origin, since the `sizeof()` call might not coincide with the string length in
 246.673 +those cases. If you know what you are doing, it can save you some performance,
 246.674 +because you do not need the `strlen()` call.
 246.675 +
 246.676 +### Handling immutable strings
 246.677 +
 246.678 +*(Since: UCX 2.0)*
 246.679 +
 246.680 +For immutable strings (i.e. `const char*` strings), UCX provides the `scstr_t`
 246.681 +type, which works exactly as the `sstr_t` type but with a pointer
 246.682 +to `const char`. All UCX string functions come in two flavors: one that enforces
 246.683 +the `scstr_t` type, and another that usually accepts both types and performs
 246.684 +a conversion automatically, if necessary.
 246.685 +
 246.686 +There are some exceptions to this rule, as the return type may depend on the
 246.687 +argument type.
 246.688 +E.g. the `sstrchr()` function returns a substring starting at
 246.689 +the first occurrence of the specified character.
 246.690 +Since this substring points to the memory of the argument string, it does not
 246.691 +accept `scstr_t` as input argument, because the return type would break the
 246.692 +constness.
 246.693 +
 246.694 +
 246.695 +### Finding the position of a substring
 246.696 +
 246.697 +The `sstrstr()` function gives you a new `sstr_t` object starting with the
 246.698 +requested substring. Thus determining the position comes down to a simple
 246.699 +subtraction.
 246.700 +
 246.701 +```C
 246.702 +sstr_t haystack = ST("Here we go!");
 246.703 +sstr_t needle = ST("we");
 246.704 +sstr_t result = sstrstr(haystack, needle);
 246.705 +if (result.ptr)
 246.706 +    printf("Found at position %zd.\n", haystack.length-result.length);
 246.707 +else
 246.708 +    printf("Not found.\n");
 246.709 +```
 246.710 +
 246.711 +### Spliting a string by a delimiter
 246.712 +
 246.713 +The `sstrsplit()` function (and its allocator based version `sstrsplit_a()`) is
 246.714 +very powerful and might look a bit nasty at a first glance. But it is indeed
 246.715 +very simple to use. It is even more convenient in combination with a memory
 246.716 +pool.
 246.717 +
 246.718 +```C
 246.719 +sstr_t test = ST("here::are::some::strings");
 246.720 +sstr_t delim = ST("::");
 246.721 +
 246.722 +ssize_t count = 0; /* no limit */
 246.723 +UcxMempool* pool = ucx_mempool_new_default();
 246.724 +
 246.725 +sstr_t* result = sstrsplit_a(pool->allocator, test, delim, &count);
 246.726 +for (ssize_t i = 0 ; i < count ; i++) {
 246.727 +    /* don't forget to specify the length via the %*s format specifier */
 246.728 +    printf("%*s\n", result[i].length, result[i].ptr);
 246.729 +}
 246.730 +
 246.731 +ucx_mempool_destroy(pool);
 246.732 +```
 246.733 +The output is:
 246.734 +
 246.735 +    here
 246.736 +    are
 246.737 +    some
 246.738 +    strings
 246.739 +
 246.740 +The memory pool ensures, that all strings are freed.
 246.741 +
 246.742 +### Disabling convenience macros
 246.743 +
 246.744 +If you are experiencing any troubles with the short convenience macros `S()`,
 246.745 +`SC()`, or `ST()`, you can disable them by setting the macro
 246.746 +`UCX_NO_SSTR_SHORTCUTS` before including the header (or via a compiler option).
 246.747 +For the formatting macros `SFMT()` and `PRIsstr` you can use the macro
 246.748 +`UCX_NO_SSTR_FORMAT_MACROS` to disable them.
 246.749 +
 246.750 +Please keep in mind, that after disabling the macros, you cannot use them in
 246.751 +your code *and* foreign code that you might have included.
 246.752 +You should only disable the macros, if you are experiencing a nasty name clash
 246.753 +which cannot be otherwise resolved.
 246.754 +
 246.755 +## Testing
 246.756 +
 246.757 +*Header file:* [test.h](api-2.1/test_8h.html)  
 246.758 +*Required modules:* None.
 246.759 +
 246.760 +This module provides a testing framework which allows you to execute test cases
 246.761 +within test suites.
 246.762 +To avoid code duplication within tests, we also provide the possibility to
 246.763 +define test subroutines.
 246.764 +
 246.765 +You should declare test cases and subroutines in a header file per test unit
 246.766 +and implement them as you would implement normal functions.
 246.767 +```C
 246.768 +    /* myunit.h */
 246.769 +    UCX_TEST(function_name);
 246.770 +    UCX_TEST_SUBROUTINE(subroutine_name, paramlist); /* optional */
 246.771 +
 246.772 +
 246.773 +    /* myunit.c */
 246.774 +    UCX_TEST_SUBROUTINE(subroutine_name, paramlist) {
 246.775 +        /* ... reusable tests with UCX_TEST_ASSERT() ... */
 246.776 +    }
 246.777 +
 246.778 +    UCX_TEST(function_name) {
 246.779 +        /* ... resource allocation and other test preparation ... */
 246.780 +
 246.781 +        /* mandatory marker for the start of the tests */
 246.782 +        UCX_TEST_BEGIN
 246.783 +
 246.784 +        /*  ... verifications with UCX_TEST_ASSERT() ...
 246.785 +         * (and/or calls with UCX_TEST_CALL_SUBROUTINE())
 246.786 +         */
 246.787 +
 246.788 +        /* mandatory marker for the end of the tests */
 246.789 +        UCX_TEST_END
 246.790 +
 246.791 +        /* ... resource cleanup ...
 246.792 +         * (all code after UCX_TEST_END is always executed)
 246.793 +         */
 246.794 +    }
 246.795 +```
 246.796 +If you want to use the `UCX_TEST_ASSERT()` macro in a function, you are
 246.797 +*required* to use a `UCX_TEST_SUBROUTINE`.
 246.798 +Otherwise the testing framework does not know where to jump, when the assertion
 246.799 +fails.
 246.800 +
 246.801 +After implementing the tests, you can easily build a test suite and execute it:
 246.802 +```C
 246.803 +    UcxTestSuite* suite = ucx_test_suite_new();
 246.804 +    ucx_test_register(suite, testMyTestCase01);
 246.805 +    ucx_test_register(suite, testMyTestCase02);
 246.806 +    /* ... */
 246.807 +    ucx_test_run(suite, stdout); /* stdout, or any other FILE stream */
 246.808 +```
 246.809 +
 246.810 +## Utilities
 246.811 +
 246.812 +*Header file:* [utils.h](api-2.1/utils_8h.html)  
 246.813 +*Required modules:* [Allocator](#allocator), [String](#string)
 246.814 +
 246.815 +In this module we provide very general utility function for copy and compare
 246.816 +operations.
 246.817 +We also provide several `printf` variants to conveniently print formatted data
 246.818 +to streams or strings.
 246.819 +
 246.820 +### A simple copy program
 246.821 +
 246.822 +The utilities package provides several stream copy functions.
 246.823 +One of them has a very simple interface and can, for instance, be used to copy
 246.824 +whole files in a single call.
 246.825 +This is a minimal working example:
 246.826 +```C
 246.827 +#include <stdio.h>
 246.828 +#include <ucx/utils.h>
 246.829 +
 246.830 +int main(int argc, char** argv) {
 246.831 +
 246.832 +    if (argc != 3) {
 246.833 +        fprintf(stderr, "Use %s <src> <dest>", argv[0]);
 246.834 +        return 1;
 246.835 +    }
 246.836 +
 246.837 +    FILE *srcf = fopen(argv[1], "r");   /* insert error handling on your own */
 246.838 +    FILE *destf = fopen(argv[2], "w");
 246.839 +    
 246.840 +    size_t n =  ucx_stream_copy(srcf, destf, fread, fwrite);
 246.841 +    printf("%zu bytes copied.\n", n);
 246.842 +
 246.843 +    fclose(srcf);
 246.844 +    fclose(destf);
 246.845 +
 246.846 +
 246.847 +    return 0;
 246.848 +}
 246.849 +```
 246.850 +
 246.851 +### Automatic allocation for formatted strings
 246.852 +
 246.853 +The UCX utility function `ucx_asprintf()` and it's convenient shortcut
 246.854 +`ucx_sprintf` allow easy formatting of strings, without ever having to worry
 246.855 +about the required space.
 246.856 +```C
 246.857 +sstr_t mystring = ucx_sprintf("The answer is: %d!", 42);
 246.858 +```
 246.859 +Still, you have to pass `mystring.ptr` to `free()` (or the free function of
 246.860 +your allocator, if you use `ucx_asprintf`).
 246.861 +If you don't have all the information ready to build your string, you can even
 246.862 +use a [UcxBuffer](#buffer) as a target with the utility function
 246.863 +`ucx_bprintf()`.
 246.864 +```C
 246.865 +UcxBuffer* strbuffer = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND);
 246.866 +
 246.867 +for (unsigned int i = 2 ; i < 100 ; i++) {
 246.868 +        ucx_bprintf(strbuffer, "Integer %d is %s\n",
 246.869 +                        i, prime(i) ? "prime" : "not prime");
 246.870 +}
 246.871 +
 246.872 +/* print the result to stdout */
 246.873 +printf("%s", (char*)strbuffer->space);
 246.874 +
 246.875 +ucx_buffer_free(strbuffer);
 246.876 +```
   247.1 --- a/docs/src/modules.md	Mon Dec 30 09:54:10 2019 +0100
   247.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   247.3 @@ -1,873 +0,0 @@
   247.4 ----
   247.5 -title: Modules
   247.6 ----
   247.7 -
   247.8 -UCX provides several modules for data structures and algorithms.
   247.9 -You may choose to use specific modules by inclueding the corresponding header
  247.10 -file.
  247.11 -Please note, that some modules make use of other UCX modules.
  247.12 -For instance, the [Allocator](#allocator) module is used by many other modules
  247.13 -to allow flexible memory allocation.
  247.14 -By default the header files are placed into an `ucx` directory within your
  247.15 -systems include directory. In this case you can use a module by including it
  247.16 -via `#include <ucx/MODULENAME.h>`.
  247.17 -Required modules are included automatically.
  247.18 -
  247.19 -<div id="modules" align="center">
  247.20 -    
  247.21 ------------------------ ----------------------  --------------------------------  ---------------------------
  247.22 -[String](#string)       [Buffer](#buffer)
  247.23 -[Allocator](#allocator) [Stack](#stack)         [Memory&nbsp;Pool](#memory-pool)     
  247.24 -[Array](#array)         [List](#list)           [Map](#map)                       [AVL&nbsp;Tree](#avl-tree)
  247.25 -[Logging](#logging)     [Testing](#testing)     [Utilities](#utilities)           [Properties](#properties)                         
  247.26 ------------------------ ----------------------  --------------------------------  ---------------------------
  247.27 -
  247.28 -</div>
  247.29 -
  247.30 -## Allocator
  247.31 -
  247.32 -*Header file:* [allocator.h](api/allocator_8h.html)  
  247.33 -*Required modules:* None.
  247.34 -
  247.35 -A UCX allocator consists of a pointer to the memory area / pool and four
  247.36 -function pointers to memory management functions operating on this memory
  247.37 -area / pool. These functions shall behave equivalent to the standard libc
  247.38 -functions `malloc`, `calloc`, `realloc` and `free`.
  247.39 -
  247.40 -The signature of the memory management functions is based on the signature
  247.41 -of the respective libc function but each of them takes the pointer to the
  247.42 -memory area / pool as first argument.
  247.43 -
  247.44 -As the pointer to the memory area / pool can be arbitrarily chosen, any data
  247.45 -can be provided to the memory management functions. One example is the
  247.46 -[UCX Memory Pool](#memory-pool).
  247.47 -
  247.48 -## Array
  247.49 -
  247.50 -*Header file:* [array.h](api/array_8h.html)  
  247.51 -*Required modules:* [Allocator](#allocator)
  247.52 -
  247.53 -The UCX Array is an implementation of a dynamic array with automatic
  247.54 -reallocation. The array structure contains a capacity, the current size,
  247.55 -the size of each element, the raw pointer to the memory area and an allocator.
  247.56 -Arrays are in most cases much faster than linked list.
  247.57 -One can decide, whether to create a new array on the heap with `ucx_array_new()`
  247.58 -or to save one indirection by initializing a `UcxArray` structure on the stack
  247.59 -with `ucx_array_init()`.
  247.60 -
  247.61 -### Remove duplicates from an array of strings
  247.62 -
  247.63 -The following example shows, how a `UcxArray` can be built with
  247.64 -a standard dynamic C array (pointer+length) as basis.
  247.65 -
  247.66 -```C
  247.67 -UcxArray* create_unique(sstr_t* array, size_t arrlen) {
  247.68 -    // worst case is no duplicates, hence the capacity is set to arrlen
  247.69 -    UcxArray* result = ucx_array_new(arrlen, sizeof(sstr_t));
  247.70 -    // only append elements, if they are not already present in the array
  247.71 -    for (size_t i = 0 ; i < arrlen ; ++i) {
  247.72 -        if (!ucx_array_contains(result, array+i, ucx_cmp_sstr, NULL)) {
  247.73 -            ucx_array_append_from(result, array+i, 1);
  247.74 -        }
  247.75 -    }
  247.76 -    // make the array as small as possible
  247.77 -    ucx_array_shrink(result);
  247.78 -    return result;
  247.79 -}
  247.80 -
  247.81 -/* ... */
  247.82 -
  247.83 -sstr_t* array = /* some standard array of strings */
  247.84 -size_t arrlen = /* the length of the array */
  247.85 -
  247.86 -UcxArray* result = create_unique(array,arrlen);
  247.87 -
  247.88 -/* Iterate over the array and print the elements */
  247.89 -sstr_t* unique = result->data;
  247.90 -for (size_t i = 0 ; i < result->size ; i++) {
  247.91 -    printf("%" PRIsstr "\n", SFMT(unique[i]));
  247.92 -}
  247.93 -
  247.94 -/* Free the array. */
  247.95 -ucx_array_free(result);
  247.96 -```
  247.97 -### Preventing out of bounds writes
  247.98 -
  247.99 -The functions `ucx_array_reserve()`, `ucx_array_resize()`, `ucx_array_grow()`,
 247.100 -and `ucx_array_shrink()` allow easy management of the array capacity.
 247.101 -Imagine you want to add `n` elements to an array. If your `n` elements are
 247.102 -already somewhere else consecutively in memory, you can use
 247.103 -`ucx_array_append_from()` and benefit from the autogrow facility in this family
 247.104 -of functions. Otherwise, you can ask the array to have enough capacity for
 247.105 -holding additional `n` elements.
 247.106 -
 247.107 -```C
 247.108 -size_t n = // ... elements to add
 247.109 -if (ucx_array_grow(array, n)) {
 247.110 -   fprintf(stderr, "Cannot add %zu elements to the array.\n", n);
 247.111 -   return 1;
 247.112 -}
 247.113 -for (size_t i = 0 ; i < n ; i++) {
 247.114 -    ((int*)array->data)[array->size++] = 80;
 247.115 -}
 247.116 -```
 247.117 -
 247.118 -## AVL Tree
 247.119 -
 247.120 -*Header file:* [avl.h](api/avl_8h.html)  
 247.121 -*Required modules:* [Allocator](#allocator)
 247.122 -
 247.123 -This binary search tree implementation allows average O(1) insertion and
 247.124 -removal of elements (excluding binary search time).
 247.125 -All common binary tree operations are implemented. Furthermore, this module
 247.126 -provides search functions via lower and upper bounds.
 247.127 -
 247.128 -### Filtering items with a time window
 247.129 -
 247.130 -Suppose you have a list of items which contain a `time_t` value and your task
 247.131 -is to find all items within a time window `[t_start, t_end]`.
 247.132 -With AVL Trees this is easy:
 247.133 -```C
 247.134 -/* ---------------------
 247.135 - * Somewhere in a header
 247.136 - */
 247.137 -typedef struct {
 247.138 -    time_t ts;
 247.139 -    /* other important data */
 247.140 -} MyObject;
 247.141 -
 247.142 -/* -----------
 247.143 - * Source code
 247.144 - */
 247.145 -
 247.146 -UcxAVLTree* tree = ucx_avl_new(ucx_cmp_longint);
 247.147 -/* ... populate tree with objects, use '& MyObject.ts' as key ... */
 247.148 -
 247.149 -
 247.150 -/* Now find every item, with 30 <= ts <= 70 */
 247.151 -time_t ts_start = 30;
 247.152 -time_t ts_end = 70;
 247.153 -
 247.154 -printf("Values in range:\n");
 247.155 -for (
 247.156 -        UcxAVLNode* node = ucx_avl_find_node(
 247.157 -            tree, (intptr_t) &ts_start,
 247.158 -            ucx_dist_longint, UCX_AVL_FIND_LOWER_BOUNDED);
 247.159 -        node && (*(time_t*)node->key) <= ts_end;
 247.160 -        node = ucx_avl_succ(node)
 247.161 -    ) {
 247.162 -    printf(" ts: %ld\n", ((MyObject*)node->value)->ts);
 247.163 -}
 247.164 -
 247.165 -ucx_avl_free_content(tree, free);
 247.166 -ucx_avl_free(tree);
 247.167 -```
 247.168 -
 247.169 -## Buffer
 247.170 -
 247.171 -*Header file:* [buffer.h](api/buffer_8h.html)  
 247.172 -*Required modules:* None.
 247.173 -
 247.174 -Instances of this buffer implementation can be used to read from or to write to
 247.175 -memory like you would do with a stream. This allows the use of
 247.176 -`ucx_stream_copy()` from the [Utilities](#utilities) module to copy contents
 247.177 -from one buffer to another or from file or network streams to the buffer and
 247.178 -vice-versa.
 247.179 -
 247.180 -More features for convenient use of the buffer can be enabled, like automatic
 247.181 -memory management and automatic resizing of the buffer space.
 247.182 -See the documentation of the macro constants in the header file for more
 247.183 -information.
 247.184 -
 247.185 -### Add line numbers to a file
 247.186 -
 247.187 -When reading a file line by line, you have three options: first, you could limit
 247.188 -the maximum supported line length.
 247.189 -Second, you allocate a god buffer large
 247.190 -enough for the most lines a text file could have.
 247.191 -And third, undoubtedly the best option, you start with a small buffer, which
 247.192 -adjusts on demand.
 247.193 -An `UcxBuffer` can be created to do just that for you.
 247.194 -Just pass the `UCX_BUFFER_AUTOEXTEND` option to the initialization function.
 247.195 -Here is a full working program, which adds line numbers to a file.
 247.196 -```C
 247.197 -#include <stdio.h>
 247.198 -#include <ucx/buffer.h>
 247.199 -#include <ucx/utils.h>
 247.200 -
 247.201 -int main(int argc, char** argv) {
 247.202 -
 247.203 -    if (argc != 2) {
 247.204 -        fprintf(stderr, "Usage: %s <file>\n", argv[0]);
 247.205 -        return 1;
 247.206 -    }
 247.207 -
 247.208 -    FILE* input = fopen(argv[1], "r");
 247.209 -    if (!input) {
 247.210 -        perror("Canno read input");
 247.211 -        return 1;
 247.212 -    }
 247.213 -
 247.214 -    const size_t chunksize = 256;
 247.215 -
 247.216 -    UcxBuffer* linebuf =
 247.217 -        ucx_buffer_new(
 247.218 -            NULL,       /* the buffer should manage the memory area for us */
 247.219 -            2*chunksize,  /* initial size should be twice the chunk size */
 247.220 -            UCX_BUFFER_AUTOEXTEND); /* the buffer will grow when necessary */
 247.221 -
 247.222 -    size_t lineno = 1;
 247.223 -    do {
 247.224 -        /* read line chunk */
 247.225 -        size_t read = ucx_stream_ncopy(
 247.226 -                input, linebuf, fread, ucx_buffer_write, chunksize);
 247.227 -        if (read == 0) break;
 247.228 -        
 247.229 -        /* handle line endings */
 247.230 -        do {
 247.231 -            sstr_t bufstr = ucx_buffer_to_sstr(linebuf);
 247.232 -            sstr_t nl = sstrchr(bufstr, '\n');
 247.233 -            if (nl.length == 0) break;
 247.234 -
 247.235 -            size_t linelen = bufstr.length - nl.length;
 247.236 -            sstr_t linestr = sstrsubsl(bufstr, 0, linelen);
 247.237 -
 247.238 -            printf("%zu: %" PRIsstr "\n", lineno++, SFMT(linestr));
 247.239 -
 247.240 -            /* shift the buffer to the next line */
 247.241 -            ucx_buffer_shift_left(linebuf, linelen+1);
 247.242 -        } while(1);
 247.243 -
 247.244 -    } while(1);
 247.245 -
 247.246 -    /* print the 'noeol' line, if any */
 247.247 -    sstr_t lastline = ucx_buffer_to_sstr(linebuf);
 247.248 -    if (lastline.length > 0) {
 247.249 -        printf("%zu: %" PRIsstr, lineno, SFMT(lastline));
 247.250 -    }
 247.251 -
 247.252 -    fclose(input);
 247.253 -    ucx_buffer_free(linebuf);
 247.254 -
 247.255 -    return 0;
 247.256 -}
 247.257 -```
 247.258 -
 247.259 -## List
 247.260 -
 247.261 -*Header file:* [list.h](api/list_8h.html)  
 247.262 -*Required modules:* [Allocator](#allocator)
 247.263 -
 247.264 -This module provides the data structure and several functions for a doubly
 247.265 -linked list. Among the common operations like insert, remove, search and sort,
 247.266 -we allow convenient iteration via a special `UCX_FOREACH` macro.
 247.267 -
 247.268 -### Remove duplicates from an array of strings
 247.269 -
 247.270 -Assume you are given an array of `sstr_t` and want to create a list of these
 247.271 -strings without duplicates.
 247.272 -This is a similar example to the one [above](#array), but here we are
 247.273 -using a `UcxList`.
 247.274 -```C
 247.275 -#include <stdio.h>
 247.276 -#include <ucx/list.h>
 247.277 -#include <ucx/string.h>
 247.278 -#include <ucx/utils.h>
 247.279 -
 247.280 -UcxList* remove_duplicates(sstr_t* array, size_t arrlen) {
 247.281 -    UcxList* list = NULL;
 247.282 -    for (size_t i = 0 ; i < arrlen ; ++i) {
 247.283 -        if (ucx_list_find(list, array+i, ucx_cmp_sstr, NULL) == -1) {
 247.284 -            sstr_t* s = malloc(sizeof(sstr_t));
 247.285 -            *s = sstrdup(array[i]);
 247.286 -            list = ucx_list_append(list, s);
 247.287 -        }
 247.288 -    }
 247.289 -    return list;
 247.290 -}
 247.291 -
 247.292 -/* we will need this function to clean up the list contents later */
 247.293 -void free_sstr(void* ptr) {
 247.294 -    sstr_t* s = ptr;
 247.295 -    free(s->ptr);
 247.296 -    free(s);
 247.297 -}
 247.298 -
 247.299 -/* ... */
 247.300 -
 247.301 -sstr_t* array = /* some array of strings */
 247.302 -size_t arrlen = /* the length of the array */
 247.303 -
 247.304 -UcxList* list = remove_duplicates(array,arrlen);
 247.305 -
 247.306 -/* Iterate over the list and print the elements */
 247.307 -UCX_FOREACH(elem, list) {
 247.308 -    sstr_t s = *((sstr_t*)elem->data);
 247.309 -    printf("%" PRIsstr "\n", SFMT(s));
 247.310 -}
 247.311 -
 247.312 -/* Use our free function to free the duplicated strings. */
 247.313 -ucx_list_free_content(list, free_sstr);
 247.314 -ucx_list_free(list);
 247.315 -```
 247.316 -
 247.317 -## Logging
 247.318 -
 247.319 -*Header file:* [logging.h](api/logging_8h.html)  
 247.320 -*Required modules:* [Map](#map), [String](#string)
 247.321 -
 247.322 -The logging module comes with some predefined log levels and allows some more
 247.323 -customization. You may choose if you want to get timestamps or source file and
 247.324 -line number logged automatically when outputting a message.
 247.325 -The following function call initializes a debug logger with all of the above
 247.326 -information:
 247.327 -```C
 247.328 -    log = ucx_logger_new(stdout, UCX_LOGGER_DEBUG,
 247.329 -            UCX_LOGGER_LEVEL | UCX_LOGGER_TIMESTAMP | UCX_LOGGER_SOURCE);
 247.330 -```
 247.331 -Afterwards you can use this logger with the predefined macros
 247.332 -```C
 247.333 -    ucx_logger_trace(log, "Verbose output");
 247.334 -    ucx_logger_debug(log, "Debug message");
 247.335 -    ucx_logger_info(log, "Information");
 247.336 -    ucx_logger_warn(log, "Warning");
 247.337 -    ucx_logger_error(log, "Error message");
 247.338 -```
 247.339 -or you use
 247.340 -```C
 247.341 -    ucx_logger_log(log, CUSTOM_LEVEL, "Some message")
 247.342 -```
 247.343 -When you use your custom log level, don't forget to register it with
 247.344 -```C
 247.345 -    ucx_logger_register_level(log, CUSTOM_LEVEL, "CUSTOM")
 247.346 -```
 247.347 -where the last argument must be a string literal.
 247.348 -
 247.349 -## Map
 247.350 -
 247.351 -*Header file:* [map.h](api/map_8h.html)  
 247.352 -*Required modules:* [Allocator](#allocator), [String](#string)
 247.353 -
 247.354 -This module provides a hash map implementation using murmur hash 2 and separate
 247.355 -chaining with linked lists. Similarly to the list module, we provide a
 247.356 -`UCX_MAP_FOREACH` macro to conveniently iterate through the key/value pairs.
 247.357 -
 247.358 -### Parsing command line options
 247.359 -
 247.360 -Assume you want to parse command line options and record them within a map.
 247.361 -One way to do this is shown by the following code sample:
 247.362 -```C
 247.363 -    UcxMap* options = ucx_map_new(16);
 247.364 -    const char *NOARG = "";
 247.365 -    
 247.366 -    char *option = NULL;
 247.367 -    char optchar = 0;
 247.368 -    for(int i=1;i<argc;i++) {
 247.369 -        char *arg = argv[i];
 247.370 -        size_t len = strlen(arg);
 247.371 -        if(len > 1 && arg[0] == '-') {
 247.372 -            for(int c=1;c<len;c++) {
 247.373 -                if(option) {
 247.374 -                    fprintf(stderr,
 247.375 -                            "Missing argument for option -%c\n", optchar);
 247.376 -                    return 1;
 247.377 -                }
 247.378 -                switch(arg[c]) {
 247.379 -                    default: {
 247.380 -                        fprintf(stderr, "Unknown option -%c\n\n", arg[c]);
 247.381 -                        return 1;
 247.382 -                    }
 247.383 -                    case 'v': {
 247.384 -                        ucx_map_cstr_put(options, "verbose", NOARG);
 247.385 -                        break;
 247.386 -                    }
 247.387 -                    case 'o': {
 247.388 -                        option = "output";
 247.389 -                        optchar = 'o';
 247.390 -                        break;
 247.391 -                    }
 247.392 -                }
 247.393 -            }
 247.394 -        } else if(option) {
 247.395 -            ucx_map_cstr_put(options, option, arg);
 247.396 -            option = NULL;
 247.397 -        } else {
 247.398 -            /* ... handle argument that is not an option ... */
 247.399 -        }
 247.400 -    }
 247.401 -    if(option) {
 247.402 -        fprintf(stderr,
 247.403 -                "Missing argument for option -%c\n", optchar);
 247.404 -        return 1;
 247.405 -    }
 247.406 -```
 247.407 -With the following loop, you can access the previously recorded options:
 247.408 -```C
 247.409 -    UcxMapIterator iter = ucx_map_iterator(options);
 247.410 -    char *arg;
 247.411 -    UCX_MAP_FOREACH(optkey, arg, iter) {
 247.412 -        char* opt = optkey.data;
 247.413 -        if (*arg) {
 247.414 -            printf("%s = %s\n", opt, arg);
 247.415 -        } else {
 247.416 -            printf("%s active\n", opt);
 247.417 -        }
 247.418 -    }
 247.419 -```
 247.420 -Don't forget to call `ucx_map_free()`, when you are done with the map.
 247.421 -
 247.422 -## Memory Pool
 247.423 -
 247.424 -*Header file:* [mempool.h](api/mempool_8h.html)  
 247.425 -*Required modules:* [Allocator](#allocator)
 247.426 -
 247.427 -Here we have a concrete allocator implementation in the sense of a memory pool.
 247.428 -This pool allows you to register destructor functions for the allocated memory,
 247.429 -which are automatically called on the destruction of the pool.
 247.430 -But you may also register *independent* destructor functions within a pool in
 247.431 -case some external library allocated memory for you, which should be
 247.432 -destroyed together with this pool.
 247.433 -
 247.434 -Many UCX modules support the use of an allocator.
 247.435 -The [String Module](#string), for instance, provides the `sstrdup_a()` function,
 247.436 -which uses the specified allocator to allocate the memory for the duplicated
 247.437 -string.
 247.438 -This way, you can use a `UcxMempool` to keep track of the memory occupied by
 247.439 -duplicated strings and cleanup everything with just a single call to
 247.440 -`ucx_mempool_destroy()`.
 247.441 -
 247.442 -### Read CSV data into a structure
 247.443 -
 247.444 -The following code example shows some of the basic memory pool functions and
 247.445 -how they can be used with other UCX modules.
 247.446 -```C
 247.447 -#include <stdio.h>
 247.448 -#include <ucx/mempool.h>
 247.449 -#include <ucx/list.h>
 247.450 -#include <ucx/string.h>
 247.451 -#include <ucx/buffer.h>
 247.452 -#include <ucx/utils.h>
 247.453 -
 247.454 -typedef struct {
 247.455 -    sstr_t column_a;
 247.456 -    sstr_t column_b;
 247.457 -    sstr_t column_c;
 247.458 -} CSVData;
 247.459 -
 247.460 -int main(int argc, char** argv) {
 247.461 -
 247.462 -    UcxMempool* pool = ucx_mempool_new(128);
 247.463 -
 247.464 -    FILE *f = fopen("test.csv", "r");
 247.465 -    if (!f) {
 247.466 -        perror("Cannot open file");
 247.467 -        return 1;
 247.468 -    }
 247.469 -    /* close the file automatically at pool destruction*/
 247.470 -    ucx_mempool_reg_destr(pool, f, (ucx_destructor) fclose);
 247.471 -
 247.472 -    /* create a buffer and register it at the memory pool for destruction */
 247.473 -    UcxBuffer* content = ucx_buffer_new(NULL, 256, UCX_BUFFER_AUTOEXTEND);
 247.474 -    ucx_mempool_reg_destr(pool, content, (ucx_destructor) ucx_buffer_free);
 247.475 -
 247.476 -    /* read the file and split it by lines first */
 247.477 -    ucx_stream_copy(f, content, fread, ucx_buffer_write);
 247.478 -    sstr_t contentstr = ucx_buffer_to_sstr(content);
 247.479 -    ssize_t lc = 0;
 247.480 -    sstr_t* lines = sstrsplit_a(pool->allocator, contentstr, S("\n"), &lc);
 247.481 -
 247.482 -    /* skip the header and parse the remaining data */
 247.483 -    UcxList* datalist = NULL;
 247.484 -    for (size_t i = 1 ; i < lc ; i++) {
 247.485 -        if (lines[i].length == 0) continue;
 247.486 -        ssize_t fc = 3;
 247.487 -        sstr_t* fields = sstrsplit_a(pool->allocator, lines[i], S(";"), &fc);
 247.488 -        if (fc != 3) {
 247.489 -            fprintf(stderr, "Syntax error in line %zu.\n", i);
 247.490 -            ucx_mempool_destroy(pool);
 247.491 -            return 1;
 247.492 -        }
 247.493 -        CSVData* data = ucx_mempool_malloc(pool, sizeof(CSVData));
 247.494 -        data->column_a = fields[0];
 247.495 -        data->column_b = fields[1];
 247.496 -        data->column_c = fields[2];
 247.497 -        datalist = ucx_list_append_a(pool->allocator, datalist, data);
 247.498 -    }
 247.499 -
 247.500 -    /* control output */
 247.501 -    UCX_FOREACH(elem, datalist) {
 247.502 -        CSVData* data = elem->data;
 247.503 -        printf("Column A: %" PRIsstr " | "
 247.504 -               "Column B: %" PRIsstr " | "
 247.505 -               "Column C: %" PRIsstr "\n",
 247.506 -               SFMT(data->column_a), SFMT(data->column_b), SFMT(data->column_c)
 247.507 -        );
 247.508 -    }
 247.509 -
 247.510 -    /* cleanup everything, no manual free() needed */
 247.511 -    ucx_mempool_destroy(pool);
 247.512 -
 247.513 -    return 0;
 247.514 -} 
 247.515 -```
 247.516 -
 247.517 -### Overriding the default destructor
 247.518 -
 247.519 -Sometimes you need to allocate memory with `ucx_mempool_malloc()`, but the
 247.520 -memory is not supposed to be freed with a simple call to `free()`.
 247.521 -In this case, you can overwrite the default destructor as follows:
 247.522 -```C
 247.523 -    MyObject* obj = ucx_mempool_malloc(pool, sizeof(MyObject));
 247.524 -
 247.525 -    /* some special initialization with own resource management */
 247.526 -    my_object_init(obj);
 247.527 -
 247.528 -    /* register destructor function */
 247.529 -    ucx_mempool_set_destr(obj, (ucx_destructor) my_object_destroy);
 247.530 -```
 247.531 -Be aware, that your destructor function should not free any memory, that is
 247.532 -also managed by the pool.
 247.533 -Otherwise you might be risking a double-free.
 247.534 -More precisely, a destructor function set with `ucx_mempool_set_destr()` MUST
 247.535 -NOT call `free()` on the specified pointer whereas a desructor function
 247.536 -registered with `ucx_mempool_reg_destr()` MAY (and in most cases will) call
 247.537 -`free()`.
 247.538 -
 247.539 -## Properties
 247.540 -
 247.541 -*Header file:* [properties.h](api/properties_8h.html)  
 247.542 -*Required modules:* [Map](#map)
 247.543 -
 247.544 -This module provides load and store function for `*.properties` files.
 247.545 -The key/value pairs are stored within an UCX Map.
 247.546 -
 247.547 -### Example: Loading properties from a file
 247.548 -
 247.549 -```C
 247.550 -/* Open the file as usual */
 247.551 -FILE* file = fopen("myprops.properties", "r");
 247.552 -if (!file) {
 247.553 -    // error handling
 247.554 -    return 1;
 247.555 -}
 247.556 -
 247.557 -/* Load the properties from the file */
 247.558 -UcxMap* myprops = ucx_map_new(16);
 247.559 -if (ucx_properties_load(myprops, file)) {
 247.560 -    /* ... error handling ... */
 247.561 -    fclose(file);
 247.562 -    ucx_map_free(myprops);
 247.563 -    return 1;
 247.564 -}
 247.565 -
 247.566 -/* Print out the key/value pairs */
 247.567 -char* propval;
 247.568 -UcxMapIterator propiter = ucx_map_iterator(myprops);
 247.569 -UCX_MAP_FOREACH(key, propval, propiter) {
 247.570 -    printf("%s = %s\n", (char*)key.data, propval);
 247.571 -}
 247.572 -
 247.573 -/* Don't forget to free the values before freeing the map */
 247.574 -ucx_map_free_content(myprops, NULL);
 247.575 -ucx_map_free(myprops);
 247.576 -fclose(file);
 247.577 -```
 247.578 -
 247.579 -## Stack
 247.580 -
 247.581 -*Header file:* [stack.h](api/stack_8h.html)  
 247.582 -*Required modules:* [Allocator](#allocator)
 247.583 -
 247.584 -This concrete implementation of an UCX Allocator allows you to grab some amount
 247.585 -of memory which is then handled as a stack.
 247.586 -Please note, that the term *stack* only refers to the behavior of this
 247.587 -allocator. You may still choose to use either stack or heap memory
 247.588 -for the underlying space.
 247.589 -A typical use case is an algorithm where you need to allocate and free large
 247.590 -amounts of memory very frequently.
 247.591 -
 247.592 -The following code sample shows how to initialize a stack and push and pop
 247.593 -simple data.
 247.594 -```C
 247.595 -    const size_t len = 1024;
 247.596 -    char space[len];
 247.597 -    UcxStack stack;
 247.598 -    ucx_stack_init(&stack, space, len);
 247.599 -
 247.600 -    int i = 42;
 247.601 -    float f = 3.14f;
 247.602 -    const char* str = "Hello!";
 247.603 -    size_t strn = 7;
 247.604 -
 247.605 -    /* push the integer */
 247.606 -    ucx_stack_push(&stack, sizeof(int), &i);
 247.607 -
 247.608 -    /* push the float and rember the address */
 247.609 -    float* remember = ucx_stack_push(&stack, sizeof(float), &f);
 247.610 -
 247.611 -    /* push the string with zero terminator */
 247.612 -    ucx_stack_push(&stack, strn, str);
 247.613 -
 247.614 -    /* if we forget, how big an element was, we can ask the stack */
 247.615 -    printf("Length of string: %zu\n", ucx_stack_topsize(&stack)-1);
 247.616 -
 247.617 -    /* retrieve the string as sstr_t, without zero terminator! */
 247.618 -    sstr_t s;
 247.619 -    s.length = ucx_stack_topsize(&stack)-1;
 247.620 -    s.ptr = malloc(s.length);
 247.621 -    ucx_stack_popn(&stack, s.ptr, s.length);
 247.622 -    printf("%" PRIsstr "\n", SFMT(s));
 247.623 -
 247.624 -    /* print the float directly from the stack and free it */
 247.625 -    printf("Float: %f\n", *remember);
 247.626 -    ucx_stack_free(&stack, remember);
 247.627 -
 247.628 -    /* the last element is the integer */
 247.629 -    int j;
 247.630 -    ucx_stack_pop(&stack, &j);
 247.631 -    printf("Integer: %d\n", j);
 247.632 -```
 247.633 -
 247.634 -
 247.635 -
 247.636 -## String
 247.637 -
 247.638 -*Header file:* [string.h](api/string_8h.html)  
 247.639 -*Required modules:* [Allocator](#allocator)
 247.640 -
 247.641 -This module provides a safe implementation of bounded string.
 247.642 -Usually C strings do not carry a length. While for zero-terminated strings you
 247.643 -can easily get the length with `strlen`, this is not generally possible for
 247.644 -arbitrary strings.
 247.645 -The `sstr_t` type of this module always carries the string and its length to
 247.646 -reduce the risk of buffer overflows dramatically.
 247.647 -
 247.648 -### Initialization
 247.649 -
 247.650 -There are several ways to create an `sstr_t`:
 247.651 -
 247.652 -```C
 247.653 -/* (1) sstr() uses strlen() internally, hence cstr MUST be zero-terminated */
 247.654 -sstr_t a = sstr(cstr);
 247.655 -
 247.656 -/* (2) cstr does not need to be zero-terminated, if length is specified */
 247.657 -sstr_t b = sstrn(cstr, len);
 247.658 -
 247.659 -/* (3) S() macro creates sstr_t from a string using sizeof() and using sstrn().
 247.660 -       This version is especially useful for function arguments */
 247.661 -sstr_t c = S("hello");
 247.662 -
 247.663 -/* (4) SC() macro works like S(), but makes the string immutable using scstr_t.
 247.664 -       (available since UCX 2.0) */
 247.665 -scstr_t d = SC("hello");
 247.666 -
 247.667 -/* (5) ST() macro creates sstr_t struct literal using sizeof() */
 247.668 -sstr_t e = ST("hello");
 247.669 -```
 247.670 -
 247.671 -You should not use the `S()`, `SC()`, or `ST()` macro with string of unknown
 247.672 -origin, since the `sizeof()` call might not coincide with the string length in
 247.673 -those cases. If you know what you are doing, it can save you some performance,
 247.674 -because you do not need the `strlen()` call.
 247.675 -
 247.676 -### Handling immutable strings
 247.677 -
 247.678 -*(Since: UCX 2.0)*
 247.679 -
 247.680 -For immutable strings (i.e. `const char*` strings), UCX provides the `scstr_t`
 247.681 -type, which works exactly as the `sstr_t` type but with a pointer
 247.682 -to `const char`. All UCX string functions come in two flavors: one that enforces
 247.683 -the `scstr_t` type, and another that usually accepts both types and performs
 247.684 -a conversion automatically, if necessary.
 247.685 -
 247.686 -There are some exceptions to this rule, as the return type may depend on the
 247.687 -argument type.
 247.688 -E.g. the `sstrchr()` function returns a substring starting at
 247.689 -the first occurrence of the specified character.
 247.690 -Since this substring points to the memory of the argument string, it does not
 247.691 -accept `scstr_t` as input argument, because the return type would break the
 247.692 -constness.
 247.693 -
 247.694 -
 247.695 -### Finding the position of a substring
 247.696 -
 247.697 -The `sstrstr()` function gives you a new `sstr_t` object starting with the
 247.698 -requested substring. Thus determining the position comes down to a simple
 247.699 -subtraction.
 247.700 -
 247.701 -```C
 247.702 -sstr_t haystack = ST("Here we go!");
 247.703 -sstr_t needle = ST("we");
 247.704 -sstr_t result = sstrstr(haystack, needle);
 247.705 -if (result.ptr)
 247.706 -    printf("Found at position %zd.\n", haystack.length-result.length);
 247.707 -else
 247.708 -    printf("Not found.\n");
 247.709 -```
 247.710 -
 247.711 -### Spliting a string by a delimiter
 247.712 -
 247.713 -The `sstrsplit()` function (and its allocator based version `sstrsplit_a()`) is
 247.714 -very powerful and might look a bit nasty at a first glance. But it is indeed
 247.715 -very simple to use. It is even more convenient in combination with a memory
 247.716 -pool.
 247.717 -
 247.718 -```C
 247.719 -sstr_t test = ST("here::are::some::strings");
 247.720 -sstr_t delim = ST("::");
 247.721 -
 247.722 -ssize_t count = 0; /* no limit */
 247.723 -UcxMempool* pool = ucx_mempool_new_default();
 247.724 -
 247.725 -sstr_t* result = sstrsplit_a(pool->allocator, test, delim, &count);
 247.726 -for (ssize_t i = 0 ; i < count ; i++) {
 247.727 -    /* don't forget to specify the length via the %*s format specifier */
 247.728 -    printf("%*s\n", result[i].length, result[i].ptr);
 247.729 -}
 247.730 -
 247.731 -ucx_mempool_destroy(pool);
 247.732 -```
 247.733 -The output is:
 247.734 -
 247.735 -    here
 247.736 -    are
 247.737 -    some
 247.738 -    strings
 247.739 -
 247.740 -The memory pool ensures, that all strings are freed.
 247.741 -
 247.742 -### Disabling convenience macros
 247.743 -
 247.744 -If you are experiencing any troubles with the short convenience macros `S()`,
 247.745 -`SC()`, or `ST()`, you can disable them by setting the macro
 247.746 -`UCX_NO_SSTR_SHORTCUTS` before including the header (or via a compiler option).
 247.747 -For the formatting macros `SFMT()` and `PRIsstr` you can use the macro
 247.748 -`UCX_NO_SSTR_FORMAT_MACROS` to disable them.
 247.749 -
 247.750 -Please keep in mind, that after disabling the macros, you cannot use them in
 247.751 -your code *and* foreign code that you might have included.
 247.752 -You should only disable the macros, if you are experiencing a nasty name clash
 247.753 -which cannot be otherwise resolved.
 247.754 -
 247.755 -## Testing
 247.756 -
 247.757 -*Header file:* [test.h](api/test_8h.html)  
 247.758 -*Required modules:* None.
 247.759 -
 247.760 -This module provides a testing framework which allows you to execute test cases
 247.761 -within test suites.
 247.762 -To avoid code duplication within tests, we also provide the possibility to
 247.763 -define test subroutines.
 247.764 -
 247.765 -You should declare test cases and subroutines in a header file per test unit
 247.766 -and implement them as you would implement normal functions.
 247.767 -```C
 247.768 -    /* myunit.h */
 247.769 -    UCX_TEST(function_name);
 247.770 -    UCX_TEST_SUBROUTINE(subroutine_name, paramlist); /* optional */
 247.771 -
 247.772 -
 247.773 -    /* myunit.c */
 247.774 -    UCX_TEST_SUBROUTINE(subroutine_name, paramlist) {
 247.775 -        /* ... reusable tests with UCX_TEST_ASSERT() ... */
 247.776 -    }
 247.777 -
 247.778 -    UCX_TEST(function_name) {
 247.779 -        /* ... resource allocation and other test preparation ... */
 247.780 -
 247.781 -        /* mandatory marker for the start of the tests */
 247.782 -        UCX_TEST_BEGIN
 247.783 -
 247.784 -        /*  ... verifications with UCX_TEST_ASSERT() ...
 247.785 -         * (and/or calls with UCX_TEST_CALL_SUBROUTINE())
 247.786 -         */
 247.787 -
 247.788 -        /* mandatory marker for the end of the tests */
 247.789 -        UCX_TEST_END
 247.790 -
 247.791 -        /* ... resource cleanup ...
 247.792 -         * (all code after UCX_TEST_END is always executed)
 247.793 -         */
 247.794 -    }
 247.795 -```
 247.796 -If you want to use the `UCX_TEST_ASSERT()` macro in a function, you are
 247.797 -*required* to use a `UCX_TEST_SUBROUTINE`.
 247.798 -Otherwise the testing framework does not know where to jump, when the assertion
 247.799 -fails.
 247.800 -
 247.801 -After implementing the tests, you can easily build a test suite and execute it:
 247.802 -```C
 247.803 -    UcxTestSuite* suite = ucx_test_suite_new();
 247.804 -    ucx_test_register(suite, testMyTestCase01);
 247.805 -    ucx_test_register(suite, testMyTestCase02);
 247.806 -    /* ... */
 247.807 -    ucx_test_run(suite, stdout); /* stdout, or any other FILE stream */
 247.808 -```
 247.809 -
 247.810 -## Utilities
 247.811 -
 247.812 -*Header file:* [utils.h](api/utils_8h.html)  
 247.813 -*Required modules:* [Allocator](#allocator), [String](#string)
 247.814 -
 247.815 -In this module we provide very general utility function for copy and compare
 247.816 -operations.
 247.817 -We also provide several `printf` variants to conveniently print formatted data
 247.818 -to streams or strings.
 247.819 -
 247.820 -### A simple copy program
 247.821 -
 247.822 -The utilities package provides several stream copy functions.
 247.823 -One of them has a very simple interface and can, for instance, be used to copy
 247.824 -whole files in a single call.
 247.825 -This is a minimal working example:
 247.826 -```C
 247.827 -#include <stdio.h>
 247.828 -#include <ucx/utils.h>
 247.829 -
 247.830 -int main(int argc, char** argv) {
 247.831 -
 247.832 -    if (argc != 3) {
 247.833 -        fprintf(stderr, "Use %s <src> <dest>", argv[0]);
 247.834 -        return 1;
 247.835 -    }
 247.836 -
 247.837 -    FILE *srcf = fopen(argv[1], "r");   /* insert error handling on your own */
 247.838 -    FILE *destf = fopen(argv[2], "w");
 247.839 -    
 247.840 -    size_t n =  ucx_stream_copy(srcf, destf, fread, fwrite);
 247.841 -    printf("%zu bytes copied.\n", n);
 247.842 -
 247.843 -    fclose(srcf);
 247.844 -    fclose(destf);
 247.845 -
 247.846 -
 247.847 -    return 0;
 247.848 -}
 247.849 -```
 247.850 -
 247.851 -### Automatic allocation for formatted strings
 247.852 -
 247.853 -The UCX utility function `ucx_asprintf()` and it's convenient shortcut
 247.854 -`ucx_sprintf` allow easy formatting of strings, without ever having to worry
 247.855 -about the required space.
 247.856 -```C
 247.857 -sstr_t mystring = ucx_sprintf("The answer is: %d!", 42);
 247.858 -```
 247.859 -Still, you have to pass `mystring.ptr` to `free()` (or the free function of
 247.860 -your allocator, if you use `ucx_asprintf`).
 247.861 -If you don't have all the information ready to build your string, you can even
 247.862 -use a [UcxBuffer](#buffer) as a target with the utility function
 247.863 -`ucx_bprintf()`.
 247.864 -```C
 247.865 -UcxBuffer* strbuffer = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND);
 247.866 -
 247.867 -for (unsigned int i = 2 ; i < 100 ; i++) {
 247.868 -        ucx_bprintf(strbuffer, "Integer %d is %s\n",
 247.869 -                        i, prime(i) ? "prime" : "not prime");
 247.870 -}
 247.871 -
 247.872 -/* print the result to stdout */
 247.873 -printf("%s", (char*)strbuffer->space);
 247.874 -
 247.875 -ucx_buffer_free(strbuffer);
 247.876 -```
   248.1 --- a/src/CMakeLists.txt	Mon Dec 30 09:54:10 2019 +0100
   248.2 +++ b/src/CMakeLists.txt	Sat Feb 06 19:11:44 2021 +0100
   248.3 @@ -1,34 +1,8 @@
   248.4  set(sources
   248.5 -        allocator.c
   248.6 -        array.c
   248.7 -        avl.c
   248.8 -        buffer.c
   248.9          list.c
  248.10 -        logging.c
  248.11 -        map.c
  248.12 -        mempool.c
  248.13 -        properties.c
  248.14 -        stack.c
  248.15 -        string.c
  248.16 -        test.c
  248.17 -        ucx.c
  248.18 -        utils.c
  248.19  )
  248.20  set(headers
  248.21 -        ucx/allocator.h
  248.22 -        ucx/array.h
  248.23 -        ucx/avl.h
  248.24 -        ucx/buffer.h
  248.25 -        ucx/list.h
  248.26 -        ucx/logging.h
  248.27 -        ucx/map.h
  248.28 -        ucx/mempool.h
  248.29 -        ucx/properties.h
  248.30 -        ucx/stack.h
  248.31 -        ucx/string.h
  248.32 -        ucx/test.h
  248.33 -        ucx/ucx.h
  248.34 -        ucx/utils.h
  248.35 +        cx/list.h
  248.36  )
  248.37  
  248.38  add_library(ucx SHARED ${sources})
  248.39 @@ -37,7 +11,7 @@
  248.40  target_include_directories(ucx PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
  248.41  target_include_directories(ucx_static PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
  248.42  
  248.43 -set_target_properties(ucx PROPERTIES SOVERSION 3 VERSION 3.1.0)
  248.44 +set_target_properties(ucx PROPERTIES SOVERSION 4 VERSION 4.0.0)
  248.45  set_target_properties(ucx_static PROPERTIES VERSION ${CMAKE_PROJECT_VERSION})
  248.46  
  248.47  # it is sufficient to specify the headers for one of the targets
   249.1 --- a/src/Makefile.am	Mon Dec 30 09:54:10 2019 +0100
   249.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   249.3 @@ -1,62 +0,0 @@
   249.4 -#
   249.5 -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   249.6 -#
   249.7 -# Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   249.8 -#
   249.9 -# Redistribution and use in source and binary forms, with or without
  249.10 -# modification, are permitted provided that the following conditions are met:
  249.11 -#
  249.12 -#   1. Redistributions of source code must retain the above copyright
  249.13 -#      notice, this list of conditions and the following disclaimer.
  249.14 -#
  249.15 -#   2. Redistributions in binary form must reproduce the above copyright
  249.16 -#      notice, this list of conditions and the following disclaimer in the
  249.17 -#      documentation and/or other materials provided with the distribution.
  249.18 -#
  249.19 -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  249.20 -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  249.21 -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  249.22 -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  249.23 -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  249.24 -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  249.25 -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  249.26 -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  249.27 -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  249.28 -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  249.29 -# POSSIBILITY OF SUCH DAMAGE.
  249.30 -#
  249.31 -
  249.32 -lib_LTLIBRARIES = libucx.la
  249.33 -libucx_la_LDFLAGS = -version-info $(UCX_LIB_VERSION)
  249.34 -libucx_la_SOURCES = utils.c
  249.35 -libucx_la_SOURCES += array.c
  249.36 -libucx_la_SOURCES += list.c
  249.37 -libucx_la_SOURCES += map.c
  249.38 -libucx_la_SOURCES += avl.c
  249.39 -libucx_la_SOURCES += properties.c
  249.40 -libucx_la_SOURCES += mempool.c
  249.41 -libucx_la_SOURCES += string.c
  249.42 -libucx_la_SOURCES += test.c
  249.43 -libucx_la_SOURCES += allocator.c
  249.44 -libucx_la_SOURCES += logging.c
  249.45 -libucx_la_SOURCES += buffer.c
  249.46 -libucx_la_SOURCES += stack.c
  249.47 -libucx_la_SOURCES += ucx.c
  249.48 -
  249.49 -ucxdir = $(includedir)/ucx
  249.50 -ucx_HEADERS = ucx/allocator.h
  249.51 -ucx_HEADERS += ucx/array.h
  249.52 -ucx_HEADERS += ucx/avl.h
  249.53 -ucx_HEADERS += ucx/buffer.h
  249.54 -ucx_HEADERS += ucx/list.h
  249.55 -ucx_HEADERS += ucx/logging.h
  249.56 -ucx_HEADERS += ucx/map.h
  249.57 -ucx_HEADERS += ucx/mempool.h
  249.58 -ucx_HEADERS += ucx/properties.h
  249.59 -ucx_HEADERS += ucx/stack.h
  249.60 -ucx_HEADERS += ucx/string.h
  249.61 -ucx_HEADERS += ucx/test.h
  249.62 -ucx_HEADERS += ucx/ucx.h
  249.63 -ucx_HEADERS += ucx/utils.h
  249.64 -
  249.65 -
   250.1 --- a/src/allocator.c	Mon Dec 30 09:54:10 2019 +0100
   250.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   250.3 @@ -1,60 +0,0 @@
   250.4 -/*
   250.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   250.6 - *
   250.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   250.8 - *
   250.9 - * Redistribution and use in source and binary forms, with or without
  250.10 - * modification, are permitted provided that the following conditions are met:
  250.11 - *
  250.12 - *   1. Redistributions of source code must retain the above copyright
  250.13 - *      notice, this list of conditions and the following disclaimer.
  250.14 - *
  250.15 - *   2. Redistributions in binary form must reproduce the above copyright
  250.16 - *      notice, this list of conditions and the following disclaimer in the
  250.17 - *      documentation and/or other materials provided with the distribution.
  250.18 - *
  250.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  250.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  250.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  250.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  250.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  250.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  250.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  250.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  250.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  250.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  250.29 - * POSSIBILITY OF SUCH DAMAGE.
  250.30 - */
  250.31 -
  250.32 -#include "ucx/allocator.h"
  250.33 -
  250.34 -#include <stdlib.h>
  250.35 -
  250.36 -static UcxAllocator default_allocator = {
  250.37 -    NULL,
  250.38 -    ucx_default_malloc,
  250.39 -    ucx_default_calloc,
  250.40 -    ucx_default_realloc,
  250.41 -    ucx_default_free
  250.42 -};
  250.43 -
  250.44 -UcxAllocator *ucx_default_allocator() {
  250.45 -    UcxAllocator *allocator = &default_allocator;
  250.46 -    return allocator;
  250.47 -}
  250.48 -
  250.49 -void *ucx_default_malloc(void *ignore, size_t n) {
  250.50 -    return malloc(n);
  250.51 -}
  250.52 -
  250.53 -void *ucx_default_calloc(void *ignore, size_t n, size_t size) {
  250.54 -    return calloc(n, size);
  250.55 -}
  250.56 -
  250.57 -void *ucx_default_realloc(void *ignore, void *data, size_t n) {
  250.58 -    return realloc(data, n);
  250.59 -}
  250.60 -
  250.61 -void ucx_default_free(void *ignore, void *data) {
  250.62 -    free(data);
  250.63 -}
   251.1 --- a/src/array.c	Mon Dec 30 09:54:10 2019 +0100
   251.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   251.3 @@ -1,467 +0,0 @@
   251.4 -/*
   251.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   251.6 - *
   251.7 - * Copyright 2019 Mike Becker, Olaf Wintermann All rights reserved.
   251.8 - *
   251.9 - * Redistribution and use in source and binary forms, with or without
  251.10 - * modification, are permitted provided that the following conditions are met:
  251.11 - *
  251.12 - *   1. Redistributions of source code must retain the above copyright
  251.13 - *      notice, this list of conditions and the following disclaimer.
  251.14 - *
  251.15 - *   2. Redistributions in binary form must reproduce the above copyright
  251.16 - *      notice, this list of conditions and the following disclaimer in the
  251.17 - *      documentation and/or other materials provided with the distribution.
  251.18 - *
  251.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  251.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  251.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  251.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  251.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  251.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  251.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  251.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  251.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  251.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  251.29 - * POSSIBILITY OF SUCH DAMAGE.
  251.30 - */
  251.31 -
  251.32 -#define _GNU_SOURCE /* we want to use qsort_r(), if available */
  251.33 -#define __STDC_WANT_LIB_EXT1__ 1 /* use qsort_s, if available */
  251.34 -
  251.35 -
  251.36 -#include "ucx/array.h"
  251.37 -#include "ucx/utils.h"
  251.38 -
  251.39 -#include <string.h>
  251.40 -#include <stdlib.h>
  251.41 -#include <errno.h>
  251.42 -
  251.43 -#ifndef UCX_ARRAY_DISABLE_QSORT
  251.44 -#ifdef __GLIBC__
  251.45 -#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8)
  251.46 -#define ucx_array_sort_impl qsort_r
  251.47 -#endif /* glibc version >= 2.8 */
  251.48 -#elif /* not  __GLIBC__ */ defined(__APPLE__) || defined(__FreeBSD__)
  251.49 -#define ucx_array_sort_impl ucx_qsort_r
  251.50 -#define USE_UCX_QSORT_R
  251.51 -#elif /* not (__APPLE || __FreeBSD__) */ defined(__sun)
  251.52 -#if __STDC_VERSION__ >= 201112L
  251.53 -#define ucx_array_sort_impl qsort_s
  251.54 -#endif
  251.55 -#endif /* __GLIBC__, __APLE__, __FreeBSD__, __sun */
  251.56 -#endif /* UCX_ARRAY_DISABLE_QSORT */
  251.57 -
  251.58 -#ifndef ucx_array_sort_impl
  251.59 -#define ucx_array_sort_impl ucx_mergesort
  251.60 -#endif
  251.61 -
  251.62 -static int ucx_array_ensurecap(UcxArray *array, size_t reqcap) {
  251.63 -    size_t required_capacity = array->capacity;
  251.64 -    while (reqcap > required_capacity) {
  251.65 -        if (required_capacity * 2 < required_capacity)
  251.66 -            return 1;
  251.67 -        required_capacity <<= 1;
  251.68 -    }
  251.69 -    if (ucx_array_reserve(array, required_capacity)) {
  251.70 -        return 1;
  251.71 -    }
  251.72 -    return 0;
  251.73 -}
  251.74 -
  251.75 -int ucx_array_util_set_a(UcxAllocator* alloc, void** array, size_t* capacity,
  251.76 -    size_t elmsize, size_t index, void* data) {
  251.77 -    
  251.78 -    if(!alloc || !capacity || !array) {
  251.79 -        errno = EINVAL;
  251.80 -        return 1;
  251.81 -    }
  251.82 -    
  251.83 -    size_t newcapacity = *capacity;
  251.84 -    while(index >= newcapacity) {
  251.85 -        if(ucx_szmul(newcapacity, 2, &newcapacity)) {
  251.86 -            errno = EOVERFLOW;
  251.87 -            return 1;
  251.88 -        }        
  251.89 -    }
  251.90 -
  251.91 -    size_t memlen, offset;
  251.92 -    if(ucx_szmul(newcapacity, elmsize, &memlen)) {
  251.93 -        errno = EOVERFLOW;
  251.94 -        return 1;
  251.95 -    }
  251.96 -    /* we don't need to check index*elmsize - it is smaller than memlen */
  251.97 -    
  251.98 -    
  251.99 -    void* newptr = alrealloc(alloc, *array, memlen);
 251.100 -    if(newptr == NULL) {
 251.101 -        errno = ENOMEM; /* we cannot assume that every allocator sets this */
 251.102 -        return 1;
 251.103 -    }
 251.104 -    *array = newptr;
 251.105 -    *capacity = newcapacity;
 251.106 -    
 251.107 -    
 251.108 -    char* dest = *array;
 251.109 -    dest += elmsize*index;
 251.110 -    memcpy(dest, data, elmsize);
 251.111 -    
 251.112 -    return 0;
 251.113 -}
 251.114 -
 251.115 -int ucx_array_util_setptr_a(UcxAllocator* alloc, void** array, size_t* capacity,
 251.116 -    size_t index, void* data) {
 251.117 -    
 251.118 -    return ucx_array_util_set_a(alloc, array, capacity, sizeof(void*),
 251.119 -            index, &data);
 251.120 -}
 251.121 -
 251.122 -UcxArray* ucx_array_new(size_t capacity, size_t elemsize) {
 251.123 -    return ucx_array_new_a(capacity, elemsize, ucx_default_allocator());
 251.124 -}
 251.125 -
 251.126 -UcxArray* ucx_array_new_a(size_t capacity, size_t elemsize,
 251.127 -        UcxAllocator* allocator) {
 251.128 -    UcxArray* array = almalloc(allocator, sizeof(UcxArray));
 251.129 -    if(array) {
 251.130 -        ucx_array_init_a(array, capacity, elemsize, allocator);
 251.131 -    }
 251.132 -    return array;
 251.133 -}
 251.134 -
 251.135 -void ucx_array_init(UcxArray* array, size_t capacity, size_t elemsize) {
 251.136 -    ucx_array_init_a(array, capacity, elemsize, ucx_default_allocator());
 251.137 -}
 251.138 -
 251.139 -void ucx_array_init_a(UcxArray* array, size_t capacity, size_t elemsize,
 251.140 -        UcxAllocator* allocator) {
 251.141 -    
 251.142 -    array->allocator = allocator;
 251.143 -    array->elemsize = elemsize;
 251.144 -    array->size = 0;
 251.145 -    array->data = alcalloc(allocator, capacity, elemsize);
 251.146 -    
 251.147 -    if (array->data) {
 251.148 -        array->capacity = capacity;
 251.149 -    } else {
 251.150 -        array->capacity = 0;
 251.151 -    }
 251.152 -}
 251.153 -
 251.154 -int ucx_array_clone(UcxArray* dest, UcxArray const* src) {
 251.155 -    if (ucx_array_ensurecap(dest, src->capacity)) {
 251.156 -        return 1;
 251.157 -    }
 251.158 -    
 251.159 -    dest->elemsize = src->elemsize;
 251.160 -    dest->size = src->size;
 251.161 -    
 251.162 -    if (dest->data) {
 251.163 -        memcpy(dest->data, src->data, src->size*src->elemsize);
 251.164 -    }
 251.165 -    
 251.166 -    return 0;
 251.167 -}
 251.168 -
 251.169 -int ucx_array_equals(UcxArray const *array1, UcxArray const *array2,
 251.170 -        cmp_func cmpfnc, void* data) {
 251.171 -    
 251.172 -    if (array1->size != array2->size || array1->elemsize != array2->elemsize) {
 251.173 -        return 0;
 251.174 -    } else {
 251.175 -        if (array1->size == 0)
 251.176 -            return 1;
 251.177 -        
 251.178 -        size_t elemsize;
 251.179 -        if (cmpfnc == NULL) {
 251.180 -            cmpfnc = ucx_cmp_mem;
 251.181 -            elemsize = array1->elemsize;
 251.182 -            data = &elemsize;
 251.183 -        }
 251.184 -        
 251.185 -        for (size_t i = 0 ; i < array1->size ; i++) {
 251.186 -            int r = cmpfnc(
 251.187 -                    ucx_array_at(array1, i),
 251.188 -                    ucx_array_at(array2, i),
 251.189 -                    data);
 251.190 -            if (r != 0)
 251.191 -                return 0;
 251.192 -        }
 251.193 -        return 1;
 251.194 -    }
 251.195 -}
 251.196 -
 251.197 -void ucx_array_destroy(UcxArray *array) {
 251.198 -    if(array->data)
 251.199 -        alfree(array->allocator, array->data);
 251.200 -    array->data = NULL;
 251.201 -    array->capacity = array->size = 0;
 251.202 -}
 251.203 -
 251.204 -void ucx_array_free(UcxArray *array) {
 251.205 -    ucx_array_destroy(array);
 251.206 -    alfree(array->allocator, array);
 251.207 -}
 251.208 -
 251.209 -int ucx_array_append_from(UcxArray *array, void *data, size_t count) {
 251.210 -    if (ucx_array_ensurecap(array, array->size + count))
 251.211 -        return 1;
 251.212 -    
 251.213 -    void* dest = ucx_array_at(array, array->size);
 251.214 -    if (data) {
 251.215 -        memcpy(dest, data, array->elemsize*count);
 251.216 -    } else {
 251.217 -        memset(dest, 0, array->elemsize*count);
 251.218 -    }
 251.219 -    array->size += count;
 251.220 -    
 251.221 -    return 0;
 251.222 -}
 251.223 -
 251.224 -int ucx_array_prepend_from(UcxArray *array, void *data, size_t count) {
 251.225 -    if (ucx_array_ensurecap(array, array->size + count))
 251.226 -        return 1;
 251.227 -    
 251.228 -    if (array->size > 0) {
 251.229 -        void *dest = ucx_array_at(array, count);
 251.230 -        memmove(dest, array->data, array->elemsize*array->size);
 251.231 -    }
 251.232 -    
 251.233 -    if (data) {
 251.234 -        memcpy(array->data, data, array->elemsize*count);
 251.235 -    } else {
 251.236 -        memset(array->data, 0, array->elemsize*count);
 251.237 -    }
 251.238 -    array->size += count;
 251.239 -        
 251.240 -    return 0;
 251.241 -}
 251.242 -
 251.243 -int ucx_array_set_from(UcxArray *array, size_t index,
 251.244 -        void *data, size_t count) {
 251.245 -    if (ucx_array_ensurecap(array, index + count))
 251.246 -        return 1;
 251.247 -    
 251.248 -    if (index+count > array->size) {
 251.249 -        array->size = index+count;
 251.250 -    }
 251.251 -    
 251.252 -    void *dest = ucx_array_at(array, index);
 251.253 -    if (data) {
 251.254 -        memcpy(dest, data, array->elemsize*count);
 251.255 -    } else {
 251.256 -        memset(dest, 0, array->elemsize*count);
 251.257 -    }
 251.258 -    
 251.259 -    return 0;
 251.260 -}
 251.261 -
 251.262 -int ucx_array_concat(UcxArray *array1, const UcxArray *array2) {
 251.263 -    
 251.264 -    if (array1->elemsize != array2->elemsize)
 251.265 -        return 1;
 251.266 -    
 251.267 -    size_t capacity = array1->capacity+array2->capacity;
 251.268 -        
 251.269 -    if (array1->capacity < capacity) {
 251.270 -        if (ucx_array_reserve(array1, capacity)) {
 251.271 -            return 1;
 251.272 -        }
 251.273 -    }
 251.274 -    
 251.275 -    void* dest = ucx_array_at(array1, array1->size);
 251.276 -    memcpy(dest, array2->data, array2->size*array2->elemsize);
 251.277 -    
 251.278 -    array1->size += array2->size;
 251.279 -    
 251.280 -    return 0;
 251.281 -}
 251.282 -
 251.283 -void *ucx_array_at(UcxArray const *array, size_t index) {
 251.284 -    char* memory = array->data;
 251.285 -    char* loc = memory + index*array->elemsize;
 251.286 -    return loc;
 251.287 -}
 251.288 -
 251.289 -size_t ucx_array_find(UcxArray const *array, void *elem,
 251.290 -        cmp_func cmpfnc, void *data) {
 251.291 -    
 251.292 -    size_t elemsize;
 251.293 -    if (cmpfnc == NULL) {
 251.294 -        cmpfnc = ucx_cmp_mem;
 251.295 -        elemsize = array->elemsize;
 251.296 -        data = &elemsize;
 251.297 -    }
 251.298 -
 251.299 -    if (array->size > 0) {
 251.300 -        for (size_t i = 0 ; i < array->size ; i++) {
 251.301 -            void* ptr = ucx_array_at(array, i);
 251.302 -            if (cmpfnc(ptr, elem, data) == 0) {
 251.303 -                return i;
 251.304 -            }
 251.305 -        }
 251.306 -        return array->size;
 251.307 -    } else {
 251.308 -        return 0;
 251.309 -    }
 251.310 -}
 251.311 -
 251.312 -int ucx_array_contains(UcxArray const *array, void *elem,
 251.313 -        cmp_func cmpfnc, void *data) {
 251.314 -    return ucx_array_find(array, elem, cmpfnc, data) != array->size;
 251.315 -}
 251.316 -
 251.317 -static void ucx_mergesort_merge(void *arrdata,size_t elemsize,
 251.318 -        cmp_func cmpfnc, void *data,
 251.319 -        size_t start, size_t mid, size_t end) { 
 251.320 -    
 251.321 -    char* array = arrdata;
 251.322 -    
 251.323 -    size_t rightstart = mid + 1; 
 251.324 -  
 251.325 -    if (cmpfnc(array + mid*elemsize,
 251.326 -            array + rightstart*elemsize, data) <= 0) {
 251.327 -        /* already sorted */
 251.328 -        return;
 251.329 -    }
 251.330 -  
 251.331 -    /* we need memory for one element */
 251.332 -    void *value = malloc(elemsize);
 251.333 -    
 251.334 -    while (start <= mid && rightstart <= end) { 
 251.335 -        if (cmpfnc(array + start*elemsize,
 251.336 -                array + rightstart*elemsize, data) <= 0) { 
 251.337 -            start++; 
 251.338 -        } else {
 251.339 -            /* save the value from the right */
 251.340 -            memcpy(value, array + rightstart*elemsize, elemsize);
 251.341 -                        
 251.342 -            /* shift all left elements one element to the right */
 251.343 -            size_t shiftcount = rightstart-start;
 251.344 -            void *startptr = array + start*elemsize;
 251.345 -            void *dest = array + (start+1)*elemsize;
 251.346 -            memmove(dest, startptr, shiftcount*elemsize);
 251.347 -            
 251.348 -            /* bring the first value from the right to the left */
 251.349 -            memcpy(startptr, value, elemsize);
 251.350 -  
 251.351 -            start++; 
 251.352 -            mid++; 
 251.353 -            rightstart++; 
 251.354 -        }
 251.355 -    }
 251.356 -    
 251.357 -    /* free the temporary memory */
 251.358 -    free(value);
 251.359 -} 
 251.360 -  
 251.361 -static void ucx_mergesort_impl(void *arrdata, size_t elemsize,
 251.362 -        cmp_func cmpfnc, void *data, size_t l, size_t r) { 
 251.363 -    if (l < r) {
 251.364 -        size_t m = l + (r - l) / 2; 
 251.365 -  
 251.366 -        ucx_mergesort_impl(arrdata, elemsize, cmpfnc, data, l, m); 
 251.367 -        ucx_mergesort_impl(arrdata, elemsize, cmpfnc, data, m + 1, r); 
 251.368 -        ucx_mergesort_merge(arrdata, elemsize, cmpfnc, data, l, m, r);
 251.369 -    } 
 251.370 -}
 251.371 -
 251.372 -static void ucx_mergesort(void *arrdata, size_t count, size_t elemsize,
 251.373 -        cmp_func cmpfnc, void *data) {
 251.374 -    
 251.375 -    ucx_mergesort_impl(arrdata, elemsize, cmpfnc, data, 0, count-1);
 251.376 -}
 251.377 -
 251.378 -#ifdef USE_UCX_QSORT_R
 251.379 -struct cmpfnc_swapargs_info {
 251.380 -    cmp_func func;
 251.381 -    void *data;
 251.382 -};
 251.383 -
 251.384 -static int cmp_func_swap_args(void *data, const void *x, const void *y) {
 251.385 -    struct cmpfnc_swapargs_info* info = data;
 251.386 -    return info->func(x, y, info->data);
 251.387 -}
 251.388 -
 251.389 -static void ucx_qsort_r(void *array, size_t count, size_t elemsize,
 251.390 -		     cmp_func cmpfnc, void *data) {
 251.391 -    struct cmpfnc_swapargs_info info;
 251.392 -    info.func = cmpfnc;
 251.393 -    info.data = data;
 251.394 -    qsort_r(array, count, elemsize, &info, cmp_func_swap_args);
 251.395 -}
 251.396 -#endif /* USE_UCX_QSORT_R */
 251.397 -
 251.398 -void ucx_array_sort(UcxArray* array, cmp_func cmpfnc, void *data) {
 251.399 -    ucx_array_sort_impl(array->data, array->size, array->elemsize,
 251.400 -            cmpfnc, data);
 251.401 -}
 251.402 -
 251.403 -void ucx_array_remove(UcxArray *array, size_t index) {
 251.404 -    array->size--;
 251.405 -    if (index < array->size) {
 251.406 -        void* dest = ucx_array_at(array, index);
 251.407 -        void* src = ucx_array_at(array, index+1);
 251.408 -        memmove(dest, src, (array->size - index)*array->elemsize);
 251.409 -    }
 251.410 -}
 251.411 -
 251.412 -void ucx_array_remove_fast(UcxArray *array, size_t index) {
 251.413 -    array->size--;
 251.414 -    if (index < array->size) {       
 251.415 -        void* dest = ucx_array_at(array, index);
 251.416 -        void* src = ucx_array_at(array, array->size);
 251.417 -        memcpy(dest, src, array->elemsize);
 251.418 -    }
 251.419 -}
 251.420 -
 251.421 -int ucx_array_shrink(UcxArray* array) {
 251.422 -    void* newptr = alrealloc(array->allocator, array->data,
 251.423 -                array->size*array->elemsize);
 251.424 -    if (newptr) {
 251.425 -        array->data = newptr;
 251.426 -        array->capacity = array->size;
 251.427 -        return 0;
 251.428 -    } else {
 251.429 -        return 1;
 251.430 -    }
 251.431 -}
 251.432 -
 251.433 -int ucx_array_resize(UcxArray* array, size_t capacity) {
 251.434 -    if (array->capacity >= capacity) {
 251.435 -        void* newptr = alrealloc(array->allocator, array->data,
 251.436 -                capacity*array->elemsize);
 251.437 -        if (newptr) {
 251.438 -            array->data = newptr;
 251.439 -            array->capacity = capacity;
 251.440 -            if (array->size > array->capacity) {
 251.441 -                array->size = array->capacity;
 251.442 -            }
 251.443 -            return 0;
 251.444 -        } else {
 251.445 -            return 1;
 251.446 -        }
 251.447 -    } else {
 251.448 -        return ucx_array_reserve(array, capacity);
 251.449 -    }
 251.450 -}
 251.451 -
 251.452 -int ucx_array_reserve(UcxArray* array, size_t capacity) {
 251.453 -    if (array->capacity > capacity) {
 251.454 -        return 0;
 251.455 -    } else {
 251.456 -        void* newptr = alrealloc(array->allocator, array->data,
 251.457 -                capacity*array->elemsize);
 251.458 -        if (newptr) {
 251.459 -            array->data = newptr;
 251.460 -            array->capacity = capacity;
 251.461 -            return 0;
 251.462 -        } else {
 251.463 -            return 1;
 251.464 -        }
 251.465 -    }
 251.466 -}
 251.467 -
 251.468 -int ucx_array_grow(UcxArray* array, size_t count) {
 251.469 -    return ucx_array_reserve(array, array->size+count);
 251.470 -}
   252.1 --- a/src/avl.c	Mon Dec 30 09:54:10 2019 +0100
   252.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   252.3 @@ -1,373 +0,0 @@
   252.4 -/*
   252.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   252.6 - *
   252.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   252.8 - *
   252.9 - * Redistribution and use in source and binary forms, with or without
  252.10 - * modification, are permitted provided that the following conditions are met:
  252.11 - *
  252.12 - *   1. Redistributions of source code must retain the above copyright
  252.13 - *      notice, this list of conditions and the following disclaimer.
  252.14 - *
  252.15 - *   2. Redistributions in binary form must reproduce the above copyright
  252.16 - *      notice, this list of conditions and the following disclaimer in the
  252.17 - *      documentation and/or other materials provided with the distribution.
  252.18 - *
  252.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  252.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  252.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  252.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  252.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  252.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  252.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  252.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  252.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  252.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  252.29 - * POSSIBILITY OF SUCH DAMAGE.
  252.30 - */
  252.31 -
  252.32 -#include "ucx/avl.h"
  252.33 -
  252.34 -#include <limits.h>
  252.35 -
  252.36 -#define ptrcast(ptr) ((void*)(ptr))
  252.37 -#define alloc_tree(al) (UcxAVLTree*) almalloc((al), sizeof(UcxAVLTree))
  252.38 -#define alloc_node(al) (UcxAVLNode*) almalloc((al), sizeof(UcxAVLNode))
  252.39 -
  252.40 -static void ucx_avl_connect(UcxAVLTree *tree,
  252.41 -        UcxAVLNode *node, UcxAVLNode *child, intptr_t nullkey) {
  252.42 -    if (child) {
  252.43 -        child->parent = node;
  252.44 -    }
  252.45 -    // if child is NULL, nullkey decides if left or right pointer is cleared
  252.46 -    if (tree->cmpfunc(
  252.47 -        ptrcast(child ? child->key : nullkey),
  252.48 -        ptrcast(node->key), tree->userdata) > 0) {
  252.49 -      node->right = child;
  252.50 -    } else {
  252.51 -      node->left = child;
  252.52 -    }
  252.53 -    size_t lh = node->left ? node->left->height : 0;
  252.54 -    size_t rh = node->right ? node->right->height : 0;
  252.55 -    node->height = 1 + (lh > rh ? lh : rh);
  252.56 -}
  252.57 -
  252.58 -#define avlheight(node) ((node) ? (node)->height : 0)
  252.59 -
  252.60 -static UcxAVLNode* avl_rotright(UcxAVLTree *tree, UcxAVLNode *l0) {
  252.61 -    UcxAVLNode *p = l0->parent;
  252.62 -    UcxAVLNode *l1 = l0->left;
  252.63 -    if (p) {
  252.64 -        ucx_avl_connect(tree, p, l1, 0);
  252.65 -    } else {
  252.66 -        l1->parent = NULL;
  252.67 -    }
  252.68 -    ucx_avl_connect(tree, l0, l1->right, l1->key);
  252.69 -    ucx_avl_connect(tree, l1, l0, 0);
  252.70 -    return l1;
  252.71 -}
  252.72 -
  252.73 -static UcxAVLNode* avl_rotleft(UcxAVLTree *tree, UcxAVLNode *l0) {
  252.74 -    UcxAVLNode *p = l0->parent;
  252.75 -    UcxAVLNode *l1 = l0->right;
  252.76 -    if (p) {
  252.77 -        ucx_avl_connect(tree, p, l1, 0);
  252.78 -    } else {
  252.79 -        l1->parent = NULL;
  252.80 -    }
  252.81 -    ucx_avl_connect(tree, l0, l1->left, l1->key);
  252.82 -    ucx_avl_connect(tree, l1, l0, 0);
  252.83 -    return l1;
  252.84 -}
  252.85 -
  252.86 -static void ucx_avl_balance(UcxAVLTree *tree, UcxAVLNode *n) {
  252.87 -    int lh = avlheight(n->left);
  252.88 -    int rh = avlheight(n->right);
  252.89 -    n->height = 1 + (lh > rh ? lh : rh);
  252.90 -    
  252.91 -    if (lh - rh == 2) {
  252.92 -      UcxAVLNode *c = n->left;
  252.93 -      if (avlheight(c->right) - avlheight(c->left) == 1) {
  252.94 -        avl_rotleft(tree, c);
  252.95 -      }
  252.96 -      n = avl_rotright(tree, n);
  252.97 -    } else if (rh - lh == 2) {  
  252.98 -      UcxAVLNode *c = n->right;
  252.99 -      if (avlheight(c->left) - avlheight(c->right) == 1) {
 252.100 -        avl_rotright(tree, c);
 252.101 -      }
 252.102 -      n = avl_rotleft(tree, n);
 252.103 -    }
 252.104 -
 252.105 -    if (n->parent) {
 252.106 -      ucx_avl_balance(tree, n->parent);
 252.107 -    } else {
 252.108 -      tree->root = n;
 252.109 -    }
 252.110 -}
 252.111 -
 252.112 -UcxAVLTree *ucx_avl_new(cmp_func cmpfunc) {
 252.113 -    return ucx_avl_new_a(cmpfunc, ucx_default_allocator());
 252.114 -}
 252.115 -
 252.116 -UcxAVLTree *ucx_avl_new_a(cmp_func cmpfunc, UcxAllocator *allocator) {
 252.117 -    UcxAVLTree* tree = alloc_tree(allocator);
 252.118 -    if (tree) {
 252.119 -        tree->allocator = allocator;
 252.120 -        tree->cmpfunc = cmpfunc;
 252.121 -        tree->root = NULL;
 252.122 -        tree->userdata = NULL;
 252.123 -    }
 252.124 -    
 252.125 -    return tree;
 252.126 -}
 252.127 -
 252.128 -static void ucx_avl_free_node(UcxAllocator *al, UcxAVLNode *node) {
 252.129 -    if (node) {
 252.130 -        ucx_avl_free_node(al, node->left);
 252.131 -        ucx_avl_free_node(al, node->right);
 252.132 -        alfree(al, node);
 252.133 -    }
 252.134 -}
 252.135 -
 252.136 -void ucx_avl_free(UcxAVLTree *tree) {
 252.137 -    UcxAllocator *al = tree->allocator;
 252.138 -    ucx_avl_free_node(al, tree->root);
 252.139 -    alfree(al, tree);
 252.140 -}
 252.141 -
 252.142 -static void ucx_avl_free_content_node(UcxAllocator *al, UcxAVLNode *node,
 252.143 -        ucx_destructor destr) {
 252.144 -    if (node) {
 252.145 -        ucx_avl_free_content_node(al, node->left, destr);
 252.146 -        ucx_avl_free_content_node(al, node->right, destr);
 252.147 -        if (destr) {
 252.148 -            destr(node->value);
 252.149 -        } else {
 252.150 -            alfree(al, node->value);
 252.151 -        }
 252.152 -    }
 252.153 -}
 252.154 -
 252.155 -void ucx_avl_free_content(UcxAVLTree *tree, ucx_destructor destr) {
 252.156 -    ucx_avl_free_content_node(tree->allocator, tree->root, destr);
 252.157 -}
 252.158 -
 252.159 -UcxAVLNode *ucx_avl_get_node(UcxAVLTree *tree, intptr_t key) {
 252.160 -    UcxAVLNode *n = tree->root;
 252.161 -    int cmpresult;
 252.162 -    while (n && (cmpresult = tree->cmpfunc(
 252.163 -            ptrcast(key), ptrcast(n->key), tree->userdata))) {
 252.164 -        n = cmpresult > 0 ? n->right : n->left;
 252.165 -    }
 252.166 -    return n;
 252.167 -}
 252.168 -
 252.169 -void *ucx_avl_get(UcxAVLTree *tree, intptr_t key) {
 252.170 -    UcxAVLNode *n = ucx_avl_get_node(tree, key);
 252.171 -    return n ? n->value : NULL;
 252.172 -}
 252.173 -
 252.174 -UcxAVLNode *ucx_avl_find_node(UcxAVLTree *tree, intptr_t key,
 252.175 -        distance_func dfnc, int mode) {
 252.176 -    UcxAVLNode *n = tree->root;
 252.177 -    UcxAVLNode *closest = NULL;
 252.178 -
 252.179 -    intmax_t cmpresult;
 252.180 -    intmax_t closest_dist;
 252.181 -    closest_dist = mode == UCX_AVL_FIND_LOWER_BOUNDED ? INTMAX_MIN : INTMAX_MAX;
 252.182 -    
 252.183 -    while (n && (cmpresult = dfnc(
 252.184 -            ptrcast(key), ptrcast(n->key), tree->userdata))) {
 252.185 -        if (mode == UCX_AVL_FIND_CLOSEST) {
 252.186 -            intmax_t dist = cmpresult;
 252.187 -            if (dist < 0) dist *= -1;
 252.188 -            if (dist < closest_dist) {
 252.189 -                closest_dist = dist;
 252.190 -                closest = n;
 252.191 -            }
 252.192 -        } else if (mode == UCX_AVL_FIND_LOWER_BOUNDED && cmpresult <= 0) {
 252.193 -            if (cmpresult > closest_dist) {
 252.194 -                closest_dist = cmpresult;
 252.195 -                closest = n;
 252.196 -            }
 252.197 -        } else if (mode == UCX_AVL_FIND_UPPER_BOUNDED && cmpresult >= 0) {
 252.198 -            if (cmpresult < closest_dist) {
 252.199 -                closest_dist = cmpresult;
 252.200 -                closest = n;
 252.201 -            }
 252.202 -        }
 252.203 -        n = cmpresult > 0 ? n->right : n->left;
 252.204 -    }
 252.205 -    return n ? n : closest;
 252.206 -}
 252.207 -
 252.208 -void *ucx_avl_find(UcxAVLTree *tree, intptr_t key,
 252.209 -        distance_func dfnc, int mode) {
 252.210 -    UcxAVLNode *n = ucx_avl_find_node(tree, key, dfnc, mode);
 252.211 -    return n ? n->value : NULL;
 252.212 -}
 252.213 -
 252.214 -int ucx_avl_put(UcxAVLTree *tree, intptr_t key, void *value) {
 252.215 -    return ucx_avl_put_s(tree, key, value, NULL);
 252.216 -}
 252.217 -
 252.218 -int ucx_avl_put_s(UcxAVLTree *tree, intptr_t key, void *value,
 252.219 -        void **oldvalue) {
 252.220 -    if (tree->root) {
 252.221 -        UcxAVLNode *n = tree->root;
 252.222 -        int cmpresult;
 252.223 -        while ((cmpresult = tree->cmpfunc(
 252.224 -                ptrcast(key), ptrcast(n->key), tree->userdata))) {
 252.225 -            UcxAVLNode *m = cmpresult > 0 ? n->right : n->left;
 252.226 -            if (m) {
 252.227 -                n = m;
 252.228 -            } else {
 252.229 -                break;
 252.230 -            }
 252.231 -        }
 252.232 -
 252.233 -        if (cmpresult) {
 252.234 -            UcxAVLNode* e = alloc_node(tree->allocator);
 252.235 -            if (e) {
 252.236 -                e->key = key; e->value = value; e->height = 1;
 252.237 -                e->parent = e->left = e->right = NULL;
 252.238 -                ucx_avl_connect(tree, n, e, 0);
 252.239 -                ucx_avl_balance(tree, n);
 252.240 -                return 0;
 252.241 -            } else {
 252.242 -                return 1;
 252.243 -            }
 252.244 -        } else {
 252.245 -            if (oldvalue) {
 252.246 -                *oldvalue = n->value;
 252.247 -            }
 252.248 -            n->value = value;
 252.249 -            return 0;
 252.250 -        }
 252.251 -    } else {
 252.252 -        tree->root = alloc_node(tree->allocator);
 252.253 -        if (tree->root) {
 252.254 -            tree->root->key = key; tree->root->value = value;
 252.255 -            tree->root->height = 1;
 252.256 -            tree->root->parent = tree->root->left = tree->root->right = NULL;
 252.257 -            
 252.258 -            if (oldvalue) {
 252.259 -                *oldvalue = NULL;
 252.260 -            }
 252.261 -            
 252.262 -            return 0;
 252.263 -        } else {
 252.264 -            return 1;
 252.265 -        }
 252.266 -    }
 252.267 -}
 252.268 -
 252.269 -int ucx_avl_remove(UcxAVLTree *tree, intptr_t key) {
 252.270 -    return ucx_avl_remove_s(tree, key, NULL, NULL);
 252.271 -}
 252.272 -    
 252.273 -int ucx_avl_remove_node(UcxAVLTree *tree, UcxAVLNode *node) {
 252.274 -    return ucx_avl_remove_s(tree, node->key, NULL, NULL);
 252.275 -}
 252.276 -
 252.277 -int ucx_avl_remove_s(UcxAVLTree *tree, intptr_t key,
 252.278 -        intptr_t *oldkey, void **oldvalue) {
 252.279 -    
 252.280 -    UcxAVLNode *n = tree->root;
 252.281 -    int cmpresult;
 252.282 -    while (n && (cmpresult = tree->cmpfunc(
 252.283 -            ptrcast(key), ptrcast(n->key), tree->userdata))) {
 252.284 -        n = cmpresult > 0 ? n->right : n->left;
 252.285 -    }
 252.286 -    if (n) {
 252.287 -        if (oldkey) {
 252.288 -            *oldkey = n->key;
 252.289 -        }
 252.290 -        if (oldvalue) {
 252.291 -            *oldvalue = n->value;
 252.292 -        }
 252.293 -        
 252.294 -        UcxAVLNode *p = n->parent;
 252.295 -        if (n->left && n->right) {
 252.296 -            UcxAVLNode *s = n->right;
 252.297 -            while (s->left) {
 252.298 -                s = s->left;
 252.299 -            }
 252.300 -            ucx_avl_connect(tree, s->parent, s->right, s->key);
 252.301 -            n->key = s->key; n->value = s->value;
 252.302 -            p = s->parent;
 252.303 -            alfree(tree->allocator, s);
 252.304 -        } else {
 252.305 -            if (p) {
 252.306 -                ucx_avl_connect(tree, p, n->right ? n->right:n->left, n->key);
 252.307 -            } else {
 252.308 -                tree->root = n->right ? n->right : n->left;
 252.309 -                if (tree->root) {
 252.310 -                    tree->root->parent = NULL;
 252.311 -                }
 252.312 -            }
 252.313 -            alfree(tree->allocator, n);
 252.314 -        }
 252.315 -
 252.316 -        if (p) {
 252.317 -            ucx_avl_balance(tree, p);
 252.318 -        }
 252.319 -        
 252.320 -        return 0;
 252.321 -    } else {
 252.322 -        return 1;
 252.323 -    }
 252.324 -}
 252.325 -
 252.326 -static size_t ucx_avl_countn(UcxAVLNode *node) {
 252.327 -    if (node) {
 252.328 -        return 1 + ucx_avl_countn(node->left) + ucx_avl_countn(node->right);
 252.329 -    } else {
 252.330 -        return 0;
 252.331 -    }
 252.332 -}
 252.333 -
 252.334 -size_t ucx_avl_count(UcxAVLTree *tree) {
 252.335 -    return ucx_avl_countn(tree->root);
 252.336 -}
 252.337 -
 252.338 -UcxAVLNode* ucx_avl_pred(UcxAVLNode* node) {
 252.339 -    if (node->left) {
 252.340 -        UcxAVLNode* n = node->left;
 252.341 -        while (n->right) {
 252.342 -            n = n->right;
 252.343 -        }
 252.344 -        return n;
 252.345 -    } else {
 252.346 -        UcxAVLNode* n = node;
 252.347 -        while (n->parent) {
 252.348 -            if (n->parent->right == n) {
 252.349 -                return n->parent;
 252.350 -            } else {
 252.351 -                n = n->parent;
 252.352 -            }
 252.353 -        }
 252.354 -        return NULL;
 252.355 -    }
 252.356 -}
 252.357 -
 252.358 -UcxAVLNode* ucx_avl_succ(UcxAVLNode* node) {
 252.359 -    if (node->right) {
 252.360 -        UcxAVLNode* n = node->right;
 252.361 -        while (n->left) {
 252.362 -            n = n->left;
 252.363 -        }
 252.364 -        return n;
 252.365 -    } else {
 252.366 -        UcxAVLNode* n = node;
 252.367 -        while (n->parent) {
 252.368 -            if (n->parent->left == n) {
 252.369 -                return n->parent;
 252.370 -            } else {
 252.371 -                n = n->parent;
 252.372 -            }
 252.373 -        }
 252.374 -        return NULL;
 252.375 -    }
 252.376 -}
   253.1 --- a/src/buffer.c	Mon Dec 30 09:54:10 2019 +0100
   253.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   253.3 @@ -1,297 +0,0 @@
   253.4 -/*
   253.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   253.6 - *
   253.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   253.8 - *
   253.9 - * Redistribution and use in source and binary forms, with or without
  253.10 - * modification, are permitted provided that the following conditions are met:
  253.11 - *
  253.12 - *   1. Redistributions of source code must retain the above copyright
  253.13 - *      notice, this list of conditions and the following disclaimer.
  253.14 - *
  253.15 - *   2. Redistributions in binary form must reproduce the above copyright
  253.16 - *      notice, this list of conditions and the following disclaimer in the
  253.17 - *      documentation and/or other materials provided with the distribution.
  253.18 - *
  253.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  253.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  253.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  253.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  253.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  253.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  253.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  253.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  253.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  253.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  253.29 - * POSSIBILITY OF SUCH DAMAGE.
  253.30 - */
  253.31 -
  253.32 -#include "ucx/buffer.h"
  253.33 -
  253.34 -#include <stdarg.h>
  253.35 -#include <stdlib.h>
  253.36 -#include <string.h>
  253.37 -
  253.38 -UcxBuffer *ucx_buffer_new(void *space, size_t capacity, int flags) {
  253.39 -    UcxBuffer *buffer = (UcxBuffer*) malloc(sizeof(UcxBuffer));
  253.40 -    if (buffer) {
  253.41 -        buffer->flags = flags;
  253.42 -        if (!space) {
  253.43 -            buffer->space = (char*)malloc(capacity);
  253.44 -            if (!buffer->space) {
  253.45 -                free(buffer);
  253.46 -                return NULL;
  253.47 -            }
  253.48 -            memset(buffer->space, 0, capacity);
  253.49 -            buffer->flags |= UCX_BUFFER_AUTOFREE;
  253.50 -        } else {
  253.51 -            buffer->space = (char*)space;
  253.52 -        }
  253.53 -        buffer->capacity = capacity;
  253.54 -        buffer->size = 0;
  253.55 -
  253.56 -        buffer->pos = 0;
  253.57 -    }
  253.58 -
  253.59 -    return buffer;
  253.60 -}
  253.61 -
  253.62 -void ucx_buffer_free(UcxBuffer *buffer) {
  253.63 -    if ((buffer->flags & UCX_BUFFER_AUTOFREE) == UCX_BUFFER_AUTOFREE) {
  253.64 -        free(buffer->space);
  253.65 -    }
  253.66 -    free(buffer);
  253.67 -}
  253.68 -
  253.69 -UcxBuffer* ucx_buffer_extract(
  253.70 -        UcxBuffer *src, size_t start, size_t length, int flags) {
  253.71 -    if (src->size == 0 || length == 0 ||
  253.72 -        ((size_t)-1) - start < length || start+length > src->capacity)
  253.73 -    {
  253.74 -        return NULL;
  253.75 -    }
  253.76 -
  253.77 -    UcxBuffer *dst = (UcxBuffer*) malloc(sizeof(UcxBuffer));
  253.78 -    if (dst) {
  253.79 -        dst->space = (char*)malloc(length);
  253.80 -        if (!dst->space) {
  253.81 -            free(dst);
  253.82 -            return NULL;
  253.83 -        }
  253.84 -        dst->capacity = length;
  253.85 -        dst->size = length;
  253.86 -        dst->flags = flags | UCX_BUFFER_AUTOFREE;
  253.87 -        dst->pos = 0;
  253.88 -        memcpy(dst->space, src->space+start, length);
  253.89 -    }
  253.90 -    return dst;
  253.91 -}
  253.92 -
  253.93 -int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence) {
  253.94 -    size_t npos;
  253.95 -    switch (whence) {
  253.96 -    case SEEK_CUR:
  253.97 -        npos = buffer->pos;
  253.98 -        break;
  253.99 -    case SEEK_END:
 253.100 -        npos = buffer->size;
 253.101 -        break;
 253.102 -    case SEEK_SET:
 253.103 -        npos = 0;
 253.104 -        break;
 253.105 -    default:
 253.106 -        return -1;
 253.107 -    }
 253.108 -
 253.109 -    size_t opos = npos;
 253.110 -    npos += offset;
 253.111 -    
 253.112 -    if ((offset > 0 && npos < opos) || (offset < 0 && npos > opos)) {
 253.113 -        return -1;
 253.114 -    }
 253.115 -    
 253.116 -    if (npos >= buffer->size) {
 253.117 -        return -1;
 253.118 -    } else {
 253.119 -        buffer->pos = npos;
 253.120 -        return 0;
 253.121 -    }
 253.122 -
 253.123 -}
 253.124 -
 253.125 -int ucx_buffer_eof(UcxBuffer *buffer) {
 253.126 -    return buffer->pos >= buffer->size;
 253.127 -}
 253.128 -
 253.129 -int ucx_buffer_extend(UcxBuffer *buffer, size_t len) {
 253.130 -    size_t newcap = buffer->capacity;
 253.131 -    
 253.132 -    if (buffer->capacity + len < buffer->capacity) {
 253.133 -        return -1;
 253.134 -    }
 253.135 -    
 253.136 -    while (buffer->capacity + len > newcap) {
 253.137 -        newcap <<= 1;
 253.138 -        if (newcap < buffer->capacity) {
 253.139 -            return -1;
 253.140 -        }
 253.141 -    }
 253.142 -    
 253.143 -    char *newspace = (char*)realloc(buffer->space, newcap);
 253.144 -    if (newspace) {
 253.145 -        memset(newspace+buffer->size, 0, newcap-buffer->size);
 253.146 -        buffer->space = newspace;
 253.147 -        buffer->capacity = newcap;
 253.148 -    } else {
 253.149 -        return -1;
 253.150 -    }
 253.151 -    
 253.152 -    return 0;
 253.153 -}
 253.154 -
 253.155 -size_t ucx_buffer_write(const void *ptr, size_t size, size_t nitems,
 253.156 -        UcxBuffer *buffer) {
 253.157 -    size_t len;
 253.158 -    if(ucx_szmul(size, nitems, &len)) {
 253.159 -        return 0;
 253.160 -    }
 253.161 -    size_t required = buffer->pos + len;
 253.162 -    if (buffer->pos > required) {
 253.163 -        return 0;
 253.164 -    }
 253.165 -    
 253.166 -    if (required > buffer->capacity) {
 253.167 -        if ((buffer->flags & UCX_BUFFER_AUTOEXTEND) == UCX_BUFFER_AUTOEXTEND) {
 253.168 -            if (ucx_buffer_extend(buffer, required - buffer->capacity)) {
 253.169 -                return 0;
 253.170 -            }
 253.171 -        } else {
 253.172 -            len = buffer->capacity - buffer->pos;
 253.173 -            if (size > 1) {
 253.174 -                len -= len%size;
 253.175 -            }
 253.176 -        }
 253.177 -    }
 253.178 -    
 253.179 -    if (len == 0) {
 253.180 -        return len;
 253.181 -    }
 253.182 -    
 253.183 -    memcpy(buffer->space + buffer->pos, ptr, len);
 253.184 -    buffer->pos += len;
 253.185 -    if(buffer->pos > buffer->size) {
 253.186 -        buffer->size = buffer->pos;
 253.187 -    }
 253.188 -    
 253.189 -    return len / size;
 253.190 -}
 253.191 -
 253.192 -size_t ucx_buffer_read(void *ptr, size_t size, size_t nitems,
 253.193 -        UcxBuffer *buffer) {
 253.194 -    size_t len;
 253.195 -    if(ucx_szmul(size, nitems, &len)) {
 253.196 -        return 0;
 253.197 -    }
 253.198 -    if (buffer->pos + len > buffer->size) {
 253.199 -        len = buffer->size - buffer->pos;
 253.200 -        if (size > 1) len -= len%size;
 253.201 -    }
 253.202 -    
 253.203 -    if (len <= 0) {
 253.204 -        return len;
 253.205 -    }
 253.206 -    
 253.207 -    memcpy(ptr, buffer->space + buffer->pos, len);
 253.208 -    buffer->pos += len;
 253.209 -    
 253.210 -    return len / size;
 253.211 -}
 253.212 -
 253.213 -int ucx_buffer_putc(UcxBuffer *buffer, int c) {
 253.214 -    if(buffer->pos >= buffer->capacity) {
 253.215 -        if ((buffer->flags & UCX_BUFFER_AUTOEXTEND) == UCX_BUFFER_AUTOEXTEND) {
 253.216 -            if(ucx_buffer_extend(buffer, 1)) {
 253.217 -                return EOF;
 253.218 -            }
 253.219 -        } else {
 253.220 -            return EOF;
 253.221 -        }
 253.222 -    }
 253.223 -    
 253.224 -    c &= 0xFF;
 253.225 -    buffer->space[buffer->pos] = (char) c;
 253.226 -    buffer->pos++;
 253.227 -    if(buffer->pos > buffer->size) {
 253.228 -        buffer->size = buffer->pos;
 253.229 -    }
 253.230 -    return c;
 253.231 -}
 253.232 -
 253.233 -int ucx_buffer_getc(UcxBuffer *buffer) {
 253.234 -    if (ucx_buffer_eof(buffer)) {
 253.235 -        return EOF;
 253.236 -    } else {
 253.237 -        int c = ((unsigned char*)buffer->space)[buffer->pos];
 253.238 -        buffer->pos++;
 253.239 -        return c;
 253.240 -    }
 253.241 -}
 253.242 -
 253.243 -size_t ucx_buffer_puts(UcxBuffer *buffer, const char *str) {
 253.244 -    return ucx_buffer_write((const void*)str, 1, strlen(str), buffer);
 253.245 -}
 253.246 -
 253.247 -int ucx_buffer_shift_left(UcxBuffer* buffer, size_t shift) {
 253.248 -    if (shift >= buffer->size) {
 253.249 -        buffer->pos = buffer->size = 0;
 253.250 -    } else {
 253.251 -        memmove(buffer->space, buffer->space + shift, buffer->size - shift);
 253.252 -        buffer->size -= shift;
 253.253 -        
 253.254 -        if (buffer->pos >= shift) {
 253.255 -            buffer->pos -= shift;
 253.256 -        } else {
 253.257 -            buffer->pos = 0;
 253.258 -        }
 253.259 -    }
 253.260 -    return 0;
 253.261 -}
 253.262 -
 253.263 -int ucx_buffer_shift_right(UcxBuffer* buffer, size_t shift) {
 253.264 -    size_t req_capacity = buffer->size + shift;
 253.265 -    size_t movebytes;
 253.266 -    
 253.267 -    // auto extend buffer, if required and enabled
 253.268 -    if (buffer->capacity < req_capacity) {
 253.269 -        if ((buffer->flags & UCX_BUFFER_AUTOEXTEND) == UCX_BUFFER_AUTOEXTEND) {
 253.270 -            if (ucx_buffer_extend(buffer, req_capacity - buffer->capacity)) {
 253.271 -                return 1;
 253.272 -            }
 253.273 -            movebytes = buffer->size;
 253.274 -        } else {
 253.275 -            movebytes = buffer->capacity - shift;
 253.276 -        }
 253.277 -    } else {
 253.278 -        movebytes = buffer->size;
 253.279 -    }
 253.280 -    
 253.281 -    memmove(buffer->space + shift, buffer->space, movebytes);
 253.282 -    buffer->size = shift+movebytes;
 253.283 -    
 253.284 -    buffer->pos += shift;
 253.285 -    if (buffer->pos > buffer->size) {
 253.286 -        buffer->pos = buffer->size;
 253.287 -    }
 253.288 -    
 253.289 -    return 0;
 253.290 -}
 253.291 -
 253.292 -int ucx_buffer_shift(UcxBuffer* buffer, off_t shift) {
 253.293 -    if (shift < 0) {
 253.294 -        return ucx_buffer_shift_left(buffer, (size_t) (-shift));
 253.295 -    } else if (shift > 0) {
 253.296 -        return ucx_buffer_shift_right(buffer, (size_t) shift);
 253.297 -    } else {
 253.298 -        return 0;
 253.299 -    }
 253.300 -}
   254.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   254.2 +++ b/src/cx/list.h	Sat Feb 06 19:11:44 2021 +0100
   254.3 @@ -0,0 +1,32 @@
   254.4 +/*
   254.5 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   254.6 + *
   254.7 + * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
   254.8 + *
   254.9 + * Redistribution and use in source and binary forms, with or without
  254.10 + * modification, are permitted provided that the following conditions are met:
  254.11 + *
  254.12 + *   1. Redistributions of source code must retain the above copyright
  254.13 + *      notice, this list of conditions and the following disclaimer.
  254.14 + *
  254.15 + *   2. Redistributions in binary form must reproduce the above copyright
  254.16 + *      notice, this list of conditions and the following disclaimer in the
  254.17 + *      documentation and/or other materials provided with the distribution.
  254.18 + *
  254.19 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  254.20 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  254.21 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  254.22 + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  254.23 + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  254.24 + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  254.25 + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  254.26 + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  254.27 + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  254.28 + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  254.29 + * POSSIBILITY OF SUCH DAMAGE.
  254.30 + */
  254.31 +
  254.32 +#ifndef UCX_LIST_H
  254.33 +#define UCX_LIST_H
  254.34 +
  254.35 +#endif //UCX_LIST_H
   255.1 --- a/src/list.c	Mon Dec 30 09:54:10 2019 +0100
   255.2 +++ b/src/list.c	Sat Feb 06 19:11:44 2021 +0100
   255.3 @@ -1,7 +1,7 @@
   255.4  /*
   255.5   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   255.6   *
   255.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   255.8 + * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
   255.9   *
  255.10   * Redistribution and use in source and binary forms, with or without
  255.11   * modification, are permitted provided that the following conditions are met:
  255.12 @@ -26,403 +26,4 @@
  255.13   * POSSIBILITY OF SUCH DAMAGE.
  255.14   */
  255.15  
  255.16 -#include "ucx/list.h"
  255.17 -
  255.18 -UcxList *ucx_list_clone(const UcxList *l, copy_func fnc, void *data) {
  255.19 -    return ucx_list_clone_a(ucx_default_allocator(), l, fnc, data);
  255.20 -}
  255.21 -
  255.22 -UcxList *ucx_list_clone_a(UcxAllocator *alloc, const UcxList *l,
  255.23 -        copy_func fnc, void *data) {
  255.24 -    UcxList *ret = NULL;
  255.25 -    while (l) {
  255.26 -        if (fnc) {
  255.27 -            ret = ucx_list_append_a(alloc, ret, fnc(l->data, data));
  255.28 -        } else {
  255.29 -            ret = ucx_list_append_a(alloc, ret, l->data);
  255.30 -        }
  255.31 -        l = l->next;
  255.32 -    }
  255.33 -    return ret;
  255.34 -}
  255.35 -
  255.36 -int ucx_list_equals(const UcxList *l1, const UcxList *l2,
  255.37 -        cmp_func fnc, void* data) {
  255.38 -    if (l1 == l2) return 1;
  255.39 -    
  255.40 -    while (l1 != NULL && l2 != NULL) {
  255.41 -        if (fnc == NULL) {
  255.42 -            if (l1->data != l2->data) return 0;
  255.43 -        } else {
  255.44 -            if (fnc(l1->data, l2->data, data) != 0) return 0;
  255.45 -        }
  255.46 -        l1 = l1->next;
  255.47 -        l2 = l2->next;
  255.48 -    }
  255.49 -    
  255.50 -    return (l1 == NULL && l2 == NULL);
  255.51 -}
  255.52 -
  255.53 -void ucx_list_free(UcxList *l) {
  255.54 -    ucx_list_free_a(ucx_default_allocator(), l);
  255.55 -}
  255.56 -
  255.57 -void ucx_list_free_a(UcxAllocator *alloc, UcxList *l) {
  255.58 -    UcxList *e = l, *f;
  255.59 -    while (e != NULL) {
  255.60 -        f = e;
  255.61 -        e = e->next;
  255.62 -        alfree(alloc, f);
  255.63 -    }
  255.64 -}
  255.65 -
  255.66 -void ucx_list_free_content(UcxList* list, ucx_destructor destr) {
  255.67 -    if (!destr) destr = free;
  255.68 -    while (list != NULL) {
  255.69 -        destr(list->data);
  255.70 -        list = list->next;
  255.71 -    }
  255.72 -}
  255.73 -
  255.74 -UcxList *ucx_list_append(UcxList *l, void *data)  {
  255.75 -    return ucx_list_append_a(ucx_default_allocator(), l, data);
  255.76 -}
  255.77 -
  255.78 -UcxList *ucx_list_append_a(UcxAllocator *alloc, UcxList *l, void *data)  {
  255.79 -    UcxList *nl = (UcxList*) almalloc(alloc, sizeof(UcxList));
  255.80 -    if (!nl) {
  255.81 -        return NULL;
  255.82 -    }
  255.83 -    
  255.84 -    nl->data = data;
  255.85 -    nl->next = NULL;
  255.86 -    if (l) {
  255.87 -        UcxList *t = ucx_list_last(l);
  255.88 -        t->next = nl;
  255.89 -        nl->prev = t;
  255.90 -        return l;
  255.91 -    } else {
  255.92 -        nl->prev = NULL;
  255.93 -        return nl;
  255.94 -    }
  255.95 -}
  255.96 -
  255.97 -UcxList *ucx_list_prepend(UcxList *l, void *data) {
  255.98 -    return ucx_list_prepend_a(ucx_default_allocator(), l, data);
  255.99 -}
 255.100 -
 255.101 -UcxList *ucx_list_prepend_a(UcxAllocator *alloc, UcxList *l, void *data) {
 255.102 -    UcxList *nl = ucx_list_append_a(alloc, NULL, data);
 255.103 -    if (!nl) {
 255.104 -        return NULL;
 255.105 -    }
 255.106 -    l = ucx_list_first(l);
 255.107 -    
 255.108 -    if (l) {
 255.109 -        nl->next = l;
 255.110 -        l->prev = nl;
 255.111 -    }
 255.112 -    return nl;
 255.113 -}
 255.114 -
 255.115 -UcxList *ucx_list_concat(UcxList *l1, UcxList *l2) {
 255.116 -    if (l1) {
 255.117 -        UcxList *last = ucx_list_last(l1);
 255.118 -        last->next = l2;
 255.119 -        if (l2) {
 255.120 -            l2->prev = last;
 255.121 -        }
 255.122 -        return l1;
 255.123 -    } else {
 255.124 -        return l2;
 255.125 -    }
 255.126 -}
 255.127 -
 255.128 -UcxList *ucx_list_last(const UcxList *l) {
 255.129 -    if (l == NULL) return NULL;
 255.130 -    
 255.131 -    const UcxList *e = l;
 255.132 -    while (e->next != NULL) {
 255.133 -        e = e->next;
 255.134 -    }
 255.135 -    return (UcxList*)e;
 255.136 -}
 255.137 -
 255.138 -ssize_t ucx_list_indexof(const UcxList *list, const UcxList *elem) {
 255.139 -    ssize_t index = 0;
 255.140 -    while (list) {
 255.141 -        if (list == elem) {
 255.142 -            return index;
 255.143 -        }
 255.144 -        list = list->next;
 255.145 -        index++;
 255.146 -    }
 255.147 -    return -1;
 255.148 -}
 255.149 -
 255.150 -UcxList *ucx_list_get(const UcxList *l, size_t index) {
 255.151 -    if (l == NULL) return NULL;
 255.152 -
 255.153 -    const UcxList *e = l;
 255.154 -    while (e->next && index > 0) {
 255.155 -        e = e->next;
 255.156 -        index--;
 255.157 -    }
 255.158 -    
 255.159 -    return (UcxList*)(index == 0 ? e : NULL);
 255.160 -}
 255.161 -
 255.162 -ssize_t ucx_list_find(const UcxList *l, void *elem,
 255.163 -        cmp_func fnc, void *cmpdata) {
 255.164 -    ssize_t index = 0;
 255.165 -    UCX_FOREACH(e, l) {
 255.166 -        if (fnc) {
 255.167 -            if (fnc(elem, e->data, cmpdata) == 0) {
 255.168 -                return index;
 255.169 -            }
 255.170 -        } else {
 255.171 -            if (elem == e->data) {
 255.172 -                return index;
 255.173 -            }
 255.174 -        }
 255.175 -        index++;
 255.176 -    }
 255.177 -    return -1;
 255.178 -}
 255.179 -
 255.180 -int ucx_list_contains(const UcxList *l, void *elem,
 255.181 -        cmp_func fnc, void *cmpdata) {
 255.182 -    return ucx_list_find(l, elem, fnc, cmpdata) > -1;
 255.183 -}
 255.184 -
 255.185 -size_t ucx_list_size(const UcxList *l) {
 255.186 -    if (l == NULL) return 0;
 255.187 -    
 255.188 -    const UcxList *e = l;
 255.189 -    size_t s = 1;
 255.190 -    while (e->next != NULL) {
 255.191 -        e = e->next;
 255.192 -        s++;
 255.193 -    }
 255.194 -
 255.195 -    return s;
 255.196 -}
 255.197 -
 255.198 -static UcxList *ucx_list_sort_merge(size_t length,
 255.199 -        UcxList* ls, UcxList* le, UcxList* re,
 255.200 -        cmp_func fnc, void* data) {
 255.201 -
 255.202 -    UcxList** sorted = (UcxList**) malloc(sizeof(UcxList*)*length);
 255.203 -    UcxList *rc, *lc;
 255.204 -
 255.205 -    lc = ls; rc = le;
 255.206 -    size_t n = 0;
 255.207 -    while (lc && lc != le && rc != re) {
 255.208 -        if (fnc(lc->data, rc->data, data) <= 0) {
 255.209 -            sorted[n] = lc;
 255.210 -            lc = lc->next;
 255.211 -        } else {
 255.212 -            sorted[n] = rc;
 255.213 -            rc = rc->next;
 255.214 -        }
 255.215 -        n++;
 255.216 -    }
 255.217 -    while (lc && lc != le) {
 255.218 -        sorted[n] = lc;
 255.219 -        lc = lc->next;
 255.220 -        n++;
 255.221 -    }
 255.222 -    while (rc && rc != re) {
 255.223 -        sorted[n] = rc;
 255.224 -        rc = rc->next;
 255.225 -        n++;
 255.226 -    }
 255.227 -
 255.228 -    // Update pointer
 255.229 -    sorted[0]->prev = NULL;
 255.230 -    for (int i = 0 ; i < length-1 ; i++) {
 255.231 -        sorted[i]->next = sorted[i+1];
 255.232 -        sorted[i+1]->prev = sorted[i];
 255.233 -    }
 255.234 -    sorted[length-1]->next = NULL;
 255.235 -
 255.236 -    UcxList *ret = sorted[0];
 255.237 -    free(sorted);
 255.238 -    return ret;
 255.239 -}
 255.240 -
 255.241 -UcxList *ucx_list_sort(UcxList *l, cmp_func fnc, void *data) {
 255.242 -    if (l == NULL) {
 255.243 -        return NULL;
 255.244 -    }
 255.245 -
 255.246 -    UcxList *lc;
 255.247 -    size_t ln = 1;
 255.248 -
 255.249 -    UcxList *ls = l, *le, *re;
 255.250 -    
 255.251 -    // check how many elements are already sorted
 255.252 -    lc = ls;
 255.253 -    while (lc->next != NULL && fnc(lc->next->data, lc->data, data) > 0) {
 255.254 -        lc = lc->next;
 255.255 -        ln++;
 255.256 -    }
 255.257 -    le = lc->next;
 255.258 -
 255.259 -    if (le == NULL) {
 255.260 -        return l; // this list is already sorted :)
 255.261 -    } else {
 255.262 -        UcxList *rc;
 255.263 -        size_t rn = 1;
 255.264 -        rc = le;
 255.265 -        // skip already sorted elements
 255.266 -        while (rc->next != NULL && fnc(rc->next->data, rc->data, data) > 0) {
 255.267 -            rc = rc->next;
 255.268 -            rn++;
 255.269 -        }
 255.270 -        re = rc->next;
 255.271 -
 255.272 -        // {ls,...,le->prev} and {rs,...,re->prev} are sorted - merge them
 255.273 -        UcxList *sorted = ucx_list_sort_merge(ln+rn,
 255.274 -                ls, le, re,
 255.275 -                fnc, data);
 255.276 -        
 255.277 -        // Something left? Sort it!
 255.278 -        size_t remainder_length = ucx_list_size(re);
 255.279 -        if (remainder_length > 0) {
 255.280 -            UcxList *remainder = ucx_list_sort(re, fnc, data);
 255.281 -
 255.282 -            // merge sorted list with (also sorted) remainder
 255.283 -            l = ucx_list_sort_merge(ln+rn+remainder_length,
 255.284 -                    sorted, remainder, NULL, fnc, data);
 255.285 -        } else {
 255.286 -            // no remainder - we've got our sorted list
 255.287 -            l = sorted;
 255.288 -        }
 255.289 -
 255.290 -        return l;
 255.291 -    }
 255.292 -}
 255.293 -
 255.294 -UcxList *ucx_list_first(const UcxList *l) {
 255.295 -    if (!l) {
 255.296 -        return NULL;
 255.297 -    }
 255.298 -    
 255.299 -    const UcxList *e = l;
 255.300 -    while (e->prev) {
 255.301 -        e = e->prev;
 255.302 -    }
 255.303 -    return (UcxList *)e;
 255.304 -}
 255.305 -
 255.306 -UcxList *ucx_list_remove(UcxList *l, UcxList *e) {
 255.307 -    return ucx_list_remove_a(ucx_default_allocator(), l, e);
 255.308 -}
 255.309 -    
 255.310 -UcxList *ucx_list_remove_a(UcxAllocator *alloc, UcxList *l, UcxList *e) {
 255.311 -    if (l == e) {
 255.312 -        l = e->next;
 255.313 -    }
 255.314 -    
 255.315 -    if (e->next) {
 255.316 -        e->next->prev = e->prev;
 255.317 -    }
 255.318 -    
 255.319 -    if (e->prev) {
 255.320 -        e->prev->next = e->next;
 255.321 -    }
 255.322 -    
 255.323 -    alfree(alloc, e);
 255.324 -    return l;
 255.325 -}
 255.326 -
 255.327 -
 255.328 -static UcxList* ucx_list_setoperation_a(UcxAllocator *allocator,
 255.329 -        UcxList const *left, UcxList const *right,
 255.330 -        cmp_func cmpfnc, void* cmpdata,
 255.331 -        copy_func cpfnc, void* cpdata,
 255.332 -        int op) {
 255.333 -    
 255.334 -    UcxList *res = NULL;
 255.335 -    UcxList *cur = NULL;
 255.336 -    const UcxList *src = left;
 255.337 -    
 255.338 -    do {
 255.339 -        UCX_FOREACH(node, src) {
 255.340 -            void* elem = node->data;
 255.341 -            if (
 255.342 -                (op == 0 && !ucx_list_contains(res, elem, cmpfnc, cmpdata)) ||
 255.343 -                (op == 1 && ucx_list_contains(right, elem, cmpfnc, cmpdata)) ||
 255.344 -                (op == 2 && !ucx_list_contains(right, elem, cmpfnc, cmpdata))) {
 255.345 -                UcxList *nl = almalloc(allocator, sizeof(UcxList));
 255.346 -                nl->prev = cur;
 255.347 -                nl->next = NULL;
 255.348 -                if (cpfnc) {
 255.349 -                    nl->data = cpfnc(elem, cpdata);
 255.350 -                } else {
 255.351 -                    nl->data = elem;
 255.352 -                }
 255.353 -                if (cur != NULL)
 255.354 -                    cur->next = nl;
 255.355 -                cur = nl;
 255.356 -                if (res == NULL)
 255.357 -                    res = cur;
 255.358 -            }
 255.359 -        }
 255.360 -        if (op == 0 && src == left)
 255.361 -            src = right;
 255.362 -        else
 255.363 -            src = NULL;
 255.364 -    } while (src != NULL);
 255.365 -    
 255.366 -    return res;
 255.367 -}
 255.368 -
 255.369 -UcxList* ucx_list_union(UcxList const *left, UcxList const *right,
 255.370 -        cmp_func cmpfnc, void* cmpdata,
 255.371 -        copy_func cpfnc, void* cpdata) {
 255.372 -    return ucx_list_union_a(ucx_default_allocator(),
 255.373 -            left, right, cmpfnc, cmpdata, cpfnc, cpdata);
 255.374 -}
 255.375 -
 255.376 -UcxList* ucx_list_union_a(UcxAllocator *allocator,
 255.377 -        UcxList const *left, UcxList const *right,
 255.378 -        cmp_func cmpfnc, void* cmpdata,
 255.379 -        copy_func cpfnc, void* cpdata) {
 255.380 -    
 255.381 -    return ucx_list_setoperation_a(allocator, left, right,
 255.382 -            cmpfnc, cmpdata, cpfnc, cpdata, 0);
 255.383 -}
 255.384 -
 255.385 -UcxList* ucx_list_intersection(UcxList const *left, UcxList const *right,
 255.386 -        cmp_func cmpfnc, void* cmpdata,
 255.387 -        copy_func cpfnc, void* cpdata) {
 255.388 -    return ucx_list_intersection_a(ucx_default_allocator(), left, right,
 255.389 -            cmpfnc, cmpdata, cpfnc, cpdata);
 255.390 -}
 255.391 -
 255.392 -UcxList* ucx_list_intersection_a(UcxAllocator *allocator,
 255.393 -        UcxList const *left, UcxList const *right,
 255.394 -        cmp_func cmpfnc, void* cmpdata,
 255.395 -        copy_func cpfnc, void* cpdata) {
 255.396 -    
 255.397 -    return ucx_list_setoperation_a(allocator, left, right,
 255.398 -            cmpfnc, cmpdata, cpfnc, cpdata, 1);
 255.399 -}
 255.400 -
 255.401 -UcxList* ucx_list_difference(UcxList const *left, UcxList const *right,
 255.402 -        cmp_func cmpfnc, void* cmpdata,
 255.403 -        copy_func cpfnc, void* cpdata) {
 255.404 -    return ucx_list_difference_a(ucx_default_allocator(), left, right,
 255.405 -            cmpfnc, cmpdata, cpfnc, cpdata);
 255.406 -}
 255.407 -
 255.408 -UcxList* ucx_list_difference_a(UcxAllocator *allocator,
 255.409 -        UcxList const *left, UcxList const *right,
 255.410 -        cmp_func cmpfnc, void* cmpdata,
 255.411 -        copy_func cpfnc, void* cpdata) {
 255.412 -    
 255.413 -    return ucx_list_setoperation_a(allocator, left, right,
 255.414 -            cmpfnc, cmpdata, cpfnc, cpdata, 2);
 255.415 -}
 255.416 +#include "cx/list.h"
   256.1 --- a/src/logging.c	Mon Dec 30 09:54:10 2019 +0100
   256.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   256.3 @@ -1,117 +0,0 @@
   256.4 -/*
   256.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   256.6 - *
   256.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   256.8 - *
   256.9 - * Redistribution and use in source and binary forms, with or without
  256.10 - * modification, are permitted provided that the following conditions are met:
  256.11 - *
  256.12 - *   1. Redistributions of source code must retain the above copyright
  256.13 - *      notice, this list of conditions and the following disclaimer.
  256.14 - *
  256.15 - *   2. Redistributions in binary form must reproduce the above copyright
  256.16 - *      notice, this list of conditions and the following disclaimer in the
  256.17 - *      documentation and/or other materials provided with the distribution.
  256.18 - *
  256.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  256.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  256.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  256.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  256.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  256.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  256.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  256.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  256.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  256.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  256.29 - * POSSIBILITY OF SUCH DAMAGE.
  256.30 - */
  256.31 -
  256.32 -#include "ucx/logging.h"
  256.33 -
  256.34 -#include <stdlib.h>
  256.35 -#include <string.h>
  256.36 -#include <stdarg.h>
  256.37 -#include <time.h>
  256.38 -
  256.39 -UcxLogger *ucx_logger_new(void *stream, unsigned int level, unsigned int mask) {
  256.40 -    UcxLogger *logger = (UcxLogger*) malloc(sizeof(UcxLogger));
  256.41 -    if (logger != NULL) {
  256.42 -        logger->stream = stream;
  256.43 -        logger->writer = (write_func)fwrite;
  256.44 -        logger->dateformat = (char*) "%F %T %z ";
  256.45 -        logger->level = level;
  256.46 -        logger->mask = mask;
  256.47 -        logger->levels = ucx_map_new(8);
  256.48 -        
  256.49 -        unsigned int l;
  256.50 -        l = UCX_LOGGER_ERROR;
  256.51 -        ucx_map_int_put(logger->levels, l, (void*) "[ERROR]");
  256.52 -        l = UCX_LOGGER_WARN;
  256.53 -        ucx_map_int_put(logger->levels, l, (void*) "[WARNING]");
  256.54 -        l = UCX_LOGGER_INFO;
  256.55 -        ucx_map_int_put(logger->levels, l, (void*) "[INFO]");
  256.56 -        l = UCX_LOGGER_DEBUG;
  256.57 -        ucx_map_int_put(logger->levels, l, (void*) "[DEBUG]");
  256.58 -        l = UCX_LOGGER_TRACE;
  256.59 -        ucx_map_int_put(logger->levels, l, (void*) "[TRACE]");
  256.60 -    }
  256.61 -
  256.62 -    return logger;
  256.63 -}
  256.64 -
  256.65 -void ucx_logger_free(UcxLogger *logger) {
  256.66 -    ucx_map_free(logger->levels);
  256.67 -    free(logger);
  256.68 -}
  256.69 -
  256.70 -// estimated max. message length (documented)
  256.71 -#define UCX_LOGGER_MSGMAX 4096
  256.72 -
  256.73 -void ucx_logger_logf(UcxLogger *logger, unsigned int level, const char* file,
  256.74 -        const unsigned int line, const char *format, ...) {
  256.75 -    if (level <= logger->level) {
  256.76 -        char msg[UCX_LOGGER_MSGMAX];
  256.77 -        const char *text;
  256.78 -        size_t k = 0;
  256.79 -        size_t n;
  256.80 -        
  256.81 -        if ((logger->mask & UCX_LOGGER_LEVEL) > 0) {
  256.82 -            text = (const char*) ucx_map_int_get(logger->levels, level);
  256.83 -            if (!text) {
  256.84 -                text = "[UNKNOWN]";
  256.85 -            }
  256.86 -            n = strlen(text);
  256.87 -            n = n > 256 ? 256 : n;
  256.88 -            memcpy(msg+k, text, n);
  256.89 -            k += n;
  256.90 -            msg[k++] = ' ';
  256.91 -        }
  256.92 -        if ((logger->mask & UCX_LOGGER_TIMESTAMP) > 0) {
  256.93 -            time_t now = time(NULL);
  256.94 -            k += strftime(msg+k, 128, logger->dateformat, localtime(&now));
  256.95 -        }
  256.96 -        if ((logger->mask & UCX_LOGGER_SOURCE) > 0) {
  256.97 -            char *fpart = strrchr(file, '/');
  256.98 -            if (fpart) file = fpart+1;
  256.99 -            fpart = strrchr(file, '\\');
 256.100 -            if (fpart) file = fpart+1;
 256.101 -            n = strlen(file);
 256.102 -            memcpy(msg+k, file, n);
 256.103 -            k += n;
 256.104 -            k += sprintf(msg+k, ":%u ", line);
 256.105 -        }
 256.106 -        
 256.107 -        if (k > 0) {
 256.108 -            msg[k++] = '-'; msg[k++] = ' ';
 256.109 -        }
 256.110 -        
 256.111 -        va_list args;
 256.112 -        va_start (args, format);
 256.113 -        k += vsnprintf(msg+k, UCX_LOGGER_MSGMAX-k-1, format, args);
 256.114 -        va_end (args);        
 256.115 -        
 256.116 -        msg[k++] = '\n';
 256.117 -        
 256.118 -        logger->writer(msg, 1, k, logger->stream);
 256.119 -    }
 256.120 -}
   257.1 --- a/src/map.c	Mon Dec 30 09:54:10 2019 +0100
   257.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   257.3 @@ -1,402 +0,0 @@
   257.4 -/*
   257.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   257.6 - *
   257.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   257.8 - *
   257.9 - * Redistribution and use in source and binary forms, with or without
  257.10 - * modification, are permitted provided that the following conditions are met:
  257.11 - *
  257.12 - *   1. Redistributions of source code must retain the above copyright
  257.13 - *      notice, this list of conditions and the following disclaimer.
  257.14 - *
  257.15 - *   2. Redistributions in binary form must reproduce the above copyright
  257.16 - *      notice, this list of conditions and the following disclaimer in the
  257.17 - *      documentation and/or other materials provided with the distribution.
  257.18 - *
  257.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  257.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  257.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  257.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  257.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  257.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  257.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  257.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  257.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  257.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  257.29 - * POSSIBILITY OF SUCH DAMAGE.
  257.30 - */
  257.31 -
  257.32 -#include "ucx/map.h"
  257.33 -
  257.34 -#include <stdlib.h>
  257.35 -#include <string.h>
  257.36 -
  257.37 -UcxMap *ucx_map_new(size_t size) {
  257.38 -    return ucx_map_new_a(NULL, size);
  257.39 -}
  257.40 -
  257.41 -UcxMap *ucx_map_new_a(UcxAllocator *allocator, size_t size) {
  257.42 -    if(size == 0) {
  257.43 -        size = 16;
  257.44 -    }
  257.45 -       
  257.46 -    if(!allocator) {
  257.47 -        allocator = ucx_default_allocator();
  257.48 -    }
  257.49 -    
  257.50 -    UcxMap *map = (UcxMap*)almalloc(allocator, sizeof(UcxMap));
  257.51 -    if (!map) {
  257.52 -        return NULL;
  257.53 -    }
  257.54 -    
  257.55 -    map->allocator = allocator;
  257.56 -    map->map = (UcxMapElement**)alcalloc(
  257.57 -            allocator, size, sizeof(UcxMapElement*));
  257.58 -    if(map->map == NULL) {
  257.59 -        alfree(allocator, map);
  257.60 -        return NULL;
  257.61 -    }
  257.62 -    map->size = size;
  257.63 -    map->count = 0;
  257.64 -
  257.65 -    return map;
  257.66 -}
  257.67 -
  257.68 -static void ucx_map_free_elmlist_contents(UcxMap *map) {
  257.69 -    for (size_t n = 0 ; n < map->size ; n++) {
  257.70 -        UcxMapElement *elem = map->map[n];
  257.71 -        if (elem != NULL) {
  257.72 -            do {
  257.73 -                UcxMapElement *next = elem->next;
  257.74 -                alfree(map->allocator, elem->key.data);
  257.75 -                alfree(map->allocator, elem);
  257.76 -                elem = next;
  257.77 -            } while (elem != NULL);
  257.78 -        }
  257.79 -    }
  257.80 -}
  257.81 -
  257.82 -void ucx_map_free(UcxMap *map) {
  257.83 -    ucx_map_free_elmlist_contents(map);
  257.84 -    alfree(map->allocator, map->map);
  257.85 -    alfree(map->allocator, map);
  257.86 -}
  257.87 -
  257.88 -void ucx_map_free_content(UcxMap *map, ucx_destructor destr) {
  257.89 -    UcxMapIterator iter = ucx_map_iterator(map);
  257.90 -    void *val;
  257.91 -    UCX_MAP_FOREACH(key, val, iter) {
  257.92 -        if (destr) {
  257.93 -            destr(val);
  257.94 -        } else {
  257.95 -            alfree(map->allocator, val);
  257.96 -        }
  257.97 -    }
  257.98 -}
  257.99 -
 257.100 -void ucx_map_clear(UcxMap *map) {
 257.101 -    if (map->count == 0) {
 257.102 -        return; // nothing to do
 257.103 -    }
 257.104 -    ucx_map_free_elmlist_contents(map);
 257.105 -    memset(map->map, 0, map->size*sizeof(UcxMapElement*));
 257.106 -    map->count = 0;
 257.107 -}
 257.108 -
 257.109 -int ucx_map_copy(UcxMap const *from, UcxMap *to, copy_func fnc, void *data) {
 257.110 -    UcxMapIterator i = ucx_map_iterator(from);
 257.111 -    void *value;
 257.112 -    UCX_MAP_FOREACH(key, value, i) {
 257.113 -        if (ucx_map_put(to, key, fnc ? fnc(value, data) : value)) {
 257.114 -            return 1;
 257.115 -        }
 257.116 -    }
 257.117 -    return 0;
 257.118 -}
 257.119 -
 257.120 -UcxMap *ucx_map_clone(UcxMap const *map, copy_func fnc, void *data) {
 257.121 -    return ucx_map_clone_a(ucx_default_allocator(), map, fnc, data);
 257.122 -}
 257.123 -
 257.124 -UcxMap *ucx_map_clone_a(UcxAllocator *allocator,
 257.125 -        UcxMap const *map, copy_func fnc, void *data) {
 257.126 -    size_t bs = (map->count * 5) >> 1;
 257.127 -    UcxMap *newmap = ucx_map_new_a(allocator, bs > map->size ? bs : map->size);
 257.128 -    if (!newmap) {
 257.129 -        return NULL;
 257.130 -    }
 257.131 -    ucx_map_copy(map, newmap, fnc, data);
 257.132 -    return newmap;
 257.133 -}
 257.134 -
 257.135 -int ucx_map_rehash(UcxMap *map) {
 257.136 -    size_t load = (map->size * 3) >> 2;
 257.137 -    if (map->count > load) {
 257.138 -        UcxMap oldmap;
 257.139 -        oldmap.map = map->map;
 257.140 -        oldmap.size = map->size;
 257.141 -        oldmap.count = map->count;
 257.142 -        oldmap.allocator = map->allocator;
 257.143 -        
 257.144 -        map->size = (map->count * 5) >> 1;
 257.145 -        map->map = (UcxMapElement**)alcalloc(
 257.146 -                map->allocator, map->size, sizeof(UcxMapElement*));
 257.147 -        if (!map->map) {
 257.148 -            *map = oldmap;
 257.149 -            return 1;
 257.150 -        }
 257.151 -        map->count = 0;
 257.152 -        ucx_map_copy(&oldmap, map, NULL, NULL);
 257.153 -        
 257.154 -        /* free the UcxMapElement list of oldmap */
 257.155 -        ucx_map_free_elmlist_contents(&oldmap);
 257.156 -        alfree(map->allocator, oldmap.map);
 257.157 -    }
 257.158 -    return 0;
 257.159 -}
 257.160 -
 257.161 -int ucx_map_put(UcxMap *map, UcxKey key, void *data) {
 257.162 -    UcxAllocator *allocator = map->allocator;
 257.163 -    
 257.164 -    if (key.hash == 0) {
 257.165 -        key.hash = ucx_hash((const char*)key.data, key.len);
 257.166 -    }
 257.167 -    
 257.168 -    struct UcxMapKey mapkey;
 257.169 -    mapkey.hash = key.hash;
 257.170 -
 257.171 -    size_t slot = mapkey.hash%map->size;
 257.172 -    UcxMapElement *elm = map->map[slot];
 257.173 -    UcxMapElement *prev = NULL;
 257.174 -
 257.175 -    while (elm && elm->key.hash < mapkey.hash) {
 257.176 -        prev = elm;
 257.177 -        elm = elm->next;
 257.178 -    }
 257.179 -    
 257.180 -    if (!elm || elm->key.hash != mapkey.hash) {
 257.181 -        UcxMapElement *e = (UcxMapElement*)almalloc(
 257.182 -                allocator, sizeof(UcxMapElement));
 257.183 -        if (!e) {
 257.184 -            return -1;
 257.185 -        }
 257.186 -        e->key.data = NULL;
 257.187 -        if (prev) {
 257.188 -            prev->next = e;
 257.189 -        } else {
 257.190 -            map->map[slot] = e;
 257.191 -        }
 257.192 -        e->next = elm;
 257.193 -        elm = e;
 257.194 -    }
 257.195 -    
 257.196 -    if (!elm->key.data) {
 257.197 -        void *kd = almalloc(allocator, key.len);
 257.198 -        if (!kd) {
 257.199 -            return -1;
 257.200 -        }
 257.201 -        memcpy(kd, key.data, key.len);
 257.202 -        mapkey.data = kd;
 257.203 -        mapkey.len = key.len;
 257.204 -        elm->key = mapkey;
 257.205 -        map->count++;
 257.206 -    }
 257.207 -    elm->data = data;
 257.208 -
 257.209 -    return 0;
 257.210 -}
 257.211 -
 257.212 -static void* ucx_map_get_and_remove(UcxMap *map, UcxKey key, int remove) {
 257.213 -    if(key.hash == 0) {
 257.214 -        key.hash = ucx_hash((const char*)key.data, key.len);
 257.215 -    }
 257.216 -    
 257.217 -    size_t slot = key.hash%map->size;
 257.218 -    UcxMapElement *elm = map->map[slot];
 257.219 -    UcxMapElement *pelm = NULL;
 257.220 -    while (elm && elm->key.hash <= key.hash) {
 257.221 -        if(elm->key.hash == key.hash) {
 257.222 -            int n = (key.len > elm->key.len) ? elm->key.len : key.len;
 257.223 -            if (memcmp(elm->key.data, key.data, n) == 0) {
 257.224 -                void *data = elm->data;
 257.225 -                if (remove) {
 257.226 -                    if (pelm) {
 257.227 -                        pelm->next = elm->next;
 257.228 -                    } else {
 257.229 -                        map->map[slot] = elm->next;
 257.230 -                    }
 257.231 -                    alfree(map->allocator, elm->key.data);
 257.232 -                    alfree(map->allocator, elm);
 257.233 -                    map->count--;
 257.234 -                }
 257.235 -
 257.236 -                return data;
 257.237 -            }
 257.238 -        }
 257.239 -        pelm = elm;
 257.240 -        elm = pelm->next;
 257.241 -    }
 257.242 -
 257.243 -    return NULL;
 257.244 -}
 257.245 -
 257.246 -void *ucx_map_get(UcxMap const *map, UcxKey key) {
 257.247 -    return ucx_map_get_and_remove((UcxMap *)map, key, 0);
 257.248 -}
 257.249 -
 257.250 -void *ucx_map_remove(UcxMap *map, UcxKey key) {
 257.251 -    return ucx_map_get_and_remove(map, key, 1);
 257.252 -}
 257.253 -
 257.254 -UcxKey ucx_key(const void *data, size_t len) {
 257.255 -    UcxKey key;
 257.256 -    key.data = data;
 257.257 -    key.len = len;
 257.258 -    key.hash = ucx_hash((const char*)data, len);
 257.259 -    return key;
 257.260 -}
 257.261 -
 257.262 -
 257.263 -int ucx_hash(const char *data, size_t len) {
 257.264 -    /* murmur hash 2 */
 257.265 -
 257.266 -    int m = 0x5bd1e995;
 257.267 -    int r = 24;
 257.268 -
 257.269 -    int h = 25 ^ len;
 257.270 -
 257.271 -    int i = 0;
 257.272 -    while (len >= 4) {
 257.273 -        int k = data[i + 0] & 0xFF;
 257.274 -        k |= (data[i + 1] & 0xFF) << 8;
 257.275 -        k |= (data[i + 2] & 0xFF) << 16;
 257.276 -        k |= (data[i + 3] & 0xFF) << 24;
 257.277 -
 257.278 -        k *= m;
 257.279 -        k ^= k >> r;
 257.280 -        k *= m;
 257.281 -
 257.282 -        h *= m;
 257.283 -        h ^= k;
 257.284 -
 257.285 -        i += 4;
 257.286 -        len -= 4;
 257.287 -    }
 257.288 -
 257.289 -    switch (len) {
 257.290 -        case 3: h ^= (data[i + 2] & 0xFF) << 16;
 257.291 -        /* no break */
 257.292 -        case 2: h ^= (data[i + 1] & 0xFF) << 8;
 257.293 -        /* no break */
 257.294 -        case 1: h ^= (data[i + 0] & 0xFF); h *= m;
 257.295 -        /* no break */
 257.296 -    }
 257.297 -
 257.298 -    h ^= h >> 13;
 257.299 -    h *= m;
 257.300 -    h ^= h >> 15;
 257.301 -
 257.302 -    return h;
 257.303 -}
 257.304 -
 257.305 -UcxMapIterator ucx_map_iterator(UcxMap const *map) {
 257.306 -    UcxMapIterator i;
 257.307 -    i.map = map;
 257.308 -    i.cur = NULL;
 257.309 -    i.index = 0;
 257.310 -    return i;
 257.311 -}
 257.312 -
 257.313 -int ucx_map_iter_next(UcxMapIterator *i, UcxKey *key, void **elm) {
 257.314 -    UcxMapElement *e = i->cur;
 257.315 -    
 257.316 -    if (e) {
 257.317 -        e = e->next;
 257.318 -    } else {
 257.319 -        e = i->map->map[0];
 257.320 -    }
 257.321 -    
 257.322 -    while (i->index < i->map->size) {
 257.323 -        if (e) {
 257.324 -            if (e->data) {
 257.325 -                i->cur = e;
 257.326 -                *elm = e->data;
 257.327 -                key->data = e->key.data;
 257.328 -                key->hash = e->key.hash;
 257.329 -                key->len = e->key.len;
 257.330 -                return 1;
 257.331 -            }
 257.332 -
 257.333 -            e = e->next;
 257.334 -        } else {
 257.335 -            i->index++;
 257.336 -            
 257.337 -            if (i->index < i->map->size) {
 257.338 -                e = i->map->map[i->index];
 257.339 -            }
 257.340 -        }
 257.341 -    }
 257.342 -    
 257.343 -    return 0;
 257.344 -}
 257.345 -
 257.346 -UcxMap* ucx_map_union(const UcxMap *first, const UcxMap *second,
 257.347 -                      copy_func cpfnc, void* cpdata) {
 257.348 -    return ucx_map_union_a(ucx_default_allocator(),
 257.349 -            first, second, cpfnc, cpdata);
 257.350 -}
 257.351 -
 257.352 -UcxMap* ucx_map_union_a(UcxAllocator *allocator,
 257.353 -                        const UcxMap *first, const UcxMap *second,
 257.354 -                        copy_func cpfnc, void* cpdata) {
 257.355 -    UcxMap* result = ucx_map_clone_a(allocator, first, cpfnc, cpdata);
 257.356 -    ucx_map_copy(second, result, cpfnc, cpdata);
 257.357 -    return result;
 257.358 -}
 257.359 -
 257.360 -UcxMap* ucx_map_intersection(const UcxMap *first, const UcxMap *second,
 257.361 -                             copy_func cpfnc, void* cpdata) {
 257.362 -    return ucx_map_intersection_a(ucx_default_allocator(),
 257.363 -            first, second, cpfnc, cpdata);
 257.364 -}
 257.365 -
 257.366 -UcxMap* ucx_map_intersection_a(UcxAllocator *allocator,
 257.367 -                               const UcxMap *first, const UcxMap *second,
 257.368 -                               copy_func cpfnc, void* cpdata) {
 257.369 -    UcxMap *result = ucx_map_new_a(allocator, first->size < second->size ?
 257.370 -            first->size : second->size);
 257.371 -
 257.372 -    UcxMapIterator iter = ucx_map_iterator(first);
 257.373 -    void* value;
 257.374 -    UCX_MAP_FOREACH(key, value, iter) {
 257.375 -        if (ucx_map_get(second, key)) {
 257.376 -            ucx_map_put(result, key, cpfnc ? cpfnc(value, cpdata) : value);
 257.377 -        }
 257.378 -    }
 257.379 -
 257.380 -    return result;
 257.381 -}
 257.382 -
 257.383 -UcxMap* ucx_map_difference(const UcxMap *first, const UcxMap *second,
 257.384 -                           copy_func cpfnc, void* cpdata) {
 257.385 -    return ucx_map_difference_a(ucx_default_allocator(),
 257.386 -            first, second, cpfnc, cpdata);
 257.387 -}
 257.388 -
 257.389 -UcxMap* ucx_map_difference_a(UcxAllocator *allocator,
 257.390 -                             const UcxMap *first, const UcxMap *second,
 257.391 -                             copy_func cpfnc, void* cpdata) {
 257.392 -
 257.393 -    UcxMap *result = ucx_map_new_a(allocator, first->size - second->count);
 257.394 -
 257.395 -    UcxMapIterator iter = ucx_map_iterator(first);
 257.396 -    void* value;
 257.397 -    UCX_MAP_FOREACH(key, value, iter) {
 257.398 -        if (!ucx_map_get(second, key)) {
 257.399 -            ucx_map_put(result, key, cpfnc ? cpfnc(value, cpdata) : value);
 257.400 -        }
 257.401 -    }
 257.402 -
 257.403 -    ucx_map_rehash(result);
 257.404 -    return result;
 257.405 -}
 257.406 \ No newline at end of file
   258.1 --- a/src/mempool.c	Mon Dec 30 09:54:10 2019 +0100
   258.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   258.3 @@ -1,237 +0,0 @@
   258.4 -/*
   258.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   258.6 - *
   258.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   258.8 - *
   258.9 - * Redistribution and use in source and binary forms, with or without
  258.10 - * modification, are permitted provided that the following conditions are met:
  258.11 - *
  258.12 - *   1. Redistributions of source code must retain the above copyright
  258.13 - *      notice, this list of conditions and the following disclaimer.
  258.14 - *
  258.15 - *   2. Redistributions in binary form must reproduce the above copyright
  258.16 - *      notice, this list of conditions and the following disclaimer in the
  258.17 - *      documentation and/or other materials provided with the distribution.
  258.18 - *
  258.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  258.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  258.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  258.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  258.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  258.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  258.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  258.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  258.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  258.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  258.29 - * POSSIBILITY OF SUCH DAMAGE.
  258.30 - */
  258.31 -
  258.32 -#include "ucx/mempool.h"
  258.33 -
  258.34 -#include <stdlib.h>
  258.35 -#include <string.h>
  258.36 -#include <stdio.h>
  258.37 -#ifdef __cplusplus
  258.38 -#define __STDC_FORMAT_MACROS
  258.39 -#endif
  258.40 -#include <inttypes.h>
  258.41 -
  258.42 -/** Capsule for destructible memory chunks. */
  258.43 -typedef struct {
  258.44 -    /** The destructor for the memory chunk. */
  258.45 -    ucx_destructor destructor;
  258.46 -    /**
  258.47 -     * First byte of the memory chunk.
  258.48 -     * Note, that the address <code>&amp;c</code> is also the address
  258.49 -     * of the whole memory chunk.
  258.50 -     */
  258.51 -    char c;
  258.52 -} ucx_memchunk;
  258.53 -
  258.54 -/** Capsule for data and its destructor. */
  258.55 -typedef struct {
  258.56 -    /** The destructor for the data. */
  258.57 -    ucx_destructor destructor;
  258.58 -    /** A pointer to the data. */
  258.59 -    void           *ptr;
  258.60 -} ucx_regdestr;
  258.61 -
  258.62 -#ifdef __cplusplus
  258.63 -extern "C"
  258.64 -#endif
  258.65 -void ucx_mempool_shared_destr(void* ptr) {
  258.66 -    ucx_regdestr *rd = (ucx_regdestr*)ptr;
  258.67 -    rd->destructor(rd->ptr);
  258.68 -}
  258.69 -
  258.70 -UcxMempool *ucx_mempool_new(size_t n) {
  258.71 -    size_t poolsz;
  258.72 -    if(ucx_szmul(n, sizeof(void*), &poolsz)) {
  258.73 -        return NULL;
  258.74 -    }
  258.75 -    
  258.76 -    UcxMempool *pool = (UcxMempool*)malloc(sizeof(UcxMempool));
  258.77 -    if (!pool) {
  258.78 -        return NULL;
  258.79 -    }
  258.80 -    
  258.81 -    pool->data = (void**) malloc(poolsz);
  258.82 -    if (pool->data == NULL) {
  258.83 -        free(pool);
  258.84 -        return NULL;
  258.85 -    }
  258.86 -    
  258.87 -    pool->ndata = 0;
  258.88 -    pool->size = n;
  258.89 -    
  258.90 -    UcxAllocator *allocator = (UcxAllocator*)malloc(sizeof(UcxAllocator));
  258.91 -    if(!allocator) {
  258.92 -        free(pool->data);
  258.93 -        free(pool);
  258.94 -        return NULL;
  258.95 -    }
  258.96 -    allocator->malloc = (ucx_allocator_malloc)ucx_mempool_malloc;
  258.97 -    allocator->calloc = (ucx_allocator_calloc)ucx_mempool_calloc;
  258.98 -    allocator->realloc = (ucx_allocator_realloc)ucx_mempool_realloc;
  258.99 -    allocator->free = (ucx_allocator_free)ucx_mempool_free;
 258.100 -    allocator->pool = pool;
 258.101 -    pool->allocator = allocator;
 258.102 -    
 258.103 -    return pool;
 258.104 -}
 258.105 -
 258.106 -int ucx_mempool_chcap(UcxMempool *pool, size_t newcap) {
 258.107 -    if (newcap < pool->ndata) {
 258.108 -        return 1;
 258.109 -    }
 258.110 -    
 258.111 -    size_t newcapsz;
 258.112 -    if(ucx_szmul(newcap, sizeof(void*), &newcapsz)) {
 258.113 -        return 1;
 258.114 -    }
 258.115 -    
 258.116 -    void **data = (void**) realloc(pool->data, newcapsz);
 258.117 -    if (data) {
 258.118 -        pool->data = data; 
 258.119 -        pool->size = newcap;
 258.120 -        return 0;
 258.121 -    } else {
 258.122 -        return 1;
 258.123 -    }
 258.124 -}
 258.125 -
 258.126 -void *ucx_mempool_malloc(UcxMempool *pool, size_t n) {
 258.127 -    if(((size_t)-1) - sizeof(ucx_destructor) < n) {
 258.128 -        return NULL;
 258.129 -    }
 258.130 -    
 258.131 -    if (pool->ndata >= pool->size) {
 258.132 -        size_t newcap = pool->size*2;
 258.133 -        if (newcap < pool->size || ucx_mempool_chcap(pool, newcap)) {
 258.134 -            return NULL;
 258.135 -        }
 258.136 -    }
 258.137 -
 258.138 -    void *p = malloc(sizeof(ucx_destructor) + n);
 258.139 -    ucx_memchunk *mem = (ucx_memchunk*)p;
 258.140 -    if (!mem) {
 258.141 -        return NULL;
 258.142 -    }
 258.143 -
 258.144 -    mem->destructor = NULL;
 258.145 -    pool->data[pool->ndata] = mem;
 258.146 -    pool->ndata++;
 258.147 -
 258.148 -    return &(mem->c);
 258.149 -}
 258.150 -
 258.151 -void *ucx_mempool_calloc(UcxMempool *pool, size_t nelem, size_t elsize) {
 258.152 -    size_t msz;
 258.153 -    if(ucx_szmul(nelem, elsize, &msz)) {
 258.154 -        return NULL;
 258.155 -    }
 258.156 -    
 258.157 -    void *ptr = ucx_mempool_malloc(pool, msz);
 258.158 -    if (!ptr) {
 258.159 -        return NULL;
 258.160 -    }
 258.161 -    memset(ptr, 0, nelem * elsize);
 258.162 -    return ptr;
 258.163 -}
 258.164 -
 258.165 -void *ucx_mempool_realloc(UcxMempool *pool, void *ptr, size_t n) {
 258.166 -    if(((size_t)-1) - sizeof(ucx_destructor) < n) {
 258.167 -        return NULL;
 258.168 -    }
 258.169 -    
 258.170 -    char *mem = ((char*)ptr) - sizeof(ucx_destructor);
 258.171 -    char *newm = (char*) realloc(mem, n + sizeof(ucx_destructor));
 258.172 -    if (!newm) {
 258.173 -        return NULL;
 258.174 -    }
 258.175 -    if (mem != newm) {
 258.176 -        for(size_t i=0 ; i < pool->ndata ; i++) {
 258.177 -            if(pool->data[i] == mem) {
 258.178 -                pool->data[i] = newm;
 258.179 -                return newm + sizeof(ucx_destructor);
 258.180 -            }
 258.181 -        }
 258.182 -        fprintf(stderr, "FATAL: 0x%08" PRIxPTR" not in mpool 0x%08" PRIxPTR"\n",
 258.183 -          (intptr_t)ptr, (intptr_t)pool);
 258.184 -        abort();
 258.185 -    } else {
 258.186 -        return newm + sizeof(ucx_destructor);
 258.187 -    }
 258.188 -}
 258.189 -
 258.190 -void ucx_mempool_free(UcxMempool *pool, void *ptr) {
 258.191 -    ucx_memchunk *chunk = (ucx_memchunk*)((char*)ptr-sizeof(ucx_destructor));
 258.192 -    for(size_t i=0 ; i<pool->ndata ; i++) {
 258.193 -        if(chunk == pool->data[i]) {
 258.194 -            if(chunk->destructor != NULL) {
 258.195 -                chunk->destructor(&(chunk->c));
 258.196 -            }
 258.197 -            free(chunk);
 258.198 -            size_t last_index = pool->ndata - 1;
 258.199 -            if(i != last_index) {
 258.200 -                pool->data[i] = pool->data[last_index];
 258.201 -                pool->data[last_index] = NULL;
 258.202 -            }
 258.203 -            pool->ndata--;
 258.204 -            return;
 258.205 -        }
 258.206 -    }
 258.207 -    fprintf(stderr, "FATAL: 0x%08" PRIxPTR" not in mpool 0x%08" PRIxPTR"\n",
 258.208 -            (intptr_t)ptr, (intptr_t)pool);
 258.209 -    abort();
 258.210 -}
 258.211 -
 258.212 -void ucx_mempool_destroy(UcxMempool *pool) {
 258.213 -    ucx_memchunk *chunk;
 258.214 -    for(size_t i=0 ; i<pool->ndata ; i++) {
 258.215 -        chunk = (ucx_memchunk*) pool->data[i];
 258.216 -        if(chunk) {
 258.217 -            if(chunk->destructor) {
 258.218 -                chunk->destructor(&(chunk->c));
 258.219 -            }
 258.220 -            free(chunk);
 258.221 -        }
 258.222 -    }
 258.223 -    free(pool->data);
 258.224 -    free(pool->allocator);
 258.225 -    free(pool);
 258.226 -}
 258.227 -
 258.228 -void ucx_mempool_set_destr(void *ptr, ucx_destructor func) {
 258.229 -    *(ucx_destructor*)((char*)ptr-sizeof(ucx_destructor)) = func;
 258.230 -}
 258.231 -
 258.232 -void ucx_mempool_reg_destr(UcxMempool *pool, void *ptr, ucx_destructor destr) {
 258.233 -    ucx_regdestr *rd = (ucx_regdestr*)ucx_mempool_malloc(
 258.234 -            pool,
 258.235 -            sizeof(ucx_regdestr));
 258.236 -    rd->destructor = destr;
 258.237 -    rd->ptr = ptr;
 258.238 -    ucx_mempool_set_destr(rd, ucx_mempool_shared_destr);
 258.239 -}
 258.240 -
   259.1 --- a/src/properties.c	Mon Dec 30 09:54:10 2019 +0100
   259.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   259.3 @@ -1,264 +0,0 @@
   259.4 -/*
   259.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   259.6 - *
   259.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   259.8 - *
   259.9 - * Redistribution and use in source and binary forms, with or without
  259.10 - * modification, are permitted provided that the following conditions are met:
  259.11 - *
  259.12 - *   1. Redistributions of source code must retain the above copyright
  259.13 - *      notice, this list of conditions and the following disclaimer.
  259.14 - *
  259.15 - *   2. Redistributions in binary form must reproduce the above copyright
  259.16 - *      notice, this list of conditions and the following disclaimer in the
  259.17 - *      documentation and/or other materials provided with the distribution.
  259.18 - *
  259.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  259.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  259.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  259.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  259.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  259.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  259.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  259.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  259.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  259.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  259.29 - * POSSIBILITY OF SUCH DAMAGE.
  259.30 - */
  259.31 -
  259.32 -#include "ucx/properties.h"
  259.33 -
  259.34 -#include <stdio.h>
  259.35 -#include <stdlib.h>
  259.36 -#include <string.h>
  259.37 -
  259.38 -UcxProperties *ucx_properties_new() {
  259.39 -    UcxProperties *parser = (UcxProperties*)malloc(
  259.40 -            sizeof(UcxProperties));
  259.41 -    if(!parser) {
  259.42 -        return NULL;
  259.43 -    }
  259.44 -    
  259.45 -    parser->buffer = NULL;
  259.46 -    parser->buflen = 0;
  259.47 -    parser->pos = 0;
  259.48 -    parser->tmp = NULL;
  259.49 -    parser->tmplen = 0;
  259.50 -    parser->tmpcap = 0;
  259.51 -    parser->error = 0;
  259.52 -    parser->delimiter = '=';
  259.53 -    parser->comment1 = '#';
  259.54 -    parser->comment2 = 0;
  259.55 -    parser->comment3 = 0;   
  259.56 -    
  259.57 -    return parser;
  259.58 -}
  259.59 -
  259.60 -void ucx_properties_free(UcxProperties *parser) {
  259.61 -    if(parser->tmp) {
  259.62 -        free(parser->tmp);
  259.63 -    }
  259.64 -    free(parser);
  259.65 -}
  259.66 -
  259.67 -void ucx_properties_fill(UcxProperties *parser, char *buf, size_t len) {
  259.68 -    parser->buffer = buf;
  259.69 -    parser->buflen = len;
  259.70 -    parser->pos = 0;
  259.71 -}
  259.72 -
  259.73 -static void parser_tmp_append(UcxProperties *parser, char *buf, size_t len) {
  259.74 -    if(parser->tmpcap - parser->tmplen < len) {
  259.75 -        size_t newcap = parser->tmpcap + len + 64;
  259.76 -        parser->tmp = (char*)realloc(parser->tmp, newcap);
  259.77 -        parser->tmpcap = newcap;
  259.78 -    }
  259.79 -    memcpy(parser->tmp + parser->tmplen, buf, len);
  259.80 -    parser->tmplen += len;
  259.81 -}
  259.82 -
  259.83 -int ucx_properties_next(UcxProperties *parser, sstr_t *name, sstr_t *value)  {   
  259.84 -    if(parser->tmplen > 0) {
  259.85 -        char *buf = parser->buffer + parser->pos;
  259.86 -        size_t len = parser->buflen - parser->pos;
  259.87 -        sstr_t str = sstrn(buf, len);
  259.88 -        sstr_t nl = sstrchr(str, '\n');
  259.89 -        if(nl.ptr) {
  259.90 -            size_t newlen = (size_t)(nl.ptr - buf) + 1;
  259.91 -            parser_tmp_append(parser, buf, newlen);
  259.92 -            // the tmp buffer contains exactly one line now
  259.93 -            
  259.94 -            char *orig_buf = parser->buffer;
  259.95 -            size_t orig_len = parser->buflen;
  259.96 -            
  259.97 -            parser->buffer = parser->tmp;
  259.98 -            parser->buflen = parser->tmplen;
  259.99 -            parser->pos = 0;    
 259.100 -            parser->tmp = NULL;
 259.101 -            parser->tmpcap = 0;
 259.102 -            parser->tmplen = 0;
 259.103 -            // run ucx_properties_next with the tmp buffer as main buffer
 259.104 -            int ret = ucx_properties_next(parser, name, value);
 259.105 -            
 259.106 -            // restore original buffer
 259.107 -            parser->tmp = parser->buffer;
 259.108 -            parser->buffer = orig_buf;
 259.109 -            parser->buflen = orig_len;
 259.110 -            parser->pos = newlen;
 259.111 -            
 259.112 -            /*
 259.113 -             * if ret == 0 the tmp buffer contained just space or a comment
 259.114 -             * we parse again with the original buffer to get a name/value
 259.115 -             * or a new tmp buffer
 259.116 -             */
 259.117 -            return ret ? ret : ucx_properties_next(parser, name, value);
 259.118 -        } else {
 259.119 -            parser_tmp_append(parser, buf, len);
 259.120 -            return 0;
 259.121 -        }
 259.122 -    } else if(parser->tmp) {
 259.123 -        free(parser->tmp);
 259.124 -        parser->tmp = NULL;
 259.125 -    }
 259.126 -    
 259.127 -    char comment1 = parser->comment1;
 259.128 -    char comment2 = parser->comment2;
 259.129 -    char comment3 = parser->comment3;
 259.130 -    char delimiter = parser->delimiter;
 259.131 -    
 259.132 -    // get one line and parse it
 259.133 -    while(parser->pos < parser->buflen) {
 259.134 -        char *buf = parser->buffer + parser->pos;
 259.135 -        size_t len = parser->buflen - parser->pos;
 259.136 -        
 259.137 -        /*
 259.138 -         * First we check if we have at least one line. We also get indices of
 259.139 -         * delimiter and comment chars
 259.140 -         */
 259.141 -        size_t delimiter_index = 0;
 259.142 -        size_t comment_index = 0;
 259.143 -        int has_comment = 0;
 259.144 -
 259.145 -        size_t i = 0;
 259.146 -        char c = 0;
 259.147 -        for(;i<len;i++) {
 259.148 -            c = buf[i];
 259.149 -            if(c == comment1 || c == comment2 || c == comment3) {
 259.150 -                if(comment_index == 0) {
 259.151 -                    comment_index = i;
 259.152 -                    has_comment = 1;
 259.153 -                }
 259.154 -            } else if(c == delimiter) {
 259.155 -                if(delimiter_index == 0 && !has_comment) {
 259.156 -                    delimiter_index = i;
 259.157 -                }
 259.158 -            } else if(c == '\n') {
 259.159 -                break;
 259.160 -            }
 259.161 -        }
 259.162 -
 259.163 -        if(c != '\n') {
 259.164 -            // we don't have enough data for a line
 259.165 -            // store remaining bytes in temporary buffer for next round
 259.166 -            parser->tmpcap = len + 128;
 259.167 -            parser->tmp = (char*)malloc(parser->tmpcap);
 259.168 -            parser->tmplen = len;
 259.169 -            memcpy(parser->tmp, buf, len);
 259.170 -            return 0;
 259.171 -        }
 259.172 -        
 259.173 -        sstr_t line = has_comment ? sstrn(buf, comment_index) : sstrn(buf, i);
 259.174 -        // check line
 259.175 -        if(delimiter_index == 0) {
 259.176 -            line = sstrtrim(line);
 259.177 -            if(line.length != 0) {
 259.178 -                parser->error = 1;
 259.179 -            }
 259.180 -        } else {
 259.181 -            sstr_t n = sstrn(buf, delimiter_index);
 259.182 -            sstr_t v = sstrn(
 259.183 -                    buf + delimiter_index + 1,
 259.184 -                    line.length - delimiter_index - 1); 
 259.185 -            n = sstrtrim(n);
 259.186 -            v = sstrtrim(v);
 259.187 -            if(n.length != 0 || v.length != 0) {
 259.188 -                *name = n;
 259.189 -                *value = v;
 259.190 -                parser->pos += i + 1;
 259.191 -                return 1;
 259.192 -            } else {
 259.193 -                parser->error = 1;
 259.194 -            }
 259.195 -        }
 259.196 -        
 259.197 -        parser->pos += i + 1;
 259.198 -    }
 259.199 -    
 259.200 -    return 0;
 259.201 -}
 259.202 -
 259.203 -int ucx_properties2map(UcxProperties *parser, UcxMap *map) {
 259.204 -    sstr_t name;
 259.205 -    sstr_t value;
 259.206 -    while(ucx_properties_next(parser, &name, &value)) {
 259.207 -        value = sstrdup_a(map->allocator, value);
 259.208 -        if(!value.ptr) {
 259.209 -            return 1;
 259.210 -        }
 259.211 -        if(ucx_map_sstr_put(map, name, value.ptr)) {
 259.212 -            alfree(map->allocator, value.ptr);
 259.213 -            return 1;
 259.214 -        }
 259.215 -    }
 259.216 -    if (parser->error) {
 259.217 -        return parser->error;
 259.218 -    } else {
 259.219 -        return 0;
 259.220 -    }
 259.221 -}
 259.222 -
 259.223 -// buffer size is documented - change doc, when you change bufsize!
 259.224 -#define UCX_PROPLOAD_BUFSIZE  1024
 259.225 -int ucx_properties_load(UcxMap *map, FILE *file) {
 259.226 -    UcxProperties *parser = ucx_properties_new();
 259.227 -    if(!(parser && map && file)) {
 259.228 -        return 1;
 259.229 -    }
 259.230 -    
 259.231 -    int error = 0;
 259.232 -    size_t r;
 259.233 -    char buf[UCX_PROPLOAD_BUFSIZE];
 259.234 -    while((r = fread(buf, 1, UCX_PROPLOAD_BUFSIZE, file)) != 0) {
 259.235 -        ucx_properties_fill(parser, buf, r);
 259.236 -        error = ucx_properties2map(parser, map);
 259.237 -        if (error) {
 259.238 -            break;
 259.239 -        }
 259.240 -    }
 259.241 -    ucx_properties_free(parser);
 259.242 -    return error;
 259.243 -}
 259.244 -
 259.245 -int ucx_properties_store(UcxMap *map, FILE *file) {
 259.246 -    UcxMapIterator iter = ucx_map_iterator(map);
 259.247 -    void *v;
 259.248 -    sstr_t value;
 259.249 -    size_t written;
 259.250 -
 259.251 -    UCX_MAP_FOREACH(k, v, iter) {
 259.252 -        value = sstr((char*)v);
 259.253 -
 259.254 -        written = 0;
 259.255 -        written += fwrite(k.data, 1, k.len, file);
 259.256 -        written += fwrite(" = ", 1, 3, file);
 259.257 -        written += fwrite(value.ptr, 1, value.length, file);
 259.258 -        written += fwrite("\n", 1, 1, file);
 259.259 -
 259.260 -        if (written != k.len + value.length + 4) {
 259.261 -            return 1;
 259.262 -        }
 259.263 -    }
 259.264 -
 259.265 -    return 0;
 259.266 -}
 259.267 -
   260.1 --- a/src/stack.c	Mon Dec 30 09:54:10 2019 +0100
   260.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   260.3 @@ -1,165 +0,0 @@
   260.4 -/*
   260.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   260.6 - *
   260.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   260.8 - *
   260.9 - * Redistribution and use in source and binary forms, with or without
  260.10 - * modification, are permitted provided that the following conditions are met:
  260.11 - *
  260.12 - *   1. Redistributions of source code must retain the above copyright
  260.13 - *      notice, this list of conditions and the following disclaimer.
  260.14 - *
  260.15 - *   2. Redistributions in binary form must reproduce the above copyright
  260.16 - *      notice, this list of conditions and the following disclaimer in the
  260.17 - *      documentation and/or other materials provided with the distribution.
  260.18 - *
  260.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  260.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  260.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  260.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  260.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  260.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  260.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  260.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  260.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  260.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  260.29 - * POSSIBILITY OF SUCH DAMAGE.
  260.30 - */
  260.31 -
  260.32 -#include "ucx/stack.h"
  260.33 -
  260.34 -#include <string.h>
  260.35 -
  260.36 -static size_t ucx_stack_align(size_t n) {
  260.37 -    int align = n % sizeof(void*);
  260.38 -    if (align) {
  260.39 -        n += sizeof(void*) - align;
  260.40 -    }
  260.41 -    return n;
  260.42 -}
  260.43 -
  260.44 -void ucx_stack_init(UcxStack *stack, char* space, size_t size) {
  260.45 -    stack->size = size - size % sizeof(void*);
  260.46 -    stack->space = space;
  260.47 -    stack->top = NULL;
  260.48 -    
  260.49 -    stack->allocator.pool = stack;
  260.50 -    stack->allocator.malloc = (ucx_allocator_malloc) ucx_stack_malloc;
  260.51 -    stack->allocator.calloc = (ucx_allocator_calloc) ucx_stack_calloc;
  260.52 -    stack->allocator.realloc = (ucx_allocator_realloc) ucx_stack_realloc;
  260.53 -    stack->allocator.free = (ucx_allocator_free) ucx_stack_free;
  260.54 -}
  260.55 -
  260.56 -void *ucx_stack_malloc(UcxStack *stack, size_t n) {
  260.57 -
  260.58 -    if (ucx_stack_avail(stack) < ucx_stack_align(n)) {
  260.59 -        return NULL;
  260.60 -    } else {
  260.61 -        char *prev = stack->top;
  260.62 -        if (stack->top) {
  260.63 -            stack->top += ucx_stack_align(ucx_stack_topsize(stack));
  260.64 -        } else {
  260.65 -            stack->top = stack->space;
  260.66 -        }
  260.67 -        
  260.68 -        ((struct ucx_stack_metadata*)stack->top)->prev = prev;
  260.69 -        ((struct ucx_stack_metadata*)stack->top)->size = n;
  260.70 -        stack->top += sizeof(struct ucx_stack_metadata);
  260.71 -        
  260.72 -        return stack->top;
  260.73 -    }
  260.74 -}
  260.75 -
  260.76 -void *ucx_stack_calloc(UcxStack *stack, size_t nelem, size_t elsize) {
  260.77 -    void *mem = ucx_stack_malloc(stack, nelem*elsize);
  260.78 -    memset(mem, 0, nelem*elsize);
  260.79 -    return mem;
  260.80 -}
  260.81 -
  260.82 -void *ucx_stack_realloc(UcxStack *stack, void *ptr, size_t n) {
  260.83 -    if (ptr == stack->top) {
  260.84 -        if (stack->size - (stack->top - stack->space) < ucx_stack_align(n)) {
  260.85 -            return NULL;
  260.86 -        } else {
  260.87 -            ((struct ucx_stack_metadata*)stack->top - 1)->size = n;
  260.88 -            return ptr;
  260.89 -        }
  260.90 -    } else {
  260.91 -        if (ucx_stack_align(((struct ucx_stack_metadata*)ptr - 1)->size) <
  260.92 -                ucx_stack_align(n)) {
  260.93 -            void *nptr = ucx_stack_malloc(stack, n);
  260.94 -            if (nptr) {
  260.95 -                memcpy(nptr, ptr, n);
  260.96 -                ucx_stack_free(stack, ptr);
  260.97 -                
  260.98 -                return nptr;
  260.99 -            } else {
 260.100 -                return NULL;
 260.101 -            }
 260.102 -        } else {
 260.103 -            ((struct ucx_stack_metadata*)ptr - 1)->size = n;
 260.104 -            return ptr;
 260.105 -        }
 260.106 -    }
 260.107 -}
 260.108 -
 260.109 -void ucx_stack_free(UcxStack *stack, void *ptr) {
 260.110 -    if (ptr == stack->top) {
 260.111 -        stack->top = ((struct ucx_stack_metadata*) stack->top - 1)->prev;
 260.112 -    } else {
 260.113 -        struct ucx_stack_metadata *next = (struct ucx_stack_metadata*)(
 260.114 -            (char*)ptr +
 260.115 -            ucx_stack_align(((struct ucx_stack_metadata*) ptr - 1)->size)
 260.116 -        );
 260.117 -        next->prev = ((struct ucx_stack_metadata*) ptr - 1)->prev;
 260.118 -    }
 260.119 -}
 260.120 -
 260.121 -void ucx_stack_popn(UcxStack *stack, void *dest, size_t n) {
 260.122 -    if (ucx_stack_empty(stack)) {
 260.123 -        return;
 260.124 -    }
 260.125 -    
 260.126 -    if (dest) {
 260.127 -        size_t len = ucx_stack_topsize(stack);
 260.128 -        if (len > n) {
 260.129 -            len = n;
 260.130 -        }
 260.131 -
 260.132 -        memcpy(dest, stack->top, len);
 260.133 -    }
 260.134 -    
 260.135 -    ucx_stack_free(stack, stack->top);
 260.136 -}
 260.137 -
 260.138 -size_t ucx_stack_avail(UcxStack *stack) {
 260.139 -    size_t avail = ((stack->top ? (stack->size
 260.140 -                    - (stack->top - stack->space)
 260.141 -                    - ucx_stack_align(ucx_stack_topsize(stack)))
 260.142 -                    : stack->size));
 260.143 -    
 260.144 -    if (avail > sizeof(struct ucx_stack_metadata)) {
 260.145 -        return avail - sizeof(struct ucx_stack_metadata);
 260.146 -    } else {
 260.147 -        return 0;
 260.148 -    }
 260.149 -}
 260.150 -
 260.151 -void *ucx_stack_push(UcxStack *stack, size_t n, const void *data) {
 260.152 -    void *space = ucx_stack_malloc(stack, n);
 260.153 -    if (space) {
 260.154 -        memcpy(space, data, n);
 260.155 -    }
 260.156 -    return space;
 260.157 -}
 260.158 -
 260.159 -void *ucx_stack_pusharr(UcxStack *stack,
 260.160 -        size_t nelem, size_t elsize, const void *data) {
 260.161 -    
 260.162 -    // skip the memset by using malloc
 260.163 -    void *space = ucx_stack_malloc(stack, nelem*elsize);
 260.164 -    if (space) {
 260.165 -        memcpy(space, data, nelem*elsize);
 260.166 -    }
 260.167 -    return space;
 260.168 -}
   261.1 --- a/src/string.c	Mon Dec 30 09:54:10 2019 +0100
   261.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   261.3 @@ -1,807 +0,0 @@
   261.4 -/*
   261.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   261.6 - *
   261.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   261.8 - *
   261.9 - * Redistribution and use in source and binary forms, with or without
  261.10 - * modification, are permitted provided that the following conditions are met:
  261.11 - *
  261.12 - *   1. Redistributions of source code must retain the above copyright
  261.13 - *      notice, this list of conditions and the following disclaimer.
  261.14 - *
  261.15 - *   2. Redistributions in binary form must reproduce the above copyright
  261.16 - *      notice, this list of conditions and the following disclaimer in the
  261.17 - *      documentation and/or other materials provided with the distribution.
  261.18 - *
  261.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  261.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  261.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  261.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  261.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  261.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  261.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  261.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  261.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  261.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  261.29 - * POSSIBILITY OF SUCH DAMAGE.
  261.30 - */
  261.31 -
  261.32 -#include "ucx/string.h"
  261.33 -
  261.34 -#include "ucx/allocator.h"
  261.35 -
  261.36 -#include <stdlib.h>
  261.37 -#include <string.h>
  261.38 -#include <stdarg.h>
  261.39 -#include <stdint.h>
  261.40 -#include <ctype.h>
  261.41 -
  261.42 -#ifndef _WIN32
  261.43 -#include <strings.h> /* for strncasecmp() */
  261.44 -#endif /* _WIN32 */
  261.45 -
  261.46 -sstr_t sstr(char *cstring) {
  261.47 -    sstr_t string;
  261.48 -    string.ptr = cstring;
  261.49 -    string.length = strlen(cstring);
  261.50 -    return string;
  261.51 -}
  261.52 -
  261.53 -sstr_t sstrn(char *cstring, size_t length) {
  261.54 -    sstr_t string;
  261.55 -    string.ptr = cstring;
  261.56 -    string.length = length;
  261.57 -    return string;
  261.58 -}
  261.59 -
  261.60 -scstr_t scstr(const char *cstring) {
  261.61 -    scstr_t string;
  261.62 -    string.ptr = cstring;
  261.63 -    string.length = strlen(cstring);
  261.64 -    return string;
  261.65 -}
  261.66 -
  261.67 -scstr_t scstrn(const char *cstring, size_t length) {
  261.68 -    scstr_t string;
  261.69 -    string.ptr = cstring;
  261.70 -    string.length = length;
  261.71 -    return string;
  261.72 -}
  261.73 -
  261.74 -
  261.75 -size_t scstrnlen(size_t n, ...) {
  261.76 -    if (n == 0) return 0;
  261.77 -    
  261.78 -    va_list ap;
  261.79 -    va_start(ap, n);
  261.80 -    
  261.81 -    size_t size = 0;
  261.82 -
  261.83 -    for (size_t i = 0 ; i < n ; i++) {
  261.84 -        scstr_t str = va_arg(ap, scstr_t);
  261.85 -        if(SIZE_MAX - str.length < size) {
  261.86 -            size = SIZE_MAX;
  261.87 -            break;
  261.88 -        }
  261.89 -        size += str.length;
  261.90 -    }
  261.91 -    va_end(ap);
  261.92 -
  261.93 -    return size;
  261.94 -}
  261.95 -
  261.96 -static sstr_t sstrvcat_a(
  261.97 -        UcxAllocator *a,
  261.98 -        size_t count,
  261.99 -        scstr_t s1,
 261.100 -        va_list ap) {
 261.101 -    sstr_t str;
 261.102 -    str.ptr = NULL;
 261.103 -    str.length = 0;
 261.104 -    if(count < 2) {
 261.105 -        return str;
 261.106 -    }
 261.107 -    
 261.108 -    scstr_t s2 = va_arg (ap, scstr_t);
 261.109 -    
 261.110 -    if(((size_t)-1) - s1.length < s2.length) {
 261.111 -        return str;
 261.112 -    }
 261.113 -    
 261.114 -    scstr_t *strings = (scstr_t*) calloc(count, sizeof(scstr_t));
 261.115 -    if(!strings) {
 261.116 -        return str;
 261.117 -    }
 261.118 -    
 261.119 -    // get all args and overall length
 261.120 -    strings[0] = s1;
 261.121 -    strings[1] = s2;
 261.122 -    size_t slen = s1.length + s2.length;
 261.123 -    int error = 0;
 261.124 -    for (size_t i=2;i<count;i++) {
 261.125 -        scstr_t s = va_arg (ap, scstr_t);
 261.126 -        strings[i] = s;
 261.127 -        if(((size_t)-1) - s.length < slen) {
 261.128 -            error = 1;
 261.129 -            break;
 261.130 -        }
 261.131 -        slen += s.length;
 261.132 -    }
 261.133 -    if(error) {
 261.134 -        free(strings);
 261.135 -        return str;
 261.136 -    }
 261.137 -    
 261.138 -    // create new string
 261.139 -    str.ptr = (char*) almalloc(a, slen + 1);
 261.140 -    str.length = slen;
 261.141 -    if(!str.ptr) {
 261.142 -        free(strings);
 261.143 -        str.length = 0;
 261.144 -        return str;
 261.145 -    }
 261.146 -    
 261.147 -    // concatenate strings
 261.148 -    size_t pos = 0;
 261.149 -    for (size_t i=0;i<count;i++) {
 261.150 -        scstr_t s = strings[i];
 261.151 -        memcpy(str.ptr + pos, s.ptr, s.length);
 261.152 -        pos += s.length;
 261.153 -    }
 261.154 -    
 261.155 -    str.ptr[str.length] = '\0';
 261.156 -    
 261.157 -    free(strings);
 261.158 -    
 261.159 -    return str;
 261.160 -}
 261.161 -
 261.162 -sstr_t scstrcat(size_t count, scstr_t s1, ...) {
 261.163 -    va_list ap;
 261.164 -    va_start(ap, s1);
 261.165 -    sstr_t s = sstrvcat_a(ucx_default_allocator(), count, s1, ap);
 261.166 -    va_end(ap);
 261.167 -    return s;
 261.168 -}
 261.169 -
 261.170 -sstr_t scstrcat_a(UcxAllocator *a, size_t count, scstr_t s1, ...) {
 261.171 -    va_list ap;
 261.172 -    va_start(ap, s1);
 261.173 -    sstr_t s = sstrvcat_a(a, count, s1, ap);
 261.174 -    va_end(ap);
 261.175 -    return s;
 261.176 -}
 261.177 -
 261.178 -static int ucx_substring(
 261.179 -        size_t str_length,
 261.180 -        size_t start,
 261.181 -        size_t length,
 261.182 -        size_t *newlen,
 261.183 -        size_t *newpos)
 261.184 -{
 261.185 -    *newlen = 0;
 261.186 -    *newpos = 0;
 261.187 -    
 261.188 -    if(start > str_length) {
 261.189 -        return 0;
 261.190 -    }
 261.191 -    
 261.192 -    if(length > str_length - start) {
 261.193 -        length = str_length - start;
 261.194 -    }
 261.195 -    *newlen = length;
 261.196 -    *newpos = start;
 261.197 -    return 1;
 261.198 -}
 261.199 -
 261.200 -sstr_t sstrsubs(sstr_t s, size_t start) {
 261.201 -    return sstrsubsl (s, start, s.length-start);
 261.202 -}
 261.203 -
 261.204 -sstr_t sstrsubsl(sstr_t s, size_t start, size_t length) {
 261.205 -    size_t pos;
 261.206 -    sstr_t ret = { NULL, 0 };
 261.207 -    if(ucx_substring(s.length, start, length, &ret.length, &pos)) {
 261.208 -        ret.ptr = s.ptr + pos;
 261.209 -    }
 261.210 -    return ret;
 261.211 -}
 261.212 -
 261.213 -scstr_t scstrsubs(scstr_t string, size_t start) {
 261.214 -    return scstrsubsl(string, start, string.length-start);
 261.215 -}
 261.216 -
 261.217 -scstr_t scstrsubsl(scstr_t s, size_t start, size_t length) {
 261.218 -    size_t pos;
 261.219 -    scstr_t ret = { NULL, 0 };
 261.220 -    if(ucx_substring(s.length, start, length, &ret.length, &pos)) {
 261.221 -        ret.ptr = s.ptr + pos;
 261.222 -    }
 261.223 -    return ret;
 261.224 -}
 261.225 -
 261.226 -
 261.227 -static int ucx_strchr(const char *str, size_t length, int chr, size_t *pos) {
 261.228 -    for(size_t i=0;i<length;i++) {
 261.229 -        if(str[i] == chr) {
 261.230 -            *pos = i;
 261.231 -            return 1;
 261.232 -        }
 261.233 -    }
 261.234 -    return 0;
 261.235 -}
 261.236 -
 261.237 -static int ucx_strrchr(const char *str, size_t length, int chr, size_t *pos) {
 261.238 -    if(length > 0) {
 261.239 -        for(size_t i=length ; i>0 ; i--) {
 261.240 -            if(str[i-1] == chr) {
 261.241 -                *pos = i-1;
 261.242 -                return 1;
 261.243 -            }
 261.244 -        }
 261.245 -    }
 261.246 -    return 0;
 261.247 -}
 261.248 -
 261.249 -sstr_t sstrchr(sstr_t s, int c) {
 261.250 -    size_t pos = 0;
 261.251 -    if(ucx_strchr(s.ptr, s.length, c, &pos)) {
 261.252 -        return sstrsubs(s, pos);
 261.253 -    }
 261.254 -    return sstrn(NULL, 0);
 261.255 -}
 261.256 -
 261.257 -sstr_t sstrrchr(sstr_t s, int c) {
 261.258 -    size_t pos = 0;
 261.259 -    if(ucx_strrchr(s.ptr, s.length, c, &pos)) {
 261.260 -        return sstrsubs(s, pos);
 261.261 -    }
 261.262 -    return sstrn(NULL, 0);
 261.263 -}
 261.264 -
 261.265 -scstr_t scstrchr(scstr_t s, int c) {
 261.266 -    size_t pos = 0;
 261.267 -    if(ucx_strchr(s.ptr, s.length, c, &pos)) {
 261.268 -        return scstrsubs(s, pos);
 261.269 -    }
 261.270 -    return scstrn(NULL, 0);
 261.271 -}
 261.272 -
 261.273 -scstr_t scstrrchr(scstr_t s, int c) {
 261.274 -    size_t pos = 0;
 261.275 -    if(ucx_strrchr(s.ptr, s.length, c, &pos)) {
 261.276 -        return scstrsubs(s, pos);
 261.277 -    }
 261.278 -    return scstrn(NULL, 0);
 261.279 -}
 261.280 -
 261.281 -#define ptable_r(dest, useheap, ptable, index) (dest = useheap ? \
 261.282 -    ((size_t*)ptable)[index] : (size_t) ((uint8_t*)ptable)[index])
 261.283 -
 261.284 -#define ptable_w(useheap, ptable, index, src) do {\
 261.285 -    if (!useheap) ((uint8_t*)ptable)[index] = (uint8_t) src;\
 261.286 -    else ((size_t*)ptable)[index] = src;\
 261.287 -    } while (0);
 261.288 -
 261.289 -
 261.290 -static const char* ucx_strstr(
 261.291 -        const char *str,
 261.292 -        size_t length,
 261.293 -        const char *match,
 261.294 -        size_t matchlen,
 261.295 -        size_t *newlen)
 261.296 -{
 261.297 -    *newlen = length;
 261.298 -    if (matchlen == 0) {
 261.299 -        return str;
 261.300 -    }
 261.301 -    
 261.302 -    const char *result = NULL;
 261.303 -    size_t resultlen = 0;
 261.304 -    
 261.305 -    /*
 261.306 -     * IMPORTANT:
 261.307 -     * our prefix table contains the prefix length PLUS ONE
 261.308 -     * this is our decision, because we want to use the full range of size_t
 261.309 -     * the original algorithm needs a (-1) at one single place
 261.310 -     * and we want to avoid that
 261.311 -     */
 261.312 -    
 261.313 -    /* static prefix table */
 261.314 -    static uint8_t s_prefix_table[256];
 261.315 -    
 261.316 -    /* check pattern length and use appropriate prefix table */
 261.317 -    /* if the pattern exceeds static prefix table, allocate on the heap */
 261.318 -    register int useheap = matchlen > 255;
 261.319 -    register void* ptable = useheap ?
 261.320 -        calloc(matchlen+1, sizeof(size_t)): s_prefix_table;
 261.321 -    
 261.322 -    /* keep counter in registers */
 261.323 -    register size_t i, j;
 261.324 -    
 261.325 -    /* fill prefix table */
 261.326 -    i = 0; j = 0;
 261.327 -    ptable_w(useheap, ptable, i, j);
 261.328 -    while (i < matchlen) {
 261.329 -        while (j >= 1 && match[j-1] != match[i]) {
 261.330 -            ptable_r(j, useheap, ptable, j-1);
 261.331 -        }
 261.332 -        i++; j++;
 261.333 -        ptable_w(useheap, ptable, i, j);
 261.334 -    }
 261.335 -
 261.336 -    /* search */
 261.337 -    i = 0; j = 1;
 261.338 -    while (i < length) {
 261.339 -        while (j >= 1 && str[i] != match[j-1]) {
 261.340 -            ptable_r(j, useheap, ptable, j-1);
 261.341 -        }
 261.342 -        i++; j++;
 261.343 -        if (j-1 == matchlen) {
 261.344 -            size_t start = i - matchlen;
 261.345 -            result = str + start;
 261.346 -            resultlen = length - start;
 261.347 -            break;
 261.348 -        }
 261.349 -    }
 261.350 -
 261.351 -    /* if prefix table was allocated on the heap, free it */
 261.352 -    if (ptable != s_prefix_table) {
 261.353 -        free(ptable);
 261.354 -    }
 261.355 -    
 261.356 -    *newlen = resultlen;
 261.357 -    return result;
 261.358 -}
 261.359 -
 261.360 -sstr_t scstrsstr(sstr_t string, scstr_t match) {
 261.361 -    sstr_t result;
 261.362 -    
 261.363 -    size_t reslen;
 261.364 -    const char *resstr = ucx_strstr(string.ptr, string.length, match.ptr, match.length, &reslen);
 261.365 -    if(!resstr) {
 261.366 -        result.ptr = NULL;
 261.367 -        result.length = 0;
 261.368 -        return result;
 261.369 -    }
 261.370 -    
 261.371 -    size_t pos = resstr - string.ptr;
 261.372 -    result.ptr = string.ptr + pos;
 261.373 -    result.length = reslen;
 261.374 -    
 261.375 -    return result;
 261.376 -}
 261.377 -
 261.378 -scstr_t scstrscstr(scstr_t string, scstr_t match) {
 261.379 -    scstr_t result;
 261.380 -    
 261.381 -    size_t reslen;
 261.382 -    const char *resstr = ucx_strstr(string.ptr, string.length, match.ptr, match.length, &reslen);
 261.383 -    if(!resstr) {
 261.384 -        result.ptr = NULL;
 261.385 -        result.length = 0;
 261.386 -        return result;
 261.387 -    }
 261.388 -    
 261.389 -    size_t pos = resstr - string.ptr;
 261.390 -    result.ptr = string.ptr + pos;
 261.391 -    result.length = reslen;
 261.392 -    
 261.393 -    return result;
 261.394 -}
 261.395 -
 261.396 -#undef ptable_r
 261.397 -#undef ptable_w
 261.398 -
 261.399 -sstr_t* scstrsplit(scstr_t s, scstr_t d, ssize_t *n) {
 261.400 -    return scstrsplit_a(ucx_default_allocator(), s, d, n);
 261.401 -}
 261.402 -
 261.403 -sstr_t* scstrsplit_a(UcxAllocator *allocator, scstr_t s, scstr_t d, ssize_t *n) {
 261.404 -    if (s.length == 0 || d.length == 0) {
 261.405 -        *n = -1;
 261.406 -        return NULL;
 261.407 -    }
 261.408 -    
 261.409 -    /* special cases: delimiter is at least as large as the string */
 261.410 -    if (d.length >= s.length) {
 261.411 -        /* exact match */
 261.412 -        if (sstrcmp(s, d) == 0) {
 261.413 -            *n = 0;
 261.414 -            return NULL;
 261.415 -        } else /* no match possible */ {
 261.416 -            *n = 1;
 261.417 -            sstr_t *result = (sstr_t*) almalloc(allocator, sizeof(sstr_t));
 261.418 -            if(result) {
 261.419 -                *result = sstrdup_a(allocator, s);
 261.420 -            } else {
 261.421 -                *n = -2;
 261.422 -            }
 261.423 -            return result;
 261.424 -        }
 261.425 -    }
 261.426 -    
 261.427 -    ssize_t nmax = *n;
 261.428 -    size_t arrlen = 16;
 261.429 -    sstr_t* result = (sstr_t*) alcalloc(allocator, arrlen, sizeof(sstr_t));
 261.430 -
 261.431 -    if (result) {
 261.432 -        scstr_t curpos = s;
 261.433 -        ssize_t j = 1;
 261.434 -        while (1) {
 261.435 -            scstr_t match;
 261.436 -            /* optimize for one byte delimiters */
 261.437 -            if (d.length == 1) {
 261.438 -                match = curpos;
 261.439 -                for (size_t i = 0 ; i < curpos.length ; i++) {
 261.440 -                    if (curpos.ptr[i] == *(d.ptr)) {
 261.441 -                        match.ptr = curpos.ptr + i;
 261.442 -                        break;
 261.443 -                    }
 261.444 -                    match.length--;
 261.445 -                }
 261.446 -            } else {
 261.447 -                match = scstrscstr(curpos, d);
 261.448 -            }
 261.449 -            if (match.length > 0) {
 261.450 -                /* is this our last try? */
 261.451 -                if (nmax == 0 || j < nmax) {
 261.452 -                    /* copy the current string to the array */
 261.453 -                    scstr_t item = scstrn(curpos.ptr, match.ptr - curpos.ptr);
 261.454 -                    result[j-1] = sstrdup_a(allocator, item);
 261.455 -                    size_t processed = item.length + d.length;
 261.456 -                    curpos.ptr += processed;
 261.457 -                    curpos.length -= processed;
 261.458 -
 261.459 -                    /* allocate memory for the next string */
 261.460 -                    j++;
 261.461 -                    if (j > arrlen) {
 261.462 -                        arrlen *= 2;
 261.463 -                        size_t reallocsz;
 261.464 -                        sstr_t* reallocated = NULL;
 261.465 -                        if(!ucx_szmul(arrlen, sizeof(sstr_t), &reallocsz)) {
 261.466 -                            reallocated = (sstr_t*) alrealloc(
 261.467 -                                    allocator, result, reallocsz);
 261.468 -                        }
 261.469 -                        if (reallocated) {
 261.470 -                            result = reallocated;
 261.471 -                        } else {
 261.472 -                            for (ssize_t i = 0 ; i < j-1 ; i++) {
 261.473 -                                alfree(allocator, result[i].ptr);
 261.474 -                            }
 261.475 -                            alfree(allocator, result);
 261.476 -                            *n = -2;
 261.477 -                            return NULL;
 261.478 -                        }
 261.479 -                    }
 261.480 -                } else {
 261.481 -                    /* nmax reached, copy the _full_ remaining string */
 261.482 -                    result[j-1] = sstrdup_a(allocator, curpos);
 261.483 -                    break;
 261.484 -                }
 261.485 -            } else {
 261.486 -                /* no more matches, copy last string */
 261.487 -                result[j-1] = sstrdup_a(allocator, curpos);
 261.488 -                break;
 261.489 -            }
 261.490 -        }
 261.491 -        *n = j;
 261.492 -    } else {
 261.493 -        *n = -2;
 261.494 -    }
 261.495 -
 261.496 -    return result;
 261.497 -}
 261.498 -
 261.499 -int scstrcmp(scstr_t s1, scstr_t s2) {
 261.500 -    if (s1.length == s2.length) {
 261.501 -        return memcmp(s1.ptr, s2.ptr, s1.length);
 261.502 -    } else if (s1.length > s2.length) {
 261.503 -        return 1;
 261.504 -    } else {
 261.505 -        return -1;
 261.506 -    }
 261.507 -}
 261.508 -
 261.509 -int scstrcasecmp(scstr_t s1, scstr_t s2) {
 261.510 -    if (s1.length == s2.length) {
 261.511 -#ifdef _WIN32
 261.512 -        return _strnicmp(s1.ptr, s2.ptr, s1.length);
 261.513 -#else
 261.514 -        return strncasecmp(s1.ptr, s2.ptr, s1.length);
 261.515 -#endif
 261.516 -    } else if (s1.length > s2.length) {
 261.517 -        return 1;
 261.518 -    } else {
 261.519 -        return -1;
 261.520 -    }
 261.521 -}
 261.522 -
 261.523 -sstr_t scstrdup(scstr_t s) {
 261.524 -    return sstrdup_a(ucx_default_allocator(), s);
 261.525 -}
 261.526 -
 261.527 -sstr_t scstrdup_a(UcxAllocator *allocator, scstr_t s) {
 261.528 -    sstr_t newstring;
 261.529 -    newstring.ptr = (char*)almalloc(allocator, s.length + 1);
 261.530 -    if (newstring.ptr) {
 261.531 -        newstring.length = s.length;
 261.532 -        newstring.ptr[newstring.length] = 0;
 261.533 -        
 261.534 -        memcpy(newstring.ptr, s.ptr, s.length);
 261.535 -    } else {
 261.536 -        newstring.length = 0;
 261.537 -    }
 261.538 -    
 261.539 -    return newstring;
 261.540 -}
 261.541 -
 261.542 -
 261.543 -static size_t ucx_strtrim(const char *s, size_t len, size_t *newlen) {
 261.544 -    const char *newptr = s;
 261.545 -    size_t length = len;
 261.546 -    
 261.547 -    while(length > 0 && isspace(*newptr)) {
 261.548 -        newptr++;
 261.549 -        length--;
 261.550 -    }
 261.551 -    while(length > 0 && isspace(newptr[length-1])) {
 261.552 -        length--;
 261.553 -    }
 261.554 -    
 261.555 -    *newlen = length;
 261.556 -    return newptr - s;
 261.557 -}
 261.558 -
 261.559 -sstr_t sstrtrim(sstr_t string) {
 261.560 -    sstr_t newstr;
 261.561 -    newstr.ptr = string.ptr
 261.562 -                 + ucx_strtrim(string.ptr, string.length, &newstr.length);
 261.563 -    return newstr;
 261.564 -}
 261.565 -
 261.566 -scstr_t scstrtrim(scstr_t string) {
 261.567 -    scstr_t newstr;
 261.568 -    newstr.ptr = string.ptr
 261.569 -                 + ucx_strtrim(string.ptr, string.length, &newstr.length);
 261.570 -    return newstr;
 261.571 -}
 261.572 -
 261.573 -int scstrprefix(scstr_t string, scstr_t prefix) {
 261.574 -    if (string.length == 0) {
 261.575 -        return prefix.length == 0;
 261.576 -    }
 261.577 -    if (prefix.length == 0) {
 261.578 -        return 1;
 261.579 -    }
 261.580 -    
 261.581 -    if (prefix.length > string.length) {
 261.582 -        return 0;
 261.583 -    } else {
 261.584 -        return memcmp(string.ptr, prefix.ptr, prefix.length) == 0;
 261.585 -    }
 261.586 -}
 261.587 -
 261.588 -int scstrsuffix(scstr_t string, scstr_t suffix) {
 261.589 -    if (string.length == 0) {
 261.590 -        return suffix.length == 0;
 261.591 -    }
 261.592 -    if (suffix.length == 0) {
 261.593 -        return 1;
 261.594 -    }
 261.595 -    
 261.596 -    if (suffix.length > string.length) {
 261.597 -        return 0;
 261.598 -    } else {
 261.599 -        return memcmp(string.ptr+string.length-suffix.length,
 261.600 -            suffix.ptr, suffix.length) == 0;
 261.601 -    }
 261.602 -}
 261.603 -
 261.604 -int scstrcaseprefix(scstr_t string, scstr_t prefix) {
 261.605 -    if (string.length == 0) {
 261.606 -        return prefix.length == 0;
 261.607 -    }
 261.608 -    if (prefix.length == 0) {
 261.609 -        return 1;
 261.610 -    }
 261.611 -    
 261.612 -    if (prefix.length > string.length) {
 261.613 -        return 0;
 261.614 -    } else {
 261.615 -        scstr_t subs = scstrsubsl(string, 0, prefix.length);
 261.616 -        return scstrcasecmp(subs, prefix) == 0;
 261.617 -    }
 261.618 -}
 261.619 -
 261.620 -int scstrcasesuffix(scstr_t string, scstr_t suffix) {
 261.621 -    if (string.length == 0) {
 261.622 -        return suffix.length == 0;
 261.623 -    }
 261.624 -    if (suffix.length == 0) {
 261.625 -        return 1;
 261.626 -    }
 261.627 -    
 261.628 -    if (suffix.length > string.length) {
 261.629 -        return 0;
 261.630 -    } else {
 261.631 -        scstr_t subs = scstrsubs(string, string.length-suffix.length);
 261.632 -        return scstrcasecmp(subs, suffix) == 0;
 261.633 -    }
 261.634 -}
 261.635 -
 261.636 -sstr_t scstrlower(scstr_t string) {
 261.637 -    sstr_t ret = sstrdup(string);
 261.638 -    for (size_t i = 0; i < ret.length ; i++) {
 261.639 -        ret.ptr[i] = tolower(ret.ptr[i]);
 261.640 -    }
 261.641 -    return ret;
 261.642 -}
 261.643 -
 261.644 -sstr_t scstrlower_a(UcxAllocator *allocator, scstr_t string) {
 261.645 -    sstr_t ret = sstrdup_a(allocator, string);
 261.646 -    for (size_t i = 0; i < ret.length ; i++) {
 261.647 -        ret.ptr[i] = tolower(ret.ptr[i]);
 261.648 -    }
 261.649 -    return ret;
 261.650 -}
 261.651 -
 261.652 -sstr_t scstrupper(scstr_t string) {
 261.653 -    sstr_t ret = sstrdup(string);
 261.654 -    for (size_t i = 0; i < ret.length ; i++) {
 261.655 -        ret.ptr[i] = toupper(ret.ptr[i]);
 261.656 -    }
 261.657 -    return ret;
 261.658 -}
 261.659 -
 261.660 -sstr_t scstrupper_a(UcxAllocator *allocator, scstr_t string) {
 261.661 -    sstr_t ret = sstrdup_a(allocator, string);
 261.662 -    for (size_t i = 0; i < ret.length ; i++) {
 261.663 -        ret.ptr[i] = toupper(ret.ptr[i]);
 261.664 -    }
 261.665 -    return ret;
 261.666 -}
 261.667 -
 261.668 -#define REPLACE_INDEX_BUFFER_MAX 100
 261.669 -
 261.670 -struct scstrreplace_ibuf {
 261.671 -    size_t* buf;
 261.672 -    unsigned int len; /* small indices */
 261.673 -    struct scstrreplace_ibuf* next;
 261.674 -};
 261.675 -
 261.676 -static void scstrrepl_free_ibuf(struct scstrreplace_ibuf *buf) {
 261.677 -    while (buf) {
 261.678 -        struct scstrreplace_ibuf *next = buf->next;
 261.679 -        free(buf->buf);
 261.680 -        free(buf);
 261.681 -        buf = next;
 261.682 -    }
 261.683 -}
 261.684 -
 261.685 -sstr_t scstrreplacen_a(UcxAllocator *allocator, scstr_t str,
 261.686 -                     scstr_t pattern, scstr_t replacement, size_t replmax) {
 261.687 -
 261.688 -    if (pattern.length == 0 || pattern.length > str.length || replmax == 0)
 261.689 -        return sstrdup(str);
 261.690 -
 261.691 -    /* Compute expected buffer length */
 261.692 -    size_t ibufmax = str.length / pattern.length;
 261.693 -    size_t ibuflen = replmax < ibufmax ? replmax : ibufmax;
 261.694 -    if (ibuflen > REPLACE_INDEX_BUFFER_MAX) {
 261.695 -        ibuflen = REPLACE_INDEX_BUFFER_MAX;
 261.696 -    }
 261.697 -
 261.698 -    /* Allocate first index buffer */
 261.699 -    struct scstrreplace_ibuf *firstbuf, *curbuf;
 261.700 -    firstbuf = curbuf = calloc(1, sizeof(struct scstrreplace_ibuf));
 261.701 -    if (!firstbuf) return sstrn(NULL, 0);
 261.702 -    firstbuf->buf = calloc(ibuflen, sizeof(size_t));
 261.703 -    if (!firstbuf->buf) {
 261.704 -        free(firstbuf);
 261.705 -        return sstrn(NULL, 0);
 261.706 -    }
 261.707 -
 261.708 -    /* Search occurrences */
 261.709 -    scstr_t searchstr = str;
 261.710 -    size_t found = 0;
 261.711 -    do {
 261.712 -        scstr_t match = scstrscstr(searchstr, pattern);
 261.713 -        if (match.length > 0) {
 261.714 -            /* Allocate next buffer in chain, if required */
 261.715 -            if (curbuf->len == ibuflen) {
 261.716 -                struct scstrreplace_ibuf *nextbuf =
 261.717 -                        calloc(1, sizeof(struct scstrreplace_ibuf));
 261.718 -                if (!nextbuf) {
 261.719 -                    scstrrepl_free_ibuf(firstbuf);
 261.720 -                    return sstrn(NULL, 0);
 261.721 -                }
 261.722 -                nextbuf->buf = calloc(ibuflen, sizeof(size_t));
 261.723 -                if (!nextbuf->buf) {
 261.724 -                    free(nextbuf);
 261.725 -                    scstrrepl_free_ibuf(firstbuf);
 261.726 -                    return sstrn(NULL, 0);
 261.727 -                }
 261.728 -                curbuf->next = nextbuf;
 261.729 -                curbuf = nextbuf;
 261.730 -            }
 261.731 -
 261.732 -            /* Record match index */
 261.733 -            found++;
 261.734 -            size_t idx = match.ptr - str.ptr;
 261.735 -            curbuf->buf[curbuf->len++] = idx;
 261.736 -            searchstr.ptr = match.ptr + pattern.length;
 261.737 -            searchstr.length = str.length - idx - pattern.length;
 261.738 -        } else {
 261.739 -            break;
 261.740 -        }
 261.741 -    } while (searchstr.length > 0 && found < replmax);
 261.742 -
 261.743 -    /* Allocate result string */
 261.744 -    sstr_t result;
 261.745 -    {
 261.746 -        ssize_t adjlen = (ssize_t) replacement.length - (ssize_t) pattern.length;
 261.747 -        size_t rcount = 0;
 261.748 -        curbuf = firstbuf;
 261.749 -        do {
 261.750 -            rcount += curbuf->len;
 261.751 -            curbuf = curbuf->next;
 261.752 -        } while (curbuf);
 261.753 -        result.length = str.length + rcount * adjlen;
 261.754 -        result.ptr = almalloc(allocator, result.length);
 261.755 -        if (!result.ptr) {
 261.756 -            scstrrepl_free_ibuf(firstbuf);
 261.757 -            return sstrn(NULL, 0);
 261.758 -        }
 261.759 -    }
 261.760 -
 261.761 -    /* Build result string */
 261.762 -    curbuf = firstbuf;
 261.763 -    size_t srcidx = 0;
 261.764 -    char* destptr = result.ptr;
 261.765 -    do {
 261.766 -        for (size_t i = 0; i < curbuf->len; i++) {
 261.767 -            /* Copy source part up to next match*/
 261.768 -            size_t idx = curbuf->buf[i];
 261.769 -            size_t srclen = idx - srcidx;
 261.770 -            if (srclen > 0) {
 261.771 -                memcpy(destptr, str.ptr+srcidx, srclen);
 261.772 -                destptr += srclen;
 261.773 -                srcidx += srclen;
 261.774 -            }
 261.775 -
 261.776 -            /* Copy the replacement and skip the source pattern */
 261.777 -            srcidx += pattern.length;
 261.778 -            memcpy(destptr, replacement.ptr, replacement.length);
 261.779 -            destptr += replacement.length;
 261.780 -        }
 261.781 -        curbuf = curbuf->next;
 261.782 -    } while (curbuf);
 261.783 -    memcpy(destptr, str.ptr+srcidx, str.length-srcidx);
 261.784 -
 261.785 -    /* Free index buffer */
 261.786 -    scstrrepl_free_ibuf(firstbuf);
 261.787 -
 261.788 -    return result;
 261.789 -}
 261.790 -
 261.791 -sstr_t scstrreplacen(scstr_t str, scstr_t pattern,
 261.792 -        scstr_t replacement, size_t replmax) {
 261.793 -    return scstrreplacen_a(ucx_default_allocator(),
 261.794 -            str, pattern, replacement, replmax);
 261.795 -}
 261.796 -
 261.797 -
 261.798 -// type adjustment functions
 261.799 -scstr_t ucx_sc2sc(scstr_t str) {
 261.800 -    return str;
 261.801 -}
 261.802 -scstr_t ucx_ss2sc(sstr_t str) {
 261.803 -    scstr_t cs;
 261.804 -    cs.ptr = str.ptr;
 261.805 -    cs.length = str.length;
 261.806 -    return cs;
 261.807 -}
 261.808 -scstr_t ucx_ss2c_s(scstr_t c) {
 261.809 -    return c;
 261.810 -}
   262.1 --- a/src/test.c	Mon Dec 30 09:54:10 2019 +0100
   262.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   262.3 @@ -1,91 +0,0 @@
   262.4 -/*
   262.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   262.6 - *
   262.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   262.8 - *
   262.9 - * Redistribution and use in source and binary forms, with or without
  262.10 - * modification, are permitted provided that the following conditions are met:
  262.11 - *
  262.12 - *   1. Redistributions of source code must retain the above copyright
  262.13 - *      notice, this list of conditions and the following disclaimer.
  262.14 - *
  262.15 - *   2. Redistributions in binary form must reproduce the above copyright
  262.16 - *      notice, this list of conditions and the following disclaimer in the
  262.17 - *      documentation and/or other materials provided with the distribution.
  262.18 - *
  262.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  262.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  262.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  262.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  262.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  262.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  262.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  262.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  262.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  262.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  262.29 - * POSSIBILITY OF SUCH DAMAGE.
  262.30 - */
  262.31 -
  262.32 -#include "ucx/test.h"
  262.33 -
  262.34 -UcxTestSuite* ucx_test_suite_new() {
  262.35 -    UcxTestSuite* suite = (UcxTestSuite*) malloc(sizeof(UcxTestSuite));
  262.36 -    if (suite != NULL) {
  262.37 -        suite->success = 0;
  262.38 -        suite->failure = 0;
  262.39 -        suite->tests = NULL;
  262.40 -    }
  262.41 -
  262.42 -    return suite;
  262.43 -}
  262.44 -
  262.45 -void ucx_test_suite_free(UcxTestSuite* suite) {
  262.46 -    UcxTestList *l = suite->tests;
  262.47 -    while (l != NULL) {
  262.48 -        UcxTestList *e = l;
  262.49 -        l = l->next;
  262.50 -        free(e);
  262.51 -    }
  262.52 -    free(suite);
  262.53 -}
  262.54 -
  262.55 -int ucx_test_register(UcxTestSuite* suite, UcxTest test) {
  262.56 -    if (suite->tests) {
  262.57 -        UcxTestList *newelem = (UcxTestList*) malloc(sizeof(UcxTestList));
  262.58 -        if (newelem) {
  262.59 -            newelem->test = test;
  262.60 -            newelem->next = NULL;
  262.61 -            
  262.62 -            UcxTestList *last = suite->tests;
  262.63 -            while (last->next) {
  262.64 -                last = last->next;
  262.65 -            }
  262.66 -            last->next = newelem;
  262.67 -            
  262.68 -            return EXIT_SUCCESS;
  262.69 -        } else {
  262.70 -            return EXIT_FAILURE;
  262.71 -        }
  262.72 -    } else {
  262.73 -        suite->tests = (UcxTestList*) malloc(sizeof(UcxTestList));
  262.74 -        if (suite->tests) {
  262.75 -            suite->tests->test = test;
  262.76 -            suite->tests->next = NULL;
  262.77 -            
  262.78 -            return EXIT_SUCCESS;
  262.79 -        } else {
  262.80 -            return EXIT_FAILURE;
  262.81 -        }
  262.82 -    }
  262.83 -}
  262.84 -
  262.85 -void ucx_test_run(UcxTestSuite* suite, FILE* output) {
  262.86 -    suite->success = 0;
  262.87 -    suite->failure = 0;
  262.88 -    for (UcxTestList* elem = suite->tests ; elem ; elem = elem->next) {
  262.89 -        elem->test(suite, output);
  262.90 -    }
  262.91 -    fwrite("\nAll test completed.\n", 1, 21, output);
  262.92 -    fprintf(output, "  Total:   %u\n  Success: %u\n  Failure: %u\n",
  262.93 -            suite->success+suite->failure, suite->success, suite->failure);
  262.94 -}
   263.1 --- a/src/ucx.c	Mon Dec 30 09:54:10 2019 +0100
   263.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   263.3 @@ -1,62 +0,0 @@
   263.4 -/**
   263.5 - * @mainpage UAP Common Extensions
   263.6 - * Library with common and useful functions, macros and data structures.
   263.7 - * <p>
   263.8 - * Latest available source:<br>
   263.9 - * <a href="https://sourceforge.net/projects/ucx/files/">
  263.10 - * https://sourceforge.net/projects/ucx/files/</a>
  263.11 - * </p>
  263.12 - * 
  263.13 - * <p>
  263.14 - * Repositories:<br>
  263.15 - * <a href="https://sourceforge.net/p/ucx/code">
  263.16 - * https://sourceforge.net/p/ucx/code</a>
  263.17 - * -&nbsp;or&nbsp;-
  263.18 - * <a href="https://develop.uap-core.de/hg/ucx">
  263.19 - * https://develop.uap-core.de/hg/ucx</a>
  263.20 - * </p>
  263.21 - * 
  263.22 - * <h2>LICENCE</h2>
  263.23 - * 
  263.24 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
  263.25 - *
  263.26 - * Redistribution and use in source and binary forms, with or without
  263.27 - * modification, are permitted provided that the following conditions are met:
  263.28 - *
  263.29 - *   1. Redistributions of source code must retain the above copyright
  263.30 - *      notice, this list of conditions and the following disclaimer.
  263.31 - *
  263.32 - *   2. Redistributions in binary form must reproduce the above copyright
  263.33 - *      notice, this list of conditions and the following disclaimer in the
  263.34 - *      documentation and/or other materials provided with the distribution.
  263.35 - *
  263.36 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  263.37 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  263.38 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  263.39 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  263.40 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  263.41 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  263.42 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  263.43 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  263.44 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  263.45 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  263.46 - * POSSIBILITY OF SUCH DAMAGE.
  263.47 - */
  263.48 -
  263.49 -#include "ucx/ucx.h"
  263.50 -
  263.51 -int ucx_szmul_impl(size_t a, size_t b, size_t *result) {
  263.52 -    if(a == 0 || b == 0) {
  263.53 -        *result = 0;
  263.54 -        return 0;
  263.55 -    }
  263.56 -    size_t r = a * b;
  263.57 -    if(r / b == a) {
  263.58 -        *result = r;
  263.59 -        return 0;
  263.60 -    } else {
  263.61 -        *result = 0;
  263.62 -        return 1;
  263.63 -    }
  263.64 -}
  263.65 -
   264.1 --- a/src/ucx/allocator.h	Mon Dec 30 09:54:10 2019 +0100
   264.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   264.3 @@ -1,206 +0,0 @@
   264.4 -/*
   264.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   264.6 - *
   264.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   264.8 - *
   264.9 - * Redistribution and use in source and binary forms, with or without
  264.10 - * modification, are permitted provided that the following conditions are met:
  264.11 - *
  264.12 - *   1. Redistributions of source code must retain the above copyright
  264.13 - *      notice, this list of conditions and the following disclaimer.
  264.14 - *
  264.15 - *   2. Redistributions in binary form must reproduce the above copyright
  264.16 - *      notice, this list of conditions and the following disclaimer in the
  264.17 - *      documentation and/or other materials provided with the distribution.
  264.18 - *
  264.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  264.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  264.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  264.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  264.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  264.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  264.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  264.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  264.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  264.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  264.29 - * POSSIBILITY OF SUCH DAMAGE.
  264.30 - */
  264.31 -/**
  264.32 - * Allocator for custom memory management.
  264.33 - * 
  264.34 - * A UCX allocator consists of a pointer to the memory area / pool and four
  264.35 - * function pointers to memory management functions operating on this memory
  264.36 - * area / pool. These functions shall behave equivalent to the standard libc
  264.37 - * functions <code>malloc(), calloc(), realloc()</code> and <code>free()</code>.
  264.38 - * 
  264.39 - * The signature of the memory management functions is based on the signature
  264.40 - * of the respective libc function but each of them takes the pointer to the
  264.41 - * memory area / pool as first argument.
  264.42 - * 
  264.43 - * As the pointer to the memory area / pool can be arbitrarily chosen, any data
  264.44 - * can be provided to the memory management functions. A UcxMempool is just
  264.45 - * one example.
  264.46 - * 
  264.47 - * @see mempool.h
  264.48 - * @see UcxMap
  264.49 - * 
  264.50 - * @file   allocator.h
  264.51 - * @author Mike Becker
  264.52 - * @author Olaf Wintermann
  264.53 - */
  264.54 -
  264.55 -#ifndef UCX_ALLOCATOR_H
  264.56 -#define	UCX_ALLOCATOR_H
  264.57 -
  264.58 -#include "ucx.h"
  264.59 -
  264.60 -#ifdef	__cplusplus
  264.61 -extern "C" {
  264.62 -#endif
  264.63 -
  264.64 -/**
  264.65 - * A function pointer to the allocators <code>malloc()</code> function.
  264.66 - * @see UcxAllocator
  264.67 - */
  264.68 -typedef void*(*ucx_allocator_malloc)(void *pool, size_t n);
  264.69 -
  264.70 -/**
  264.71 - * A function pointer to the allocators <code>calloc()</code> function.
  264.72 - * @see UcxAllocator
  264.73 - */
  264.74 -typedef void*(*ucx_allocator_calloc)(void *pool, size_t n, size_t size);
  264.75 -
  264.76 -/**
  264.77 - * A function pointer to the allocators <code>realloc()</code> function.
  264.78 - * @see UcxAllocator
  264.79 - */
  264.80 -typedef void*(*ucx_allocator_realloc)(void *pool, void *data, size_t n);
  264.81 -
  264.82 -/**
  264.83 - * A function pointer to the allocators <code>free()</code> function.
  264.84 - * @see UcxAllocator
  264.85 - */
  264.86 -typedef void(*ucx_allocator_free)(void *pool, void *data);
  264.87 -
  264.88 -/**
  264.89 - * UCX allocator data structure containing memory management functions.
  264.90 - */
  264.91 -typedef struct {
  264.92 -    /** Pointer to an area of memory or a complex memory pool.
  264.93 -     * This pointer will be passed to any memory management function as first
  264.94 -     * argument.
  264.95 -     */
  264.96 -    void *pool;
  264.97 -    /**
  264.98 -     * The <code>malloc()</code> function for this allocator.
  264.99 -     */
 264.100 -    ucx_allocator_malloc  malloc;
 264.101 -    /**
 264.102 -     * The <code>calloc()</code> function for this allocator.
 264.103 -     */
 264.104 -    ucx_allocator_calloc  calloc;
 264.105 -    /**
 264.106 -     * The <code>realloc()</code> function for this allocator.
 264.107 -     */
 264.108 -    ucx_allocator_realloc realloc;
 264.109 -    /**
 264.110 -     * The <code>free()</code> function for this allocator.
 264.111 -     */
 264.112 -    ucx_allocator_free    free;
 264.113 -} UcxAllocator;
 264.114 -
 264.115 -/**
 264.116 - * Returns a pointer to the default allocator.
 264.117 - * 
 264.118 - * The default allocator contains wrappers to the standard libc memory
 264.119 - * management functions. Use this function to get a pointer to a globally
 264.120 - * available allocator. You may also define an own UcxAllocator by assigning
 264.121 - * #UCX_ALLOCATOR_DEFAULT to a variable and pass the address of this variable
 264.122 - * to any function that takes a UcxAllocator as argument. Note that using
 264.123 - * this function is the recommended way of passing a default allocator, thus
 264.124 - * it never runs out of scope.
 264.125 - * 
 264.126 - * @return a pointer to the default allocator
 264.127 - * 
 264.128 - * @see UCX_ALLOCATOR_DEFAULT
 264.129 - */
 264.130 -UcxAllocator *ucx_default_allocator();
 264.131 -
 264.132 -/**
 264.133 - * A wrapper for the standard libc <code>malloc()</code> function.
 264.134 - * @param ignore ignored (may be used by allocators for pooled memory)
 264.135 - * @param n argument passed to <code>malloc()</code>
 264.136 - * @return return value of <code>malloc()</code>
 264.137 - */
 264.138 -void *ucx_default_malloc(void *ignore, size_t n);
 264.139 -/**
 264.140 - * A wrapper for the standard libc <code>calloc()</code> function.
 264.141 - * @param ignore ignored (may be used by allocators for pooled memory)
 264.142 - * @param n argument passed to <code>calloc()</code>
 264.143 - * @param size  argument passed to <code>calloc()</code>
 264.144 - * @return return value of <code>calloc()</code>
 264.145 - */
 264.146 -void *ucx_default_calloc(void *ignore, size_t n, size_t size);
 264.147 -/**
 264.148 - * A wrapper for the standard libc <code>realloc()</code> function.
 264.149 - * @param ignore ignored (may be used by allocators for pooled memory)
 264.150 - * @param data argumend passed to <code>realloc()</code>
 264.151 - * @param n argument passed to <code>realloc()</code>
 264.152 - * @return return value of <code>realloc()</code>
 264.153 - */
 264.154 -void *ucx_default_realloc(void *ignore, void *data, size_t n);
 264.155 -/**
 264.156 - * A wrapper for the standard libc <code>free()</code> function.
 264.157 - * @param ignore ignored (may be used by allocators for pooled memory)
 264.158 - * @param data argument passed to <code>free()</code>
 264.159 - */
 264.160 -void ucx_default_free(void *ignore, void *data);
 264.161 -
 264.162 -/**
 264.163 - * Shorthand for calling an allocators malloc function.
 264.164 - * @param allocator the allocator to use
 264.165 - * @param n size of space to allocate
 264.166 - * @return a pointer to the allocated memory area
 264.167 - */
 264.168 -#define almalloc(allocator, n) ((allocator)->malloc((allocator)->pool, n))
 264.169 -
 264.170 -/**
 264.171 - * Shorthand for calling an allocators calloc function.
 264.172 - * @param allocator the allocator to use
 264.173 - * @param n the count of elements the space should be allocated for
 264.174 - * @param size the size of each element
 264.175 - * @return a pointer to the allocated memory area
 264.176 - */
 264.177 -#define alcalloc(allocator, n, size) \
 264.178 -        ((allocator)->calloc((allocator)->pool, n, size))
 264.179 -
 264.180 -/**
 264.181 - * Shorthand for calling an allocators realloc function.
 264.182 - * @param allocator the allocator to use
 264.183 - * @param ptr the pointer to the memory area that shall be reallocated
 264.184 - * @param n the new size of the allocated memory area
 264.185 - * @return a pointer to the reallocated memory area
 264.186 - */
 264.187 -#define alrealloc(allocator, ptr, n) \
 264.188 -        ((allocator)->realloc((allocator)->pool, ptr, n))
 264.189 -
 264.190 -/**
 264.191 - * Shorthand for calling an allocators free function.
 264.192 - * @param allocator the allocator to use
 264.193 - * @param ptr the pointer to the memory area that shall be freed
 264.194 - */
 264.195 -#define alfree(allocator, ptr) ((allocator)->free((allocator)->pool, ptr))
 264.196 -
 264.197 -/**
 264.198 - * Convenient macro for a default allocator <code>struct</code> definition.
 264.199 - */
 264.200 -#define UCX_ALLOCATOR_DEFAULT {NULL, \
 264.201 -        ucx_default_malloc, ucx_default_calloc, ucx_default_realloc, \
 264.202 -        ucx_default_free }
 264.203 -
 264.204 -#ifdef	__cplusplus
 264.205 -}
 264.206 -#endif
 264.207 -
 264.208 -#endif	/* UCX_ALLOCATOR_H */
 264.209 -
   265.1 --- a/src/ucx/array.h	Mon Dec 30 09:54:10 2019 +0100
   265.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   265.3 @@ -1,460 +0,0 @@
   265.4 -/*
   265.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   265.6 - *
   265.7 - * Copyright 2019 Mike Becker, Olaf Wintermann All rights reserved.
   265.8 - *
   265.9 - * Redistribution and use in source and binary forms, with or without
  265.10 - * modification, are permitted provided that the following conditions are met:
  265.11 - *
  265.12 - *   1. Redistributions of source code must retain the above copyright
  265.13 - *      notice, this list of conditions and the following disclaimer.
  265.14 - *
  265.15 - *   2. Redistributions in binary form must reproduce the above copyright
  265.16 - *      notice, this list of conditions and the following disclaimer in the
  265.17 - *      documentation and/or other materials provided with the distribution.
  265.18 - *
  265.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  265.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  265.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  265.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  265.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  265.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  265.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  265.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  265.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  265.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  265.29 - * POSSIBILITY OF SUCH DAMAGE.
  265.30 - */
  265.31 -/**
  265.32 - * Dynamically allocated array implementation.
  265.33 - * 
  265.34 - * @file   array.h
  265.35 - * @author Mike Becker
  265.36 - * @author Olaf Wintermann
  265.37 - */
  265.38 -
  265.39 -#ifndef UCX_ARRAY_H
  265.40 -#define	UCX_ARRAY_H
  265.41 -
  265.42 -#include "ucx.h"
  265.43 -#include "allocator.h"
  265.44 -
  265.45 -#ifdef	__cplusplus
  265.46 -extern "C" {
  265.47 -#endif
  265.48 -
  265.49 -/**
  265.50 - * UCX array type.
  265.51 - */
  265.52 -typedef struct {
  265.53 -    /**
  265.54 -     * The current capacity of the array.
  265.55 -     */
  265.56 -    size_t capacity;
  265.57 -    /**
  265.58 -     * The actual number of elements in the array.
  265.59 -     */
  265.60 -    size_t size;
  265.61 -    /**
  265.62 -     * The size of an individual element in bytes.
  265.63 -     */
  265.64 -    size_t elemsize;
  265.65 -    /**
  265.66 -     * A pointer to the data.
  265.67 -     */
  265.68 -    void* data;
  265.69 -    /**
  265.70 -     * The allocator used for the data.
  265.71 -     */
  265.72 -    UcxAllocator* allocator;
  265.73 -} UcxArray;
  265.74 -
  265.75 -/**
  265.76 - * Sets an element in an arbitrary user defined array.
  265.77 - * The data is copied from the specified data location.
  265.78 - * 
  265.79 - * If the capacity is insufficient, the array is automatically reallocated and
  265.80 - * the possibly new pointer is stored in the <code>array</code> argument.
  265.81 - * 
  265.82 - * On reallocation the capacity of the array is doubled until it is sufficient.
  265.83 - * The new capacity is stored back to <code>capacity</code>.
  265.84 - *  
  265.85 - * @param array a pointer to location of the array pointer
  265.86 - * @param capacity a pointer to the capacity
  265.87 - * @param elmsize the size of each element
  265.88 - * @param idx the index of the element to set
  265.89 - * @param data a pointer to the element data
  265.90 - * @return zero on success or non-zero on error (errno will be set)
  265.91 - */
  265.92 -#define ucx_array_util_set(array, capacity, elmsize, idx, data) \
  265.93 -    ucx_array_util_set_a(ucx_default_allocator(), (void**)(array), capacity, \
  265.94 -                         elmsize, idx, data)
  265.95 -
  265.96 -/**
  265.97 - * Sets an element in an arbitrary user defined array.
  265.98 - * The data is copied from the specified data location.
  265.99 - * 
 265.100 - * If the capacity is insufficient, the array is automatically reallocated
 265.101 - * using the specified allocator and the possibly new pointer is stored in
 265.102 - * the <code>array</code> argument.
 265.103 - * 
 265.104 - * On reallocation the capacity of the array is doubled until it is sufficient.
 265.105 - * The new capacity is stored back to <code>capacity</code>. 
 265.106 - * 
 265.107 - * @param alloc the allocator that shall be used to reallocate the array
 265.108 - * @param array a pointer to location of the array pointer
 265.109 - * @param capacity a pointer to the capacity
 265.110 - * @param elmsize the size of each element
 265.111 - * @param idx the index of the element to set
 265.112 - * @param data a pointer to the element data
 265.113 - * @return zero on success or non-zero on error (errno will be set)
 265.114 - */
 265.115 -int ucx_array_util_set_a(UcxAllocator* alloc, void** array, size_t* capacity,
 265.116 -    size_t elmsize, size_t idx, void* data);
 265.117 -
 265.118 -/**
 265.119 - * Stores a pointer in an arbitrary user defined array.
 265.120 - * The element size of the array must be sizeof(void*).
 265.121 - * 
 265.122 - * If the capacity is insufficient, the array is automatically reallocated and
 265.123 - * the possibly new pointer is stored in the <code>array</code> argument.
 265.124 - * 
 265.125 - * On reallocation the capacity of the array is doubled until it is sufficient.
 265.126 - * The new capacity is stored back to <code>capacity</code>.
 265.127 - *  
 265.128 - * @param array a pointer to location of the array pointer
 265.129 - * @param capacity a pointer to the capacity
 265.130 - * @param idx the index of the element to set
 265.131 - * @param ptr the pointer to store
 265.132 - * @return zero on success or non-zero on error (errno will be set)
 265.133 - */
 265.134 -#define ucx_array_util_setptr(array, capacity, idx, ptr) \
 265.135 -    ucx_array_util_setptr_a(ucx_default_allocator(), (void**)(array), \
 265.136 -                            capacity, idx, ptr)
 265.137 -
 265.138 -/**
 265.139 - * Stores a pointer in an arbitrary user defined array.
 265.140 - * The element size of the array must be sizeof(void*).
 265.141 - * 
 265.142 - * If the capacity is insufficient, the array is automatically reallocated
 265.143 - * using the specified allocator and the possibly new pointer is stored in
 265.144 - * the <code>array</code> argument.
 265.145 - * 
 265.146 - * On reallocation the capacity of the array is doubled until it is sufficient.
 265.147 - * The new capacity is stored back to <code>capacity</code>. 
 265.148 - * 
 265.149 - * @param alloc the allocator that shall be used to reallocate the array
 265.150 - * @param array a pointer to location of the array pointer
 265.151 - * @param capacity a pointer to the capacity
 265.152 - * @param idx the index of the element to set
 265.153 - * @param ptr the pointer to store
 265.154 - * @return zero on success or non-zero on error (errno will be set)
 265.155 - */
 265.156 -int ucx_array_util_setptr_a(UcxAllocator* alloc, void** array, size_t* capacity,
 265.157 -    size_t idx, void* ptr);
 265.158 -
 265.159 -
 265.160 -/**
 265.161 - * Creates a new UCX array with the given capacity and element size.
 265.162 - * @param capacity the initial capacity
 265.163 - * @param elemsize the element size
 265.164 - * @return a pointer to a new UCX array structure
 265.165 - */
 265.166 -UcxArray* ucx_array_new(size_t capacity, size_t elemsize);
 265.167 -
 265.168 -/**
 265.169 - * Creates a new UCX array using the specified allocator.
 265.170 - * 
 265.171 - * @param capacity the initial capacity
 265.172 - * @param elemsize the element size
 265.173 - * @param allocator the allocator to use
 265.174 - * @return a pointer to new UCX array structure
 265.175 - */
 265.176 -UcxArray* ucx_array_new_a(size_t capacity, size_t elemsize,
 265.177 -        UcxAllocator* allocator);
 265.178 -
 265.179 -/**
 265.180 - * Initializes a UCX array structure with the given capacity and element size.
 265.181 - * The structure must be uninitialized as the data pointer will be overwritten.
 265.182 - * 
 265.183 - * @param array the structure to initialize
 265.184 - * @param capacity the initial capacity
 265.185 - * @param elemsize the element size
 265.186 - */
 265.187 -void ucx_array_init(UcxArray* array, size_t capacity, size_t elemsize);
 265.188 -
 265.189 -/**
 265.190 - * Initializes a UCX array structure using the specified allocator.
 265.191 - * The structure must be uninitialized as the data pointer will be overwritten.
 265.192 - * 
 265.193 - * @param array the structure to initialize
 265.194 - * @param capacity the initial capacity
 265.195 - * @param elemsize the element size
 265.196 - * @param allocator the allocator to use
 265.197 - */
 265.198 -void ucx_array_init_a(UcxArray* array, size_t capacity, size_t elemsize,
 265.199 -        UcxAllocator* allocator);
 265.200 -
 265.201 -/**
 265.202 - * Creates an shallow copy of an array.
 265.203 - * 
 265.204 - * This function clones the specified array by using memcpy().
 265.205 - * If the destination capacity is insufficient, an automatic reallocation is
 265.206 - * attempted.
 265.207 - * 
 265.208 - * Note: if the destination array is uninitialized, the behavior is undefined.
 265.209 - * 
 265.210 - * @param dest the array to copy to
 265.211 - * @param src the array to copy from
 265.212 - * @return zero on success, non-zero on reallocation failure.
 265.213 - */
 265.214 -int ucx_array_clone(UcxArray* dest, UcxArray const* src);
 265.215 -
 265.216 -
 265.217 -/**
 265.218 - * Compares two UCX arrays element-wise by using a compare function.
 265.219 - *
 265.220 - * Elements of the two specified arrays are compared by using the specified
 265.221 - * compare function and the additional data. The type and content of this
 265.222 - * additional data depends on the cmp_func() used.
 265.223 - * 
 265.224 - * This function always returns zero, if the element sizes of the arrays do
 265.225 - * not match and performs no comparisons in this case.
 265.226 - * 
 265.227 - * @param array1 the first array
 265.228 - * @param array2 the second array
 265.229 - * @param cmpfnc the compare function
 265.230 - * @param data additional data for the compare function
 265.231 - * @return 1, if and only if the two arrays equal element-wise, 0 otherwise
 265.232 - */
 265.233 -int ucx_array_equals(UcxArray const *array1, UcxArray const *array2,
 265.234 -        cmp_func cmpfnc, void* data);
 265.235 -
 265.236 -/**
 265.237 - * Destroys the array.
 265.238 - * 
 265.239 - * The data is freed and both capacity and count are reset to zero.
 265.240 - * If the array structure itself has been dynamically allocated, it has to be
 265.241 - * freed separately.
 265.242 - * 
 265.243 - * @param array the array to destroy
 265.244 - */
 265.245 -void ucx_array_destroy(UcxArray *array);
 265.246 -
 265.247 -/**
 265.248 - * Destroys and frees the array.
 265.249 - * 
 265.250 - * @param array the array to free
 265.251 - */
 265.252 -void ucx_array_free(UcxArray *array);
 265.253 -
 265.254 -/**
 265.255 - * Inserts elements at the end of the array.
 265.256 - * 
 265.257 - * This is an O(1) operation.
 265.258 - * The array will automatically grow, if the capacity is exceeded.
 265.259 - * If a pointer to data is provided, the data is copied into the array with
 265.260 - * memcpy(). Otherwise the new elements are completely zeroed.
 265.261 - * 
 265.262 - * @param array a pointer the array where to append the data
 265.263 - * @param data a pointer to the data to insert (may be <code>NULL</code>)
 265.264 - * @param count number of elements to copy from data (if data is
 265.265 - * <code>NULL</code>, zeroed elements are appended)
 265.266 - * @return zero on success, non-zero if a reallocation was necessary but failed
 265.267 - * @see ucx_array_set_from()
 265.268 - * @see ucx_array_append()
 265.269 - */
 265.270 -int ucx_array_append_from(UcxArray *array, void *data, size_t count);
 265.271 -
 265.272 -
 265.273 -/**
 265.274 - * Inserts elements at the beginning of the array.
 265.275 - * 
 265.276 - * This is an expensive operation, because the contents must be moved.
 265.277 - * If there is no particular reason to prepend data, you should use
 265.278 - * ucx_array_append_from() instead.
 265.279 - * 
 265.280 - * @param array a pointer the array where to prepend the data
 265.281 - * @param data a pointer to the data to insert (may be <code>NULL</code>)
 265.282 - * @param count number of elements to copy from data (if data is
 265.283 - * <code>NULL</code>, zeroed elements are inserted)
 265.284 - * @return zero on success, non-zero if a reallocation was necessary but failed
 265.285 - * @see ucx_array_append_from()
 265.286 - * @see ucx_array_set_from()
 265.287 - * @see ucx_array_prepend()
 265.288 - */
 265.289 -int ucx_array_prepend_from(UcxArray *array, void *data, size_t count);
 265.290 -
 265.291 -
 265.292 -/**
 265.293 - * Sets elements starting at the specified index.
 265.294 - * 
 265.295 - * If the any index is out of bounds, the array automatically grows.
 265.296 - * The pointer to the data may be NULL, in which case the elements are zeroed. 
 265.297 - * 
 265.298 - * @param array a pointer the array where to set the data
 265.299 - * @param index the index of the element to set
 265.300 - * @param data a pointer to the data to insert (may be <code>NULL</code>)
 265.301 - * @param count number of elements to copy from data (if data is
 265.302 - * <code>NULL</code>, the memory in the array is zeroed)
 265.303 - * @return zero on success, non-zero if a reallocation was necessary but failed
 265.304 - * @see ucx_array_append_from()
 265.305 - * @see ucx_array_set()
 265.306 - */
 265.307 -int ucx_array_set_from(UcxArray *array, size_t index, void *data, size_t count);
 265.308 -
 265.309 -/**
 265.310 - * Concatenates two arrays.
 265.311 - * 
 265.312 - * The contents of the second array are appended to the first array in one
 265.313 - * single operation. The second array is otherwise left untouched.
 265.314 - * 
 265.315 - * The first array may grow automatically. If this fails, both arrays remain
 265.316 - * unmodified.
 265.317 - * 
 265.318 - * @param array1 first array
 265.319 - * @param array2 second array
 265.320 - * @return zero on success, non-zero if reallocation was necessary but failed 
 265.321 - * or the element size does not match
 265.322 - */
 265.323 -int ucx_array_concat(UcxArray *array1, const UcxArray *array2);
 265.324 -
 265.325 -/**
 265.326 - * Returns a pointer to the array element at the specified index.
 265.327 - * 
 265.328 - * @param array the array to retrieve the element from
 265.329 - * @param index index of the element to return
 265.330 - * @return a pointer to the element at the specified index or <code>NULL</code>,
 265.331 - * if the index is greater than the array size
 265.332 - */
 265.333 -void *ucx_array_at(UcxArray const* array, size_t index);
 265.334 -
 265.335 -/**
 265.336 - * Returns the index of an element containing the specified data.
 265.337 - *
 265.338 - * This function uses a cmp_func() to compare the data of each list element
 265.339 - * with the specified data. If no cmp_func is provided, memcmp() is used.
 265.340 - * 
 265.341 - * If the array contains the data more than once, the index of the first
 265.342 - * occurrence is returned.
 265.343 - * If the array does not contain the data, the size of array is returned.
 265.344 - *  
 265.345 - * @param array the array where to search for the data
 265.346 - * @param elem the element data
 265.347 - * @param cmpfnc the compare function
 265.348 - * @param data additional data for the compare function
 265.349 - * @return the index of the element containing the specified data or the size of
 265.350 - * the array, if the data is not found in this array
 265.351 - */
 265.352 -size_t ucx_array_find(UcxArray const *array, void *elem,
 265.353 -    cmp_func cmpfnc, void *data);
 265.354 -
 265.355 -/**
 265.356 - * Checks, if an array contains a specific element.
 265.357 - * 
 265.358 - * An element is found, if ucx_array_find() returns a value less than the size.
 265.359 - * 
 265.360 - * @param array the array where to search for the data
 265.361 - * @param elem the element data
 265.362 - * @param cmpfnc the compare function
 265.363 - * @param data additional data for the compare function
 265.364 - * @return 1, if and only if the array contains the specified element data
 265.365 - * @see ucx_array_find()
 265.366 - */
 265.367 -int ucx_array_contains(UcxArray const *array, void *elem,
 265.368 -    cmp_func cmpfnc, void *data);
 265.369 -
 265.370 -/**
 265.371 - * Sorts a UcxArray with the best available sort algorithm.
 265.372 - * 
 265.373 - * The qsort_r() function is used, if available (glibc, FreeBSD or MacOS).
 265.374 - * The order of arguments is automatically adjusted for the FreeBSD and MacOS
 265.375 - * version of qsort_r().
 265.376 - * 
 265.377 - * If qsort_r() is not available, a merge sort algorithm is used, which is
 265.378 - * guaranteed to use no more additional memory than for exactly one element.
 265.379 - * 
 265.380 - * @param array the array to sort
 265.381 - * @param cmpfnc the function that shall be used to compare the element data
 265.382 - * @param data additional data for the cmp_func() or <code>NULL</code>
 265.383 - */
 265.384 -void ucx_array_sort(UcxArray* array, cmp_func cmpfnc, void *data);
 265.385 -
 265.386 -/**
 265.387 - * Removes an element from the array.
 265.388 - * 
 265.389 - * This is in general an expensive operation, because several elements may
 265.390 - * be moved. If the order of the elements is not relevant, use
 265.391 - * ucx_array_remove_fast() instead.
 265.392 - * 
 265.393 - * @param array pointer to the array from which the element shall be removed
 265.394 - * @param index the index of the element to remove
 265.395 - */
 265.396 -void ucx_array_remove(UcxArray *array, size_t index);
 265.397 -
 265.398 -/**
 265.399 - * Removes an element from the array.
 265.400 - * 
 265.401 - * This is an O(1) operation, but does not maintain the order of the elements.
 265.402 - * The last element in the array is moved to the location of the removed
 265.403 - * element.
 265.404 - * 
 265.405 - * @param array pointer to the array from which the element shall be removed
 265.406 - * @param index the index of the element to remove
 265.407 - */
 265.408 -void ucx_array_remove_fast(UcxArray *array, size_t index);
 265.409 -
 265.410 -/**
 265.411 - * Shrinks the memory to exactly fit the contents.
 265.412 - * 
 265.413 - * After this operation, the capacity equals the size.
 265.414 - * 
 265.415 - * @param array a pointer to the array
 265.416 - * @return zero on success, non-zero if reallocation failed
 265.417 - */
 265.418 -int ucx_array_shrink(UcxArray* array);
 265.419 -
 265.420 -/**
 265.421 - * Sets the capacity of the array.
 265.422 - * 
 265.423 - * If the new capacity is smaller than the size of the array, the elements
 265.424 - * are removed and the size is adjusted accordingly.
 265.425 - * 
 265.426 - * @param array a pointer to the array
 265.427 - * @param capacity the new capacity
 265.428 - * @return zero on success, non-zero if reallocation failed
 265.429 - */
 265.430 -int ucx_array_resize(UcxArray* array, size_t capacity);
 265.431 -
 265.432 -/**
 265.433 - * Resizes the array only, if the capacity is insufficient.
 265.434 - * 
 265.435 - * If the requested capacity is smaller than the current capacity, this
 265.436 - * function does nothing.
 265.437 - * 
 265.438 - * @param array a pointer to the array
 265.439 - * @param capacity the guaranteed capacity
 265.440 - * @return zero on success, non-zero if reallocation failed
 265.441 - */
 265.442 -int ucx_array_reserve(UcxArray* array, size_t capacity);
 265.443 -
 265.444 -/**
 265.445 - * Resizes the capacity, if the specified number of elements would not fit.
 265.446 - * 
 265.447 - * A call to ucx_array_grow(array, count) is effectively the same as
 265.448 - * ucx_array_reserve(array, array->size+count).
 265.449 - * 
 265.450 - * @param array a pointer to the array
 265.451 - * @param count the number of elements that should additionally fit
 265.452 - * into the array
 265.453 - * @return zero on success, non-zero if reallocation failed
 265.454 - */
 265.455 -int ucx_array_grow(UcxArray* array, size_t count);
 265.456 -
 265.457 -
 265.458 -#ifdef	__cplusplus
 265.459 -}
 265.460 -#endif
 265.461 -
 265.462 -#endif	/* UCX_ARRAY_H */
 265.463 -
   266.1 --- a/src/ucx/avl.h	Mon Dec 30 09:54:10 2019 +0100
   266.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   266.3 @@ -1,353 +0,0 @@
   266.4 -/*
   266.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   266.6 - *
   266.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   266.8 - *
   266.9 - * Redistribution and use in source and binary forms, with or without
  266.10 - * modification, are permitted provided that the following conditions are met:
  266.11 - *
  266.12 - *   1. Redistributions of source code must retain the above copyright
  266.13 - *      notice, this list of conditions and the following disclaimer.
  266.14 - *
  266.15 - *   2. Redistributions in binary form must reproduce the above copyright
  266.16 - *      notice, this list of conditions and the following disclaimer in the
  266.17 - *      documentation and/or other materials provided with the distribution.
  266.18 - *
  266.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  266.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  266.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  266.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  266.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  266.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  266.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  266.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  266.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  266.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  266.29 - * POSSIBILITY OF SUCH DAMAGE.
  266.30 - */
  266.31 -
  266.32 -
  266.33 -/**
  266.34 - * @file avl.h
  266.35 - * 
  266.36 - * AVL tree implementation.
  266.37 - * 
  266.38 - * This binary search tree implementation allows average O(1) insertion and
  266.39 - * removal of elements (excluding binary search time).
  266.40 - * 
  266.41 - * @author Mike Becker
  266.42 - * @author Olaf Wintermann
  266.43 - */
  266.44 -
  266.45 -#ifndef UCX_AVL_H
  266.46 -#define UCX_AVL_H
  266.47 -
  266.48 -#include "ucx.h"
  266.49 -#include "allocator.h"
  266.50 -#include <inttypes.h>
  266.51 -
  266.52 -#ifdef	__cplusplus
  266.53 -extern "C" {
  266.54 -#endif
  266.55 -
  266.56 -/**
  266.57 - * UCX AVL Node type.
  266.58 - * 
  266.59 - * @see UcxAVLNode
  266.60 - */
  266.61 -typedef struct UcxAVLNode UcxAVLNode;
  266.62 -
  266.63 -/**
  266.64 - * UCX AVL Node.
  266.65 - */
  266.66 -struct UcxAVLNode {
  266.67 -    /**
  266.68 -     * The key for this node.
  266.69 -     */
  266.70 -    intptr_t key;
  266.71 -    /**
  266.72 -     * Data contained by this node.
  266.73 -     */
  266.74 -    void *value;
  266.75 -    /**
  266.76 -     * The height of this (sub)-tree.
  266.77 -     */
  266.78 -    size_t height;
  266.79 -    /**
  266.80 -     * Parent node.
  266.81 -     */
  266.82 -    UcxAVLNode *parent;
  266.83 -    /**
  266.84 -     * Root node of left subtree.
  266.85 -     */
  266.86 -    UcxAVLNode *left;
  266.87 -    /**
  266.88 -     * Root node of right subtree.
  266.89 -     */
  266.90 -    UcxAVLNode *right;
  266.91 -};
  266.92 -
  266.93 -/**
  266.94 - * UCX AVL Tree.
  266.95 - */
  266.96 -typedef struct {
  266.97 -    /**
  266.98 -     * The UcxAllocator that shall be used to manage the memory for node data.
  266.99 -     */
 266.100 -    UcxAllocator *allocator;
 266.101 -    /**
 266.102 -     * Root node of the tree.
 266.103 -     */
 266.104 -    UcxAVLNode *root;
 266.105 -    /**
 266.106 -     * Compare function that shall be used to compare the UcxAVLNode keys.
 266.107 -     * @see UcxAVLNode.key
 266.108 -     */
 266.109 -    cmp_func cmpfunc;
 266.110 -    /**
 266.111 -     * Custom user data.
 266.112 -     * This data will also be provided to the cmpfunc.
 266.113 -     */
 266.114 -    void *userdata;
 266.115 -} UcxAVLTree;
 266.116 -
 266.117 -/**
 266.118 - * Initializes a new UcxAVLTree with a default allocator.
 266.119 - * 
 266.120 - * @param cmpfunc the compare function that shall be used
 266.121 - * @return a new UcxAVLTree object
 266.122 - * @see ucx_avl_new_a()
 266.123 - */
 266.124 -UcxAVLTree *ucx_avl_new(cmp_func cmpfunc);
 266.125 -
 266.126 -/**
 266.127 - * Initializes a new UcxAVLTree with the specified allocator.
 266.128 - * 
 266.129 - * The cmpfunc should be capable of comparing two keys within this AVL tree.
 266.130 - * So if you want to use null terminated strings as keys, you could use the
 266.131 - * ucx_cmp_str() function here.
 266.132 - * 
 266.133 - * @param cmpfunc the compare function that shall be used
 266.134 - * @param allocator the UcxAllocator that shall be used
 266.135 - * @return a new UcxAVLTree object
 266.136 - */
 266.137 -UcxAVLTree *ucx_avl_new_a(cmp_func cmpfunc, UcxAllocator *allocator);
 266.138 -
 266.139 -/**
 266.140 - * Destroys a UcxAVLTree.
 266.141 - * 
 266.142 - * Note, that the contents are not automatically freed.
 266.143 - * Use may use #ucx_avl_free_content() before calling this function.
 266.144 - * 
 266.145 - * @param tree the tree to destroy
 266.146 - * @see ucx_avl_free_content()
 266.147 - */
 266.148 -void ucx_avl_free(UcxAVLTree *tree);
 266.149 -
 266.150 -/**
 266.151 - * Frees the contents of a UcxAVLTree.
 266.152 - * 
 266.153 - * This is a convenience function that iterates over the tree and passes all
 266.154 - * values to the specified destructor function.
 266.155 - * 
 266.156 - * If no destructor is specified (<code>NULL</code>), the free() function of
 266.157 - * the tree's own allocator is used.
 266.158 - * 
 266.159 - * You must ensure, that it is valid to pass each value in the map to the same
 266.160 - * destructor function.
 266.161 - * 
 266.162 - * You should free the entire tree afterwards, as the contents will be invalid.
 266.163 - * 
 266.164 - * @param tree for which the contents shall be freed
 266.165 - * @param destr optional pointer to a destructor function
 266.166 - * @see ucx_avl_free()
 266.167 - */
 266.168 -void ucx_avl_free_content(UcxAVLTree *tree, ucx_destructor destr);
 266.169 -
 266.170 -/**
 266.171 - * Macro for initializing a new UcxAVLTree with the default allocator and a
 266.172 - * ucx_cmp_ptr() compare function.
 266.173 - * 
 266.174 - * @return a new default UcxAVLTree object
 266.175 - */
 266.176 -#define ucx_avl_default_new() \
 266.177 -    ucx_avl_new_a(ucx_cmp_ptr, ucx_default_allocator())
 266.178 -
 266.179 -/**
 266.180 - * Gets the node from the tree, that is associated with the specified key.
 266.181 - * @param tree the UcxAVLTree
 266.182 - * @param key the key
 266.183 - * @return the node (or <code>NULL</code>, if the key is not present)
 266.184 - */
 266.185 -UcxAVLNode *ucx_avl_get_node(UcxAVLTree *tree, intptr_t key);
 266.186 -
 266.187 -/**
 266.188 - * Gets the value from the tree, that is associated with the specified key.
 266.189 - * @param tree the UcxAVLTree
 266.190 - * @param key the key
 266.191 - * @return the value (or <code>NULL</code>, if the key is not present)
 266.192 - */
 266.193 -void *ucx_avl_get(UcxAVLTree *tree, intptr_t key);
 266.194 -
 266.195 -/**
 266.196 - * A mode for #ucx_avl_find_node() with the same behavior as
 266.197 - * #ucx_avl_get_node().
 266.198 - */
 266.199 -#define UCX_AVL_FIND_EXACT         0
 266.200 -/**
 266.201 - * A mode for #ucx_avl_find_node() finding the node whose key is at least
 266.202 - * as large as the specified key.
 266.203 - */
 266.204 -#define UCX_AVL_FIND_LOWER_BOUNDED 1
 266.205 -/**
 266.206 - * A mode for #ucx_avl_find_node() finding the node whose key is at most
 266.207 - * as large as the specified key.
 266.208 - */
 266.209 -#define UCX_AVL_FIND_UPPER_BOUNDED 2
 266.210 -/**
 266.211 - * A mode for #ucx_avl_find_node() finding the node with a key that is as close
 266.212 - * to the specified key as possible. If the key is present, the behavior is
 266.213 - * like #ucx_avl_get_node(). This mode only returns <code>NULL</code> on
 266.214 - * empty trees.
 266.215 - */
 266.216 -#define UCX_AVL_FIND_CLOSEST       3
 266.217 -
 266.218 -/**
 266.219 - * Finds a node within the tree. The following modes are supported:
 266.220 - * <ul>
 266.221 - * <li>#UCX_AVL_FIND_EXACT: the same behavior as #ucx_avl_get_node()</li>
 266.222 - * <li>#UCX_AVL_FIND_LOWER_BOUNDED: finds the node whose key is at least
 266.223 - * as large as the specified key</li>
 266.224 - * <li>#UCX_AVL_FIND_UPPER_BOUNDED: finds the node whose key is at most
 266.225 - * as large as the specified key</li>
 266.226 - * <li>#UCX_AVL_FIND_CLOSEST: finds the node with a key that is as close to
 266.227 - * the specified key as possible. If the key is present, the behavior is
 266.228 - * like #ucx_avl_get_node(). This mode only returns <code>NULL</code> on
 266.229 - * empty trees.</li> 
 266.230 - * </ul>
 266.231 - * 
 266.232 - * The distance function provided MUST agree with the compare function of
 266.233 - * the AVL tree.
 266.234 - * 
 266.235 - * @param tree the UcxAVLTree
 266.236 - * @param key the key
 266.237 - * @param dfnc the distance function
 266.238 - * @param mode the find mode
 266.239 - * @return the node (or <code>NULL</code>, if no node can be found)
 266.240 - */
 266.241 -UcxAVLNode *ucx_avl_find_node(UcxAVLTree *tree, intptr_t key,
 266.242 -        distance_func dfnc, int mode);
 266.243 -
 266.244 -/**
 266.245 - * Finds a value within the tree.
 266.246 - * See #ucx_avl_find_node() for details.
 266.247 - * 
 266.248 - * @param tree the UcxAVLTree
 266.249 - * @param key the key
 266.250 - * @param dfnc the distance function
 266.251 - * @param mode the find mode
 266.252 - * @return the value (or <code>NULL</code>, if no value can be found)
 266.253 - */
 266.254 -void *ucx_avl_find(UcxAVLTree *tree, intptr_t key,
 266.255 -        distance_func dfnc, int mode);
 266.256 -
 266.257 -/**
 266.258 - * Puts a key/value pair into the tree.
 266.259 - * 
 266.260 - * Attention: use this function only, if a possible old value does not need
 266.261 - * to be preserved.
 266.262 - * 
 266.263 - * @param tree the UcxAVLTree
 266.264 - * @param key the key
 266.265 - * @param value the new value
 266.266 - * @return zero, if and only if the operation succeeded
 266.267 - */
 266.268 -int ucx_avl_put(UcxAVLTree *tree, intptr_t key, void *value);
 266.269 -
 266.270 -/**
 266.271 - * Puts a key/value pair into the tree.
 266.272 - * 
 266.273 - * This is a secure function which saves the old value to the variable pointed
 266.274 - * at by oldvalue.
 266.275 - * 
 266.276 - * @param tree the UcxAVLTree
 266.277 - * @param key the key
 266.278 - * @param value the new value
 266.279 - * @param oldvalue optional: a pointer to the location where a possible old
 266.280 - * value shall be stored
 266.281 - * @return zero, if and only if the operation succeeded
 266.282 - */
 266.283 -int ucx_avl_put_s(UcxAVLTree *tree, intptr_t key, void *value, void **oldvalue);
 266.284 -
 266.285 -/**
 266.286 - * Removes a node from the AVL tree.
 266.287 - * 
 266.288 - * Note: the specified node is logically removed. The tree implementation
 266.289 - * decides which memory area is freed. In most cases the here provided node
 266.290 - * is freed, so its further use is generally undefined.
 266.291 - * 
 266.292 - * @param tree the UcxAVLTree
 266.293 - * @param node the node to remove
 266.294 - * @return zero, if and only if an element has been removed
 266.295 - */
 266.296 -int ucx_avl_remove_node(UcxAVLTree *tree, UcxAVLNode *node);
 266.297 -
 266.298 -/**
 266.299 - * Removes an element from the AVL tree.
 266.300 - * 
 266.301 - * @param tree the UcxAVLTree
 266.302 - * @param key the key
 266.303 - * @return zero, if and only if an element has been removed
 266.304 - */
 266.305 -int ucx_avl_remove(UcxAVLTree *tree, intptr_t key);
 266.306 -
 266.307 -/**
 266.308 - * Removes an element from the AVL tree.
 266.309 - * 
 266.310 - * This is a secure function which saves the old key and value data from node
 266.311 - * to the variables at the location of oldkey and oldvalue (if specified), so
 266.312 - * they can be freed afterwards (if necessary).
 266.313 - * 
 266.314 - * Note: the returned key in oldkey is possibly not the same as the provided
 266.315 - * key for the lookup (in terms of memory location).
 266.316 - * 
 266.317 - * @param tree the UcxAVLTree
 266.318 - * @param key the key of the element to remove
 266.319 - * @param oldkey optional: a pointer to the location where the old key shall be
 266.320 - * stored
 266.321 - * @param oldvalue optional: a pointer to the location where the old value
 266.322 - * shall be stored
 266.323 - * @return zero, if and only if an element has been removed
 266.324 - */
 266.325 -int ucx_avl_remove_s(UcxAVLTree *tree, intptr_t key,
 266.326 -        intptr_t *oldkey, void **oldvalue);
 266.327 -
 266.328 -/**
 266.329 - * Counts the nodes in the specified UcxAVLTree.
 266.330 - * @param tree the AVL tree
 266.331 - * @return the node count
 266.332 - */
 266.333 -size_t ucx_avl_count(UcxAVLTree *tree);
 266.334 -
 266.335 -/**
 266.336 - * Finds the in-order predecessor of the given node.
 266.337 - * @param node an AVL node
 266.338 - * @return the in-order predecessor of the given node, or <code>NULL</code> if
 266.339 - * the given node is the in-order minimum
 266.340 - */
 266.341 -UcxAVLNode* ucx_avl_pred(UcxAVLNode* node);
 266.342 -
 266.343 -/**
 266.344 - * Finds the in-order successor of the given node.
 266.345 - * @param node an AVL node
 266.346 - * @return the in-order successor of the given node, or <code>NULL</code> if
 266.347 - * the given node is the in-order maximum
 266.348 - */
 266.349 -UcxAVLNode* ucx_avl_succ(UcxAVLNode* node);
 266.350 -
 266.351 -#ifdef	__cplusplus
 266.352 -}
 266.353 -#endif
 266.354 -
 266.355 -#endif	/* UCX_AVL_H */
 266.356 -
   267.1 --- a/src/ucx/buffer.h	Mon Dec 30 09:54:10 2019 +0100
   267.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   267.3 @@ -1,339 +0,0 @@
   267.4 -/*
   267.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   267.6 - *
   267.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   267.8 - *
   267.9 - * Redistribution and use in source and binary forms, with or without
  267.10 - * modification, are permitted provided that the following conditions are met:
  267.11 - *
  267.12 - *   1. Redistributions of source code must retain the above copyright
  267.13 - *      notice, this list of conditions and the following disclaimer.
  267.14 - *
  267.15 - *   2. Redistributions in binary form must reproduce the above copyright
  267.16 - *      notice, this list of conditions and the following disclaimer in the
  267.17 - *      documentation and/or other materials provided with the distribution.
  267.18 - *
  267.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  267.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  267.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  267.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  267.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  267.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  267.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  267.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  267.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  267.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  267.29 - * POSSIBILITY OF SUCH DAMAGE.
  267.30 - */
  267.31 -
  267.32 -/**
  267.33 - * @file buffer.h
  267.34 - * 
  267.35 - * Advanced buffer implementation.
  267.36 - * 
  267.37 - * Instances of UcxBuffer can be used to read from or to write to like one
  267.38 - * would do with a stream. This allows the use of ucx_stream_copy() to copy
  267.39 - * contents from one buffer to another.
  267.40 - * 
  267.41 - * Some features for convenient use of the buffer
  267.42 - * can be enabled. See the documentation of the macro constants for more
  267.43 - * information.
  267.44 - * 
  267.45 - * @author Mike Becker
  267.46 - * @author Olaf Wintermann
  267.47 - */
  267.48 -
  267.49 -#ifndef UCX_BUFFER_H
  267.50 -#define	UCX_BUFFER_H
  267.51 -
  267.52 -#include "ucx.h"
  267.53 -#include <sys/types.h>
  267.54 -#include <stdio.h>
  267.55 -
  267.56 -#ifdef	__cplusplus
  267.57 -extern "C" {
  267.58 -#endif
  267.59 -
  267.60 -/**
  267.61 - * No buffer features enabled (all flags cleared).
  267.62 - */
  267.63 -#define UCX_BUFFER_DEFAULT      0x00
  267.64 -
  267.65 -/**
  267.66 - * If this flag is enabled, the buffer will automatically free its contents.
  267.67 - */
  267.68 -#define UCX_BUFFER_AUTOFREE     0x01
  267.69 -
  267.70 -/**
  267.71 - * If this flag is enabled, the buffer will automatically extends its capacity.
  267.72 - */
  267.73 -#define UCX_BUFFER_AUTOEXTEND   0x02
  267.74 -
  267.75 -/** UCX Buffer. */
  267.76 -typedef struct {
  267.77 -    /** A pointer to the buffer contents. */
  267.78 -    char *space;
  267.79 -    /** Current position of the buffer. */
  267.80 -    size_t pos;
  267.81 -    /** Current capacity (i.e. maximum size) of the buffer. */
  267.82 -    size_t capacity;
  267.83 -    /** Current size of the buffer content. */
  267.84 -    size_t size;
  267.85 -    /**
  267.86 -     * Flag register for buffer features.
  267.87 -     * @see #UCX_BUFFER_DEFAULT
  267.88 -     * @see #UCX_BUFFER_AUTOFREE
  267.89 -     * @see #UCX_BUFFER_AUTOEXTEND
  267.90 -     */
  267.91 -    int flags;
  267.92 -} UcxBuffer;
  267.93 -
  267.94 -/**
  267.95 - * Creates a new buffer.
  267.96 - * 
  267.97 - * <b>Note:</b> you may provide <code>NULL</code> as argument for
  267.98 - * <code>space</code>. Then this function will allocate the space and enforce
  267.99 - * the #UCX_BUFFER_AUTOFREE flag.
 267.100 - * 
 267.101 - * @param space pointer to the memory area, or <code>NULL</code> to allocate
 267.102 - * new memory
 267.103 - * @param capacity the capacity of the buffer
 267.104 - * @param flags buffer features (see UcxBuffer.flags)
 267.105 - * @return the new buffer
 267.106 - */
 267.107 -UcxBuffer *ucx_buffer_new(void *space, size_t capacity, int flags);
 267.108 -
 267.109 -/**
 267.110 - * Destroys a buffer.
 267.111 - * 
 267.112 - * If the #UCX_BUFFER_AUTOFREE feature is enabled, the contents of the buffer
 267.113 - * are also freed.
 267.114 - * 
 267.115 - * @param buffer the buffer to destroy
 267.116 - */
 267.117 -void ucx_buffer_free(UcxBuffer* buffer);
 267.118 -
 267.119 -/**
 267.120 - * Creates a new buffer and fills it with extracted content from another buffer.
 267.121 - * 
 267.122 - * <b>Note:</b> the #UCX_BUFFER_AUTOFREE feature is enforced for the new buffer.
 267.123 - * 
 267.124 - * @param src the source buffer
 267.125 - * @param start the start position of extraction
 267.126 - * @param length the count of bytes to extract (must not be zero)
 267.127 - * @param flags feature mask for the new buffer
 267.128 - * @return a new buffer containing the extraction
 267.129 - */
 267.130 -UcxBuffer* ucx_buffer_extract(UcxBuffer *src,
 267.131 -        size_t start, size_t length, int flags);
 267.132 -
 267.133 -/**
 267.134 - * A shorthand macro for the full extraction of the buffer.
 267.135 - * 
 267.136 - * @param src the source buffer
 267.137 - * @param flags feature mask for the new buffer
 267.138 - * @return a new buffer with the extracted content
 267.139 - */
 267.140 -#define ucx_buffer_clone(src,flags) \
 267.141 -    ucx_buffer_extract(src, 0, (src)->capacity, flags)
 267.142 -
 267.143 -
 267.144 -/**
 267.145 - * Shifts the contents of the buffer by the given offset.
 267.146 - * 
 267.147 - * If the offset is positive, the contents are shifted to the right.
 267.148 - * If auto extension is enabled, the buffer grows, if necessary.
 267.149 - * In case the auto extension fails, this function returns a non-zero value and
 267.150 - * no contents are changed.
 267.151 - * If auto extension is disabled, the contents that do not fit into the buffer
 267.152 - * are discarded.
 267.153 - * 
 267.154 - * If the offset is negative, the contents are shifted to the left where the
 267.155 - * first <code>shift</code> bytes are discarded.
 267.156 - * The new size of the buffer is the old size minus
 267.157 - * the absolute shift value.
 267.158 - * If this value is larger than the buffer size, the buffer is emptied (but
 267.159 - * not cleared, see the security note below).
 267.160 - * 
 267.161 - * The buffer position gets shifted alongside with the content but is kept
 267.162 - * within the boundaries of the buffer.
 267.163 - * 
 267.164 - * <b>Security note:</b> the shifting operation does <em>not</em> erase the
 267.165 - * previously occupied memory cells. You can easily do that manually, e.g. by
 267.166 - * calling <code>memset(buffer->space, 0, shift)</code> for a right shift or
 267.167 - * <code>memset(buffer->size, 0, buffer->capacity-buffer->size)</code>
 267.168 - * for a left shift.
 267.169 - * 
 267.170 - * @param buffer the buffer
 267.171 - * @param shift the shift offset (negative means left shift)
 267.172 - * @return 0 on success, non-zero if a required auto-extension fails
 267.173 - */
 267.174 -int ucx_buffer_shift(UcxBuffer* buffer, off_t shift);
 267.175 -
 267.176 -/**
 267.177 - * Shifts the buffer to the right.
 267.178 - * See ucx_buffer_shift() for details.
 267.179 - * 
 267.180 - * @param buffer the buffer
 267.181 - * @param shift the shift offset
 267.182 - * @return 0 on success, non-zero if a required auto-extension fails
 267.183 - * @see ucx_buffer_shift()
 267.184 - */
 267.185 -int ucx_buffer_shift_right(UcxBuffer* buffer, size_t shift);
 267.186 -
 267.187 -/**
 267.188 - * Shifts the buffer to the left.
 267.189 - * 
 267.190 - * See ucx_buffer_shift() for details. Note, however, that this method expects
 267.191 - * a positive shift offset.
 267.192 - * 
 267.193 - * Since a left shift cannot fail due to memory allocation problems, this
 267.194 - * function always returns zero.
 267.195 - * 
 267.196 - * @param buffer the buffer
 267.197 - * @param shift the shift offset
 267.198 - * @return always zero
 267.199 - * @see ucx_buffer_shift()
 267.200 - */
 267.201 -int ucx_buffer_shift_left(UcxBuffer* buffer, size_t shift);
 267.202 -
 267.203 -
 267.204 -/**
 267.205 - * Moves the position of the buffer.
 267.206 - * 
 267.207 - * The new position is relative to the <code>whence</code> argument.
 267.208 - *
 267.209 - * SEEK_SET marks the start of the buffer.
 267.210 - * SEEK_CUR marks the current position.
 267.211 - * SEEK_END marks the end of the buffer.
 267.212 - * 
 267.213 - * With an offset of zero, this function sets the buffer position to zero
 267.214 - * (SEEK_SET), the buffer size (SEEK_END) or leaves the buffer position
 267.215 - * unchanged (SEEK_CUR).
 267.216 - * 
 267.217 - * @param buffer
 267.218 - * @param offset position offset relative to <code>whence</code>
 267.219 - * @param whence one of SEEK_SET, SEEK_CUR or SEEK_END
 267.220 - * @return 0 on success, non-zero if the position is invalid
 267.221 - *
 267.222 - */
 267.223 -int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence);
 267.224 -
 267.225 -/**
 267.226 - * Clears the buffer by resetting the position and deleting the data.
 267.227 - * 
 267.228 - * The data is deleted by a zeroing it with call to <code>memset()</code>.
 267.229 - * 
 267.230 - * @param buffer the buffer to be cleared
 267.231 - */
 267.232 -#define ucx_buffer_clear(buffer) memset((buffer)->space, 0, (buffer)->size); \
 267.233 -        (buffer)->size = 0; (buffer)->pos = 0;
 267.234 -
 267.235 -/**
 267.236 - * Tests, if the buffer position has exceeded the buffer capacity.
 267.237 - * 
 267.238 - * @param buffer the buffer to test
 267.239 - * @return non-zero, if the current buffer position has exceeded the last
 267.240 - * available byte of the buffer.
 267.241 - */
 267.242 -int ucx_buffer_eof(UcxBuffer *buffer);
 267.243 -
 267.244 -
 267.245 -/**
 267.246 - * Extends the capacity of the buffer.
 267.247 - * 
 267.248 - * <b>Note:</b> The buffer capacity increased by a power of two. I.e.
 267.249 - * the buffer capacity is doubled, as long as it would not hold the current
 267.250 - * content plus the additional required bytes.
 267.251 - * 
 267.252 - * <b>Attention:</b> the argument provided is the number of <i>additional</i>
 267.253 - * bytes the buffer shall hold. It is <b>NOT</b> the total number of bytes the
 267.254 - * buffer shall hold.
 267.255 - * 
 267.256 - * @param buffer the buffer to extend
 267.257 - * @param additional_bytes the number of additional bytes the buffer shall
 267.258 - * <i>at least</i> hold
 267.259 - * @return 0 on success or a non-zero value on failure
 267.260 - */
 267.261 -int ucx_buffer_extend(UcxBuffer *buffer, size_t additional_bytes);
 267.262 -
 267.263 -/**
 267.264 - * Writes data to a UcxBuffer.
 267.265 - * 
 267.266 - * The position of the buffer is increased by the number of bytes written.
 267.267 - * 
 267.268 - * @param ptr a pointer to the memory area containing the bytes to be written
 267.269 - * @param size the length of one element
 267.270 - * @param nitems the element count
 267.271 - * @param buffer the UcxBuffer to write to
 267.272 - * @return the total count of bytes written
 267.273 - */
 267.274 -size_t ucx_buffer_write(const void *ptr, size_t size, size_t nitems,
 267.275 -        UcxBuffer *buffer);
 267.276 -
 267.277 -/**
 267.278 - * Reads data from a UcxBuffer.
 267.279 - * 
 267.280 - * The position of the buffer is increased by the number of bytes read.
 267.281 - * 
 267.282 - * @param ptr a pointer to the memory area where to store the read data
 267.283 - * @param size the length of one element
 267.284 - * @param nitems the element count
 267.285 - * @param buffer the UcxBuffer to read from
 267.286 - * @return the total number of elements read
 267.287 - */
 267.288 -size_t ucx_buffer_read(void *ptr, size_t size, size_t nitems,
 267.289 -        UcxBuffer *buffer);
 267.290 -
 267.291 -/**
 267.292 - * Writes a character to a buffer.
 267.293 - * 
 267.294 - * The least significant byte of the argument is written to the buffer. If the
 267.295 - * end of the buffer is reached and #UCX_BUFFER_AUTOEXTEND feature is enabled,
 267.296 - * the buffer capacity is extended by ucx_buffer_extend(). If the feature is
 267.297 - * disabled or buffer extension fails, <code>EOF</code> is returned.
 267.298 - * 
 267.299 - * On successful write the position of the buffer is increased.
 267.300 - * 
 267.301 - * @param buffer the buffer to write to
 267.302 - * @param c the character to write as <code>int</code> value
 267.303 - * @return the byte that has bean written as <code>int</code> value or
 267.304 - * <code>EOF</code> when the end of the stream is reached and automatic
 267.305 - * extension is not enabled or not possible
 267.306 - */
 267.307 -int ucx_buffer_putc(UcxBuffer *buffer, int c);
 267.308 -
 267.309 -/**
 267.310 - * Gets a character from a buffer.
 267.311 - * 
 267.312 - * The current position of the buffer is increased after a successful read.
 267.313 - * 
 267.314 - * @param buffer the buffer to read from
 267.315 - * @return the character as <code>int</code> value or <code>EOF</code>, if the
 267.316 - * end of the buffer is reached
 267.317 - */
 267.318 -int ucx_buffer_getc(UcxBuffer *buffer);
 267.319 -
 267.320 -/**
 267.321 - * Writes a string to a buffer.
 267.322 - * 
 267.323 - * @param buffer the buffer
 267.324 - * @param str the string
 267.325 - * @return the number of bytes written
 267.326 - */
 267.327 -size_t ucx_buffer_puts(UcxBuffer *buffer, const char *str);
 267.328 -
 267.329 -/**
 267.330 - * Returns the complete buffer content as sstr_t.
 267.331 - * @param buffer the buffer
 267.332 - * @return the result of <code>sstrn()</code> with the buffer space and size
 267.333 - * as arguments
 267.334 - */
 267.335 -#define ucx_buffer_to_sstr(buffer) sstrn((buffer)->space, (buffer)->size)
 267.336 -
 267.337 -#ifdef	__cplusplus
 267.338 -}
 267.339 -#endif
 267.340 -
 267.341 -#endif	/* UCX_BUFFER_H */
 267.342 -
   268.1 --- a/src/ucx/list.h	Mon Dec 30 09:54:10 2019 +0100
   268.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   268.3 @@ -1,512 +0,0 @@
   268.4 -/*
   268.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   268.6 - *
   268.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   268.8 - *
   268.9 - * Redistribution and use in source and binary forms, with or without
  268.10 - * modification, are permitted provided that the following conditions are met:
  268.11 - *
  268.12 - *   1. Redistributions of source code must retain the above copyright
  268.13 - *      notice, this list of conditions and the following disclaimer.
  268.14 - *
  268.15 - *   2. Redistributions in binary form must reproduce the above copyright
  268.16 - *      notice, this list of conditions and the following disclaimer in the
  268.17 - *      documentation and/or other materials provided with the distribution.
  268.18 - *
  268.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  268.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  268.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  268.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  268.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  268.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  268.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  268.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  268.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  268.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  268.29 - * POSSIBILITY OF SUCH DAMAGE.
  268.30 - */
  268.31 -/**
  268.32 - * Doubly linked list implementation.
  268.33 - * 
  268.34 - * @file   list.h
  268.35 - * @author Mike Becker
  268.36 - * @author Olaf Wintermann
  268.37 - */
  268.38 -
  268.39 -#ifndef UCX_LIST_H
  268.40 -#define	UCX_LIST_H
  268.41 -
  268.42 -#include "ucx.h"
  268.43 -#include "allocator.h"
  268.44 -
  268.45 -#ifdef	__cplusplus
  268.46 -extern "C" {
  268.47 -#endif
  268.48 -
  268.49 -/**
  268.50 - * Loop statement for UCX lists.
  268.51 - * 
  268.52 - * The first argument is the name of the iteration variable. The scope of
  268.53 - * this variable is limited to the <code>UCX_FOREACH</code> statement.
  268.54 - * 
  268.55 - * The second argument is a pointer to the list. In most cases this will be the
  268.56 - * pointer to the first element of the list, but it may also be an arbitrary
  268.57 - * element of the list. The iteration will then start with that element.
  268.58 - * 
  268.59 - * @param list The first element of the list
  268.60 - * @param elem The variable name of the element
  268.61 - */
  268.62 -#define UCX_FOREACH(elem,list) \
  268.63 -        for (UcxList* elem = (UcxList*) list ; elem != NULL ; elem = elem->next)
  268.64 -
  268.65 -/**
  268.66 - * UCX list type.
  268.67 - * @see UcxList
  268.68 - */
  268.69 -typedef struct UcxList UcxList;
  268.70 -
  268.71 -/**
  268.72 - * UCX list structure.
  268.73 - */
  268.74 -struct UcxList {
  268.75 -    /**
  268.76 -     * List element payload.
  268.77 -     */
  268.78 -    void    *data;
  268.79 -    /**
  268.80 -     * Pointer to the next list element or <code>NULL</code>, if this is the
  268.81 -     * last element.
  268.82 -     */
  268.83 -    UcxList *next;
  268.84 -    /**
  268.85 -     * Pointer to the previous list element or <code>NULL</code>, if this is
  268.86 -     * the first element.
  268.87 -     */
  268.88 -    UcxList *prev;
  268.89 -};
  268.90 -
  268.91 -/**
  268.92 - * Creates an element-wise copy of a list.
  268.93 - * 
  268.94 - * This function clones the specified list by creating new list elements and
  268.95 - * copying the data with the specified copy_func(). If no copy_func() is
  268.96 - * specified, a shallow copy is created and the new list will reference the
  268.97 - * same data as the source list.
  268.98 - * 
  268.99 - * @param list the list to copy
 268.100 - * @param cpyfnc a pointer to the function that shall copy an element (may be
 268.101 - * <code>NULL</code>)
 268.102 - * @param data additional data for the copy_func()
 268.103 - * @return a pointer to the copy
 268.104 - */
 268.105 -UcxList *ucx_list_clone(const UcxList *list, copy_func cpyfnc, void* data);
 268.106 -
 268.107 -/**
 268.108 - * Creates an element-wise copy of a list using a UcxAllocator.
 268.109 - * 
 268.110 - * See ucx_list_clone() for details.
 268.111 - * 
 268.112 - * You might want to pass the allocator via the <code>data</code> parameter,
 268.113 - * to access it within the copy function for making deep copies.
 268.114 - * 
 268.115 - * @param allocator the allocator to use
 268.116 - * @param list the list to copy
 268.117 - * @param cpyfnc a pointer to the function that shall copy an element (may be
 268.118 - * <code>NULL</code>)
 268.119 - * @param data additional data for the copy_func()
 268.120 - * @return a pointer to the copy
 268.121 - * @see ucx_list_clone()
 268.122 - */
 268.123 -UcxList *ucx_list_clone_a(UcxAllocator *allocator, const UcxList *list,
 268.124 -        copy_func cpyfnc, void* data);
 268.125 -
 268.126 -/**
 268.127 - * Compares two UCX lists element-wise by using a compare function.
 268.128 - * 
 268.129 - * Each element of the two specified lists are compared by using the specified
 268.130 - * compare function and the additional data. The type and content of this
 268.131 - * additional data depends on the cmp_func() used.
 268.132 - * 
 268.133 - * If the list pointers denote elements within a list, the lists are compared
 268.134 - * starting with the denoted elements. Thus any previous elements are not taken
 268.135 - * into account. This might be useful to check, if certain list tails match
 268.136 - * each other.
 268.137 - * 
 268.138 - * @param list1 the first list
 268.139 - * @param list2 the second list
 268.140 - * @param cmpfnc the compare function
 268.141 - * @param data additional data for the compare function
 268.142 - * @return 1, if and only if the two lists equal element-wise, 0 otherwise
 268.143 - */
 268.144 -int ucx_list_equals(const UcxList *list1, const UcxList *list2,
 268.145 -        cmp_func cmpfnc, void* data);
 268.146 -
 268.147 -/**
 268.148 - * Destroys the entire list.
 268.149 - * 
 268.150 - * The members of the list are not automatically freed, so ensure they are
 268.151 - * otherwise referenced or destroyed by ucx_list_free_contents().
 268.152 - * Otherwise, a memory leak is likely to occur.
 268.153 - * 
 268.154 - * <b>Caution:</b> the argument <b>MUST</b> denote an entire list (i.e. a call
 268.155 - * to ucx_list_first() on the argument must return the argument itself)
 268.156 - * 
 268.157 - * @param list the list to free
 268.158 - * @see ucx_list_free_contents()
 268.159 - */
 268.160 -void ucx_list_free(UcxList *list);
 268.161 -
 268.162 -/**
 268.163 - * Destroys the entire list using a UcxAllocator.
 268.164 - * 
 268.165 - * See ucx_list_free() for details.
 268.166 - * 
 268.167 - * @param allocator the allocator to use
 268.168 - * @param list the list to free
 268.169 - * @see ucx_list_free()
 268.170 - */
 268.171 -void ucx_list_free_a(UcxAllocator *allocator, UcxList *list);
 268.172 -
 268.173 -/**
 268.174 - * Destroys the contents of the specified list by calling the specified
 268.175 - * destructor on each of them.
 268.176 - * 
 268.177 - * Note, that the contents are not usable afterwards and the list should be
 268.178 - * destroyed with ucx_list_free().
 268.179 - *
 268.180 - * If no destructor is specified (<code>NULL</code>), stdlib's free() is used.
 268.181 - * 
 268.182 - * @param list the list for which the contents shall be freed
 268.183 - * @param destr optional destructor function
 268.184 - * @see ucx_list_free()
 268.185 - */
 268.186 -void ucx_list_free_content(UcxList* list, ucx_destructor destr);
 268.187 -
 268.188 -
 268.189 -/**
 268.190 - * Inserts an element at the end of the list.
 268.191 - * 
 268.192 - * This is generally an O(n) operation, as the end of the list is retrieved with
 268.193 - * ucx_list_last().
 268.194 - * 
 268.195 - * @param list the list where to append the data, or <code>NULL</code> to
 268.196 - * create a new list
 268.197 - * @param data the data to insert
 268.198 - * @return <code>list</code>, if it is not <code>NULL</code> or a pointer to
 268.199 - * the newly created list otherwise
 268.200 - */
 268.201 -UcxList *ucx_list_append(UcxList *list, void *data);
 268.202 -
 268.203 -/**
 268.204 - * Inserts an element at the end of the list using a UcxAllocator.
 268.205 - * 
 268.206 - * See ucx_list_append() for details.
 268.207 - * 
 268.208 - * @param allocator the allocator to use
 268.209 - * @param list the list where to append the data, or <code>NULL</code> to
 268.210 - * create a new list
 268.211 - * @param data the data to insert
 268.212 - * @return <code>list</code>, if it is not <code>NULL</code> or a pointer to
 268.213 - * the newly created list otherwise
 268.214 - * @see ucx_list_append()
 268.215 - */
 268.216 -UcxList *ucx_list_append_a(UcxAllocator *allocator, UcxList *list, void *data);
 268.217 -
 268.218 -
 268.219 -/**
 268.220 - * Inserts an element at the beginning of the list.
 268.221 - * 
 268.222 - * You <i>should</i> overwrite the old list pointer by calling
 268.223 - * <code>mylist = ucx_list_prepend(mylist, mydata);</code>. However, you may
 268.224 - * also perform successive calls of ucx_list_prepend() on the same list pointer,
 268.225 - * as this function always searchs for the head of the list with
 268.226 - * ucx_list_first().
 268.227 - * 
 268.228 - * @param list the list where to insert the data or <code>NULL</code> to create
 268.229 - * a new list
 268.230 - * @param data the data to insert
 268.231 - * @return a pointer to the new list head
 268.232 - */
 268.233 -UcxList *ucx_list_prepend(UcxList *list, void *data);
 268.234 -
 268.235 -/**
 268.236 - * Inserts an element at the beginning of the list using a UcxAllocator.
 268.237 - * 
 268.238 - * See ucx_list_prepend() for details.
 268.239 - * 
 268.240 - * @param allocator the allocator to use
 268.241 - * @param list the list where to insert the data or <code>NULL</code> to create
 268.242 - * a new list
 268.243 - * @param data the data to insert
 268.244 - * @return a pointer to the new list head
 268.245 - * @see ucx_list_prepend()
 268.246 - */
 268.247 -UcxList *ucx_list_prepend_a(UcxAllocator *allocator, UcxList *list, void *data);
 268.248 -
 268.249 -/**
 268.250 - * Concatenates two lists.
 268.251 - * 
 268.252 - * Either of the two arguments may be <code>NULL</code>.
 268.253 - * 
 268.254 - * This function modifies the references to the next/previous element of
 268.255 - * the last/first element of <code>list1</code>/<code>
 268.256 - * list2</code>.
 268.257 - * 
 268.258 - * @param list1 first list
 268.259 - * @param list2 second list
 268.260 - * @return if <code>list1</code> is <code>NULL</code>, <code>list2</code> is
 268.261 - * returned, otherwise <code>list1</code> is returned
 268.262 - */
 268.263 -UcxList *ucx_list_concat(UcxList *list1, UcxList *list2);
 268.264 -
 268.265 -/**
 268.266 - * Returns the first element of a list.
 268.267 - * 
 268.268 - * If the argument is the list pointer, it is directly returned. Otherwise
 268.269 - * this function traverses to the first element of the list and returns the
 268.270 - * list pointer.
 268.271 - * 
 268.272 - * @param elem one element of the list
 268.273 - * @return the first element of the list, the specified element is a member of
 268.274 - */
 268.275 -UcxList *ucx_list_first(const UcxList *elem);
 268.276 -
 268.277 -/**
 268.278 - * Returns the last element of a list.
 268.279 - * 
 268.280 - * If the argument has no successor, it is the last element and therefore
 268.281 - * directly returned. Otherwise this function traverses to the last element of
 268.282 - * the list and returns it.
 268.283 - * 
 268.284 - * @param elem one element of the list
 268.285 - * @return the last element of the list, the specified element is a member of
 268.286 - */
 268.287 -UcxList *ucx_list_last(const UcxList *elem);
 268.288 -
 268.289 -/**
 268.290 - * Returns the list element at the specified index.
 268.291 - * 
 268.292 - * @param list the list to retrieve the element from
 268.293 - * @param index index of the element to return
 268.294 - * @return the element at the specified index or <code>NULL</code>, if the
 268.295 - * index is greater than the list size
 268.296 - */
 268.297 -UcxList *ucx_list_get(const UcxList *list, size_t index);
 268.298 -
 268.299 -/**
 268.300 - * Returns the index of an element.
 268.301 - * 
 268.302 - * @param list the list where to search for the element
 268.303 - * @param elem the element to find
 268.304 - * @return the index of the element or -1 if the list does not contain the
 268.305 - * element
 268.306 - */
 268.307 -ssize_t ucx_list_indexof(const UcxList *list, const UcxList *elem);
 268.308 -
 268.309 -/**
 268.310 - * Returns the element count of the list.
 268.311 - * 
 268.312 - * @param list the list whose elements are counted
 268.313 - * @return the element count
 268.314 - */
 268.315 -size_t ucx_list_size(const UcxList *list);
 268.316 -
 268.317 -/**
 268.318 - * Returns the index of an element containing the specified data.
 268.319 - *
 268.320 - * This function uses a cmp_func() to compare the data of each list element
 268.321 - * with the specified data. If no cmp_func is provided, the pointers are
 268.322 - * compared.
 268.323 - * 
 268.324 - * If the list contains the data more than once, the index of the first
 268.325 - * occurrence is returned.
 268.326 - *  
 268.327 - * @param list the list where to search for the data
 268.328 - * @param elem the element data
 268.329 - * @param cmpfnc the compare function
 268.330 - * @param data additional data for the compare function
 268.331 - * @return the index of the element containing the specified data or -1 if the
 268.332 - * data is not found in this list
 268.333 - */
 268.334 -ssize_t ucx_list_find(const UcxList *list, void *elem,
 268.335 -    cmp_func cmpfnc, void *data);
 268.336 -
 268.337 -/**
 268.338 - * Checks, if a list contains a specific element.
 268.339 - * 
 268.340 - * An element is found, if ucx_list_find() returns a value greater than -1.
 268.341 - * 
 268.342 - * @param list the list where to search for the data
 268.343 - * @param elem the element data
 268.344 - * @param cmpfnc the compare function
 268.345 - * @param data additional data for the compare function
 268.346 - * @return 1, if and only if the list contains the specified element data
 268.347 - * @see ucx_list_find()
 268.348 - */
 268.349 -int ucx_list_contains(const UcxList *list, void *elem,
 268.350 -    cmp_func cmpfnc, void *data);
 268.351 -
 268.352 -/**
 268.353 - * Sorts a UcxList with natural merge sort.
 268.354 - * 
 268.355 - * This function uses O(n) additional temporary memory for merge operations
 268.356 - * that is automatically freed after each merge.
 268.357 - * 
 268.358 - * As the head of the list might change, you <b>MUST</b> call this function
 268.359 - * as follows: <code>mylist = ucx_list_sort(mylist, mycmpfnc, mydata);</code>.
 268.360 - * 
 268.361 - * @param list the list to sort
 268.362 - * @param cmpfnc the function that shall be used to compare the element data
 268.363 - * @param data additional data for the cmp_func()
 268.364 - * @return the sorted list
 268.365 - */
 268.366 -UcxList *ucx_list_sort(UcxList *list, cmp_func cmpfnc, void *data);
 268.367 -
 268.368 -/**
 268.369 - * Removes an element from the list.
 268.370 - * 
 268.371 - * If the first element is removed, the list pointer changes. So it is
 268.372 - * <i>highly recommended</i> to <i>always</i> update the pointer by calling
 268.373 - * <code>mylist = ucx_list_remove(mylist, myelem);</code>.
 268.374 - * 
 268.375 - * @param list the list from which the element shall be removed
 268.376 - * @param element the element to remove
 268.377 - * @return returns the updated list pointer or <code>NULL</code>, if the list
 268.378 - * is now empty
 268.379 - */
 268.380 -UcxList *ucx_list_remove(UcxList *list, UcxList *element);
 268.381 -
 268.382 -/**
 268.383 - * Removes an element from the list using a UcxAllocator.
 268.384 - * 
 268.385 - * See ucx_list_remove() for details.
 268.386 - * 
 268.387 - * @param allocator the allocator to use
 268.388 - * @param list the list from which the element shall be removed
 268.389 - * @param element the element to remove
 268.390 - * @return returns the updated list pointer or <code>NULL</code>, if the list
 268.391 - * @see ucx_list_remove()
 268.392 - */
 268.393 -UcxList *ucx_list_remove_a(UcxAllocator *allocator, UcxList *list,
 268.394 -        UcxList *element);
 268.395 -
 268.396 -/**
 268.397 - * Returns the union of two lists.
 268.398 - * 
 268.399 - * The union is a list of unique elements regarding cmpfnc obtained from
 268.400 - * both source lists.
 268.401 - * 
 268.402 - * @param left the left source list
 268.403 - * @param right the right source list
 268.404 - * @param cmpfnc a function to compare elements
 268.405 - * @param cmpdata additional data for the compare function
 268.406 - * @param cpfnc a function to copy the elements
 268.407 - * @param cpdata additional data for the copy function
 268.408 - * @return a new list containing the union
 268.409 - */
 268.410 -UcxList* ucx_list_union(const UcxList *left, const UcxList *right,
 268.411 -    cmp_func cmpfnc, void* cmpdata,
 268.412 -    copy_func cpfnc, void* cpdata);
 268.413 -
 268.414 -/**
 268.415 - * Returns the union of two lists.
 268.416 - * 
 268.417 - * The union is a list of unique elements regarding cmpfnc obtained from
 268.418 - * both source lists.
 268.419 - * 
 268.420 - * @param allocator allocates the new list elements
 268.421 - * @param left the left source list
 268.422 - * @param right the right source list
 268.423 - * @param cmpfnc a function to compare elements
 268.424 - * @param cmpdata additional data for the compare function
 268.425 - * @param cpfnc a function to copy the elements
 268.426 - * @param cpdata additional data for the copy function
 268.427 - * @return a new list containing the union
 268.428 - */
 268.429 -UcxList* ucx_list_union_a(UcxAllocator *allocator,
 268.430 -    const UcxList *left, const UcxList *right,
 268.431 -    cmp_func cmpfnc, void* cmpdata,
 268.432 -    copy_func cpfnc, void* cpdata);
 268.433 -
 268.434 -/**
 268.435 - * Returns the intersection of two lists.
 268.436 - * 
 268.437 - * The intersection contains all elements of the left list
 268.438 - * (including duplicates) that can be found in the right list.
 268.439 - * 
 268.440 - * @param left the left source list
 268.441 - * @param right the right source list
 268.442 - * @param cmpfnc a function to compare elements
 268.443 - * @param cmpdata additional data for the compare function
 268.444 - * @param cpfnc a function to copy the elements
 268.445 - * @param cpdata additional data for the copy function
 268.446 - * @return a new list containing the intersection
 268.447 - */
 268.448 -UcxList* ucx_list_intersection(const UcxList *left, const UcxList *right,
 268.449 -    cmp_func cmpfnc, void* cmpdata,
 268.450 -    copy_func cpfnc, void* cpdata);
 268.451 -
 268.452 -/**
 268.453 - * Returns the intersection of two lists.
 268.454 - * 
 268.455 - * The intersection contains all elements of the left list
 268.456 - * (including duplicates) that can be found in the right list.
 268.457 - * 
 268.458 - * @param allocator allocates the new list elements
 268.459 - * @param left the left source list
 268.460 - * @param right the right source list
 268.461 - * @param cmpfnc a function to compare elements
 268.462 - * @param cmpdata additional data for the compare function
 268.463 - * @param cpfnc a function to copy the elements
 268.464 - * @param cpdata additional data for the copy function
 268.465 - * @return a new list containing the intersection
 268.466 - */
 268.467 -UcxList* ucx_list_intersection_a(UcxAllocator *allocator,
 268.468 -    const UcxList *left, const UcxList *right,
 268.469 -    cmp_func cmpfnc, void* cmpdata,
 268.470 -    copy_func cpfnc, void* cpdata);
 268.471 -
 268.472 -/**
 268.473 - * Returns the difference of two lists.
 268.474 - * 
 268.475 - * The difference contains all elements of the left list
 268.476 - * (including duplicates) that are not equal to any element of the right list.
 268.477 - * 
 268.478 - * @param left the left source list
 268.479 - * @param right the right source list
 268.480 - * @param cmpfnc a function to compare elements
 268.481 - * @param cmpdata additional data for the compare function
 268.482 - * @param cpfnc a function to copy the elements
 268.483 - * @param cpdata additional data for the copy function
 268.484 - * @return a new list containing the difference
 268.485 - */
 268.486 -UcxList* ucx_list_difference(const UcxList *left, const UcxList *right,
 268.487 -    cmp_func cmpfnc, void* cmpdata,
 268.488 -    copy_func cpfnc, void* cpdata);
 268.489 -
 268.490 -/**
 268.491 - * Returns the difference of two lists.
 268.492 - * 
 268.493 - * The difference contains all elements of the left list
 268.494 - * (including duplicates) that are not equal to any element of the right list.
 268.495 - * 
 268.496 - * @param allocator allocates the new list elements
 268.497 - * @param left the left source list
 268.498 - * @param right the right source list
 268.499 - * @param cmpfnc a function to compare elements
 268.500 - * @param cmpdata additional data for the compare function
 268.501 - * @param cpfnc a function to copy the elements
 268.502 - * @param cpdata additional data for the copy function
 268.503 - * @return a new list containing the difference
 268.504 - */
 268.505 -UcxList* ucx_list_difference_a(UcxAllocator *allocator,
 268.506 -    const UcxList *left, const UcxList *right,
 268.507 -    cmp_func cmpfnc, void* cmpdata,
 268.508 -    copy_func cpfnc, void* cpdata);
 268.509 -
 268.510 -#ifdef	__cplusplus
 268.511 -}
 268.512 -#endif
 268.513 -
 268.514 -#endif	/* UCX_LIST_H */
 268.515 -
   269.1 --- a/src/ucx/logging.h	Mon Dec 30 09:54:10 2019 +0100
   269.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   269.3 @@ -1,253 +0,0 @@
   269.4 -/*
   269.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   269.6 - *
   269.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   269.8 - *
   269.9 - * Redistribution and use in source and binary forms, with or without
  269.10 - * modification, are permitted provided that the following conditions are met:
  269.11 - *
  269.12 - *   1. Redistributions of source code must retain the above copyright
  269.13 - *      notice, this list of conditions and the following disclaimer.
  269.14 - *
  269.15 - *   2. Redistributions in binary form must reproduce the above copyright
  269.16 - *      notice, this list of conditions and the following disclaimer in the
  269.17 - *      documentation and/or other materials provided with the distribution.
  269.18 - *
  269.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  269.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  269.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  269.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  269.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  269.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  269.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  269.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  269.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  269.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  269.29 - * POSSIBILITY OF SUCH DAMAGE.
  269.30 - */
  269.31 -/**
  269.32 - * Logging API.
  269.33 - * 
  269.34 - * @file   logging.h
  269.35 - * @author Mike Becker, Olaf Wintermann
  269.36 - */
  269.37 -#ifndef UCX_LOGGING_H
  269.38 -#define UCX_LOGGING_H
  269.39 -
  269.40 -#include "ucx.h"
  269.41 -#include "map.h"
  269.42 -#include "string.h"
  269.43 -#include <stdio.h>
  269.44 -
  269.45 -#ifdef __cplusplus
  269.46 -extern "C" {
  269.47 -#endif
  269.48 -
  269.49 -/* leave enough space for custom log levels */
  269.50 -
  269.51 -/** Log level for error messages. */
  269.52 -#define UCX_LOGGER_ERROR        0x00
  269.53 -    
  269.54 -/** Log level for warning messages. */
  269.55 -#define UCX_LOGGER_WARN         0x10
  269.56 -
  269.57 -/** Log level for information messages. */
  269.58 -#define UCX_LOGGER_INFO         0x20
  269.59 -
  269.60 -/** Log level for debug messages. */
  269.61 -#define UCX_LOGGER_DEBUG        0x30
  269.62 -
  269.63 -/** Log level for trace messages. */
  269.64 -#define UCX_LOGGER_TRACE        0x40
  269.65 -
  269.66 -/**
  269.67 - * Output flag for the log level. 
  269.68 - * If this flag is set, the log message will contain the log level.
  269.69 - * @see UcxLogger.mask
  269.70 - */
  269.71 -#define UCX_LOGGER_LEVEL        0x01
  269.72 -
  269.73 -/**
  269.74 - * Output flag for the timestmap.
  269.75 - * If this flag is set, the log message will contain the timestmap.
  269.76 - * @see UcxLogger.mask
  269.77 - */
  269.78 -#define UCX_LOGGER_TIMESTAMP    0x02
  269.79 -
  269.80 -/**
  269.81 - * Output flag for the source.
  269.82 - * If this flag is set, the log message will contain the source file and line
  269.83 - * number.
  269.84 - * @see UcxLogger.mask
  269.85 - */
  269.86 -#define UCX_LOGGER_SOURCE       0x04
  269.87 -
  269.88 -/**
  269.89 - * The UCX Logger object.
  269.90 - */
  269.91 -typedef struct {
  269.92 -    /** The stream this logger writes its messages to.*/
  269.93 -    void *stream;
  269.94 -
  269.95 -    /**
  269.96 -     * The write function that shall be used.
  269.97 -     * For standard file or stdout loggers this might be standard fwrite
  269.98 -     * (default).
  269.99 -     */
 269.100 -    write_func writer;
 269.101 -
 269.102 -    /**
 269.103 -     * The date format for timestamp outputs including the delimiter
 269.104 -     * (default: <code>"%F %T %z "</code>).
 269.105 -     * @see UCX_LOGGER_TIMESTAMP
 269.106 -     */
 269.107 -    char *dateformat;
 269.108 -
 269.109 -    /**
 269.110 -     * The level, this logger operates on.
 269.111 -     * If a log command is issued, the message will only be logged, if the log
 269.112 -     * level of the message is less or equal than the log level of the logger.
 269.113 -     */
 269.114 -    unsigned int level;
 269.115 -
 269.116 -    /**
 269.117 -     * A configuration mask for automatic output. 
 269.118 -     * For each flag that is set, the logger automatically outputs some extra
 269.119 -     * information like the timestamp or the source file and line number.
 269.120 -     * See the documentation for the flags for details.
 269.121 -     */
 269.122 -    unsigned int mask;
 269.123 -
 269.124 -    /**
 269.125 -     * A map of valid log levels for this logger.
 269.126 -     * 
 269.127 -     * The keys represent all valid log levels and the values provide string
 269.128 -     * representations, that are used, if the UCX_LOGGER_LEVEL flag is set.
 269.129 -     * 
 269.130 -     * The exact data types are <code>unsigned int</code> for the key and
 269.131 -     * <code>const char*</code> for the value.
 269.132 -     * 
 269.133 -     * @see UCX_LOGGER_LEVEL
 269.134 -     */
 269.135 -    UcxMap* levels;
 269.136 -} UcxLogger;
 269.137 -
 269.138 -/**
 269.139 - * Creates a new logger.
 269.140 - * @param stream the stream, which the logger shall write to
 269.141 - * @param level the level on which the logger shall operate
 269.142 - * @param mask configuration mask (cf. UcxLogger.mask)
 269.143 - * @return a new logger object
 269.144 - */
 269.145 -UcxLogger *ucx_logger_new(void *stream, unsigned int level, unsigned int mask);
 269.146 -
 269.147 -/**
 269.148 - * Destroys the logger.
 269.149 - * 
 269.150 - * The map containing the valid log levels is also automatically destroyed.
 269.151 - * 
 269.152 - * @param logger the logger to destroy
 269.153 - */
 269.154 -void ucx_logger_free(UcxLogger* logger);
 269.155 -
 269.156 -/**
 269.157 - * Internal log function - use macros instead.
 269.158 - * 
 269.159 - * This function uses the <code>format</code> and variadic arguments for a
 269.160 - * printf()-style output of the log message.
 269.161 - * 
 269.162 - * Dependent on the UcxLogger.mask some information is prepended. The complete
 269.163 - * format is:
 269.164 - * 
 269.165 - * <code>[LEVEL] [TIMESTAMP] [SOURCEFILE]:[LINENO] message</code>
 269.166 - *
 269.167 - * The source file name is reduced to the actual file name. This is necessary to
 269.168 - * get consistent behavior over different definitions of the __FILE__ macro.
 269.169 - *
 269.170 - * <b>Attention:</b> the message (including automatically generated information)
 269.171 - * is limited to 4096 characters. The level description is limited to
 269.172 - * 256 characters and the timestamp string is limited to 128 characters.
 269.173 - * 
 269.174 - * @param logger the logger to use
 269.175 - * @param level the level to log on
 269.176 - * @param file information about the source file
 269.177 - * @param line information about the source line number
 269.178 - * @param format format string
 269.179 - * @param ... arguments
 269.180 - * @see ucx_logger_log()
 269.181 - */
 269.182 -void ucx_logger_logf(UcxLogger *logger, unsigned int level, const char* file,
 269.183 -        const unsigned int line, const char* format, ...);
 269.184 -
 269.185 -/**
 269.186 - * Registers a custom log level.
 269.187 - * @param logger the logger
 269.188 - * @param level the log level as unsigned integer
 269.189 - * @param name a string literal describing the level
 269.190 - */
 269.191 -#define ucx_logger_register_level(logger, level, name) {\
 269.192 -        unsigned int l; \
 269.193 -            l = level; \
 269.194 -            ucx_map_int_put(logger->levels, l, (void*) "[" name "]"); \
 269.195 -        } while (0);
 269.196 -
 269.197 -/**
 269.198 - * Logs a message at the specified level.
 269.199 - * @param logger the logger to use
 269.200 - * @param level the level to log the message on
 269.201 - * @param ... format string and arguments
 269.202 - * @see ucx_logger_logf()
 269.203 - */
 269.204 -#define ucx_logger_log(logger, level, ...) \
 269.205 -    ucx_logger_logf(logger, level, __FILE__, __LINE__, __VA_ARGS__)
 269.206 -
 269.207 -/**
 269.208 - * Shortcut for logging an error message.
 269.209 - * @param logger the logger to use
 269.210 - * @param ... format string and arguments
 269.211 - * @see ucx_logger_logf()
 269.212 - */
 269.213 -#define ucx_logger_error(logger, ...) \
 269.214 -    ucx_logger_log(logger, UCX_LOGGER_ERROR, __VA_ARGS__)
 269.215 -
 269.216 -/**
 269.217 - * Shortcut for logging an information message.
 269.218 - * @param logger the logger to use
 269.219 - * @param ... format string and arguments
 269.220 - * @see ucx_logger_logf()
 269.221 - */
 269.222 -#define ucx_logger_info(logger, ...) \
 269.223 -    ucx_logger_log(logger, UCX_LOGGER_INFO, __VA_ARGS__)
 269.224 -
 269.225 -/**
 269.226 - * Shortcut for logging a warning message.
 269.227 - * @param logger the logger to use
 269.228 - * @param ... format string and arguments
 269.229 - * @see ucx_logger_logf()
 269.230 - */
 269.231 -#define ucx_logger_warn(logger, ...) \
 269.232 -    ucx_logger_log(logger, UCX_LOGGER_WARN, __VA_ARGS__)
 269.233 -
 269.234 -/**
 269.235 - * Shortcut for logging a debug message.
 269.236 - * @param logger the logger to use
 269.237 - * @param ... format string and arguments
 269.238 - * @see ucx_logger_logf()
 269.239 - */
 269.240 -#define ucx_logger_debug(logger, ...) \
 269.241 -    ucx_logger_log(logger, UCX_LOGGER_DEBUG, __VA_ARGS__)
 269.242 -
 269.243 -/**
 269.244 - * Shortcut for logging a trace message.
 269.245 - * @param logger the logger to use
 269.246 - * @param ... format string and arguments
 269.247 - * @see ucx_logger_logf()
 269.248 - */
 269.249 -#define ucx_logger_trace(logger, ...) \
 269.250 -    ucx_logger_log(logger, UCX_LOGGER_TRACE, __VA_ARGS__)
 269.251 -
 269.252 -#ifdef __cplusplus
 269.253 -}
 269.254 -#endif
 269.255 -
 269.256 -#endif /* UCX_LOGGING_H */
   270.1 --- a/src/ucx/map.h	Mon Dec 30 09:54:10 2019 +0100
   270.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   270.3 @@ -1,549 +0,0 @@
   270.4 -/*
   270.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   270.6 - *
   270.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   270.8 - *
   270.9 - * Redistribution and use in source and binary forms, with or without
  270.10 - * modification, are permitted provided that the following conditions are met:
  270.11 - *
  270.12 - *   1. Redistributions of source code must retain the above copyright
  270.13 - *      notice, this list of conditions and the following disclaimer.
  270.14 - *
  270.15 - *   2. Redistributions in binary form must reproduce the above copyright
  270.16 - *      notice, this list of conditions and the following disclaimer in the
  270.17 - *      documentation and/or other materials provided with the distribution.
  270.18 - *
  270.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  270.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  270.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  270.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  270.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  270.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  270.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  270.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  270.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  270.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  270.29 - * POSSIBILITY OF SUCH DAMAGE.
  270.30 - */
  270.31 -
  270.32 -/**
  270.33 - * @file map.h
  270.34 - * 
  270.35 - * Hash map implementation.
  270.36 - * 
  270.37 - * This implementation uses murmur hash 2 and separate chaining with linked
  270.38 - * lists.
  270.39 - * 
  270.40 - * @author Mike Becker
  270.41 - * @author Olaf Wintermann
  270.42 - */
  270.43 -
  270.44 -#ifndef UCX_MAP_H
  270.45 -#define	UCX_MAP_H
  270.46 -
  270.47 -#include "ucx.h"
  270.48 -#include "string.h"
  270.49 -#include "allocator.h"
  270.50 -#include <stdio.h>
  270.51 -
  270.52 -#ifdef	__cplusplus
  270.53 -extern "C" {
  270.54 -#endif
  270.55 -
  270.56 -/**
  270.57 - * Loop statement for UCX maps.
  270.58 - * 
  270.59 - * The <code>key</code> variable is implicitly defined, but the
  270.60 - * <code>value</code> variable must be already declared as type information
  270.61 - * cannot be inferred.
  270.62 - * 
  270.63 - * @param key the variable name for the key
  270.64 - * @param value the variable name for the value
  270.65 - * @param iter a UcxMapIterator
  270.66 - * @see ucx_map_iterator()
  270.67 - */
  270.68 -#define UCX_MAP_FOREACH(key,value,iter) \
  270.69 -        for(UcxKey key;ucx_map_iter_next(&iter,&key, (void**)&value);)
  270.70 -
  270.71 -/** Type for the UCX map. @see UcxMap */
  270.72 -typedef struct UcxMap          UcxMap;
  270.73 -
  270.74 -/** Type for a key of a UcxMap. @see UcxKey */
  270.75 -typedef struct UcxKey          UcxKey;
  270.76 -
  270.77 -/** Type for an element of a UcxMap. @see UcxMapElement */
  270.78 -typedef struct UcxMapElement   UcxMapElement;
  270.79 -
  270.80 -/** Type for an iterator over a UcxMap. @see UcxMapIterator */
  270.81 -typedef struct UcxMapIterator  UcxMapIterator;
  270.82 -
  270.83 -/** Structure for the UCX map. */
  270.84 -struct UcxMap {
  270.85 -    /** An allocator that is used for the map elements. */
  270.86 -    UcxAllocator  *allocator;
  270.87 -    /** The array of map element lists. */
  270.88 -    UcxMapElement **map;
  270.89 -    /** The size of the map is the length of the element list array. */
  270.90 -    size_t        size;
  270.91 -    /** The count of elements currently stored in this map. */
  270.92 -    size_t        count;
  270.93 -};
  270.94 -
  270.95 -/** Structure to publicly denote a key of a UcxMap. */
  270.96 -struct UcxKey {
  270.97 -    /** The key data. */
  270.98 -    const void *data;
  270.99 -    /** The length of the key data. */
 270.100 -    size_t     len;
 270.101 -    /** A cache for the hash value of the key data. */
 270.102 -    int        hash;
 270.103 -};
 270.104 -
 270.105 -/** Internal structure for a key of a UcxMap. */
 270.106 -struct UcxMapKey {
 270.107 -    /** The key data. */
 270.108 -    void    *data;
 270.109 -    /** The length of the key data. */
 270.110 -    size_t  len;
 270.111 -    /** The hash value of the key data. */
 270.112 -    int     hash;
 270.113 -};
 270.114 -
 270.115 -/** Structure for an element of a UcxMap. */
 270.116 -struct UcxMapElement {
 270.117 -    /** The value data. */
 270.118 -    void              *data;
 270.119 -    
 270.120 -    /** A pointer to the next element in the current list. */
 270.121 -    UcxMapElement     *next;
 270.122 -    
 270.123 -    /** The corresponding key. */
 270.124 -    struct UcxMapKey  key;
 270.125 -};
 270.126 -
 270.127 -/** Structure for an iterator over a UcxMap. */
 270.128 -struct UcxMapIterator {
 270.129 -    /** The map to iterate over. */
 270.130 -    UcxMap const  *map;
 270.131 -    
 270.132 -    /** The current map element. */
 270.133 -    UcxMapElement *cur;
 270.134 -    
 270.135 -    /**
 270.136 -     * The current index of the element list array.
 270.137 -     * <b>Attention: </b> this is <b>NOT</b> the element index! Do <b>NOT</b>
 270.138 -     * manually iterate over the map by increasing this index. Use
 270.139 -     * ucx_map_iter_next().
 270.140 -     * @see UcxMap.map*/
 270.141 -    size_t        index;
 270.142 -};
 270.143 -
 270.144 -/**
 270.145 - * Creates a new hash map with the specified size.
 270.146 - * @param size the size of the hash map
 270.147 - * @return a pointer to the new hash map
 270.148 - */
 270.149 -UcxMap *ucx_map_new(size_t size);
 270.150 -
 270.151 -/**
 270.152 - * Creates a new hash map with the specified size using a UcxAllocator.
 270.153 - * @param allocator the allocator to use
 270.154 - * @param size the size of the hash map
 270.155 - * @return a pointer to the new hash map
 270.156 - */
 270.157 -UcxMap *ucx_map_new_a(UcxAllocator *allocator, size_t size);
 270.158 -
 270.159 -/**
 270.160 - * Frees a hash map.
 270.161 - * 
 270.162 - * <b>Note:</b> the contents are <b>not</b> freed, use ucx_map_free_content()
 270.163 - * before calling this function to achieve that.
 270.164 - * 
 270.165 - * @param map the map to be freed
 270.166 - * @see ucx_map_free_content()
 270.167 - */
 270.168 -void ucx_map_free(UcxMap *map);
 270.169 -
 270.170 -/**
 270.171 - * Frees the contents of a hash map.
 270.172 - * 
 270.173 - * This is a convenience function that iterates over the map and passes all
 270.174 - * values to the specified destructor function.
 270.175 - * 
 270.176 - * If no destructor is specified (<code>NULL</code>), the free() function of
 270.177 - * the map's own allocator is used.
 270.178 - * 
 270.179 - * You must ensure, that it is valid to pass each value in the map to the same
 270.180 - * destructor function.
 270.181 - * 
 270.182 - * You should free or clear the map afterwards, as the contents will be invalid.
 270.183 - * 
 270.184 - * @param map for which the contents shall be freed
 270.185 - * @param destr optional pointer to a destructor function
 270.186 - * @see ucx_map_free()
 270.187 - * @see ucx_map_clear()
 270.188 - */
 270.189 -void ucx_map_free_content(UcxMap *map, ucx_destructor destr);
 270.190 -
 270.191 -/**
 270.192 - * Clears a hash map.
 270.193 - * 
 270.194 - * <b>Note:</b> the contents are <b>not</b> freed, use ucx_map_free_content()
 270.195 - * before calling this function to achieve that.
 270.196 - * 
 270.197 - * @param map the map to be cleared
 270.198 - * @see ucx_map_free_content()
 270.199 - */
 270.200 -void ucx_map_clear(UcxMap *map);
 270.201 -
 270.202 -
 270.203 -/**
 270.204 - * Copies contents from a map to another map using a copy function.
 270.205 - * 
 270.206 - * <b>Note:</b> The destination map does not need to be empty. However, if it
 270.207 - * contains data with keys that are also present in the source map, the contents
 270.208 - * are overwritten.
 270.209 - * 
 270.210 - * @param from the source map
 270.211 - * @param to the destination map
 270.212 - * @param fnc the copy function or <code>NULL</code> if the pointer address
 270.213 - * shall be copied
 270.214 - * @param data additional data for the copy function
 270.215 - * @return 0 on success or a non-zero value on memory allocation errors
 270.216 - */
 270.217 -int ucx_map_copy(UcxMap const *from, UcxMap *to, copy_func fnc, void *data);
 270.218 -
 270.219 -/**
 270.220 - * Clones the map and rehashes if necessary.
 270.221 - * 
 270.222 - * <b>Note:</b> In contrast to ucx_map_rehash() the load factor is irrelevant.
 270.223 - * This function <i>always</i> ensures a new UcxMap.size of at least
 270.224 - * 2.5*UcxMap.count.
 270.225 - * 
 270.226 - * @param map the map to clone
 270.227 - * @param fnc the copy function to use or <code>NULL</code> if the new and
 270.228 - * the old map shall share the data pointers
 270.229 - * @param data additional data for the copy function
 270.230 - * @return the cloned map
 270.231 - * @see ucx_map_copy()
 270.232 - */
 270.233 -UcxMap *ucx_map_clone(UcxMap const *map, copy_func fnc, void *data);
 270.234 -
 270.235 -/**
 270.236 - * Clones the map and rehashes if necessary.
 270.237 - *
 270.238 - * <b>Note:</b> In contrast to ucx_map_rehash() the load factor is irrelevant.
 270.239 - * This function <i>always</i> ensures a new UcxMap.size of at least
 270.240 - * 2.5*UcxMap.count.
 270.241 - *
 270.242 - * @param allocator the allocator to use for the cloned map
 270.243 - * @param map the map to clone
 270.244 - * @param fnc the copy function to use or <code>NULL</code> if the new and
 270.245 - * the old map shall share the data pointers
 270.246 - * @param data additional data for the copy function
 270.247 - * @return the cloned map
 270.248 - * @see ucx_map_copy()
 270.249 - */
 270.250 -UcxMap *ucx_map_clone_a(UcxAllocator *allocator,
 270.251 -                        UcxMap const *map, copy_func fnc, void *data);
 270.252 -
 270.253 -/**
 270.254 - * Increases size of the hash map, if necessary.
 270.255 - * 
 270.256 - * The load value is 0.75*UcxMap.size. If the element count exceeds the load
 270.257 - * value, the map needs to be rehashed. Otherwise no action is performed and
 270.258 - * this function simply returns 0.
 270.259 - * 
 270.260 - * The rehashing process ensures, that the UcxMap.size is at least
 270.261 - * 2.5*UcxMap.count. So there is enough room for additional elements without
 270.262 - * the need of another soon rehashing.
 270.263 - * 
 270.264 - * You can use this function to dramatically increase access performance.
 270.265 - * 
 270.266 - * @param map the map to rehash
 270.267 - * @return 1, if a memory allocation error occurred, 0 otherwise
 270.268 - */
 270.269 -int ucx_map_rehash(UcxMap *map);
 270.270 -
 270.271 -/**
 270.272 - * Puts a key/value-pair into the map.
 270.273 - * 
 270.274 - * @param map the map
 270.275 - * @param key the key
 270.276 - * @param value the value
 270.277 - * @return 0 on success, non-zero value on failure
 270.278 - */
 270.279 -int ucx_map_put(UcxMap *map, UcxKey key, void *value);
 270.280 -
 270.281 -/**
 270.282 - * Retrieves a value by using a key.
 270.283 - * 
 270.284 - * @param map the map
 270.285 - * @param key the key
 270.286 - * @return the value
 270.287 - */
 270.288 -void* ucx_map_get(UcxMap const *map, UcxKey key);
 270.289 -
 270.290 -/**
 270.291 - * Removes a key/value-pair from the map by using the key.
 270.292 - * 
 270.293 - * @param map the map
 270.294 - * @param key the key
 270.295 - * @return the removed value
 270.296 - */
 270.297 -void* ucx_map_remove(UcxMap *map, UcxKey key);
 270.298 -
 270.299 -/**
 270.300 - * Shorthand for putting data with a sstr_t key into the map.
 270.301 - * @param map the map
 270.302 - * @param key the key
 270.303 - * @param value the value
 270.304 - * @return 0 on success, non-zero value on failure
 270.305 - * @see ucx_map_put()
 270.306 - */
 270.307 -#define ucx_map_sstr_put(map, key, value) \
 270.308 -    ucx_map_put(map, ucx_key(key.ptr, key.length), (void*)value)
 270.309 -
 270.310 -/**
 270.311 - * Shorthand for putting data with a C string key into the map.
 270.312 - * @param map the map
 270.313 - * @param key the key
 270.314 - * @param value the value
 270.315 - * @return 0 on success, non-zero value on failure
 270.316 - * @see ucx_map_put()
 270.317 - */
 270.318 -#define ucx_map_cstr_put(map, key, value) \
 270.319 -    ucx_map_put(map, ucx_key(key, strlen(key)), (void*)value)
 270.320 -
 270.321 -/**
 270.322 - * Shorthand for putting data with an integer key into the map.
 270.323 - * @param map the map
 270.324 - * @param key the key
 270.325 - * @param value the value
 270.326 - * @return 0 on success, non-zero value on failure
 270.327 - * @see ucx_map_put()
 270.328 - */
 270.329 -#define ucx_map_int_put(map, key, value) \
 270.330 -    ucx_map_put(map, ucx_key(&key, sizeof(key)), (void*)value)
 270.331 -
 270.332 -/**
 270.333 - * Shorthand for getting data from the map with a sstr_t key.
 270.334 - * @param map the map
 270.335 - * @param key the key
 270.336 - * @return the value
 270.337 - * @see ucx_map_get()
 270.338 - */
 270.339 -#define ucx_map_sstr_get(map, key) \
 270.340 -    ucx_map_get(map, ucx_key(key.ptr, key.length))
 270.341 -
 270.342 -/**
 270.343 - * Shorthand for getting data from the map with a C string key.
 270.344 - * @param map the map
 270.345 - * @param key the key
 270.346 - * @return the value
 270.347 - * @see ucx_map_get()
 270.348 - */
 270.349 -#define ucx_map_cstr_get(map, key) \
 270.350 -    ucx_map_get(map, ucx_key(key, strlen(key)))
 270.351 -
 270.352 -/**
 270.353 - * Shorthand for getting data from the map with an integer key.
 270.354 - * @param map the map
 270.355 - * @param key the key
 270.356 - * @return the value
 270.357 - * @see ucx_map_get()
 270.358 - */
 270.359 -#define ucx_map_int_get(map, key) \
 270.360 -    ucx_map_get(map, ucx_key(&key, sizeof(int)))
 270.361 -
 270.362 -/**
 270.363 - * Shorthand for removing data from the map with a sstr_t key.
 270.364 - * @param map the map
 270.365 - * @param key the key
 270.366 - * @return the removed value
 270.367 - * @see ucx_map_remove()
 270.368 - */
 270.369 -#define ucx_map_sstr_remove(map, key) \
 270.370 -    ucx_map_remove(map, ucx_key(key.ptr, key.length))
 270.371 -
 270.372 -/**
 270.373 - * Shorthand for removing data from the map with a C string key.
 270.374 - * @param map the map
 270.375 - * @param key the key
 270.376 - * @return the removed value
 270.377 - * @see ucx_map_remove()
 270.378 - */
 270.379 -#define ucx_map_cstr_remove(map, key) \
 270.380 -    ucx_map_remove(map, ucx_key(key, strlen(key)))
 270.381 -
 270.382 -/**
 270.383 - * Shorthand for removing data from the map with an integer key.
 270.384 - * @param map the map
 270.385 - * @param key the key
 270.386 - * @return the removed value
 270.387 - * @see ucx_map_remove()
 270.388 - */
 270.389 -#define ucx_map_int_remove(map, key) \
 270.390 -    ucx_map_remove(map, ucx_key(&key, sizeof(key)))
 270.391 -
 270.392 -/**
 270.393 - * Creates a UcxKey based on the given data.
 270.394 - * 
 270.395 - * This function implicitly computes the hash.
 270.396 - * 
 270.397 - * @param data the data for the key
 270.398 - * @param len the length of the data
 270.399 - * @return a UcxKey with implicitly computed hash
 270.400 - * @see ucx_hash()
 270.401 - */
 270.402 -UcxKey ucx_key(const void *data, size_t len);
 270.403 -
 270.404 -/**
 270.405 - * Computes a murmur hash-2.
 270.406 - * 
 270.407 - * @param data the data to hash
 270.408 - * @param len the length of the data
 270.409 - * @return the murmur hash-2 of the data
 270.410 - */
 270.411 -int ucx_hash(const char *data, size_t len);
 270.412 -
 270.413 -/**
 270.414 - * Creates an iterator for a map.
 270.415 - * 
 270.416 - * <b>Note:</b> A UcxMapIterator iterates over all elements in all element
 270.417 - * lists successively. Therefore the order highly depends on the key hashes and
 270.418 - * may vary under different map sizes. So generally you may <b>NOT</b> rely on
 270.419 - * the iteration order.
 270.420 - * 
 270.421 - * <b>Note:</b> The iterator is <b>NOT</b> initialized. You need to call
 270.422 - * ucx_map_iter_next() at least once before accessing any information. However,
 270.423 - * it is not recommended to access the fields of a UcxMapIterator directly.
 270.424 - * 
 270.425 - * @param map the map to create the iterator for
 270.426 - * @return an iterator initialized on the first element of the
 270.427 - * first element list
 270.428 - * @see ucx_map_iter_next()
 270.429 - */
 270.430 -UcxMapIterator ucx_map_iterator(UcxMap const *map);
 270.431 -
 270.432 -/**
 270.433 - * Proceeds to the next element of the map (if any).
 270.434 - * 
 270.435 - * Subsequent calls on the same iterator proceed to the next element and
 270.436 - * store the key/value-pair into the memory specified as arguments of this
 270.437 - * function.
 270.438 - * 
 270.439 - * If no further elements are found, this function returns zero and leaves the
 270.440 - * last found key/value-pair in memory.
 270.441 - * 
 270.442 - * @param iterator the iterator to use
 270.443 - * @param key a pointer to the memory where to store the key
 270.444 - * @param value a pointer to the memory where to store the value
 270.445 - * @return 1, if another element was found, 0 if all elements has been processed
 270.446 - * @see ucx_map_iterator()
 270.447 - */
 270.448 -int ucx_map_iter_next(UcxMapIterator *iterator, UcxKey *key, void **value);
 270.449 -
 270.450 -/**
 270.451 - * Returns the union of two maps.
 270.452 - *
 270.453 - * The union is a fresh map which is filled by two successive calls of
 270.454 - * ucx_map_copy() on the two input maps.
 270.455 - *
 270.456 - * @param first the first source map
 270.457 - * @param second the second source map
 270.458 - * @param cpfnc a function to copy the elements
 270.459 - * @param cpdata additional data for the copy function
 270.460 - * @return a new map containing the union
 270.461 - */
 270.462 -UcxMap* ucx_map_union(const UcxMap *first, const UcxMap *second,
 270.463 -                      copy_func cpfnc, void* cpdata);
 270.464 -
 270.465 -/**
 270.466 - * Returns the union of two maps.
 270.467 - *
 270.468 - * The union is a fresh map which is filled by two successive calls of
 270.469 - * ucx_map_copy() on the two input maps.
 270.470 - *
 270.471 - * @param allocator the allocator that shall be used by the new map
 270.472 - * @param first the first source map
 270.473 - * @param second the second source map
 270.474 - * @param cpfnc a function to copy the elements
 270.475 - * @param cpdata additional data for the copy function
 270.476 - * @return a new map containing the union
 270.477 - */
 270.478 -UcxMap* ucx_map_union_a(UcxAllocator *allocator,
 270.479 -                        const UcxMap *first, const UcxMap *second,
 270.480 -                        copy_func cpfnc, void* cpdata);
 270.481 -
 270.482 -/**
 270.483 - * Returns the intersection of two maps.
 270.484 - *
 270.485 - * The intersection is defined as a copy of the first map with every element
 270.486 - * removed that has no valid key in the second map.
 270.487 - *
 270.488 - * @param first the first source map
 270.489 - * @param second the second source map
 270.490 - * @param cpfnc a function to copy the elements
 270.491 - * @param cpdata additional data for the copy function
 270.492 - * @return a new map containing the intersection
 270.493 - */
 270.494 -UcxMap* ucx_map_intersection(const UcxMap *first, const UcxMap *second,
 270.495 -                             copy_func cpfnc, void* cpdata);
 270.496 -
 270.497 -/**
 270.498 - * Returns the intersection of two maps.
 270.499 - *
 270.500 - * The intersection is defined as a copy of the first map with every element
 270.501 - * removed that has no valid key in the second map.
 270.502 - *
 270.503 - * @param allocator the allocator that shall be used by the new map
 270.504 - * @param first the first source map
 270.505 - * @param second the second source map
 270.506 - * @param cpfnc a function to copy the elements
 270.507 - * @param cpdata additional data for the copy function
 270.508 - * @return a new map containing the intersection
 270.509 - */
 270.510 -UcxMap* ucx_map_intersection_a(UcxAllocator *allocator,
 270.511 -                               const UcxMap *first, const UcxMap *second,
 270.512 -                               copy_func cpfnc, void* cpdata);
 270.513 -
 270.514 -/**
 270.515 - * Returns the difference of two maps.
 270.516 - *
 270.517 - * The difference contains a copy of all elements of the first map
 270.518 - * for which the corresponding keys cannot be found in the second map.
 270.519 - *
 270.520 - * @param first the first source map
 270.521 - * @param second the second source map
 270.522 - * @param cpfnc a function to copy the elements
 270.523 - * @param cpdata additional data for the copy function
 270.524 - * @return a new list containing the difference
 270.525 - */
 270.526 -UcxMap* ucx_map_difference(const UcxMap *first, const UcxMap *second,
 270.527 -                           copy_func cpfnc, void* cpdata);
 270.528 -
 270.529 -/**
 270.530 - * Returns the difference of two maps.
 270.531 - *
 270.532 - * The difference contains a copy of all elements of the first map
 270.533 - * for which the corresponding keys cannot be found in the second map.
 270.534 - *
 270.535 - * @param allocator the allocator that shall be used by the new map
 270.536 - * @param first the first source map
 270.537 - * @param second the second source map
 270.538 - * @param cpfnc a function to copy the elements
 270.539 - * @param cpdata additional data for the copy function
 270.540 - * @return a new list containing the difference
 270.541 - */
 270.542 -UcxMap* ucx_map_difference_a(UcxAllocator *allocator,
 270.543 -                             const UcxMap *first, const UcxMap *second,
 270.544 -                             copy_func cpfnc, void* cpdata);
 270.545 -
 270.546 -
 270.547 -#ifdef	__cplusplus
 270.548 -}
 270.549 -#endif
 270.550 -
 270.551 -#endif	/* UCX_MAP_H */
 270.552 -
   271.1 --- a/src/ucx/mempool.h	Mon Dec 30 09:54:10 2019 +0100
   271.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   271.3 @@ -1,209 +0,0 @@
   271.4 -/*
   271.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   271.6 - *
   271.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   271.8 - *
   271.9 - * Redistribution and use in source and binary forms, with or without
  271.10 - * modification, are permitted provided that the following conditions are met:
  271.11 - *
  271.12 - *   1. Redistributions of source code must retain the above copyright
  271.13 - *      notice, this list of conditions and the following disclaimer.
  271.14 - *
  271.15 - *   2. Redistributions in binary form must reproduce the above copyright
  271.16 - *      notice, this list of conditions and the following disclaimer in the
  271.17 - *      documentation and/or other materials provided with the distribution.
  271.18 - *
  271.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  271.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  271.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  271.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  271.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  271.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  271.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  271.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  271.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  271.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  271.29 - * POSSIBILITY OF SUCH DAMAGE.
  271.30 - */
  271.31 -
  271.32 -/**
  271.33 - * @file mempool.h
  271.34 - * 
  271.35 - * Memory pool implementation.
  271.36 - * 
  271.37 - * @author Mike Becker
  271.38 - * @author Olaf Wintermann
  271.39 - */
  271.40 -
  271.41 -#ifndef UCX_MEMPOOL_H
  271.42 -#define	UCX_MEMPOOL_H
  271.43 -
  271.44 -#include "ucx.h"
  271.45 -#include "allocator.h"
  271.46 -#include <stddef.h>
  271.47 -
  271.48 -#ifdef	__cplusplus
  271.49 -extern "C" {
  271.50 -#endif
  271.51 -
  271.52 -/**
  271.53 - * UCX mempool structure.
  271.54 - */
  271.55 -typedef struct {
  271.56 -    /** UcxAllocator based on this pool */
  271.57 -    UcxAllocator *allocator;
  271.58 -    
  271.59 -    /** List of pointers to pooled memory. */
  271.60 -    void         **data;
  271.61 -    
  271.62 -    /** Count of pooled memory items. */
  271.63 -    size_t       ndata;
  271.64 -    
  271.65 -    /** Memory pool size. */
  271.66 -    size_t       size;
  271.67 -} UcxMempool;
  271.68 -
  271.69 -/** Shorthand for a new default memory pool with a capacity of 16 elements. */
  271.70 -#define ucx_mempool_new_default() ucx_mempool_new(16)
  271.71 -
  271.72 -
  271.73 -/**
  271.74 - * Creates a memory pool with the specified initial size.
  271.75 - * 
  271.76 - * As the created memory pool automatically grows in size by factor two when
  271.77 - * trying to allocate memory on a full pool, it is recommended that you use
  271.78 - * a power of two for the initial size.
  271.79 - * 
  271.80 - * @param n initial pool size (should be a power of two, e.g. 16)
  271.81 - * @return a pointer to the new memory pool
  271.82 - * @see ucx_mempool_new_default()
  271.83 - */
  271.84 -UcxMempool *ucx_mempool_new(size_t n);
  271.85 -
  271.86 -/**
  271.87 - * Resizes a memory pool.
  271.88 - * 
  271.89 - * This function will fail if the new capacity is not sufficient for the
  271.90 - * present data.
  271.91 - * 
  271.92 - * @param pool the pool to resize
  271.93 - * @param newcap the new capacity
  271.94 - * @return zero on success or non-zero on failure
  271.95 - */
  271.96 -int ucx_mempool_chcap(UcxMempool *pool, size_t newcap);
  271.97 -
  271.98 -/**
  271.99 - * Allocates pooled memory.
 271.100 - * 
 271.101 - * @param pool the memory pool
 271.102 - * @param n amount of memory to allocate
 271.103 - * @return a pointer to the allocated memory
 271.104 - * @see ucx_allocator_malloc()
 271.105 - */
 271.106 -void *ucx_mempool_malloc(UcxMempool *pool, size_t n);
 271.107 -/**
 271.108 - * Allocates a pooled memory array.
 271.109 - * 
 271.110 - * The content of the allocated memory is set to zero.
 271.111 - * 
 271.112 - * @param pool the memory pool
 271.113 - * @param nelem amount of elements to allocate
 271.114 - * @param elsize amount of memory per element
 271.115 - * @return a pointer to the allocated memory
 271.116 - * @see ucx_allocator_calloc()
 271.117 - */
 271.118 -void *ucx_mempool_calloc(UcxMempool *pool, size_t nelem, size_t elsize);
 271.119 -
 271.120 -/**
 271.121 - * Reallocates pooled memory.
 271.122 - * 
 271.123 - * If the memory to be reallocated is not contained by the specified pool, the
 271.124 - * behavior is undefined.
 271.125 - * 
 271.126 - * @param pool the memory pool
 271.127 - * @param ptr a pointer to the memory that shall be reallocated
 271.128 - * @param n the new size of the memory
 271.129 - * @return a pointer to the new location of the memory
 271.130 - * @see ucx_allocator_realloc()
 271.131 - */
 271.132 -void *ucx_mempool_realloc(UcxMempool *pool, void *ptr, size_t n);
 271.133 -
 271.134 -/**
 271.135 - * Frees pooled memory.
 271.136 - * 
 271.137 - * Before freeing the memory, the specified destructor function (if any)
 271.138 - * is called.
 271.139 - * 
 271.140 - * If you specify memory, that is not pooled by the specified memory pool, the
 271.141 - * program will terminate with a call to <code>abort()</code>.
 271.142 - * 
 271.143 - * @param pool the memory pool
 271.144 - * @param ptr a pointer to the memory that shall be freed
 271.145 - * @see ucx_mempool_set_destr()
 271.146 - */
 271.147 -void ucx_mempool_free(UcxMempool *pool, void *ptr);
 271.148 -
 271.149 -/**
 271.150 - * Destroys a memory pool.
 271.151 - * 
 271.152 - * For each element the destructor function (if any) is called and the element
 271.153 - * is freed.
 271.154 - * 
 271.155 - * Each of the registered destructor function that has no corresponding element
 271.156 - * within the pool (namely those registered by ucx_mempool_reg_destr) is
 271.157 - * called interleaving with the element destruction, but with guarantee to the
 271.158 - * order in which they were registered (FIFO order).
 271.159 - * 
 271.160 - * 
 271.161 - * @param pool the mempool to destroy
 271.162 - */
 271.163 -void ucx_mempool_destroy(UcxMempool *pool);
 271.164 -
 271.165 -/**
 271.166 - * Sets a destructor function for the specified memory.
 271.167 - * 
 271.168 - * The destructor is automatically called when the memory is freed or the
 271.169 - * pool is destroyed.
 271.170 - * A destructor for pooled memory <b>MUST NOT</b> free the memory itself,
 271.171 - * as this is done by the pool. Use a destructor to free any resources
 271.172 - * managed by the pooled object.
 271.173 - * 
 271.174 - * The only requirement for the specified memory is, that it <b>MUST</b> be
 271.175 - * pooled memory by a UcxMempool or an element-compatible mempool. The pointer
 271.176 - * to the destructor function is saved in a reserved area before the actual
 271.177 - * memory.
 271.178 - * 
 271.179 - * @param ptr pooled memory
 271.180 - * @param func a pointer to the destructor function
 271.181 - * @see ucx_mempool_free()
 271.182 - * @see ucx_mempool_destroy()
 271.183 - */
 271.184 -void ucx_mempool_set_destr(void *ptr, ucx_destructor func);
 271.185 -
 271.186 -/**
 271.187 - * Registers a destructor function for the specified (non-pooled) memory.
 271.188 - *
 271.189 - * This is useful, if you have memory that has not been allocated by a mempool,
 271.190 - * but shall be managed by a mempool.
 271.191 - * 
 271.192 - * This function creates an entry in the specified mempool and the memory will
 271.193 - * therefore (logically) convert to pooled memory.
 271.194 - * <b>However, this does not cause the memory to be freed automatically!</b>.
 271.195 - * If you want to use this function, make the memory pool free non-pooled
 271.196 - * memory, the specified destructor function must call <code>free()</code>
 271.197 - * by itself. But keep in mind, that you then MUST NOT use this destructor
 271.198 - * function with pooled memory (e.g. in ucx_mempool_set_destr()), as it
 271.199 - * would cause a double-free.
 271.200 - * 
 271.201 - * @param pool the memory pool
 271.202 - * @param ptr data the destructor is registered for
 271.203 - * @param destr a pointer to the destructor function
 271.204 - */
 271.205 -void ucx_mempool_reg_destr(UcxMempool *pool, void *ptr, ucx_destructor destr);
 271.206 -
 271.207 -#ifdef	__cplusplus
 271.208 -}
 271.209 -#endif
 271.210 -
 271.211 -#endif	/* UCX_MEMPOOL_H */
 271.212 -
   272.1 --- a/src/ucx/properties.h	Mon Dec 30 09:54:10 2019 +0100
   272.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   272.3 @@ -1,221 +0,0 @@
   272.4 -/*
   272.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   272.6 - *
   272.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   272.8 - *
   272.9 - * Redistribution and use in source and binary forms, with or without
  272.10 - * modification, are permitted provided that the following conditions are met:
  272.11 - *
  272.12 - *   1. Redistributions of source code must retain the above copyright
  272.13 - *      notice, this list of conditions and the following disclaimer.
  272.14 - *
  272.15 - *   2. Redistributions in binary form must reproduce the above copyright
  272.16 - *      notice, this list of conditions and the following disclaimer in the
  272.17 - *      documentation and/or other materials provided with the distribution.
  272.18 - *
  272.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  272.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  272.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  272.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  272.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  272.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  272.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  272.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  272.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  272.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  272.29 - * POSSIBILITY OF SUCH DAMAGE.
  272.30 - */
  272.31 -/**
  272.32 - * @file properties.h
  272.33 - * 
  272.34 - * Load / store utilities for properties files.
  272.35 - * 
  272.36 - * @author Mike Becker
  272.37 - * @author Olaf Wintermann
  272.38 - */
  272.39 -
  272.40 -#ifndef UCX_PROPERTIES_H
  272.41 -#define	UCX_PROPERTIES_H
  272.42 -
  272.43 -#include "ucx.h"
  272.44 -#include "map.h"
  272.45 -
  272.46 -#ifdef	__cplusplus
  272.47 -extern "C" {
  272.48 -#endif
  272.49 -
  272.50 -/**
  272.51 - * UcxProperties object for parsing properties data.
  272.52 - * Most of the fields are for internal use only. You may configure the
  272.53 - * properties parser, e.g. by changing the used delimiter or specifying 
  272.54 - * up to three different characters that shall introduce comments.
  272.55 - */
  272.56 -typedef struct {
  272.57 -    /**
  272.58 -     * Input buffer (don't set manually).
  272.59 -     * Automatically set by calls to ucx_properties_fill().
  272.60 -     */
  272.61 -    char   *buffer;
  272.62 -    
  272.63 -    /**
  272.64 -     * Length of the input buffer (don't set manually).
  272.65 -     * Automatically set by calls to ucx_properties_fill().
  272.66 -     */
  272.67 -    size_t buflen;
  272.68 -    
  272.69 -    /**
  272.70 -     * Current buffer position (don't set manually).
  272.71 -     * Used by ucx_properties_next().
  272.72 -     */
  272.73 -    size_t pos;
  272.74 -    
  272.75 -    /**
  272.76 -     * Internal temporary buffer (don't set manually).
  272.77 -     * Used by ucx_properties_next().
  272.78 -     */
  272.79 -    char   *tmp;
  272.80 -    
  272.81 -    /**
  272.82 -     * Internal temporary buffer length (don't set manually).
  272.83 -     * Used by ucx_properties_next().
  272.84 -     */
  272.85 -    size_t tmplen;
  272.86 -    
  272.87 -    /**
  272.88 -     * Internal temporary buffer capacity (don't set manually).
  272.89 -     * Used by ucx_properties_next().
  272.90 -     */
  272.91 -    size_t tmpcap;
  272.92 -    
  272.93 -    /**
  272.94 -     * Parser error code.
  272.95 -     * This is always 0 on success and a nonzero value on syntax errors.
  272.96 -     * The value is set by ucx_properties_next().
  272.97 -     */
  272.98 -    int    error;
  272.99 -    
 272.100 -    /**
 272.101 -     * The delimiter that shall be used.
 272.102 -     * This is '=' by default.
 272.103 -     */
 272.104 -    char   delimiter;
 272.105 -    
 272.106 -    /**
 272.107 -     * The first comment character.
 272.108 -     * This is '#' by default.
 272.109 -     */
 272.110 -    char   comment1;
 272.111 -    
 272.112 -    /**
 272.113 -     * The second comment character.
 272.114 -     * This is not set by default.
 272.115 -     */
 272.116 -    char   comment2;
 272.117 -    
 272.118 -    /**
 272.119 -     * The third comment character.
 272.120 -     * This is not set by default.
 272.121 -     */
 272.122 -    char   comment3;
 272.123 -} UcxProperties;
 272.124 -
 272.125 -
 272.126 -/**
 272.127 - * Constructs a new UcxProperties object.
 272.128 - * @return a pointer to the new UcxProperties object
 272.129 - */
 272.130 -UcxProperties *ucx_properties_new();
 272.131 -
 272.132 -/**
 272.133 - * Destroys a UcxProperties object.
 272.134 - * @param prop the UcxProperties object to destroy
 272.135 - */
 272.136 -void ucx_properties_free(UcxProperties *prop);
 272.137 -
 272.138 -/**
 272.139 - * Sets the input buffer for the properties parser.
 272.140 - * 
 272.141 - * After calling this function, you may parse the data by calling
 272.142 - * ucx_properties_next() until it returns 0. The function ucx_properties2map()
 272.143 - * is a convenience function that reads as much data as possible by using this
 272.144 - * function.
 272.145 - * 
 272.146 - * 
 272.147 - * @param prop the UcxProperties object
 272.148 - * @param buf a pointer to the new buffer
 272.149 - * @param len the payload length of the buffer
 272.150 - * @see ucx_properties_next()
 272.151 - * @see ucx_properties2map()
 272.152 - */
 272.153 -void ucx_properties_fill(UcxProperties *prop, char *buf, size_t len);
 272.154 -
 272.155 -/**
 272.156 - * Retrieves the next key/value-pair.
 272.157 - * 
 272.158 - * This function returns a nonzero value as long as there are key/value-pairs
 272.159 - * found. If no more key/value-pairs are found, you may refill the input buffer
 272.160 - * with ucx_properties_fill().
 272.161 - * 
 272.162 - * <b>Attention:</b> the sstr_t.ptr pointers of the output parameters point to
 272.163 - * memory within the input buffer of the parser and will get invalid some time.
 272.164 - * If you want long term copies of the key/value-pairs, use sstrdup() after
 272.165 - * calling this function.
 272.166 - * 
 272.167 - * @param prop the UcxProperties object
 272.168 - * @param name a pointer to the sstr_t that shall contain the property name
 272.169 - * @param value a pointer to the sstr_t that shall contain the property value
 272.170 - * @return Nonzero, if a key/value-pair was successfully retrieved
 272.171 - * @see ucx_properties_fill()
 272.172 - */
 272.173 -int ucx_properties_next(UcxProperties *prop, sstr_t *name, sstr_t *value);
 272.174 -
 272.175 -/**
 272.176 - * Retrieves all available key/value-pairs and puts them into a UcxMap.
 272.177 - * 
 272.178 - * This is done by successive calls to ucx_properties_next() until no more
 272.179 - * key/value-pairs can be retrieved.
 272.180 - * 
 272.181 - * The memory for the map values is allocated by the map's own allocator.
 272.182 - * 
 272.183 - * @param prop the UcxProperties object
 272.184 - * @param map the target map
 272.185 - * @return The UcxProperties.error code (i.e. 0 on success).
 272.186 - * @see ucx_properties_fill()
 272.187 - * @see UcxMap.allocator
 272.188 - */
 272.189 -int ucx_properties2map(UcxProperties *prop, UcxMap *map);
 272.190 -
 272.191 -/**
 272.192 - * Loads a properties file to a UcxMap.
 272.193 - * 
 272.194 - * This is a convenience function that reads data from an input
 272.195 - * stream until the end of the stream is reached.
 272.196 - * 
 272.197 - * @param map the map object to write the key/value-pairs to
 272.198 - * @param file the <code>FILE*</code> stream to read from
 272.199 - * @return 0 on success, or a non-zero value on error
 272.200 - * 
 272.201 - * @see ucx_properties_fill()
 272.202 - * @see ucx_properties2map()
 272.203 - */
 272.204 -int ucx_properties_load(UcxMap *map, FILE *file);
 272.205 -
 272.206 -/**
 272.207 - * Stores a UcxMap to a file.
 272.208 - * 
 272.209 - * The key/value-pairs are written by using the following format:
 272.210 - * 
 272.211 - * <code>[key] = [value]\\n</code>
 272.212 - * 
 272.213 - * @param map the map to store
 272.214 - * @param file the <code>FILE*</code> stream to write to
 272.215 - * @return 0 on success, or a non-zero value on error
 272.216 - */
 272.217 -int ucx_properties_store(UcxMap *map, FILE *file);
 272.218 -
 272.219 -#ifdef	__cplusplus
 272.220 -}
 272.221 -#endif
 272.222 -
 272.223 -#endif	/* UCX_PROPERTIES_H */
 272.224 -
   273.1 --- a/src/ucx/stack.h	Mon Dec 30 09:54:10 2019 +0100
   273.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   273.3 @@ -1,240 +0,0 @@
   273.4 -/*
   273.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   273.6 - *
   273.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   273.8 - *
   273.9 - * Redistribution and use in source and binary forms, with or without
  273.10 - * modification, are permitted provided that the following conditions are met:
  273.11 - *
  273.12 - *   1. Redistributions of source code must retain the above copyright
  273.13 - *      notice, this list of conditions and the following disclaimer.
  273.14 - *
  273.15 - *   2. Redistributions in binary form must reproduce the above copyright
  273.16 - *      notice, this list of conditions and the following disclaimer in the
  273.17 - *      documentation and/or other materials provided with the distribution.
  273.18 - *
  273.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  273.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  273.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  273.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  273.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  273.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  273.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  273.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  273.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  273.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  273.29 - * POSSIBILITY OF SUCH DAMAGE.
  273.30 - */
  273.31 -
  273.32 -/**
  273.33 - * @file stack.h
  273.34 - * 
  273.35 - * Default stack memory allocation implementation.
  273.36 - * 
  273.37 - * @author Mike Becker
  273.38 - * @author Olaf Wintermann
  273.39 - */
  273.40 -
  273.41 -#ifndef UCX_STACK_H
  273.42 -#define	UCX_STACK_H
  273.43 -
  273.44 -#include "ucx.h"
  273.45 -#include "allocator.h"
  273.46 -
  273.47 -#ifdef	__cplusplus
  273.48 -extern "C" {
  273.49 -#endif
  273.50 -
  273.51 -
  273.52 -/**
  273.53 - * UCX stack structure.
  273.54 - */
  273.55 -typedef struct {
  273.56 -    /** UcxAllocator based on this stack */
  273.57 -    UcxAllocator allocator;
  273.58 -    
  273.59 -    /** Stack size. */
  273.60 -    size_t size;
  273.61 -    
  273.62 -    /** Pointer to the bottom of the stack */
  273.63 -    char *space;
  273.64 -    
  273.65 -    /** Pointer to the top of the stack */
  273.66 -    char *top;
  273.67 -} UcxStack;
  273.68 -
  273.69 -/**
  273.70 - * Metadata for each UCX stack element.
  273.71 - */
  273.72 -struct ucx_stack_metadata {
  273.73 -    /**
  273.74 -     * Location of the previous element (<code>NULL</code> if this is the first)
  273.75 -     */
  273.76 -    char *prev;
  273.77 -    
  273.78 -    /** Size of this element */
  273.79 -    size_t size;
  273.80 -};
  273.81 -
  273.82 -/**
  273.83 - * Initializes UcxStack structure with memory.
  273.84 - * 
  273.85 - * @param stack a pointer to an uninitialized stack structure
  273.86 - * @param space the memory area that shall be managed
  273.87 - * @param size size of the memory area
  273.88 - * @return a new UcxStack structure
  273.89 - */
  273.90 -void ucx_stack_init(UcxStack *stack, char* space, size_t size);
  273.91 -
  273.92 -/**
  273.93 - * Allocates stack memory.
  273.94 - * 
  273.95 - * @param stack a pointer to the stack
  273.96 - * @param n amount of memory to allocate
  273.97 - * @return a pointer to the allocated memory or <code>NULL</code> on stack
  273.98 - * overflow
  273.99 - * @see ucx_allocator_malloc()
 273.100 - */
 273.101 -void *ucx_stack_malloc(UcxStack *stack, size_t n);
 273.102 -
 273.103 -/**
 273.104 - * Allocates memory with #ucx_stack_malloc() and copies the specified data if
 273.105 - * the allocation was successful.
 273.106 - * 
 273.107 - * @param stack a pointer to the stack
 273.108 - * @param n amount of memory to allocate
 273.109 - * @param data a pointer to the data to copy
 273.110 - * @return a pointer to the allocated memory
 273.111 - * @see ucx_stack_malloc
 273.112 - */
 273.113 -void *ucx_stack_push(UcxStack *stack, size_t n, const void *data);
 273.114 -
 273.115 -/**
 273.116 - * Allocates an array of stack memory
 273.117 - * 
 273.118 - * The content of the allocated memory is set to zero.
 273.119 - * 
 273.120 - * @param stack a pointer to the stack
 273.121 - * @param nelem amount of elements to allocate
 273.122 - * @param elsize amount of memory per element
 273.123 - * @return a pointer to the allocated memory
 273.124 - * @see ucx_allocator_calloc()
 273.125 - */
 273.126 -void *ucx_stack_calloc(UcxStack *stack, size_t nelem, size_t elsize);
 273.127 -
 273.128 -/**
 273.129 - * Allocates memory with #ucx_stack_calloc() and copies the specified data if
 273.130 - * the allocation was successful.
 273.131 - * 
 273.132 - * @param stack a pointer to the stack
 273.133 - * @param nelem amount of elements to allocate
 273.134 - * @param elsize amount of memory per element
 273.135 - * @param data a pointer to the data
 273.136 - * @return a pointer to the allocated memory
 273.137 - * @see ucx_stack_calloc
 273.138 - */
 273.139 -void *ucx_stack_pusharr(UcxStack *stack,
 273.140 -        size_t nelem, size_t elsize, const void *data);
 273.141 -
 273.142 -/**
 273.143 - * Reallocates memory on the stack.
 273.144 - * 
 273.145 - * Shrinking memory is always safe. Extending memory can be very expensive. 
 273.146 - * 
 273.147 - * @param stack the stack
 273.148 - * @param ptr a pointer to the memory that shall be reallocated
 273.149 - * @param n the new size of the memory
 273.150 - * @return a pointer to the new location of the memory
 273.151 - * @see ucx_allocator_realloc()
 273.152 - */
 273.153 -void *ucx_stack_realloc(UcxStack *stack, void *ptr, size_t n);
 273.154 -
 273.155 -/**
 273.156 - * Frees memory on the stack.
 273.157 - * 
 273.158 - * Freeing stack memory behaves in a special way.
 273.159 - * 
 273.160 - * If the element, that should be freed, is the top most element of the stack,
 273.161 - * it is removed from the stack. Otherwise it is marked as freed. Marked
 273.162 - * elements are removed, when they become the top most elements of the stack.
 273.163 - * 
 273.164 - * @param stack a pointer to the stack
 273.165 - * @param ptr a pointer to the memory that shall be freed
 273.166 - */
 273.167 -void ucx_stack_free(UcxStack *stack, void *ptr);
 273.168 -
 273.169 -
 273.170 -/**
 273.171 - * Returns the size of the top most element.
 273.172 - * @param stack a pointer to the stack
 273.173 - * @return the size of the top most element
 273.174 - */
 273.175 -#define ucx_stack_topsize(stack) ((stack)->top ? ((struct ucx_stack_metadata*)\
 273.176 -                                  (stack)->top - 1)->size : 0)
 273.177 -
 273.178 -/**
 273.179 - * Removes the top most element from the stack and copies the content to <code>
 273.180 - * dest</code>, if specified.
 273.181 - * 
 273.182 - * Use #ucx_stack_topsize()# to get the amount of memory that must be available
 273.183 - * at the location of <code>dest</code>.
 273.184 - * 
 273.185 - * @param stack a pointer to the stack
 273.186 - * @param dest the location where the contents shall be written to, or <code>
 273.187 - * NULL</code>, if the element shall only be removed.
 273.188 - * @see ucx_stack_free
 273.189 - * @see ucx_stack_popn
 273.190 - */
 273.191 -#define ucx_stack_pop(stack, dest) ucx_stack_popn(stack, dest, (size_t)-1)
 273.192 -
 273.193 -/**
 273.194 - * Removes the top most element from the stack and copies the content to <code>
 273.195 - * dest</code>.
 273.196 - * 
 273.197 - * This function copies at most <code>n</code> bytes to the destination, but
 273.198 - * the element is always freed as a whole.
 273.199 - * If the element was larger than <code>n</code>, the remaining data is lost.
 273.200 - * 
 273.201 - * @param stack a pointer to the stack
 273.202 - * @param dest the location where the contents shall be written to
 273.203 - * @param n copies at most n bytes to <code>dest</code>
 273.204 - * @see ucx_stack_pop
 273.205 - */
 273.206 -void ucx_stack_popn(UcxStack *stack, void *dest, size_t n);
 273.207 -
 273.208 -/**
 273.209 - * Returns the remaining available memory on the specified stack.
 273.210 - * 
 273.211 - * @param stack a pointer to the stack
 273.212 - * @return the remaining available memory
 273.213 - */
 273.214 -size_t ucx_stack_avail(UcxStack *stack);
 273.215 -
 273.216 -/**
 273.217 - * Checks, if the stack is empty.
 273.218 - * 
 273.219 - * @param stack a pointer to the stack
 273.220 - * @return nonzero, if the stack is empty, zero otherwise
 273.221 - */
 273.222 -#define ucx_stack_empty(stack) (!(stack)->top)
 273.223 -
 273.224 -/**
 273.225 - * Computes a recommended size for the stack memory area. Note, that
 273.226 - * reallocations have not been taken into account, so you might need to reserve
 273.227 - * twice as much memory to allow many reallocations.
 273.228 - * 
 273.229 - * @param size the approximate payload
 273.230 - * @param elems the approximate count of element allocations
 273.231 - * @return a recommended size for the stack space based on the information
 273.232 - * provided
 273.233 - */
 273.234 -#define ucx_stack_dim(size, elems) (size+sizeof(struct ucx_stack_metadata) * \
 273.235 -                                    (elems + 1))
 273.236 -
 273.237 -
 273.238 -#ifdef	__cplusplus
 273.239 -}
 273.240 -#endif
 273.241 -
 273.242 -#endif	/* UCX_STACK_H */
 273.243 -
   274.1 --- a/src/ucx/string.h	Mon Dec 30 09:54:10 2019 +0100
   274.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   274.3 @@ -1,1201 +0,0 @@
   274.4 -/*
   274.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   274.6 - *
   274.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   274.8 - *
   274.9 - * Redistribution and use in source and binary forms, with or without
  274.10 - * modification, are permitted provided that the following conditions are met:
  274.11 - *
  274.12 - *   1. Redistributions of source code must retain the above copyright
  274.13 - *      notice, this list of conditions and the following disclaimer.
  274.14 - *
  274.15 - *   2. Redistributions in binary form must reproduce the above copyright
  274.16 - *      notice, this list of conditions and the following disclaimer in the
  274.17 - *      documentation and/or other materials provided with the distribution.
  274.18 - *
  274.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  274.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  274.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  274.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  274.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  274.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  274.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  274.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  274.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  274.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  274.29 - * POSSIBILITY OF SUCH DAMAGE.
  274.30 - */
  274.31 -/**
  274.32 - * Bounded string implementation.
  274.33 - * 
  274.34 - * The UCX strings (<code>sstr_t</code>) provide an alternative to C strings.
  274.35 - * The main difference to C strings is, that <code>sstr_t</code> does <b>not
  274.36 - * need to be <code>NULL</code>-terminated</b>. Instead the length is stored
  274.37 - * within the structure.
  274.38 - * 
  274.39 - * When using <code>sstr_t</code>, developers must be full aware of what type
  274.40 - * of string (<code>NULL</code>-terminated) or not) they are using, when 
  274.41 - * accessing the <code>char* ptr</code> directly.
  274.42 - * 
  274.43 - * The UCX string module provides some common string functions, known from
  274.44 - * standard libc, working with <code>sstr_t</code>.
  274.45 - * 
  274.46 - * @file   string.h
  274.47 - * @author Mike Becker
  274.48 - * @author Olaf Wintermann
  274.49 - */
  274.50 -
  274.51 -#ifndef UCX_STRING_H
  274.52 -#define	UCX_STRING_H
  274.53 -
  274.54 -#include "ucx.h"
  274.55 -#include "allocator.h"
  274.56 -#include <stddef.h>
  274.57 -
  274.58 -/*
  274.59 - * Use this macro to disable the shortcuts if you experience macro collision.
  274.60 - */
  274.61 -#ifndef UCX_NO_SSTR_SHORTCUTS
  274.62 -/**
  274.63 - * Shortcut for a <code>sstr_t struct</code>
  274.64 - * or <code>scstr_t struct</code> literal.
  274.65 - */
  274.66 -#define ST(s) { s, sizeof(s)-1 }
  274.67 -
  274.68 -/** Shortcut for the conversion of a C string to a <code>sstr_t</code>. */
  274.69 -#define S(s) sstrn(s, sizeof(s)-1)
  274.70 -
  274.71 -/** Shortcut for the conversion of a C string to a <code>scstr_t</code>. */
  274.72 -#define SC(s) scstrn(s, sizeof(s)-1)
  274.73 -#endif /* UCX_NO_SSTR_SHORTCUTS */
  274.74 -
  274.75 -/*
  274.76 - * Use this macro to disable the format macros.
  274.77 - */
  274.78 -#ifndef UCX_NO_SSTR_FORMAT_MACROS
  274.79 -/** Expands a sstr_t or scstr_t to printf arguments. */
  274.80 -#define SFMT(s) (int) (s).length, (s).ptr
  274.81 -
  274.82 -/** Format specifier for a sstr_t or scstr_t. */
  274.83 -#define PRIsstr ".*s"
  274.84 -#endif /* UCX_NO_SSTR_FORMAT_MACROS */
  274.85 -
  274.86 -#ifdef	__cplusplus
  274.87 -extern "C" {
  274.88 -#endif
  274.89 -  
  274.90 -/**
  274.91 - * The UCX string structure.
  274.92 - */
  274.93 -typedef struct {
  274.94 -   /** A pointer to the string
  274.95 -    * (<b>not necessarily <code>NULL</code>-terminated</b>) */
  274.96 -    char *ptr;
  274.97 -    /** The length of the string */
  274.98 -    size_t length;
  274.99 -} sstr_t;
 274.100 -
 274.101 -/**
 274.102 - * The UCX string structure for immutable (constant) strings.
 274.103 - */
 274.104 -typedef struct {
 274.105 -    /** A constant pointer to the immutable string
 274.106 -     * (<b>not necessarily <code>NULL</code>-terminated</b>) */
 274.107 -    const char *ptr;
 274.108 -    /** The length of the string */
 274.109 -    size_t length;
 274.110 -} scstr_t;
 274.111 -
 274.112 -#ifdef	__cplusplus
 274.113 -}
 274.114 -#endif
 274.115 -
 274.116 -
 274.117 -#ifdef __cplusplus
 274.118 -/**
 274.119 - * One of two type adjustment functions that return an scstr_t.
 274.120 - * 
 274.121 - * Used <b>internally</b> to convert a UCX string to an immutable UCX string.
 274.122 - * 
 274.123 - * <b>Do not use this function manually.</b>
 274.124 - * 
 274.125 - * @param str some sstr_t
 274.126 - * @return an immutable (scstr_t) version of the provided string.
 274.127 - */
 274.128 -inline scstr_t s2scstr(sstr_t s) {
 274.129 -    scstr_t c;
 274.130 -    c.ptr = s.ptr;
 274.131 -    c.length = s.length;
 274.132 -    return c;
 274.133 -}
 274.134 -
 274.135 -/**
 274.136 - * One of two type adjustment functions that return an scstr_t.
 274.137 - * 
 274.138 - * Used <b>internally</b> to convert a UCX string to an immutable UCX string.
 274.139 - * This variant is used, when the string is already immutable and no operation
 274.140 - * needs to be performed.
 274.141 - * 
 274.142 - * <b>Do not use this function manually.</b>
 274.143 - * 
 274.144 - * @param str some scstr_t
 274.145 - * @return the argument itself
 274.146 - */
 274.147 -inline scstr_t s2scstr(scstr_t str) {
 274.148 -    return str;
 274.149 -}
 274.150 -
 274.151 -/**
 274.152 - * Converts a UCX string to an immutable UCX string (scstr_t).
 274.153 - * @param str some UCX string
 274.154 - * @return an immutable version of the provided string
 274.155 - */
 274.156 -#define SCSTR(s) s2scstr(s)
 274.157 -#else
 274.158 -
 274.159 -/**
 274.160 - * One of two type adjustment functions that return an scstr_t.
 274.161 - * 
 274.162 - * Used <b>internally</b> to convert a UCX string to an immutable UCX string.
 274.163 - * This variant is used, when the string is already immutable and no operation
 274.164 - * needs to be performed.
 274.165 - * 
 274.166 - * <b>Do not use this function manually.</b>
 274.167 - * 
 274.168 - * @param str some scstr_t
 274.169 - * @return the argument itself
 274.170 - */
 274.171 -scstr_t ucx_sc2sc(scstr_t str);
 274.172 -
 274.173 -/**
 274.174 - * One of two type adjustment functions that return an scstr_t.
 274.175 - * 
 274.176 - * Used <b>internally</b> to convert a UCX string to an immutable UCX string.
 274.177 - * 
 274.178 - * <b>Do not use this function manually.</b>
 274.179 - * 
 274.180 - * @param str some sstr_t
 274.181 - * @return an immutable (scstr_t) version of the provided string.
 274.182 - */
 274.183 -scstr_t ucx_ss2sc(sstr_t str);
 274.184 -
 274.185 -#if __STDC_VERSION__ >= 201112L
 274.186 -/**
 274.187 - * Converts a UCX string to an immutable UCX string (scstr_t).
 274.188 - * @param str some UCX string
 274.189 - * @return an immutable version of the provided string
 274.190 - */
 274.191 -#define SCSTR(str) _Generic(str, sstr_t: ucx_ss2sc, scstr_t: ucx_sc2sc)(str)
 274.192 -
 274.193 -#elif defined(__GNUC__) || defined(__clang__)
 274.194 -
 274.195 -/**
 274.196 - * Converts a UCX string to an immutable UCX string (scstr_t).
 274.197 - * @param str some UCX string
 274.198 - * @return an immutable version of the provided string
 274.199 - */
 274.200 -#define SCSTR(str) __builtin_choose_expr( \
 274.201 -        __builtin_types_compatible_p(typeof(str), sstr_t), \
 274.202 -        ucx_ss2sc, \
 274.203 -        ucx_sc2sc)(str)
 274.204 -
 274.205 -#elif defined(__sun)
 274.206 -
 274.207 -/**
 274.208 - * Converts a UCX string to an immutable UCX string (scstr_t).
 274.209 - * @param str some UCX string
 274.210 - * @return the an immutable version of the provided string
 274.211 - */
 274.212 -#define SCSTR(str) ({typeof(str) ucx_tmp_var_str = str; \
 274.213 -	scstr_t ucx_tmp_var_c; \
 274.214 -	ucx_tmp_var_c.ptr = ucx_tmp_var_str.ptr;\
 274.215 -	ucx_tmp_var_c.length = ucx_tmp_var_str.length;\
 274.216 -	ucx_tmp_var_c; })
 274.217 -#else /* no generics and no builtins */
 274.218 -
 274.219 -/**
 274.220 - * Converts a UCX string to an immutable UCX string (scstr_t).
 274.221 - * 
 274.222 - * This <b>internal</b> function (ab)uses the C standard an expects one single
 274.223 - * argument which is then implicitly converted to scstr_t without a warning.
 274.224 - * 
 274.225 - * <b>Do not use this function manually.</b>
 274.226 - * 
 274.227 - * @return the an immutable version of the provided string
 274.228 - */
 274.229 -scstr_t ucx_ss2c_s();
 274.230 -
 274.231 -/**
 274.232 - * Converts a UCX string to an immutable UCX string (scstr_t).
 274.233 - * @param str some UCX string
 274.234 - * @return the an immutable version of the provided string
 274.235 - */
 274.236 -#define SCSTR(str) ucx_ss2c_s(str)
 274.237 -#endif /* C11 feature test */
 274.238 -
 274.239 -#endif /* C++ */
 274.240 -
 274.241 -#ifdef	__cplusplus
 274.242 -extern "C" {
 274.243 -#endif
 274.244 -
 274.245 -
 274.246 -/**
 274.247 - * Creates a new sstr_t based on a C string.
 274.248 - * 
 274.249 - * The length is implicitly inferred by using a call to <code>strlen()</code>.
 274.250 - *
 274.251 - * <b>Note:</b> the sstr_t will share the specified pointer to the C string.
 274.252 - * If you do want a copy, use sstrdup() on the return value of this function.
 274.253 - * 
 274.254 - * If you need to wrap a constant string, use scstr().
 274.255 - * 
 274.256 - * @param cstring the C string to wrap
 274.257 - * @return a new sstr_t containing the C string
 274.258 - * 
 274.259 - * @see sstrn()
 274.260 - */
 274.261 -sstr_t sstr(char *cstring);
 274.262 -
 274.263 -/**
 274.264 - * Creates a new sstr_t of the specified length based on a C string.
 274.265 - *
 274.266 - * <b>Note:</b> the sstr_t will share the specified pointer to the C string.
 274.267 - * If you do want a copy, use sstrdup() on the return value of this function.
 274.268 - * 
 274.269 - * If you need to wrap a constant string, use scstrn().
 274.270 - * 
 274.271 - * @param cstring  the C string to wrap
 274.272 - * @param length   the length of the string
 274.273 - * @return a new sstr_t containing the C string
 274.274 - * 
 274.275 - * @see sstr()
 274.276 - * @see S()
 274.277 - */
 274.278 -sstr_t sstrn(char *cstring, size_t length);
 274.279 -
 274.280 -/**
 274.281 - * Creates a new scstr_t based on a constant C string.
 274.282 - * 
 274.283 - * The length is implicitly inferred by using a call to <code>strlen()</code>.
 274.284 - *
 274.285 - * <b>Note:</b> the scstr_t will share the specified pointer to the C string.
 274.286 - * If you do want a copy, use scstrdup() on the return value of this function.
 274.287 - * 
 274.288 - * @param cstring the C string to wrap
 274.289 - * @return a new scstr_t containing the C string
 274.290 - * 
 274.291 - * @see scstrn()
 274.292 - */
 274.293 -scstr_t scstr(const char *cstring);
 274.294 -
 274.295 -
 274.296 -/**
 274.297 - * Creates a new scstr_t of the specified length based on a constant C string.
 274.298 - *
 274.299 - * <b>Note:</b> the scstr_t will share the specified pointer to the C string.
 274.300 - * If you do want a copy, use scstrdup() on the return value of this function. * 
 274.301 - * 
 274.302 - * @param cstring  the C string to wrap
 274.303 - * @param length   the length of the string
 274.304 - * @return a new scstr_t containing the C string
 274.305 - * 
 274.306 - * @see scstr()
 274.307 - */
 274.308 -scstr_t scstrn(const char *cstring, size_t length);
 274.309 -
 274.310 -/**
 274.311 - * Returns the accumulated length of all specified strings.
 274.312 - * 
 274.313 - * <b>Attention:</b> if the count argument is larger than the count of the
 274.314 - * specified strings, the behavior is undefined.
 274.315 - *
 274.316 - * @param count    the total number of specified strings
 274.317 - * @param ...      all strings
 274.318 - * @return the accumulated length of all strings
 274.319 - */
 274.320 -size_t scstrnlen(size_t count, ...);
 274.321 -
 274.322 -/**
 274.323 - * Returns the accumulated length of all specified strings.
 274.324 - * 
 274.325 - * <b>Attention:</b> if the count argument is larger than the count of the
 274.326 - * specified strings, the behavior is undefined.
 274.327 - * 
 274.328 - * @param count    the total number of specified strings
 274.329 - * @param ...      all strings
 274.330 - * @return the cumulated length of all strings
 274.331 - */
 274.332 -#define sstrnlen(count, ...) scstrnlen(count, __VA_ARGS__)
 274.333 -
 274.334 -/**
 274.335 - * Concatenates two or more strings.
 274.336 - * 
 274.337 - * The resulting string will be allocated by standard <code>malloc()</code>. 
 274.338 - * So developers <b>MUST</b> pass the sstr_t.ptr to <code>free()</code>.
 274.339 - * 
 274.340 - * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>-
 274.341 - * terminated.
 274.342 - *
 274.343 - * @param count   the total number of strings to concatenate
 274.344 - * @param s1      first string
 274.345 - * @param ...     all remaining strings
 274.346 - * @return the concatenated string
 274.347 - */
 274.348 -sstr_t scstrcat(size_t count, scstr_t s1, ...);
 274.349 -
 274.350 -/**
 274.351 - * Concatenates two or more strings.
 274.352 - * 
 274.353 - * The resulting string will be allocated by standard <code>malloc()</code>. 
 274.354 - * So developers <b>MUST</b> pass the sstr_t.ptr to <code>free()</code>.
 274.355 - * 
 274.356 - * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>-
 274.357 - * terminated.
 274.358 - * 
 274.359 - * @param count   the total number of strings to concatenate
 274.360 - * @param s1      first string
 274.361 - * @param ...     all remaining strings
 274.362 - * @return the concatenated string
 274.363 - */
 274.364 -#define sstrcat(count, s1, ...) scstrcat(count, SCSTR(s1), __VA_ARGS__)
 274.365 -
 274.366 -/**
 274.367 - * Concatenates two or more strings using a UcxAllocator.
 274.368 - * 
 274.369 - * The resulting string must be freed by the allocators <code>free()</code>
 274.370 - * implementation.
 274.371 - * 
 274.372 - * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>-
 274.373 - * terminated.
 274.374 - *
 274.375 - * @param alloc   the allocator to use
 274.376 - * @param count   the total number of strings to concatenate
 274.377 - * @param s1      first string
 274.378 - * @param ...     all remaining strings
 274.379 - * @return the concatenated string
 274.380 - * 
 274.381 - * @see scstrcat()
 274.382 - */
 274.383 -sstr_t scstrcat_a(UcxAllocator *alloc, size_t count, scstr_t s1, ...);
 274.384 -
 274.385 -/**
 274.386 - * Concatenates two or more strings using a UcxAllocator.
 274.387 - * 
 274.388 - * The resulting string must be freed by the allocators <code>free()</code>
 274.389 - * implementation.
 274.390 - * 
 274.391 - * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>-
 274.392 - * terminated.
 274.393 - *
 274.394 - * @param alloc   the allocator to use
 274.395 - * @param count   the total number of strings to concatenate
 274.396 - * @param s1      first string
 274.397 - * @param ...     all remaining strings
 274.398 - * @return the concatenated string
 274.399 - * 
 274.400 - * @see sstrcat()
 274.401 - */
 274.402 -#define sstrcat_a(alloc, count, s1, ...) \
 274.403 -    scstrcat_a(alloc, count, SCSTR(s1), __VA_ARGS__)
 274.404 -
 274.405 -/**
 274.406 - * Returns a substring starting at the specified location.
 274.407 - * 
 274.408 - * <b>Attention:</b> the new string references the same memory area as the
 274.409 - * input string and is <b>NOT</b> required to be <code>NULL</code>-terminated.
 274.410 - * Use sstrdup() to get a copy.
 274.411 - * 
 274.412 - * @param string input string
 274.413 - * @param start  start location of the substring
 274.414 - * @return a substring of <code>string</code> starting at <code>start</code>
 274.415 - * 
 274.416 - * @see sstrsubsl()
 274.417 - * @see sstrchr()
 274.418 - */
 274.419 -sstr_t sstrsubs(sstr_t string, size_t start);
 274.420 -
 274.421 -/**
 274.422 - * Returns a substring with the given length starting at the specified location.
 274.423 - * 
 274.424 - * <b>Attention:</b> the new string references the same memory area as the
 274.425 - * input string and is <b>NOT</b> required to be <code>NULL</code>-terminated.
 274.426 - * Use sstrdup() to get a copy.
 274.427 - * 
 274.428 - * @param string input string
 274.429 - * @param start  start location of the substring
 274.430 - * @param length the maximum length of the substring
 274.431 - * @return a substring of <code>string</code> starting at <code>start</code>
 274.432 - * with a maximum length of <code>length</code>
 274.433 - * 
 274.434 - * @see sstrsubs()
 274.435 - * @see sstrchr()
 274.436 - */
 274.437 -sstr_t sstrsubsl(sstr_t string, size_t start, size_t length);
 274.438 -
 274.439 -/**
 274.440 - * Returns a substring of an immutable string starting at the specified
 274.441 - * location.
 274.442 - * 
 274.443 - * <b>Attention:</b> the new string references the same memory area as the
 274.444 -* input string and is <b>NOT</b> required to be <code>NULL</code>-terminated.
 274.445 - * Use scstrdup() to get a copy.
 274.446 - * 
 274.447 - * @param string input string
 274.448 - * @param start  start location of the substring
 274.449 - * @return a substring of <code>string</code> starting at <code>start</code>
 274.450 - * 
 274.451 - * @see scstrsubsl()
 274.452 - * @see scstrchr()
 274.453 - */
 274.454 -scstr_t scstrsubs(scstr_t string, size_t start);
 274.455 -
 274.456 -/**
 274.457 - * Returns a substring of an immutable string with a maximum length starting
 274.458 - * at the specified location.
 274.459 - * 
 274.460 - * <b>Attention:</b> the new string references the same memory area as the
 274.461 - * input string and is <b>NOT</b> required to be <code>NULL</code>-terminated.
 274.462 - * Use scstrdup() to get a copy.
 274.463 - * 
 274.464 - * @param string input string
 274.465 - * @param start  start location of the substring
 274.466 - * @param length the maximum length of the substring
 274.467 - * @return a substring of <code>string</code> starting at <code>start</code>
 274.468 - * with a maximum length of <code>length</code>
 274.469 - * 
 274.470 - * @see scstrsubs()
 274.471 - * @see scstrchr()
 274.472 - */
 274.473 -scstr_t scstrsubsl(scstr_t string, size_t start, size_t length);
 274.474 -
 274.475 -/**
 274.476 - * Returns a substring starting at the location of the first occurrence of the
 274.477 - * specified character.
 274.478 - * 
 274.479 - * If the string does not contain the character, an empty string is returned.
 274.480 - * 
 274.481 - * @param string the string where to locate the character
 274.482 - * @param chr    the character to locate
 274.483 - * @return       a substring starting at the first location of <code>chr</code>
 274.484 - * 
 274.485 - * @see sstrsubs()
 274.486 - */
 274.487 -sstr_t sstrchr(sstr_t string, int chr);
 274.488 -
 274.489 -/**
 274.490 - * Returns a substring starting at the location of the last occurrence of the
 274.491 - * specified character.
 274.492 - * 
 274.493 - * If the string does not contain the character, an empty string is returned.
 274.494 - * 
 274.495 - * @param string the string where to locate the character
 274.496 - * @param chr    the character to locate
 274.497 - * @return       a substring starting at the last location of <code>chr</code>
 274.498 - * 
 274.499 - * @see sstrsubs()
 274.500 - */
 274.501 -sstr_t sstrrchr(sstr_t string, int chr);
 274.502 -
 274.503 -/**
 274.504 - * Returns an immutable substring starting at the location of the first
 274.505 - * occurrence of the specified character.
 274.506 - * 
 274.507 - * If the string does not contain the character, an empty string is returned.
 274.508 - * 
 274.509 - * @param string the string where to locate the character
 274.510 - * @param chr    the character to locate
 274.511 - * @return       a substring starting at the first location of <code>chr</code>
 274.512 - * 
 274.513 - * @see scstrsubs()
 274.514 - */
 274.515 -scstr_t scstrchr(scstr_t string, int chr);
 274.516 -
 274.517 -/**
 274.518 - * Returns an immutable substring starting at the location of the last
 274.519 - * occurrence of the specified character.
 274.520 - * 
 274.521 - * If the string does not contain the character, an empty string is returned.
 274.522 - * 
 274.523 - * @param string the string where to locate the character
 274.524 - * @param chr    the character to locate
 274.525 - * @return       a substring starting at the last location of <code>chr</code>
 274.526 - * 
 274.527 - * @see scstrsubs()
 274.528 - */
 274.529 -scstr_t scstrrchr(scstr_t string, int chr);
 274.530 -
 274.531 -/**
 274.532 - * Returns a substring starting at the location of the first occurrence of the
 274.533 - * specified string.
 274.534 - * 
 274.535 - * If the string does not contain the other string, an empty string is returned.
 274.536 - * 
 274.537 - * If <code>match</code> is an empty string, the complete <code>string</code> is
 274.538 - * returned.
 274.539 - * 
 274.540 - * @param string the string to be scanned
 274.541 - * @param match  string containing the sequence of characters to match
 274.542 - * @return       a substring starting at the first occurrence of
 274.543 - *               <code>match</code>, or an empty string, if the sequence is not
 274.544 - *               present in <code>string</code>
 274.545 - */
 274.546 -sstr_t scstrsstr(sstr_t string, scstr_t match);
 274.547 -
 274.548 -/**
 274.549 - * Returns a substring starting at the location of the first occurrence of the
 274.550 - * specified string.
 274.551 - * 
 274.552 - * If the string does not contain the other string, an empty string is returned.
 274.553 - * 
 274.554 - * If <code>match</code> is an empty string, the complete <code>string</code> is
 274.555 - * returned.
 274.556 - * 
 274.557 - * @param string the string to be scanned
 274.558 - * @param match  string containing the sequence of characters to match
 274.559 - * @return       a substring starting at the first occurrence of
 274.560 - *               <code>match</code>, or an empty string, if the sequence is not
 274.561 - *               present in <code>string</code>
 274.562 - */
 274.563 -#define sstrstr(string, match) scstrsstr(string, SCSTR(match))
 274.564 -
 274.565 -/**
 274.566 - * Returns an immutable substring starting at the location of the
 274.567 - * first occurrence of the specified immutable string.
 274.568 - * 
 274.569 - * If the string does not contain the other string, an empty string is returned.
 274.570 - * 
 274.571 - * If <code>match</code> is an empty string, the complete <code>string</code> is
 274.572 - * returned.
 274.573 - * 
 274.574 - * @param string the string to be scanned
 274.575 - * @param match  string containing the sequence of characters to match
 274.576 - * @return       a substring starting at the first occurrence of
 274.577 - *               <code>match</code>, or an empty string, if the sequence is not
 274.578 - *               present in <code>string</code>
 274.579 - */
 274.580 -scstr_t scstrscstr(scstr_t string, scstr_t match);
 274.581 -
 274.582 -/**
 274.583 - * Returns an immutable substring starting at the location of the
 274.584 - * first occurrence of the specified immutable string.
 274.585 - * 
 274.586 - * If the string does not contain the other string, an empty string is returned.
 274.587 - * 
 274.588 - * If <code>match</code> is an empty string, the complete <code>string</code> is
 274.589 - * returned.
 274.590 - * 
 274.591 - * @param string the string to be scanned
 274.592 - * @param match  string containing the sequence of characters to match
 274.593 - * @return       a substring starting at the first occurrence of
 274.594 - *               <code>match</code>, or an empty string, if the sequence is not
 274.595 - *               present in <code>string</code>
 274.596 - */
 274.597 -#define sstrscstr(string, match) scstrscstr(string, SCSTR(match))
 274.598 -
 274.599 -/**
 274.600 - * Splits a string into parts by using a delimiter string.
 274.601 - * 
 274.602 - * This function will return <code>NULL</code>, if one of the following happens:
 274.603 - * <ul>
 274.604 - *   <li>the string length is zero</li>
 274.605 - *   <li>the delimeter length is zero</li>
 274.606 - *   <li>the string equals the delimeter</li>
 274.607 - *   <li>memory allocation fails</li>
 274.608 - * </ul>
 274.609 - * 
 274.610 - * The integer referenced by <code>count</code> is used as input and determines
 274.611 - * the maximum size of the resulting array, i.e. the maximum count of splits to
 274.612 - * perform + 1.
 274.613 - * 
 274.614 - * The integer referenced by <code>count</code> is also used as output and is
 274.615 - * set to
 274.616 - * <ul>
 274.617 - *   <li>-2, on memory allocation errors</li>
 274.618 - *   <li>-1, if either the string or the delimiter is an empty string</li>
 274.619 - *   <li>0, if the string equals the delimiter</li>
 274.620 - *   <li>1, if the string does not contain the delimiter</li>
 274.621 - *   <li>the count of array items, otherwise</li>
 274.622 - * </ul>
 274.623 - * 
 274.624 - * If the string starts with the delimiter, the first item of the resulting
 274.625 - * array will be an empty string.
 274.626 - * 
 274.627 - * If the string ends with the delimiter and the maximum list size is not
 274.628 - * exceeded, the last array item will be an empty string.
 274.629 - * In case the list size would be exceeded, the last array item will be the
 274.630 - * remaining string after the last split, <i>including</i> the terminating
 274.631 - * delimiter.
 274.632 - * 
 274.633 - * <b>Attention:</b> The array pointer <b>AND</b> all sstr_t.ptr of the array
 274.634 - * items must be manually passed to <code>free()</code>. Use scstrsplit_a() with
 274.635 - * an allocator to managed memory, to avoid this.
 274.636 - *
 274.637 - * @param string the string to split
 274.638 - * @param delim  the delimiter string
 274.639 - * @param count  IN: the maximum size of the resulting array (0 = no limit),
 274.640 - *               OUT: the actual size of the array
 274.641 - * @return a sstr_t array containing the split strings or
 274.642 - * <code>NULL</code> on error
 274.643 - * 
 274.644 - * @see scstrsplit_a()
 274.645 - */
 274.646 -sstr_t* scstrsplit(scstr_t string, scstr_t delim, ssize_t *count);
 274.647 -
 274.648 -/**
 274.649 - * Splits a string into parts by using a delimiter string.
 274.650 - * 
 274.651 - * This function will return <code>NULL</code>, if one of the following happens:
 274.652 - * <ul>
 274.653 - *   <li>the string length is zero</li>
 274.654 - *   <li>the delimeter length is zero</li>
 274.655 - *   <li>the string equals the delimeter</li>
 274.656 - *   <li>memory allocation fails</li>
 274.657 - * </ul>
 274.658 - * 
 274.659 - * The integer referenced by <code>count</code> is used as input and determines
 274.660 - * the maximum size of the resulting array, i.e. the maximum count of splits to
 274.661 - * perform + 1.
 274.662 - * 
 274.663 - * The integer referenced by <code>count</code> is also used as output and is
 274.664 - * set to
 274.665 - * <ul>
 274.666 - *   <li>-2, on memory allocation errors</li>
 274.667 - *   <li>-1, if either the string or the delimiter is an empty string</li>
 274.668 - *   <li>0, if the string equals the delimiter</li>
 274.669 - *   <li>1, if the string does not contain the delimiter</li>
 274.670 - *   <li>the count of array items, otherwise</li>
 274.671 - * </ul>
 274.672 - * 
 274.673 - * If the string starts with the delimiter, the first item of the resulting
 274.674 - * array will be an empty string.
 274.675 - * 
 274.676 - * If the string ends with the delimiter and the maximum list size is not
 274.677 - * exceeded, the last array item will be an empty string.
 274.678 - * In case the list size would be exceeded, the last array item will be the
 274.679 - * remaining string after the last split, <i>including</i> the terminating
 274.680 - * delimiter.
 274.681 - * 
 274.682 - * <b>Attention:</b> The array pointer <b>AND</b> all sstr_t.ptr of the array
 274.683 - * items must be manually passed to <code>free()</code>. Use sstrsplit_a() with
 274.684 - * an allocator to managed memory, to avoid this.
 274.685 - *
 274.686 - * @param string the string to split
 274.687 - * @param delim  the delimiter string
 274.688 - * @param count  IN: the maximum size of the resulting array (0 = no limit),
 274.689 - *               OUT: the actual size of the array
 274.690 - * @return a sstr_t array containing the split strings or
 274.691 - * <code>NULL</code> on error
 274.692 - * 
 274.693 - * @see sstrsplit_a()
 274.694 - */
 274.695 -#define sstrsplit(string, delim, count) \
 274.696 -    scstrsplit(SCSTR(string), SCSTR(delim), count)
 274.697 -
 274.698 -/**
 274.699 - * Performing scstrsplit() using a UcxAllocator.
 274.700 - * 
 274.701 - * <i>Read the description of scstrsplit() for details.</i>
 274.702 - * 
 274.703 - * The memory for the sstr_t.ptr pointers of the array items and the memory for
 274.704 - * the sstr_t array itself are allocated by using the UcxAllocator.malloc()
 274.705 - * function.
 274.706 - * 
 274.707 - * @param allocator the UcxAllocator used for allocating memory
 274.708 - * @param string the string to split
 274.709 - * @param delim  the delimiter string
 274.710 - * @param count  IN: the maximum size of the resulting array (0 = no limit),
 274.711 - *               OUT: the actual size of the array
 274.712 - * @return a sstr_t array containing the split strings or
 274.713 - * <code>NULL</code> on error
 274.714 - * 
 274.715 - * @see scstrsplit()
 274.716 - */
 274.717 -sstr_t* scstrsplit_a(UcxAllocator *allocator, scstr_t string, scstr_t delim,
 274.718 -        ssize_t *count);
 274.719 -
 274.720 -/**
 274.721 - * Performing sstrsplit() using a UcxAllocator.
 274.722 - * 
 274.723 - * <i>Read the description of sstrsplit() for details.</i>
 274.724 - * 
 274.725 - * The memory for the sstr_t.ptr pointers of the array items and the memory for
 274.726 - * the sstr_t array itself are allocated by using the UcxAllocator.malloc()
 274.727 - * function.
 274.728 - * 
 274.729 - * @param allocator the UcxAllocator used for allocating memory
 274.730 - * @param string the string to split
 274.731 - * @param delim  the delimiter string
 274.732 - * @param count  IN: the maximum size of the resulting array (0 = no limit),
 274.733 - *               OUT: the actual size of the array
 274.734 - * @return a sstr_t array containing the split strings or
 274.735 - * <code>NULL</code> on error
 274.736 - * 
 274.737 - * @see sstrsplit()
 274.738 - */
 274.739 -#define sstrsplit_a(allocator, string, delim, count) \
 274.740 -    scstrsplit_a(allocator, SCSTR(string), SCSTR(delim), count)
 274.741 -
 274.742 -/**
 274.743 - * Compares two UCX strings with standard <code>memcmp()</code>.
 274.744 - * 
 274.745 - * At first it compares the scstr_t.length attribute of the two strings. The
 274.746 - * <code>memcmp()</code> function is called, if and only if the lengths match.
 274.747 - * 
 274.748 - * @param s1 the first string
 274.749 - * @param s2 the second string
 274.750 - * @return -1, if the length of s1 is less than the length of s2 or 1, if the 
 274.751 - * length of s1 is greater than the length of s2 or the result of
 274.752 - * <code>memcmp()</code> otherwise (i.e. 0 if the strings match)
 274.753 - */
 274.754 -int scstrcmp(scstr_t s1, scstr_t s2);
 274.755 -
 274.756 -/**
 274.757 - * Compares two UCX strings with standard <code>memcmp()</code>.
 274.758 - * 
 274.759 - * At first it compares the sstr_t.length attribute of the two strings. The
 274.760 - * <code>memcmp()</code> function is called, if and only if the lengths match.
 274.761 - * 
 274.762 - * @param s1 the first string
 274.763 - * @param s2 the second string
 274.764 - * @return -1, if the length of s1 is less than the length of s2 or 1, if the 
 274.765 - * length of s1 is greater than the length of s2 or the result of
 274.766 - * <code>memcmp()</code> otherwise (i.e. 0 if the strings match)
 274.767 - */
 274.768 -#define sstrcmp(s1, s2) scstrcmp(SCSTR(s1), SCSTR(s2))
 274.769 -
 274.770 -/**
 274.771 - * Compares two UCX strings ignoring the case.
 274.772 - * 
 274.773 - * At first it compares the scstr_t.length attribute of the two strings. If and
 274.774 - * only if the lengths match, both strings are compared char by char ignoring
 274.775 - * the case.
 274.776 - * 
 274.777 - * @param s1 the first string
 274.778 - * @param s2 the second string
 274.779 - * @return -1, if the length of s1 is less than the length of s2 or 1, if the 
 274.780 - * length of s1 is greater than the length of s2 or the result of the platform
 274.781 - * specific string comparison function ignoring the case.
 274.782 - */
 274.783 -int scstrcasecmp(scstr_t s1, scstr_t s2);
 274.784 -
 274.785 -/**
 274.786 - * Compares two UCX strings ignoring the case.
 274.787 - * 
 274.788 - * At first it compares the sstr_t.length attribute of the two strings. If and
 274.789 - * only if the lengths match, both strings are compared char by char ignoring
 274.790 - * the case.
 274.791 - * 
 274.792 - * @param s1 the first string
 274.793 - * @param s2 the second string
 274.794 - * @return -1, if the length of s1 is less than the length of s2 or 1, if the 
 274.795 - * length of s1 is greater than the length of s2 or the result of the platform
 274.796 - * specific string comparison function ignoring the case.
 274.797 - */
 274.798 -#define sstrcasecmp(s1, s2) scstrcasecmp(SCSTR(s1), SCSTR(s2))
 274.799 -
 274.800 -/**
 274.801 - * Creates a duplicate of the specified string.
 274.802 - * 
 274.803 - * The new sstr_t will contain a copy allocated by standard
 274.804 - * <code>malloc()</code>. So developers <b>MUST</b> pass the sstr_t.ptr to
 274.805 - * <code>free()</code>.
 274.806 - * 
 274.807 - * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>-
 274.808 - * terminated and mutable, regardless of the argument.
 274.809 - * 
 274.810 - * @param string the string to duplicate
 274.811 - * @return a duplicate of the string
 274.812 - * @see scstrdup_a()
 274.813 - */
 274.814 -sstr_t scstrdup(scstr_t string);
 274.815 -
 274.816 -/**
 274.817 - * Creates a duplicate of the specified string.
 274.818 - * 
 274.819 - * The new sstr_t will contain a copy allocated by standard
 274.820 - * <code>malloc()</code>. So developers <b>MUST</b> pass the sstr_t.ptr to
 274.821 - * <code>free()</code>.
 274.822 - * 
 274.823 - * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>-
 274.824 - * terminated, regardless of the argument.
 274.825 - * 
 274.826 - * @param string the string to duplicate
 274.827 - * @return a duplicate of the string
 274.828 - * @see sstrdup_a()
 274.829 - */
 274.830 -#define sstrdup(string) scstrdup(SCSTR(string))
 274.831 -
 274.832 -/**
 274.833 - * Creates a duplicate of the specified string using a UcxAllocator.
 274.834 - * 
 274.835 - * The new sstr_t will contain a copy allocated by the allocators
 274.836 - * UcxAllocator.malloc() function. So it is implementation depended, whether the
 274.837 - * returned sstr_t.ptr pointer must be passed to the allocators
 274.838 - * UcxAllocator.free() function manually.
 274.839 - * 
 274.840 - * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>-
 274.841 - * terminated and mutable, regardless of the argument.
 274.842 - * 
 274.843 - * @param allocator a valid instance of a UcxAllocator
 274.844 - * @param string the string to duplicate
 274.845 - * @return a duplicate of the string
 274.846 - * @see scstrdup()
 274.847 - */
 274.848 -sstr_t scstrdup_a(UcxAllocator *allocator, scstr_t string);
 274.849 -
 274.850 -/**
 274.851 - * Creates a duplicate of the specified string using a UcxAllocator.
 274.852 - * 
 274.853 - * The new sstr_t will contain a copy allocated by the allocators
 274.854 - * UcxAllocator.malloc() function. So it is implementation depended, whether the
 274.855 - * returned sstr_t.ptr pointer must be passed to the allocators
 274.856 - * UcxAllocator.free() function manually.
 274.857 - * 
 274.858 - * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>-
 274.859 - * terminated, regardless of the argument.
 274.860 - * 
 274.861 - * @param allocator a valid instance of a UcxAllocator
 274.862 - * @param string the string to duplicate
 274.863 - * @return a duplicate of the string
 274.864 - * @see scstrdup()
 274.865 - */
 274.866 -#define sstrdup_a(allocator, string) scstrdup_a(allocator, SCSTR(string))
 274.867 -
 274.868 -
 274.869 -/**
 274.870 - * Omits leading and trailing spaces.
 274.871 - * 
 274.872 - * This function returns a new sstr_t containing a trimmed version of the
 274.873 - * specified string.
 274.874 - * 
 274.875 - * <b>Note:</b> the new sstr_t references the same memory, thus you
 274.876 - * <b>MUST NOT</b> pass the sstr_t.ptr of the return value to
 274.877 - * <code>free()</code>. It is also highly recommended to avoid assignments like
 274.878 - * <code>mystr = sstrtrim(mystr);</code> as you lose the reference to the
 274.879 - * source string. Assignments of this type are only permitted, if the
 274.880 - * sstr_t.ptr of the source string does not need to be freed or if another
 274.881 - * reference to the source string exists.
 274.882 - * 
 274.883 - * @param string the string that shall be trimmed
 274.884 - * @return a new sstr_t containing the trimmed string
 274.885 - */
 274.886 -sstr_t sstrtrim(sstr_t string);
 274.887 -
 274.888 -/**
 274.889 - * Omits leading and trailing spaces.
 274.890 - * 
 274.891 - * This function returns a new scstr_t containing a trimmed version of the
 274.892 - * specified string.
 274.893 - * 
 274.894 - * <b>Note:</b> the new scstr_t references the same memory, thus you
 274.895 - * <b>MUST NOT</b> pass the scstr_t.ptr of the return value to
 274.896 - * <code>free()</code>. It is also highly recommended to avoid assignments like
 274.897 - * <code>mystr = scstrtrim(mystr);</code> as you lose the reference to the
 274.898 - * source string. Assignments of this type are only permitted, if the
 274.899 - * scstr_t.ptr of the source string does not need to be freed or if another
 274.900 - * reference to the source string exists.
 274.901 - * 
 274.902 - * @param string the string that shall be trimmed
 274.903 - * @return a new scstr_t containing the trimmed string
 274.904 - */
 274.905 -scstr_t scstrtrim(scstr_t string);
 274.906 -
 274.907 -/**
 274.908 - * Checks, if a string has a specific prefix.
 274.909 - * 
 274.910 - * @param string the string to check
 274.911 - * @param prefix the prefix the string should have
 274.912 - * @return 1, if and only if the string has the specified prefix, 0 otherwise
 274.913 - */
 274.914 -int scstrprefix(scstr_t string, scstr_t prefix);
 274.915 -
 274.916 -/**
 274.917 - * Checks, if a string has a specific prefix.
 274.918 - * 
 274.919 - * @param string the string to check
 274.920 - * @param prefix the prefix the string should have
 274.921 - * @return 1, if and only if the string has the specified prefix, 0 otherwise
 274.922 - */
 274.923 -#define sstrprefix(string, prefix) scstrprefix(SCSTR(string), SCSTR(prefix))
 274.924 -
 274.925 -/**
 274.926 - * Checks, if a string has a specific suffix.
 274.927 - * 
 274.928 - * @param string the string to check
 274.929 - * @param suffix the suffix the string should have
 274.930 - * @return 1, if and only if the string has the specified suffix, 0 otherwise
 274.931 - */
 274.932 -int scstrsuffix(scstr_t string, scstr_t suffix);
 274.933 -
 274.934 -/**
 274.935 - * Checks, if a string has a specific suffix.
 274.936 - *
 274.937 - * @param string the string to check
 274.938 - * @param suffix the suffix the string should have
 274.939 - * @return 1, if and only if the string has the specified suffix, 0 otherwise
 274.940 - */
 274.941 -#define sstrsuffix(string, suffix) scstrsuffix(SCSTR(string), SCSTR(suffix))
 274.942 -
 274.943 -/**
 274.944 - * Checks, if a string has a specific prefix, ignoring the case.
 274.945 - * 
 274.946 - * @param string the string to check
 274.947 - * @param prefix the prefix the string should have
 274.948 - * @return 1, if and only if the string has the specified prefix, 0 otherwise
 274.949 - */
 274.950 -int scstrcaseprefix(scstr_t string, scstr_t prefix);
 274.951 -
 274.952 -/**
 274.953 - * Checks, if a string has a specific prefix, ignoring the case.
 274.954 - * 
 274.955 - * @param string the string to check
 274.956 - * @param prefix the prefix the string should have
 274.957 - * @return 1, if and only if the string has the specified prefix, 0 otherwise
 274.958 - */
 274.959 -#define sstrcaseprefix(string, prefix) \
 274.960 -  scstrcaseprefix(SCSTR(string), SCSTR(prefix))
 274.961 -
 274.962 -/**
 274.963 - * Checks, if a string has a specific suffix, ignoring the case.
 274.964 - * 
 274.965 - * @param string the string to check
 274.966 - * @param suffix the suffix the string should have
 274.967 - * @return 1, if and only if the string has the specified suffix, 0 otherwise
 274.968 - */
 274.969 -int scstrcasesuffix(scstr_t string, scstr_t suffix);
 274.970 -
 274.971 -/**
 274.972 - * Checks, if a string has a specific suffix, ignoring the case.
 274.973 - *
 274.974 - * @param string the string to check
 274.975 - * @param suffix the suffix the string should have
 274.976 - * @return 1, if and only if the string has the specified suffix, 0 otherwise
 274.977 - */
 274.978 -#define sstrcasesuffix(string, suffix) \
 274.979 -  scstrcasesuffix(SCSTR(string), SCSTR(suffix))
 274.980 -
 274.981 -/**
 274.982 - * Returns a lower case version of a string.
 274.983 - * 
 274.984 - * This function creates a duplicate of the input string, first
 274.985 - * (see scstrdup()).
 274.986 - * 
 274.987 - * @param string the input string
 274.988 - * @return the resulting lower case string
 274.989 - * @see scstrdup()
 274.990 - */
 274.991 -sstr_t scstrlower(scstr_t string);
 274.992 -
 274.993 -/**
 274.994 - * Returns a lower case version of a string.
 274.995 - * 
 274.996 - * This function creates a duplicate of the input string, first
 274.997 - * (see sstrdup()).
 274.998 - * 
 274.999 - * @param string the input string
274.1000 - * @return the resulting lower case string
274.1001 - */
274.1002 -#define sstrlower(string) scstrlower(SCSTR(string))
274.1003 -
274.1004 -/**
274.1005 - * Returns a lower case version of a string.
274.1006 - * 
274.1007 -  * This function creates a duplicate of the input string, first
274.1008 - * (see scstrdup_a()).
274.1009 - * 
274.1010 - * @param allocator the allocator used for duplicating the string
274.1011 - * @param string the input string
274.1012 - * @return the resulting lower case string
274.1013 - * @see scstrdup_a()
274.1014 - */
274.1015 -sstr_t scstrlower_a(UcxAllocator *allocator, scstr_t string);
274.1016 -
274.1017 -
274.1018 -/**
274.1019 - * Returns a lower case version of a string.
274.1020 - * 
274.1021 - * This function creates a duplicate of the input string, first
274.1022 - * (see sstrdup_a()).
274.1023 - * 
274.1024 - * @param allocator the allocator used for duplicating the string
274.1025 - * @param string the input string
274.1026 - * @return the resulting lower case string
274.1027 - */
274.1028 -#define sstrlower_a(allocator, string) scstrlower_a(allocator, SCSTR(string))
274.1029 -
274.1030 -/**
274.1031 - * Returns a upper case version of a string.
274.1032 - * 
274.1033 - * This function creates a duplicate of the input string, first
274.1034 - * (see scstrdup()).
274.1035 - * 
274.1036 - * @param string the input string
274.1037 - * @return the resulting upper case string
274.1038 - * @see scstrdup()
274.1039 - */
274.1040 -sstr_t scstrupper(scstr_t string);
274.1041 -
274.1042 -/**
274.1043 - * Returns a upper case version of a string.
274.1044 - * 
274.1045 - * This function creates a duplicate of the input string, first
274.1046 - * (see sstrdup()).
274.1047 - * 
274.1048 - * @param string the input string
274.1049 - * @return the resulting upper case string
274.1050 - */
274.1051 -#define sstrupper(string) scstrupper(SCSTR(string))
274.1052 -
274.1053 -/**
274.1054 - * Returns a upper case version of a string.
274.1055 - * 
274.1056 - * This function creates a duplicate of the input string, first
274.1057 - * (see scstrdup_a()).
274.1058 - * 
274.1059 - * @param allocator the allocator used for duplicating the string
274.1060 - * @param string the input string
274.1061 - * @return the resulting upper case string
274.1062 - * @see scstrdup_a()
274.1063 - */
274.1064 -sstr_t scstrupper_a(UcxAllocator *allocator, scstr_t string);
274.1065 -
274.1066 -/**
274.1067 - * Returns a upper case version of a string.
274.1068 - * 
274.1069 - * This function creates a duplicate of the input string, first
274.1070 - * (see sstrdup_a()).
274.1071 - * 
274.1072 - * @param allocator the allocator used for duplicating the string
274.1073 - * @param string the input string
274.1074 - * @return the resulting upper case string
274.1075 - */
274.1076 -#define sstrupper_a(allocator, string) scstrupper_a(allocator, string)
274.1077 -
274.1078 -
274.1079 -/**
274.1080 - * Replaces a pattern in a string with another string.
274.1081 - *
274.1082 - * The pattern is taken literally and is no regular expression.
274.1083 - * Replaces at most <code>replmax</code> occurrences.
274.1084 - *
274.1085 - * The resulting string is allocated by the specified allocator. I.e. it
274.1086 - * depends on the used allocator, whether the sstr_t.ptr must be freed
274.1087 - * manually.
274.1088 - *
274.1089 - * If allocation fails, the sstr_t.ptr of the return value is NULL.
274.1090 - *
274.1091 - * @param allocator the allocator to use
274.1092 - * @param str the string where replacements should be applied
274.1093 - * @param pattern the pattern to search for
274.1094 - * @param replacement the replacement string
274.1095 - * @param replmax maximum number of replacements
274.1096 - * @return the resulting string after applying the replacements
274.1097 - */
274.1098 -sstr_t scstrreplacen_a(UcxAllocator *allocator, scstr_t str,
274.1099 -        scstr_t pattern, scstr_t replacement, size_t replmax);
274.1100 -
274.1101 -/**
274.1102 - * Replaces a pattern in a string with another string.
274.1103 - *
274.1104 - * The pattern is taken literally and is no regular expression.
274.1105 - * Replaces at most <code>replmax</code> occurrences.
274.1106 - *
274.1107 - * The sstr_t.ptr of the resulting string must be freed manually.
274.1108 - *
274.1109 - * If allocation fails, the sstr_t.ptr of the return value is NULL.
274.1110 - *
274.1111 - * @param str the string where replacements should be applied
274.1112 - * @param pattern the pattern to search for
274.1113 - * @param replacement the replacement string
274.1114 - * @param replmax maximum number of replacements
274.1115 - * @return the resulting string after applying the replacements
274.1116 - */
274.1117 -sstr_t scstrreplacen(scstr_t str, scstr_t pattern,
274.1118 -        scstr_t replacement, size_t replmax);
274.1119 -
274.1120 -/**
274.1121 - * Replaces a pattern in a string with another string.
274.1122 - *
274.1123 - * The pattern is taken literally and is no regular expression.
274.1124 - * Replaces at most <code>replmax</code> occurrences.
274.1125 - *
274.1126 - * The resulting string is allocated by the specified allocator. I.e. it
274.1127 - * depends on the used allocator, whether the sstr_t.ptr must be freed
274.1128 - * manually.
274.1129 - *
274.1130 - * @param allocator the allocator to use
274.1131 - * @param str the string where replacements should be applied
274.1132 - * @param pattern the pattern to search for
274.1133 - * @param replacement the replacement string
274.1134 - * @param replmax maximum number of replacements
274.1135 - * @return the resulting string after applying the replacements
274.1136 - */
274.1137 -#define sstrreplacen_a(allocator, str, pattern, replacement, replmax) \
274.1138 -        scstrreplacen_a(allocator, SCSTR(str), SCSTR(pattern), \
274.1139 -            SCSTR(replacement), replmax)
274.1140 -
274.1141 -/**
274.1142 - * Replaces a pattern in a string with another string.
274.1143 - *
274.1144 - * The pattern is taken literally and is no regular expression.
274.1145 - * Replaces at most <code>replmax</code> occurrences.
274.1146 - *
274.1147 - * The sstr_t.ptr of the resulting string must be freed manually.
274.1148 - *
274.1149 - * If allocation fails, the sstr_t.ptr of the return value is NULL.
274.1150 - *
274.1151 - * @param str the string where replacements should be applied
274.1152 - * @param pattern the pattern to search for
274.1153 - * @param replacement the replacement string
274.1154 - * @param replmax maximum number of replacements
274.1155 - * @return the resulting string after applying the replacements
274.1156 - */
274.1157 -#define sstrreplacen(str, pattern, replacement, replmax) \
274.1158 -        scstrreplacen(SCSTR(str), SCSTR(pattern), SCSTR(replacement), replmax)
274.1159 -
274.1160 -/**
274.1161 - * Replaces a pattern in a string with another string.
274.1162 - *
274.1163 - * The pattern is taken literally and is no regular expression.
274.1164 - * Replaces at most <code>replmax</code> occurrences.
274.1165 - *
274.1166 - * The resulting string is allocated by the specified allocator. I.e. it
274.1167 - * depends on the used allocator, whether the sstr_t.ptr must be freed
274.1168 - * manually.
274.1169 - *
274.1170 - * If allocation fails, the sstr_t.ptr of the return value is NULL.
274.1171 - *
274.1172 - * @param allocator the allocator to use
274.1173 - * @param str the string where replacements should be applied
274.1174 - * @param pattern the pattern to search for
274.1175 - * @param replacement the replacement string
274.1176 - * @return the resulting string after applying the replacements
274.1177 - */
274.1178 -#define sstrreplace_a(allocator, str, pattern, replacement) \
274.1179 -        scstrreplacen_a(allocator, SCSTR(str), SCSTR(pattern), \
274.1180 -            SCSTR(replacement), SIZE_MAX)
274.1181 -
274.1182 -/**
274.1183 - * Replaces a pattern in a string with another string.
274.1184 - *
274.1185 - * The pattern is taken literally and is no regular expression.
274.1186 - * Replaces at most <code>replmax</code> occurrences.
274.1187 - *
274.1188 - * The sstr_t.ptr of the resulting string must be freed manually.
274.1189 - *
274.1190 - * If allocation fails, the sstr_t.ptr of the return value is NULL.
274.1191 - *
274.1192 - * @param str the string where replacements should be applied
274.1193 - * @param pattern the pattern to search for
274.1194 - * @param replacement the replacement string
274.1195 - * @return the resulting string after applying the replacements
274.1196 - */
274.1197 -#define sstrreplace(str, pattern, replacement) \
274.1198 -        scstrreplacen(SCSTR(str), SCSTR(pattern), SCSTR(replacement), SIZE_MAX)
274.1199 -
274.1200 -#ifdef	__cplusplus
274.1201 -}
274.1202 -#endif
274.1203 -
274.1204 -#endif	/* UCX_STRING_H */
   275.1 --- a/src/ucx/test.h	Mon Dec 30 09:54:10 2019 +0100
   275.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   275.3 @@ -1,241 +0,0 @@
   275.4 -/*
   275.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   275.6 - *
   275.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   275.8 - *
   275.9 - * Redistribution and use in source and binary forms, with or without
  275.10 - * modification, are permitted provided that the following conditions are met:
  275.11 - *
  275.12 - *   1. Redistributions of source code must retain the above copyright
  275.13 - *      notice, this list of conditions and the following disclaimer.
  275.14 - *
  275.15 - *   2. Redistributions in binary form must reproduce the above copyright
  275.16 - *      notice, this list of conditions and the following disclaimer in the
  275.17 - *      documentation and/or other materials provided with the distribution.
  275.18 - *
  275.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  275.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  275.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  275.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  275.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  275.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  275.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  275.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  275.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  275.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  275.29 - * POSSIBILITY OF SUCH DAMAGE.
  275.30 - */
  275.31 - 
  275.32 -/**
  275.33 - * @file: test.h
  275.34 - * 
  275.35 - * UCX Test Framework.
  275.36 - * 
  275.37 - * Usage of this test framework:
  275.38 - *
  275.39 - * **** IN HEADER FILE: ****
  275.40 - *
  275.41 - * <pre>
  275.42 - * UCX_TEST(function_name);
  275.43 - * UCX_TEST_SUBROUTINE(subroutine_name, paramlist); // optional
  275.44 - * </pre>
  275.45 - *
  275.46 - * **** IN SOURCE FILE: ****
  275.47 - * <pre>
  275.48 - * UCX_TEST_SUBROUTINE(subroutine_name, paramlist) {
  275.49 - *   // tests with UCX_TEST_ASSERT()
  275.50 - * }
  275.51 - * 
  275.52 - * UCX_TEST(function_name) {
  275.53 - *   // memory allocation and other stuff here
  275.54 - *   #UCX_TEST_BEGIN
  275.55 - *   // tests with UCX_TEST_ASSERT() and/or
  275.56 - *   // calls with UCX_TEST_CALL_SUBROUTINE() here
  275.57 - *   #UCX_TEST_END
  275.58 - *   // cleanup of memory here
  275.59 - * }
  275.60 - * </pre>
  275.61 - *
  275.62 - * <b>Note:</b> if a test fails, a longjump is performed
  275.63 - * back to the #UCX_TEST_BEGIN macro!
  275.64 - * 
  275.65 - * <b>Attention:</b> Do not call own functions within a test, that use
  275.66 - * UCX_TEST_ASSERT() macros and are not defined by using UCX_TEST_SUBROUTINE().
  275.67 - * 
  275.68 - *
  275.69 - * @author Mike Becker
  275.70 - * @author Olaf Wintermann
  275.71 - *
  275.72 - */
  275.73 -
  275.74 -#ifndef UCX_TEST_H
  275.75 -#define	UCX_TEST_H
  275.76 -
  275.77 -#include "ucx.h"
  275.78 -#include <stdio.h>
  275.79 -#include <string.h>
  275.80 -#include <setjmp.h>
  275.81 -
  275.82 -#ifdef	__cplusplus
  275.83 -extern "C" {
  275.84 -#endif
  275.85 -
  275.86 -#ifndef __FUNCTION__
  275.87 -
  275.88 -/**
  275.89 - * Alias for the <code>__func__</code> preprocessor macro.
  275.90 - * Some compilers use <code>__func__</code> and others use __FUNCTION__.
  275.91 - * We use __FUNCTION__ so we define it for those compilers which use
  275.92 - * <code>__func__</code>.
  275.93 - */
  275.94 -#define __FUNCTION__ __func__
  275.95 -#endif
  275.96 -
  275.97 -/** Type for the UcxTestSuite. */
  275.98 -typedef struct UcxTestSuite UcxTestSuite;
  275.99 -
 275.100 -/** Pointer to a test function. */
 275.101 -typedef void(*UcxTest)(UcxTestSuite*,FILE*);
 275.102 -
 275.103 -/** Type for the internal list of test cases. */
 275.104 -typedef struct UcxTestList UcxTestList;
 275.105 -
 275.106 -/** Structure for the internal list of test cases. */
 275.107 -struct UcxTestList {
 275.108 -    
 275.109 -    /** Test case. */
 275.110 -    UcxTest test;
 275.111 -    
 275.112 -    /** Pointer to the next list element. */
 275.113 -    UcxTestList *next;
 275.114 -};
 275.115 -
 275.116 -/**
 275.117 - * A test suite containing multiple test cases.
 275.118 - */
 275.119 -struct UcxTestSuite {
 275.120 -    
 275.121 -    /** The number of successful tests after the suite has been run. */
 275.122 -    unsigned int success;
 275.123 -    
 275.124 -    /** The number of failed tests after the suite has been run. */
 275.125 -    unsigned int failure;
 275.126 -    
 275.127 -    /**
 275.128 -     * Internal list of test cases.
 275.129 -     * Use ucx_test_register() to add tests to this list.
 275.130 -     */
 275.131 -    UcxTestList *tests;
 275.132 -};
 275.133 -
 275.134 -/**
 275.135 - * Creates a new test suite.
 275.136 - * @return a new test suite
 275.137 - */
 275.138 -UcxTestSuite* ucx_test_suite_new();
 275.139 -
 275.140 -/**
 275.141 - * Destroys a test suite.
 275.142 - * @param suite the test suite to destroy
 275.143 - */
 275.144 -void ucx_test_suite_free(UcxTestSuite* suite);
 275.145 -
 275.146 -/**
 275.147 - * Registers a test function with the specified test suite.
 275.148 - * 
 275.149 - * @param suite the suite, the test function shall be added to
 275.150 - * @param test the test function to register
 275.151 - * @return <code>EXIT_SUCCESS</code> on success or
 275.152 - * <code>EXIT_FAILURE</code> on failure
 275.153 - */
 275.154 -int ucx_test_register(UcxTestSuite* suite, UcxTest test);
 275.155 -
 275.156 -/**
 275.157 - * Runs a test suite and writes the test log to the specified stream.
 275.158 - * @param suite the test suite to run
 275.159 - * @param outstream the stream the log shall be written to
 275.160 - */
 275.161 -void ucx_test_run(UcxTestSuite* suite, FILE* outstream);
 275.162 -
 275.163 -/**
 275.164 - * Macro for a #UcxTest function header.
 275.165 - * 
 275.166 - * Use this macro to declare and/or define a #UcxTest function.
 275.167 - * 
 275.168 - * @param name the name of the test function
 275.169 - */
 275.170 -#define UCX_TEST(name) void name(UcxTestSuite* _suite_,FILE *_output_)
 275.171 -
 275.172 -/**
 275.173 - * Marks the begin of a test.
 275.174 - * <b>Note:</b> Any UCX_TEST_ASSERT() calls must be performed <b>after</b>
 275.175 - * #UCX_TEST_BEGIN.
 275.176 - * 
 275.177 - * @see #UCX_TEST_END
 275.178 - */
 275.179 -#define UCX_TEST_BEGIN fwrite("Running ", 1, 8, _output_);\
 275.180 -        fwrite(__FUNCTION__, 1, strlen(__FUNCTION__), _output_);\
 275.181 -        fwrite("... ", 1, 4, _output_);\
 275.182 -        jmp_buf _env_; \
 275.183 -        if (!setjmp(_env_)) {
 275.184 -
 275.185 -/**
 275.186 - * Checks a test assertion.
 275.187 - * If the assertion is correct, the test carries on. If the assertion is not
 275.188 - * correct, the specified message (terminated by a dot and a line break) is
 275.189 - * written to the test suites output stream.
 275.190 - * @param condition the condition to check
 275.191 - * @param message the message that shall be printed out on failure
 275.192 - */
 275.193 -#define UCX_TEST_ASSERT(condition,message) if (!(condition)) { \
 275.194 -        fwrite(message".\n", 1, 2+strlen(message), _output_); \
 275.195 -        _suite_->failure++; \
 275.196 -        longjmp(_env_, 1);\
 275.197 -    }
 275.198 -
 275.199 -/**
 275.200 - * Macro for a test subroutine function header.
 275.201 - * 
 275.202 - * Use this to declare and/or define a subroutine that can be called by using
 275.203 - * UCX_TEST_CALL_SUBROUTINE().
 275.204 - * 
 275.205 - * @param name the name of the subroutine
 275.206 - * @param ... the parameter list
 275.207 - * 
 275.208 - * @see UCX_TEST_CALL_SUBROUTINE()
 275.209 - */
 275.210 -#define UCX_TEST_SUBROUTINE(name,...) void name(UcxTestSuite* _suite_,\
 275.211 -        FILE *_output_, jmp_buf _env_, __VA_ARGS__)
 275.212 -
 275.213 -/**
 275.214 - * Macro for calling a test subroutine.
 275.215 - * 
 275.216 - * Subroutines declared with UCX_TEST_SUBROUTINE() can be called by using this
 275.217 - * macro.
 275.218 - * 
 275.219 - * <b>Note:</b> You may <b>only</b> call subroutines within a #UCX_TEST_BEGIN-
 275.220 - * #UCX_TEST_END-block.
 275.221 - * 
 275.222 - * @param name the name of the subroutine
 275.223 - * @param ... the argument list
 275.224 - * 
 275.225 - * @see UCX_TEST_SUBROUTINE()
 275.226 - */
 275.227 -#define UCX_TEST_CALL_SUBROUTINE(name,...) \
 275.228 -        name(_suite_,_output_,_env_,__VA_ARGS__);
 275.229 -
 275.230 -/**
 275.231 - * Marks the end of a test.
 275.232 - * <b>Note:</b> Any UCX_TEST_ASSERT() calls must be performed <b>before</b>
 275.233 - * #UCX_TEST_END.
 275.234 - * 
 275.235 - * @see #UCX_TEST_BEGIN
 275.236 - */
 275.237 -#define UCX_TEST_END fwrite("success.\n", 1, 9, _output_); _suite_->success++;}
 275.238 -
 275.239 -#ifdef	__cplusplus
 275.240 -}
 275.241 -#endif
 275.242 -
 275.243 -#endif	/* UCX_TEST_H */
 275.244 -
   276.1 --- a/src/ucx/ucx.h	Mon Dec 30 09:54:10 2019 +0100
   276.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   276.3 @@ -1,204 +0,0 @@
   276.4 -/*
   276.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   276.6 - *
   276.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   276.8 - *
   276.9 - * Redistribution and use in source and binary forms, with or without
  276.10 - * modification, are permitted provided that the following conditions are met:
  276.11 - *
  276.12 - *   1. Redistributions of source code must retain the above copyright
  276.13 - *      notice, this list of conditions and the following disclaimer.
  276.14 - *
  276.15 - *   2. Redistributions in binary form must reproduce the above copyright
  276.16 - *      notice, this list of conditions and the following disclaimer in the
  276.17 - *      documentation and/or other materials provided with the distribution.
  276.18 - *
  276.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  276.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  276.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  276.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  276.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  276.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  276.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  276.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  276.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  276.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  276.29 - * POSSIBILITY OF SUCH DAMAGE.
  276.30 - */
  276.31 -/**
  276.32 - * Main UCX Header providing most common definitions.
  276.33 - * 
  276.34 - * @file   ucx.h
  276.35 - * @author Mike Becker
  276.36 - * @author Olaf Wintermann
  276.37 - */
  276.38 -
  276.39 -#ifndef UCX_H
  276.40 -#define	UCX_H
  276.41 -
  276.42 -/** Major UCX version as integer constant. */
  276.43 -#define UCX_VERSION_MAJOR   2
  276.44 -
  276.45 -/** Minor UCX version as integer constant. */
  276.46 -#define UCX_VERSION_MINOR   1
  276.47 -
  276.48 -/** Version constant which ensures to increase monotonically. */
  276.49 -#define UCX_VERSION (((UCX_VERSION_MAJOR)<<16)|UCX_VERSION_MINOR)
  276.50 -
  276.51 -#include <stdlib.h>
  276.52 -#include <stdint.h>
  276.53 -
  276.54 -#ifdef _WIN32
  276.55 -#if !(defined __ssize_t_defined || defined _SSIZE_T_)
  276.56 -#include <BaseTsd.h>
  276.57 -typedef SSIZE_T ssize_t;
  276.58 -#define __ssize_t_defined
  276.59 -#define _SSIZE_T_
  276.60 -#endif /* __ssize_t_defined and _SSIZE_T */
  276.61 -#else /* !_WIN32 */
  276.62 -#include <sys/types.h>
  276.63 -#endif /* _WIN32 */
  276.64 -
  276.65 -#ifdef	__cplusplus
  276.66 -extern "C" {
  276.67 -#endif
  276.68 -    
  276.69 -
  276.70 -/**
  276.71 - * A function pointer to a destructor function.
  276.72 - * @see ucx_mempool_setdestr()
  276.73 - * @see ucx_mempool_regdestr()
  276.74 - */
  276.75 -typedef void(*ucx_destructor)(void*);
  276.76 -
  276.77 -/**
  276.78 - * Function pointer to a compare function.
  276.79 - * 
  276.80 - * The compare function shall take three arguments: the two values that shall be
  276.81 - * compared and optional additional data.
  276.82 - * The function shall then return -1 if the first argument is less than the
  276.83 - * second argument, 1 if the first argument is greater than the second argument
  276.84 - * and 0 if both arguments are equal. If the third argument is
  276.85 - * <code>NULL</code>, it shall be ignored.
  276.86 - */
  276.87 -typedef int(*cmp_func)(const void*,const void*,void*);
  276.88 -
  276.89 -/**
  276.90 - * Function pointer to a distance function.
  276.91 - * 
  276.92 - * The distance function shall take three arguments: the two values for which
  276.93 - * the distance shall be computed and optional additional data.
  276.94 - * The function shall then return the signed distance as integer value.
  276.95 - */
  276.96 -typedef intmax_t(*distance_func)(const void*,const void*,void*);
  276.97 -
  276.98 -/**
  276.99 - * Function pointer to a copy function.
 276.100 - * 
 276.101 - * The copy function shall create a copy of the first argument and may use
 276.102 - * additional data provided by the second argument. If the second argument is
 276.103 - * <code>NULL</code>, it shall be ignored.
 276.104 -
 276.105 - * <b>Attention:</b> if pointers returned by functions of this type may be
 276.106 - * passed to <code>free()</code> depends on the implementation of the
 276.107 - * respective <code>copy_func</code>.
 276.108 - */
 276.109 -typedef void*(*copy_func)(const void*,void*);
 276.110 -
 276.111 -/**
 276.112 - * Function pointer to a write function.
 276.113 - * 
 276.114 - * The signature of the write function shall be compatible to the signature
 276.115 - * of standard <code>fwrite</code>, though it may use arbitrary data types for
 276.116 - * source and destination.
 276.117 - * 
 276.118 - * The arguments shall contain (in ascending order): a pointer to the source,
 276.119 - * the length of one element, the element count and a pointer to the
 276.120 - * destination.
 276.121 - */
 276.122 -typedef size_t(*write_func)(const void*, size_t, size_t, void*);
 276.123 -
 276.124 -/**
 276.125 - * Function pointer to a read function.
 276.126 - * 
 276.127 - * The signature of the read function shall be compatible to the signature
 276.128 - * of standard <code>fread</code>, though it may use arbitrary data types for
 276.129 - * source and destination.
 276.130 - * 
 276.131 - * The arguments shall contain (in ascending order): a pointer to the
 276.132 - * destination, the length of one element, the element count and a pointer to
 276.133 - * the source.
 276.134 - */
 276.135 -typedef size_t(*read_func)(void*, size_t, size_t, void*);
 276.136 -
 276.137 -
 276.138 -
 276.139 -#if __GNUC__ >= 5 || defined(__clang__)
 276.140 -#define UCX_MUL_BUILTIN
 276.141 -
 276.142 -#if __WORDSIZE == 32
 276.143 -/**
 276.144 - * Alias for <code>__builtin_umul_overflow</code>.
 276.145 - * 
 276.146 - * Performs a multiplication of size_t values and checks for overflow.
 276.147 - * 
 276.148 - * @param a first operand
 276.149 - * @param b second operand
 276.150 - * @param result a pointer to a size_t, where the result should
 276.151 - * be stored
 276.152 - * @return zero, if no overflow occurred and the result is correct, non-zero
 276.153 - * otherwise
 276.154 - */
 276.155 -#define ucx_szmul(a, b, result) __builtin_umul_overflow(a, b, result)
 276.156 -#else /* __WORDSIZE != 32 */
 276.157 -/**
 276.158 - * Alias for <code>__builtin_umull_overflow</code>.
 276.159 - * 
 276.160 - * Performs a multiplication of size_t values and checks for overflow.
 276.161 - * 
 276.162 - * @param a first operand
 276.163 - * @param b second operand
 276.164 - * @param result a pointer to a size_t, where the result should
 276.165 - * be stored
 276.166 - * @return zero, if no overflow occurred and the result is correct, non-zero
 276.167 - * otherwise
 276.168 - */
 276.169 -#define ucx_szmul(a, b, result) __builtin_umull_overflow(a, b, result)
 276.170 -#endif /* __WORDSIZE */
 276.171 -
 276.172 -#else /* no GNUC or clang bultin */
 276.173 -
 276.174 -/**
 276.175 - * Performs a multiplication of size_t values and checks for overflow.
 276.176 -  *
 276.177 - * @param a first operand
 276.178 - * @param b second operand
 276.179 - * @param result a pointer to a size_t, where the result should
 276.180 - * be stored
 276.181 - * @return zero, if no overflow occurred and the result is correct, non-zero
 276.182 - * otherwise
 276.183 - */
 276.184 -#define ucx_szmul(a, b, result) ucx_szmul_impl(a, b, result)
 276.185 -
 276.186 -/**
 276.187 - * Performs a multiplication of size_t values and checks for overflow.
 276.188 - *
 276.189 - * This is a custom implementation in case there is no compiler builtin
 276.190 - * available.
 276.191 - *
 276.192 - * @param a first operand
 276.193 - * @param b second operand
 276.194 - * @param result a pointer to a size_t where the result should be stored
 276.195 - * @return zero, if no overflow occurred and the result is correct, non-zero
 276.196 - * otherwise
 276.197 - */
 276.198 -int ucx_szmul_impl(size_t a, size_t b, size_t *result);
 276.199 -
 276.200 -#endif
 276.201 -
 276.202 -#ifdef	__cplusplus
 276.203 -}
 276.204 -#endif
 276.205 -
 276.206 -#endif	/* UCX_H */
 276.207 -
   277.1 --- a/src/ucx/utils.h	Mon Dec 30 09:54:10 2019 +0100
   277.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   277.3 @@ -1,508 +0,0 @@
   277.4 -/*
   277.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   277.6 - *
   277.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   277.8 - *
   277.9 - * Redistribution and use in source and binary forms, with or without
  277.10 - * modification, are permitted provided that the following conditions are met:
  277.11 - *
  277.12 - *   1. Redistributions of source code must retain the above copyright
  277.13 - *      notice, this list of conditions and the following disclaimer.
  277.14 - *
  277.15 - *   2. Redistributions in binary form must reproduce the above copyright
  277.16 - *      notice, this list of conditions and the following disclaimer in the
  277.17 - *      documentation and/or other materials provided with the distribution.
  277.18 - *
  277.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  277.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  277.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  277.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  277.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  277.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  277.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  277.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  277.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  277.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  277.29 - * POSSIBILITY OF SUCH DAMAGE.
  277.30 - */
  277.31 -
  277.32 -/**
  277.33 - * @file utils.h
  277.34 - * 
  277.35 - * Compare, copy and printf functions.
  277.36 - * 
  277.37 - * @author Mike Becker
  277.38 - * @author Olaf Wintermann
  277.39 - */
  277.40 -
  277.41 -#ifndef UCX_UTILS_H
  277.42 -#define UCX_UTILS_H
  277.43 -
  277.44 -#include "ucx.h"
  277.45 -#include "string.h"
  277.46 -#include "allocator.h"
  277.47 -#include <inttypes.h>
  277.48 -#include <string.h>
  277.49 -#include <stdarg.h>
  277.50 -
  277.51 -#ifdef __cplusplus
  277.52 -extern "C" {
  277.53 -#endif
  277.54 -
  277.55 -/**
  277.56 - * Default buffer size for ucx_stream_copy() and ucx_stream_ncopy().
  277.57 - */
  277.58 -#define UCX_STREAM_COPY_BUFSIZE 4096
  277.59 -
  277.60 -/**
  277.61 - * Copies a string.
  277.62 - * @param s the string to copy
  277.63 - * @param data omitted
  277.64 - * @return a pointer to a copy of s1 that can be passed to free(void*)
  277.65 - */
  277.66 -void *ucx_strcpy(const void *s, void *data);
  277.67 -
  277.68 -/**
  277.69 - * Copies a memory area.
  277.70 - * @param m a pointer to the memory area
  277.71 - * @param n a pointer to the size_t containing the size of the memory area
  277.72 - * @return a pointer to a copy of the specified memory area that can
  277.73 - * be passed to free(void*)
  277.74 - */
  277.75 -void *ucx_memcpy(const void *m, void *n);
  277.76 -
  277.77 -
  277.78 -/**
  277.79 - * Reads data from a stream and writes it to another stream.
  277.80 - * 
  277.81 - * @param src the source stream
  277.82 - * @param dest the destination stream
  277.83 - * @param rfnc the read function
  277.84 - * @param wfnc the write function
  277.85 - * @param buf a pointer to the copy buffer or <code>NULL</code> if a buffer
  277.86 - * shall be implicitly created on the heap
  277.87 - * @param bufsize the size of the copy buffer - if <code>NULL</code> was
  277.88 - * provided for <code>buf</code>, this is the size of the buffer that shall be
  277.89 - * implicitly created
  277.90 - * @param n the maximum number of bytes that shall be copied
  277.91 - * @return the total number of bytes copied
  277.92 -  */
  277.93 -size_t ucx_stream_bncopy(void *src, void *dest, read_func rfnc, write_func wfnc,
  277.94 -        char* buf, size_t bufsize, size_t n);
  277.95 -
  277.96 -/**
  277.97 - * Shorthand for an unbounded ucx_stream_bncopy call using a default buffer.
  277.98 - * 
  277.99 - * @param src the source stream
 277.100 - * @param dest the destination stream
 277.101 - * @param rfnc the read function
 277.102 - * @param wfnc the write function
 277.103 - * @return total number of bytes copied
 277.104 - * 
 277.105 - * @see #UCX_STREAM_COPY_BUFSIZE
 277.106 - */
 277.107 -#define ucx_stream_copy(src,dest,rfnc,wfnc) ucx_stream_bncopy(\
 277.108 -        src, dest, (read_func)rfnc, (write_func)wfnc, \
 277.109 -        NULL, UCX_STREAM_COPY_BUFSIZE, (size_t)-1)
 277.110 -
 277.111 -/**
 277.112 - * Shorthand for ucx_stream_bncopy using a default copy buffer.
 277.113 - * 
 277.114 - * @param src the source stream
 277.115 - * @param dest the destination stream
 277.116 - * @param rfnc the read function
 277.117 - * @param wfnc the write function
 277.118 - * @param n maximum number of bytes that shall be copied
 277.119 - * @return total number of bytes copied
 277.120 - */
 277.121 -#define ucx_stream_ncopy(src,dest,rfnc,wfnc, n) ucx_stream_bncopy(\
 277.122 -        src, dest, (read_func)rfnc, (write_func)wfnc, \
 277.123 -        NULL, UCX_STREAM_COPY_BUFSIZE, n)
 277.124 -
 277.125 -/**
 277.126 - * Shorthand for an unbounded ucx_stream_bncopy call using the specified buffer.
 277.127 - * 
 277.128 - * @param src the source stream
 277.129 - * @param dest the destination stream
 277.130 - * @param rfnc the read function
 277.131 - * @param wfnc the write function
 277.132 - * @param buf a pointer to the copy buffer or <code>NULL</code> if a buffer
 277.133 - * shall be implicitly created on the heap
 277.134 - * @param bufsize the size of the copy buffer - if <code>NULL</code> was
 277.135 - * provided for <code>buf</code>, this is the size of the buffer that shall be
 277.136 - * implicitly created
 277.137 - * @return total number of bytes copied
 277.138 - */
 277.139 -#define ucx_stream_bcopy(src,dest,rfnc,wfnc, buf, bufsize) ucx_stream_bncopy(\
 277.140 -        src, dest, (read_func)rfnc, (write_func)wfnc, \
 277.141 -        buf, bufsize, (size_t)-1)
 277.142 -
 277.143 -/**
 277.144 - * Wraps the strcmp function.
 277.145 - * @param s1 string one
 277.146 - * @param s2 string two
 277.147 - * @param data omitted
 277.148 - * @return the result of strcmp(s1, s2)
 277.149 - */
 277.150 -int ucx_cmp_str(const void *s1, const void *s2, void *data);
 277.151 -
 277.152 -/**
 277.153 - * Wraps the strncmp function.
 277.154 - * @param s1 string one
 277.155 - * @param s2 string two
 277.156 - * @param n a pointer to the size_t containing the third strncmp parameter
 277.157 - * @return the result of strncmp(s1, s2, *n)
 277.158 - */
 277.159 -int ucx_cmp_strn(const void *s1, const void *s2, void *n);
 277.160 -
 277.161 -/**
 277.162 - * Wraps the sstrcmp function.
 277.163 - * @param s1 sstr one
 277.164 - * @param s2 sstr two
 277.165 - * @param data ignored
 277.166 - * @return the result of sstrcmp(s1, s2)
 277.167 - */
 277.168 -int ucx_cmp_sstr(const void *s1, const void *s2, void *data);
 277.169 -
 277.170 -/**
 277.171 - * Compares two integers of type int.
 277.172 - * @param i1 pointer to integer one
 277.173 - * @param i2 pointer to integer two
 277.174 - * @param data omitted
 277.175 - * @return -1, if *i1 is less than *i2, 0 if both are equal,
 277.176 - * 1 if *i1 is greater than *i2
 277.177 - */
 277.178 -int ucx_cmp_int(const void *i1, const void *i2, void *data);
 277.179 -
 277.180 -/**
 277.181 - * Compares two integers of type long int.
 277.182 - * @param i1 pointer to long integer one
 277.183 - * @param i2 pointer to long integer two
 277.184 - * @param data omitted
 277.185 - * @return -1, if *i1 is less than *i2, 0 if both are equal,
 277.186 - * 1 if *i1 is greater than *i2
 277.187 - */
 277.188 -int ucx_cmp_longint(const void *i1, const void *i2, void *data);
 277.189 -
 277.190 -/**
 277.191 - * Compares two integers of type long long.
 277.192 - * @param i1 pointer to long long one
 277.193 - * @param i2 pointer to long long two
 277.194 - * @param data omitted
 277.195 - * @return -1, if *i1 is less than *i2, 0 if both are equal,
 277.196 - * 1 if *i1 is greater than *i2
 277.197 - */
 277.198 -int ucx_cmp_longlong(const void *i1, const void *i2, void *data);
 277.199 -
 277.200 -/**
 277.201 - * Compares two integers of type int16_t.
 277.202 - * @param i1 pointer to int16_t one
 277.203 - * @param i2 pointer to int16_t two
 277.204 - * @param data omitted
 277.205 - * @return -1, if *i1 is less than *i2, 0 if both are equal,
 277.206 - * 1 if *i1 is greater than *i2
 277.207 - */
 277.208 -int ucx_cmp_int16(const void *i1, const void *i2, void *data);
 277.209 -
 277.210 -/**
 277.211 - * Compares two integers of type int32_t.
 277.212 - * @param i1 pointer to int32_t one
 277.213 - * @param i2 pointer to int32_t two
 277.214 - * @param data omitted
 277.215 - * @return -1, if *i1 is less than *i2, 0 if both are equal,
 277.216 - * 1 if *i1 is greater than *i2
 277.217 - */
 277.218 -int ucx_cmp_int32(const void *i1, const void *i2, void *data);
 277.219 -
 277.220 -/**
 277.221 - * Compares two integers of type int64_t.
 277.222 - * @param i1 pointer to int64_t one
 277.223 - * @param i2 pointer to int64_t two
 277.224 - * @param data omitted
 277.225 - * @return -1, if *i1 is less than *i2, 0 if both are equal,
 277.226 - * 1 if *i1 is greater than *i2
 277.227 - */
 277.228 -int ucx_cmp_int64(const void *i1, const void *i2, void *data);
 277.229 -
 277.230 -/**
 277.231 - * Compares two integers of type unsigned int.
 277.232 - * @param i1 pointer to unsigned integer one
 277.233 - * @param i2 pointer to unsigned integer two
 277.234 - * @param data omitted
 277.235 - * @return -1, if *i1 is less than *i2, 0 if both are equal,
 277.236 - * 1 if *i1 is greater than *i2
 277.237 - */
 277.238 -int ucx_cmp_uint(const void *i1, const void *i2, void *data);
 277.239 -
 277.240 -/**
 277.241 - * Compares two integers of type unsigned long int.
 277.242 - * @param i1 pointer to unsigned long integer one
 277.243 - * @param i2 pointer to unsigned long integer two
 277.244 - * @param data omitted
 277.245 - * @return -1, if *i1 is less than *i2, 0 if both are equal,
 277.246 - * 1 if *i1 is greater than *i2
 277.247 - */
 277.248 -int ucx_cmp_ulongint(const void *i1, const void *i2, void *data);
 277.249 -
 277.250 -/**
 277.251 - * Compares two integers of type unsigned long long.
 277.252 - * @param i1 pointer to unsigned long long one
 277.253 - * @param i2 pointer to unsigned long long two
 277.254 - * @param data omitted
 277.255 - * @return -1, if *i1 is less than *i2, 0 if both are equal,
 277.256 - * 1 if *i1 is greater than *i2
 277.257 - */
 277.258 -int ucx_cmp_ulonglong(const void *i1, const void *i2, void *data);
 277.259 -
 277.260 -/**
 277.261 - * Compares two integers of type uint16_t.
 277.262 - * @param i1 pointer to uint16_t one
 277.263 - * @param i2 pointer to uint16_t two
 277.264 - * @param data omitted
 277.265 - * @return -1, if *i1 is less than *i2, 0 if both are equal,
 277.266 - * 1 if *i1 is greater than *i2
 277.267 - */
 277.268 -int ucx_cmp_uint16(const void *i1, const void *i2, void *data);
 277.269 -
 277.270 -/**
 277.271 - * Compares two integers of type uint32_t.
 277.272 - * @param i1 pointer to uint32_t one
 277.273 - * @param i2 pointer to uint32_t two
 277.274 - * @param data omitted
 277.275 - * @return -1, if *i1 is less than *i2, 0 if both are equal,
 277.276 - * 1 if *i1 is greater than *i2
 277.277 - */
 277.278 -int ucx_cmp_uint32(const void *i1, const void *i2, void *data);
 277.279 -
 277.280 -/**
 277.281 - * Compares two integers of type uint64_t.
 277.282 - * @param i1 pointer to uint64_t one
 277.283 - * @param i2 pointer to uint64_t two
 277.284 - * @param data omitted
 277.285 - * @return -1, if *i1 is less than *i2, 0 if both are equal,
 277.286 - * 1 if *i1 is greater than *i2
 277.287 - */
 277.288 -int ucx_cmp_uint64(const void *i1, const void *i2, void *data);
 277.289 -
 277.290 -/**
 277.291 - * Distance function for integers of type int.
 277.292 - * @param i1 pointer to integer one
 277.293 - * @param i2 pointer to integer two
 277.294 - * @param data omitted
 277.295 - * @return i1 minus i2
 277.296 - */
 277.297 -intmax_t ucx_dist_int(const void *i1, const void *i2, void *data);
 277.298 -
 277.299 -/**
 277.300 - * Distance function for integers of type long int.
 277.301 - * @param i1 pointer to long integer one
 277.302 - * @param i2 pointer to long integer two
 277.303 - * @param data omitted
 277.304 - * @return i1 minus i2
 277.305 - */
 277.306 -intmax_t ucx_dist_longint(const void *i1, const void *i2, void *data);
 277.307 -
 277.308 -/**
 277.309 - * Distance function for integers of type long long.
 277.310 - * @param i1 pointer to long long one
 277.311 - * @param i2 pointer to long long two
 277.312 - * @param data omitted
 277.313 - * @return i1 minus i2
 277.314 - */
 277.315 -intmax_t ucx_dist_longlong(const void *i1, const void *i2, void *data);
 277.316 -
 277.317 -/**
 277.318 - * Distance function for integers of type int16_t.
 277.319 - * @param i1 pointer to int16_t one
 277.320 - * @param i2 pointer to int16_t two
 277.321 - * @param data omitted
 277.322 - * @return i1 minus i2
 277.323 - */
 277.324 -intmax_t ucx_dist_int16(const void *i1, const void *i2, void *data);
 277.325 -
 277.326 -/**
 277.327 - * Distance function for integers of type int32_t.
 277.328 - * @param i1 pointer to int32_t one
 277.329 - * @param i2 pointer to int32_t two
 277.330 - * @param data omitted
 277.331 - * @return i1 minus i2
 277.332 - */
 277.333 -intmax_t ucx_dist_int32(const void *i1, const void *i2, void *data);
 277.334 -
 277.335 -/**
 277.336 - * Distance function for integers of type int64_t.
 277.337 - * @param i1 pointer to int64_t one
 277.338 - * @param i2 pointer to int64_t two
 277.339 - * @param data omitted
 277.340 - * @return i1 minus i2
 277.341 - */
 277.342 -intmax_t ucx_dist_int64(const void *i1, const void *i2, void *data);
 277.343 -
 277.344 -/**
 277.345 - * Distance function for integers of type unsigned int.
 277.346 - * @param i1 pointer to unsigned integer one
 277.347 - * @param i2 pointer to unsigned integer two
 277.348 - * @param data omitted
 277.349 - * @return i1 minus i2
 277.350 - */
 277.351 -intmax_t ucx_dist_uint(const void *i1, const void *i2, void *data);
 277.352 -
 277.353 -/**
 277.354 - * Distance function for integers of type unsigned long int.
 277.355 - * @param i1 pointer to unsigned long integer one
 277.356 - * @param i2 pointer to unsigned long integer two
 277.357 - * @param data omitted
 277.358 - * @return i1 minus i2
 277.359 - */
 277.360 -intmax_t ucx_dist_ulongint(const void *i1, const void *i2, void *data);
 277.361 -
 277.362 -/**
 277.363 - * Distance function for integers of type unsigned long long.
 277.364 - * @param i1 pointer to unsigned long long one
 277.365 - * @param i2 pointer to unsigned long long two
 277.366 - * @param data omitted
 277.367 - * @return i1 minus i2
 277.368 - */
 277.369 -intmax_t ucx_dist_ulonglong(const void *i1, const void *i2, void *data);
 277.370 -
 277.371 -/**
 277.372 - * Distance function for integers of type uint16_t.
 277.373 - * @param i1 pointer to uint16_t one
 277.374 - * @param i2 pointer to uint16_t two
 277.375 - * @param data omitted
 277.376 - * @return i1 minus i2
 277.377 - */
 277.378 -intmax_t ucx_dist_uint16(const void *i1, const void *i2, void *data);
 277.379 -
 277.380 -/**
 277.381 - * Distance function for integers of type uint32_t.
 277.382 - * @param i1 pointer to uint32_t one
 277.383 - * @param i2 pointer to uint32_t two
 277.384 - * @param data omitted
 277.385 - * @return i1 minus i2
 277.386 - */
 277.387 -intmax_t ucx_dist_uint32(const void *i1, const void *i2, void *data);
 277.388 -
 277.389 -/**
 277.390 - * Distance function for integers of type uint64_t.
 277.391 - * @param i1 pointer to uint64_t one
 277.392 - * @param i2 pointer to uint64_t two
 277.393 - * @param data omitted
 277.394 - * @return i1 minus i2
 277.395 - */
 277.396 -intmax_t ucx_dist_uint64(const void *i1, const void *i2, void *data);
 277.397 -
 277.398 -/**
 277.399 - * Compares two real numbers of type float.
 277.400 - * @param f1 pointer to float one
 277.401 - * @param f2 pointer to float two
 277.402 - * @param data if provided: a pointer to precision (default: 1e-6f)
 277.403 - * @return -1, if *f1 is less than *f2, 0 if both are equal,
 277.404 - * 1 if *f1 is greater than *f2
 277.405 - */
 277.406 -
 277.407 -int ucx_cmp_float(const void *f1, const void *f2, void *data);
 277.408 -
 277.409 -/**
 277.410 - * Compares two real numbers of type double.
 277.411 - * @param d1 pointer to double one
 277.412 - * @param d2 pointer to double two
 277.413 - * @param data if provided: a pointer to precision (default: 1e-14)
 277.414 - * @return -1, if *d1 is less than *d2, 0 if both are equal,
 277.415 - * 1 if *d1 is greater than *d2
 277.416 - */
 277.417 -int ucx_cmp_double(const void *d1, const void *d2, void *data);
 277.418 -
 277.419 -/**
 277.420 - * Compares two pointers.
 277.421 - * @param ptr1 pointer one
 277.422 - * @param ptr2 pointer two
 277.423 - * @param data omitted
 277.424 - * @return -1 if ptr1 is less than ptr2, 0 if both are equal,
 277.425 - * 1 if ptr1 is greater than ptr2
 277.426 - */
 277.427 -int ucx_cmp_ptr(const void *ptr1, const void *ptr2, void *data);
 277.428 -
 277.429 -/**
 277.430 - * Compares two memory areas.
 277.431 - * @param ptr1 pointer one
 277.432 - * @param ptr2 pointer two
 277.433 - * @param n a pointer to the size_t containing the third parameter for memcmp
 277.434 - * @return the result of memcmp(ptr1, ptr2, *n)
 277.435 - */
 277.436 -int ucx_cmp_mem(const void *ptr1, const void *ptr2, void *n);
 277.437 -
 277.438 -/**
 277.439 - * A <code>printf()</code> like function which writes the output to a stream by
 277.440 - * using a write_func().
 277.441 - * @param stream the stream the data is written to
 277.442 - * @param wfc the write function
 277.443 - * @param fmt format string
 277.444 - * @param ... additional arguments
 277.445 - * @return the total number of bytes written
 277.446 - */
 277.447 -int ucx_fprintf(void *stream, write_func wfc, const char *fmt, ...);
 277.448 -
 277.449 -/**
 277.450 - * <code>va_list</code> version of ucx_fprintf().
 277.451 - * @param stream the stream the data is written to
 277.452 - * @param wfc the write function
 277.453 - * @param fmt format string
 277.454 - * @param ap argument list
 277.455 - * @return the total number of bytes written
 277.456 - * @see ucx_fprintf()
 277.457 - */
 277.458 -int ucx_vfprintf(void *stream, write_func wfc, const char *fmt, va_list ap);
 277.459 -
 277.460 -/**
 277.461 - * A <code>printf()</code> like function which allocates space for a sstr_t
 277.462 - * the result is written to.
 277.463 - * 
 277.464 - * <b>Attention</b>: The sstr_t data is allocated with the allocators
 277.465 - * ucx_allocator_malloc() function. So it is implementation dependent, if
 277.466 - * the returned sstr_t.ptr pointer must be passed to the allocators
 277.467 - * ucx_allocator_free() function manually.
 277.468 - * 
 277.469 - * <b>Note</b>: The sstr_t.ptr of the return value will <i>always</i> be
 277.470 - * <code>NULL</code>-terminated.
 277.471 - * 
 277.472 - * @param allocator the UcxAllocator used for allocating the result sstr_t
 277.473 - * @param fmt format string
 277.474 - * @param ... additional arguments
 277.475 - * @return a sstr_t containing the formatted string
 277.476 - */
 277.477 -sstr_t ucx_asprintf(UcxAllocator *allocator, const char *fmt, ...);
 277.478 -
 277.479 -/**
 277.480 - * <code>va_list</code> version of ucx_asprintf().
 277.481 - * 
 277.482 - * @param allocator the UcxAllocator used for allocating the result sstr_t
 277.483 - * @param fmt format string
 277.484 - * @param ap argument list
 277.485 - * @return a sstr_t containing the formatted string
 277.486 - * @see ucx_asprintf()
 277.487 - */
 277.488 -sstr_t ucx_vasprintf(UcxAllocator *allocator, const char *fmt, va_list ap);
 277.489 -
 277.490 -/** Shortcut for ucx_asprintf() with default allocator. */
 277.491 -#define ucx_sprintf(...) \
 277.492 -    ucx_asprintf(ucx_default_allocator(), __VA_ARGS__)
 277.493 -
 277.494 -/**
 277.495 - * A <code>printf()</code> like function which writes the output to a
 277.496 - * UcxBuffer.
 277.497 - * 
 277.498 - * @param buffer the buffer the data is written to
 277.499 - * @param ... format string and additional arguments
 277.500 - * @return the total number of bytes written
 277.501 - * @see ucx_fprintf()
 277.502 - */
 277.503 -#define ucx_bprintf(buffer, ...) ucx_fprintf((UcxBuffer*)buffer, \
 277.504 -        (write_func)ucx_buffer_write, __VA_ARGS__)
 277.505 -
 277.506 -#ifdef __cplusplus
 277.507 -}
 277.508 -#endif
 277.509 -
 277.510 -#endif /* UCX_UTILS_H */
 277.511 -
   278.1 --- a/src/utils.c	Mon Dec 30 09:54:10 2019 +0100
   278.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   278.3 @@ -1,448 +0,0 @@
   278.4 -/*
   278.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   278.6 - *
   278.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   278.8 - *
   278.9 - * Redistribution and use in source and binary forms, with or without
  278.10 - * modification, are permitted provided that the following conditions are met:
  278.11 - *
  278.12 - *   1. Redistributions of source code must retain the above copyright
  278.13 - *      notice, this list of conditions and the following disclaimer.
  278.14 - *
  278.15 - *   2. Redistributions in binary form must reproduce the above copyright
  278.16 - *      notice, this list of conditions and the following disclaimer in the
  278.17 - *      documentation and/or other materials provided with the distribution.
  278.18 - *
  278.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  278.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  278.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  278.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  278.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  278.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  278.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  278.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  278.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  278.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  278.29 - * POSSIBILITY OF SUCH DAMAGE.
  278.30 - */
  278.31 -
  278.32 -#include "ucx/utils.h"
  278.33 -
  278.34 -#include <math.h>
  278.35 -#include <stdio.h>
  278.36 -#include <limits.h>
  278.37 -#include <errno.h>
  278.38 -
  278.39 -/* COPY FUCNTIONS */
  278.40 -void* ucx_strcpy(const void* s, void* data) {
  278.41 -    const char *str = (const char*) s;
  278.42 -    size_t n = 1+strlen(str);
  278.43 -    char *cpy = (char*) malloc(n);
  278.44 -    memcpy(cpy, str, n);
  278.45 -    return cpy;
  278.46 -}
  278.47 -
  278.48 -void* ucx_memcpy(const void* m, void* n) {
  278.49 -    size_t k = *((size_t*)n);
  278.50 -    void *cpy = malloc(k);
  278.51 -    memcpy(cpy, m, k);
  278.52 -    return cpy;
  278.53 -}
  278.54 -
  278.55 -size_t ucx_stream_bncopy(void *src, void *dest, read_func readfnc,
  278.56 -        write_func writefnc, char* buf, size_t bufsize, size_t n) {
  278.57 -    if(n == 0 || bufsize == 0) {
  278.58 -        return 0;
  278.59 -    }
  278.60 -    
  278.61 -    char *lbuf;    
  278.62 -    size_t ncp = 0;
  278.63 -    
  278.64 -    if(buf) {
  278.65 -        lbuf = buf;
  278.66 -    } else {
  278.67 -        lbuf = (char*)malloc(bufsize);
  278.68 -        if(lbuf == NULL) {
  278.69 -            return 0;
  278.70 -        }
  278.71 -    }
  278.72 -    
  278.73 -    size_t r;
  278.74 -    size_t rn = bufsize > n ? n : bufsize;
  278.75 -    while((r = readfnc(lbuf, 1, rn, src)) != 0) {
  278.76 -        r = writefnc(lbuf, 1, r, dest);
  278.77 -        ncp += r;
  278.78 -        n -= r;
  278.79 -        rn = bufsize > n ? n : bufsize;
  278.80 -        if(r == 0 || n == 0) {
  278.81 -            break;
  278.82 -        }
  278.83 -    }
  278.84 -    
  278.85 -    if (lbuf != buf) {
  278.86 -        free(lbuf);
  278.87 -    }
  278.88 -    
  278.89 -    return ncp;
  278.90 -}
  278.91 -
  278.92 -/* COMPARE FUNCTIONS */
  278.93 -
  278.94 -int ucx_cmp_str(const void *s1, const void *s2, void *data) {
  278.95 -    return strcmp((const char*)s1, (const char*)s2);
  278.96 -}
  278.97 -
  278.98 -int ucx_cmp_strn(const void *s1, const void *s2, void *n) {
  278.99 -    return strncmp((const char*)s1, (const char*)s2, *((size_t*) n));
 278.100 -}
 278.101 -
 278.102 -int ucx_cmp_sstr(const void *s1, const void *s2, void *data) {
 278.103 -    sstr_t a = *(const sstr_t*) s1;
 278.104 -    sstr_t b = *(const sstr_t*) s2;
 278.105 -    return sstrcmp(a, b);
 278.106 -}
 278.107 -
 278.108 -int ucx_cmp_int(const void *i1, const void *i2, void *data) {
 278.109 -   int a = *((const int*) i1);
 278.110 -   int b = *((const int*) i2);
 278.111 -   if (a == b) {
 278.112 -       return 0;
 278.113 -   } else {
 278.114 -       return a < b ? -1 : 1;
 278.115 -   }
 278.116 -}
 278.117 -
 278.118 -int ucx_cmp_longint(const void *i1, const void *i2, void *data) {
 278.119 -   long int a = *((const long int*) i1);
 278.120 -   long int b = *((const long int*) i2);
 278.121 -   if (a == b) {
 278.122 -       return 0;
 278.123 -   } else {
 278.124 -       return a < b ? -1 : 1;
 278.125 -   }
 278.126 -}
 278.127 -
 278.128 -int ucx_cmp_longlong(const void *i1, const void *i2, void *data) {
 278.129 -   long long a = *((const long long*) i1);
 278.130 -   long long b = *((const long long*) i2);
 278.131 -   if (a == b) {
 278.132 -       return 0;
 278.133 -   } else {
 278.134 -       return a < b ? -1 : 1;
 278.135 -   }
 278.136 -}
 278.137 -
 278.138 -int ucx_cmp_int16(const void *i1, const void *i2, void *data) {
 278.139 -   int16_t a = *((const int16_t*) i1);
 278.140 -   int16_t b = *((const int16_t*) i2);
 278.141 -   if (a == b) {
 278.142 -       return 0;
 278.143 -   } else {
 278.144 -       return a < b ? -1 : 1;
 278.145 -   }
 278.146 -}
 278.147 -
 278.148 -int ucx_cmp_int32(const void *i1, const void *i2, void *data) {
 278.149 -   int32_t a = *((const int32_t*) i1);
 278.150 -   int32_t b = *((const int32_t*) i2);
 278.151 -   if (a == b) {
 278.152 -       return 0;
 278.153 -   } else {
 278.154 -       return a < b ? -1 : 1;
 278.155 -   }
 278.156 -}
 278.157 -
 278.158 -int ucx_cmp_int64(const void *i1, const void *i2, void *data) {
 278.159 -   int64_t a = *((const int64_t*) i1);
 278.160 -   int64_t b = *((const int64_t*) i2);
 278.161 -   if (a == b) {
 278.162 -       return 0;
 278.163 -   } else {
 278.164 -       return a < b ? -1 : 1;
 278.165 -   }
 278.166 -}
 278.167 -
 278.168 -int ucx_cmp_uint(const void *i1, const void *i2, void *data) {
 278.169 -   unsigned int a = *((const unsigned int*) i1);
 278.170 -   unsigned int b = *((const unsigned int*) i2);
 278.171 -   if (a == b) {
 278.172 -       return 0;
 278.173 -   } else {
 278.174 -       return a < b ? -1 : 1;
 278.175 -   }
 278.176 -}
 278.177 -
 278.178 -int ucx_cmp_ulongint(const void *i1, const void *i2, void *data) {
 278.179 -   unsigned long int a = *((const unsigned long int*) i1);
 278.180 -   unsigned long int b = *((const unsigned long int*) i2);
 278.181 -   if (a == b) {
 278.182 -       return 0;
 278.183 -   } else {
 278.184 -       return a < b ? -1 : 1;
 278.185 -   }
 278.186 -}
 278.187 -
 278.188 -int ucx_cmp_ulonglong(const void *i1, const void *i2, void *data) {
 278.189 -   unsigned long long a = *((const unsigned long long*) i1);
 278.190 -   unsigned long long b = *((const unsigned long long*) i2);
 278.191 -   if (a == b) {
 278.192 -       return 0;
 278.193 -   } else {
 278.194 -       return a < b ? -1 : 1;
 278.195 -   }
 278.196 -}
 278.197 -
 278.198 -int ucx_cmp_uint16(const void *i1, const void *i2, void *data) {
 278.199 -   uint16_t a = *((const uint16_t*) i1);
 278.200 -   uint16_t b = *((const uint16_t*) i2);
 278.201 -   if (a == b) {
 278.202 -       return 0;
 278.203 -   } else {
 278.204 -       return a < b ? -1 : 1;
 278.205 -   }
 278.206 -}
 278.207 -
 278.208 -int ucx_cmp_uint32(const void *i1, const void *i2, void *data) {
 278.209 -   uint32_t a = *((const uint32_t*) i1);
 278.210 -   uint32_t b = *((const uint32_t*) i2);
 278.211 -   if (a == b) {
 278.212 -       return 0;
 278.213 -   } else {
 278.214 -       return a < b ? -1 : 1;
 278.215 -   }
 278.216 -}
 278.217 -
 278.218 -int ucx_cmp_uint64(const void *i1, const void *i2, void *data) {
 278.219 -   uint64_t a = *((const uint64_t*) i1);
 278.220 -   uint64_t b = *((const uint64_t*) i2);
 278.221 -   if (a == b) {
 278.222 -       return 0;
 278.223 -   } else {
 278.224 -       return a < b ? -1 : 1;
 278.225 -   }
 278.226 -}
 278.227 -
 278.228 -intmax_t ucx_dist_int(const void *i1, const void *i2, void *data) {
 278.229 -   intmax_t a = *((const int*) i1);
 278.230 -   intmax_t b = *((const int*) i2);
 278.231 -   return a - b;
 278.232 -}
 278.233 -
 278.234 -intmax_t ucx_dist_longint(const void *i1, const void *i2, void *data) {
 278.235 -   intmax_t a = *((const long int*) i1);
 278.236 -   intmax_t b = *((const long int*) i2);
 278.237 -   return a - b;
 278.238 -}
 278.239 -
 278.240 -intmax_t ucx_dist_longlong(const void *i1, const void *i2, void *data) {
 278.241 -   intmax_t a = *((const long long*) i1);
 278.242 -   intmax_t b = *((const long long*) i2);
 278.243 -   return a - b;
 278.244 -}
 278.245 -
 278.246 -intmax_t ucx_dist_int16(const void *i1, const void *i2, void *data) {
 278.247 -   intmax_t a = *((const int16_t*) i1);
 278.248 -   intmax_t b = *((const int16_t*) i2);
 278.249 -   return a - b;
 278.250 -}
 278.251 -
 278.252 -intmax_t ucx_dist_int32(const void *i1, const void *i2, void *data) {
 278.253 -   intmax_t a = *((const int32_t*) i1);
 278.254 -   intmax_t b = *((const int32_t*) i2);
 278.255 -   return a - b;
 278.256 -}
 278.257 -
 278.258 -intmax_t ucx_dist_int64(const void *i1, const void *i2, void *data) {
 278.259 -   intmax_t a = *((const int64_t*) i1);
 278.260 -   intmax_t b = *((const int64_t*) i2);
 278.261 -   return a - b;
 278.262 -}
 278.263 -
 278.264 -intmax_t ucx_dist_uint(const void *i1, const void *i2, void *data) {
 278.265 -   uintmax_t a = *((const unsigned int*) i1);
 278.266 -   uintmax_t b = *((const unsigned int*) i2);
 278.267 -   return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a);
 278.268 -}
 278.269 -
 278.270 -intmax_t ucx_dist_ulongint(const void *i1, const void *i2, void *data) {
 278.271 -   uintmax_t a = *((const unsigned long int*) i1);
 278.272 -   uintmax_t b = *((const unsigned long int*) i2);
 278.273 -   return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a);
 278.274 -}
 278.275 -
 278.276 -intmax_t ucx_dist_ulonglong(const void *i1, const void *i2, void *data) {
 278.277 -   uintmax_t a = *((const unsigned long long*) i1);
 278.278 -   uintmax_t b = *((const unsigned long long*) i2);
 278.279 -   return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a);
 278.280 -}
 278.281 -
 278.282 -intmax_t ucx_dist_uint16(const void *i1, const void *i2, void *data) {
 278.283 -   uintmax_t a = *((const uint16_t*) i1);
 278.284 -   uintmax_t b = *((const uint16_t*) i2);
 278.285 -   return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a);
 278.286 -}
 278.287 -
 278.288 -intmax_t ucx_dist_uint32(const void *i1, const void *i2, void *data) {
 278.289 -   uintmax_t a = *((const uint32_t*) i1);
 278.290 -   uintmax_t b = *((const uint32_t*) i2);
 278.291 -   return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a);
 278.292 -}
 278.293 -
 278.294 -intmax_t ucx_dist_uint64(const void *i1, const void *i2, void *data) {
 278.295 -   uintmax_t a = *((const uint64_t*) i1);
 278.296 -   uintmax_t b = *((const uint64_t*) i2);
 278.297 -   return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a);
 278.298 -}
 278.299 -
 278.300 -int ucx_cmp_float(const void *f1, const void *f2, void *epsilon) {
 278.301 -   float a = *((const float*) f1);
 278.302 -   float b = *((const float*) f2);
 278.303 -   float e = !epsilon ? 1e-6f : *((float*)epsilon);
 278.304 -   if (fabsf(a - b) < e) {
 278.305 -       return 0;
 278.306 -   } else {
 278.307 -       return a < b ? -1 : 1;
 278.308 -   }
 278.309 -}
 278.310 -
 278.311 -int ucx_cmp_double(const void *d1, const void *d2, void *epsilon) {
 278.312 -   double a = *((const double*) d1);
 278.313 -   double b = *((const double*) d2);
 278.314 -   double e = !epsilon ? 1e-14 : *((double*)epsilon);
 278.315 -   if (fabs(a - b) < e) {
 278.316 -       return 0;
 278.317 -   } else {
 278.318 -       return a < b ? -1 : 1;
 278.319 -   }
 278.320 -}
 278.321 -
 278.322 -int ucx_cmp_ptr(const void *ptr1, const void *ptr2, void *data) {
 278.323 -    const intptr_t p1 = (const intptr_t) ptr1;
 278.324 -    const intptr_t p2 = (const intptr_t) ptr2;
 278.325 -    if (p1 == p2) {
 278.326 -        return 0;
 278.327 -    } else {
 278.328 -        return p1  < p2 ? -1 : 1;
 278.329 -    }
 278.330 -}
 278.331 -
 278.332 -int ucx_cmp_mem(const void *ptr1, const void *ptr2, void *n) {
 278.333 -    return memcmp(ptr1, ptr2, *((size_t*)n));
 278.334 -}
 278.335 -
 278.336 -/* PRINTF FUNCTIONS */
 278.337 -
 278.338 -#ifdef va_copy
 278.339 -#define UCX_PRINTF_BUFSIZE 256
 278.340 -#else
 278.341 -#pragma message("WARNING: C99 va_copy macro not supported by this platform" \
 278.342 -                " - limiting ucx_*printf to 2 KiB")
 278.343 -#define UCX_PRINTF_BUFSIZE 0x800
 278.344 -#endif
 278.345 -
 278.346 -int ucx_fprintf(void *stream, write_func wfc, const char *fmt, ...) {
 278.347 -    int ret;
 278.348 -    va_list ap;
 278.349 -    va_start(ap, fmt);
 278.350 -    ret = ucx_vfprintf(stream, wfc, fmt, ap);
 278.351 -    va_end(ap);
 278.352 -    return ret;
 278.353 -}
 278.354 -
 278.355 -int ucx_vfprintf(void *stream, write_func wfc, const char *fmt, va_list ap) {
 278.356 -    char buf[UCX_PRINTF_BUFSIZE];
 278.357 -#ifdef va_copy
 278.358 -    va_list ap2;
 278.359 -    va_copy(ap2, ap);
 278.360 -    int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap);
 278.361 -    if (ret < 0) {
 278.362 -        return ret;
 278.363 -    } else if (ret < UCX_PRINTF_BUFSIZE) {
 278.364 -        return (int)wfc(buf, 1, ret, stream);
 278.365 -    } else {
 278.366 -        if (ret == INT_MAX) {
 278.367 -            errno = ENOMEM;
 278.368 -            return -1;
 278.369 -        }
 278.370 -        
 278.371 -        int len = ret + 1;
 278.372 -        char *newbuf = (char*)malloc(len);
 278.373 -        if (!newbuf) {
 278.374 -            return -1;
 278.375 -        }
 278.376 -        
 278.377 -        ret = vsnprintf(newbuf, len, fmt, ap2);
 278.378 -        if (ret > 0) {
 278.379 -            ret = (int)wfc(newbuf, 1, ret, stream);
 278.380 -        }
 278.381 -        free(newbuf);
 278.382 -    }
 278.383 -    return ret;
 278.384 -#else
 278.385 -    int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap);
 278.386 -    if (ret < 0) {
 278.387 -        return ret;
 278.388 -    } else if (ret < UCX_PRINTF_BUFSIZE) {
 278.389 -        return (int)wfc(buf, 1, ret, stream);
 278.390 -    } else {
 278.391 -        errno = ENOMEM;
 278.392 -        return -1;
 278.393 -    }
 278.394 -#endif
 278.395 -}
 278.396 -
 278.397 -sstr_t ucx_asprintf(UcxAllocator *allocator, const char *fmt, ...) {
 278.398 -    va_list ap;
 278.399 -    sstr_t ret;
 278.400 -    va_start(ap, fmt);
 278.401 -    ret = ucx_vasprintf(allocator, fmt, ap);
 278.402 -    va_end(ap);
 278.403 -    return ret;
 278.404 -}
 278.405 -
 278.406 -sstr_t ucx_vasprintf(UcxAllocator *a, const char *fmt, va_list ap) {
 278.407 -    sstr_t s;
 278.408 -    s.ptr = NULL;
 278.409 -    s.length = 0;
 278.410 -    char buf[UCX_PRINTF_BUFSIZE];
 278.411 -#ifdef va_copy
 278.412 -    va_list ap2;
 278.413 -    va_copy(ap2, ap);
 278.414 -    int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap);
 278.415 -    if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) {
 278.416 -        s.ptr = (char*)almalloc(a, ret + 1);
 278.417 -        if (s.ptr) {
 278.418 -            s.length = (size_t)ret;
 278.419 -            memcpy(s.ptr, buf, ret);
 278.420 -            s.ptr[s.length] = '\0';
 278.421 -        }
 278.422 -    } else if (ret == INT_MAX) {
 278.423 -        errno = ENOMEM;
 278.424 -    } else  {
 278.425 -        int len = ret + 1;
 278.426 -        s.ptr = (char*)almalloc(a, len);
 278.427 -        if (s.ptr) {
 278.428 -            ret = vsnprintf(s.ptr, len, fmt, ap2);
 278.429 -            if (ret < 0) {
 278.430 -                free(s.ptr);
 278.431 -                s.ptr = NULL;
 278.432 -            } else {
 278.433 -                s.length = (size_t)ret;
 278.434 -            }
 278.435 -        }
 278.436 -    }
 278.437 -#else
 278.438 -    int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap);
 278.439 -    if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) {
 278.440 -        s.ptr = (char*)almalloc(a, ret + 1);
 278.441 -        if (s.ptr) {
 278.442 -            s.length = (size_t)ret;
 278.443 -            memcpy(s.ptr, buf, ret);
 278.444 -            s.ptr[s.length] = '\0';
 278.445 -        }
 278.446 -    } else {
 278.447 -        errno = ENOMEM;
 278.448 -    }
 278.449 -#endif
 278.450 -    return s;
 278.451 -}
   279.1 --- a/test/CMakeLists.txt	Mon Dec 30 09:54:10 2019 +0100
   279.2 +++ b/test/CMakeLists.txt	Sat Feb 06 19:11:44 2021 +0100
   279.3 @@ -1,17 +1,6 @@
   279.4 -add_executable(ucxtest
   279.5 -        allocator_tests.c
   279.6 -        array_tests.c
   279.7 -        avl_tests.c
   279.8 -        buffer_tests.c
   279.9 -        list_tests.c
  279.10 -        logging_tests.c
  279.11 -        main.c
  279.12 -        map_tests.c
  279.13 -        mpool_tests.c
  279.14 -        prop_tests.c
  279.15 -        stack_tests.c
  279.16 -        string_tests.c
  279.17 -        utils_tests.c
  279.18 +
  279.19 +add_executable(test_list
  279.20 +        test_list.c
  279.21  )
  279.22 -
  279.23 -target_link_libraries(ucxtest PRIVATE ucx_static)
  279.24 +target_link_libraries(test_list PRIVATE ucx_static)
  279.25 +add_test(NAME list COMMAND test_list WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
   280.1 --- a/test/Makefile.am	Mon Dec 30 09:54:10 2019 +0100
   280.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   280.3 @@ -1,62 +0,0 @@
   280.4 -#
   280.5 -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   280.6 -#
   280.7 -# Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   280.8 -#
   280.9 -# Redistribution and use in source and binary forms, with or without
  280.10 -# modification, are permitted provided that the following conditions are met:
  280.11 -#
  280.12 -#   1. Redistributions of source code must retain the above copyright
  280.13 -#      notice, this list of conditions and the following disclaimer.
  280.14 -#
  280.15 -#   2. Redistributions in binary form must reproduce the above copyright
  280.16 -#      notice, this list of conditions and the following disclaimer in the
  280.17 -#      documentation and/or other materials provided with the distribution.
  280.18 -#
  280.19 -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  280.20 -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  280.21 -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  280.22 -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  280.23 -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  280.24 -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  280.25 -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  280.26 -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  280.27 -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  280.28 -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  280.29 -# POSSIBILITY OF SUCH DAMAGE.
  280.30 -#
  280.31 -
  280.32 -TESTS = ucxtest
  280.33 -check_PROGRAMS = ucxtest
  280.34 -ucxtest_CFLAGS = -I$(top_srcdir)/src
  280.35 -
  280.36 -ucxtest_SOURCES = main.c
  280.37 -ucxtest_SOURCES += allocator_tests.c
  280.38 -ucxtest_SOURCES += array_tests.c
  280.39 -ucxtest_SOURCES += list_tests.c
  280.40 -ucxtest_SOURCES += avl_tests.c
  280.41 -ucxtest_SOURCES += mpool_tests.c
  280.42 -ucxtest_SOURCES += stack_tests.c
  280.43 -ucxtest_SOURCES += map_tests.c
  280.44 -ucxtest_SOURCES += prop_tests.c
  280.45 -ucxtest_SOURCES += string_tests.c
  280.46 -ucxtest_SOURCES += logging_tests.c
  280.47 -ucxtest_SOURCES += buffer_tests.c
  280.48 -ucxtest_SOURCES += utils_tests.c
  280.49 -
  280.50 -ucxtest_SOURCES += main.h
  280.51 -ucxtest_SOURCES += allocator_tests.h
  280.52 -ucxtest_SOURCES += array_tests.h
  280.53 -ucxtest_SOURCES += list_tests.h
  280.54 -ucxtest_SOURCES += avl_tests.h
  280.55 -ucxtest_SOURCES += mpool_tests.h
  280.56 -ucxtest_SOURCES += stack_tests.h
  280.57 -ucxtest_SOURCES += map_tests.h
  280.58 -ucxtest_SOURCES += prop_tests.h
  280.59 -ucxtest_SOURCES += string_tests.h
  280.60 -ucxtest_SOURCES += logging_tests.h
  280.61 -ucxtest_SOURCES += buffer_tests.h
  280.62 -ucxtest_SOURCES += utils_tests.h
  280.63 -
  280.64 -ucxtest_LDFLAGS = -static
  280.65 -ucxtest_LDADD = ../src/libucx.la
   281.1 --- a/test/allocator_tests.c	Mon Dec 30 09:54:10 2019 +0100
   281.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   281.3 @@ -1,41 +0,0 @@
   281.4 -/*
   281.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   281.6 - *
   281.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   281.8 - *
   281.9 - * Redistribution and use in source and binary forms, with or without
  281.10 - * modification, are permitted provided that the following conditions are met:
  281.11 - *
  281.12 - *   1. Redistributions of source code must retain the above copyright
  281.13 - *      notice, this list of conditions and the following disclaimer.
  281.14 - *
  281.15 - *   2. Redistributions in binary form must reproduce the above copyright
  281.16 - *      notice, this list of conditions and the following disclaimer in the
  281.17 - *      documentation and/or other materials provided with the distribution.
  281.18 - *
  281.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  281.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  281.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  281.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  281.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  281.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  281.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  281.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  281.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  281.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  281.29 - * POSSIBILITY OF SUCH DAMAGE.
  281.30 - */
  281.31 -
  281.32 -#include "allocator_tests.h"
  281.33 -
  281.34 -UCX_TEST(test_ucx_default_allocator) {
  281.35 -    UcxAllocator *alloc = ucx_default_allocator();
  281.36 -    
  281.37 -    UCX_TEST_BEGIN
  281.38 -    UCX_TEST_ASSERT(alloc->pool == NULL, "pool must be NULL");
  281.39 -    UCX_TEST_ASSERT(alloc->malloc == ucx_default_malloc, "wrong malloc");
  281.40 -    UCX_TEST_ASSERT(alloc->calloc == ucx_default_calloc, "wrong calloc");
  281.41 -    UCX_TEST_ASSERT(alloc->realloc == ucx_default_realloc, "wrong realloc");
  281.42 -    UCX_TEST_ASSERT(alloc->free == ucx_default_free, "wrong free");
  281.43 -    UCX_TEST_END
  281.44 -}
   282.1 --- a/test/allocator_tests.h	Mon Dec 30 09:54:10 2019 +0100
   282.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   282.3 @@ -1,46 +0,0 @@
   282.4 -/*
   282.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   282.6 - *
   282.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   282.8 - *
   282.9 - * Redistribution and use in source and binary forms, with or without
  282.10 - * modification, are permitted provided that the following conditions are met:
  282.11 - *
  282.12 - *   1. Redistributions of source code must retain the above copyright
  282.13 - *      notice, this list of conditions and the following disclaimer.
  282.14 - *
  282.15 - *   2. Redistributions in binary form must reproduce the above copyright
  282.16 - *      notice, this list of conditions and the following disclaimer in the
  282.17 - *      documentation and/or other materials provided with the distribution.
  282.18 - *
  282.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  282.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  282.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  282.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  282.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  282.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  282.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  282.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  282.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  282.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  282.29 - * POSSIBILITY OF SUCH DAMAGE.
  282.30 - */
  282.31 -
  282.32 -#ifndef ALLOCATOR_TEST_H
  282.33 -#define	ALLOCATOR_TEST_H
  282.34 -
  282.35 -#include <ucx/test.h>
  282.36 -#include <ucx/allocator.h>
  282.37 -
  282.38 -#ifdef	__cplusplus
  282.39 -extern "C" {
  282.40 -#endif
  282.41 -
  282.42 -UCX_TEST(test_ucx_default_allocator);
  282.43 -
  282.44 -#ifdef	__cplusplus
  282.45 -}
  282.46 -#endif
  282.47 -
  282.48 -#endif	/* ALLOCATOR_TEST_H */
  282.49 -
   283.1 --- a/test/array_tests.c	Mon Dec 30 09:54:10 2019 +0100
   283.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   283.3 @@ -1,642 +0,0 @@
   283.4 -/*
   283.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   283.6 - *
   283.7 - * Copyright 2019 Mike Becker, Olaf Wintermann All rights reserved.
   283.8 - *
   283.9 - * Redistribution and use in source and binary forms, with or without
  283.10 - * modification, are permitted provided that the following conditions are met:
  283.11 - *
  283.12 - *   1. Redistributions of source code must retain the above copyright
  283.13 - *      notice, this list of conditions and the following disclaimer.
  283.14 - *
  283.15 - *   2. Redistributions in binary form must reproduce the above copyright
  283.16 - *      notice, this list of conditions and the following disclaimer in the
  283.17 - *      documentation and/or other materials provided with the distribution.
  283.18 - *
  283.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  283.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  283.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  283.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  283.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  283.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  283.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  283.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  283.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  283.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  283.29 - * POSSIBILITY OF SUCH DAMAGE.
  283.30 - */
  283.31 -
  283.32 -#include "array_tests.h"
  283.33 -#include <ucx/utils.h>
  283.34 -
  283.35 -UCX_TEST(test_ucx_array_destroy) {
  283.36 -    UcxArray array;
  283.37 -    ucx_array_init(&array, 16, sizeof(int));
  283.38 -    
  283.39 -    UCX_TEST_BEGIN
  283.40 -    ucx_array_destroy(&array);
  283.41 -    UCX_TEST_ASSERT(array.data == NULL, "data pointer not NULL after destroy");
  283.42 -    UCX_TEST_ASSERT(array.size == 0, "size not zero after destroy");
  283.43 -    UCX_TEST_ASSERT(array.capacity == 0, "capacity not zero after destroy");
  283.44 -    UCX_TEST_ASSERT(array.allocator == ucx_default_allocator(),
  283.45 -            "allocator corrupted during destroy");
  283.46 -    UCX_TEST_END
  283.47 -}
  283.48 -
  283.49 -UCX_TEST(test_ucx_array_new) {
  283.50 -    UcxArray* array = ucx_array_new(16, 47);
  283.51 -    
  283.52 -    UCX_TEST_BEGIN
  283.53 -    UCX_TEST_ASSERT(array->data, "no memory allocated");
  283.54 -    UCX_TEST_ASSERT(array->size == 0, "size not initially zero");
  283.55 -    UCX_TEST_ASSERT(array->capacity == 16, "capacity not as requested");
  283.56 -    UCX_TEST_ASSERT(array->elemsize == 47, "element size not as requested");
  283.57 -    UCX_TEST_ASSERT(array->allocator == ucx_default_allocator(),
  283.58 -            "array not using the default allocator");
  283.59 -    UCX_TEST_END
  283.60 -    ucx_array_free(array);
  283.61 -}
  283.62 -
  283.63 -UCX_TEST(test_ucx_array_append_from) {
  283.64 -    UcxArray *array = ucx_array_new(16, sizeof(int));
  283.65 -    int *elements;
  283.66 -    
  283.67 -    int x = 42;
  283.68 -    ucx_array_append_from(array, &x, 1);
  283.69 -    UCX_TEST_BEGIN
  283.70 -    
  283.71 -    elements = array->data;
  283.72 -    UCX_TEST_ASSERT(elements[0] == 42, "failed");
  283.73 -    
  283.74 -    int y[2] = {13, 37};
  283.75 -    ucx_array_append_from(array, y, 2);
  283.76 -    
  283.77 -    elements = array->data;
  283.78 -    UCX_TEST_ASSERT(array->size == 3, "incorrect size after append");
  283.79 -    UCX_TEST_ASSERT(elements[1] == 13, "failed");
  283.80 -    UCX_TEST_ASSERT(elements[2] == 37, "failed");
  283.81 -    UCX_TEST_ASSERT(elements[0] == 42,
  283.82 -            "append corrupted previously inserted data");
  283.83 -    
  283.84 -    ucx_array_append_from(array, NULL, 2);
  283.85 -    
  283.86 -    elements = array->data;
  283.87 -    UCX_TEST_ASSERT(array->size == 5, "incorrect size after NULL append");
  283.88 -    UCX_TEST_ASSERT(elements[3] == 0, "element is not zeroed");
  283.89 -    UCX_TEST_ASSERT(elements[4] == 0, "element is not zeroed");
  283.90 -    UCX_TEST_ASSERT(elements[0] == 42,
  283.91 -            "NULL append corrupted previously inserted data");
  283.92 -    UCX_TEST_ASSERT(elements[1] == 13,
  283.93 -            "NULL append corrupted previously inserted data");
  283.94 -    UCX_TEST_ASSERT(elements[2] == 37,
  283.95 -            "NULL append corrupted previously inserted data");
  283.96 -    
  283.97 -    UCX_TEST_END
  283.98 -    
  283.99 -    ucx_array_free(array);
 283.100 -}
 283.101 -
 283.102 -UCX_TEST(test_ucx_array_append_from_struct) {
 283.103 -    struct teststruct {
 283.104 -        unsigned long long x;
 283.105 -        unsigned long long y;
 283.106 -        unsigned long long z;
 283.107 -    };
 283.108 -    
 283.109 -    UcxArray *array = ucx_array_new(16, sizeof(struct teststruct));
 283.110 -    struct teststruct *elements;
 283.111 -    
 283.112 -    struct teststruct data;
 283.113 -    data.x = 13; data.y = 37; data.z = 47;
 283.114 -    
 283.115 -    ucx_array_append_from(array, &data, 1);
 283.116 -    UCX_TEST_BEGIN
 283.117 -    
 283.118 -    elements = array->data;
 283.119 -    UCX_TEST_ASSERT(elements[0].x == 13, "failed");
 283.120 -    UCX_TEST_ASSERT(elements[0].y == 37, "failed");
 283.121 -    UCX_TEST_ASSERT(elements[0].z == 47, "failed");
 283.122 -    
 283.123 -    data.x = 0; data.y = 8; data.z = 15;
 283.124 -    ucx_array_append_from(array, &data, 1);
 283.125 -    
 283.126 -    elements = array->data;
 283.127 -    UCX_TEST_ASSERT(array->size == 2, "incorrect size after append");
 283.128 -    UCX_TEST_ASSERT(elements[1].x == 0, "failed");
 283.129 -    UCX_TEST_ASSERT(elements[1].y == 8, "failed");
 283.130 -    UCX_TEST_ASSERT(elements[1].z == 15, "failed");
 283.131 -    
 283.132 -    UCX_TEST_ASSERT(elements[0].x == 13,
 283.133 -            "append corrupted previously inserted data");
 283.134 -    UCX_TEST_ASSERT(elements[0].y == 37,
 283.135 -            "append corrupted previously inserted data");
 283.136 -    UCX_TEST_ASSERT(elements[0].z == 47,
 283.137 -            "append corrupted previously inserted data");
 283.138 -    
 283.139 -    UCX_TEST_END
 283.140 -    
 283.141 -    ucx_array_destroy(array);
 283.142 -}
 283.143 -
 283.144 -UCX_TEST(test_ucx_array_prepend_from) {
 283.145 -    int *elems;
 283.146 -    UcxArray *array = ucx_array_new(16, sizeof(int));
 283.147 -    
 283.148 -    int x = 42;
 283.149 -    ucx_array_prepend_from(array, &x, 1);
 283.150 -    UCX_TEST_BEGIN
 283.151 -    
 283.152 -    elems = array->data;
 283.153 -    UCX_TEST_ASSERT(elems[0] == 42, "failed");
 283.154 -    
 283.155 -    int y[2] = {13, 37};
 283.156 -    ucx_array_prepend_from(array, y, 2);
 283.157 -    
 283.158 -    elems = array->data;
 283.159 -    UCX_TEST_ASSERT(array->size == 3, "incorrect size after prepend");
 283.160 -    UCX_TEST_ASSERT(elems[0] == 13, "failed");
 283.161 -    UCX_TEST_ASSERT(elems[1] == 37, "failed");
 283.162 -    UCX_TEST_ASSERT(elems[2] == 42,
 283.163 -            "prepend corrupted previously inserted data");
 283.164 -    
 283.165 -    ucx_array_prepend_from(array, NULL, 2);
 283.166 -    
 283.167 -    elems = array->data;
 283.168 -    UCX_TEST_ASSERT(array->size == 5, "incorrect size after NULL prepend");
 283.169 -    UCX_TEST_ASSERT(elems[0] == 0, "element is not zeroed");
 283.170 -    UCX_TEST_ASSERT(elems[1] == 0, "element is not zeroed");
 283.171 -    UCX_TEST_ASSERT(elems[2] == 13,
 283.172 -            "NULL prepend corrupted previously inserted data");
 283.173 -    UCX_TEST_ASSERT(elems[3] == 37,
 283.174 -            "NULL prepend corrupted previously inserted data");
 283.175 -    UCX_TEST_ASSERT(elems[4] == 42,
 283.176 -            "NULL prepend corrupted previously inserted data");
 283.177 -    
 283.178 -    UCX_TEST_END
 283.179 -    
 283.180 -    ucx_array_free(array);
 283.181 -}
 283.182 -
 283.183 -UCX_TEST(test_ucx_array_set_from) {
 283.184 -    int *elems;
 283.185 -    UcxArray *array = ucx_array_new(16, sizeof(int));
 283.186 -    
 283.187 -    int x = 42;
 283.188 -
 283.189 -    UCX_TEST_BEGIN
 283.190 -
 283.191 -    ucx_array_set_from(array, 7, &x, 1);
 283.192 -    
 283.193 -    elems = array->data;
 283.194 -    UCX_TEST_ASSERT(elems[7] == 42, "failed");
 283.195 -    UCX_TEST_ASSERT(array->size >= 8, "array not resized on set");
 283.196 -    UCX_TEST_ASSERT(array->capacity == 16, "capacity changed unnecessarily");
 283.197 -    
 283.198 -    int y[2] = {13, 37};
 283.199 -    ucx_array_set_from(array, 27, y, 2);
 283.200 -    
 283.201 -    elems = array->data;
 283.202 -    UCX_TEST_ASSERT(elems[27] == 13, "failed");
 283.203 -    UCX_TEST_ASSERT(elems[28] == 37, "failed");
 283.204 -    UCX_TEST_ASSERT(array->size == 29, "array not resized on set");
 283.205 -    UCX_TEST_ASSERT(array->capacity == 32, "capacity not grown");
 283.206 -    
 283.207 -    ucx_array_set_from(array, 7, NULL, 2);
 283.208 -    
 283.209 -    elems = array->data;
 283.210 -    UCX_TEST_ASSERT(elems[7] == 0, "not zeroed on NULL set");
 283.211 -    UCX_TEST_ASSERT(elems[8] == 0, "not zeroed on NULL set");
 283.212 -    
 283.213 -    UCX_TEST_END
 283.214 -    
 283.215 -    ucx_array_free(array);
 283.216 -}
 283.217 -
 283.218 -
 283.219 -UCX_TEST(test_ucx_array_equals) {
 283.220 -    UcxArray *a1 = ucx_array_new(16, sizeof(int32_t));
 283.221 -    UcxArray *a2 = ucx_array_new(16, sizeof(int32_t));
 283.222 -    UcxArray *a3 = ucx_array_new(16, sizeof(int64_t));
 283.223 -    UcxArray *a4 = ucx_array_new(16, sizeof(int32_t));
 283.224 -    
 283.225 -    int32_t *intelems;
 283.226 -    int64_t *longintelems;
 283.227 -    
 283.228 -    a1->size = 5;
 283.229 -    intelems = a1->data;
 283.230 -    intelems[0] = 47;
 283.231 -    intelems[1] = 11;
 283.232 -    intelems[2] = 0;
 283.233 -    intelems[3] = 8;
 283.234 -    intelems[4] = 15;
 283.235 -    a2->size = 5;
 283.236 -    intelems = a2->data;
 283.237 -    intelems[0] = 47;
 283.238 -    intelems[1] = 11;
 283.239 -    intelems[2] = 0;
 283.240 -    intelems[3] = 8;
 283.241 -    intelems[4] = 15;
 283.242 -    a3->size = 5;
 283.243 -    longintelems = a3->data;
 283.244 -    longintelems[0] = 47;
 283.245 -    longintelems[1] = 11;
 283.246 -    longintelems[2] = 0;
 283.247 -    longintelems[3] = 8;
 283.248 -    longintelems[4] = 15;
 283.249 -    a4->size = 5;
 283.250 -    intelems = a4->data;
 283.251 -    intelems[0] = 47;
 283.252 -    intelems[1] = 11;
 283.253 -    intelems[2] = -6;
 283.254 -    intelems[3] = 8;
 283.255 -    intelems[4] = 15;
 283.256 -    
 283.257 -    UCX_TEST_BEGIN
 283.258 -    
 283.259 -    UCX_TEST_ASSERT(ucx_array_equals(a1, a2, ucx_cmp_int32, NULL), "failed");
 283.260 -    UCX_TEST_ASSERT(!ucx_array_equals(a1, a4, ucx_cmp_int32, NULL), "failed");
 283.261 -    UCX_TEST_ASSERT(!ucx_array_equals(a4, a1, ucx_cmp_int32, NULL), "failed");
 283.262 -    UCX_TEST_ASSERT(!ucx_array_equals(a1, a3, ucx_cmp_int64, NULL),
 283.263 -            "comparing arrays of different element size shall fail");
 283.264 -    UCX_TEST_ASSERT(!ucx_array_equals(a3, a1, ucx_cmp_int64, NULL),
 283.265 -            "comparing arrays of different element size shall fail");
 283.266 -    
 283.267 -    UCX_TEST_ASSERT(ucx_array_equals(a1, a2, NULL, NULL),
 283.268 -            "compare using memcmp() failed");
 283.269 -    UCX_TEST_ASSERT(!ucx_array_equals(a1, a4, NULL, NULL),
 283.270 -            "compare using memcmp() failed");
 283.271 -    
 283.272 -    UCX_TEST_END
 283.273 -    ucx_array_free(a1);
 283.274 -    ucx_array_free(a2);
 283.275 -    ucx_array_free(a3);
 283.276 -    ucx_array_free(a4);
 283.277 -}
 283.278 -
 283.279 -UCX_TEST(test_ucx_array_concat) {
 283.280 -    UcxArray *a1 = ucx_array_new(16, sizeof(int));
 283.281 -    UcxArray *a2 = ucx_array_new(16, sizeof(int));
 283.282 -    int *elems;
 283.283 -    
 283.284 -    a1->size = 2;
 283.285 -    elems = a1->data;
 283.286 -    elems[0] = 47;
 283.287 -    elems[1] = 11;
 283.288 -    a2->size = 3;
 283.289 -    elems = a2->data;
 283.290 -    elems[0] = 0;
 283.291 -    elems[1] = 8;
 283.292 -    elems[2] = 15;
 283.293 -    
 283.294 -    UCX_TEST_BEGIN
 283.295 -    
 283.296 -    UCX_TEST_ASSERT(!ucx_array_concat(a1, a2), "failed");
 283.297 -    UCX_TEST_ASSERT(a1->size == 5, "failed");
 283.298 -    elems = a1->data;
 283.299 -    UCX_TEST_ASSERT(elems[0] == 47, "failed");
 283.300 -    UCX_TEST_ASSERT(elems[1] == 11, "failed");
 283.301 -    UCX_TEST_ASSERT(elems[2] == 0, "failed");
 283.302 -    UCX_TEST_ASSERT(elems[3] == 8, "failed");
 283.303 -    UCX_TEST_ASSERT(elems[4] == 15, "failed");
 283.304 -    
 283.305 -    a1->elemsize *= 2;
 283.306 -    UCX_TEST_ASSERT(ucx_array_concat(a1, a2),
 283.307 -            "arrays of different element size must not be concatenated");
 283.308 -    UCX_TEST_ASSERT(a1->size == 5,
 283.309 -            "arrays of different element size must not be concatenated");
 283.310 -    
 283.311 -    UCX_TEST_END
 283.312 -    ucx_array_free(a1);
 283.313 -    ucx_array_free(a2);    
 283.314 -}
 283.315 -
 283.316 -UCX_TEST(test_ucx_array_at) {
 283.317 -    UcxArray *array = ucx_array_new(16, sizeof(int));
 283.318 -    
 283.319 -    int x[3] = {42, 13, 5};
 283.320 -    ucx_array_append_from(array, x, 3);
 283.321 -    
 283.322 -    UCX_TEST_BEGIN
 283.323 -    
 283.324 -    UCX_TEST_ASSERT(*(int*)ucx_array_at(array, 1) == 13, "failed");
 283.325 -    *(int*)ucx_array_at(array, 1) = 80;
 283.326 -    UCX_TEST_ASSERT(*(int*)ucx_array_at(array, 1) == 80, "assignment failed");
 283.327 -    
 283.328 -    UCX_TEST_ASSERT(*(int*)ucx_array_at(array, 0) == 42, "corrupted data");
 283.329 -    UCX_TEST_ASSERT(*(int*)ucx_array_at(array, 2) == 5, "corrupted data");
 283.330 -    
 283.331 -    UCX_TEST_END
 283.332 -    
 283.333 -    ucx_array_free(array);
 283.334 -}
 283.335 -
 283.336 -UCX_TEST(test_ucx_array_find) {
 283.337 -    UcxArray *array = ucx_array_new(16, sizeof(int));
 283.338 -    int *elems;
 283.339 -    
 283.340 -    array->size = 5;
 283.341 -    elems = array->data;
 283.342 -    elems[0] = 47;
 283.343 -    elems[1] = 11;
 283.344 -    elems[2] = 0;
 283.345 -    elems[3] = 8;
 283.346 -    elems[4] = 15;
 283.347 -    
 283.348 -    int x = 8;
 283.349 -    int y = 90;
 283.350 -    
 283.351 -    UCX_TEST_BEGIN
 283.352 -    
 283.353 -    UCX_TEST_ASSERT(ucx_array_find(array,(void*)&x,ucx_cmp_int,NULL) == 3,
 283.354 -        "doesn't find element");
 283.355 -    UCX_TEST_ASSERT(ucx_array_find(array,(void*)&y,ucx_cmp_int,NULL) == 5,
 283.356 -        "finds non-existing element");
 283.357 -    
 283.358 -    UCX_TEST_ASSERT(ucx_array_find(array,(void*)&x,NULL,NULL) == 3,
 283.359 -        "failed using memcmp()");
 283.360 -    UCX_TEST_ASSERT(ucx_array_find(array,(void*)&y,NULL,NULL) == 5,
 283.361 -        "failed using memcmp()");
 283.362 -    
 283.363 -    UCX_TEST_END
 283.364 -    ucx_array_free(array);
 283.365 -}
 283.366 -
 283.367 -UCX_TEST(test_ucx_array_contains) {
 283.368 -    UcxArray *array = ucx_array_new(16, sizeof(int));
 283.369 -    int *elems;
 283.370 -    
 283.371 -    array->size = 5;
 283.372 -    elems = array->data;
 283.373 -    elems[0] = 47;
 283.374 -    elems[1] = 11;
 283.375 -    elems[2] = 0;
 283.376 -    elems[3] = 8;
 283.377 -    elems[4] = 15;
 283.378 -    
 283.379 -    int x = 8;
 283.380 -    int y = 90;
 283.381 -    
 283.382 -    UCX_TEST_BEGIN
 283.383 -    
 283.384 -    UCX_TEST_ASSERT(ucx_array_contains(array,(void*)&x,ucx_cmp_int,NULL),
 283.385 -        "false negative");
 283.386 -    UCX_TEST_ASSERT(!ucx_array_contains(array,(void*)&y,ucx_cmp_int,NULL),
 283.387 -        "false positive");
 283.388 -    
 283.389 -    UCX_TEST_ASSERT(ucx_array_contains(array,(void*)&x,NULL,NULL),
 283.390 -        "false negative using memcmp()");
 283.391 -    UCX_TEST_ASSERT(!ucx_array_contains(array,(void*)&y,NULL,NULL),
 283.392 -        "false positive using memcmp()");
 283.393 -    
 283.394 -    UCX_TEST_END
 283.395 -    ucx_array_free(array);
 283.396 -}
 283.397 -
 283.398 -UCX_TEST(test_ucx_array_remove) {
 283.399 -    UcxArray *array = ucx_array_new(16, sizeof(int));
 283.400 -    int *elems;
 283.401 -    
 283.402 -    array->size = 5;
 283.403 -    elems = array->data;
 283.404 -    elems[0] = 47;
 283.405 -    elems[1] = 11;
 283.406 -    elems[2] = 0;
 283.407 -    elems[3] = 8;
 283.408 -    elems[4] = 15;
 283.409 -        
 283.410 -    UCX_TEST_BEGIN
 283.411 -    
 283.412 -    ucx_array_remove(array, 2);
 283.413 -    elems = array->data;
 283.414 -    UCX_TEST_ASSERT(
 283.415 -            elems[0] == 47 &&
 283.416 -            elems[1] == 11 &&
 283.417 -            elems[2] == 8 &&
 283.418 -            elems[3] == 15,
 283.419 -            "wrong contents after remove");
 283.420 -    UCX_TEST_ASSERT(array->size == 4, "wrong size after remove");
 283.421 -    
 283.422 -    ucx_array_remove_fast(array, 1);
 283.423 -    elems = array->data;
 283.424 -    UCX_TEST_ASSERT(
 283.425 -            elems[0] == 47 &&
 283.426 -            elems[1] == 15 &&
 283.427 -            elems[2] == 8,
 283.428 -            "wrong contents after fast remove");
 283.429 -    UCX_TEST_ASSERT(array->size == 3, "wrong size after fast remove");
 283.430 -    
 283.431 -    UCX_TEST_END
 283.432 -    ucx_array_free(array);
 283.433 -}
 283.434 -
 283.435 -UCX_TEST(test_ucx_array_clone) {
 283.436 -    UcxArray array;
 283.437 -    UcxArray copy;
 283.438 -    ucx_array_init(&array, 16, sizeof(int));
 283.439 -    ucx_array_init(&copy, 4, 2*sizeof(double));
 283.440 -    int *elems;
 283.441 -    
 283.442 -    array.size = 5;
 283.443 -    elems = array.data;
 283.444 -    elems[0] = 47;
 283.445 -    elems[1] = 11;
 283.446 -    elems[2] = 0;
 283.447 -    elems[3] = 8;
 283.448 -    elems[4] = 15;
 283.449 -    
 283.450 -    ucx_array_clone(&copy, &array);
 283.451 -    UCX_TEST_BEGIN
 283.452 -
 283.453 -    UCX_TEST_ASSERT(array.data != copy.data, "no true copy");
 283.454 -    UCX_TEST_ASSERT(array.size == copy.size, "size mismatch");
 283.455 -    UCX_TEST_ASSERT(array.capacity == copy.capacity, "capacity mismatch");
 283.456 -    UCX_TEST_ASSERT(array.elemsize == copy.elemsize, "element size mismatch");
 283.457 -    UCX_TEST_ASSERT(array.allocator == copy.allocator, "allocator mismatch");
 283.458 -    UCX_TEST_ASSERT(ucx_array_equals(&array, &copy, ucx_cmp_int, NULL),
 283.459 -            "contents do not match after clone");
 283.460 -    
 283.461 -    UCX_TEST_END
 283.462 -
 283.463 -    ucx_array_destroy(&array);
 283.464 -    ucx_array_destroy(&copy);
 283.465 -}
 283.466 -
 283.467 -static int ucx_cmp_int_reverse(const void* x, const void* y, void* data) {
 283.468 -    return -ucx_cmp_int(x,y,data);
 283.469 -}
 283.470 -
 283.471 -UCX_TEST(test_ucx_array_sort) {
 283.472 -    int *elems;
 283.473 -
 283.474 -    UcxArray *array = ucx_array_new(16, sizeof(int));    
 283.475 -    array->size = 5;
 283.476 -    elems = array->data;
 283.477 -    elems[0] = 47;
 283.478 -    elems[1] = 11;
 283.479 -    elems[2] = 0;
 283.480 -    elems[3] = 8;
 283.481 -    elems[4] = 15;
 283.482 -    
 283.483 -    UcxArray *expected = ucx_array_new(16, sizeof(int));
 283.484 -    expected->size = 5;
 283.485 -    elems = expected->data;
 283.486 -    elems[0] = 0;
 283.487 -    elems[1] = 8;
 283.488 -    elems[2] = 11;
 283.489 -    elems[3] = 15;
 283.490 -    elems[4] = 47;
 283.491 -    
 283.492 -    UcxArray *expectedrev = ucx_array_new(16, sizeof(int));
 283.493 -    expectedrev->size = 5;
 283.494 -    elems = expectedrev->data;
 283.495 -    elems[0] = 47;
 283.496 -    elems[1] = 15;
 283.497 -    elems[2] = 11;
 283.498 -    elems[3] = 8;
 283.499 -    elems[4] = 0;
 283.500 -    
 283.501 -
 283.502 -    UCX_TEST_BEGIN
 283.503 -    void* original_ptr = array->data;
 283.504 -    ucx_array_sort(array, ucx_cmp_int, NULL);
 283.505 -    UCX_TEST_ASSERT(ucx_array_equals(array, expected, NULL, NULL), "failed");
 283.506 -    UCX_TEST_ASSERT(array->size == 5, "size corrupted");
 283.507 -    UCX_TEST_ASSERT(array->data == original_ptr, "shall not reallocate");
 283.508 -    
 283.509 -    ucx_array_sort(array, ucx_cmp_int_reverse, NULL);
 283.510 -    UCX_TEST_ASSERT(ucx_array_equals(array, expectedrev, NULL, NULL), "failed");
 283.511 -
 283.512 -    ucx_array_reserve(array, 32);
 283.513 -    ucx_array_reserve(expected, 32);
 283.514 -    array->size = expected->size = 32;
 283.515 -    for (size_t i = 0 ; i < 32 ; i++) {
 283.516 -        ((int*)array->data)[i]= ((i%2==0)?-1:1) * ((int) i);
 283.517 -        ((int*)expected->data)[i] = (-30+2*i) - (i > 15 ? 1 : 0);
 283.518 -    }
 283.519 -    
 283.520 -    /* dummy third argument to trigger a possible fallback for qsort_s */
 283.521 -    ucx_array_sort(array, ucx_cmp_int, array->data);
 283.522 -    UCX_TEST_ASSERT(ucx_array_equals(array, expected, NULL, NULL),
 283.523 -            "failed for bigger arrays");
 283.524 -    UCX_TEST_END
 283.525 -
 283.526 -    ucx_array_free(expectedrev);
 283.527 -    ucx_array_free(expected);
 283.528 -    ucx_array_free(array);
 283.529 -}
 283.530 -
 283.531 -UCX_TEST(test_ucx_array_shrink) {
 283.532 -    UcxArray *array = ucx_array_new(16, sizeof(int));
 283.533 -    array->size = 4;
 283.534 -    
 283.535 -    UCX_TEST_BEGIN
 283.536 -    UCX_TEST_ASSERT(!ucx_array_shrink(array), "failed");
 283.537 -    UCX_TEST_ASSERT(array->capacity == 4, "incorrect capacity after shrink");
 283.538 -    UCX_TEST_END
 283.539 -    ucx_array_free(array);
 283.540 -}
 283.541 -
 283.542 -UCX_TEST(test_ucx_array_resize) {
 283.543 -    UcxArray *array = ucx_array_new(16, sizeof(int));
 283.544 -    array->size = 8;
 283.545 -    
 283.546 -    UCX_TEST_BEGIN
 283.547 -
 283.548 -    UCX_TEST_ASSERT(!ucx_array_resize(array, 32), "failed");
 283.549 -    UCX_TEST_ASSERT(array->capacity == 32, "incorrect capacity after resize");
 283.550 -    UCX_TEST_ASSERT(array->size == 8, "incorrect size after resize");
 283.551 -    
 283.552 -    UCX_TEST_ASSERT(!ucx_array_resize(array, 4), "failed");
 283.553 -    UCX_TEST_ASSERT(array->capacity == 4, "incorrect capacity after resize");
 283.554 -    UCX_TEST_ASSERT(array->size == 4, "incorrect size after resize");
 283.555 -    
 283.556 -    UCX_TEST_END
 283.557 -    ucx_array_free(array);
 283.558 -}
 283.559 -
 283.560 -UCX_TEST(test_ucx_array_reserve) {
 283.561 -    UcxArray *array = ucx_array_new(16, sizeof(int));
 283.562 -    
 283.563 -    UCX_TEST_BEGIN
 283.564 -
 283.565 -    UCX_TEST_ASSERT(!ucx_array_reserve(array, 4), "failed");
 283.566 -    UCX_TEST_ASSERT(array->capacity == 16, "reserve shall not shrink");
 283.567 -            
 283.568 -    UCX_TEST_ASSERT(!ucx_array_resize(array, 32), "failed");
 283.569 -    UCX_TEST_ASSERT(array->capacity == 32, "incorrect capacity after reserve");    
 283.570 -    
 283.571 -    UCX_TEST_END
 283.572 -    ucx_array_free(array);
 283.573 -}
 283.574 -
 283.575 -UCX_TEST(test_ucx_array_grow) {
 283.576 -    UcxArray *array = ucx_array_new(16, sizeof(int));
 283.577 -    array->size = 12;
 283.578 -    
 283.579 -    UCX_TEST_BEGIN
 283.580 -
 283.581 -    UCX_TEST_ASSERT(!ucx_array_grow(array, 4), "failed");
 283.582 -    UCX_TEST_ASSERT(array->capacity == 16, "shall be noop if contents fit");
 283.583 -    /* subsequent calls shall also be noops */
 283.584 -    UCX_TEST_ASSERT(!ucx_array_grow(array, 4), "failed");
 283.585 -    UCX_TEST_ASSERT(array->capacity == 16, "shall be noop if contents fit");
 283.586 -            
 283.587 -    UCX_TEST_ASSERT(!ucx_array_grow(array, 6), "failed");
 283.588 -    UCX_TEST_ASSERT(array->capacity == 18, "incorrect capacity after grow");    
 283.589 -    
 283.590 -    UCX_TEST_END
 283.591 -    ucx_array_free(array);
 283.592 -}
 283.593 -
 283.594 -UCX_TEST(test_ucx_array_util_set) {
 283.595 -    size_t capacity = 16;
 283.596 -    int* array = malloc(sizeof(int)*capacity);
 283.597 -    int x;
 283.598 -
 283.599 -    UCX_TEST_BEGIN
 283.600 -
 283.601 -    x = 42;
 283.602 -    ucx_array_util_set(&array, &capacity, sizeof(int), 7, &x);
 283.603 -    
 283.604 -    UCX_TEST_ASSERT(array[7] == 42, "failed");
 283.605 -    UCX_TEST_ASSERT(capacity == 16, "capacity changed unnecessarily");
 283.606 -    
 283.607 -    x = 13;
 283.608 -    ucx_array_util_set(&array, &capacity, sizeof(int), 37, &x);
 283.609 -    x = 37;
 283.610 -    ucx_array_util_set(&array, &capacity, sizeof(int), 38, &x);
 283.611 -    
 283.612 -    UCX_TEST_ASSERT(array[37] == 13, "failed");
 283.613 -    UCX_TEST_ASSERT(array[38] == 37, "failed");
 283.614 -    UCX_TEST_ASSERT(capacity == 64, "capacity not grown");
 283.615 -        
 283.616 -    UCX_TEST_END
 283.617 -    
 283.618 -    free(array);
 283.619 -}
 283.620 -
 283.621 -
 283.622 -UCX_TEST(test_ucx_array_util_setptr) {
 283.623 -    size_t capacity = 16;
 283.624 -    double** array = malloc(sizeof(double*)*capacity);
 283.625 -    double x, y, z;
 283.626 -
 283.627 -    UCX_TEST_BEGIN
 283.628 -
 283.629 -    ucx_array_util_setptr(&array, &capacity, 7, &x);
 283.630 -    
 283.631 -    UCX_TEST_ASSERT(array[7] == &x, "failed");
 283.632 -    UCX_TEST_ASSERT(capacity == 16, "capacity changed unnecessarily");
 283.633 -    
 283.634 -    ucx_array_util_setptr(&array, &capacity, 37, &y);
 283.635 -    ucx_array_util_setptr(&array, &capacity, 38, &z);
 283.636 -    
 283.637 -    UCX_TEST_ASSERT(array[37] == &y, "failed");
 283.638 -    UCX_TEST_ASSERT(array[38] == &z, "failed");
 283.639 -    UCX_TEST_ASSERT(capacity == 64, "capacity not grown");
 283.640 -        
 283.641 -    UCX_TEST_END
 283.642 -    
 283.643 -    free(array);
 283.644 -}
 283.645 -
   284.1 --- a/test/array_tests.h	Mon Dec 30 09:54:10 2019 +0100
   284.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   284.3 @@ -1,65 +0,0 @@
   284.4 -/*
   284.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   284.6 - *
   284.7 - * Copyright 2019 Mike Becker, Olaf Wintermann All rights reserved.
   284.8 - *
   284.9 - * Redistribution and use in source and binary forms, with or without
  284.10 - * modification, are permitted provided that the following conditions are met:
  284.11 - *
  284.12 - *   1. Redistributions of source code must retain the above copyright
  284.13 - *      notice, this list of conditions and the following disclaimer.
  284.14 - *
  284.15 - *   2. Redistributions in binary form must reproduce the above copyright
  284.16 - *      notice, this list of conditions and the following disclaimer in the
  284.17 - *      documentation and/or other materials provided with the distribution.
  284.18 - *
  284.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  284.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  284.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  284.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  284.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  284.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  284.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  284.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  284.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  284.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  284.29 - * POSSIBILITY OF SUCH DAMAGE.
  284.30 - */
  284.31 -
  284.32 -#ifndef ARRAY_TESTS_H
  284.33 -#define	ARRAY_TESTS_H
  284.34 -
  284.35 -#include <ucx/array.h>
  284.36 -#include <ucx/test.h>
  284.37 -
  284.38 -#ifdef	__cplusplus
  284.39 -extern "C" {
  284.40 -#endif
  284.41 -
  284.42 -UCX_TEST(test_ucx_array_destroy);
  284.43 -UCX_TEST(test_ucx_array_new);
  284.44 -UCX_TEST(test_ucx_array_at);
  284.45 -UCX_TEST(test_ucx_array_append_from);
  284.46 -UCX_TEST(test_ucx_array_append_from_struct);
  284.47 -UCX_TEST(test_ucx_array_prepend_from);
  284.48 -UCX_TEST(test_ucx_array_set_from);
  284.49 -UCX_TEST(test_ucx_array_equals);
  284.50 -UCX_TEST(test_ucx_array_concat);
  284.51 -UCX_TEST(test_ucx_array_find);
  284.52 -UCX_TEST(test_ucx_array_contains);
  284.53 -UCX_TEST(test_ucx_array_remove);
  284.54 -UCX_TEST(test_ucx_array_clone);
  284.55 -UCX_TEST(test_ucx_array_sort);
  284.56 -UCX_TEST(test_ucx_array_shrink);
  284.57 -UCX_TEST(test_ucx_array_resize);
  284.58 -UCX_TEST(test_ucx_array_reserve);
  284.59 -UCX_TEST(test_ucx_array_grow);
  284.60 -UCX_TEST(test_ucx_array_util_set);
  284.61 -UCX_TEST(test_ucx_array_util_setptr);
  284.62 -
  284.63 -#ifdef	__cplusplus
  284.64 -}
  284.65 -#endif
  284.66 -
  284.67 -#endif	/* ARRAY_TESTS_H */
  284.68 -
   285.1 --- a/test/avl_tests.c	Mon Dec 30 09:54:10 2019 +0100
   285.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   285.3 @@ -1,335 +0,0 @@
   285.4 -/*
   285.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   285.6 - *
   285.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   285.8 - *
   285.9 - * Redistribution and use in source and binary forms, with or without
  285.10 - * modification, are permitted provided that the following conditions are met:
  285.11 - *
  285.12 - *   1. Redistributions of source code must retain the above copyright
  285.13 - *      notice, this list of conditions and the following disclaimer.
  285.14 - *
  285.15 - *   2. Redistributions in binary form must reproduce the above copyright
  285.16 - *      notice, this list of conditions and the following disclaimer in the
  285.17 - *      documentation and/or other materials provided with the distribution.
  285.18 - *
  285.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  285.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  285.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  285.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  285.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  285.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  285.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  285.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  285.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  285.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  285.29 - * POSSIBILITY OF SUCH DAMAGE.
  285.30 - */
  285.31 -
  285.32 -#include "avl_tests.h"
  285.33 -
  285.34 -#include <ucx/utils.h>
  285.35 -
  285.36 -static int node_height(UcxAVLNode *node) {
  285.37 -    if(!node) {
  285.38 -        return 0;
  285.39 -    }
  285.40 -    
  285.41 -    int left = 0;
  285.42 -    int right = 0;
  285.43 -    if(node->left) {
  285.44 -        left = node_height(node->left);
  285.45 -    }
  285.46 -    if(node->right) {
  285.47 -        right = node_height(node->right);
  285.48 -    }
  285.49 -    
  285.50 -    return left > right ? left+1 : right+1;
  285.51 -}
  285.52 -
  285.53 -static int check_tree(UcxAVLNode *node) {
  285.54 -    if(!node) {
  285.55 -        return 1;
  285.56 -    }
  285.57 -    
  285.58 -    int left_height = node_height(node->left);
  285.59 -    int right_height = node_height(node->right);
  285.60 -    int bf = -left_height + right_height;
  285.61 -    if(bf < -1 || bf > 1) {
  285.62 -        return 0;
  285.63 -    }
  285.64 -    int height = left_height > right_height ? left_height : right_height;
  285.65 -    height++;
  285.66 -    if(height != node->height) {
  285.67 -        return 0;
  285.68 -    }
  285.69 -    
  285.70 -    if(!check_tree(node->left)) {
  285.71 -        return 0;
  285.72 -    }
  285.73 -    if(!check_tree(node->right)) {
  285.74 -        return 0;
  285.75 -    }
  285.76 -    
  285.77 -    return 1;
  285.78 -}
  285.79 -
  285.80 -UCX_TEST(test_ucx_avl_put) {
  285.81 -    UcxAVLTree *tree1 = ucx_avl_new(ucx_cmp_ptr);
  285.82 -    UcxAVLTree *tree2 = ucx_avl_new(ucx_cmp_ptr);
  285.83 -    UcxAVLTree *tree3 = ucx_avl_new(ucx_cmp_ptr);
  285.84 -    UcxAVLTree *tree4 = ucx_avl_new(ucx_cmp_ptr);
  285.85 -    UcxAVLTree *tree5 = ucx_avl_new(ucx_cmp_ptr);
  285.86 -    
  285.87 -    char *data1 = (char*)"data1";
  285.88 -    char *data2 = (char*)"data2";
  285.89 -    char *data3 = (char*)"data3";
  285.90 -    
  285.91 -    UCX_TEST_BEGIN
  285.92 -    
  285.93 -    ucx_avl_put(tree1, 2, (char*)data2);
  285.94 -    ucx_avl_put(tree1, 1, (char*)data1);
  285.95 -    ucx_avl_put(tree1, 3, (char*)data3);
  285.96 -    
  285.97 -    UCX_TEST_ASSERT(check_tree(tree1->root), "check_tree failed (tree1)");
  285.98 -    UCX_TEST_ASSERT(ucx_avl_get(tree1, 1) == data1, "wrong data (tree1)");
  285.99 -    UCX_TEST_ASSERT(ucx_avl_get(tree1, 2) == data2, "wrong data (tree1)");
 285.100 -    UCX_TEST_ASSERT(ucx_avl_get(tree1, 3) == data3, "wrong data (tree1)");
 285.101 -    
 285.102 -    for(int i=0;i<100000;i++) {
 285.103 -        ucx_avl_put(tree2, i, data1);
 285.104 -    }
 285.105 -    UCX_TEST_ASSERT(check_tree(tree2->root), "check_tree failed (tree2)");
 285.106 -    
 285.107 -    for(int i=100000;i>=0;i--) {
 285.108 -        ucx_avl_put(tree3, i, data1);
 285.109 -    }
 285.110 -    UCX_TEST_ASSERT(check_tree(tree3->root), "check_tree failed (tree3)");
 285.111 -    
 285.112 -    for(int i=0;i<100;i++) {
 285.113 -        ucx_avl_put(tree4, i, data1);
 285.114 -    }
 285.115 -    for(int i=400;i<500;i++) {
 285.116 -        ucx_avl_put(tree4, i, data2);
 285.117 -    }
 285.118 -    for(int i=399;i>200;i--) {
 285.119 -        ucx_avl_put(tree4, i, data3);
 285.120 -    }
 285.121 -    for(int i=800;i<1000;i++) {
 285.122 -        ucx_avl_put(tree4, i, data1);
 285.123 -    }
 285.124 -    UCX_TEST_ASSERT(check_tree(tree4->root), "check_tree failed (tree4)");
 285.125 -    UCX_TEST_ASSERT(ucx_avl_get(tree4, 0) == data1, "wrong data for key: 0");
 285.126 -    UCX_TEST_ASSERT(ucx_avl_get(tree4, 1) == data1, "wrong data for key: 1");
 285.127 -    UCX_TEST_ASSERT(ucx_avl_get(tree4, 99) == data1, "wrong data for key: 99");
 285.128 -    UCX_TEST_ASSERT(ucx_avl_get(tree4, 400)==data2, "wrong data for key: 400");
 285.129 -    UCX_TEST_ASSERT(ucx_avl_get(tree4, 410)==data2, "wrong data for key: 410");
 285.130 -    UCX_TEST_ASSERT(ucx_avl_get(tree4, 350)==data3, "wrong data for key: 350");
 285.131 -    UCX_TEST_ASSERT(ucx_avl_get(tree4, 900)==data1, "wrong data for key: 900");
 285.132 -    
 285.133 -    int values[] = { 3, 6, 12, 9, 23, 1, 0, 20, 34, 5, 8, 7, 6, 14, 15, 2, 4};
 285.134 -    int len = sizeof(values) / sizeof(int);
 285.135 -    for(int i=0;i<len;i++) {
 285.136 -        ucx_avl_put(tree5, values[i], NULL);
 285.137 -    }
 285.138 -    UCX_TEST_ASSERT(check_tree(tree5->root), "check_tree failed (tree5)");
 285.139 -            
 285.140 -    UCX_TEST_END
 285.141 -    
 285.142 -    ucx_avl_free(tree1);
 285.143 -    ucx_avl_free(tree2);
 285.144 -    ucx_avl_free(tree3);
 285.145 -    ucx_avl_free(tree4);
 285.146 -    ucx_avl_free(tree5);
 285.147 -}
 285.148 -
 285.149 -UCX_TEST(test_ucx_avl_remove) {
 285.150 -    UcxAVLTree *tree1 = ucx_avl_new(ucx_cmp_ptr);
 285.151 -    UcxAVLTree *tree2 = ucx_avl_new(ucx_cmp_ptr);
 285.152 -    UcxAVLTree *tree3 = ucx_avl_new(ucx_cmp_ptr);
 285.153 -    UcxAVLTree *tree4 = ucx_avl_new(ucx_cmp_ptr);
 285.154 -    
 285.155 -    char *data1 = (char*)"data1";
 285.156 -    char *data2 = (char*)"data2";
 285.157 -    char *data3 = (char*)"data3";
 285.158 -    
 285.159 -    UCX_TEST_BEGIN
 285.160 -    ucx_avl_put(tree1, 2, (char*)data2);
 285.161 -    ucx_avl_put(tree1, 1, (char*)data1);
 285.162 -    ucx_avl_put(tree1, 3, (char*)data3);
 285.163 -    void *val;
 285.164 -    ucx_avl_remove_s(tree1, 3, NULL, &val);
 285.165 -    
 285.166 -    UCX_TEST_ASSERT(check_tree(tree1->root), "check_tree failed (tree1)");
 285.167 -    UCX_TEST_ASSERT(val == data3,
 285.168 -            "wrong return value for key: 1 (tree1)");
 285.169 -    UCX_TEST_ASSERT(ucx_avl_get(tree1, 3) == NULL, "value not removed (tree1)");
 285.170 -    
 285.171 -    ucx_avl_remove_s(tree1, 2, NULL, &val);
 285.172 -    UCX_TEST_ASSERT(val == data2,
 285.173 -            "wrong return value for key: 2 (tree1)");
 285.174 -    UCX_TEST_ASSERT(check_tree(tree1->root), "check_tree failed (tree1)");
 285.175 -    
 285.176 -    ucx_avl_remove_s(tree1, 1, NULL, &val);
 285.177 -    UCX_TEST_ASSERT(val == data1,
 285.178 -            "wrong return value for key: 1 (tree1)");
 285.179 -    UCX_TEST_ASSERT(check_tree(tree1->root), "check_tree failed (tree1)");
 285.180 -    UCX_TEST_ASSERT(tree1->root == NULL, "root not NULL (tree1)");
 285.181 -    
 285.182 -    
 285.183 -    for(int i=0;i<20;i++) {
 285.184 -        if(i==10) {
 285.185 -            ucx_avl_put(tree2, i, data3);
 285.186 -        } else if(i==15) {
 285.187 -            ucx_avl_put(tree2, i, data2);
 285.188 -        } else {
 285.189 -            ucx_avl_put(tree2, i, data1);
 285.190 -        }
 285.191 -    }
 285.192 -    
 285.193 -    ucx_avl_remove_s(tree2, 10, NULL, &val);
 285.194 -    UCX_TEST_ASSERT(val == data3,
 285.195 -            "wrong return value for key: 10 (tree2)");
 285.196 -    UCX_TEST_ASSERT(check_tree(tree2->root), "check_tree failed (tree2)");
 285.197 -    
 285.198 -    ucx_avl_remove_s(tree2, 15, NULL, &val);
 285.199 -    UCX_TEST_ASSERT(val == data2,
 285.200 -            "wrong return value for key: 15 (tree2)");
 285.201 -    UCX_TEST_ASSERT(check_tree(tree2->root), "check_tree failed (tree2)");
 285.202 -    
 285.203 -    for(int i=0;i<20;i++) {
 285.204 -        ucx_avl_remove(tree2, i);
 285.205 -        UCX_TEST_ASSERT(check_tree(tree2->root), "check_tree failed (tree2)");
 285.206 -    }
 285.207 -    UCX_TEST_ASSERT(tree2->root == NULL, "root not NULL (tree2)");
 285.208 -    
 285.209 -    for(int i=0;i<100000;i++) {
 285.210 -        ucx_avl_put(tree3, i, data1);
 285.211 -    }
 285.212 -    for(int i=100000-1;i>=0;i--) {
 285.213 -        ucx_avl_remove(tree3, i);
 285.214 -    }
 285.215 -    UCX_TEST_ASSERT(tree3->root == NULL, "root not NULL (tree3)");
 285.216 -    UCX_TEST_ASSERT(check_tree(tree3->root), "check_tree failed (tree3)");
 285.217 -    
 285.218 -    ucx_avl_put(tree4, 1, data1);
 285.219 -    ucx_avl_remove(tree4, 1);
 285.220 -    UCX_TEST_ASSERT(check_tree(tree4->root), "check_tree failed (tree4)");
 285.221 -    UCX_TEST_ASSERT(tree4->root == NULL, "root not NULL (tree4)");
 285.222 -    UCX_TEST_END
 285.223 -    
 285.224 -    ucx_avl_free(tree1);
 285.225 -    ucx_avl_free(tree2);
 285.226 -    ucx_avl_free(tree3);
 285.227 -    ucx_avl_free(tree4);
 285.228 -}
 285.229 -
 285.230 -static intmax_t dist_int(const void* a, const void* b, void* n) {
 285.231 -    return ((intptr_t)a)-((intptr_t)b);
 285.232 -}
 285.233 -
 285.234 -UCX_TEST(test_ucx_avl_find) {
 285.235 -    UcxAVLTree *tree = ucx_avl_new(ucx_cmp_ptr);
 285.236 -    UcxAVLTree *tree2 = ucx_avl_new(ucx_cmp_ptr);
 285.237 -    UcxAVLTree *tree3 = ucx_avl_new(ucx_cmp_ptr);
 285.238 -    
 285.239 -    size_t len = 12;
 285.240 -    int val[] = {10, 15, 3, 4, -30, 20, 14, -11, 12, -5, 1, 13};
 285.241 -    
 285.242 -    for (size_t i = 0 ; i < len ; i++) {
 285.243 -        ucx_avl_put(tree, val[i], &(val[i]));
 285.244 -    }
 285.245 -    
 285.246 -    UCX_TEST_BEGIN
 285.247 -    
 285.248 -    void* ret;
 285.249 -    
 285.250 -    /* test present values */
 285.251 -    ret = ucx_avl_find(tree,(intptr_t)-5, dist_int, UCX_AVL_FIND_CLOSEST);
 285.252 -    UCX_TEST_ASSERT(ret && *((int*)ret) == -5, "AVL find closest failed");
 285.253 -    ret = ucx_avl_find(tree,(intptr_t)-5, dist_int, UCX_AVL_FIND_EXACT);
 285.254 -    UCX_TEST_ASSERT(ret && *((int*)ret) == -5, "AVL find exact failed");
 285.255 -    ret = ucx_avl_find(tree,(intptr_t)-5, dist_int, UCX_AVL_FIND_LOWER_BOUNDED);
 285.256 -    UCX_TEST_ASSERT(ret && *((int*)ret) == -5, "AVL find LB failed");
 285.257 -    ret = ucx_avl_find(tree,(intptr_t)-5, dist_int, UCX_AVL_FIND_UPPER_BOUNDED);
 285.258 -    UCX_TEST_ASSERT(ret && *((int*)ret) == -5, "AVL find UB failed");
 285.259 -    ret = ucx_avl_find(tree,(intptr_t)12, dist_int, UCX_AVL_FIND_CLOSEST);
 285.260 -    UCX_TEST_ASSERT(ret && *((int*)ret) == 12, "AVL find closest failed");
 285.261 -    ret = ucx_avl_find(tree,(intptr_t)12, dist_int, UCX_AVL_FIND_EXACT);
 285.262 -    UCX_TEST_ASSERT(ret && *((int*)ret) == 12, "AVL find exact failed");
 285.263 -    ret = ucx_avl_find(tree,(intptr_t)12, dist_int, UCX_AVL_FIND_LOWER_BOUNDED);
 285.264 -    UCX_TEST_ASSERT(ret && *((int*)ret) == 12, "AVL find LB failed");
 285.265 -    ret = ucx_avl_find(tree,(intptr_t)12, dist_int, UCX_AVL_FIND_UPPER_BOUNDED);
 285.266 -    UCX_TEST_ASSERT(ret && *((int*)ret) == 12, "AVL find UB failed");
 285.267 -    
 285.268 -    /* test missing values */
 285.269 -    ret = ucx_avl_find(tree,(intptr_t)-10, dist_int, UCX_AVL_FIND_CLOSEST);
 285.270 -    UCX_TEST_ASSERT(ret && *((int*)ret) == -11, "AVL find closest failed");
 285.271 -    ret = ucx_avl_find(tree,(intptr_t)-8, dist_int, UCX_AVL_FIND_EXACT);
 285.272 -    UCX_TEST_ASSERT(!ret, "AVL find exact failed");
 285.273 -    ret = ucx_avl_find(tree,(intptr_t)-8, dist_int, UCX_AVL_FIND_LOWER_BOUNDED);
 285.274 -    UCX_TEST_ASSERT(ret && *((int*)ret) == -5, "AVL find LB failed");
 285.275 -    ret = ucx_avl_find(tree,(intptr_t)-8, dist_int, UCX_AVL_FIND_UPPER_BOUNDED);
 285.276 -    UCX_TEST_ASSERT(ret && *((int*)ret) == -11, "AVL find UB failed");
 285.277 -    ret = ucx_avl_find(tree,(intptr_t)18, dist_int, UCX_AVL_FIND_CLOSEST);
 285.278 -    UCX_TEST_ASSERT(ret && *((int*)ret) == 20, "AVL find closest failed");
 285.279 -    ret = ucx_avl_find(tree,(intptr_t)7, dist_int, UCX_AVL_FIND_EXACT);
 285.280 -    UCX_TEST_ASSERT(!ret, "AVL find exact failed");
 285.281 -    ret = ucx_avl_find(tree,(intptr_t)7, dist_int, UCX_AVL_FIND_LOWER_BOUNDED);
 285.282 -    UCX_TEST_ASSERT(ret && *((int*)ret) == 10, "AVL find LB failed");
 285.283 -    ret = ucx_avl_find(tree,(intptr_t)7, dist_int, UCX_AVL_FIND_UPPER_BOUNDED);
 285.284 -    UCX_TEST_ASSERT(ret && *((int*)ret) == 4, "AVL find UB failed");
 285.285 -    
 285.286 -    int val2[] = { 10, 15 };
 285.287 -    ucx_avl_put(tree2, val2[0], &(val2[0]));
 285.288 -    ucx_avl_put(tree2, val2[1], &(val2[1]));
 285.289 -    ret = ucx_avl_find(tree2,(intptr_t)11, dist_int, UCX_AVL_FIND_UPPER_BOUNDED);
 285.290 -    UCX_TEST_ASSERT(ret && *((int*)ret) == 10, "AVL find LB failed");
 285.291 -    
 285.292 -    int val3[] = { 15, 16, 1 };
 285.293 -    ucx_avl_put(tree3, val3[0], &(val3[0]));
 285.294 -    ucx_avl_put(tree3, val3[1], &(val3[1]));
 285.295 -    ucx_avl_put(tree3, val3[2], &(val3[2]));
 285.296 -   
 285.297 -    ret = ucx_avl_find(tree3, (intptr_t)13, dist_int, UCX_AVL_FIND_CLOSEST);
 285.298 -    UCX_TEST_ASSERT(ret && *((int*)ret) == 15, "AVL find closest failed");
 285.299 -    
 285.300 -    UCX_TEST_END
 285.301 -    
 285.302 -    ucx_avl_free(tree);
 285.303 -    ucx_avl_free(tree2);
 285.304 -    ucx_avl_free(tree3);
 285.305 -}
 285.306 -
 285.307 -UCX_TEST(test_ucx_avl_traverse) {
 285.308 -    UcxAVLTree *tree = ucx_avl_new(ucx_cmp_ptr);
 285.309 -    
 285.310 -    size_t len = 12;
 285.311 -
 285.312 -    int val[] = {10, 15, 3, 4, -30, 20, 14, -11, 12, -5, 1, 13};
 285.313 -    int val_ordered[] = {-30, -11, -5, 1, 3, 4, 10, 12, 13, 14, 15, 20};
 285.314 -    
 285.315 -    for (size_t i = 0 ; i < len ; i++) {
 285.316 -        ucx_avl_put(tree, val[i], &(val[i]));
 285.317 -    }
 285.318 -    
 285.319 -    UCX_TEST_BEGIN
 285.320 -    
 285.321 -    UcxAVLNode* node = ucx_avl_get_node(tree, (intptr_t) val_ordered[0]);
 285.322 -    for (size_t i = 0 ; i < len ; i++) {
 285.323 -        UCX_TEST_ASSERT(node->key == val_ordered[i], "AVL successor failed");
 285.324 -        node = ucx_avl_succ(node);
 285.325 -    }
 285.326 -    UCX_TEST_ASSERT(!node, "AVL maximum incorrectly has a successor");
 285.327 -    
 285.328 -    node = ucx_avl_get_node(tree, (intptr_t) val_ordered[len-1]);
 285.329 -    for (size_t i = len ; i > 0 ; i--) {
 285.330 -        UCX_TEST_ASSERT(node->key == val_ordered[i-1],"AVL predecessor failed");
 285.331 -        node = ucx_avl_pred(node);
 285.332 -    }
 285.333 -    UCX_TEST_ASSERT(!node, "AVL minimum incorrectly has a predecessor");
 285.334 -    
 285.335 -    UCX_TEST_END
 285.336 -    
 285.337 -    ucx_avl_free(tree);
 285.338 -}
   286.1 --- a/test/avl_tests.h	Mon Dec 30 09:54:10 2019 +0100
   286.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   286.3 @@ -1,49 +0,0 @@
   286.4 -/*
   286.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   286.6 - *
   286.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   286.8 - *
   286.9 - * Redistribution and use in source and binary forms, with or without
  286.10 - * modification, are permitted provided that the following conditions are met:
  286.11 - *
  286.12 - *   1. Redistributions of source code must retain the above copyright
  286.13 - *      notice, this list of conditions and the following disclaimer.
  286.14 - *
  286.15 - *   2. Redistributions in binary form must reproduce the above copyright
  286.16 - *      notice, this list of conditions and the following disclaimer in the
  286.17 - *      documentation and/or other materials provided with the distribution.
  286.18 - *
  286.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  286.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  286.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  286.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  286.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  286.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  286.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  286.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  286.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  286.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  286.29 - * POSSIBILITY OF SUCH DAMAGE.
  286.30 - */
  286.31 -
  286.32 -#ifndef AVL_TEST_H
  286.33 -#define	AVL_TEST_H
  286.34 -
  286.35 -#include <ucx/test.h>
  286.36 -#include <ucx/avl.h>
  286.37 -
  286.38 -#ifdef	__cplusplus
  286.39 -extern "C" {
  286.40 -#endif
  286.41 -
  286.42 -UCX_TEST(test_ucx_avl_put);
  286.43 -UCX_TEST(test_ucx_avl_remove);
  286.44 -UCX_TEST(test_ucx_avl_find);
  286.45 -UCX_TEST(test_ucx_avl_traverse);
  286.46 -
  286.47 -#ifdef	__cplusplus
  286.48 -}
  286.49 -#endif
  286.50 -
  286.51 -#endif	/* AVL_TEST_H */
  286.52 -
   287.1 --- a/test/buffer_tests.c	Mon Dec 30 09:54:10 2019 +0100
   287.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   287.3 @@ -1,738 +0,0 @@
   287.4 -/*
   287.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   287.6 - *
   287.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   287.8 - *
   287.9 - * Redistribution and use in source and binary forms, with or without
  287.10 - * modification, are permitted provided that the following conditions are met:
  287.11 - *
  287.12 - *   1. Redistributions of source code must retain the above copyright
  287.13 - *      notice, this list of conditions and the following disclaimer.
  287.14 - *
  287.15 - *   2. Redistributions in binary form must reproduce the above copyright
  287.16 - *      notice, this list of conditions and the following disclaimer in the
  287.17 - *      documentation and/or other materials provided with the distribution.
  287.18 - *
  287.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  287.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  287.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  287.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  287.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  287.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  287.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  287.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  287.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  287.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  287.29 - * POSSIBILITY OF SUCH DAMAGE.
  287.30 - */
  287.31 -
  287.32 -#include "buffer_tests.h"
  287.33 -#include <stdint.h>
  287.34 -
  287.35 -UCX_TEST(test_ucx_buffer_new) {
  287.36 -    UcxBuffer *b = ucx_buffer_new(NULL, 16, UCX_BUFFER_AUTOEXTEND);
  287.37 -    UcxBuffer *b2 = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
  287.38 -    UCX_TEST_BEGIN
  287.39 -
  287.40 -    UCX_TEST_ASSERT(b->capacity==16, "wrong capacity");
  287.41 -    UCX_TEST_ASSERT(b2->capacity==32, "wrong capacity");
  287.42 -    
  287.43 -    UCX_TEST_ASSERT(b->size==0, "wrong size");
  287.44 -    UCX_TEST_ASSERT(b2->size==0, "wrong size");
  287.45 -    
  287.46 -    UCX_TEST_ASSERT(b->pos==0, "wrong position");
  287.47 -    UCX_TEST_ASSERT(b2->pos==0, "wrong position");
  287.48 -    
  287.49 -    UCX_TEST_ASSERT(b->flags==(UCX_BUFFER_AUTOEXTEND|UCX_BUFFER_AUTOFREE),
  287.50 -        "wrong flags for autoextending buffer");
  287.51 -    UCX_TEST_ASSERT(b2->flags==UCX_BUFFER_AUTOFREE,
  287.52 -        "wrong flags for default bufer");
  287.53 -    
  287.54 -    UCX_TEST_END
  287.55 -    ucx_buffer_free(b2);
  287.56 -    ucx_buffer_free(b);
  287.57 -}
  287.58 -
  287.59 -UCX_TEST(test_ucx_buffer_new_prealloc) {
  287.60 -    char* test = (char*) malloc(16);
  287.61 -    UcxBuffer *b = ucx_buffer_new(test, 16, UCX_BUFFER_DEFAULT);
  287.62 -    UCX_TEST_BEGIN
  287.63 -
  287.64 -    UCX_TEST_ASSERT(b->capacity==16, "wrong capacity");
  287.65 -    UCX_TEST_ASSERT(b->size==0, "wrong size");    
  287.66 -    UCX_TEST_ASSERT(b->pos==0, "wrong position");
  287.67 -    
  287.68 -    UCX_TEST_ASSERT(b->flags==0, "wrong flags - all should be cleared");
  287.69 -    
  287.70 -    UCX_TEST_END
  287.71 -    free(test);
  287.72 -    ucx_buffer_free(b);
  287.73 -}
  287.74 -
  287.75 -UCX_TEST(test_ucx_buffer_eof) {
  287.76 -    char *test = (char*)"0123456789ABCDEF";
  287.77 -    UcxBuffer *b = ucx_buffer_new(test, 16, UCX_BUFFER_DEFAULT);
  287.78 -    UCX_TEST_BEGIN
  287.79 -    b->pos = 9; b->size = 10;
  287.80 -    UCX_TEST_ASSERT(!ucx_buffer_eof(b), "false positive");
  287.81 -    b->pos = 10; b->size = 10;
  287.82 -    UCX_TEST_ASSERT(ucx_buffer_eof(b), "pos == size should be EOF");
  287.83 -    b->pos = 11; b->size = 10;
  287.84 -    UCX_TEST_ASSERT(ucx_buffer_eof(b), "false negative");
  287.85 -    UCX_TEST_END
  287.86 -    ucx_buffer_free(b);
  287.87 -}
  287.88 -
  287.89 -UCX_TEST(test_ucx_buffer_seek_overflow) {
  287.90 -    UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
  287.91 -    b->size = 32;
  287.92 -    int r;
  287.93 -    
  287.94 -    UCX_TEST_BEGIN
  287.95 -    const size_t sizemax = (size_t)-1;
  287.96 -    size_t bigpos = sizemax - 5000;
  287.97 -    b->pos = bigpos;
  287.98 -    r = ucx_buffer_seek(b, 5016, SEEK_CUR);
  287.99 -    UCX_TEST_ASSERT(r != 0, "seek cur overflow");
 287.100 -    UCX_TEST_ASSERT(b->pos == bigpos,
 287.101 -            "failed seek shall leave pos unchanged");
 287.102 -    
 287.103 -    b->pos = 0;
 287.104 -    b->size = (sizemax >> 1) + 32;
 287.105 -    
 287.106 -    // we don't want to risk overflows in implicit constant casts
 287.107 -    const size_t bigoff_comp = (sizemax >> 1) - 16;
 287.108 -    off_t bigoff = (off_t)bigoff_comp;
 287.109 -    
 287.110 -    r = ucx_buffer_seek(b, -bigoff, SEEK_CUR);
 287.111 -    UCX_TEST_ASSERT(r != 0, "seek cur underflow");
 287.112 -    UCX_TEST_ASSERT(b->pos == 0,
 287.113 -            "failed seek shall leave pos unchanged");
 287.114 -    
 287.115 -    UCX_TEST_END
 287.116 -    
 287.117 -    ucx_buffer_free(b);
 287.118 -}
 287.119 -
 287.120 -UCX_TEST(test_ucx_buffer_seek_invalid) {
 287.121 -    UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
 287.122 -    b->pos = 7;
 287.123 -    int r;
 287.124 -    
 287.125 -    UCX_TEST_BEGIN
 287.126 -    r = ucx_buffer_seek(b, 0, ~(SEEK_SET|SEEK_CUR|SEEK_END));
 287.127 -    UCX_TEST_ASSERT(r != 0, "invalid whence shall fail");
 287.128 -    UCX_TEST_ASSERT(b->pos == 7,
 287.129 -            "failed seek shall leave pos unchanged");
 287.130 -    UCX_TEST_END
 287.131 -    
 287.132 -    ucx_buffer_free(b);
 287.133 -}
 287.134 -
 287.135 -UCX_TEST(test_ucx_buffer_seek_oob) {
 287.136 -    UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
 287.137 -    b->size = 16; // less than capacity
 287.138 -    b->pos = 7;
 287.139 -    int r;
 287.140 -
 287.141 -    UCX_TEST_BEGIN
 287.142 -    
 287.143 -    r = ucx_buffer_seek(b, -1, SEEK_SET);
 287.144 -    UCX_TEST_ASSERT(r != 0, "seek SET below bounds shall fail");
 287.145 -    UCX_TEST_ASSERT(b->pos == 7,
 287.146 -            "failed seek shall leave pos unchanged");
 287.147 -    
 287.148 -    r = ucx_buffer_seek(b, 16, SEEK_SET);
 287.149 -    UCX_TEST_ASSERT(r != 0, "seek SET above bounds shall fail");
 287.150 -    UCX_TEST_ASSERT(b->pos == 7,
 287.151 -            "failed seek shall leave pos unchanged");
 287.152 -    
 287.153 -    r = ucx_buffer_seek(b, -8, SEEK_CUR);
 287.154 -    UCX_TEST_ASSERT(r != 0, "seek CUR below bounds shall fail");
 287.155 -    UCX_TEST_ASSERT(b->pos == 7,
 287.156 -            "failed seek shall leave pos unchanged");
 287.157 -    
 287.158 -    r = ucx_buffer_seek(b, 9, SEEK_CUR);
 287.159 -    UCX_TEST_ASSERT(r != 0, "seek CUR above bounds shall fail");
 287.160 -    UCX_TEST_ASSERT(b->pos == 7,
 287.161 -            "failed seek shall leave pos unchanged");
 287.162 -    
 287.163 -    r = ucx_buffer_seek(b, -17, SEEK_END);
 287.164 -    UCX_TEST_ASSERT(r != 0, "seek END below bounds shall fail");
 287.165 -    UCX_TEST_ASSERT(b->pos == 7,
 287.166 -            "failed seek shall leave pos unchanged");
 287.167 -    
 287.168 -    r = ucx_buffer_seek(b, 1, SEEK_END);
 287.169 -    UCX_TEST_ASSERT(r != 0, "seek END above bounds shall fail");
 287.170 -    UCX_TEST_ASSERT(b->pos == 7,
 287.171 -            "failed seek shall leave pos unchanged");
 287.172 -
 287.173 -    UCX_TEST_END
 287.174 -
 287.175 -    ucx_buffer_free(b);
 287.176 -}
 287.177 -
 287.178 -UCX_TEST(test_ucx_buffer_seek_set) {
 287.179 -    UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
 287.180 -    b->size = 16;
 287.181 -    int r;
 287.182 -
 287.183 -    UCX_TEST_BEGIN
 287.184 -
 287.185 -    r = ucx_buffer_seek(b, 5, SEEK_SET);
 287.186 -    UCX_TEST_ASSERT(r == 0, "seek SET+5 failed");
 287.187 -    UCX_TEST_ASSERT(b->pos == 5, "seek SET+5 set wrong position");
 287.188 -    
 287.189 -    
 287.190 -    r = ucx_buffer_seek(b, 10, SEEK_SET);
 287.191 -    UCX_TEST_ASSERT(r == 0, "seek SET+10 failed");
 287.192 -    UCX_TEST_ASSERT(b->pos == 10, "seek SET+10 set wrong position");
 287.193 -
 287.194 -    UCX_TEST_END
 287.195 -
 287.196 -    ucx_buffer_free(b);
 287.197 -}
 287.198 -
 287.199 -UCX_TEST(test_ucx_buffer_seek_cur) {
 287.200 -    UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
 287.201 -    b->size = 16;
 287.202 -    int r;
 287.203 -
 287.204 -    UCX_TEST_BEGIN
 287.205 -    
 287.206 -    b->pos = 7;
 287.207 -    r = ucx_buffer_seek(b, 5, SEEK_CUR);
 287.208 -    UCX_TEST_ASSERT(r == 0, "seek CUR+5 failed");
 287.209 -    UCX_TEST_ASSERT(b->pos == 12, "seek CUR+5 set wrong position");
 287.210 -
 287.211 -    UCX_TEST_END
 287.212 -
 287.213 -    ucx_buffer_free(b);
 287.214 -}
 287.215 -
 287.216 -UCX_TEST(test_ucx_buffer_seek_end) {
 287.217 -    UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
 287.218 -    b->size = 16;
 287.219 -    int r;
 287.220 -
 287.221 -    UCX_TEST_BEGIN
 287.222 -    
 287.223 -    r = ucx_buffer_seek(b, -5, SEEK_END);
 287.224 -    UCX_TEST_ASSERT(r == 0, "seek END-5 failed");
 287.225 -    UCX_TEST_ASSERT(b->pos == 11, "seek END-5 set wrong position");
 287.226 -
 287.227 -
 287.228 -    UCX_TEST_END
 287.229 -
 287.230 -    ucx_buffer_free(b);
 287.231 -}
 287.232 -
 287.233 -UCX_TEST(test_ucx_buffer_putc) {
 287.234 -    char *buffer = (char*) malloc(16);
 287.235 -    memset(buffer, 32, 16);
 287.236 -
 287.237 -    UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT);
 287.238 -    b->size = b->capacity;
 287.239 -
 287.240 -    UCX_TEST_BEGIN
 287.241 -
 287.242 -    ucx_buffer_seek(b, 0, SEEK_SET);
 287.243 -    UCX_TEST_ASSERT(ucx_buffer_putc(b, '0'|~0xFF) == '0',
 287.244 -            "putc shall return (arg & 0xFF)");
 287.245 -    ucx_buffer_putc(b, '0');
 287.246 -    ucx_buffer_putc(b, '0');
 287.247 -    
 287.248 -    UCX_TEST_ASSERT(b->pos == 3, "pos wrong after first 3 puts");
 287.249 -    ucx_buffer_seek(b, 10, SEEK_CUR);
 287.250 -    
 287.251 -    ucx_buffer_putc(b, '0');
 287.252 -    ucx_buffer_putc(b, '0');
 287.253 -    ucx_buffer_putc(b, '0');
 287.254 -    
 287.255 -    UCX_TEST_ASSERT(b->pos == 16, "pos wrong after last 3 puts");
 287.256 -    
 287.257 -    UCX_TEST_ASSERT(!memcmp(b->space, "000          000", 16),
 287.258 -            "buffer content wrong")
 287.259 -    UCX_TEST_END
 287.260 -    ucx_buffer_free(b);
 287.261 -    free(buffer);
 287.262 -}
 287.263 -    
 287.264 -UCX_TEST(test_ucx_buffer_putc_oob) {
 287.265 -    UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_DEFAULT);
 287.266 -    
 287.267 -    UCX_TEST_BEGIN
 287.268 -    b->pos = b->size = b->capacity = 1;
 287.269 -    b->space[1] = 'X';
 287.270 -    
 287.271 -    UCX_TEST_ASSERT(ucx_buffer_putc(b, 48) == EOF, "put shall return EOF "
 287.272 -            "when buffer is full and auto extend is disabled");
 287.273 -    UCX_TEST_ASSERT(!memcmp(b->space, "\0X", 2),
 287.274 -            "wrong buffer content after failed putc");
 287.275 -
 287.276 -    UCX_TEST_END
 287.277 -
 287.278 -    ucx_buffer_free(b);
 287.279 -}
 287.280 -
 287.281 -
 287.282 -UCX_TEST(test_ucx_buffer_putc_ae) {
 287.283 -    UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND);
 287.284 -    ucx_buffer_putc(b, '0');
 287.285 -    ucx_buffer_putc(b, '1');
 287.286 -    
 287.287 -    UCX_TEST_BEGIN
 287.288 -    
 287.289 -    UCX_TEST_ASSERT(b->pos == 2, "pos wrong after first 2 puts");
 287.290 -    UCX_TEST_ASSERT(b->size == 2, "size wrong after first 2 puts");
 287.291 -    UCX_TEST_ASSERT(b->capacity == 2, "buffer erroneously extended");
 287.292 -    UCX_TEST_ASSERT(!memcmp(b->space,"01", 2), "wrong content");
 287.293 -    
 287.294 -    UCX_TEST_END
 287.295 -    
 287.296 -    ucx_buffer_free(b);
 287.297 -}
 287.298 -
 287.299 -UCX_TEST(test_ucx_buffer_putc_oobae) {
 287.300 -    UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND);
 287.301 -    ucx_buffer_putc(b, '0');
 287.302 -    ucx_buffer_putc(b, '1');
 287.303 -    
 287.304 -    UCX_TEST_BEGIN
 287.305 -    
 287.306 -    ucx_buffer_putc(b, 'a');
 287.307 -    
 287.308 -    UCX_TEST_ASSERT(b->pos == 3, "pos wrong after put");
 287.309 -    UCX_TEST_ASSERT(b->capacity == 4, "buffer not properly extended");
 287.310 -    UCX_TEST_ASSERT(b->size == 3, "wrong buffer size");
 287.311 -    
 287.312 -    UCX_TEST_ASSERT(!memcmp(b->space,"01a\0", 4), "wrong content");
 287.313 -    
 287.314 -    UCX_TEST_END
 287.315 -    
 287.316 -    ucx_buffer_free(b);
 287.317 -}
 287.318 -
 287.319 -UCX_TEST(test_ucx_buffer_putc_size) {
 287.320 -    UcxBuffer *b = ucx_buffer_new(NULL, 4, UCX_BUFFER_DEFAULT);
 287.321 -    
 287.322 -    UCX_TEST_BEGIN
 287.323 -    
 287.324 -    UCX_TEST_ASSERT(b->size == 0, "wrong initial size");
 287.325 -    ucx_buffer_putc(b, 'a');
 287.326 -    ucx_buffer_putc(b, 'b');
 287.327 -    ucx_buffer_putc(b, 'c');
 287.328 -    UCX_TEST_ASSERT(b->size == 3, "size does not increase");
 287.329 -    ucx_buffer_seek(b, 1, SEEK_SET);
 287.330 -    ucx_buffer_putc(b, 'd');
 287.331 -    UCX_TEST_ASSERT(b->size == 3, "size shall not decrease");
 287.332 -    UCX_TEST_ASSERT(b->pos == 2, "wrong position after seek and putc");
 287.333 -
 287.334 -    UCX_TEST_END
 287.335 -
 287.336 -    ucx_buffer_free(b);
 287.337 -}
 287.338 -
 287.339 -UCX_TEST(test_ucx_buffer_getc) {
 287.340 -    char *buffer = (char*) malloc(16);
 287.341 -    memset(buffer, 32, 8);
 287.342 -    for (int i = 8; i < 16 ; i++) {
 287.343 -        buffer[i] = 40+i;
 287.344 -    }
 287.345 -
 287.346 -    UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT);
 287.347 -    b->size = b->capacity;
 287.348 -    
 287.349 -    unsigned char ubuffer[] = {127, 128, 129, 130};
 287.350 -    UcxBuffer *ub = ucx_buffer_new(ubuffer, 4, UCX_BUFFER_DEFAULT);
 287.351 -    ub->size = 4;
 287.352 -
 287.353 -    UCX_TEST_BEGIN
 287.354 -
 287.355 -    char rb[16];
 287.356 -    for (size_t i = 0 ; i < 16 ; i++) {
 287.357 -        UCX_TEST_ASSERT(b->pos == i, "wrong position");
 287.358 -        UCX_TEST_ASSERT(!ucx_buffer_eof(b), "EOF false positive");
 287.359 -        rb[i] = ucx_buffer_getc(b);
 287.360 -    }
 287.361 -    UCX_TEST_ASSERT(memcmp(rb, "        01234567", 16) == 0,
 287.362 -        "read data incorrect");
 287.363 -        
 287.364 -    UCX_TEST_ASSERT(ucx_buffer_eof(b), "EOF not set after last possible read");
 287.365 -    UCX_TEST_ASSERT(b->pos == 16, "wrong position after EOF");
 287.366 -    
 287.367 -    UCX_TEST_ASSERT(ucx_buffer_getc(b) == EOF,
 287.368 -        "out of bounds read does not return EOF");
 287.369 -    UCX_TEST_ASSERT(b->pos == 16, "wrong position after out of bounds read");
 287.370 -    
 287.371 -    int uc[5];
 287.372 -    for(int i=0;i<5;i++) {
 287.373 -        uc[i] = ucx_buffer_getc(ub);
 287.374 -    }
 287.375 -    UCX_TEST_ASSERT(uc[0] == 127, "wrong unsigned value(0)");
 287.376 -    UCX_TEST_ASSERT(uc[1] == 128, "wrong unsigned value(0)");
 287.377 -    UCX_TEST_ASSERT(uc[2] == 129, "wrong unsigned value(0)");
 287.378 -    UCX_TEST_ASSERT(uc[3] == 130, "wrong unsigned value(0)");
 287.379 -    UCX_TEST_ASSERT(uc[4] == EOF, "EOF not set after last ub read");
 287.380 -
 287.381 -    UCX_TEST_END
 287.382 -
 287.383 -    ucx_buffer_free(b);
 287.384 -    ucx_buffer_free(ub);
 287.385 -    free(buffer);
 287.386 -}
 287.387 -
 287.388 -UCX_TEST(test_ucx_buffer_write) {
 287.389 -    char *buffer = (char*) malloc(32);
 287.390 -    memset(buffer, 0, 32);
 287.391 -    
 287.392 -    memset(buffer, 32, 8);
 287.393 -    for (int i = 8; i < 16 ; i++) {
 287.394 -        buffer[i] = 40+i;
 287.395 -    }
 287.396 -
 287.397 -    UcxBuffer *b = ucx_buffer_new(buffer, 32, UCX_BUFFER_DEFAULT);
 287.398 -    int r;
 287.399 -
 287.400 -    UCX_TEST_BEGIN
 287.401 -    b->pos = 4;
 287.402 -    r = ucx_buffer_write("test string", 1, 11, b);
 287.403 -    UCX_TEST_ASSERT(r == 11, "returned incorrect number of written bytes");
 287.404 -    UCX_TEST_ASSERT(b->pos == 15, "incorrect position");
 287.405 -    UCX_TEST_ASSERT(memcmp(buffer, "    test string7\0\0", 18) == 0,
 287.406 -        "incorrect buffer content (test string)");
 287.407 -    
 287.408 -    r = ucx_buffer_write(".", 1, 1, b);
 287.409 -    UCX_TEST_ASSERT(r == 1, "returned incorrect number of written elements");
 287.410 -    UCX_TEST_ASSERT(b->pos == 16, "incorrect position");
 287.411 -    
 287.412 -    int32_t testarr[4] = {0x09abcdef, 0x05fedcba, 0x01abefcd, 0x3cd07ab};
 287.413 -    r = ucx_buffer_write(testarr, 4, 4, b);
 287.414 -    UCX_TEST_ASSERT(r = 4, "returned incorrect number of written elements");
 287.415 -    UCX_TEST_ASSERT(b->pos == 32, "incorrect position");
 287.416 -    
 287.417 -    char cmp[32];
 287.418 -    memset(cmp, 0, 32);
 287.419 -    memcpy(cmp, "    test string.", 16);
 287.420 -    int32_t *ptr = (int32_t*) (cmp+16);
 287.421 -    ptr[0] = testarr[0];
 287.422 -    ptr[1] = testarr[1];
 287.423 -    ptr[2] = testarr[2];
 287.424 -    ptr[3] = testarr[3];
 287.425 -    UCX_TEST_ASSERT(memcmp(buffer, cmp, 32) == 0,
 287.426 -        "incorrect buffer content (int array)");
 287.427 -    
 287.428 -    UCX_TEST_END
 287.429 -
 287.430 -    ucx_buffer_free(b);
 287.431 -    free(buffer);
 287.432 -}
 287.433 -
 287.434 -UCX_TEST(test_ucx_buffer_write_oob) {
 287.435 -    char *buffer = (char*) malloc(32);
 287.436 -    memset(buffer, 0, 32);
 287.437 -
 287.438 -    UcxBuffer *b = ucx_buffer_new(buffer, 15, UCX_BUFFER_DEFAULT);
 287.439 -    int r;
 287.440 -
 287.441 -    UCX_TEST_BEGIN
 287.442 -    r = ucx_buffer_write("a very long string", 1, 18, b);
 287.443 -    UCX_TEST_ASSERT(r == 15, "incorrect number of written bytes");
 287.444 -    UCX_TEST_ASSERT(memcmp(buffer, "a very long str\0\0\0", 18) == 0,
 287.445 -        "invalid buffer content (test string)");
 287.446 -    
 287.447 -    b->size = b->pos = 0;
 287.448 -    int32_t intarr[4] = {0,-1,0,-1};
 287.449 -    memset(buffer, 0, 32);
 287.450 -    
 287.451 -    r = ucx_buffer_write(intarr, 4, 4, b);
 287.452 -    UCX_TEST_ASSERT(r == 3, "incorrect number of written elements");
 287.453 -    UCX_TEST_ASSERT(memcmp(buffer,
 287.454 -        "\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0", 16) == 0,
 287.455 -        "invalid buffer content (test string)");
 287.456 -    
 287.457 -    UCX_TEST_END
 287.458 -
 287.459 -    ucx_buffer_free(b);
 287.460 -    free(buffer);
 287.461 -}
 287.462 -
 287.463 -UCX_TEST(test_ucx_buffer_write_ax) {
 287.464 -    char *buffer = (char*) malloc(16);
 287.465 -    memset(buffer, 0, 16);
 287.466 -
 287.467 -    UcxBuffer *b = ucx_buffer_new(buffer, 16,
 287.468 -            UCX_BUFFER_AUTOEXTEND | UCX_BUFFER_AUTOFREE);
 287.469 -    int r;
 287.470 -
 287.471 -    UCX_TEST_BEGIN
 287.472 -
 287.473 -    const char* teststring = "this is way too much";
 287.474 -    r = ucx_buffer_write((void*)teststring, 1, 20, b);
 287.475 -    buffer = (char*) b->space; /*autoextend enabled, we MUST retrieve pointer*/
 287.476 -    UCX_TEST_ASSERT(r == 20, "not all characters written");
 287.477 -    UCX_TEST_ASSERT(b->capacity == 32, "buffer not properly extended");
 287.478 -    UCX_TEST_ASSERT(b->pos == 20, "position incorrect");
 287.479 -    UCX_TEST_ASSERT(memcmp(buffer,
 287.480 -            "this is way too much\0\0\0\0\0\0\0\0\0\0\0\0", 32) == 0,
 287.481 -            "incorrect buffer content");
 287.482 -
 287.483 -    UCX_TEST_END
 287.484 -
 287.485 -    ucx_buffer_free(b);
 287.486 -}
 287.487 -
 287.488 -UCX_TEST(test_ucx_buffer_read) {
 287.489 -    UcxBuffer *b = ucx_buffer_new(NULL, 8, UCX_BUFFER_AUTOFREE);
 287.490 -    ucx_buffer_write("01234567", 1, 8, b);
 287.491 -    b->pos = 0;
 287.492 -    
 287.493 -    char buf[32];
 287.494 -    memset(buf, 'X', 32);
 287.495 -    int r;
 287.496 -    
 287.497 -    UCX_TEST_BEGIN
 287.498 -    
 287.499 -    ucx_buffer_seek(b, 2, SEEK_SET);
 287.500 -    r = ucx_buffer_read(buf, 1, 2, b);
 287.501 -    UCX_TEST_ASSERT(r == 2, "wrong number of bytes read (2 items)");
 287.502 -    UCX_TEST_ASSERT(buf[0] == '2' && buf[1] == '3' && buf[2] == 'X',
 287.503 -            "buffer incorrect after read");
 287.504 -    UCX_TEST_ASSERT(b->pos == 4, "wrong position after read (2 items)");
 287.505 -    
 287.506 -    UCX_TEST_END
 287.507 -    
 287.508 -    ucx_buffer_free(b);
 287.509 -}
 287.510 -
 287.511 -UCX_TEST(test_ucx_buffer_read_oob) {
 287.512 -    UcxBuffer *b = ucx_buffer_new(NULL, 8, UCX_BUFFER_AUTOFREE);
 287.513 -    ucx_buffer_write("01234567", 1, 8, b);
 287.514 -    
 287.515 -    char buf[32];
 287.516 -    memset(buf, 'X', 32);
 287.517 -    int r;
 287.518 -    
 287.519 -    UCX_TEST_BEGIN
 287.520 -
 287.521 -    b->pos = 2;
 287.522 -    r = ucx_buffer_read(buf + 2, 1, 8, b);
 287.523 -    UCX_TEST_ASSERT(r == 6, "wrong number of bytes read (8 items)");
 287.524 -    UCX_TEST_ASSERT(memcmp(buf, "XX234567XX", 10) == 0,
 287.525 -            "buffer incorrect after read");
 287.526 -    UCX_TEST_ASSERT(b->pos == 8,
 287.527 -        "wrong position after read (8 items out of bound)");
 287.528 -
 287.529 -    b->pos = 0;
 287.530 -    memset(buf, 'X', 32);
 287.531 -    
 287.532 -    r = ucx_buffer_read(buf, 3, 3, b);
 287.533 -    
 287.534 -    UCX_TEST_ASSERT(r == 2, "wrong number of blocks read");
 287.535 -    UCX_TEST_ASSERT(memcmp(buf, "012345XX", 8) == 0,
 287.536 -            "buffer incorrect after block out of bounds read");
 287.537 -    
 287.538 -    r = ucx_buffer_read(buf+6, 1, 5, b);
 287.539 -    
 287.540 -    UCX_TEST_ASSERT(r == 2, "wrong number of remaining bytes read");
 287.541 -    UCX_TEST_ASSERT(memcmp(buf, "01234567XX", 10) == 0,
 287.542 -            "buffer incorrect after remaining byte read");
 287.543 -    
 287.544 -    UCX_TEST_END
 287.545 -    
 287.546 -    ucx_buffer_free(b);
 287.547 -}
 287.548 -
 287.549 -UCX_TEST(test_ucx_buffer_extract) {
 287.550 -    char *buffer = (char*) malloc(16);
 287.551 -    strcpy(buffer, "this is a test!");
 287.552 -
 287.553 -    UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE);
 287.554 -    src->size = 16;
 287.555 -    UcxBuffer *dst = ucx_buffer_extract(src, 5, 5, UCX_BUFFER_AUTOEXTEND);
 287.556 -
 287.557 -    UCX_TEST_BEGIN
 287.558 -    UCX_TEST_ASSERT(dst != NULL, "ucx_buffer_extract returned NULL");
 287.559 -    UCX_TEST_ASSERT(dst->flags == (UCX_BUFFER_AUTOEXTEND | UCX_BUFFER_AUTOFREE),
 287.560 -            "autofree flag shall be enforced");
 287.561 -    UCX_TEST_ASSERT(dst->size == 5, "wrong size for new buffer");
 287.562 -    UCX_TEST_ASSERT(dst->capacity == 5, "wrong capacity for new buffer");
 287.563 -    UCX_TEST_ASSERT(dst->pos == 0, "wrong position for new buffer");
 287.564 -    char rb[5];
 287.565 -    ucx_buffer_read(rb, 1, 5, dst);
 287.566 -    UCX_TEST_ASSERT(memcmp(rb, "is a ", 5) == 0,
 287.567 -            "new buffer has incorrect content");
 287.568 -
 287.569 -    UCX_TEST_END
 287.570 -
 287.571 -    ucx_buffer_free(dst);
 287.572 -    ucx_buffer_free(src);
 287.573 -}
 287.574 -
 287.575 -UCX_TEST(test_ucx_buffer_extract_oob) {
 287.576 -    char *buffer = (char*) malloc(16);
 287.577 -    strcpy(buffer, "this is a test!");
 287.578 -
 287.579 -    UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE);
 287.580 -    src->size = 16;
 287.581 -    
 287.582 -    UCX_TEST_BEGIN
 287.583 -    
 287.584 -    UCX_TEST_ASSERT(ucx_buffer_extract(src, 5, 0, UCX_BUFFER_DEFAULT) == NULL,
 287.585 -            "extract shall fail on zero length");
 287.586 -    UCX_TEST_ASSERT(ucx_buffer_extract(src, 10, 10, UCX_BUFFER_DEFAULT) == NULL,
 287.587 -            "extract shall fail on invalid bounds (size exceeds limits)");
 287.588 -    UCX_TEST_ASSERT(ucx_buffer_extract(src, 20, -7, UCX_BUFFER_DEFAULT) == NULL,
 287.589 -            "extract shall fail on invalid bounds (start exceeds limits)");
 287.590 -
 287.591 -    UCX_TEST_END
 287.592 -
 287.593 -    ucx_buffer_free(src);
 287.594 -}
 287.595 -
 287.596 -UCX_TEST(test_ucx_buffer_extract_overflow) {
 287.597 -    char *buffer = (char*) malloc(16);
 287.598 -    strcpy(buffer, "this is a test!");
 287.599 -
 287.600 -    UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE);
 287.601 -    src->size = 16;
 287.602 -    
 287.603 -    UCX_TEST_BEGIN
 287.604 -    
 287.605 -    UCX_TEST_ASSERT(ucx_buffer_extract(src, 5, (size_t)-4,
 287.606 -        UCX_BUFFER_DEFAULT) == NULL, "extract shall fail on integer overflow");
 287.607 -
 287.608 -    UCX_TEST_END
 287.609 -
 287.610 -    ucx_buffer_free(src);
 287.611 -}
 287.612 -
 287.613 -UCX_TEST(test_ucx_buffer_extend) {
 287.614 -    
 287.615 -    UcxBuffer *b = ucx_buffer_new(NULL, 10, UCX_BUFFER_DEFAULT);
 287.616 -    
 287.617 -    UCX_TEST_BEGIN
 287.618 -    
 287.619 -    UCX_TEST_ASSERT(ucx_buffer_extend(b, 15) == 0, "shall return 0 on success");
 287.620 -    UCX_TEST_ASSERT(b->capacity = 40, "wrong capacity");
 287.621 -    UCX_TEST_ASSERT((b->size == 0 && b->pos == 0),
 287.622 -        "pos and size shall remain unchanged");
 287.623 -    
 287.624 -    UCX_TEST_ASSERT(ucx_buffer_extend(b, (size_t) - 61) != 0,
 287.625 -        "shall fail and return a non-zero value on overflow");
 287.626 -    
 287.627 -    UCX_TEST_END
 287.628 -    
 287.629 -    ucx_buffer_free(b);
 287.630 -}
 287.631 -
 287.632 -UCX_TEST(test_ucx_buffer_shl) {
 287.633 -    
 287.634 -    const char* hw = "Shift the World!";
 287.635 -    
 287.636 -    UcxBuffer *b = ucx_buffer_new(NULL, 20, UCX_BUFFER_DEFAULT);
 287.637 -    ucx_buffer_puts(b, hw);
 287.638 -    b->pos = 5;
 287.639 -    
 287.640 -    UCX_TEST_BEGIN
 287.641 -    char* expected;
 287.642 -    
 287.643 -    ucx_buffer_shift_left(b, 2);
 287.644 -    expected = "ift the World!";
 287.645 -    
 287.646 -    UCX_TEST_ASSERT(b->pos == 3, "position after normal shl wrong");
 287.647 -    UCX_TEST_ASSERT(b->size == strlen(expected), "size after normal shl wrong");
 287.648 -    UCX_TEST_ASSERT(!memcmp(b->space, expected, b->size),
 287.649 -            "contents after normal shl wrong");
 287.650 -    
 287.651 -    
 287.652 -    ucx_buffer_shift_left(b, 5);
 287.653 -    expected = "he World!";
 287.654 -    
 287.655 -    UCX_TEST_ASSERT(b->pos == 0, "position after overshift left wrong");
 287.656 -    UCX_TEST_ASSERT(b->size == strlen(expected),
 287.657 -            "size after overshift left wrong");
 287.658 -    UCX_TEST_ASSERT(!memcmp(b->space, expected, b->size),
 287.659 -            "contents after overshift left wrong");
 287.660 -    
 287.661 -    ucx_buffer_shift_left(b, 10);
 287.662 -    UCX_TEST_ASSERT(b->pos == 0, "position after 'shl everything away' wrong");
 287.663 -    UCX_TEST_ASSERT(b->size == 0, "size after 'shl everything away' wrong");
 287.664 -    
 287.665 -    UCX_TEST_END
 287.666 -    
 287.667 -    ucx_buffer_free(b);    
 287.668 -}
 287.669 -
 287.670 -UCX_TEST(test_ucx_buffer_shr) {
 287.671 -    
 287.672 -    const char* hw = "Shift the World!";
 287.673 -    
 287.674 -    UcxBuffer *b = ucx_buffer_new(NULL, 20, UCX_BUFFER_DEFAULT);
 287.675 -    ucx_buffer_puts(b, hw);
 287.676 -    b->pos = 12;
 287.677 -    
 287.678 -    UCX_TEST_BEGIN
 287.679 -    char* expected;
 287.680 -    
 287.681 -    ucx_buffer_shift_right(b, 2);
 287.682 -    expected = "ShShift the World!";
 287.683 -    
 287.684 -    UCX_TEST_ASSERT(b->pos == 14, "position after normal shr wrong");
 287.685 -    UCX_TEST_ASSERT(b->size == strlen(expected), "size after normal shr wrong");
 287.686 -    UCX_TEST_ASSERT(!memcmp(b->space, expected, b->size),
 287.687 -            "contents after normal shr wrong");
 287.688 -    
 287.689 -    
 287.690 -    ucx_buffer_shift_right(b, 5);
 287.691 -    expected = "ShShiShShift the Wor";
 287.692 -    UCX_TEST_ASSERT(strlen(expected) == b->capacity,
 287.693 -            "Test data is wrong, please fix the test.");
 287.694 -    
 287.695 -    UCX_TEST_ASSERT(b->pos == 19,
 287.696 -            "position after overshift right w/o auto-extend wrong");
 287.697 -    UCX_TEST_ASSERT(b->size == 20,
 287.698 -            "size after overshift right w/o auto-extend wrong");
 287.699 -    UCX_TEST_ASSERT(b->capacity == 20,
 287.700 -            "capacity after overshift right w/o auto-extend wrong");
 287.701 -    UCX_TEST_ASSERT(!memcmp(b->space, expected, b->size),
 287.702 -            "contents after overshift right w/o auto-extend wrong");
 287.703 -    
 287.704 -    ucx_buffer_shift_right(b, 15);
 287.705 -    UCX_TEST_ASSERT(b->pos == b->capacity, "position after 'shr to eof' wrong");
 287.706 -    UCX_TEST_ASSERT(b->size == b->capacity, "size after 'shr to eof' wrong");
 287.707 -    UCX_TEST_ASSERT(ucx_buffer_eof(b), "buffer not eof after 'shr to eof'");
 287.708 -    
 287.709 -    UCX_TEST_END
 287.710 -    
 287.711 -    ucx_buffer_free(b);    
 287.712 -}
 287.713 -
 287.714 -UCX_TEST(test_ucx_buffer_shr_ax) {
 287.715 -    
 287.716 -    const char* hw = "Shift the World!";
 287.717 -    
 287.718 -    UcxBuffer *b = ucx_buffer_new(NULL, 20, UCX_BUFFER_AUTOEXTEND);
 287.719 -    ucx_buffer_puts(b, hw);
 287.720 -    b->pos = 12;
 287.721 -    
 287.722 -    UCX_TEST_BEGIN
 287.723 -    
 287.724 -    const char* expected = "Shift the Shift the World!";
 287.725 -    
 287.726 -    ucx_buffer_shift_right(b, 10);
 287.727 -    UCX_TEST_ASSERT(b->pos == 22, "position after shr w/ auto-extend wrong");
 287.728 -    UCX_TEST_ASSERT(b->size == strlen(expected),
 287.729 -            "size after shr w/ auto-extend wrong");
 287.730 -    UCX_TEST_ASSERT(b->capacity >= b->size,
 287.731 -            "auto-extension of capacity after shr w/ auto-extend failed");
 287.732 -    UCX_TEST_ASSERT(!ucx_buffer_eof(b),
 287.733 -            "buffer should not be eof after shr w/ auto-extend");
 287.734 -    UCX_TEST_ASSERT(!memcmp(b->space, expected, b->size),
 287.735 -            "contents wrong after shr w/ auto-extend");
 287.736 -    
 287.737 -    UCX_TEST_END
 287.738 -    
 287.739 -    ucx_buffer_free(b);    
 287.740 -}
 287.741 -
   288.1 --- a/test/buffer_tests.h	Mon Dec 30 09:54:10 2019 +0100
   288.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   288.3 @@ -1,73 +0,0 @@
   288.4 -/*
   288.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   288.6 - *
   288.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   288.8 - *
   288.9 - * Redistribution and use in source and binary forms, with or without
  288.10 - * modification, are permitted provided that the following conditions are met:
  288.11 - *
  288.12 - *   1. Redistributions of source code must retain the above copyright
  288.13 - *      notice, this list of conditions and the following disclaimer.
  288.14 - *
  288.15 - *   2. Redistributions in binary form must reproduce the above copyright
  288.16 - *      notice, this list of conditions and the following disclaimer in the
  288.17 - *      documentation and/or other materials provided with the distribution.
  288.18 - *
  288.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  288.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  288.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  288.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  288.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  288.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  288.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  288.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  288.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  288.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  288.29 - * POSSIBILITY OF SUCH DAMAGE.
  288.30 - */
  288.31 -
  288.32 -#ifndef BUFFER_TEST_H
  288.33 -#define	BUFFER_TEST_H
  288.34 -
  288.35 -#include <ucx/test.h>
  288.36 -#include <ucx/buffer.h>
  288.37 -
  288.38 -#ifdef	__cplusplus
  288.39 -extern "C" {
  288.40 -#endif
  288.41 -
  288.42 -UCX_TEST(test_ucx_buffer_eof);
  288.43 -UCX_TEST(test_ucx_buffer_seek_set);
  288.44 -UCX_TEST(test_ucx_buffer_seek_end);
  288.45 -UCX_TEST(test_ucx_buffer_seek_cur);
  288.46 -UCX_TEST(test_ucx_buffer_seek_oob);
  288.47 -UCX_TEST(test_ucx_buffer_seek_invalid);
  288.48 -UCX_TEST(test_ucx_buffer_seek_overflow);
  288.49 -UCX_TEST(test_ucx_buffer_putc);
  288.50 -UCX_TEST(test_ucx_buffer_putc_ae);
  288.51 -UCX_TEST(test_ucx_buffer_putc_oob);
  288.52 -UCX_TEST(test_ucx_buffer_putc_oobae);
  288.53 -UCX_TEST(test_ucx_buffer_putc_size);
  288.54 -UCX_TEST(test_ucx_buffer_new);
  288.55 -UCX_TEST(test_ucx_buffer_new_prealloc);
  288.56 -UCX_TEST(test_ucx_buffer_getc);
  288.57 -UCX_TEST(test_ucx_buffer_read);
  288.58 -UCX_TEST(test_ucx_buffer_read_oob);
  288.59 -UCX_TEST(test_ucx_buffer_extract);
  288.60 -UCX_TEST(test_ucx_buffer_extract_oob);
  288.61 -UCX_TEST(test_ucx_buffer_extract_overflow);
  288.62 -UCX_TEST(test_ucx_buffer_extend);
  288.63 -UCX_TEST(test_ucx_buffer_write);
  288.64 -UCX_TEST(test_ucx_buffer_write_oob);
  288.65 -UCX_TEST(test_ucx_buffer_write_ax);
  288.66 -UCX_TEST(test_ucx_buffer_shl);
  288.67 -UCX_TEST(test_ucx_buffer_shr);
  288.68 -UCX_TEST(test_ucx_buffer_shr_ax);
  288.69 -
  288.70 -
  288.71 -#ifdef	__cplusplus
  288.72 -}
  288.73 -#endif
  288.74 -
  288.75 -#endif	/* BUFFER_TEST_H */
  288.76 -
   289.1 --- a/test/list_tests.c	Mon Dec 30 09:54:10 2019 +0100
   289.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   289.3 @@ -1,496 +0,0 @@
   289.4 -/*
   289.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   289.6 - *
   289.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   289.8 - *
   289.9 - * Redistribution and use in source and binary forms, with or without
  289.10 - * modification, are permitted provided that the following conditions are met:
  289.11 - *
  289.12 - *   1. Redistributions of source code must retain the above copyright
  289.13 - *      notice, this list of conditions and the following disclaimer.
  289.14 - *
  289.15 - *   2. Redistributions in binary form must reproduce the above copyright
  289.16 - *      notice, this list of conditions and the following disclaimer in the
  289.17 - *      documentation and/or other materials provided with the distribution.
  289.18 - *
  289.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  289.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  289.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  289.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  289.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  289.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  289.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  289.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  289.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  289.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  289.29 - * POSSIBILITY OF SUCH DAMAGE.
  289.30 - */
  289.31 -
  289.32 -#include "list_tests.h"
  289.33 -#include <ucx/utils.h>
  289.34 -
  289.35 -UCX_TEST(test_ucx_list_append) {
  289.36 -    UcxList *list, *first;
  289.37 -    list = first = ucx_list_append(NULL, (void*)"Hello");
  289.38 -    UCX_TEST_BEGIN
  289.39 -    
  289.40 -    UCX_TEST_ASSERT(strncmp((const char*)list->data, "Hello", 5) == 0,
  289.41 -            "failed");
  289.42 -    
  289.43 -    list = ucx_list_append(list, (void*)" World!");
  289.44 -    
  289.45 -    UCX_TEST_ASSERT(list == first, "does not return first element");
  289.46 -    UCX_TEST_ASSERT(strncmp((const char*)list->next->data, " World!", 7) == 0,
  289.47 -            "failed");
  289.48 -    UCX_TEST_ASSERT(list->next->prev == list, "failed");
  289.49 -    UCX_TEST_ASSERT(list->next->next == NULL, "failed");
  289.50 -    UCX_TEST_END
  289.51 -    
  289.52 -    ucx_list_free(list);
  289.53 -}
  289.54 -
  289.55 -UCX_TEST(test_ucx_list_prepend) {
  289.56 -    UcxList *list, *last;
  289.57 -    list = last = ucx_list_prepend(NULL, (void*)" World!");
  289.58 -    UCX_TEST_BEGIN
  289.59 -
  289.60 -    list = ucx_list_prepend(list, (void*)"Hello");
  289.61 -    
  289.62 -    UCX_TEST_ASSERT(strncmp((const char*)list->data, "Hello", 5) == 0,
  289.63 -            "failed");
  289.64 -    UCX_TEST_ASSERT(strncmp((const char*)list->next->data, " World!", 7) == 0,
  289.65 -            "failed");
  289.66 -    UCX_TEST_ASSERT(list == last->prev, "does not return first element");
  289.67 -    UCX_TEST_ASSERT(list->next->next == NULL, "failed");
  289.68 -    UCX_TEST_ASSERT(list->prev == NULL, "failed");
  289.69 -    
  289.70 -    UCX_TEST_END
  289.71 -    ucx_list_free(list);
  289.72 -}
  289.73 -
  289.74 -UCX_TEST(test_ucx_list_equals) {
  289.75 -    const char *hello = "Hello";
  289.76 -    const char *world = " World!";
  289.77 -    UcxList *list = ucx_list_append(NULL, (void*)hello);
  289.78 -    list = ucx_list_append(list, (void*)world);
  289.79 -    UcxList *list2 = ucx_list_prepend(NULL, (void*)world);
  289.80 -    list2 = ucx_list_prepend(list2, (void*)hello);
  289.81 -    UcxList *list3 = ucx_list_prepend(NULL, (void*)" Welt!");
  289.82 -    list3 = ucx_list_prepend(list3, (void*)"Hallo");
  289.83 -    UcxList *list4 = ucx_list_prepend(NULL, (void*)" World!");
  289.84 -    list4 = ucx_list_prepend(list4, (void*)"Hello");
  289.85 -    UCX_TEST_BEGIN
  289.86 -    
  289.87 -    UCX_TEST_ASSERT(ucx_list_equals(list, list4, ucx_cmp_str, NULL), "failed");
  289.88 -    UCX_TEST_ASSERT(!ucx_list_equals(list, list3, ucx_cmp_str, NULL), "failed");
  289.89 -    UCX_TEST_ASSERT(ucx_list_equals(list, list2, NULL, NULL), "failed");
  289.90 -    
  289.91 -    UCX_TEST_END
  289.92 -    ucx_list_free(list4);
  289.93 -    ucx_list_free(list3);
  289.94 -    ucx_list_free(list2);
  289.95 -    ucx_list_free(list);
  289.96 -}
  289.97 -
  289.98 -UCX_TEST(test_ucx_list_concat) {
  289.99 -    UcxList *list = ucx_list_append(NULL, (void*)"Hello");
 289.100 -    list = ucx_list_append(list, (void*)" my ");
 289.101 -    UcxList *list2 = ucx_list_prepend(NULL, (void*)" World!");
 289.102 -    list2 = ucx_list_prepend(list2, (void*)" sweet ");
 289.103 -    UCX_TEST_BEGIN
 289.104 -    
 289.105 -    list = ucx_list_concat(list, list2);
 289.106 -    list = ucx_list_concat(list, NULL);
 289.107 -    list = ucx_list_concat(NULL, list);
 289.108 -    
 289.109 -    UCX_TEST_ASSERT(!strncmp((const char*)list->data, "Hello", 5),
 289.110 -            "failed");
 289.111 -    UCX_TEST_ASSERT(!strncmp((const char*)list->next->data, " my ", 4),
 289.112 -            "failed");
 289.113 -    UCX_TEST_ASSERT(!strncmp((const char*)list->next->next->data, " sweet ", 7),
 289.114 -            "failed");
 289.115 -    UCX_TEST_ASSERT(!strncmp((const char*)ucx_list_last(list)->data,
 289.116 -            " World!", 7), "failed");
 289.117 -
 289.118 -    UCX_TEST_ASSERT(list->prev == NULL, "failed");
 289.119 -    
 289.120 -    UCX_TEST_END
 289.121 -    // don't free list2, as it is freed by freeing list;
 289.122 -    ucx_list_free(list);
 289.123 -}
 289.124 -
 289.125 -UCX_TEST(test_ucx_list_size) {
 289.126 -    UcxList *list = ucx_list_append(NULL, (void*)"This ");
 289.127 -    list = ucx_list_append(list, (void*)"list ");
 289.128 -    list = ucx_list_append(list, (void*)"has ");
 289.129 -    list = ucx_list_append(list, (void*)"size ");
 289.130 -    list = ucx_list_append(list, (void*)"5!");
 289.131 -    
 289.132 -    UCX_TEST_BEGIN
 289.133 -    
 289.134 -    UCX_TEST_ASSERT(ucx_list_size(list) == 5, "failed");
 289.135 -    list = ucx_list_remove(list, ucx_list_get(list, 2));
 289.136 -    UCX_TEST_ASSERT(ucx_list_size(list) == 4, "failed after removal");
 289.137 -    
 289.138 -    UCX_TEST_END
 289.139 -    ucx_list_free(list);
 289.140 -}
 289.141 -
 289.142 -UCX_TEST(test_ucx_list_first) {
 289.143 -    UcxList *list = ucx_list_append(NULL, (void*)"Find ");
 289.144 -    list = ucx_list_append(list, (void*)"the ");
 289.145 -    list = ucx_list_append(list, (void*)"first!");
 289.146 -    
 289.147 -    UCX_TEST_BEGIN
 289.148 -    
 289.149 -    const char* first = (const char*) (ucx_list_first(list)->data);
 289.150 -    
 289.151 -    UCX_TEST_ASSERT(strncmp(first, "Find ", 5) == 0, "failed");
 289.152 -    UCX_TEST_ASSERT(ucx_list_first(list->next->next) == list, "failed");
 289.153 -    UCX_TEST_ASSERT(!ucx_list_first(NULL),
 289.154 -        "does not return NULL on an empty list");
 289.155 -    
 289.156 -    UCX_TEST_END
 289.157 -    ucx_list_free(list);
 289.158 -}
 289.159 -
 289.160 -UCX_TEST(test_ucx_list_last) {
 289.161 -    UcxList *list = ucx_list_append(NULL, (void*)"Find ");
 289.162 -    list = ucx_list_append(list, (void*)"the ");
 289.163 -    list = ucx_list_append(list, (void*)"last!");
 289.164 -    
 289.165 -    UCX_TEST_BEGIN
 289.166 -    
 289.167 -    const char* last = (const char*) (ucx_list_last(list->next->next)->data);
 289.168 -    
 289.169 -    UCX_TEST_ASSERT(strncmp(last, "last!", 5) == 0, "failed");
 289.170 -    UCX_TEST_ASSERT(ucx_list_last(list) == list->next->next, "failed");
 289.171 -    UCX_TEST_ASSERT(!ucx_list_last(NULL),
 289.172 -        "does not return NULL on an empty list");
 289.173 -    
 289.174 -    UCX_TEST_END
 289.175 -    ucx_list_free(list);
 289.176 -}
 289.177 -
 289.178 -UCX_TEST(test_ucx_list_get) {
 289.179 -    UcxList *list = ucx_list_append(NULL, (void*)"Find ");
 289.180 -    list = ucx_list_append(list, (void*)"the ");
 289.181 -    list = ucx_list_append(list, (void*)"mid!");
 289.182 -    
 289.183 -    UCX_TEST_BEGIN
 289.184 -    
 289.185 -    const char* first = (const char*) (ucx_list_get(list, 0)->data);
 289.186 -    const char* mid = (const char*) (ucx_list_get(list, 1)->data);
 289.187 -    const char* last = (const char*) (ucx_list_get(list, 2)->data);
 289.188 -    
 289.189 -    UCX_TEST_ASSERT(strncmp(first, "Find ", 5) == 0, "failed");
 289.190 -    UCX_TEST_ASSERT(strncmp(mid, "the ", 4) == 0, "failed");
 289.191 -    UCX_TEST_ASSERT(strncmp(last, "mid!", 4) == 0, "failed");
 289.192 -    UCX_TEST_ASSERT(!ucx_list_get(list, -1), "out of bounds (neg)");
 289.193 -    UCX_TEST_ASSERT(!ucx_list_get(list, 3), "out of bounds");
 289.194 -    UCX_TEST_ASSERT(!ucx_list_get(NULL, 0), "empty list");
 289.195 -    
 289.196 -    UCX_TEST_END
 289.197 -    ucx_list_free(list);
 289.198 -}
 289.199 -
 289.200 -UCX_TEST(test_ucx_list_indexof) {
 289.201 -    UcxList *list = ucx_list_append(NULL, (void*)"Find ");
 289.202 -    list = ucx_list_append(list, (void*)"the ");
 289.203 -    list = ucx_list_append(list, (void*)"mid!");
 289.204 -    
 289.205 -    UCX_TEST_BEGIN
 289.206 -    
 289.207 -    UCX_TEST_ASSERT(ucx_list_indexof(list, list) == 0, "failed");
 289.208 -    UCX_TEST_ASSERT(ucx_list_indexof(list, list->next) == 1, "failed");
 289.209 -    UCX_TEST_ASSERT(ucx_list_indexof(list, ucx_list_get(list, 2)) == 2,
 289.210 -        "failed");
 289.211 -    
 289.212 -    UcxList *otherlist = ucx_list_append(NULL, (void*) "the ");
 289.213 -    UCX_TEST_ASSERT(ucx_list_indexof(list, otherlist) == -1, "failed");
 289.214 -    UCX_TEST_ASSERT(ucx_list_indexof(NULL, otherlist) == -1, "empty list");
 289.215 -
 289.216 -    ucx_list_free(otherlist);
 289.217 -    
 289.218 -    UCX_TEST_END
 289.219 -    ucx_list_free(list);
 289.220 -}
 289.221 -
 289.222 -UCX_TEST(test_ucx_list_find) {
 289.223 -    const char* teststr = "string!";
 289.224 -    UcxList *l = ucx_list_append(NULL, (void*)"find ");
 289.225 -    l = ucx_list_append(l, (void*)"some ");
 289.226 -    l = ucx_list_append(l, (void*)teststr);
 289.227 -    
 289.228 -    UCX_TEST_BEGIN
 289.229 -    
 289.230 -    UCX_TEST_ASSERT(ucx_list_find(l,(void*)"some ",ucx_cmp_str,NULL) == 1,
 289.231 -        "doesn't find string");
 289.232 -    UCX_TEST_ASSERT(ucx_list_find(l,(void*)"a",ucx_cmp_str,NULL) == -1,
 289.233 -        "finds non-existing string");
 289.234 -    
 289.235 -    UCX_TEST_ASSERT(ucx_list_find(l,(void*)teststr,NULL,NULL) == 2,
 289.236 -        "doesn't find integer without cmp_func");
 289.237 -    
 289.238 -    UCX_TEST_ASSERT(ucx_list_find(NULL, (void*)"some ",ucx_cmp_str,NULL) == -1,
 289.239 -        "empty list");
 289.240 -    
 289.241 -    UCX_TEST_END
 289.242 -    ucx_list_free(l);
 289.243 -}
 289.244 -
 289.245 -UCX_TEST(test_ucx_list_contains) {
 289.246 -    UcxList *l = ucx_list_append(NULL, (void*)"Contains ");
 289.247 -    l = ucx_list_append(l, (void*)"a ");
 289.248 -    l = ucx_list_append(l, (void*)"string!");
 289.249 -    
 289.250 -    UCX_TEST_BEGIN
 289.251 -    
 289.252 -    UCX_TEST_ASSERT(ucx_list_contains(l,(void*)"a ",ucx_cmp_str,NULL),
 289.253 -        "false negative");
 289.254 -    UCX_TEST_ASSERT(!ucx_list_contains(l,(void*)"a",ucx_cmp_str,NULL),
 289.255 -        "false positive");
 289.256 -    
 289.257 -    UCX_TEST_END
 289.258 -    ucx_list_free(l);
 289.259 -}
 289.260 -
 289.261 -UCX_TEST(test_ucx_list_remove) {
 289.262 -    UcxList *list = ucx_list_append(NULL, (void*)"Hello");
 289.263 -    list = ucx_list_append(list, (void*)"fucking");
 289.264 -    list = ucx_list_append(list, (void*)"World!");
 289.265 -    
 289.266 -    UcxList *list2 = ucx_list_append(NULL, (void*)"A");
 289.267 -    list2 = ucx_list_append(list2, (void*)"B");
 289.268 -    list2 = ucx_list_append(list2, (void*)"C");
 289.269 -    list2 = ucx_list_append(list2, (void*)"D");
 289.270 -    list2 = ucx_list_append(list2, (void*)"E");
 289.271 -    list2 = ucx_list_append(list2, (void*)"F");
 289.272 -    list2 = ucx_list_append(list2, (void*)"G");
 289.273 -    
 289.274 -    UCX_TEST_BEGIN
 289.275 -    
 289.276 -    list = ucx_list_remove(list, ucx_list_get(list, 1));
 289.277 -    
 289.278 -    UCX_TEST_ASSERT(strncmp((const char*)list->data, "Hello", 5) == 0,
 289.279 -            "failed");
 289.280 -    UCX_TEST_ASSERT(strncmp((const char*)list->next->data, "World!", 7) == 0,
 289.281 -            "failed");
 289.282 -    UCX_TEST_ASSERT(list->next->next == NULL, "failed");
 289.283 -    
 289.284 -    // remove first element: B, C, D, E, F, G
 289.285 -    list2 = ucx_list_remove(list2, list2);
 289.286 -    
 289.287 -    UCX_TEST_ASSERT(ucx_list_size(list2) == 6, "list2 has wrong size");
 289.288 -    UCX_TEST_ASSERT(strncmp((const char*)list2->data, "B", 1) == 0,
 289.289 -            "wrong first element");
 289.290 -    UCX_TEST_ASSERT(strncmp((const char*)ucx_list_get(list2, 5)->data, "G", 1)
 289.291 -            == 0, "wrong last element");
 289.292 -    
 289.293 -    // remove second element: B, D, E, F, G
 289.294 -    list2 = ucx_list_remove(list2, list2->next);
 289.295 -    
 289.296 -    UCX_TEST_ASSERT(ucx_list_size(list2) == 5, "list2 has wrong size");
 289.297 -    UCX_TEST_ASSERT(strncmp((const char*)list2->next->data, "D", 1) == 0,
 289.298 -            "wrong second element");
 289.299 -    
 289.300 -    UcxList *last = ucx_list_get(list2, 4);
 289.301 -    list2 = ucx_list_remove(list2, last->prev);
 289.302 -    
 289.303 -    UCX_TEST_ASSERT(ucx_list_size(list2) == 4, "list2 has wrong size");
 289.304 -    UCX_TEST_ASSERT(strncmp((const char*)last->prev->data, "E", 1) == 0,
 289.305 -            "wrong element");
 289.306 -    
 289.307 -    // remove last element: B, D, E, F
 289.308 -    list2 = ucx_list_remove(list2, last);
 289.309 -    UCX_TEST_ASSERT(ucx_list_size(list2) == 3, "list2 has wrong size");
 289.310 -    UCX_TEST_ASSERT(strncmp((const char*)ucx_list_get(list2, 2)->data, "E", 1)
 289.311 -            == 0, "wrong last element");
 289.312 -    
 289.313 -    UCX_TEST_ASSERT(strncmp((const char*)list2->data, "B", 1) == 0,
 289.314 -            "wrong element");
 289.315 -    
 289.316 -    list2 = ucx_list_remove(list2, list2);
 289.317 -    UCX_TEST_ASSERT(ucx_list_size(list2) == 2, "list2 has wrong size");
 289.318 -    list2 = ucx_list_remove(list2, list2);
 289.319 -    UCX_TEST_ASSERT(ucx_list_size(list2) == 1, "list2 has wrong size");
 289.320 -    list2 = ucx_list_remove(list2, list2);
 289.321 -    UCX_TEST_ASSERT(list2 == NULL, "list2 is not null");
 289.322 -    
 289.323 -    UCX_TEST_END
 289.324 -    ucx_list_free(list);
 289.325 -}
 289.326 -
 289.327 -UCX_TEST(test_ucx_list_clone) {
 289.328 -   
 289.329 -    char *hello = (char*)malloc(6);
 289.330 -    char *world = (char*)malloc(8);
 289.331 -    
 289.332 -    memcpy(hello, "Hello", 6);
 289.333 -    memcpy(world, " World!", 8);
 289.334 -    
 289.335 -    UcxList *list = ucx_list_append(NULL, hello);
 289.336 -    list = ucx_list_append(list, world);
 289.337 -    
 289.338 -    UcxList *copy = ucx_list_clone(list, ucx_strcpy, NULL);
 289.339 -    UCX_TEST_BEGIN
 289.340 -
 289.341 -    UCX_TEST_ASSERT(ucx_list_equals(list, copy, ucx_cmp_str, NULL), "failed");
 289.342 -    UCX_TEST_ASSERT(hello != copy->data, "first element is no copy");
 289.343 -    UCX_TEST_ASSERT(world != copy->next->data, "second element is no copy");
 289.344 -
 289.345 -    UCX_TEST_END
 289.346 -    
 289.347 -    ucx_list_free_content(copy, free);
 289.348 -
 289.349 -    free(world);
 289.350 -    free(hello);
 289.351 -    ucx_list_free(list);
 289.352 -    ucx_list_free(copy);
 289.353 -}
 289.354 -
 289.355 -UCX_TEST(test_ucx_list_sort) {
 289.356 -    UcxList *list = ucx_list_append(NULL, (void*)"this");
 289.357 -    list = ucx_list_append(list, (void*)"is");
 289.358 -    list = ucx_list_append(list, (void*)"a");
 289.359 -    list = ucx_list_append(list, (void*)"test");
 289.360 -    list = ucx_list_append(list, (void*)"for");
 289.361 -    list = ucx_list_append(list, (void*)"partial");
 289.362 -    list = ucx_list_append(list, (void*)"correctness");
 289.363 -    list = ucx_list_append(list, (void*)"of");
 289.364 -    list = ucx_list_append(list, (void*)"the");
 289.365 -    list = ucx_list_append(list, (void*)"sort");
 289.366 -    list = ucx_list_append(list, (void*)"function");
 289.367 -    list = ucx_list_append(list, (void*)"that");
 289.368 -    list = ucx_list_append(list, (void*)"shall");
 289.369 -    list = ucx_list_append(list, (void*)"pass");
 289.370 -    list = ucx_list_append(list, (void*)"this");
 289.371 -    list = ucx_list_append(list, (void*)"test");
 289.372 -
 289.373 -    UcxList *expected = ucx_list_append(NULL, (void*)"a");
 289.374 -    expected = ucx_list_append(expected, (void*)"correctness");
 289.375 -    expected = ucx_list_append(expected, (void*)"for");
 289.376 -    expected = ucx_list_append(expected, (void*)"function");
 289.377 -    expected = ucx_list_append(expected, (void*)"is");
 289.378 -    expected = ucx_list_append(expected, (void*)"of");
 289.379 -    expected = ucx_list_append(expected, (void*)"partial");
 289.380 -    expected = ucx_list_append(expected, (void*)"pass");
 289.381 -    expected = ucx_list_append(expected, (void*)"shall");
 289.382 -    expected = ucx_list_append(expected, (void*)"sort");
 289.383 -    expected = ucx_list_append(expected, (void*)"test");
 289.384 -    expected = ucx_list_append(expected, (void*)"test");
 289.385 -    expected = ucx_list_append(expected, (void*)"that");
 289.386 -    expected = ucx_list_append(expected, (void*)"the");
 289.387 -    expected = ucx_list_append(expected, (void*)"this");
 289.388 -    expected = ucx_list_append(expected, (void*)"this");
 289.389 -
 289.390 -    list = ucx_list_sort(list, ucx_cmp_str, NULL);
 289.391 -
 289.392 -    UCX_TEST_BEGIN
 289.393 -    UCX_TEST_ASSERT(
 289.394 -            ucx_list_equals(list, expected, ucx_cmp_str, NULL), "failed");
 289.395 -    UCX_TEST_ASSERT(ucx_list_size(list) == 16, "list has now a wrong size");
 289.396 -    UcxList *l = list;
 289.397 -    UCX_TEST_ASSERT(l->prev == NULL, "prev field of first entry is not null");
 289.398 -    while (l->next != NULL) {
 289.399 -        UCX_TEST_ASSERT(l->next->prev == l, "next or prev pointer corrupted");
 289.400 -        l = l->next;
 289.401 -    }
 289.402 -    UCX_TEST_ASSERT(!ucx_list_sort(NULL, ucx_cmp_str, NULL),
 289.403 -        "failed to sort empty list");
 289.404 -    UCX_TEST_END
 289.405 -
 289.406 -    ucx_list_free(expected);
 289.407 -    ucx_list_free(list);
 289.408 -}
 289.409 -
 289.410 -UCX_TEST(test_ucx_list_union) {
 289.411 -    UcxList *left = ucx_list_append(NULL, (void*)"this");
 289.412 -    left = ucx_list_append(left, (void*)"is");
 289.413 -    left = ucx_list_append(left, (void*)"a");
 289.414 -    left = ucx_list_append(left, (void*)"test");
 289.415 -
 289.416 -    UcxList *right = ucx_list_append(NULL, (void*)"to");
 289.417 -    right = ucx_list_append(right, (void*)"test");
 289.418 -    right = ucx_list_append(right, (void*)"set");
 289.419 -    right = ucx_list_append(right, (void*)"operations");
 289.420 -    
 289.421 -    UcxList *expected = ucx_list_append(NULL, (void*)"this");
 289.422 -    expected = ucx_list_append(expected, (void*)"is");
 289.423 -    expected = ucx_list_append(expected, (void*)"a");
 289.424 -    expected = ucx_list_append(expected, (void*)"test");
 289.425 -    expected = ucx_list_append(expected, (void*)"to");
 289.426 -    expected = ucx_list_append(expected, (void*)"set");
 289.427 -    expected = ucx_list_append(expected, (void*)"operations");
 289.428 -
 289.429 -    UcxList* result = ucx_list_union(left, right, ucx_cmp_str,
 289.430 -            NULL, NULL, NULL);
 289.431 -
 289.432 -    UCX_TEST_BEGIN
 289.433 -    UCX_TEST_ASSERT(ucx_list_equals(result, expected,
 289.434 -            ucx_cmp_str, NULL), "failed");
 289.435 -    UCX_TEST_END
 289.436 -
 289.437 -    ucx_list_free(result);
 289.438 -    ucx_list_free(expected);
 289.439 -    ucx_list_free(right);
 289.440 -    ucx_list_free(left);
 289.441 -}
 289.442 -
 289.443 -UCX_TEST(test_ucx_list_intersection) {
 289.444 -    UcxList *left = ucx_list_append(NULL, (void*)"this");
 289.445 -    left = ucx_list_append(left, (void*)"is");
 289.446 -    left = ucx_list_append(left, (void*)"a");
 289.447 -    left = ucx_list_append(left, (void*)"test");
 289.448 -
 289.449 -    UcxList *right = ucx_list_append(NULL, (void*)"to");
 289.450 -    right = ucx_list_append(right, (void*)"test");
 289.451 -    right = ucx_list_append(right, (void*)"a");
 289.452 -    right = ucx_list_append(right, (void*)"set");
 289.453 -    right = ucx_list_append(right, (void*)"operation");
 289.454 -    
 289.455 -    UcxList *expected = ucx_list_append(NULL, (void*)"a");
 289.456 -    expected = ucx_list_append(expected, (void*)"test");
 289.457 -
 289.458 -    UcxList* result = ucx_list_intersection(left, right, ucx_cmp_str,
 289.459 -            NULL, NULL, NULL);
 289.460 -
 289.461 -    UCX_TEST_BEGIN
 289.462 -    UCX_TEST_ASSERT(ucx_list_equals(result, expected,
 289.463 -            ucx_cmp_str, NULL), "failed");
 289.464 -    UCX_TEST_END
 289.465 -
 289.466 -    ucx_list_free(result);
 289.467 -    ucx_list_free(expected);
 289.468 -    ucx_list_free(right);
 289.469 -    ucx_list_free(left);
 289.470 -}
 289.471 -
 289.472 -UCX_TEST(test_ucx_list_difference) {
 289.473 -    UcxList *left = ucx_list_append(NULL, (void*)"this");
 289.474 -    left = ucx_list_append(left, (void*)"is");
 289.475 -    left = ucx_list_append(left, (void*)"a");
 289.476 -    left = ucx_list_append(left, (void*)"test");
 289.477 -
 289.478 -    UcxList *right = ucx_list_append(NULL, (void*)"to");
 289.479 -    right = ucx_list_append(right, (void*)"test");
 289.480 -    right = ucx_list_append(right, (void*)"this");
 289.481 -    right = ucx_list_append(right, (void*)"set");
 289.482 -    right = ucx_list_append(right, (void*)"operations");
 289.483 -    
 289.484 -    UcxList *expected = ucx_list_append(NULL, (void*)"is");
 289.485 -    expected = ucx_list_append(expected, (void*)"a");
 289.486 -    
 289.487 -    UcxList* result = ucx_list_difference(left, right, ucx_cmp_str,
 289.488 -            NULL, NULL, NULL);
 289.489 -
 289.490 -    UCX_TEST_BEGIN
 289.491 -    UCX_TEST_ASSERT(ucx_list_equals(result, expected,
 289.492 -            ucx_cmp_str, NULL), "failed");
 289.493 -    UCX_TEST_END
 289.494 -
 289.495 -    ucx_list_free(result);
 289.496 -    ucx_list_free(expected);
 289.497 -    ucx_list_free(right);
 289.498 -    ucx_list_free(left);
 289.499 -}
   290.1 --- a/test/list_tests.h	Mon Dec 30 09:54:10 2019 +0100
   290.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   290.3 @@ -1,67 +0,0 @@
   290.4 -/*
   290.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   290.6 - *
   290.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   290.8 - *
   290.9 - * Redistribution and use in source and binary forms, with or without
  290.10 - * modification, are permitted provided that the following conditions are met:
  290.11 - *
  290.12 - *   1. Redistributions of source code must retain the above copyright
  290.13 - *      notice, this list of conditions and the following disclaimer.
  290.14 - *
  290.15 - *   2. Redistributions in binary form must reproduce the above copyright
  290.16 - *      notice, this list of conditions and the following disclaimer in the
  290.17 - *      documentation and/or other materials provided with the distribution.
  290.18 - *
  290.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  290.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  290.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  290.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  290.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  290.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  290.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  290.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  290.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  290.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  290.29 - * POSSIBILITY OF SUCH DAMAGE.
  290.30 - */
  290.31 -
  290.32 -#ifndef LIST_TESTS_H
  290.33 -#define	LIST_TESTS_H
  290.34 -
  290.35 -#include <ucx/list.h>
  290.36 -#include <ucx/test.h>
  290.37 -
  290.38 -#ifdef	__cplusplus
  290.39 -extern "C" {
  290.40 -#endif
  290.41 -
  290.42 -/*
  290.43 - * Assumed to be correct:
  290.44 - *   ucx_list_free
  290.45 - */
  290.46 -
  290.47 -UCX_TEST(test_ucx_list_append);
  290.48 -UCX_TEST(test_ucx_list_prepend);
  290.49 -UCX_TEST(test_ucx_list_equals);
  290.50 -UCX_TEST(test_ucx_list_concat);
  290.51 -UCX_TEST(test_ucx_list_size);
  290.52 -UCX_TEST(test_ucx_list_first);
  290.53 -UCX_TEST(test_ucx_list_last);
  290.54 -UCX_TEST(test_ucx_list_get);
  290.55 -UCX_TEST(test_ucx_list_indexof);
  290.56 -UCX_TEST(test_ucx_list_find);
  290.57 -UCX_TEST(test_ucx_list_contains);
  290.58 -UCX_TEST(test_ucx_list_remove);
  290.59 -UCX_TEST(test_ucx_list_clone);
  290.60 -UCX_TEST(test_ucx_list_sort);
  290.61 -UCX_TEST(test_ucx_list_union);
  290.62 -UCX_TEST(test_ucx_list_intersection);
  290.63 -UCX_TEST(test_ucx_list_difference);
  290.64 -
  290.65 -#ifdef	__cplusplus
  290.66 -}
  290.67 -#endif
  290.68 -
  290.69 -#endif	/* LIST_TESTS_H */
  290.70 -
   291.1 --- a/test/logging_tests.c	Mon Dec 30 09:54:10 2019 +0100
   291.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   291.3 @@ -1,111 +0,0 @@
   291.4 -/*
   291.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   291.6 - *
   291.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   291.8 - *
   291.9 - * Redistribution and use in source and binary forms, with or without
  291.10 - * modification, are permitted provided that the following conditions are met:
  291.11 - *
  291.12 - *   1. Redistributions of source code must retain the above copyright
  291.13 - *      notice, this list of conditions and the following disclaimer.
  291.14 - *
  291.15 - *   2. Redistributions in binary form must reproduce the above copyright
  291.16 - *      notice, this list of conditions and the following disclaimer in the
  291.17 - *      documentation and/or other materials provided with the distribution.
  291.18 - *
  291.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  291.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  291.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  291.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  291.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  291.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  291.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  291.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  291.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  291.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  291.29 - * POSSIBILITY OF SUCH DAMAGE.
  291.30 - */
  291.31 -
  291.32 -#include "logging_tests.h"
  291.33 -#include <time.h>
  291.34 -
  291.35 -UCX_TEST(test_ucx_logger_new) {
  291.36 -    
  291.37 -    FILE *stream = tmpfile();
  291.38 -    UcxLogger *logger = ucx_logger_new(stream,
  291.39 -            UCX_LOGGER_INFO, UCX_LOGGER_SOURCE | UCX_LOGGER_LEVEL);
  291.40 -    
  291.41 -    UCX_TEST_BEGIN
  291.42 -    UCX_TEST_ASSERT(logger->stream == stream, "stream not set");
  291.43 -    UCX_TEST_ASSERT(logger->mask == (UCX_LOGGER_SOURCE | UCX_LOGGER_LEVEL),
  291.44 -        "mask not set");
  291.45 -    UCX_TEST_ASSERT(logger->level == UCX_LOGGER_INFO,
  291.46 -        "level not set");
  291.47 -    UCX_TEST_ASSERT(logger->writer == (write_func)fwrite,
  291.48 -        "writer not set to fwrite");
  291.49 -    UCX_TEST_ASSERT(strcmp(logger->dateformat, "%F %T %z ") == 0,
  291.50 -        "date format not set to \"%F %T %z\"");
  291.51 -    
  291.52 -    UCX_TEST_ASSERT(logger->levels->count == 5,
  291.53 -        "incorrect number of registered log levels");
  291.54 -
  291.55 -    int level = UCX_LOGGER_ERROR;
  291.56 -    UCX_TEST_ASSERT(strcmp((char*)ucx_map_int_get(logger->levels, level),
  291.57 -        "[ERROR]") == 0, "invalid error level");
  291.58 -    level = UCX_LOGGER_WARN;
  291.59 -    UCX_TEST_ASSERT(strcmp((char*)ucx_map_int_get(logger->levels, level),
  291.60 -        "[WARNING]") == 0, "invalid warning level");
  291.61 -    level = UCX_LOGGER_DEBUG;
  291.62 -    UCX_TEST_ASSERT(strcmp((char*)ucx_map_int_get(logger->levels, level),
  291.63 -        "[DEBUG]") == 0, "invalid debug level");
  291.64 -    level = UCX_LOGGER_INFO;
  291.65 -    UCX_TEST_ASSERT(strcmp((char*)ucx_map_int_get(logger->levels, level),
  291.66 -        "[INFO]") == 0, "invalid info level");
  291.67 -    level = UCX_LOGGER_TRACE;
  291.68 -    UCX_TEST_ASSERT(strcmp((char*)ucx_map_int_get(logger->levels, level),
  291.69 -        "[TRACE]") == 0, "invalid trace level");
  291.70 -
  291.71 -    UCX_TEST_END
  291.72 -    
  291.73 -    fclose(stream);
  291.74 -    ucx_logger_free(logger);
  291.75 -}
  291.76 -
  291.77 -UCX_TEST(test_ucx_logger_log) {
  291.78 -    char buffer[100];
  291.79 -    
  291.80 -    FILE *stream = tmpfile();
  291.81 -
  291.82 -    UcxLogger *logger = ucx_logger_new(stream,
  291.83 -            UCX_LOGGER_INFO, UCX_LOGGER_SOURCE | UCX_LOGGER_LEVEL);
  291.84 -    logger->dateformat = (char*) "%Y-%m-%d:";
  291.85 -    
  291.86 -    UCX_TEST_BEGIN
  291.87 -    const unsigned int line1 = __LINE__; ucx_logger_info(logger, "allright");
  291.88 -    
  291.89 -    ucx_logger_trace(logger, "dont log this!");
  291.90 -    
  291.91 -    logger->mask |= UCX_LOGGER_TIMESTAMP;
  291.92 -    time_t now = time(NULL);
  291.93 -    char timestr[13];
  291.94 -    strftime(timestr, 12, "%Y-%m-%d:", localtime(&now));
  291.95 -    const unsigned int line2 = __LINE__; ucx_logger_error(logger, "error %d!", 42);
  291.96 -    
  291.97 -    fseek(stream, 0, SEEK_SET);
  291.98 -    size_t r = fread(buffer, 1, 100, stream);
  291.99 -    
 291.100 -    const size_t expected_length = 87;
 291.101 -    char expected[88];
 291.102 -    snprintf(expected, expected_length+1,
 291.103 -        "[INFO] logging_tests.c:%u - allright\n"
 291.104 -        "[ERROR] %slogging_tests.c:%u - error 42!\n", line1, timestr, line2);
 291.105 -
 291.106 -    UCX_TEST_ASSERT(r == expected_length, "incorrect log length");
 291.107 -    UCX_TEST_ASSERT(strncmp(buffer, expected, expected_length) == 0,
 291.108 -        "incorrect logs");
 291.109 -
 291.110 -    UCX_TEST_END
 291.111 -
 291.112 -    ucx_logger_free(logger);
 291.113 -    fclose(stream);
 291.114 -}
   292.1 --- a/test/logging_tests.h	Mon Dec 30 09:54:10 2019 +0100
   292.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   292.3 @@ -1,47 +0,0 @@
   292.4 -/*
   292.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   292.6 - *
   292.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   292.8 - *
   292.9 - * Redistribution and use in source and binary forms, with or without
  292.10 - * modification, are permitted provided that the following conditions are met:
  292.11 - *
  292.12 - *   1. Redistributions of source code must retain the above copyright
  292.13 - *      notice, this list of conditions and the following disclaimer.
  292.14 - *
  292.15 - *   2. Redistributions in binary form must reproduce the above copyright
  292.16 - *      notice, this list of conditions and the following disclaimer in the
  292.17 - *      documentation and/or other materials provided with the distribution.
  292.18 - *
  292.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  292.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  292.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  292.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  292.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  292.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  292.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  292.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  292.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  292.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  292.29 - * POSSIBILITY OF SUCH DAMAGE.
  292.30 - */
  292.31 -
  292.32 -#ifndef LOGGING_TESTS_H
  292.33 -#define	LOGGING_TESTS_H
  292.34 -
  292.35 -#include <ucx/test.h>
  292.36 -#include <ucx/logging.h>
  292.37 -
  292.38 -#ifdef	__cplusplus
  292.39 -extern "C" {
  292.40 -#endif
  292.41 -
  292.42 -UCX_TEST(test_ucx_logger_new);
  292.43 -UCX_TEST(test_ucx_logger_log);
  292.44 -
  292.45 -#ifdef	__cplusplus
  292.46 -}
  292.47 -#endif
  292.48 -
  292.49 -#endif	/* LOGGING_TESTS_H */
  292.50 -
   293.1 --- a/test/main.c	Mon Dec 30 09:54:10 2019 +0100
   293.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   293.3 @@ -1,286 +0,0 @@
   293.4 -/*
   293.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   293.6 - *
   293.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   293.8 - *
   293.9 - * Redistribution and use in source and binary forms, with or without
  293.10 - * modification, are permitted provided that the following conditions are met:
  293.11 - *
  293.12 - *   1. Redistributions of source code must retain the above copyright
  293.13 - *      notice, this list of conditions and the following disclaimer.
  293.14 - *
  293.15 - *   2. Redistributions in binary form must reproduce the above copyright
  293.16 - *      notice, this list of conditions and the following disclaimer in the
  293.17 - *      documentation and/or other materials provided with the distribution.
  293.18 - *
  293.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  293.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  293.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  293.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  293.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  293.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  293.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  293.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  293.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  293.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  293.29 - * POSSIBILITY OF SUCH DAMAGE.
  293.30 - */
  293.31 -
  293.32 -#include <stdio.h>
  293.33 -#include <stdlib.h>
  293.34 -
  293.35 -#include <ucx/test.h>
  293.36 -
  293.37 -#include "main.h"
  293.38 -
  293.39 -#include "array_tests.h"
  293.40 -#include "allocator_tests.h"
  293.41 -#include "logging_tests.h"
  293.42 -#include "list_tests.h"
  293.43 -#include "string_tests.h"
  293.44 -#include "mpool_tests.h"
  293.45 -#include "stack_tests.h"
  293.46 -#include "map_tests.h"
  293.47 -#include "prop_tests.h"
  293.48 -#include "buffer_tests.h"
  293.49 -#include "utils_tests.h"
  293.50 -#include "avl_tests.h"
  293.51 -
  293.52 -#ifdef __cplusplus
  293.53 -extern "C" {
  293.54 -#endif
  293.55 -UCX_TEST(testTestSuitePositive) {
  293.56 -    UCX_TEST_BEGIN
  293.57 -    UCX_TEST_ASSERT(2*2 == 4, "the test framework fails");
  293.58 -    UCX_TEST_END
  293.59 -}
  293.60 -
  293.61 -UCX_TEST(testTestSuiteNegative) {
  293.62 -    UCX_TEST_BEGIN
  293.63 -    UCX_TEST_ASSERT(2*(-2) == 4, "the test framework works");
  293.64 -    UCX_TEST_END
  293.65 -}
  293.66 -
  293.67 -UCX_TEST_SUBROUTINE(testTestSuiteRoutineRoutine, float f) {
  293.68 -    UCX_TEST_ASSERT(f == 3.14f, "calling routine in a routine fails");
  293.69 -}
  293.70 -
  293.71 -UCX_TEST_SUBROUTINE(testTestSuiteRoutine2Param, int i, float f) {
  293.72 -    UCX_TEST_ASSERT(i == 42, "two parameter routine fails");
  293.73 -    UCX_TEST_CALL_SUBROUTINE(testTestSuiteRoutineRoutine, f);
  293.74 -}
  293.75 -
  293.76 -UCX_TEST_SUBROUTINE(testTestSuiteRoutineSuccess, int* i) {
  293.77 -    *i += 2;
  293.78 -    UCX_TEST_ASSERT(*i==4, "the test framework fails");
  293.79 -}
  293.80 -
  293.81 -UCX_TEST_SUBROUTINE(testTestSuiteRoutineFailure, int* i) {
  293.82 -    *i += 2;
  293.83 -    // Next test shall fail!
  293.84 -    UCX_TEST_ASSERT(*i==4, "the test framework works");
  293.85 -}
  293.86 -
  293.87 -UCX_TEST(testTestSuiteRoutinePositive) {
  293.88 -    int i = 2;
  293.89 -    UCX_TEST_BEGIN
  293.90 -    UCX_TEST_CALL_SUBROUTINE(testTestSuiteRoutineSuccess, &i);
  293.91 -    UCX_TEST_ASSERT(i==4, "the test framework fails");
  293.92 -    UCX_TEST_END
  293.93 -}
  293.94 -
  293.95 -UCX_TEST(testTestSuiteRoutineNegative) {
  293.96 -    int i = 0;
  293.97 -    UCX_TEST_BEGIN
  293.98 -    UCX_TEST_CALL_SUBROUTINE(testTestSuiteRoutineFailure, &i);
  293.99 -    UCX_TEST_ASSERT(1, "the test framework fails");
 293.100 -    UCX_TEST_END
 293.101 -}
 293.102 -
 293.103 -UCX_TEST(testTestSuiteRoutineMultiparam) {
 293.104 -    UCX_TEST_BEGIN
 293.105 -    UCX_TEST_CALL_SUBROUTINE(testTestSuiteRoutine2Param, 42, 3.14f);
 293.106 -    UCX_TEST_END
 293.107 -}
 293.108 -#ifdef __cplusplus
 293.109 -}
 293.110 -#endif
 293.111 -
 293.112 -int main(int argc, char **argv) {
 293.113 -    printf("UCX Tests\n---------\n");
 293.114 -
 293.115 -    printf("\nUcxTestSuite tests (2 failures are intended!)\n");
 293.116 -    UcxTestSuite* suite = ucx_test_suite_new();
 293.117 -    ucx_test_register(suite, testTestSuitePositive);
 293.118 -    ucx_test_register(suite, testTestSuiteNegative);
 293.119 -    ucx_test_register(suite, testTestSuiteRoutinePositive);
 293.120 -    ucx_test_register(suite, testTestSuiteRoutineNegative);
 293.121 -    ucx_test_register(suite, testTestSuiteRoutineMultiparam);
 293.122 -    ucx_test_run(suite, stdout);
 293.123 -    if (suite->failure == 2 && suite->success == 3) {
 293.124 -        ucx_test_suite_free(suite);
 293.125 -
 293.126 -        printf("\nLibrary function tests\n");
 293.127 -        suite = ucx_test_suite_new();
 293.128 -        /* UcxAllocator Tests */
 293.129 -        ucx_test_register(suite, test_ucx_default_allocator);
 293.130 -        
 293.131 -        /* sstring Tests */
 293.132 -        ucx_test_register(suite, test_sstr_macros);
 293.133 -        ucx_test_register(suite, test_sstr);
 293.134 -        ucx_test_register(suite, test_sstr_len);
 293.135 -        ucx_test_register(suite, test_sstrcmp);
 293.136 -        ucx_test_register(suite, test_sstrcasecmp);
 293.137 -        ucx_test_register(suite, test_sstrcat);
 293.138 -        ucx_test_register(suite, test_sstrchr_sstrrchr);
 293.139 -        ucx_test_register(suite, test_sstrstr);
 293.140 -        ucx_test_register(suite, test_sstrsplit);
 293.141 -        ucx_test_register(suite, test_sstrtrim);
 293.142 -        ucx_test_register(suite, test_sstrprefixsuffix);
 293.143 -        ucx_test_register(suite, test_sstrcaseprefixsuffix);
 293.144 -        ucx_test_register(suite, test_sstrreplace);
 293.145 -        
 293.146 -        /* UcxLogger Tests */
 293.147 -        ucx_test_register(suite, test_ucx_logger_new);
 293.148 -        ucx_test_register(suite, test_ucx_logger_log);
 293.149 -        
 293.150 -        /* UcxArray Tests */
 293.151 -        ucx_test_register(suite, test_ucx_array_destroy);
 293.152 -        ucx_test_register(suite, test_ucx_array_new);
 293.153 -        ucx_test_register(suite, test_ucx_array_at);
 293.154 -        ucx_test_register(suite, test_ucx_array_append_from);
 293.155 -        ucx_test_register(suite, test_ucx_array_append_from_struct);
 293.156 -        ucx_test_register(suite, test_ucx_array_prepend_from);
 293.157 -        ucx_test_register(suite, test_ucx_array_set_from);
 293.158 -        ucx_test_register(suite, test_ucx_array_equals);
 293.159 -        ucx_test_register(suite, test_ucx_array_concat);
 293.160 -        ucx_test_register(suite, test_ucx_array_find);
 293.161 -        ucx_test_register(suite, test_ucx_array_contains);
 293.162 -        ucx_test_register(suite, test_ucx_array_remove);
 293.163 -        ucx_test_register(suite, test_ucx_array_clone);
 293.164 -        ucx_test_register(suite, test_ucx_array_sort);
 293.165 -        ucx_test_register(suite, test_ucx_array_shrink);
 293.166 -        ucx_test_register(suite, test_ucx_array_resize);
 293.167 -        ucx_test_register(suite, test_ucx_array_reserve);
 293.168 -        ucx_test_register(suite, test_ucx_array_grow);
 293.169 -        ucx_test_register(suite, test_ucx_array_util_set);
 293.170 -        ucx_test_register(suite, test_ucx_array_util_setptr);
 293.171 -        
 293.172 -        /* UcxList Tests */
 293.173 -        ucx_test_register(suite, test_ucx_list_append);
 293.174 -        ucx_test_register(suite, test_ucx_list_prepend);
 293.175 -        ucx_test_register(suite, test_ucx_list_equals);
 293.176 -        ucx_test_register(suite, test_ucx_list_concat);
 293.177 -        ucx_test_register(suite, test_ucx_list_size);
 293.178 -        ucx_test_register(suite, test_ucx_list_first);
 293.179 -        ucx_test_register(suite, test_ucx_list_last);
 293.180 -        ucx_test_register(suite, test_ucx_list_get);
 293.181 -        ucx_test_register(suite, test_ucx_list_indexof);
 293.182 -        ucx_test_register(suite, test_ucx_list_find);
 293.183 -        ucx_test_register(suite, test_ucx_list_contains);
 293.184 -        ucx_test_register(suite, test_ucx_list_remove);
 293.185 -        ucx_test_register(suite, test_ucx_list_clone);
 293.186 -        ucx_test_register(suite, test_ucx_list_sort);
 293.187 -        ucx_test_register(suite, test_ucx_list_union);
 293.188 -        ucx_test_register(suite, test_ucx_list_intersection);
 293.189 -        ucx_test_register(suite, test_ucx_list_difference);
 293.190 -
 293.191 -        /* UcxMemPool Tests */
 293.192 -        ucx_test_register(suite, test_ucx_mempool_new);
 293.193 -        ucx_test_register(suite, test_ucx_mempool_malloc);
 293.194 -        ucx_test_register(suite, test_ucx_mempool_malloc_with_chcap);
 293.195 -        ucx_test_register(suite, test_ucx_mempool_calloc);
 293.196 -        ucx_test_register(suite, test_ucx_mempool_free);
 293.197 -        ucx_test_register(suite, test_ucx_mempool_set_destr);
 293.198 -        ucx_test_register(suite, test_ucx_mempool_reg_destr);
 293.199 -        ucx_test_register(suite, test_ucx_mempool_realloc);
 293.200 -        
 293.201 -        /* UcxStack Tests */
 293.202 -        ucx_test_register(suite, test_ucx_stack_init);
 293.203 -        ucx_test_register(suite, test_ucx_stack_malloc);
 293.204 -        ucx_test_register(suite, test_ucx_stack_calloc);
 293.205 -        ucx_test_register(suite, test_ucx_stack_free);
 293.206 -        ucx_test_register(suite, test_ucx_stack_realloc);
 293.207 -        ucx_test_register(suite, test_ucx_stack_pop);
 293.208 -
 293.209 -        /* UcxMap Tests */
 293.210 -        ucx_test_register(suite, test_ucx_map_new);
 293.211 -        ucx_test_register(suite, test_ucx_key);
 293.212 -        ucx_test_register(suite, test_ucx_map_put);
 293.213 -        ucx_test_register(suite, test_ucx_map_get);
 293.214 -        ucx_test_register(suite, test_ucx_map_remove);
 293.215 -        ucx_test_register(suite, test_ucx_map_clear);
 293.216 -        ucx_test_register(suite, test_ucx_map_iterator);
 293.217 -        ucx_test_register(suite, test_ucx_map_iterator_chain);
 293.218 -        ucx_test_register(suite, test_ucx_map_clone);
 293.219 -        ucx_test_register(suite, test_ucx_map_rehash);
 293.220 -        ucx_test_register(suite, test_ucx_map_union);
 293.221 -        ucx_test_register(suite, test_ucx_map_intersection);
 293.222 -        ucx_test_register(suite, test_ucx_map_difference);
 293.223 -        
 293.224 -        /* UcxPropertiesParser Tests */
 293.225 -        ucx_test_register(suite, test_ucx_properties_new);
 293.226 -        ucx_test_register(suite, test_ucx_properties_next);
 293.227 -        ucx_test_register(suite, test_ucx_properties_next_multi);
 293.228 -        ucx_test_register(suite, test_ucx_properties_next_part);
 293.229 -        ucx_test_register(suite, test_ucx_properties_next_long);
 293.230 -        ucx_test_register(suite, test_ucx_properties2map);
 293.231 -        ucx_test_register(suite, test_ucx_properties_load);
 293.232 -        ucx_test_register(suite, test_ucx_properties_store);
 293.233 -        
 293.234 -        /* UcxBuffer Tests */
 293.235 -        ucx_test_register(suite, test_ucx_buffer_new);
 293.236 -        ucx_test_register(suite, test_ucx_buffer_new_prealloc);
 293.237 -        ucx_test_register(suite, test_ucx_buffer_eof);
 293.238 -        ucx_test_register(suite, test_ucx_buffer_seek_set);
 293.239 -        ucx_test_register(suite, test_ucx_buffer_seek_cur);
 293.240 -        ucx_test_register(suite, test_ucx_buffer_seek_end);
 293.241 -        ucx_test_register(suite, test_ucx_buffer_seek_oob);
 293.242 -        ucx_test_register(suite, test_ucx_buffer_seek_invalid);
 293.243 -        ucx_test_register(suite, test_ucx_buffer_seek_overflow);
 293.244 -        ucx_test_register(suite, test_ucx_buffer_putc);
 293.245 -        ucx_test_register(suite, test_ucx_buffer_putc_ae);
 293.246 -        ucx_test_register(suite, test_ucx_buffer_putc_oob);
 293.247 -        ucx_test_register(suite, test_ucx_buffer_putc_oobae);
 293.248 -        ucx_test_register(suite, test_ucx_buffer_putc_size);
 293.249 -        ucx_test_register(suite, test_ucx_buffer_getc);
 293.250 -        ucx_test_register(suite, test_ucx_buffer_read);
 293.251 -        ucx_test_register(suite, test_ucx_buffer_read_oob);
 293.252 -        ucx_test_register(suite, test_ucx_buffer_extract);
 293.253 -        ucx_test_register(suite, test_ucx_buffer_extract_oob);
 293.254 -        ucx_test_register(suite, test_ucx_buffer_extract_overflow);
 293.255 -        ucx_test_register(suite, test_ucx_buffer_extend);
 293.256 -        ucx_test_register(suite, test_ucx_buffer_write);
 293.257 -        ucx_test_register(suite, test_ucx_buffer_write_oob);
 293.258 -        ucx_test_register(suite, test_ucx_buffer_write_ax);
 293.259 -        ucx_test_register(suite, test_ucx_buffer_shl);
 293.260 -        ucx_test_register(suite, test_ucx_buffer_shr);
 293.261 -        ucx_test_register(suite, test_ucx_buffer_shr_ax);
 293.262 -        
 293.263 -        /* Utils Tests*/
 293.264 -        ucx_test_register(suite, test_ucx_fprintf);
 293.265 -        ucx_test_register(suite, test_ucx_asprintf);
 293.266 -        ucx_test_register(suite, test_ucx_sprintf);
 293.267 -        ucx_test_register(suite, test_ucx_bprintf);
 293.268 -        ucx_test_register(suite, test_ucx_stream_copy);
 293.269 -        
 293.270 -        /* AVL Tests */
 293.271 -        ucx_test_register(suite, test_ucx_avl_put);
 293.272 -        ucx_test_register(suite, test_ucx_avl_remove);
 293.273 -        ucx_test_register(suite, test_ucx_avl_find);
 293.274 -        ucx_test_register(suite, test_ucx_avl_traverse);
 293.275 -
 293.276 -        ucx_test_run(suite, stdout);
 293.277 -        fflush(stdout);
 293.278 -        
 293.279 -        int exit_code = suite->failure > 0 ? EXIT_FAILURE: EXIT_SUCCESS;
 293.280 -        
 293.281 -        ucx_test_suite_free(suite);
 293.282 -        
 293.283 -        return exit_code;
 293.284 -    } else {
 293.285 -        ucx_test_suite_free(suite);
 293.286 -        return EXIT_FAILURE;
 293.287 -    }
 293.288 -}
 293.289 -
   294.1 --- a/test/main.h	Mon Dec 30 09:54:10 2019 +0100
   294.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   294.3 @@ -1,46 +0,0 @@
   294.4 -/*
   294.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   294.6 - *
   294.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   294.8 - *
   294.9 - * Redistribution and use in source and binary forms, with or without
  294.10 - * modification, are permitted provided that the following conditions are met:
  294.11 - *
  294.12 - *   1. Redistributions of source code must retain the above copyright
  294.13 - *      notice, this list of conditions and the following disclaimer.
  294.14 - *
  294.15 - *   2. Redistributions in binary form must reproduce the above copyright
  294.16 - *      notice, this list of conditions and the following disclaimer in the
  294.17 - *      documentation and/or other materials provided with the distribution.
  294.18 - *
  294.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  294.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  294.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  294.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  294.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  294.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  294.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  294.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  294.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  294.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  294.29 - * POSSIBILITY OF SUCH DAMAGE.
  294.30 - */
  294.31 -
  294.32 -#ifndef MAIN_H
  294.33 -#define	MAIN_H
  294.34 -
  294.35 -#ifdef	__cplusplus
  294.36 -extern "C" {
  294.37 -#endif
  294.38 -
  294.39 -/* Some functions that are shared over the test */
  294.40 -int cmp_string(void*, void*, void*);
  294.41 -void* copy_string(void*, void*);
  294.42 -
  294.43 -
  294.44 -#ifdef	__cplusplus
  294.45 -}
  294.46 -#endif
  294.47 -
  294.48 -#endif	/* MAIN_H */
  294.49 -
   295.1 --- a/test/map_tests.c	Mon Dec 30 09:54:10 2019 +0100
   295.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   295.3 @@ -1,431 +0,0 @@
   295.4 -/*
   295.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   295.6 - *
   295.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   295.8 - *
   295.9 - * Redistribution and use in source and binary forms, with or without
  295.10 - * modification, are permitted provided that the following conditions are met:
  295.11 - *
  295.12 - *   1. Redistributions of source code must retain the above copyright
  295.13 - *      notice, this list of conditions and the following disclaimer.
  295.14 - *
  295.15 - *   2. Redistributions in binary form must reproduce the above copyright
  295.16 - *      notice, this list of conditions and the following disclaimer in the
  295.17 - *      documentation and/or other materials provided with the distribution.
  295.18 - *
  295.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  295.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  295.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  295.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  295.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  295.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  295.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  295.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  295.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  295.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  295.29 - * POSSIBILITY OF SUCH DAMAGE.
  295.30 - */
  295.31 -
  295.32 -#include "map_tests.h"
  295.33 -#include <ucx/utils.h>
  295.34 -
  295.35 -UCX_TEST(test_ucx_map_new) {
  295.36 -    UcxMap *map = ucx_map_new(16);
  295.37 -    UCX_TEST_BEGIN
  295.38 -    UCX_TEST_ASSERT(map->size == 16, "wrong size");
  295.39 -    UCX_TEST_ASSERT(map->map != NULL, "failed");
  295.40 -    
  295.41 -    UCX_TEST_END
  295.42 -    ucx_map_free(map);
  295.43 -}
  295.44 -
  295.45 -UCX_TEST(test_ucx_key) {
  295.46 -    UcxKey key = ucx_key("This is a text.", 15);
  295.47 -    UCX_TEST_BEGIN
  295.48 -    UCX_TEST_ASSERT(strncmp((const char*)key.data, "This is a text.", 15) == 0,
  295.49 -            "failed");
  295.50 -    UCX_TEST_ASSERT(key.len == 15, "failed");
  295.51 -    UCX_TEST_ASSERT(key.hash == 1261186027, "hash failed");
  295.52 -    
  295.53 -    UCX_TEST_END
  295.54 -}
  295.55 -
  295.56 -UCX_TEST(test_ucx_map_put) {
  295.57 -    
  295.58 -    UcxMap *map = ucx_map_new(4);
  295.59 -    
  295.60 -    int td[5];
  295.61 -    td[0] = 10; td[1] = 42; td[2] = 70; td[3] = 11200; td[4] = 80000;
  295.62 -
  295.63 -    UCX_TEST_BEGIN
  295.64 -    ucx_map_cstr_put(map, "Key2", &td[2]); /* 3.2 */
  295.65 -    ucx_map_cstr_put(map, "Key0", &td[0]); /* 0.0 */
  295.66 -    ucx_map_cstr_put(map, "Key1", &td[1]); /* 3.0 */
  295.67 -    ucx_map_cstr_put(map, "KeY3", &td[3]); /* 3.1 */
  295.68 -    ucx_map_cstr_put(map, "KEY4", &td[4]); /* 1.0 */
  295.69 -    
  295.70 -    UCX_TEST_ASSERT(*((int*)map->map[0]->data) == td[0], "failed Key0");
  295.71 -    UCX_TEST_ASSERT(*((int*)map->map[1]->data) == td[4], "failed KEY4");
  295.72 -    UCX_TEST_ASSERT(*((int*)map->map[3]->data) == td[1], "failed Key1");
  295.73 -    
  295.74 -    UCX_TEST_ASSERT(map->map[3]->next != NULL, "no list at slot 3");
  295.75 -    UCX_TEST_ASSERT(map->map[3]->next->next != NULL, "list corrupt at slot 3");
  295.76 -    UCX_TEST_ASSERT(*((int*)map->map[3]->next->data) == td[3],
  295.77 -            "failed KeY3")
  295.78 -    UCX_TEST_ASSERT(*((int*)map->map[3]->next->next->data) == td[2],
  295.79 -            "failed KeY2");
  295.80 -
  295.81 -    UCX_TEST_ASSERT(map->map[0]->next == NULL, "slot 0 not terminated");
  295.82 -    UCX_TEST_ASSERT(map->map[1]->next == NULL, "slot 1 not terminated");
  295.83 -    UCX_TEST_ASSERT(map->map[2] == NULL, "slot 2 not empty");
  295.84 -    UCX_TEST_ASSERT(map->map[3]->next->next->next == NULL,
  295.85 -            "slot 3 not terminated")
  295.86 -
  295.87 -    ucx_map_cstr_put(map, "KeY3", &td[4]); /* replace 3.1 */
  295.88 -    
  295.89 -    UCX_TEST_ASSERT(*((int*)map->map[3]->data) == td[1],
  295.90 -            "overwrite failed")
  295.91 -    UCX_TEST_ASSERT(*((int*)map->map[3]->next->data) == td[4],
  295.92 -            "overwrite failed");
  295.93 -    UCX_TEST_ASSERT(*((int*)map->map[3]->next->next->data) == td[2], 
  295.94 -            "overwrite failed")
  295.95 -    UCX_TEST_ASSERT(map->map[3]->next->next->next == NULL, "overwrite failed");
  295.96 -    
  295.97 -    UCX_TEST_END
  295.98 -    ucx_map_free(map);
  295.99 -}
 295.100 -
 295.101 -UCX_TEST(test_ucx_map_get) {
 295.102 -    UcxMap *map = ucx_map_new(4);
 295.103 -
 295.104 -    int td[5];
 295.105 -    td[0] = 10; td[1] = 42; td[2] = 70; td[3] = 11200; td[4] = 80000;
 295.106 -
 295.107 -    ucx_map_cstr_put(map, "Key2", &td[2]);
 295.108 -    ucx_map_cstr_put(map, "Key0", &td[0]);
 295.109 -    ucx_map_cstr_put(map, "Key1", &td[1]);
 295.110 -    ucx_map_cstr_put(map, "KeY3", &td[3]);
 295.111 -    ucx_map_cstr_put(map, "KEY4", &td[4]);
 295.112 -    UCX_TEST_BEGIN
 295.113 -
 295.114 -    td[0] = *((int*)ucx_map_cstr_get(map, "Key0"));
 295.115 -    td[1] = *((int*)ucx_map_cstr_get(map, "Key1"));
 295.116 -    td[2] = *((int*)ucx_map_cstr_get(map, "Key2"));
 295.117 -    td[3] = *((int*)ucx_map_cstr_get(map, "KeY3"));
 295.118 -    td[4] = *((int*)ucx_map_cstr_get(map, "KEY4"));
 295.119 -    UCX_TEST_ASSERT(td[0] == 10, "failed key 0");
 295.120 -    UCX_TEST_ASSERT(td[1] == 42, "failed key 1");
 295.121 -    UCX_TEST_ASSERT(td[2] == 70, "failed key 2");
 295.122 -    UCX_TEST_ASSERT(td[3] == 11200, "failed key 3");
 295.123 -    UCX_TEST_ASSERT(td[4] == 80000, "failed key 4");
 295.124 -
 295.125 -    UCX_TEST_ASSERT(map->count == 5, "expected 5 remaining values");
 295.126 -    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key0") != NULL, "element removed");
 295.127 -
 295.128 -    UCX_TEST_END
 295.129 -    ucx_map_free(map);
 295.130 -}
 295.131 -
 295.132 -UCX_TEST(test_ucx_map_remove) {
 295.133 -    UcxMap *map = ucx_map_new(4);
 295.134 -
 295.135 -    int td[5];
 295.136 -    td[0] = 10; td[1] = 42; td[2] = 70; td[3] = 11200; td[4] = 80000;
 295.137 -
 295.138 -    ucx_map_cstr_put(map, "Key2", &td[2]); /* 0 */
 295.139 -    ucx_map_cstr_put(map, "Key0", &td[0]); /* 0 */
 295.140 -    ucx_map_cstr_put(map, "Key1", &td[1]); /* 3 */
 295.141 -    ucx_map_cstr_put(map, "KeY3", &td[3]); /* 2 */
 295.142 -    ucx_map_cstr_put(map, "KEY4", &td[4]); /* 0 */
 295.143 -    UCX_TEST_BEGIN
 295.144 -
 295.145 -    td[0] = *((int*)ucx_map_cstr_remove(map, "Key0"));
 295.146 -    td[1] = *((int*)ucx_map_cstr_get(map, "Key1"));
 295.147 -    td[2] = *((int*)ucx_map_cstr_remove(map, "Key2"));
 295.148 -    td[3] = *((int*)ucx_map_cstr_get(map, "KeY3"));
 295.149 -    td[4] = *((int*)ucx_map_cstr_get(map, "KEY4"));
 295.150 -    UCX_TEST_ASSERT(td[0] == 10, "failed key 0");
 295.151 -    UCX_TEST_ASSERT(td[1] == 42, "failed key 1");
 295.152 -    UCX_TEST_ASSERT(td[2] == 70, "failed key 2");
 295.153 -    UCX_TEST_ASSERT(td[3] == 11200, "failed key 3");
 295.154 -    UCX_TEST_ASSERT(td[4] == 80000, "failed key 4");
 295.155 -
 295.156 -    UCX_TEST_ASSERT(map->count == 3, "expected 3 remaining values");
 295.157 -    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key0")==NULL, "element not removed");
 295.158 -    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key1")!=NULL, "element removed");
 295.159 -    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key2")==NULL, "element not removed");
 295.160 -    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "KeY3")!=NULL, "element removed");
 295.161 -    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "KEY4")!=NULL, "element removed");
 295.162 -
 295.163 -    UCX_TEST_ASSERT(ucx_map_cstr_remove(map, "Key2") == NULL,
 295.164 -            "subsequent remove call shall return NULL");
 295.165 -
 295.166 -    UCX_TEST_END
 295.167 -    ucx_map_free(map);
 295.168 -}
 295.169 -
 295.170 -UCX_TEST(test_ucx_map_clear) {
 295.171 -    UcxMap *map = ucx_map_new(4);
 295.172 -
 295.173 -    int value = 42;
 295.174 -
 295.175 -    ucx_map_cstr_put(map, "Key0", &value);
 295.176 -    ucx_map_cstr_put(map, "Key1", &value);
 295.177 -    ucx_map_cstr_put(map, "Key2", &value);
 295.178 -    ucx_map_cstr_put(map, "Key3", &value);
 295.179 -    ucx_map_cstr_put(map, "Key4", &value);
 295.180 -    ucx_map_cstr_put(map, "Key5", &value);
 295.181 -    ucx_map_cstr_put(map, "Key6", &value);
 295.182 -    UCX_TEST_BEGIN
 295.183 -        
 295.184 -    ucx_map_clear(map);
 295.185 -
 295.186 -    UCX_TEST_ASSERT(map->count == 0, "map has not been cleared");
 295.187 -    UCX_TEST_ASSERT(map->size == 4, "map size has changed unexpectedly");
 295.188 -
 295.189 -    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key0")==NULL, "element not removed");
 295.190 -    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key1")==NULL, "element not removed");
 295.191 -    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key2")==NULL, "element not removed");
 295.192 -    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key3")==NULL, "element not removed");
 295.193 -    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key4")==NULL, "element not removed");
 295.194 -    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key5")==NULL, "element not removed");
 295.195 -    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key6")==NULL, "element not removed");
 295.196 -
 295.197 -    UCX_TEST_END
 295.198 -    ucx_map_free(map);
 295.199 -}
 295.200 -
 295.201 -UCX_TEST_SUBROUTINE(test_ucx_map_itersrt, UcxMap *map) {
 295.202 -    int v1 = 10;
 295.203 -    int v2 = 15;
 295.204 -    int v3 = 7;
 295.205 -    int v4 = 9;
 295.206 -
 295.207 -    ucx_map_cstr_put(map, "v1", &v1);
 295.208 -    ucx_map_cstr_put(map, "v2", &v2);
 295.209 -    ucx_map_cstr_put(map, "v3", &v3);
 295.210 -    ucx_map_cstr_put(map, "v4", &v4);
 295.211 -
 295.212 -    UcxMapIterator i = ucx_map_iterator(map);
 295.213 -    int check = 0;
 295.214 -    int hit = 0;
 295.215 -
 295.216 -    void* v;
 295.217 -    UCX_MAP_FOREACH(key, v, i) {
 295.218 -        check += *((int*)v);
 295.219 -        hit++;
 295.220 -    }
 295.221 -
 295.222 -    UCX_TEST_ASSERT(hit == 4, "test1: wrong number of hits");
 295.223 -    UCX_TEST_ASSERT(check == v1+v2+v3+v4, "test1: wrong result");
 295.224 -}
 295.225 -
 295.226 -UCX_TEST(test_ucx_map_iterator) {
 295.227 -    UcxMap *map = ucx_map_new(16);
 295.228 -    UCX_TEST_BEGIN
 295.229 -    UCX_TEST_CALL_SUBROUTINE(test_ucx_map_itersrt, map)
 295.230 -    UCX_TEST_END
 295.231 -    ucx_map_free(map);
 295.232 -}
 295.233 -
 295.234 -UCX_TEST(test_ucx_map_iterator_chain) {
 295.235 -    UcxMap *map = ucx_map_new(1);
 295.236 -    UCX_TEST_BEGIN
 295.237 -    UCX_TEST_CALL_SUBROUTINE(test_ucx_map_itersrt, map)
 295.238 -    UCX_TEST_END
 295.239 -    ucx_map_free(map);
 295.240 -}
 295.241 -
 295.242 -UCX_TEST(test_ucx_map_clone) {
 295.243 -    UcxMap *map = ucx_map_new(4);
 295.244 -    
 295.245 -    ucx_map_cstr_put(map, "key1", (void*)"value1");
 295.246 -    ucx_map_cstr_put(map, "key2", (void*)"value2");
 295.247 -    ucx_map_cstr_put(map, "key3", (void*)"value3");
 295.248 -    
 295.249 -    UcxMap *clone = ucx_map_clone(map, NULL, NULL);
 295.250 -    
 295.251 -    const char *v1 = (const char *) ucx_map_cstr_get(map, "key1");
 295.252 -    const char *v2 = (const char *) ucx_map_cstr_get(map, "key2");
 295.253 -    const char *v3 = (const char *) ucx_map_cstr_get(map, "key3");
 295.254 -    
 295.255 -    UCX_TEST_BEGIN
 295.256 -    
 295.257 -    UCX_TEST_ASSERT(v1 != NULL, "failed key 1");
 295.258 -    UCX_TEST_ASSERT(v2 != NULL, "failed key 2");
 295.259 -    UCX_TEST_ASSERT(v3 != NULL, "failed key 3");
 295.260 -    
 295.261 -    const char *c1 = (const char *) ucx_map_cstr_get(clone, "key1");
 295.262 -    const char *c2 = (const char *) ucx_map_cstr_get(clone, "key2");
 295.263 -    const char *c3 = (const char *) ucx_map_cstr_get(clone, "key3");
 295.264 -    
 295.265 -    UCX_TEST_ASSERT(c1 != NULL, "failed key 1 (clone)");
 295.266 -    UCX_TEST_ASSERT(c2 != NULL, "failed key 2 (clone)");
 295.267 -    UCX_TEST_ASSERT(c3 != NULL, "failed key 3 (clone)");
 295.268 -    
 295.269 -    UCX_TEST_ASSERT(strcmp(c1, v1) == 0, "value error for key1");
 295.270 -    UCX_TEST_ASSERT(strcmp(c2, v2) == 0, "value error for key2");
 295.271 -    UCX_TEST_ASSERT(strcmp(c3, v3) == 0, "value error for key3");
 295.272 -    
 295.273 -    UCX_TEST_END
 295.274 -    
 295.275 -    ucx_map_free(map);
 295.276 -    ucx_map_free(clone);
 295.277 -}
 295.278 -
 295.279 -UCX_TEST(test_ucx_map_rehash) {
 295.280 -    UcxMap *map = ucx_map_new(4);
 295.281 -
 295.282 -    char keys[10][5];
 295.283 -    char values[10][7];
 295.284 -    for (int i = 0 ; i < 10 ; i++) {
 295.285 -        strcpy(keys[i], "key");
 295.286 -        keys[i][3] = 48+i; keys[i][4] = 0;
 295.287 -        strcpy(values[i], "value");
 295.288 -        values[i][5] = 48+i; values[i][6] = 0;
 295.289 -
 295.290 -        ucx_map_cstr_put(map, keys[i], values[i]);
 295.291 -    }
 295.292 -
 295.293 -    ucx_map_rehash(map);
 295.294 -
 295.295 -    UCX_TEST_BEGIN
 295.296 -    UCX_TEST_ASSERT(map->size == 25, "new capacity shall be 2.5 * count");
 295.297 -    UCX_TEST_ASSERT(map->count == 10, "new map element count incorrect");
 295.298 -    for (int i = 0 ; i < 10 ; i++) {
 295.299 -        const char *value = (const char *) ucx_map_cstr_get(map, keys[i]);
 295.300 -        UCX_TEST_ASSERT(value != NULL, "new map is missing old keys");
 295.301 -        UCX_TEST_ASSERT(strncmp(value, values[i], 6) == 0,
 295.302 -                "new map contains incorrect values");
 295.303 -    }
 295.304 -    ucx_map_rehash(map);
 295.305 -    UCX_TEST_ASSERT(map->size == 25,
 295.306 -            "subsequent rehashing call shall not change size");
 295.307 -    UCX_TEST_END
 295.308 -
 295.309 -    ucx_map_free(map);
 295.310 -}
 295.311 -
 295.312 -UCX_TEST(test_ucx_map_union) {
 295.313 -    int td[5];
 295.314 -    size_t intlen = sizeof(int);
 295.315 -    td[0] = 10; td[1] = 42; td[2] = 47; td[3] = 1337; td[4] = 9000;
 295.316 -
 295.317 -    UcxMap *first = ucx_map_new(4);
 295.318 -    UcxMap *second = ucx_map_new(4);
 295.319 -
 295.320 -    ucx_map_cstr_put(first, "key0", &td[0]);
 295.321 -    ucx_map_cstr_put(first, "key1", &td[1]);
 295.322 -    ucx_map_cstr_put(second, "key2", &td[2]);
 295.323 -    ucx_map_cstr_put(second, "key0", &td[3]);
 295.324 -    ucx_map_cstr_put(second, "key3", &td[4]);
 295.325 -
 295.326 -    UcxMap *result = ucx_map_union(first, second, ucx_memcpy, &intlen);
 295.327 -
 295.328 -    UCX_TEST_BEGIN
 295.329 -
 295.330 -    int* r;
 295.331 -    UCX_TEST_ASSERT(result->count == 4,
 295.332 -            "result has incorrect number of elements");
 295.333 -
 295.334 -    r = (int*)ucx_map_cstr_get(result, "key0");
 295.335 -    UCX_TEST_ASSERT(!!r, "key0 is not present");
 295.336 -    UCX_TEST_ASSERT(*r == td[3], "key0 has not been overwritten");
 295.337 -    r = (int*)ucx_map_cstr_get(result, "key1");
 295.338 -    UCX_TEST_ASSERT(!!r, "key1 is not present");
 295.339 -    UCX_TEST_ASSERT(*r == td[1], "key1 contains wrong data");
 295.340 -    r = (int*)ucx_map_cstr_get(result, "key2");
 295.341 -    UCX_TEST_ASSERT(!!r, "key2 is not present");
 295.342 -    UCX_TEST_ASSERT(*r == td[2], "key2 contains wrong data");
 295.343 -    r = (int*)ucx_map_cstr_get(result, "key3");
 295.344 -    UCX_TEST_ASSERT(!!r, "key3 is not present");
 295.345 -    UCX_TEST_ASSERT(*r == td[4], "key3 contains wrong data");
 295.346 -
 295.347 -    UCX_TEST_END
 295.348 -
 295.349 -    ucx_map_free_content(result, NULL);
 295.350 -    ucx_map_free(result);
 295.351 -    ucx_map_free(second);
 295.352 -    ucx_map_free(first);
 295.353 -}
 295.354 -
 295.355 -UCX_TEST(test_ucx_map_intersection) {
 295.356 -        int td[5];
 295.357 -        size_t intlen = sizeof(int);
 295.358 -        td[0] = 10; td[1] = 42; td[2] = 47; td[3] = 1337; td[4] = 9000;
 295.359 -
 295.360 -        UcxMap *first = ucx_map_new(4);
 295.361 -        UcxMap *second = ucx_map_new(4);
 295.362 -
 295.363 -        ucx_map_cstr_put(first, "key0", &td[0]);
 295.364 -        ucx_map_cstr_put(first, "key1", &td[1]);
 295.365 -        ucx_map_cstr_put(first, "key4", &td[3]);
 295.366 -        ucx_map_cstr_put(second, "key2", &td[2]);
 295.367 -        ucx_map_cstr_put(second, "key0", &td[3]);
 295.368 -        ucx_map_cstr_put(second, "key3", &td[4]);
 295.369 -        ucx_map_cstr_put(second, "key4", &td[4]);
 295.370 -
 295.371 -        UcxMap *result = ucx_map_intersection(first, second,
 295.372 -                ucx_memcpy, &intlen);
 295.373 -
 295.374 -        UCX_TEST_BEGIN
 295.375 -
 295.376 -        int* r;
 295.377 -        UCX_TEST_ASSERT(result->count == 2,
 295.378 -                "result has incorrect number of elements");
 295.379 -
 295.380 -        r = (int*)ucx_map_cstr_get(result, "key0");
 295.381 -        UCX_TEST_ASSERT(!!r, "key0 is not present");
 295.382 -        UCX_TEST_ASSERT(*r == td[0], "key0 has not original data");
 295.383 -        r = (int*)ucx_map_cstr_get(result, "key4");
 295.384 -        UCX_TEST_ASSERT(!!r, "key4 is not present");
 295.385 -        UCX_TEST_ASSERT(*r == td[3], "key4 has not original data");
 295.386 -
 295.387 -        UCX_TEST_END
 295.388 -
 295.389 -        ucx_map_free_content(result, NULL);
 295.390 -        ucx_map_free(result);
 295.391 -        ucx_map_free(second);
 295.392 -        ucx_map_free(first);
 295.393 -}
 295.394 -
 295.395 -
 295.396 -UCX_TEST(test_ucx_map_difference) {
 295.397 -        int td[5];
 295.398 -        size_t intlen = sizeof(int);
 295.399 -        td[0] = 10; td[1] = 42; td[2] = 47; td[3] = 1337; td[4] = 9000;
 295.400 -
 295.401 -        UcxMap *first = ucx_map_new(4);
 295.402 -        UcxMap *second = ucx_map_new(4);
 295.403 -
 295.404 -        ucx_map_cstr_put(first, "key0", &td[0]);
 295.405 -        ucx_map_cstr_put(first, "key1", &td[1]);
 295.406 -        ucx_map_cstr_put(first, "key2", &td[2]);
 295.407 -        ucx_map_cstr_put(first, "key4", &td[3]);
 295.408 -        ucx_map_cstr_put(second, "key0", &td[3]);
 295.409 -        ucx_map_cstr_put(second, "key3", &td[4]);
 295.410 -        ucx_map_cstr_put(second, "key4", &td[4]);
 295.411 -
 295.412 -        UcxMap *result = ucx_map_difference(first, second, ucx_memcpy, &intlen);
 295.413 -
 295.414 -        UCX_TEST_BEGIN
 295.415 -
 295.416 -        int* r;
 295.417 -        UCX_TEST_ASSERT(result->count == 2,
 295.418 -                "result has incorrect number of elements");
 295.419 -
 295.420 -        r = (int*)ucx_map_cstr_get(result, "key1");
 295.421 -        UCX_TEST_ASSERT(!!r, "key1 is not present");
 295.422 -        UCX_TEST_ASSERT(*r == td[1], "key1 has incorrect data");
 295.423 -        r = (int*)ucx_map_cstr_get(result, "key2");
 295.424 -        UCX_TEST_ASSERT(!!r, "key2 is not present");
 295.425 -        UCX_TEST_ASSERT(*r == td[2], "key2 has incorrect data");
 295.426 -
 295.427 -        UCX_TEST_END
 295.428 -
 295.429 -        ucx_map_free_content(result, NULL);
 295.430 -        ucx_map_free(result);
 295.431 -        ucx_map_free(second);
 295.432 -        ucx_map_free(first);
 295.433 -}
 295.434 -
   296.1 --- a/test/map_tests.h	Mon Dec 30 09:54:10 2019 +0100
   296.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   296.3 @@ -1,59 +0,0 @@
   296.4 -/*
   296.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   296.6 - *
   296.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   296.8 - *
   296.9 - * Redistribution and use in source and binary forms, with or without
  296.10 - * modification, are permitted provided that the following conditions are met:
  296.11 - *
  296.12 - *   1. Redistributions of source code must retain the above copyright
  296.13 - *      notice, this list of conditions and the following disclaimer.
  296.14 - *
  296.15 - *   2. Redistributions in binary form must reproduce the above copyright
  296.16 - *      notice, this list of conditions and the following disclaimer in the
  296.17 - *      documentation and/or other materials provided with the distribution.
  296.18 - *
  296.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  296.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  296.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  296.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  296.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  296.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  296.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  296.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  296.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  296.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  296.29 - * POSSIBILITY OF SUCH DAMAGE.
  296.30 - */
  296.31 -
  296.32 -#ifndef MAP_TESTS_H
  296.33 -#define	MAP_TESTS_H
  296.34 -
  296.35 -#include <ucx/test.h>
  296.36 -#include <ucx/map.h>
  296.37 -
  296.38 -#ifdef	__cplusplus
  296.39 -extern "C" {
  296.40 -#endif
  296.41 -
  296.42 -UCX_TEST(test_ucx_map_new);
  296.43 -UCX_TEST(test_ucx_key);
  296.44 -UCX_TEST(test_ucx_map_put);
  296.45 -UCX_TEST(test_ucx_map_get);
  296.46 -UCX_TEST(test_ucx_map_remove);
  296.47 -UCX_TEST(test_ucx_map_clear);
  296.48 -UCX_TEST(test_ucx_map_iterator);
  296.49 -UCX_TEST(test_ucx_map_iterator_chain);
  296.50 -UCX_TEST(test_ucx_map_clone);
  296.51 -UCX_TEST(test_ucx_map_rehash);
  296.52 -UCX_TEST(test_ucx_map_union);
  296.53 -UCX_TEST(test_ucx_map_intersection);
  296.54 -UCX_TEST(test_ucx_map_difference);
  296.55 -
  296.56 -
  296.57 -#ifdef	__cplusplus
  296.58 -}
  296.59 -#endif
  296.60 -
  296.61 -#endif	/* MAP_TESTS_H */
  296.62 -
   297.1 --- a/test/mpool_tests.c	Mon Dec 30 09:54:10 2019 +0100
   297.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   297.3 @@ -1,239 +0,0 @@
   297.4 -/*
   297.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   297.6 - *
   297.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   297.8 - *
   297.9 - * Redistribution and use in source and binary forms, with or without
  297.10 - * modification, are permitted provided that the following conditions are met:
  297.11 - *
  297.12 - *   1. Redistributions of source code must retain the above copyright
  297.13 - *      notice, this list of conditions and the following disclaimer.
  297.14 - *
  297.15 - *   2. Redistributions in binary form must reproduce the above copyright
  297.16 - *      notice, this list of conditions and the following disclaimer in the
  297.17 - *      documentation and/or other materials provided with the distribution.
  297.18 - *
  297.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  297.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  297.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  297.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  297.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  297.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  297.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  297.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  297.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  297.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  297.29 - * POSSIBILITY OF SUCH DAMAGE.
  297.30 - */
  297.31 -
  297.32 -#include <inttypes.h>
  297.33 -
  297.34 -#include "mpool_tests.h"
  297.35 -
  297.36 -UCX_TEST(test_ucx_mempool_new) {
  297.37 -    UcxMempool *pool = ucx_mempool_new(16);
  297.38 -    UCX_TEST_BEGIN
  297.39 -    UCX_TEST_ASSERT(pool->size == 16, "wrong size");
  297.40 -    UCX_TEST_ASSERT(pool->ndata == 0, "uninitialized counter");
  297.41 -    UCX_TEST_ASSERT(pool->data != NULL, "no memory addressed");
  297.42 -    UCX_TEST_END
  297.43 -    ucx_mempool_destroy(pool);
  297.44 -}
  297.45 -
  297.46 -UCX_TEST(test_ucx_mempool_malloc) {
  297.47 -    
  297.48 -    UcxMempool *pool = ucx_mempool_new(1);
  297.49 -    UCX_TEST_BEGIN
  297.50 -    intptr_t *test = (intptr_t*) ucx_mempool_malloc(pool, sizeof(intptr_t));
  297.51 -    
  297.52 -    UCX_TEST_ASSERT(pool->ndata == 1, "counter not incremented");
  297.53 -    UCX_TEST_ASSERT(pool->size == 1, "chcap called");
  297.54 -    
  297.55 -    intptr_t *pooladdr =
  297.56 -            (intptr_t*)((char*)pool->data[0] + sizeof(ucx_destructor));
  297.57 -    *pooladdr = 5;
  297.58 -    
  297.59 -    UCX_TEST_ASSERT(*test == 5, "wrong pointer");
  297.60 -    
  297.61 -    UCX_TEST_END
  297.62 -    ucx_mempool_destroy(pool);
  297.63 -}
  297.64 -
  297.65 -UCX_TEST(test_ucx_mempool_malloc_with_chcap) {
  297.66 -    
  297.67 -    UcxMempool *pool = ucx_mempool_new(1);
  297.68 -    UCX_TEST_BEGIN
  297.69 -    ucx_mempool_malloc(pool, sizeof(int));
  297.70 -    intptr_t *test = (intptr_t*) ucx_mempool_malloc(pool, sizeof(intptr_t));
  297.71 -    
  297.72 -    UCX_TEST_ASSERT(pool->ndata == 2, "counter not incremented");
  297.73 -    UCX_TEST_ASSERT(pool->size == 2, "chcap not called");
  297.74 -    
  297.75 -    intptr_t *pooladdr =
  297.76 -            (intptr_t*)((char*)pool->data[1] + sizeof(ucx_destructor));
  297.77 -    *pooladdr = 5;
  297.78 -    
  297.79 -    UCX_TEST_ASSERT(*test == 5, "wrong pointer");
  297.80 -    
  297.81 -    // overflow test
  297.82 -    void *n0 = ucx_mempool_malloc(pool, (size_t)-1);
  297.83 -    void *n1 = ucx_mempool_malloc(pool, ((size_t)-1) - sizeof(void*)/2);
  297.84 -    
  297.85 -    UCX_TEST_ASSERT(n0 == NULL, "should not allocate SIZE_MAX bytes");
  297.86 -    UCX_TEST_ASSERT(n1 == NULL, "should detect integer overflow");
  297.87 -    
  297.88 -    UCX_TEST_END
  297.89 -    ucx_mempool_destroy(pool);
  297.90 -}
  297.91 -
  297.92 -UCX_TEST(test_ucx_mempool_calloc) {
  297.93 -    
  297.94 -    UcxMempool *pool = ucx_mempool_new(1);
  297.95 -    UCX_TEST_BEGIN
  297.96 -    
  297.97 -    intptr_t *test = (intptr_t*) ucx_mempool_calloc(pool, 2, sizeof(intptr_t));
  297.98 -    
  297.99 -    UCX_TEST_ASSERT(test != NULL, "no memory for test data");
 297.100 -    UCX_TEST_ASSERT(test[0] == 0 && test[1] == 0, "failed");
 297.101 -    
 297.102 -    // overflow test
 297.103 -    void *n0 = ucx_mempool_calloc(pool, (size_t)-1, 1);
 297.104 -    void *n1 = ucx_mempool_calloc(pool, ((size_t)-1)/2, 3);
 297.105 -    
 297.106 -    UCX_TEST_ASSERT(n0 == NULL, "should not allocate SIZE_MAX bytes");
 297.107 -    UCX_TEST_ASSERT(n1 == NULL, "should detect integer overflow");
 297.108 -    
 297.109 -    UCX_TEST_END
 297.110 -    ucx_mempool_destroy(pool);
 297.111 -}
 297.112 -
 297.113 -UCX_TEST(test_ucx_mempool_free) {
 297.114 -    UcxMempool *pool = ucx_mempool_new(16);
 297.115 -    void *mem1;
 297.116 -    void *mem2;
 297.117 -    
 297.118 -    UCX_TEST_BEGIN
 297.119 -    
 297.120 -    mem1 = ucx_mempool_malloc(pool, 16);
 297.121 -    ucx_mempool_free(pool, mem1);
 297.122 -    
 297.123 -    UCX_TEST_ASSERT(pool->ndata == 0, "mempool not empty");
 297.124 -    
 297.125 -    ucx_mempool_malloc(pool, 16);
 297.126 -    ucx_mempool_malloc(pool, 16);
 297.127 -    mem1 = ucx_mempool_malloc(pool, 16);
 297.128 -    ucx_mempool_malloc(pool, 16);
 297.129 -    mem2 = ucx_mempool_malloc(pool, 16);
 297.130 -    
 297.131 -    ucx_mempool_free(pool, mem1);
 297.132 -    
 297.133 -    UCX_TEST_ASSERT(pool->ndata == 4, "wrong mempool size");
 297.134 -    
 297.135 -    ucx_mempool_free(pool, mem2);
 297.136 -    
 297.137 -    UCX_TEST_ASSERT(pool->ndata == 3, "wrong mempool size");
 297.138 -    
 297.139 -    UCX_TEST_END
 297.140 -    ucx_mempool_destroy(pool);
 297.141 -}
 297.142 -
 297.143 -#ifdef __cplusplus
 297.144 -extern "C"
 297.145 -#endif
 297.146 -void test_setdestr(void* elem) {
 297.147 -    intptr_t *cb = (intptr_t*) ((intptr_t*) elem)[1];
 297.148 -    *cb = 42;
 297.149 -}
 297.150 -
 297.151 -UCX_TEST(test_ucx_mempool_set_destr) {
 297.152 -    
 297.153 -    intptr_t *cb = (intptr_t*) malloc(sizeof(intptr_t));
 297.154 -    UCX_TEST_BEGIN
 297.155 -    UcxMempool *pool = ucx_mempool_new(2);
 297.156 -    
 297.157 -    ucx_mempool_malloc(pool, sizeof(intptr_t));
 297.158 -    intptr_t *test = (intptr_t*) ucx_mempool_calloc(pool, 2, sizeof(intptr_t));
 297.159 -    
 297.160 -    UCX_TEST_ASSERT(cb != NULL && test != NULL, "no memory for test data");
 297.161 -    
 297.162 -    test[0] = 5; test[1] = (intptr_t) cb;
 297.163 -    *cb = 13;
 297.164 -    
 297.165 -    ucx_mempool_set_destr(test, test_setdestr);
 297.166 -    UCX_TEST_ASSERT(
 297.167 -            *(ucx_destructor*)(pool->data[1]) == test_setdestr, "failed")
 297.168 -    UCX_TEST_ASSERT(
 297.169 -            test[0] == 5 && test[1] == (intptr_t) cb, "setdestr destroyed data")
 297.170 -    
 297.171 -    ucx_mempool_destroy(pool);
 297.172 -    
 297.173 -    UCX_TEST_ASSERT(*cb == 42, "destructor not called");
 297.174 -    
 297.175 -    UCX_TEST_END
 297.176 -    if (cb != NULL) free(cb);
 297.177 -}
 297.178 -
 297.179 -
 297.180 -UCX_TEST(test_ucx_mempool_reg_destr) {
 297.181 -    
 297.182 -    intptr_t *test = (intptr_t*) calloc(2, sizeof(intptr_t));
 297.183 -    intptr_t *cb = (intptr_t*) malloc(sizeof(intptr_t));
 297.184 -    UCX_TEST_BEGIN
 297.185 -    UcxMempool *pool = ucx_mempool_new(1);
 297.186 -    
 297.187 -    UCX_TEST_ASSERT(cb != NULL && test != NULL, "no memory for test data");
 297.188 -    
 297.189 -    test[0] = 5; test[1] = (intptr_t) cb;
 297.190 -    *cb = 13;
 297.191 -    
 297.192 -    ucx_mempool_reg_destr(pool, test, test_setdestr);
 297.193 -    
 297.194 -    ucx_destructor *pooladdr = (ucx_destructor*)
 297.195 -            ((char*)pool->data[0] + sizeof(ucx_destructor));
 297.196 -    
 297.197 -    UCX_TEST_ASSERT(*pooladdr == test_setdestr, "failed");
 297.198 -    
 297.199 -    ucx_mempool_destroy(pool);
 297.200 -    UCX_TEST_ASSERT(*cb == 42, "destructor not called");
 297.201 -    UCX_TEST_END
 297.202 -
 297.203 -    if (test != NULL) free(test);
 297.204 -    if (cb != NULL) free(cb);
 297.205 -}
 297.206 -
 297.207 -UCX_TEST(test_ucx_mempool_realloc) {
 297.208 -
 297.209 -    intptr_t *cb = (intptr_t*) malloc(sizeof(intptr_t));
 297.210 -    UCX_TEST_BEGIN
 297.211 -    UcxMempool *pool = ucx_mempool_new(2);
 297.212 -    
 297.213 -    ucx_mempool_malloc(pool, sizeof(intptr_t));
 297.214 -    intptr_t *test = (intptr_t*) ucx_mempool_calloc(pool, 2, sizeof(intptr_t));
 297.215 -
 297.216 -    UCX_TEST_ASSERT(cb != NULL && test != NULL, "no memory for test data");
 297.217 -    
 297.218 -    test[0] = 5; test[1] = (intptr_t) cb;
 297.219 -    *cb = 13;
 297.220 -    
 297.221 -    ucx_mempool_set_destr(test, test_setdestr);
 297.222 -    
 297.223 -    intptr_t *rtest, n = 2;
 297.224 -    do {
 297.225 -        n *= 2;
 297.226 -        UCX_TEST_ASSERT(n < 65536, "test corrupt - no movement for realloc");
 297.227 -        rtest = (intptr_t*) ucx_mempool_realloc(pool, test, n*sizeof(intptr_t));
 297.228 -    } while (rtest == test);
 297.229 -    test = rtest;
 297.230 -    
 297.231 -    UCX_TEST_ASSERT(*(ucx_destructor*)(pool->data[1]) == test_setdestr,
 297.232 -            "realloc killed destructor")
 297.233 -    UCX_TEST_ASSERT(
 297.234 -            test[0] == 5 && test[1] == (intptr_t) cb, "realloc destroyed data")
 297.235 -    
 297.236 -    ucx_mempool_destroy(pool);
 297.237 -    
 297.238 -    UCX_TEST_ASSERT(*cb == 42, "destructor not called");
 297.239 -    
 297.240 -    UCX_TEST_END
 297.241 -    if (cb != NULL) free(cb);
 297.242 -}
   298.1 --- a/test/mpool_tests.h	Mon Dec 30 09:54:10 2019 +0100
   298.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   298.3 @@ -1,53 +0,0 @@
   298.4 -/*
   298.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   298.6 - *
   298.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   298.8 - *
   298.9 - * Redistribution and use in source and binary forms, with or without
  298.10 - * modification, are permitted provided that the following conditions are met:
  298.11 - *
  298.12 - *   1. Redistributions of source code must retain the above copyright
  298.13 - *      notice, this list of conditions and the following disclaimer.
  298.14 - *
  298.15 - *   2. Redistributions in binary form must reproduce the above copyright
  298.16 - *      notice, this list of conditions and the following disclaimer in the
  298.17 - *      documentation and/or other materials provided with the distribution.
  298.18 - *
  298.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  298.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  298.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  298.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  298.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  298.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  298.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  298.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  298.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  298.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  298.29 - * POSSIBILITY OF SUCH DAMAGE.
  298.30 - */
  298.31 -
  298.32 -#ifndef MPOOL_TESTS_H
  298.33 -#define	MPOOL_TESTS_H
  298.34 -
  298.35 -#include <ucx/test.h>
  298.36 -#include <ucx/mempool.h>
  298.37 -
  298.38 -#ifdef	__cplusplus
  298.39 -extern "C" {
  298.40 -#endif
  298.41 -
  298.42 -UCX_TEST(test_ucx_mempool_new);
  298.43 -UCX_TEST(test_ucx_mempool_malloc);
  298.44 -UCX_TEST(test_ucx_mempool_malloc_with_chcap);
  298.45 -UCX_TEST(test_ucx_mempool_calloc);
  298.46 -UCX_TEST(test_ucx_mempool_free);
  298.47 -UCX_TEST(test_ucx_mempool_set_destr);
  298.48 -UCX_TEST(test_ucx_mempool_reg_destr);
  298.49 -UCX_TEST(test_ucx_mempool_realloc);
  298.50 -
  298.51 -#ifdef	__cplusplus
  298.52 -}
  298.53 -#endif
  298.54 -
  298.55 -#endif	/* MPOOL_TESTS_H */
  298.56 -
   299.1 --- a/test/prop_tests.c	Mon Dec 30 09:54:10 2019 +0100
   299.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   299.3 @@ -1,545 +0,0 @@
   299.4 -/*
   299.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   299.6 - *
   299.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   299.8 - *
   299.9 - * Redistribution and use in source and binary forms, with or without
  299.10 - * modification, are permitted provided that the following conditions are met:
  299.11 - *
  299.12 - *   1. Redistributions of source code must retain the above copyright
  299.13 - *      notice, this list of conditions and the following disclaimer.
  299.14 - *
  299.15 - *   2. Redistributions in binary form must reproduce the above copyright
  299.16 - *      notice, this list of conditions and the following disclaimer in the
  299.17 - *      documentation and/or other materials provided with the distribution.
  299.18 - *
  299.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  299.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  299.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  299.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  299.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  299.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  299.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  299.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  299.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  299.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  299.29 - * POSSIBILITY OF SUCH DAMAGE.
  299.30 - */
  299.31 -
  299.32 -#include "prop_tests.h"
  299.33 -#include <ucx/mempool.h>
  299.34 -
  299.35 -UCX_TEST(test_ucx_properties_new) {
  299.36 -    UcxProperties *parser = ucx_properties_new();
  299.37 -    
  299.38 -    UCX_TEST_BEGIN
  299.39 -            
  299.40 -    UCX_TEST_ASSERT(parser != NULL, "failed");
  299.41 -    UCX_TEST_ASSERT(parser->buffer == NULL, "parser has buffer");
  299.42 -    UCX_TEST_ASSERT(parser->tmp == NULL, "parser has tmp buffer");
  299.43 -    
  299.44 -    UCX_TEST_END
  299.45 -            
  299.46 -    ucx_properties_free(parser);
  299.47 -}
  299.48 -
  299.49 -UCX_TEST(test_ucx_properties_next) {  
  299.50 -    const char *tests[] = {
  299.51 -        "name = value\n",
  299.52 -        "name=value\n",
  299.53 -        "n=value\n",
  299.54 -        "name=v\n",
  299.55 -        "n=v\n",
  299.56 -        "name = value # comment\n",
  299.57 -        "#comment\nn=v\n",
  299.58 -        "# comment1\n# comment2\n\n    \n\nname = value\n",
  299.59 -        "    name     =      value\n",
  299.60 -        "name = value\n\n"
  299.61 -    };
  299.62 -    
  299.63 -    const char *names[] = {
  299.64 -        "name",
  299.65 -        "name",
  299.66 -        "n",
  299.67 -        "name",
  299.68 -        "n",
  299.69 -        "name",
  299.70 -        "n",
  299.71 -        "name",
  299.72 -        "name",
  299.73 -        "name"
  299.74 -    };
  299.75 -    
  299.76 -    const char *values[] = {
  299.77 -        "value",
  299.78 -        "value",
  299.79 -        "value",
  299.80 -        "v",
  299.81 -        "v",
  299.82 -        "value",
  299.83 -        "v",
  299.84 -        "value",
  299.85 -        "value",
  299.86 -        "value"
  299.87 -    };
  299.88 -    
  299.89 -    UCX_TEST_BEGIN
  299.90 -    
  299.91 -    sstr_t name;
  299.92 -    sstr_t value;
  299.93 -    
  299.94 -    for(int i=0;i<10;i++) {
  299.95 -        UcxProperties *parser = ucx_properties_new();
  299.96 -        
  299.97 -        ucx_properties_fill(parser, (char*)tests[i], strlen(tests[i]));
  299.98 -        UCX_TEST_ASSERT(parser->buffer == tests[i], "fill failed");
  299.99 -        UCX_TEST_ASSERT(parser->buflen == strlen(tests[i]), "wrong buflen");
 299.100 -        
 299.101 -        int r = ucx_properties_next(parser, &name, &value);
 299.102 -        sstr_t n = sstr((char*)names[i]);
 299.103 -        sstr_t v = sstr((char*)values[i]);
 299.104 -        UCX_TEST_ASSERT(r == 1, "next returned 0");
 299.105 -        UCX_TEST_ASSERT((!sstrcmp(name, n)), "wrong property name");
 299.106 -        UCX_TEST_ASSERT((!sstrcmp(value, v)), "wrong property value");
 299.107 -        
 299.108 -        r = ucx_properties_next(parser, &name, &value);
 299.109 -        UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.110 -        UCX_TEST_ASSERT(parser->tmp == NULL, "tmp not NULL");
 299.111 -        UCX_TEST_ASSERT(parser->tmpcap == 0, "tmpcap not NULL");
 299.112 -        UCX_TEST_ASSERT(parser->tmplen == 0, "tmplen not NULL");
 299.113 -        
 299.114 -        ucx_properties_free(parser);
 299.115 -    }
 299.116 -    
 299.117 -    UCX_TEST_END       
 299.118 -}
 299.119 -
 299.120 -UCX_TEST(test_ucx_properties_next_multi) {
 299.121 -    const char *names[] = {
 299.122 -        "a",
 299.123 -        "b",
 299.124 -        "c",
 299.125 -        "uap",
 299.126 -        "name",
 299.127 -        "key1",
 299.128 -        "key2",
 299.129 -        "key3"
 299.130 -    };
 299.131 -    
 299.132 -    const char *values[] = {
 299.133 -        "a value",
 299.134 -        "b value",
 299.135 -        "core",
 299.136 -        "core",
 299.137 -        "ucx",
 299.138 -        "value1",
 299.139 -        "value2",
 299.140 -        "value3"
 299.141 -    };
 299.142 -    
 299.143 -    const char *str = "#\n"
 299.144 -        "# properties\n"
 299.145 -        "# contains key/value pairs\n"
 299.146 -        "#\n"
 299.147 -        "a = a value\n"
 299.148 -        "b = b value\n"
 299.149 -        "c = core\n"
 299.150 -        "\n# test\n"
 299.151 -        "uap = core\n"
 299.152 -        "name = ucx\n"
 299.153 -        "# no = property\n"
 299.154 -        "key1 = value1\n"
 299.155 -        "#key1 = wrong value\n"
 299.156 -        "#key2 = not value 2\n"
 299.157 -        "key2 = value2\n"
 299.158 -        "\n\n\n        \n           key3=value3\n";
 299.159 -    
 299.160 -    UcxProperties *parser = ucx_properties_new();
 299.161 -    
 299.162 -    UCX_TEST_BEGIN
 299.163 -    
 299.164 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.165 -    
 299.166 -    sstr_t name;
 299.167 -    sstr_t value;
 299.168 -    for(int i=0;i<8;i++) {
 299.169 -        int r = ucx_properties_next(parser, &name, &value);
 299.170 -        UCX_TEST_ASSERT(r == 1, "next returned 0");
 299.171 -        UCX_TEST_ASSERT((!sstrcmp(name, sstr((char*)names[i]))), "wrong name");
 299.172 -        UCX_TEST_ASSERT((!sstrcmp(value, sstr((char*)values[i]))),
 299.173 -                "wrong value");
 299.174 -    }
 299.175 -    int r = ucx_properties_next(parser, &name, &value);
 299.176 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.177 -    
 299.178 -    UCX_TEST_END
 299.179 -    
 299.180 -    ucx_properties_free(parser);
 299.181 -}
 299.182 -
 299.183 -UCX_TEST(test_ucx_properties_next_part) {
 299.184 -    UcxProperties *parser = ucx_properties_new();
 299.185 -    const char *str;
 299.186 -    int r;
 299.187 -    sstr_t name;
 299.188 -    sstr_t value;
 299.189 -    
 299.190 -    UCX_TEST_BEGIN
 299.191 -    
 299.192 -    str = "";
 299.193 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.194 -    r = ucx_properties_next(parser, &name, &value);
 299.195 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.196 -    
 299.197 -    str = "  \n";
 299.198 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.199 -    r = ucx_properties_next(parser, &name, &value); 
 299.200 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.201 -    
 299.202 -    str = "name";
 299.203 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.204 -    r = ucx_properties_next(parser, &name, &value); 
 299.205 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.206 -    
 299.207 -    str = "    ";
 299.208 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.209 -    r = ucx_properties_next(parser, &name, &value); 
 299.210 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.211 -    
 299.212 -    str = "= ";
 299.213 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.214 -    r = ucx_properties_next(parser, &name, &value); 
 299.215 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.216 -    
 299.217 -    str = "value";
 299.218 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.219 -    r = ucx_properties_next(parser, &name, &value); 
 299.220 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.221 -    
 299.222 -    str = "\n";
 299.223 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.224 -    r = ucx_properties_next(parser, &name, &value); 
 299.225 -    UCX_TEST_ASSERT(r == 1, "next returned 0");
 299.226 -    UCX_TEST_ASSERT((!sstrcmp(name, sstr((char*)"name"))), "wrong name");
 299.227 -    UCX_TEST_ASSERT((!sstrcmp(value, sstr((char*)"value"))), "wrong value");
 299.228 -    
 299.229 -    // second round
 299.230 -    str = "#comment\n";
 299.231 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.232 -    r = ucx_properties_next(parser, &name, &value); 
 299.233 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.234 -    
 299.235 -    str = "#comment\nname = ";
 299.236 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.237 -    r = ucx_properties_next(parser, &name, &value); 
 299.238 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.239 -    
 299.240 -    str = "value\na = b\n";
 299.241 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.242 -    r = ucx_properties_next(parser, &name, &value); 
 299.243 -    UCX_TEST_ASSERT(r == 1, "next returned 0");
 299.244 -    UCX_TEST_ASSERT((!sstrcmp(name, sstr((char*)"name"))), "wrong name");
 299.245 -    UCX_TEST_ASSERT((!sstrcmp(value, sstr((char*)"value"))), "wrong value");
 299.246 -    
 299.247 -    r = ucx_properties_next(parser, &name, &value); 
 299.248 -    UCX_TEST_ASSERT(r == 1, "next returned 0");
 299.249 -    UCX_TEST_ASSERT((!sstrcmp(name, sstr((char*)"a"))), "wrong name");
 299.250 -    UCX_TEST_ASSERT((!sstrcmp(value, sstr((char*)"b"))), "wrong value");
 299.251 -    
 299.252 -    str = "# comment\n#\n#\ntests = ";
 299.253 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.254 -    r = ucx_properties_next(parser, &name, &value); 
 299.255 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.256 -    
 299.257 -    str = "test1 ";
 299.258 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.259 -    r = ucx_properties_next(parser, &name, &value); 
 299.260 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.261 -    
 299.262 -    str = "test2 test3 test4\n";
 299.263 -    sstr_t testv = sstr((char*)"test1 test2 test3 test4");
 299.264 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.265 -    r = ucx_properties_next(parser, &name, &value); 
 299.266 -    UCX_TEST_ASSERT(r == 1, "next returned 0");
 299.267 -    UCX_TEST_ASSERT((!sstrcmp(name, sstr((char*)"tests"))), "wrong name");
 299.268 -    UCX_TEST_ASSERT((!sstrcmp(value, testv)), "wrong value");
 299.269 -    
 299.270 -    // test if ucx_properties_next finds a name/value after a tmp comment
 299.271 -    str = "# just a comment";
 299.272 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.273 -    r = ucx_properties_next(parser, &name, &value); 
 299.274 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.275 -    
 299.276 -    str = " in 3";
 299.277 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.278 -    r = ucx_properties_next(parser, &name, &value); 
 299.279 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.280 -    
 299.281 -    str = " parts\na = 1\n";
 299.282 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.283 -    r = ucx_properties_next(parser, &name, &value); 
 299.284 -    UCX_TEST_ASSERT(r == 1, "next returned 0");
 299.285 -    UCX_TEST_ASSERT((!sstrcmp(name, sstr((char*)"a"))), "wrong name");
 299.286 -    UCX_TEST_ASSERT((!sstrcmp(value, sstr((char*)"1"))), "wrong value");
 299.287 -    
 299.288 -    UCX_TEST_END
 299.289 -    
 299.290 -    ucx_properties_free(parser);
 299.291 -}
 299.292 -
 299.293 -UCX_TEST(test_ucx_properties_next_long) {
 299.294 -    UcxProperties *parser = ucx_properties_new();
 299.295 -    int r;
 299.296 -    size_t name_len = 512;
 299.297 -    char *long_name = (char*)malloc(name_len);
 299.298 -    memset(long_name, 'a', 70);
 299.299 -    memset(long_name+70, 'b', 242);
 299.300 -    memset(long_name+312, 'c', 200);
 299.301 -    
 299.302 -    size_t value_len = 2048;
 299.303 -    char *long_value = (char*)malloc(value_len);
 299.304 -    memset(long_value, 'x', 1024);
 299.305 -    memset(long_value+1024, 'y', 1024);
 299.306 -    
 299.307 -    UCX_TEST_BEGIN
 299.308 -    
 299.309 -    sstr_t name;
 299.310 -    sstr_t value;
 299.311 -    
 299.312 -    ucx_properties_fill(parser, long_name, 10);
 299.313 -    r = ucx_properties_next(parser, &name, &value);
 299.314 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.315 -    
 299.316 -    ucx_properties_fill(parser, long_name+10, 202);
 299.317 -    r = ucx_properties_next(parser, &name, &value);
 299.318 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.319 -    
 299.320 -    ucx_properties_fill(parser, long_name+212, 200);
 299.321 -    r = ucx_properties_next(parser, &name, &value);
 299.322 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.323 -    
 299.324 -    ucx_properties_fill(parser, long_name+412, 100);
 299.325 -    r = ucx_properties_next(parser, &name, &value);
 299.326 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.327 -    
 299.328 -    const char *str = " = ";
 299.329 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.330 -    r = ucx_properties_next(parser, &name, &value);
 299.331 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.332 -    
 299.333 -    ucx_properties_fill(parser, long_value, 512);
 299.334 -    r = ucx_properties_next(parser, &name, &value); 
 299.335 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.336 -    
 299.337 -    ucx_properties_fill(parser, long_value+512, 1024);
 299.338 -    r = ucx_properties_next(parser, &name, &value);
 299.339 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.340 -    
 299.341 -    ucx_properties_fill(parser, long_value+1536, 512);
 299.342 -    r = ucx_properties_next(parser, &name, &value);
 299.343 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.344 -    
 299.345 -    str = "\n#comment\nkey = value\n";
 299.346 -    ucx_properties_fill(parser, (char*)str, strlen(str));    
 299.347 -    r = ucx_properties_next(parser, &name, &value);
 299.348 -    sstr_t n = sstrn(long_name, name_len);
 299.349 -    sstr_t v = sstrn(long_value, value_len);
 299.350 -    UCX_TEST_ASSERT(r == 1, "next returned 0");
 299.351 -    UCX_TEST_ASSERT((!sstrcmp(name, n)), "wrong name");
 299.352 -    UCX_TEST_ASSERT((!sstrcmp(value, v)), "wrong value");
 299.353 -    
 299.354 -    r = ucx_properties_next(parser, &name, &value);
 299.355 -    UCX_TEST_ASSERT(r == 1, "next returned 0");
 299.356 -    UCX_TEST_ASSERT((!sstrcmp(name, sstr((char*)"key"))), "wrong name");
 299.357 -    UCX_TEST_ASSERT((!sstrcmp(value, sstr((char*)"value"))), "wrong value");
 299.358 -    
 299.359 -    r = ucx_properties_next(parser, &name, &value);
 299.360 -    UCX_TEST_ASSERT(r == 0, "next returned 1");
 299.361 -    
 299.362 -    UCX_TEST_END
 299.363 -    
 299.364 -    free(long_name);
 299.365 -    free(long_value);
 299.366 -    ucx_properties_free(parser);
 299.367 -}
 299.368 -
 299.369 -UCX_TEST(test_ucx_properties2map) {
 299.370 -    UcxMempool *mp = ucx_mempool_new(64);
 299.371 -    UcxMap *map = ucx_map_new_a(mp->allocator, 16);
 299.372 -    UcxProperties *parser = ucx_properties_new();
 299.373 -    
 299.374 -    UCX_TEST_BEGIN
 299.375 -    
 299.376 -    const char *str = "key1 = value1\nkey2 = value2\n\n#comment\n\nkey3 = value3\n";
 299.377 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.378 -    
 299.379 -    int r = ucx_properties2map(parser, map);
 299.380 -    
 299.381 -    UCX_TEST_ASSERT(r == 0, "properties2map failed");
 299.382 -    UCX_TEST_ASSERT(map->count == 3, "wrong number of properties");
 299.383 -    
 299.384 -    char *v1 = (char*)ucx_map_cstr_get(map, "key1");
 299.385 -    char *v2 = (char*)ucx_map_cstr_get(map, "key2");
 299.386 -    char *v3 = (char*)ucx_map_cstr_get(map, "key3");
 299.387 -    
 299.388 -    UCX_TEST_ASSERT(v1, "value for key1 not found");
 299.389 -    UCX_TEST_ASSERT(v2, "value for key2 not found");
 299.390 -    UCX_TEST_ASSERT(v3, "value for key3 not found");
 299.391 -    
 299.392 -    UCX_TEST_ASSERT((!strcmp(v1, "value1")), "wrong value for key1");
 299.393 -    UCX_TEST_ASSERT((!strcmp(v2, "value2")), "wrong value for key2");
 299.394 -    UCX_TEST_ASSERT((!strcmp(v3, "value3")), "wrong value for key3");
 299.395 -    
 299.396 -    // second test
 299.397 -    ucx_map_free(map);
 299.398 -    map = ucx_map_new_a(mp->allocator, 16);
 299.399 -    
 299.400 -    str = "\n#comment\n";
 299.401 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.402 -    
 299.403 -    r = ucx_properties2map(parser, map);
 299.404 -    UCX_TEST_ASSERT(r == 0, "properties2map failed");
 299.405 -    UCX_TEST_ASSERT(map->count == 0, "wrong number of properties");
 299.406 -    
 299.407 -    str = "key1 = value1\nsyntax error line\n";
 299.408 -    ucx_properties_fill(parser, (char*)str, strlen(str));
 299.409 -    
 299.410 -    r = ucx_properties2map(parser, map);
 299.411 -    UCX_TEST_ASSERT(r == 1, "properties2map should return 1");
 299.412 -    UCX_TEST_ASSERT(map->count == 1, "wrong number of properties");
 299.413 -    
 299.414 -    char *v = (char*)ucx_map_cstr_get(map, "key1");
 299.415 -    UCX_TEST_ASSERT((!strcmp(v, "value1")), "wrong value");
 299.416 -    
 299.417 -    UCX_TEST_END
 299.418 -    
 299.419 -    ucx_mempool_destroy(mp);
 299.420 -    ucx_properties_free(parser);
 299.421 -}
 299.422 -
 299.423 -UCX_TEST(test_ucx_properties_load) { 
 299.424 -    UCX_TEST_BEGIN
 299.425 -    FILE *f = tmpfile();
 299.426 -    UCX_TEST_ASSERT(f, "test file cannot be opened, test aborted");
 299.427 -    
 299.428 -    fprintf(f, "# properties file\n\nkey1 = value1\nkey2 = value2\n");
 299.429 -    fprintf(f, "\n\nkey3    = value3\n\n");
 299.430 -    
 299.431 -    size_t name_len = 512;
 299.432 -    char *long_name = (char*)malloc(name_len);
 299.433 -    memset(long_name, 'k', 512);
 299.434 -    
 299.435 -    size_t value_len = 2048;
 299.436 -    char *long_value = (char*)malloc(value_len);
 299.437 -    memset(long_value, 'v', 2048);
 299.438 -    
 299.439 -    fwrite(long_name, 1, name_len, f);
 299.440 -    fprintf(f, "    =    ");
 299.441 -    fwrite(long_value, 1, value_len, f);
 299.442 -    fprintf(f, "                         \n");
 299.443 -    
 299.444 -    fprintf(f, "\n\n\n\nlast_key = property value\n");
 299.445 -    
 299.446 -    fflush(f);
 299.447 -    fseek(f, 0, SEEK_SET);
 299.448 -    
 299.449 -    UcxMap *map = ucx_map_new(8);
 299.450 -    int r = ucx_properties_load(map, f);
 299.451 -    
 299.452 -    UCX_TEST_ASSERT(r == 0, "ucx_properties_load failed");
 299.453 -    UCX_TEST_ASSERT(map->count == 5, "wrong number of properties");
 299.454 -    
 299.455 -    char *v1 = (char*)ucx_map_cstr_get(map, "key1");
 299.456 -    char *v2 = (char*)ucx_map_cstr_get(map, "key2");
 299.457 -    char *v3 = (char*)ucx_map_cstr_get(map, "key3");
 299.458 -    char *lv = (char*)ucx_map_sstr_get(map, sstrn(long_name, name_len));
 299.459 -    char *lk = (char*)ucx_map_cstr_get(map, "last_key");
 299.460 -    
 299.461 -    UCX_TEST_ASSERT(v1, "value for key1 not found");
 299.462 -    UCX_TEST_ASSERT(v2, "value for key2 not found");
 299.463 -    UCX_TEST_ASSERT(v3, "value for key3 not found");
 299.464 -    UCX_TEST_ASSERT(lv, "value for long key not found");
 299.465 -    UCX_TEST_ASSERT(lk, "value for last_key not found");
 299.466 -    
 299.467 -    UCX_TEST_ASSERT((!strcmp(v1, "value1")), "wrong value for key1");
 299.468 -    UCX_TEST_ASSERT((!strcmp(v2, "value2")), "wrong value for key2");
 299.469 -    UCX_TEST_ASSERT((!strcmp(v3, "value3")), "wrong value for key3");
 299.470 -    sstr_t long1 = sstrn(long_value, value_len);
 299.471 -    sstr_t long2 = sstr(lv);
 299.472 -    UCX_TEST_ASSERT((!sstrcmp(long1, long2)), "wrong value for long key");
 299.473 -    UCX_TEST_ASSERT(!strcmp(lk, "property value"), "wrong value for last_key");
 299.474 -    
 299.475 -    free(v1);
 299.476 -    free(v2);
 299.477 -    free(v3);
 299.478 -    free(lv);
 299.479 -    free(lk);
 299.480 -    ucx_map_free(map);
 299.481 -    fclose(f);
 299.482 -    
 299.483 -    free(long_name);
 299.484 -    free(long_value);
 299.485 -    
 299.486 -    UCX_TEST_END
 299.487 -}
 299.488 -
 299.489 -UCX_TEST(test_ucx_properties_store) {
 299.490 -    UcxMap *map1 = ucx_map_new(16);
 299.491 -    ucx_map_cstr_put(map1, "key1", "value1");
 299.492 -    ucx_map_cstr_put(map1, "key2", "value2");
 299.493 -    ucx_map_cstr_put(map1, "key3", "value3");
 299.494 -    ucx_map_cstr_put(map1, "key4", "value4");
 299.495 -    ucx_map_cstr_put(map1, "property.key1", "some value 1");
 299.496 -    ucx_map_cstr_put(map1, "property.key2", "some value 2");
 299.497 -    ucx_map_cstr_put(map1, "property.key3", "some value 3");
 299.498 -    ucx_map_cstr_put(map1, "property.key4", "some value 4");
 299.499 -    
 299.500 -    UCX_TEST_BEGIN
 299.501 -    
 299.502 -    FILE *f = tmpfile();
 299.503 -    fprintf(f, "#\n# test property file\n#\n#\n");
 299.504 -    ucx_properties_store(map1, f);
 299.505 -    
 299.506 -    fflush(f);
 299.507 -    fseek(f, 0, SEEK_SET);
 299.508 -    UcxMap *map2 = ucx_map_new(16);
 299.509 -    ucx_properties_load(map2, f);
 299.510 -    
 299.511 -    UCX_TEST_ASSERT(map2->count == 8, "wrong number of properties in map2");
 299.512 -    
 299.513 -    char *v1 = (char*)ucx_map_cstr_get(map2, "key1");
 299.514 -    char *v2 = (char*)ucx_map_cstr_get(map2, "key2");
 299.515 -    char *v3 = (char*)ucx_map_cstr_get(map2, "key3");
 299.516 -    char *v4 = (char*)ucx_map_cstr_get(map2, "key4");
 299.517 -    char *v5 = (char*)ucx_map_cstr_get(map2, "property.key1");
 299.518 -    char *v6 = (char*)ucx_map_cstr_get(map2, "property.key2");
 299.519 -    char *v7 = (char*)ucx_map_cstr_get(map2, "property.key3");
 299.520 -    char *v8 = (char*)ucx_map_cstr_get(map2, "property.key4");
 299.521 -    
 299.522 -    UCX_TEST_ASSERT(v1 && v2 && v3 && v4 && v5 && v6 && v7 && v8,
 299.523 -            "missing values");
 299.524 -    
 299.525 -    UCX_TEST_ASSERT((!strcmp(v1, "value1")), "wrong value 1");
 299.526 -    UCX_TEST_ASSERT((!strcmp(v2, "value2")), "wrong value 2");
 299.527 -    UCX_TEST_ASSERT((!strcmp(v3, "value3")), "wrong value 3");
 299.528 -    UCX_TEST_ASSERT((!strcmp(v4, "value4")), "wrong value 4");
 299.529 -    UCX_TEST_ASSERT((!strcmp(v5, "some value 1")), "wrong value 5");
 299.530 -    UCX_TEST_ASSERT((!strcmp(v6, "some value 2")), "wrong value 6");
 299.531 -    UCX_TEST_ASSERT((!strcmp(v7, "some value 3")), "wrong value 7");
 299.532 -    UCX_TEST_ASSERT((!strcmp(v8, "some value 4")), "wrong value 8");
 299.533 -    
 299.534 -    free(v1);
 299.535 -    free(v2);
 299.536 -    free(v3);
 299.537 -    free(v4);
 299.538 -    free(v5);
 299.539 -    free(v6);
 299.540 -    free(v7);
 299.541 -    free(v8);
 299.542 -    ucx_map_free(map2);
 299.543 -    fclose(f);
 299.544 -    
 299.545 -    UCX_TEST_END
 299.546 -    
 299.547 -    ucx_map_free(map1);
 299.548 -}
   300.1 --- a/test/prop_tests.h	Mon Dec 30 09:54:10 2019 +0100
   300.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   300.3 @@ -1,53 +0,0 @@
   300.4 -/*
   300.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   300.6 - *
   300.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   300.8 - *
   300.9 - * Redistribution and use in source and binary forms, with or without
  300.10 - * modification, are permitted provided that the following conditions are met:
  300.11 - *
  300.12 - *   1. Redistributions of source code must retain the above copyright
  300.13 - *      notice, this list of conditions and the following disclaimer.
  300.14 - *
  300.15 - *   2. Redistributions in binary form must reproduce the above copyright
  300.16 - *      notice, this list of conditions and the following disclaimer in the
  300.17 - *      documentation and/or other materials provided with the distribution.
  300.18 - *
  300.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  300.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  300.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  300.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  300.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  300.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  300.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  300.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  300.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  300.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  300.29 - * POSSIBILITY OF SUCH DAMAGE.
  300.30 - */
  300.31 -
  300.32 -#ifndef PROP_TESTS_H
  300.33 -#define	PROP_TESTS_H
  300.34 -
  300.35 -#include <ucx/test.h>
  300.36 -#include <ucx/properties.h>
  300.37 -
  300.38 -#ifdef	__cplusplus
  300.39 -extern "C" {
  300.40 -#endif
  300.41 -
  300.42 -UCX_TEST(test_ucx_properties_new);
  300.43 -UCX_TEST(test_ucx_properties_next);
  300.44 -UCX_TEST(test_ucx_properties_next_multi);
  300.45 -UCX_TEST(test_ucx_properties_next_part);
  300.46 -UCX_TEST(test_ucx_properties_next_long);
  300.47 -UCX_TEST(test_ucx_properties2map);
  300.48 -UCX_TEST(test_ucx_properties_load);
  300.49 -UCX_TEST(test_ucx_properties_store);
  300.50 -
  300.51 -#ifdef	__cplusplus
  300.52 -}
  300.53 -#endif
  300.54 -
  300.55 -#endif	/* PROP_TESTS_H */
  300.56 -
   301.1 --- a/test/stack_tests.c	Mon Dec 30 09:54:10 2019 +0100
   301.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   301.3 @@ -1,209 +0,0 @@
   301.4 -/*
   301.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   301.6 - *
   301.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   301.8 - *
   301.9 - * Redistribution and use in source and binary forms, with or without
  301.10 - * modification, are permitted provided that the following conditions are met:
  301.11 - *
  301.12 - *   1. Redistributions of source code must retain the above copyright
  301.13 - *      notice, this list of conditions and the following disclaimer.
  301.14 - *
  301.15 - *   2. Redistributions in binary form must reproduce the above copyright
  301.16 - *      notice, this list of conditions and the following disclaimer in the
  301.17 - *      documentation and/or other materials provided with the distribution.
  301.18 - *
  301.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  301.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  301.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  301.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  301.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  301.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  301.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  301.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  301.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  301.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  301.29 - * POSSIBILITY OF SUCH DAMAGE.
  301.30 - */
  301.31 -
  301.32 -#include "stack_tests.h"
  301.33 -
  301.34 -#define test_ucx_stack_before \
  301.35 -    char space[99]; \
  301.36 -    UcxStack stack; \
  301.37 -    ucx_stack_init(&stack, space, 99) \
  301.38 -
  301.39 -UCX_TEST(test_ucx_stack_init) {
  301.40 -    
  301.41 -    test_ucx_stack_before;
  301.42 -    
  301.43 -    UCX_TEST_BEGIN
  301.44 -    
  301.45 -    UCX_TEST_ASSERT(
  301.46 -        stack.allocator.malloc == (ucx_allocator_malloc) ucx_stack_malloc &&
  301.47 -        stack.allocator.calloc == (ucx_allocator_calloc) ucx_stack_calloc &&
  301.48 -        stack.allocator.realloc == (ucx_allocator_realloc) ucx_stack_realloc &&
  301.49 -        stack.allocator.free == (ucx_allocator_free) ucx_stack_free &&
  301.50 -        stack.allocator.pool == &stack,
  301.51 -        "allocator not properly set");
  301.52 -    
  301.53 -    UCX_TEST_ASSERT(!stack.top && stack.space == space
  301.54 -        && stack.size == 99 - 99 % sizeof(void*),
  301.55 -        "struct fields not properly set");
  301.56 -    
  301.57 -    UCX_TEST_END
  301.58 -}
  301.59 -
  301.60 -UCX_TEST(test_ucx_stack_malloc) {
  301.61 -
  301.62 -    test_ucx_stack_before;
  301.63 -    
  301.64 -    const size_t metasize = sizeof(struct ucx_stack_metadata);
  301.65 -    
  301.66 -    
  301.67 -    char* first = (char*) ucx_stack_malloc(&stack, 30);
  301.68 -    char* second = (char*) ucx_stack_malloc(&stack, 30);
  301.69 -    char* full = (char*) ucx_stack_malloc(&stack, 30);
  301.70 -    
  301.71 -    memcpy(first,  "012345678901234567890123456789", 30);
  301.72 -    memcpy(second, "abcdefghijklmnopqrstuvwxyzABCD", 30);
  301.73 -    
  301.74 -    UCX_TEST_BEGIN
  301.75 -    
  301.76 -    UCX_TEST_ASSERT(!memcmp(space + metasize,
  301.77 -        "012345678901234567890123456789", 30), "first element corrupted");
  301.78 -    UCX_TEST_ASSERT(!memcmp(space + 32+2*metasize,
  301.79 -        "abcdefghijklmnopqrstuvwxyzABCD", 30), "first element corrupted");
  301.80 -    
  301.81 -    UCX_TEST_ASSERT(!full, "stack can be overflowed");
  301.82 -    UCX_TEST_ASSERT(stack.top == space + 32 + 2*metasize, "wrong top pointer");
  301.83 -
  301.84 -    if (3*metasize < 32) {
  301.85 -        UCX_TEST_ASSERT(ucx_stack_avail(&stack) == 32-3*metasize,
  301.86 -            "wrong remaining available memory");
  301.87 -    } else {
  301.88 -        UCX_TEST_ASSERT(ucx_stack_avail(&stack) == 0,
  301.89 -            "wrong remaining available memory");
  301.90 -    }
  301.91 -
  301.92 -    UCX_TEST_END
  301.93 -}
  301.94 -
  301.95 -UCX_TEST(test_ucx_stack_calloc) {
  301.96 -    
  301.97 -    test_ucx_stack_before;
  301.98 -
  301.99 -    char zeros[99];
 301.100 -    memset(zeros, 0, 99);
 301.101 -    memset(space, 32, 99);
 301.102 -    ucx_stack_calloc(&stack, 4, sizeof(int));
 301.103 -    
 301.104 -    UCX_TEST_BEGIN
 301.105 -    
 301.106 -    UCX_TEST_ASSERT(!memcmp(space+sizeof(struct ucx_stack_metadata),
 301.107 -        zeros, 4*sizeof(int)), "memory not nulled");
 301.108 -    UCX_TEST_ASSERT(!memcmp(space+sizeof(struct ucx_stack_metadata)
 301.109 -        +4*sizeof(int), "          ", 10), "too much memory nulled");
 301.110 -        
 301.111 -    UCX_TEST_END
 301.112 -}
 301.113 -
 301.114 -UCX_TEST(test_ucx_stack_free) {
 301.115 -    
 301.116 -    test_ucx_stack_before;
 301.117 -    
 301.118 -    void *fst = ucx_stack_malloc(&stack, 10);
 301.119 -    void *snd = ucx_stack_malloc(&stack, 10);
 301.120 -    void *thrd = ucx_stack_malloc(&stack, 10);
 301.121 -    
 301.122 -    UCX_TEST_BEGIN
 301.123 -    
 301.124 -    UCX_TEST_ASSERT(stack.top == thrd, "wrong stack");
 301.125 -    UCX_TEST_ASSERT(((struct ucx_stack_metadata*) thrd - 1)->prev == snd,
 301.126 -        "wrong thrd prev pointer before free");
 301.127 -    
 301.128 -    ucx_stack_free(&stack, snd);
 301.129 -    
 301.130 -    UCX_TEST_ASSERT(((struct ucx_stack_metadata*) thrd - 1)->prev == fst,
 301.131 -        "wrong thrd prev pointer after freeing snd");
 301.132 -    UCX_TEST_ASSERT(stack.top == thrd, "wrong top after freeing snd");
 301.133 -    
 301.134 -    ucx_stack_free(&stack, thrd);
 301.135 -
 301.136 -    UCX_TEST_ASSERT(stack.top == fst, "wrong top after freeing thrd");
 301.137 -    
 301.138 -    UCX_TEST_END
 301.139 -}
 301.140 -
 301.141 -UCX_TEST(test_ucx_stack_realloc) {
 301.142 -    
 301.143 -    test_ucx_stack_before;
 301.144 -    
 301.145 -    void *fst = ucx_stack_malloc(&stack, 14);
 301.146 -    void *snd = ucx_stack_malloc(&stack, 10);
 301.147 -    
 301.148 -    UCX_TEST_BEGIN
 301.149 -    
 301.150 -    void *nfst = ucx_stack_realloc(&stack, fst, 16);
 301.151 -    UCX_TEST_ASSERT(nfst == fst, "unnecessary move on reallocation");
 301.152 -    UCX_TEST_ASSERT(((struct ucx_stack_metadata*)fst - 1)->size == 16,
 301.153 -        "wrong size after reallocation");
 301.154 -    
 301.155 -    void *nsnd = ucx_stack_realloc(&stack, snd, 30);
 301.156 -    UCX_TEST_ASSERT(nsnd == snd, "unnecessary move on top reallocation");
 301.157 -    UCX_TEST_ASSERT(ucx_stack_topsize(&stack) == 30,
 301.158 -        "wrong size after top reallocation");
 301.159 -    
 301.160 -    nsnd = ucx_stack_realloc(&stack, snd, 5);
 301.161 -    UCX_TEST_ASSERT(nsnd == snd, "unnecessary move on top shrink");
 301.162 -    UCX_TEST_ASSERT(ucx_stack_topsize(&stack) == 5,
 301.163 -        "wrong size after top shrink");
 301.164 -    UCX_TEST_ASSERT(ucx_stack_avail(&stack) ==
 301.165 -        72-3*sizeof(struct ucx_stack_metadata), "wrong size after top shrink");
 301.166 -    
 301.167 -    nfst = ucx_stack_realloc(&stack, fst, 24);
 301.168 -    UCX_TEST_ASSERT(nfst != fst, "missing move on huge reallocation");
 301.169 -    UCX_TEST_ASSERT(stack.top == nfst, "wrong top after huge reallocation");
 301.170 -    UCX_TEST_ASSERT(ucx_stack_topsize(&stack) == 24,
 301.171 -        "wrong size after huge reallocation");
 301.172 -    UCX_TEST_ASSERT(!((struct ucx_stack_metadata*)snd - 1)->prev,
 301.173 -        "element not freed after huge reallocation");
 301.174 -    
 301.175 -    UCX_TEST_END
 301.176 -}
 301.177 -
 301.178 -UCX_TEST(test_ucx_stack_pop) {
 301.179 -    
 301.180 -    test_ucx_stack_before;
 301.181 -    memset(space, 32, 99);
 301.182 -    
 301.183 -    void *fst = ucx_stack_malloc(&stack, 10);
 301.184 -    void *snd = ucx_stack_malloc(&stack, 10);
 301.185 -    ucx_stack_malloc(&stack, 10);
 301.186 -    
 301.187 -    char buf[16];
 301.188 -    
 301.189 -    UCX_TEST_BEGIN
 301.190 -    
 301.191 -    memset(buf, '0', 16);
 301.192 -    ucx_stack_pop(&stack, buf);
 301.193 -    UCX_TEST_ASSERT(memcmp(buf, "          000000", 16) == 0,
 301.194 -        "popped wrong content");
 301.195 -    UCX_TEST_ASSERT(stack.top == snd, "wrong top after pop");
 301.196 -    
 301.197 -    memset(buf, '0', 16);
 301.198 -    ucx_stack_popn(&stack, buf, 5);
 301.199 -    UCX_TEST_ASSERT(memcmp(buf, "     00000000000", 16) == 0,
 301.200 -        "n-popped wrong content");
 301.201 -    UCX_TEST_ASSERT(stack.top == fst, "wrong top after pop");
 301.202 -    
 301.203 -    ucx_stack_pop(&stack, buf);
 301.204 -    UCX_TEST_ASSERT(!stack.top, "top not NULL after last pop");
 301.205 -    
 301.206 -    memset(buf, '0', 16);
 301.207 -    ucx_stack_pop(&stack, buf);
 301.208 -    UCX_TEST_ASSERT(memcmp(buf, "0000000000000000", 16) == 0,
 301.209 -        "content not unchanged after empty pop");
 301.210 -    
 301.211 -    UCX_TEST_END
 301.212 -}
   302.1 --- a/test/stack_tests.h	Mon Dec 30 09:54:10 2019 +0100
   302.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   302.3 @@ -1,51 +0,0 @@
   302.4 -/*
   302.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   302.6 - *
   302.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   302.8 - *
   302.9 - * Redistribution and use in source and binary forms, with or without
  302.10 - * modification, are permitted provided that the following conditions are met:
  302.11 - *
  302.12 - *   1. Redistributions of source code must retain the above copyright
  302.13 - *      notice, this list of conditions and the following disclaimer.
  302.14 - *
  302.15 - *   2. Redistributions in binary form must reproduce the above copyright
  302.16 - *      notice, this list of conditions and the following disclaimer in the
  302.17 - *      documentation and/or other materials provided with the distribution.
  302.18 - *
  302.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  302.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  302.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  302.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  302.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  302.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  302.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  302.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  302.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  302.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  302.29 - * POSSIBILITY OF SUCH DAMAGE.
  302.30 - */
  302.31 -
  302.32 -#ifndef STACK_TESTS_H
  302.33 -#define	STACK_TESTS_H
  302.34 -
  302.35 -#include <ucx/test.h>
  302.36 -#include <ucx/stack.h>
  302.37 -
  302.38 -#ifdef	__cplusplus
  302.39 -extern "C" {
  302.40 -#endif
  302.41 -
  302.42 -UCX_TEST(test_ucx_stack_init);
  302.43 -UCX_TEST(test_ucx_stack_malloc);
  302.44 -UCX_TEST(test_ucx_stack_calloc);
  302.45 -UCX_TEST(test_ucx_stack_free);
  302.46 -UCX_TEST(test_ucx_stack_realloc);
  302.47 -UCX_TEST(test_ucx_stack_pop);
  302.48 -
  302.49 -#ifdef	__cplusplus
  302.50 -}
  302.51 -#endif
  302.52 -
  302.53 -#endif	/* STACK_TESTS_H */
  302.54 -
   303.1 --- a/test/string_tests.c	Mon Dec 30 09:54:10 2019 +0100
   303.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   303.3 @@ -1,589 +0,0 @@
   303.4 -/*
   303.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   303.6 - *
   303.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   303.8 - *
   303.9 - * Redistribution and use in source and binary forms, with or without
  303.10 - * modification, are permitted provided that the following conditions are met:
  303.11 - *
  303.12 - *   1. Redistributions of source code must retain the above copyright
  303.13 - *      notice, this list of conditions and the following disclaimer.
  303.14 - *
  303.15 - *   2. Redistributions in binary form must reproduce the above copyright
  303.16 - *      notice, this list of conditions and the following disclaimer in the
  303.17 - *      documentation and/or other materials provided with the distribution.
  303.18 - *
  303.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  303.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  303.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  303.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  303.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  303.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  303.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  303.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  303.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  303.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  303.29 - * POSSIBILITY OF SUCH DAMAGE.
  303.30 - */
  303.31 -
  303.32 -#include "string_tests.h"
  303.33 -
  303.34 -UCX_TEST(test_sstr_macros) {
  303.35 -    sstr_t hello = ST("Hello");
  303.36 -    sstr_t world = S("World");
  303.37 -    
  303.38 -    char buf[20];
  303.39 -    snprintf(buf, sizeof(buf), "%" PRIsstr ", %" PRIsstr "!", SFMT(hello), SFMT(world));
  303.40 -    
  303.41 -    UCX_TEST_BEGIN
  303.42 -    const char* cmp = "Hello, World!";
  303.43 -    UCX_TEST_ASSERT(!strcmp(cmp, buf), "Something weird happened.");
  303.44 -    UCX_TEST_END
  303.45 -}
  303.46 -
  303.47 -UCX_TEST(test_sstr) {
  303.48 -    sstr_t s1 = sstr((char*)"1234");
  303.49 -    sstr_t s2 = sstrn((char*)"ab", 2);
  303.50 -     
  303.51 -    UCX_TEST_BEGIN
  303.52 -    
  303.53 -    UCX_TEST_ASSERT(s1.length == 4, "s1 length must be 4");
  303.54 -    UCX_TEST_ASSERT(s2.length == 2, "s2 length must be 2");
  303.55 -    
  303.56 -    UCX_TEST_END
  303.57 -}
  303.58 -
  303.59 -UCX_TEST(test_sstr_len) {
  303.60 -    sstr_t s1 = ST("1234");
  303.61 -    sstr_t s2 = ST(".:.:.");
  303.62 -    sstr_t s3 = ST("X");
  303.63 -    
  303.64 -    size_t len1 = sstrnlen(1, s1);
  303.65 -    size_t len2 = sstrnlen(2, s1, s2);
  303.66 -    size_t len3 = sstrnlen(3, s1, s2, s3);
  303.67 -    
  303.68 -    UCX_TEST_BEGIN
  303.69 -    
  303.70 -    UCX_TEST_ASSERT(len1 == 4, "sstrnlen returned wrong size");
  303.71 -    UCX_TEST_ASSERT(len2 == 9, "sstrnlen returned wrong size");
  303.72 -    UCX_TEST_ASSERT(len3 == 10, "sstrnlen returned wrong size");
  303.73 -
  303.74 -    UCX_TEST_END
  303.75 -}
  303.76 -
  303.77 -
  303.78 -UCX_TEST(test_sstrchr_sstrrchr) {
  303.79 -    sstr_t str = ST("I will find you - and I will kill you");
  303.80 -    UCX_TEST_BEGIN
  303.81 -    
  303.82 -    sstr_t notfound = sstrchr(str, 'x');
  303.83 -    UCX_TEST_ASSERT(notfound.length == 0,
  303.84 -            "string length not 0 after forward search w/o result");
  303.85 -    
  303.86 -    notfound = sstrrchr(str, 'x');
  303.87 -    UCX_TEST_ASSERT(notfound.length == 0,
  303.88 -            "string length not 0 after reverse search w/o result");
  303.89 -    
  303.90 -    sstr_t result = sstrchr(str, 'w');
  303.91 -    UCX_TEST_ASSERT(result.length == 35, "sstrchr returned wrong length");
  303.92 -    UCX_TEST_ASSERT(strcmp("will find you - and I will kill you", result.ptr)
  303.93 -        == 0, "sstrchr did not return the expected string");
  303.94 -    
  303.95 -    result = sstrrchr(str, 'w');
  303.96 -    UCX_TEST_ASSERT(result.length == 13, "sstrrchr returned wrong length");
  303.97 -    UCX_TEST_ASSERT(strcmp("will kill you", result.ptr)
  303.98 -        == 0, "sstrrchr did not return the expected string");
  303.99 -    
 303.100 -    UCX_TEST_END
 303.101 -}
 303.102 -
 303.103 -UCX_TEST(test_sstrstr) {
 303.104 -    sstr_t str = ST("find the match in this string");
 303.105 -    sstr_t longstr = ST(
 303.106 -            "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl"
 303.107 -            "mnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwx"
 303.108 -            "yzabcdeababababnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghij"
 303.109 -            "klmnopqrstuvwxyzaababababababababrstuvwxyzabcdefghijklmnopqrstuv"
 303.110 -            "abababababababababababababababababababababababababababababababab"
 303.111 -            "abababababababababababababababababababababababababababababababab"
 303.112 -            "abababababababababababababababababababababababababababababababab"
 303.113 -            "abababababababababababababababababababababababababababababababab"
 303.114 -            "abababababababababababababababababababababababababababababababab"
 303.115 -            "abababababababababababababababababababababababababababababababab"
 303.116 -            "wxyz1234567890");
 303.117 -    sstr_t longstrpattern = ST(
 303.118 -            "abababababababababababababababababababababababababababababababab"
 303.119 -            "abababababababababababababababababababababababababababababababab"
 303.120 -            "abababababababababababababababababababababababababababababababab"
 303.121 -            "abababababababababababababababababababababababababababababababab"
 303.122 -            "abababababababababababababababababababababababababababababababab"
 303.123 -            );
 303.124 -    sstr_t longstrresult = ST(
 303.125 -            "abababababababababababababababababababababababababababababababab"
 303.126 -            "abababababababababababababababababababababababababababababababab"
 303.127 -            "abababababababababababababababababababababababababababababababab"
 303.128 -            "abababababababababababababababababababababababababababababababab"
 303.129 -            "abababababababababababababababababababababababababababababababab"
 303.130 -            "abababababababababababababababababababababababababababababababab"
 303.131 -            "wxyz1234567890"
 303.132 -            );
 303.133 -    UCX_TEST_BEGIN
 303.134 -    
 303.135 -    sstr_t notfound = sstrstr(str, S("no match"));
 303.136 -    UCX_TEST_ASSERT(notfound.length == 0, "no match must return empty string");
 303.137 -    
 303.138 -    sstr_t result = sstrstr(str, S("match"));
 303.139 -    UCX_TEST_ASSERT(result.length == 20, "sstrstr returned wrong length");
 303.140 -    UCX_TEST_ASSERT(!strcmp("match in this string", result.ptr),
 303.141 -        "sstrstr did not return the expected string");
 303.142 -    
 303.143 -    result = sstrstr(str, S(""));
 303.144 -    UCX_TEST_ASSERT(result.length == str.length,
 303.145 -        "sstrstr with empty match string returned wrong length");
 303.146 -    UCX_TEST_ASSERT(!strcmp(str.ptr, result.ptr),
 303.147 -        "sstrstr with empty match string did not return the original string");
 303.148 -    
 303.149 -    result = sstrstr(longstr, longstrpattern);
 303.150 -    UCX_TEST_ASSERT(result.length == longstrresult.length,
 303.151 -            "long string result length incorrect");
 303.152 -    UCX_TEST_ASSERT(!strcmp(result.ptr, longstrresult.ptr),
 303.153 -            "long string result content incorrect");
 303.154 -    
 303.155 -    UCX_TEST_END
 303.156 -}
 303.157 -
 303.158 -UCX_TEST(test_sstrcmp) {
 303.159 -    sstr_t str = ST("compare this");
 303.160 -    
 303.161 -    UCX_TEST_BEGIN
 303.162 -    UCX_TEST_ASSERT(sstrcmp(str, S("")) == 1, "empty cmp failed");
 303.163 -    UCX_TEST_ASSERT(sstrcmp(S(""), S("")) == 0, "empty cmp false negative");
 303.164 -    UCX_TEST_ASSERT(sstrcmp(str, S("compare this")) == 0, "false negative");
 303.165 -    UCX_TEST_ASSERT(sstrcmp(str, S("Compare This")) != 0, "false positive");
 303.166 -    UCX_TEST_ASSERT(sstrcmp(str, S("compare tool")) < 0, "memcmp < 0 failed");
 303.167 -    UCX_TEST_ASSERT(sstrcmp(str, S("compare shit")) > 0, "memcmp > 0 failed");
 303.168 -    UCX_TEST_ASSERT(sstrcmp(str, S("compare this not")) < 0, "len < 0 failed");
 303.169 -    UCX_TEST_ASSERT(sstrcmp(str, S("compare")) > 0, "len > 0 failed");
 303.170 -    UCX_TEST_END
 303.171 -}
 303.172 -
 303.173 -UCX_TEST(test_sstrcasecmp) {
 303.174 -    
 303.175 -    sstr_t str = ST("compare this");
 303.176 -    
 303.177 -    UCX_TEST_BEGIN
 303.178 -    UCX_TEST_ASSERT(sstrcasecmp(str, S("")) == 1, "empty cmp failed");
 303.179 -    UCX_TEST_ASSERT(sstrcasecmp(S(""), S("")) == 0, "empty cmp false negative");
 303.180 -    UCX_TEST_ASSERT(sstrcasecmp(str, S("compare this")) == 0, "false negative");
 303.181 -    UCX_TEST_ASSERT(sstrcasecmp(str, S("Compare This")) == 0,
 303.182 -        "not ignoring case");
 303.183 -    UCX_TEST_ASSERT(sstrcasecmp(str, S("compare tool")) < 0, "< 0 failed");
 303.184 -    UCX_TEST_ASSERT(sstrcasecmp(str, S("compare shit")) > 0, "> 0 failed");
 303.185 -    UCX_TEST_ASSERT(sstrcasecmp(str, S("compare this not")) < 0,
 303.186 -        "len < 0 failed");
 303.187 -    UCX_TEST_ASSERT(sstrcasecmp(str, S("compare")) > 0, "len > 0 failed");
 303.188 -    UCX_TEST_END
 303.189 -}
 303.190 -
 303.191 -
 303.192 -UCX_TEST(test_sstrcat) {
 303.193 -    sstr_t s1 = S("12");
 303.194 -    sstr_t s2 = S("34");
 303.195 -    sstr_t s3 = S("56");
 303.196 -    sstr_t sn = { NULL, 0 };
 303.197 -    
 303.198 -    UCX_TEST_BEGIN
 303.199 -    
 303.200 -    sstr_t t1 = sstrcat(2, s1, s2);
 303.201 -    UCX_TEST_ASSERT(!sstrcmp(t1, S("1234")), "t1: wrong content");
 303.202 -    free(t1.ptr);
 303.203 -    
 303.204 -    sstr_t t2 = sstrcat(3, s1, s2, s3);
 303.205 -    UCX_TEST_ASSERT(!sstrcmp(t2, S("123456")), "t2: wrong content");
 303.206 -    free(t2.ptr);
 303.207 -    
 303.208 -    sstr_t t3 = sstrcat(6, s1, sn, s2, sn, s3, sn);
 303.209 -    UCX_TEST_ASSERT(!sstrcmp(t3, S("123456")), "t3: wrong content");
 303.210 -    free(t3.ptr);
 303.211 -    
 303.212 -    sstr_t t4 = sstrcat(2, sn, sn);
 303.213 -    UCX_TEST_ASSERT(t4.ptr, "t4.ptr is NULL");
 303.214 -    UCX_TEST_ASSERT(t4.length == 0, "t4 has wrong length");
 303.215 -    free(t4.ptr);
 303.216 -    
 303.217 -    // overflow test
 303.218 -    sstr_t o0;
 303.219 -    o0.ptr = "";
 303.220 -    o0.length = ((size_t)-1) - 50;
 303.221 -    sstr_t o1;
 303.222 -    o1.ptr = "";
 303.223 -    o1.length = 100;
 303.224 -    sstr_t o2;
 303.225 -    o2.ptr = "";
 303.226 -    o2.length = 10;
 303.227 -    
 303.228 -    sstr_t n = sstrcat(2, o0, o1);
 303.229 -    UCX_TEST_ASSERT(n.ptr == NULL && n.length == 0, "overflow not detected");
 303.230 -    sstr_t n2 = sstrcat(3, o0, o2, o1);
 303.231 -    UCX_TEST_ASSERT(n2.ptr == NULL && n2.length == 0, "n2: overflow not detected");
 303.232 -            
 303.233 -    UCX_TEST_END
 303.234 -    
 303.235 -}
 303.236 -
 303.237 -UCX_TEST(test_sstrsplit) {
 303.238 -
 303.239 -    const char *original = "this,is,a,csv,string";
 303.240 -    sstr_t test = ST("this,is,a,csv,string"); /* use copy of original here */
 303.241 -    ssize_t n;
 303.242 -    sstr_t *list;
 303.243 -
 303.244 -    UCX_TEST_BEGIN
 303.245 -
 303.246 -    /* Nullpointer check */
 303.247 -    n = 0;
 303.248 -    UCX_TEST_ASSERT(sstrsplit(test, S(""), &n) == NULL,
 303.249 -            "empty delimiter must return NULL");
 303.250 -
 303.251 -    /* no delimiter occurence (ndo) */
 303.252 -    n = 0;
 303.253 -    list = sstrsplit(test, S("z"), &n);
 303.254 -    UCX_TEST_ASSERT(n == 1, "ndo, list length must be 1");
 303.255 -    UCX_TEST_ASSERT(strcmp(list[0].ptr, original) == 0, "ndo, "
 303.256 -            "original string shall be returned as single list element");
 303.257 -    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
 303.258 -                "ndo, original has been modified");
 303.259 -    for(int i=0;i<n;i++) {
 303.260 -        free(list[i].ptr);
 303.261 -    }
 303.262 -    free(list);
 303.263 -
 303.264 -    /* partially matching delimiter (pmd) */
 303.265 -    n = 0;
 303.266 -    list = sstrsplit(test, S("stringbuilder"), &n);
 303.267 -    UCX_TEST_ASSERT(n == 1, "pmd, list length must be 1");
 303.268 -    UCX_TEST_ASSERT(strcmp(list[0].ptr, original) == 0, "pmd, "
 303.269 -            "original string shall be returned as single list element");
 303.270 -    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
 303.271 -                "pmd, original has been modified");
 303.272 -    for(int i=0;i<n;i++) {
 303.273 -        free(list[i].ptr);
 303.274 -    }
 303.275 -    free(list);
 303.276 -
 303.277 -    /* matching single-char delimiter (mscd) */
 303.278 -    n = 0;
 303.279 -    list = sstrsplit(test, S(","), &n);
 303.280 -    UCX_TEST_ASSERT(n == 5, "mscd, list length must be 5");
 303.281 -    UCX_TEST_ASSERT(strcmp(list[0].ptr, "this") == 0, "mscd, item 0 mismatch");
 303.282 -    UCX_TEST_ASSERT(strcmp(list[1].ptr, "is") == 0, "mscd, item 1 mismatch");
 303.283 -    UCX_TEST_ASSERT(strcmp(list[2].ptr, "a") == 0, "mscd, item 2 mismatch");
 303.284 -    UCX_TEST_ASSERT(strcmp(list[3].ptr, "csv") == 0, "mscd, item 3 mismatch");
 303.285 -    UCX_TEST_ASSERT(strcmp(list[4].ptr, "string")==0, "mscd, item 4 mismatch");
 303.286 -    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
 303.287 -            "mscd, original has been modified");
 303.288 -    for(int i=0;i<n;i++) {
 303.289 -        free(list[i].ptr);
 303.290 -    }
 303.291 -    free(list);
 303.292 -
 303.293 -    /* matching multi-char delimiter (mmcd) */
 303.294 -    n = 0;
 303.295 -    list = sstrsplit(test, S("is"), &n);
 303.296 -    UCX_TEST_ASSERT(n == 3, "mscd, list length must be 3");
 303.297 -    UCX_TEST_ASSERT(strcmp(list[0].ptr, "th") == 0, "mmcd, item 0 mismatch");
 303.298 -    UCX_TEST_ASSERT(strcmp(list[1].ptr, ",") == 0, "mmcd, item 1 mismatch");
 303.299 -    UCX_TEST_ASSERT(strcmp(list[2].ptr, ",a,csv,string") == 0,
 303.300 -            "mmcd, item 2 mismatch");
 303.301 -    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
 303.302 -            "mmcd, original has been modified");
 303.303 -    for(int i=0;i<n;i++) {
 303.304 -        free(list[i].ptr);
 303.305 -    }
 303.306 -    free(list);
 303.307 -
 303.308 -    /* bounded list using single-char delimiter (blsc) */
 303.309 -    n = 3;
 303.310 -    list = sstrsplit(test, S(","), &n);
 303.311 -    UCX_TEST_ASSERT(n == 3, "blsc, list length must be 3");
 303.312 -    UCX_TEST_ASSERT(strcmp(list[0].ptr, "this") == 0, "blsc, item 0 mismatch");
 303.313 -    UCX_TEST_ASSERT(strcmp(list[1].ptr, "is") == 0, "blsc, item 1 mismatch");
 303.314 -    UCX_TEST_ASSERT(strcmp(list[2].ptr, "a,csv,string") == 0,
 303.315 -            "blsc, item 2 mismatch");
 303.316 -    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
 303.317 -            "blsc, original has been modified");
 303.318 -    for(int i=0;i<n;i++) {
 303.319 -        free(list[i].ptr);
 303.320 -    }
 303.321 -    free(list);
 303.322 -
 303.323 -    /* bounded list using multi-char delimiter (blmc) */
 303.324 -    n = 2;
 303.325 -    list = sstrsplit(test, S("is"), &n);
 303.326 -    UCX_TEST_ASSERT(n == 2, "blmc, list length must be 2");
 303.327 -    UCX_TEST_ASSERT(strcmp(list[0].ptr, "th") == 0, "blmc, item 0 mismatch");
 303.328 -    UCX_TEST_ASSERT(strcmp(list[1].ptr, ",is,a,csv,string") == 0,
 303.329 -            "blmc, item 1 mismatch");
 303.330 -    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
 303.331 -            "blmc, original has been modified");
 303.332 -    for(int i=0;i<n;i++) {
 303.333 -        free(list[i].ptr);
 303.334 -    }
 303.335 -    free(list);
 303.336 -
 303.337 -    /* start with delimiter (swd) */
 303.338 -    n = 0;
 303.339 -    list = sstrsplit(test, S("this"), &n);
 303.340 -    UCX_TEST_ASSERT(n == 2, "swd, list length must be 2");
 303.341 -    UCX_TEST_ASSERT(list[0].length == 0, "swd, first item must be empty");
 303.342 -    UCX_TEST_ASSERT(strcmp(list[1].ptr, ",is,a,csv,string") == 0,
 303.343 -            "swd, second item corrupt");
 303.344 -    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
 303.345 -            "swd, original has been modified");
 303.346 -    for(int i=0;i<n;i++) {
 303.347 -        free(list[i].ptr);
 303.348 -    }
 303.349 -    free(list);
 303.350 -
 303.351 -    /* end with delimiter (ewd) */
 303.352 -    n = 0;
 303.353 -    list = sstrsplit(test, S("string"), &n);
 303.354 -    UCX_TEST_ASSERT(n == 2, "ewd, list length must be 2");
 303.355 -    UCX_TEST_ASSERT(strcmp(list[0].ptr, "this,is,a,csv,") == 0,
 303.356 -            "ewd, first item corrupt");
 303.357 -    UCX_TEST_ASSERT(list[1].length == 0, "ewd, second item must be empty");
 303.358 -    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
 303.359 -            "ewd, original has been modified");
 303.360 -    for(int i=0;i<n;i++) {
 303.361 -        free(list[i].ptr);
 303.362 -    }
 303.363 -    free(list);
 303.364 -    
 303.365 -    /* end with delimiter exceed bound (ewdeb) */
 303.366 -    n = 3;
 303.367 -    sstr_t ewdebtest = ST("a,b,c,");
 303.368 -    list = sstrsplit(ewdebtest, S(","), &n);
 303.369 -    UCX_TEST_ASSERT(n == 3, "ewdeb, list length must be 3");
 303.370 -    UCX_TEST_ASSERT(strcmp(list[0].ptr, "a") == 0, "ewdeb, fst item corrupt");
 303.371 -    UCX_TEST_ASSERT(strcmp(list[1].ptr, "b") == 0, "ewdeb, snd item corrupt");
 303.372 -    UCX_TEST_ASSERT(strcmp(list[2].ptr, "c,") == 0, "ewdeb, trd item corrupt");
 303.373 -    for(int i=0;i<n;i++) {
 303.374 -        free(list[i].ptr);
 303.375 -    }
 303.376 -    free(list);
 303.377 -
 303.378 -    /* exact match (exm) */
 303.379 -    n = 0;
 303.380 -    list = sstrsplit(test, S("this,is,a,csv,string"), &n);
 303.381 -    UCX_TEST_ASSERT(n == 0, "exm, list length must be 0");
 303.382 -    UCX_TEST_ASSERT(list == NULL, "exm, list must be NULL");
 303.383 -    for(int i=0;i<n;i++) {
 303.384 -        free(list[i].ptr);
 303.385 -    }
 303.386 -    free(list);
 303.387 -
 303.388 -    /* substring (subs) */
 303.389 -    n = 0;
 303.390 -    list = sstrsplit(test, S("this,is,a,csv,string,with,extension"), &n);
 303.391 -    UCX_TEST_ASSERT(n == 1, "subs, list length must be 1");
 303.392 -    UCX_TEST_ASSERT(strcmp(list[0].ptr, original) == 0,
 303.393 -            "subs, single item must be the original string");
 303.394 -    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
 303.395 -            "subs, original has been modified");
 303.396 -    for(int i=0;i<n;i++) {
 303.397 -        free(list[i].ptr);
 303.398 -    }
 303.399 -    free(list);
 303.400 -    
 303.401 -    /* double encounter delimiter (ded) */
 303.402 -    n = 0;
 303.403 -    list = sstrsplit(test, S("is,"), &n);
 303.404 -    UCX_TEST_ASSERT(n == 3, "ded, list length must be 3");
 303.405 -    UCX_TEST_ASSERT(strcmp(list[0].ptr, "th") == 0, "ded, item 0 mismatch");
 303.406 -    UCX_TEST_ASSERT(list[1].length == 0, "ded, item 1 not empty!");
 303.407 -    UCX_TEST_ASSERT(strcmp(list[2].ptr, "a,csv,string") == 0,
 303.408 -        "ded, item 2 mismatch");
 303.409 -    for(int i=0;i<n;i++) {
 303.410 -        free(list[i].ptr);
 303.411 -    }
 303.412 -    free(list);
 303.413 -
 303.414 -    UCX_TEST_END
 303.415 -}
 303.416 -
 303.417 -UCX_TEST(test_sstrtrim) {
 303.418 -    sstr_t t1 = sstrtrim(sstr((char*)"  ein test   "));
 303.419 -    sstr_t t2 = sstrtrim(sstr((char*)"abc"));
 303.420 -    sstr_t t3 = sstrtrim(sstr((char*)" 123"));
 303.421 -    sstr_t t4 = sstrtrim(sstr((char*)"xyz "));
 303.422 -    sstr_t t5 = sstrtrim(sstr((char*)"   "));
 303.423 -    sstr_t empty = sstrtrim(sstr((char*)""));
 303.424 -    UCX_TEST_BEGIN
 303.425 -    UCX_TEST_ASSERT(strncmp(t1.ptr, "ein test", t1.length) == 0, "failed");
 303.426 -    UCX_TEST_ASSERT(strncmp(t2.ptr, "abc", t2.length) == 0, "failed");
 303.427 -    UCX_TEST_ASSERT(strncmp(t3.ptr, "123", t3.length) == 0, "failed");
 303.428 -    UCX_TEST_ASSERT(strncmp(t4.ptr, "xyz", t4.length) == 0, "failed");
 303.429 -    UCX_TEST_ASSERT(t5.length == 0, "string t5 not empty");
 303.430 -    UCX_TEST_ASSERT(empty.length == 0, "empty string failed");
 303.431 -    UCX_TEST_END
 303.432 -}
 303.433 -
 303.434 -UCX_TEST(test_sstrprefixsuffix) {
 303.435 -    sstr_t str = ST("test my prefix and my suffix");
 303.436 -    sstr_t empty = ST("");
 303.437 -    
 303.438 -    UCX_TEST_BEGIN
 303.439 -    
 303.440 -    UCX_TEST_ASSERT(!sstrprefix(empty, S("pref")), "prefix empty string fails");
 303.441 -    UCX_TEST_ASSERT(!sstrsuffix(empty, S("suf")), "suffix empty string fails");
 303.442 -    
 303.443 -    UCX_TEST_ASSERT(sstrprefix(str, empty), "empty prefix fails");
 303.444 -    UCX_TEST_ASSERT(sstrsuffix(str, empty), "empty suffix fails");
 303.445 -    
 303.446 -    UCX_TEST_ASSERT(sstrprefix(empty, empty), "string and prefix empty fails");
 303.447 -    UCX_TEST_ASSERT(sstrsuffix(empty, empty), "string and suffix empty fails");
 303.448 -    
 303.449 -    UCX_TEST_ASSERT(sstrprefix(str, S("test ")), "prefix false negative");
 303.450 -    UCX_TEST_ASSERT(!sstrprefix(str, S("8-) fsck ")), "prefix false positive");
 303.451 -    
 303.452 -    UCX_TEST_ASSERT(sstrsuffix(str, S("fix")), "suffix false negative");
 303.453 -    UCX_TEST_ASSERT(!sstrsuffix(str, S("fox")), "suffix false positive");
 303.454 -
 303.455 -    
 303.456 -    UCX_TEST_END
 303.457 -}
 303.458 -
 303.459 -UCX_TEST(test_sstrcaseprefixsuffix) {
 303.460 -    sstr_t str = ST("test my prefix and my suffix");
 303.461 -    sstr_t empty = ST("");
 303.462 -    
 303.463 -    UCX_TEST_BEGIN
 303.464 -    
 303.465 -    UCX_TEST_ASSERT(!sstrcaseprefix(empty, S("pREf")), "prefix empty string fails");
 303.466 -    UCX_TEST_ASSERT(!sstrcasesuffix(empty, S("sUf")), "suffix empty string fails");
 303.467 -    
 303.468 -    UCX_TEST_ASSERT(sstrcaseprefix(str, empty), "empty prefix fails");
 303.469 -    UCX_TEST_ASSERT(sstrcasesuffix(str, empty), "empty suffix fails");
 303.470 -    
 303.471 -    UCX_TEST_ASSERT(sstrcaseprefix(empty, empty), "string and prefix empty fails");
 303.472 -    UCX_TEST_ASSERT(sstrcasesuffix(empty, empty), "string and suffix empty fails");
 303.473 -    
 303.474 -    UCX_TEST_ASSERT(sstrcaseprefix(str, S("TEST ")), "prefix false negative");
 303.475 -    UCX_TEST_ASSERT(!sstrcaseprefix(str, S("8-) fsck ")), "prefix false positive");
 303.476 -    
 303.477 -    UCX_TEST_ASSERT(sstrcasesuffix(str, S("FIX")), "suffix false negative");
 303.478 -    UCX_TEST_ASSERT(!sstrcasesuffix(str, S("fox")), "suffix false positive");
 303.479 -    
 303.480 -    UCX_TEST_END
 303.481 -}
 303.482 -
 303.483 -UCX_TEST(test_sstrreplace) {
 303.484 -
 303.485 -    sstr_t str = ST("test ababab string aba");
 303.486 -    sstr_t longstr = ST("xyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacd");
 303.487 -    sstr_t notrail = ST("test abab");
 303.488 -    sstr_t empty = ST("");
 303.489 -    sstr_t astr = ST("aaaaaaaaaa");
 303.490 -    sstr_t csstr = ST("test AB ab TEST xyz");
 303.491 -
 303.492 -    sstr_t repl = sstrreplace(str, SC("abab"), SC("muchlonger"));
 303.493 -    sstr_t expected = ST("test muchlongerab string aba");
 303.494 -
 303.495 -    sstr_t repln = sstrreplacen(str, SC("ab"), SC("c"), 2);
 303.496 -    sstr_t expectedn = ST("test ccab string aba");
 303.497 -
 303.498 -    sstr_t longrepl = sstrreplace(longstr, SC("a"), SC("z"));
 303.499 -    sstr_t longexpect = ST("xyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzcd");
 303.500 -
 303.501 -    sstr_t replnotrail = sstrreplace(notrail, SC("ab"), SC("z"));
 303.502 -    sstr_t notrailexpect = ST("test zz");
 303.503 -    
 303.504 -    sstr_t repleq = sstrreplace(str, str, SC("hello"));
 303.505 -    sstr_t eqexpect = ST("hello");
 303.506 -    
 303.507 -    sstr_t replempty1 = sstrreplace(empty, SC("ab"), SC("c")); // expect: empty
 303.508 -    sstr_t replempty2 = sstrreplace(str, SC("abab"), empty);
 303.509 -    sstr_t emptyexpect2 = ST("test ab string aba");
 303.510 -    
 303.511 -    sstr_t replpre = sstrreplace(str, SC("test "), SC("TEST "));
 303.512 -    sstr_t preexpected = ST("TEST ababab string aba");
 303.513 -    
 303.514 -    sstr_t replan1 = sstrreplacen(astr, SC("a"), SC("x"), 1);
 303.515 -    sstr_t an1expected = ST("xaaaaaaaaa");
 303.516 -    
 303.517 -    sstr_t replan4 = sstrreplacen(astr, SC("a"), SC("x"), 4);
 303.518 -    sstr_t an4expected = ST("xxxxaaaaaa");
 303.519 -    
 303.520 -    sstr_t replan9 = sstrreplacen(astr, SC("a"), SC("x"), 9);
 303.521 -    sstr_t an9expected = ST("xxxxxxxxxa");
 303.522 -    
 303.523 -    sstr_t replan10 = sstrreplacen(astr, SC("a"), SC("x"), 10);
 303.524 -    sstr_t an10expected = ST("xxxxxxxxxx");
 303.525 -    
 303.526 -    sstr_t replcs1 = sstrreplace(csstr, SC("AB"), SC("*"));
 303.527 -    sstr_t cs1expected = ST("test * ab TEST xyz");
 303.528 -    
 303.529 -    sstr_t replcs2 = sstrreplace(csstr, SC("test"), SC("TEST"));
 303.530 -    sstr_t cs2expected = ST("TEST AB ab TEST xyz");
 303.531 -    
 303.532 -    UCX_TEST_BEGIN
 303.533 -
 303.534 -    UCX_TEST_ASSERT(repl.ptr != str.ptr, "result string is not fresh");
 303.535 -    UCX_TEST_ASSERT(!sstrcmp(repl, expected), "incorrect replacement");
 303.536 -
 303.537 -    UCX_TEST_ASSERT(repln.ptr != str.ptr, "result string is not fresh");
 303.538 -    UCX_TEST_ASSERT(!sstrcmp(repln, expectedn), "incorrect replacement");
 303.539 -
 303.540 -    UCX_TEST_ASSERT(!sstrcmp(longrepl, longexpect),
 303.541 -            "incorrect handling of long strings");
 303.542 -
 303.543 -    UCX_TEST_ASSERT(!sstrcmp(replnotrail, notrailexpect),
 303.544 -            "no trail replacement fails");
 303.545 -    
 303.546 -    UCX_TEST_ASSERT(!sstrcmp(repleq, eqexpect),
 303.547 -            "equal replacement fails");
 303.548 -    
 303.549 -    UCX_TEST_ASSERT(!sstrcmp(replempty1, empty),
 303.550 -            "replacement in empty string fails");
 303.551 -    
 303.552 -    UCX_TEST_ASSERT(!sstrcmp(replempty2, emptyexpect2),
 303.553 -            "empty replacement fails");
 303.554 -    
 303.555 -    UCX_TEST_ASSERT(!sstrcmp(replpre, preexpected),
 303.556 -            "prefix replacement fails");
 303.557 -    
 303.558 -    UCX_TEST_ASSERT(!sstrcmp(replan1, an1expected),
 303.559 -            "a1 replacement fails");
 303.560 -    
 303.561 -    UCX_TEST_ASSERT(!sstrcmp(replan4, an4expected),
 303.562 -            "a4 replacement fails");
 303.563 -    
 303.564 -    UCX_TEST_ASSERT(!sstrcmp(replan9, an9expected),
 303.565 -            "a9 replacement fails");
 303.566 -    
 303.567 -    UCX_TEST_ASSERT(!sstrcmp(replan10, an10expected),
 303.568 -            "a10 replacement fails");
 303.569 -    
 303.570 -    UCX_TEST_ASSERT(!sstrcmp(replcs1, cs1expected),
 303.571 -            "case sensitivity test1 fails");
 303.572 -    
 303.573 -    UCX_TEST_ASSERT(!sstrcmp(replcs2, cs2expected),
 303.574 -            "case sensitivity test2 fails");
 303.575 -
 303.576 -    UCX_TEST_END
 303.577 -
 303.578 -    free(repl.ptr);
 303.579 -    free(repln.ptr);
 303.580 -    free(longrepl.ptr);
 303.581 -    free(replnotrail.ptr);
 303.582 -    free(repleq.ptr);
 303.583 -    if(replempty1.ptr) free(replempty1.ptr);
 303.584 -    free(replempty2.ptr);
 303.585 -    free(replpre.ptr);
 303.586 -    free(replan1.ptr);
 303.587 -    free(replan4.ptr);
 303.588 -    free(replan9.ptr);
 303.589 -    free(replan10.ptr);
 303.590 -    free(replcs1.ptr);
 303.591 -    free(replcs2.ptr);
 303.592 -}
   304.1 --- a/test/string_tests.h	Mon Dec 30 09:54:10 2019 +0100
   304.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   304.3 @@ -1,58 +0,0 @@
   304.4 -/*
   304.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   304.6 - *
   304.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   304.8 - *
   304.9 - * Redistribution and use in source and binary forms, with or without
  304.10 - * modification, are permitted provided that the following conditions are met:
  304.11 - *
  304.12 - *   1. Redistributions of source code must retain the above copyright
  304.13 - *      notice, this list of conditions and the following disclaimer.
  304.14 - *
  304.15 - *   2. Redistributions in binary form must reproduce the above copyright
  304.16 - *      notice, this list of conditions and the following disclaimer in the
  304.17 - *      documentation and/or other materials provided with the distribution.
  304.18 - *
  304.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  304.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  304.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  304.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  304.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  304.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  304.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  304.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  304.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  304.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  304.29 - * POSSIBILITY OF SUCH DAMAGE.
  304.30 - */
  304.31 -
  304.32 -#ifndef STRING_TESTS_H
  304.33 -#define	STRING_TESTS_H
  304.34 -
  304.35 -#include <ucx/test.h>
  304.36 -#include <ucx/string.h>
  304.37 -
  304.38 -#ifdef	__cplusplus
  304.39 -extern "C" {
  304.40 -#endif
  304.41 -
  304.42 -UCX_TEST(test_sstr_macros);
  304.43 -UCX_TEST(test_sstr);
  304.44 -UCX_TEST(test_sstr_len);
  304.45 -UCX_TEST(test_sstrcmp);
  304.46 -UCX_TEST(test_sstrcasecmp);
  304.47 -UCX_TEST(test_sstrcat);
  304.48 -UCX_TEST(test_sstrchr_sstrrchr);
  304.49 -UCX_TEST(test_sstrstr);
  304.50 -UCX_TEST(test_sstrsplit);
  304.51 -UCX_TEST(test_sstrtrim);
  304.52 -UCX_TEST(test_sstrprefixsuffix);
  304.53 -UCX_TEST(test_sstrcaseprefixsuffix);
  304.54 -UCX_TEST(test_sstrreplace);
  304.55 -
  304.56 -#ifdef	__cplusplus
  304.57 -}
  304.58 -#endif
  304.59 -
  304.60 -#endif	/* STRING_TESTS_H */
  304.61 -
   305.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
   305.2 +++ b/test/test_list.c	Sat Feb 06 19:11:44 2021 +0100
   305.3 @@ -0,0 +1,31 @@
   305.4 +/*
   305.5 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   305.6 + *
   305.7 + * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
   305.8 + *
   305.9 + * Redistribution and use in source and binary forms, with or without
  305.10 + * modification, are permitted provided that the following conditions are met:
  305.11 + *
  305.12 + *   1. Redistributions of source code must retain the above copyright
  305.13 + *      notice, this list of conditions and the following disclaimer.
  305.14 + *
  305.15 + *   2. Redistributions in binary form must reproduce the above copyright
  305.16 + *      notice, this list of conditions and the following disclaimer in the
  305.17 + *      documentation and/or other materials provided with the distribution.
  305.18 + *
  305.19 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  305.20 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  305.21 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  305.22 + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  305.23 + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  305.24 + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  305.25 + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  305.26 + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  305.27 + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  305.28 + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  305.29 + * POSSIBILITY OF SUCH DAMAGE.
  305.30 + */
  305.31 +
  305.32 +int main() {
  305.33 +    return 0;
  305.34 +}
   306.1 --- a/test/utils_tests.c	Mon Dec 30 09:54:10 2019 +0100
   306.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   306.3 @@ -1,187 +0,0 @@
   306.4 -/*
   306.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   306.6 - *
   306.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   306.8 - *
   306.9 - * Redistribution and use in source and binary forms, with or without
  306.10 - * modification, are permitted provided that the following conditions are met:
  306.11 - *
  306.12 - *   1. Redistributions of source code must retain the above copyright
  306.13 - *      notice, this list of conditions and the following disclaimer.
  306.14 - *
  306.15 - *   2. Redistributions in binary form must reproduce the above copyright
  306.16 - *      notice, this list of conditions and the following disclaimer in the
  306.17 - *      documentation and/or other materials provided with the distribution.
  306.18 - *
  306.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  306.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  306.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  306.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  306.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  306.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  306.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  306.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  306.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  306.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  306.29 - * POSSIBILITY OF SUCH DAMAGE.
  306.30 - */
  306.31 -
  306.32 -#include "utils_tests.h"
  306.33 -#include <ucx/buffer.h>
  306.34 -
  306.35 -UCX_TEST(test_ucx_fprintf) {
  306.36 -    UcxBuffer *b1 = ucx_buffer_new(NULL, 32, UCX_BUFFER_AUTOEXTEND);
  306.37 -    UcxBuffer *b2 = ucx_buffer_new(NULL, 4096, UCX_BUFFER_AUTOEXTEND);
  306.38 -    
  306.39 -    char *teststr1 = (char*)calloc(1, 1024);
  306.40 -    char *teststr2 = (char*)calloc(1, 1024);
  306.41 -    memset(teststr1, 'a', 1023);
  306.42 -    memset(teststr2, 'b', 1023);
  306.43 -    
  306.44 -    UCX_TEST_BEGIN
  306.45 -    
  306.46 -    ucx_fprintf(b1, (write_func)ucx_buffer_write, "Hello %s", "World");
  306.47 -    UCX_TEST_ASSERT(!strcmp(b1->space, "Hello World"), "wrong content in b1");
  306.48 -    ucx_fprintf(b1, (write_func)ucx_buffer_write, "\nend.\n");
  306.49 -    UCX_TEST_ASSERT(!strcmp(b1->space, "Hello World\nend.\n"),
  306.50 -            "wrong content in b1 after second fprintf");
  306.51 -    
  306.52 -    ucx_bprintf(b2, "%s%s", teststr1, teststr2);
  306.53 -    UCX_TEST_ASSERT(b2->pos == 2046, "wrong length");
  306.54 -    UCX_TEST_ASSERT(!memcmp(b2->space, teststr1, 1023),
  306.55 -            "wrong first half in b2");
  306.56 -    UCX_TEST_ASSERT(!memcmp(b2->space+1023, teststr2, 1023),
  306.57 -            "wrong second half in b2");
  306.58 -    
  306.59 -    UCX_TEST_END
  306.60 -    
  306.61 -    ucx_buffer_free(b1);
  306.62 -    ucx_buffer_free(b2);
  306.63 -    free(teststr1);
  306.64 -    free(teststr2);
  306.65 -}
  306.66 -
  306.67 -UCX_TEST(test_ucx_asprintf) {
  306.68 -    char *teststr1 = (char*)calloc(1, 1024);
  306.69 -    char *teststr2 = (char*)calloc(1, 1024);
  306.70 -    memset(teststr1, 'a', 1023);
  306.71 -    memset(teststr2, 'b', 1023);
  306.72 -    UcxAllocator *a = ucx_default_allocator();
  306.73 -    
  306.74 -    UCX_TEST_BEGIN
  306.75 -    
  306.76 -    sstr_t s1 = ucx_asprintf(a, "int: %d\nHello %s!", 123, "World");
  306.77 -    UCX_TEST_ASSERT(s1.ptr, "s1.ptr is NULL");
  306.78 -    UCX_TEST_ASSERT(s1.length == 21, "wrong length");
  306.79 -    UCX_TEST_ASSERT(!sstrcmp(s1, S("int: 123\nHello World!")), "wrong content");
  306.80 -    free(s1.ptr);
  306.81 -    
  306.82 -    sstr_t s2 = ucx_asprintf(a, "%s%s", teststr1, teststr2);
  306.83 -    UCX_TEST_ASSERT(s2.ptr, "s2.ptr is NULL");
  306.84 -    UCX_TEST_ASSERT(s2.length == 2046, "wrong length");
  306.85 -    UCX_TEST_ASSERT(!memcmp(s2.ptr, teststr1, 1023),
  306.86 -            "wrong first half in s2");
  306.87 -    UCX_TEST_ASSERT(!memcmp(s2.ptr+1023, teststr2, 1023),
  306.88 -            "wrong second half in s2");
  306.89 -    free(s2.ptr);
  306.90 -    
  306.91 -    UCX_TEST_END
  306.92 -            
  306.93 -    free(teststr1);
  306.94 -    free(teststr2);
  306.95 -}
  306.96 -
  306.97 -UCX_TEST(test_ucx_sprintf) {
  306.98 -    UCX_TEST_BEGIN
  306.99 -    
 306.100 -    sstr_t s1 = ucx_sprintf("int: %d\nHello %s!", 123, "World");
 306.101 -    UCX_TEST_ASSERT(s1.ptr, "s1.ptr is NULL");
 306.102 -    UCX_TEST_ASSERT(s1.length == 21, "wrong length");
 306.103 -    UCX_TEST_ASSERT(!sstrcmp(s1, S("int: 123\nHello World!")), "wrong content");
 306.104 -    free(s1.ptr);
 306.105 -    
 306.106 -    sstr_t s2 = ucx_sprintf("Nothing to format!");
 306.107 -    UCX_TEST_ASSERT(s2.ptr, "s2.ptr is NULL");
 306.108 -    UCX_TEST_ASSERT(s2.length == 18, "wrong length");
 306.109 -    UCX_TEST_ASSERT(!memcmp(s2.ptr, "Nothing to format!", 18),
 306.110 -            "wrong string without format arguments");
 306.111 -    free(s2.ptr);
 306.112 -    
 306.113 -    UCX_TEST_END
 306.114 -}
 306.115 -
 306.116 -UCX_TEST(test_ucx_bprintf) {
 306.117 -    UcxBuffer *b = ucx_buffer_new(NULL, 64, UCX_BUFFER_DEFAULT);
 306.118 -    
 306.119 -    UCX_TEST_BEGIN
 306.120 -    
 306.121 -    ucx_bprintf(b, "int: %d\nHello %s!", 123, "World");
 306.122 -    UCX_TEST_ASSERT(b->size == 21, "wrong length");
 306.123 -    UCX_TEST_ASSERT(!memcmp(b->space, "int: 123\nHello World!", 21),
 306.124 -            "wrong content");
 306.125 -            
 306.126 -    ucx_buffer_clear(b);
 306.127 -            
 306.128 -    ucx_bprintf(b, "Nothing to format!");
 306.129 -    UCX_TEST_ASSERT(b->size == 18, "wrong length");
 306.130 -    UCX_TEST_ASSERT(!memcmp(b->space, "Nothing to format!", 18),
 306.131 -            "wrong string without format arguments");
 306.132 -            
 306.133 -    UCX_TEST_END
 306.134 -    
 306.135 -    ucx_buffer_free(b);
 306.136 -}
 306.137 -
 306.138 -UCX_TEST(test_ucx_stream_copy) {
 306.139 -    UcxBuffer *b1 = ucx_buffer_new(NULL, 64, UCX_BUFFER_DEFAULT);
 306.140 -    UcxBuffer *b2 = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND);
 306.141 -    
 306.142 -    UCX_TEST_BEGIN
 306.143 -    
 306.144 -    ucx_buffer_write("01234567", 1, 8, b1);
 306.145 -    ucx_buffer_write("abcdefgh", 1, 8, b1);
 306.146 -    UCX_TEST_ASSERT(b1->size == 16, "failed to fill buffer b1");
 306.147 -    ucx_buffer_seek(b1, 0, SEEK_SET);
 306.148 -    
 306.149 -    char copybuf[256];
 306.150 -    size_t ncp = ucx_stream_bcopy(b1, b2, ucx_buffer_read, ucx_buffer_write,
 306.151 -            copybuf, sizeof(copybuf));
 306.152 -    UCX_TEST_ASSERT(ncp == 16, "wrong number of copied bytes");
 306.153 -    UCX_TEST_ASSERT(b2->size == 16, "b2 has wrong size");
 306.154 -    UCX_TEST_ASSERT(memcmp(b1->space, b2->space, 16) == 0,
 306.155 -            "b1 and b2 have not the same content");
 306.156 -    
 306.157 -    memset(b2->space, 0, b2->capacity);
 306.158 -    b2->pos = 0;
 306.159 -    b2->size = 0;
 306.160 -    ucx_buffer_seek(b1, 0, SEEK_SET);
 306.161 -    
 306.162 -    FILE *file = tmpfile();
 306.163 -    UCX_TEST_ASSERT(file, "test file cannot be opened, test aborted");
 306.164 -    
 306.165 -    ncp = ucx_stream_copy(b1, file, ucx_buffer_read, fwrite);
 306.166 -    UCX_TEST_ASSERT(ncp == 16, "copied wrong number of bytes to file");
 306.167 -    
 306.168 -    fseek(file, 0, SEEK_SET);
 306.169 -    
 306.170 -    ncp = ucx_stream_copy(file, b2, fread, ucx_buffer_write);
 306.171 -    UCX_TEST_ASSERT(ncp == 16, "copied wrong number of bytes from file");
 306.172 -    
 306.173 -    UCX_TEST_ASSERT(memcmp(b1->space, b2->space, 16) == 0,
 306.174 -            "b1 and b2 content mismatch");
 306.175 -    
 306.176 -    fclose(file);
 306.177 -
 306.178 -    ucx_buffer_clear(b1);
 306.179 -    ucx_buffer_seek(b2, 0, SEEK_SET);
 306.180 -    ncp = ucx_stream_ncopy(b2, b1, ucx_buffer_read, ucx_buffer_write, 8);
 306.181 -    UCX_TEST_ASSERT(ncp == 8, "copied wrong number of bytes with ncopy");
 306.182 -    UCX_TEST_ASSERT(memcmp(b1->space, "01234567\0\0\0\0\0\0\0\0", 16) == 0,
 306.183 -        "content wrong after ncopy");
 306.184 -    
 306.185 -    UCX_TEST_END
 306.186 -    
 306.187 -    ucx_buffer_free(b1);
 306.188 -    ucx_buffer_free(b2);
 306.189 -}
 306.190 -
   307.1 --- a/test/utils_tests.h	Mon Dec 30 09:54:10 2019 +0100
   307.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
   307.3 @@ -1,50 +0,0 @@
   307.4 -/*
   307.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   307.6 - *
   307.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
   307.8 - *
   307.9 - * Redistribution and use in source and binary forms, with or without
  307.10 - * modification, are permitted provided that the following conditions are met:
  307.11 - *
  307.12 - *   1. Redistributions of source code must retain the above copyright
  307.13 - *      notice, this list of conditions and the following disclaimer.
  307.14 - *
  307.15 - *   2. Redistributions in binary form must reproduce the above copyright
  307.16 - *      notice, this list of conditions and the following disclaimer in the
  307.17 - *      documentation and/or other materials provided with the distribution.
  307.18 - *
  307.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  307.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  307.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  307.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  307.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  307.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  307.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  307.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  307.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  307.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  307.29 - * POSSIBILITY OF SUCH DAMAGE.
  307.30 - */
  307.31 -
  307.32 -#ifndef UTILS_TESTS_H
  307.33 -#define	UTILS_TESTS_H
  307.34 -
  307.35 -#include <ucx/test.h>
  307.36 -#include <ucx/utils.h>
  307.37 -
  307.38 -#ifdef	__cplusplus
  307.39 -extern "C" {
  307.40 -#endif
  307.41 -
  307.42 -UCX_TEST(test_ucx_fprintf);
  307.43 -UCX_TEST(test_ucx_asprintf);
  307.44 -UCX_TEST(test_ucx_sprintf);
  307.45 -UCX_TEST(test_ucx_bprintf);
  307.46 -UCX_TEST(test_ucx_stream_copy);
  307.47 -
  307.48 -#ifdef	__cplusplus
  307.49 -}
  307.50 -#endif
  307.51 -
  307.52 -#endif	/* UTILS_TESTS_H */
  307.53 -

mercurial