From fc2bc00e638ada600573b22cd51b20d3a97515fc Mon Sep 17 00:00:00 2001 From: Mika Bostrom Date: Fri, 3 Dec 2010 14:50:29 +0200 Subject: [PATCH] Revert "Import uthash-1.9.3 as a 3rd-party item" This reverts commit 42b08e49bc64c3b92150a4d2700128d0bc6a1f80. Do not embed uthash after all. Not having it here makes it easier to integrate libsmack into MeeGo Core, and we now have uthash-devel 1.9.3 available. --- 3rdparty/uthash-1.9.3/LICENSE | 21 - 3rdparty/uthash-1.9.3/README | 41 - 3rdparty/uthash-1.9.3/doc/Makefile | 43 - 3rdparty/uthash-1.9.3/doc/NOTES | 44 - 3rdparty/uthash-1.9.3/doc/html/ChangeLog.html | 1014 ---------- 3rdparty/uthash-1.9.3/doc/html/img/banner.png | Bin 20477 -> 0 bytes 3rdparty/uthash-1.9.3/doc/html/img/banner.svg | 451 ----- 3rdparty/uthash-1.9.3/doc/html/img/grad_blue.png | Bin 290 -> 0 bytes 3rdparty/uthash-1.9.3/doc/html/img/grad_blue.svg | 103 -- 3rdparty/uthash-1.9.3/doc/html/img/rss.png | Bin 689 -> 0 bytes 3rdparty/uthash-1.9.3/doc/html/img/uthash-mini.png | Bin 3611 -> 0 bytes 3rdparty/uthash-1.9.3/doc/html/img/uthash-mini.svg | 288 --- 3rdparty/uthash-1.9.3/doc/html/img/uthash.png | Bin 21518 -> 0 bytes 3rdparty/uthash-1.9.3/doc/html/index.html | 131 -- 3rdparty/uthash-1.9.3/doc/html/license.html | 59 - 3rdparty/uthash-1.9.3/doc/html/styles.css | 130 -- 3rdparty/uthash-1.9.3/doc/html/tdh-quirks.css | 41 - 3rdparty/uthash-1.9.3/doc/html/tdh.css | 402 ---- 3rdparty/uthash-1.9.3/doc/html/toc.css | 35 - 3rdparty/uthash-1.9.3/doc/html/userguide.html | 1941 -------------------- 3rdparty/uthash-1.9.3/doc/html/userguide.pdf | 1 - 3rdparty/uthash-1.9.3/doc/html/utarray.html | 534 ------ 3rdparty/uthash-1.9.3/doc/html/utlist.html | 436 ----- 3rdparty/uthash-1.9.3/doc/html/utstring.html | 316 ---- 3rdparty/uthash-1.9.3/doc/pdf/userguide.pdf | Bin 291848 -> 0 bytes 3rdparty/uthash-1.9.3/doc/txt/ChangeLog.txt | 170 -- 3rdparty/uthash-1.9.3/doc/txt/sflogo.txt | 5 - 3rdparty/uthash-1.9.3/doc/txt/toc.txt | 85 - 3rdparty/uthash-1.9.3/doc/txt/topnav.txt | 10 - 3rdparty/uthash-1.9.3/doc/txt/topnav_utarray.txt | 8 - 3rdparty/uthash-1.9.3/doc/txt/topnav_utlist.txt | 8 - 3rdparty/uthash-1.9.3/doc/txt/topnav_utstring.txt | 8 - 3rdparty/uthash-1.9.3/doc/txt/userguide.txt | 1527 --------------- 3rdparty/uthash-1.9.3/doc/txt/utarray.txt | 366 ---- 3rdparty/uthash-1.9.3/doc/txt/utlist.txt | 216 --- 3rdparty/uthash-1.9.3/doc/txt/utstring.txt | 177 -- 3rdparty/uthash-1.9.3/src/utarray.h | 224 --- 3rdparty/uthash-1.9.3/src/uthash.h | 972 ---------- 3rdparty/uthash-1.9.3/src/utlist.h | 490 ----- 3rdparty/uthash-1.9.3/src/utstring.h | 137 -- 3rdparty/uthash-1.9.3/tests/Makefile | 111 -- 3rdparty/uthash-1.9.3/tests/README | 88 - 3rdparty/uthash-1.9.3/tests/all_funcs | 14 - 3rdparty/uthash-1.9.3/tests/bloom_perf.c | 64 - 3rdparty/uthash-1.9.3/tests/bloom_perf.sh | 17 - 3rdparty/uthash-1.9.3/tests/do_tests | 21 - 3rdparty/uthash-1.9.3/tests/do_tests.cygwin | 22 - 3rdparty/uthash-1.9.3/tests/do_tests.mingw | 20 - 3rdparty/uthash-1.9.3/tests/do_tests_win32.cmd | 16 - 3rdparty/uthash-1.9.3/tests/emit_keys.c | 44 - 3rdparty/uthash-1.9.3/tests/example.c | 118 -- 3rdparty/uthash-1.9.3/tests/hashscan.c | 588 ------ 3rdparty/uthash-1.9.3/tests/keystat.c | 219 --- 3rdparty/uthash-1.9.3/tests/keystats | 40 - 3rdparty/uthash-1.9.3/tests/mexpand | 21 - 3rdparty/uthash-1.9.3/tests/simkeys.pl | 28 - 3rdparty/uthash-1.9.3/tests/sleep_test.c | 29 - 3rdparty/uthash-1.9.3/tests/tdiff.cpp | 34 - 3rdparty/uthash-1.9.3/tests/test1.ans | 10 - 3rdparty/uthash-1.9.3/tests/test1.c | 27 - 3rdparty/uthash-1.9.3/tests/test10.ans | 4 - 3rdparty/uthash-1.9.3/tests/test10.c | 45 - 3rdparty/uthash-1.9.3/tests/test11.ans | 51 - 3rdparty/uthash-1.9.3/tests/test11.c | 50 - 3rdparty/uthash-1.9.3/tests/test11.dat | 51 - 3rdparty/uthash-1.9.3/tests/test12.ans | 20 - 3rdparty/uthash-1.9.3/tests/test12.c | 34 - 3rdparty/uthash-1.9.3/tests/test13.ans | 5 - 3rdparty/uthash-1.9.3/tests/test13.c | 42 - 3rdparty/uthash-1.9.3/tests/test14.ans | 1 - 3rdparty/uthash-1.9.3/tests/test14.c | 46 - 3rdparty/uthash-1.9.3/tests/test14.dat | 1219 ------------ 3rdparty/uthash-1.9.3/tests/test15.ans | 1 - 3rdparty/uthash-1.9.3/tests/test15.c | 28 - 3rdparty/uthash-1.9.3/tests/test16.ans | 1 - 3rdparty/uthash-1.9.3/tests/test16.c | 46 - 3rdparty/uthash-1.9.3/tests/test17.ans | 134 -- 3rdparty/uthash-1.9.3/tests/test17.c | 55 - 3rdparty/uthash-1.9.3/tests/test18.ans | 20 - 3rdparty/uthash-1.9.3/tests/test18.c | 33 - 3rdparty/uthash-1.9.3/tests/test19.ans | 1012 ---------- 3rdparty/uthash-1.9.3/tests/test19.c | 52 - 3rdparty/uthash-1.9.3/tests/test2.ans | 5 - 3rdparty/uthash-1.9.3/tests/test2.c | 31 - 3rdparty/uthash-1.9.3/tests/test20.ans | 1 - 3rdparty/uthash-1.9.3/tests/test20.c | 28 - 3rdparty/uthash-1.9.3/tests/test21.ans | 1 - 3rdparty/uthash-1.9.3/tests/test21.c | 33 - 3rdparty/uthash-1.9.3/tests/test22.ans | 1 - 3rdparty/uthash-1.9.3/tests/test22.c | 54 - 3rdparty/uthash-1.9.3/tests/test23.ans | 6 - 3rdparty/uthash-1.9.3/tests/test23.c | 44 - 3rdparty/uthash-1.9.3/tests/test24.ans | 1 - 3rdparty/uthash-1.9.3/tests/test24.c | 25 - 3rdparty/uthash-1.9.3/tests/test25.ans | 28 - 3rdparty/uthash-1.9.3/tests/test25.c | 112 -- 3rdparty/uthash-1.9.3/tests/test26.ans | 53 - 3rdparty/uthash-1.9.3/tests/test26.c | 52 - 3rdparty/uthash-1.9.3/tests/test27.ans | 28 - 3rdparty/uthash-1.9.3/tests/test27.c | 112 -- 3rdparty/uthash-1.9.3/tests/test28.ans | 34 - 3rdparty/uthash-1.9.3/tests/test28.c | 132 -- 3rdparty/uthash-1.9.3/tests/test29.ans | 103 -- 3rdparty/uthash-1.9.3/tests/test29.c | 48 - 3rdparty/uthash-1.9.3/tests/test3.ans | 5 - 3rdparty/uthash-1.9.3/tests/test3.c | 38 - 3rdparty/uthash-1.9.3/tests/test30.ans | 51 - 3rdparty/uthash-1.9.3/tests/test30.c | 43 - 3rdparty/uthash-1.9.3/tests/test31.ans | 51 - 3rdparty/uthash-1.9.3/tests/test31.c | 43 - 3rdparty/uthash-1.9.3/tests/test32.ans | 51 - 3rdparty/uthash-1.9.3/tests/test32.c | 41 - 3rdparty/uthash-1.9.3/tests/test33.ans | 51 - 3rdparty/uthash-1.9.3/tests/test33.c | 43 - 3rdparty/uthash-1.9.3/tests/test34.ans | 51 - 3rdparty/uthash-1.9.3/tests/test34.c | 41 - 3rdparty/uthash-1.9.3/tests/test35.ans | 30 - 3rdparty/uthash-1.9.3/tests/test35.c | 37 - 3rdparty/uthash-1.9.3/tests/test36.ans | 15 - 3rdparty/uthash-1.9.3/tests/test36.c | 46 - 3rdparty/uthash-1.9.3/tests/test37.ans | 20 - 3rdparty/uthash-1.9.3/tests/test37.c | 51 - 3rdparty/uthash-1.9.3/tests/test38.ans | 1 - 3rdparty/uthash-1.9.3/tests/test38.c | 28 - 3rdparty/uthash-1.9.3/tests/test39.ans | 7 - 3rdparty/uthash-1.9.3/tests/test39.c | 31 - 3rdparty/uthash-1.9.3/tests/test4.ans | 10 - 3rdparty/uthash-1.9.3/tests/test4.c | 29 - 3rdparty/uthash-1.9.3/tests/test40.ans | 1 - 3rdparty/uthash-1.9.3/tests/test40.c | 28 - 3rdparty/uthash-1.9.3/tests/test41.ans | 6 - 3rdparty/uthash-1.9.3/tests/test41.c | 58 - 3rdparty/uthash-1.9.3/tests/test42.ans | 14 - 3rdparty/uthash-1.9.3/tests/test42.c | 65 - 3rdparty/uthash-1.9.3/tests/test43.ans | 88 - 3rdparty/uthash-1.9.3/tests/test43.c | 76 - 3rdparty/uthash-1.9.3/tests/test44.ans | 9 - 3rdparty/uthash-1.9.3/tests/test44.c | 44 - 3rdparty/uthash-1.9.3/tests/test45.ans | 3 - 3rdparty/uthash-1.9.3/tests/test45.c | 24 - 3rdparty/uthash-1.9.3/tests/test46.ans | 7 - 3rdparty/uthash-1.9.3/tests/test46.c | 31 - 3rdparty/uthash-1.9.3/tests/test47.ans | 8 - 3rdparty/uthash-1.9.3/tests/test47.c | 28 - 3rdparty/uthash-1.9.3/tests/test48.ans | 10 - 3rdparty/uthash-1.9.3/tests/test48.c | 20 - 3rdparty/uthash-1.9.3/tests/test49.ans | 2 - 3rdparty/uthash-1.9.3/tests/test49.c | 20 - 3rdparty/uthash-1.9.3/tests/test5.ans | 5 - 3rdparty/uthash-1.9.3/tests/test5.c | 33 - 3rdparty/uthash-1.9.3/tests/test50.ans | 2 - 3rdparty/uthash-1.9.3/tests/test50.c | 18 - 3rdparty/uthash-1.9.3/tests/test51.ans | 2 - 3rdparty/uthash-1.9.3/tests/test51.c | 27 - 3rdparty/uthash-1.9.3/tests/test52.ans | 2 - 3rdparty/uthash-1.9.3/tests/test52.c | 38 - 3rdparty/uthash-1.9.3/tests/test53.ans | 1 - 3rdparty/uthash-1.9.3/tests/test53.c | 13 - 3rdparty/uthash-1.9.3/tests/test54.ans | 2 - 3rdparty/uthash-1.9.3/tests/test54.c | 23 - 3rdparty/uthash-1.9.3/tests/test55.ans | 2 - 3rdparty/uthash-1.9.3/tests/test55.c | 18 - 3rdparty/uthash-1.9.3/tests/test56.ans | 65 - 3rdparty/uthash-1.9.3/tests/test56.c | 86 - 3rdparty/uthash-1.9.3/tests/test57.ans | 1 - 3rdparty/uthash-1.9.3/tests/test57.c | 25 - 3rdparty/uthash-1.9.3/tests/test58.ans | 18 - 3rdparty/uthash-1.9.3/tests/test58.c | 55 - 3rdparty/uthash-1.9.3/tests/test6.ans | 1 - 3rdparty/uthash-1.9.3/tests/test6.c | 52 - 3rdparty/uthash-1.9.3/tests/test7.ans | 0 3rdparty/uthash-1.9.3/tests/test7.c | 38 - 3rdparty/uthash-1.9.3/tests/test8.ans | 15 - 3rdparty/uthash-1.9.3/tests/test8.c | 34 - 3rdparty/uthash-1.9.3/tests/test9.ans | 500 ----- 3rdparty/uthash-1.9.3/tests/test9.c | 31 - 3rdparty/uthash-1.9.3/tests/threads/Makefile | 31 - 3rdparty/uthash-1.9.3/tests/threads/README | 2 - 3rdparty/uthash-1.9.3/tests/threads/do_tests | 22 - 3rdparty/uthash-1.9.3/tests/threads/test1.c | 111 -- 3rdparty/uthash-1.9.3/tests/threads/test2.c | 70 - 181 files changed, 18546 deletions(-) delete mode 100755 3rdparty/uthash-1.9.3/LICENSE delete mode 100644 3rdparty/uthash-1.9.3/README delete mode 100644 3rdparty/uthash-1.9.3/doc/Makefile delete mode 100644 3rdparty/uthash-1.9.3/doc/NOTES delete mode 100644 3rdparty/uthash-1.9.3/doc/html/ChangeLog.html delete mode 100644 3rdparty/uthash-1.9.3/doc/html/img/banner.png delete mode 100644 3rdparty/uthash-1.9.3/doc/html/img/banner.svg delete mode 100644 3rdparty/uthash-1.9.3/doc/html/img/grad_blue.png delete mode 100644 3rdparty/uthash-1.9.3/doc/html/img/grad_blue.svg delete mode 100755 3rdparty/uthash-1.9.3/doc/html/img/rss.png delete mode 100644 3rdparty/uthash-1.9.3/doc/html/img/uthash-mini.png delete mode 100644 3rdparty/uthash-1.9.3/doc/html/img/uthash-mini.svg delete mode 100644 3rdparty/uthash-1.9.3/doc/html/img/uthash.png delete mode 100644 3rdparty/uthash-1.9.3/doc/html/index.html delete mode 100644 3rdparty/uthash-1.9.3/doc/html/license.html delete mode 100644 3rdparty/uthash-1.9.3/doc/html/styles.css delete mode 100644 3rdparty/uthash-1.9.3/doc/html/tdh-quirks.css delete mode 100644 3rdparty/uthash-1.9.3/doc/html/tdh.css delete mode 100644 3rdparty/uthash-1.9.3/doc/html/toc.css delete mode 100644 3rdparty/uthash-1.9.3/doc/html/userguide.html delete mode 120000 3rdparty/uthash-1.9.3/doc/html/userguide.pdf delete mode 100644 3rdparty/uthash-1.9.3/doc/html/utarray.html delete mode 100644 3rdparty/uthash-1.9.3/doc/html/utlist.html delete mode 100644 3rdparty/uthash-1.9.3/doc/html/utstring.html delete mode 100644 3rdparty/uthash-1.9.3/doc/pdf/userguide.pdf delete mode 100644 3rdparty/uthash-1.9.3/doc/txt/ChangeLog.txt delete mode 100644 3rdparty/uthash-1.9.3/doc/txt/sflogo.txt delete mode 100644 3rdparty/uthash-1.9.3/doc/txt/toc.txt delete mode 100644 3rdparty/uthash-1.9.3/doc/txt/topnav.txt delete mode 100644 3rdparty/uthash-1.9.3/doc/txt/topnav_utarray.txt delete mode 100644 3rdparty/uthash-1.9.3/doc/txt/topnav_utlist.txt delete mode 100644 3rdparty/uthash-1.9.3/doc/txt/topnav_utstring.txt delete mode 100644 3rdparty/uthash-1.9.3/doc/txt/userguide.txt delete mode 100644 3rdparty/uthash-1.9.3/doc/txt/utarray.txt delete mode 100644 3rdparty/uthash-1.9.3/doc/txt/utlist.txt delete mode 100644 3rdparty/uthash-1.9.3/doc/txt/utstring.txt delete mode 100644 3rdparty/uthash-1.9.3/src/utarray.h delete mode 100644 3rdparty/uthash-1.9.3/src/uthash.h delete mode 100644 3rdparty/uthash-1.9.3/src/utlist.h delete mode 100644 3rdparty/uthash-1.9.3/src/utstring.h delete mode 100644 3rdparty/uthash-1.9.3/tests/Makefile delete mode 100644 3rdparty/uthash-1.9.3/tests/README delete mode 100755 3rdparty/uthash-1.9.3/tests/all_funcs delete mode 100644 3rdparty/uthash-1.9.3/tests/bloom_perf.c delete mode 100755 3rdparty/uthash-1.9.3/tests/bloom_perf.sh delete mode 100755 3rdparty/uthash-1.9.3/tests/do_tests delete mode 100755 3rdparty/uthash-1.9.3/tests/do_tests.cygwin delete mode 100644 3rdparty/uthash-1.9.3/tests/do_tests.mingw delete mode 100644 3rdparty/uthash-1.9.3/tests/do_tests_win32.cmd delete mode 100644 3rdparty/uthash-1.9.3/tests/emit_keys.c delete mode 100644 3rdparty/uthash-1.9.3/tests/example.c delete mode 100644 3rdparty/uthash-1.9.3/tests/hashscan.c delete mode 100644 3rdparty/uthash-1.9.3/tests/keystat.c delete mode 100755 3rdparty/uthash-1.9.3/tests/keystats delete mode 100755 3rdparty/uthash-1.9.3/tests/mexpand delete mode 100755 3rdparty/uthash-1.9.3/tests/simkeys.pl delete mode 100644 3rdparty/uthash-1.9.3/tests/sleep_test.c delete mode 100644 3rdparty/uthash-1.9.3/tests/tdiff.cpp delete mode 100644 3rdparty/uthash-1.9.3/tests/test1.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test1.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test10.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test10.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test11.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test11.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test11.dat delete mode 100644 3rdparty/uthash-1.9.3/tests/test12.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test12.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test13.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test13.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test14.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test14.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test14.dat delete mode 100644 3rdparty/uthash-1.9.3/tests/test15.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test15.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test16.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test16.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test17.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test17.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test18.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test18.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test19.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test19.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test2.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test2.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test20.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test20.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test21.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test21.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test22.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test22.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test23.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test23.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test24.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test24.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test25.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test25.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test26.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test26.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test27.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test27.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test28.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test28.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test29.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test29.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test3.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test3.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test30.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test30.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test31.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test31.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test32.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test32.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test33.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test33.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test34.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test34.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test35.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test35.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test36.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test36.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test37.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test37.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test38.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test38.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test39.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test39.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test4.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test4.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test40.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test40.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test41.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test41.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test42.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test42.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test43.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test43.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test44.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test44.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test45.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test45.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test46.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test46.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test47.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test47.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test48.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test48.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test49.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test49.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test5.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test5.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test50.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test50.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test51.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test51.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test52.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test52.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test53.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test53.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test54.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test54.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test55.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test55.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test56.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test56.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test57.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test57.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test58.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test58.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test6.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test6.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test7.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test7.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test8.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test8.c delete mode 100644 3rdparty/uthash-1.9.3/tests/test9.ans delete mode 100644 3rdparty/uthash-1.9.3/tests/test9.c delete mode 100644 3rdparty/uthash-1.9.3/tests/threads/Makefile delete mode 100644 3rdparty/uthash-1.9.3/tests/threads/README delete mode 100755 3rdparty/uthash-1.9.3/tests/threads/do_tests delete mode 100644 3rdparty/uthash-1.9.3/tests/threads/test1.c delete mode 100644 3rdparty/uthash-1.9.3/tests/threads/test2.c diff --git a/3rdparty/uthash-1.9.3/LICENSE b/3rdparty/uthash-1.9.3/LICENSE deleted file mode 100755 index 6e41e33..0000000 --- a/3rdparty/uthash-1.9.3/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) 2005-2010, Troy D. Hanson http://uthash.sourceforge.net -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -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 OWNER -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. - diff --git a/3rdparty/uthash-1.9.3/README b/3rdparty/uthash-1.9.3/README deleted file mode 100644 index 1c78a98..0000000 --- a/3rdparty/uthash-1.9.3/README +++ /dev/null @@ -1,41 +0,0 @@ -uthash: a hash in C -============================================================================== - - -DOCUMENTATION -============= -Documentation for uthash is available in the doc/ directory or at: - - http://uthash.sourceforge.net - - -USAGE -============ -The only file you need to use uthash in your own application is - - src/uthash.h - -These bonus headers are also included: - - src/utlist.h - src/utarray.h - src/utstring.h - - -SELF-TESTS -============ -The automated self-test can be from the tests/ directory by running -make on a unix platform, or by running do_tests_win32.cmd on Windows. - - -LICENSE -============ -The BSD license applies to this software. The text is in the LICENSE file. -You can use or modify this code in your software, commercial or otherwise. - -CONTACT -============ -Feel free to send me questions, comments, ideas for improvements or bug reports. - -Troy D. Hanson, May 15, 2010 -thanson@users.sourceforge.net diff --git a/3rdparty/uthash-1.9.3/doc/Makefile b/3rdparty/uthash-1.9.3/doc/Makefile deleted file mode 100644 index f68c4d1..0000000 --- a/3rdparty/uthash-1.9.3/doc/Makefile +++ /dev/null @@ -1,43 +0,0 @@ -all: css userguide changelog pdf utlist - -userguide: txt/userguide.txt - asciidoc --unsafe --out-file=html/userguide.html -a linkcss=1 -a theme=tdh $< - -utlist: txt/utlist.txt - asciidoc --unsafe --out-file=html/utlist.html -a linkcss=1 -a theme=tdh $< - -utarray: txt/utarray.txt - asciidoc --unsafe --out-file=html/utarray.html -a linkcss=1 -a theme=tdh $< - -utstring: txt/utstring.txt - asciidoc --unsafe --out-file=html/utstring.html -a linkcss=1 -a theme=tdh $< - -changelog: txt/ChangeLog.txt - asciidoc --out-file=html/ChangeLog.html txt/ChangeLog.txt - -stage: - cp html/userguide.html ${PAGEROOT}/uthash - cp html/userguide.pdf ${PAGEROOT}/uthash - cp html/utlist.html ${PAGEROOT}/uthash - cp html/utarray.html ${PAGEROOT}/uthash - cp html/utstring.html ${PAGEROOT}/uthash - cp html/ChangeLog.html ${PAGEROOT}/uthash - cp html/license.html ${PAGEROOT}/uthash - cp html/index.html ${PAGEROOT}/uthash - cp html/styles.css ${PAGEROOT}/uthash - -.PHONY: pdf - -pdf: txt/userguide.txt - a2x --format=pdf $< - mv txt/userguide.pdf pdf/ - cd html && ln -sf ../pdf/userguide.pdf userguide.pdf - rm -f txt/userguide.xml - -css: html/toc.css - cat /etc/asciidoc/stylesheets/xhtml11.css html/toc.css > html/tdh.css - cp /etc/asciidoc/stylesheets/xhtml11-quirks.css html/tdh-quirks.css - -docbook: txt/userguide.txt - asciidoc -b docbook --out-file=/tmp/userguide.xml $< - xmlto -o html html-nochunks /tmp/userguide.xml diff --git a/3rdparty/uthash-1.9.3/doc/NOTES b/3rdparty/uthash-1.9.3/doc/NOTES deleted file mode 100644 index da577ac..0000000 --- a/3rdparty/uthash-1.9.3/doc/NOTES +++ /dev/null @@ -1,44 +0,0 @@ -# maintainer notes - -# packages used: -- asciidoc -- dblatex - -# INSTALLING DBLATEX for AsciiDoc PDF generation, on Mac OS X: --------------------------------------------------------------------------------- -# first install LaTeX if need be, as part of MacTeX (http://www.tug.org/mactex/) -# review install instructions on dblatex.sf.net -wget http://prdownloads.sourceforge.net/dblatex/dblatex-0.2.7.tar.bz2?download -tar xjf dblatex-0.2.7.tar.bz2 -cd dblatex-0.2.7 -mkdir ~/dblatex -xmlcatalog --noout --create ~/dblatex/mycatalog -# in the following command, use Spotlight or find to locate the highest revision of docbookx.dtd -# for example on CentOS it was found in 'file:///usr/share/sgml/docbook/xml-dtd-4.3-1.0-25/docbookx.dtd' -xmlcatalog --noout --add 'public' '-//OASIS//DTD DocBook? XML V4.1.2//EN' /sw/share/xml/dtd/docbookx/4.4.0/docbookx.dtd ~/dblatex/mycatalog -sudo python ./setup.py install --prefix=/usr/local --catalogs=~/dblatex/mycatalog - -# IE6 png gamma bug: --------------------------------------------------------------------------------- -PNG images in IE6 display with wrong background colors, -solution: save PNG in Gimp *Without save gamma checked* - -# WEB SITE UPDATE --------------------------------------------------------------------------------- -macbook: sftp thanson,uthash@web.sourceforge.net -Connecting to web.sourceforge.net... -sftp> cd htdocs -sftp> put index.html -Uploading index.html to /home/groups/u/ut/uthash/htdocs/index.html -index.html 100% 2931 2.9KB/s 00:00 - -# FILE RELEASE --------------------------------------------------------------------------------- -macbook: sftp thanson@frs.sourceforge.net -Connecting to frs.sourceforge.net... -sftp> cd uploads -sftp> put uthash-1.4.tar.bz2 -Uploading uthash-1.4.tar.bz2 to /incoming/t/th/thanson/uploads/uthash-1.4.tar.bz2 -uthash-1.4.tar.bz2 100% 78KB 77.8KB/s 00:01 -sftp> exit - diff --git a/3rdparty/uthash-1.9.3/doc/html/ChangeLog.html b/3rdparty/uthash-1.9.3/doc/html/ChangeLog.html deleted file mode 100644 index 245cace..0000000 --- a/3rdparty/uthash-1.9.3/doc/html/ChangeLog.html +++ /dev/null @@ -1,1014 +0,0 @@ - - - - - -uthash ChangeLog - - - - - -
-
-
-uthash at SourceForge.net -

Click to return to the uthash home page.

-
-
-

Version 1.9.3 (2010-10-31)

-
-
    -
  • -

    -fix an ifdef for compatibility with Intel compiler (thanks, degski!) -

    -
  • -
  • -

    -fix HASH_ITER macro to satisfy C++ casting rules (thanks, Erik Bai!) -

    -
  • -
-
-

Version 1.9.2 (2010-10-04)

-
-
    -
  • -

    -new HASH_ITER macro for more convenient deletion-safe iteration -

    -
  • -
  • -

    -hashscan can now run on FreeBSD 8.1 and later (thanks, Markus Gebert!) -

    -
  • -
  • -

    -More parens to evaluate complex macro arguments properly (thanks, ngg!) -

    -
  • -
  • -

    -Add sz parameter to the uthash_free hook for platforms that do their own memory management. Hopefully this minor API change doesn’t cause too much breakage for people. (thanks, Niall Douglas!) -

    -
  • -
  • -

    -uthash has been downloaded 12,294 times -

    -
  • -
-
-

Version 1.9.1 (2010-05-15)

-
-
    -
  • -

    -Fix a redefinition warning when using uthash.h and utstring.h together -

    -
  • -
  • -

    -Fix a bug in utstring_init -

    -
  • -
  • -

    -Added HASH_FIND_PTR and HASH_ADD_PTR (thanks, Niall Douglas!) -

    -
  • -
-
-

Version 1.9 (2010-03-31)

-
-
    -
  • -

    -uthash now supports Visual Studio 2008 and 2010 in C or C++ code! -

    -
  • -
  • -

    -new headers utarray.h and utstring.h - are now included. These implement dynamic arrays and strings using macros -

    -
  • -
  • -

    -utlist.h now has deletion-safe iterators and search macros -

    -
  • -
  • -

    -the test suite now runs under Visual Studio (thanks again degski!) -

    -
  • -
  • -

    -special thanks for suggesting utarray and utlist features to Charalampos P.! -

    -
  • -
  • -

    -uthash has been downloaded 9,616 times -

    -
  • -
-
-

Version 1.8 (2009-09-08)

-
-
    -
  • -

    -Added the hashscan utility that can report on the size and quality of - hash tables in a running process (Linux-only) -

    -
  • -
  • -

    -Added Bloom filter support. This has the potential to speed up certain - types of programs that look up non-existant keys in sufficient numbers. -

    -
  • -
  • -

    -Restored the MurmurHash, which can once again be used, if an additional - symbol is defined. This is a "safety" by which the user declares they - understand that -fno-strict-aliasing flag must be used if they are - using MurmurHash under gcc with optimization. -

    -
  • -
  • -

    -Unified the bucket/table malloc hooks; now there is only one malloc hook -

    -
  • -
  • -

    -Re-organized the manual into a main section and advanced topics section -

    -
  • -
  • -

    -Fixed a bug in utlist.h where sorting a singly-linked list threw a - compile-time error. -

    -
  • -
  • -

    -Fixed a bug in utlist.h where a doubly-linked list that is sorted - did not maintain the special head->prev pointer back to the list tail. -

    -
  • -
-
-

Version 1.7 (2009-06-11)

-
-
    -
  • -

    -The MurmurHash has been removed, and Jenkin’s hash is once again the default. - While MurmurHash performed well, it’s unsafe with regard to the strict - aliasing rule. This results in incorrect code when compiled with optimization. - It’s not possible to enable -fno-strict-aliasing from within a header file. -

    -
  • -
  • -

    -The linked list macros in utlist.h now comply with the strict-aliasing - rule so they generate correct code under high optimization levels (O2 or O3). - The use of the __typeof__ extension, which was originally a GNU extension, - may reduce portability to other compilers that do not support this extension. - This extension is used in the singly-linked list macros and the sort macros. -

    -
  • -
-
-

Version 1.6 (2009-05-08)

-
-

Special thanks to Alfred Heisner for contributing several enhancements:

-
    -
  • -

    -Support for two new hash functions: -

    -
      -
    • -

      -the Paul Hsieh hash function (HASH_SFH) -

      -
    • -
    • -

      -Austin Appleby’s MurmurHash function (HASH_MUR) -

      -
    • -
    -
  • -
  • -

    -Because of its excellent performance, MurmurHash is now the default hash function. -

    -
  • -
  • -

    -keystats now has much better elapsed time accuracy under Cygwin and MinGW -

    -
  • -
  • -

    -fixed casting in HASH_FNV, HASH_SAX and HASH_OAT for non-char keys -

    -
  • -
-

This release also includes:

-
    -
  • -

    -a new HASH_CLEAR operation clears a hash table in one step. -

    -
  • -
  • -

    -a new HASH_SELECT operation inserts those elements from one hash that - satisfy a given condition into another hash. The selected items have - dual presence in both hash tables. For example a game could select the - visible polygons from a hash of all polygons. -

    -
  • -
  • -

    -fixed a compile-time error which occurred if the final argument to - HASH_ADD_KEYPTR was a pointer to an array member like &a[i] -

    -
  • -
  • -

    -added another test script tests/all_funcs which executes the test suite - using every supported hash function -

    -
  • -
-

And lastly,

-
    -
  • -

    -a new, separate header called utlist.h is included which - provides linked list macros for C structures, similar in style to the - uthash macros -

    -
  • -
-
-

Version 1.5 (2009-02-19)

-
-
    -
  • -

    -now thread-safe for concurrent readers -

    -
  • -
  • -

    -use scratch variables on stack rather than in table (thanks, Petter Arvidsson!). - This change made HASH_FIND about 13% faster and enabled reader concurrency. -

    -
  • -
  • -

    -made BSD license terms even more permissive -

    -
  • -
  • -

    -added PDF version of User Guide -

    -
  • -
  • -

    -added update news -(RSS) - -

    -
  • -
-
-

Version 1.4 (2008-09-23)

-
-
    -
  • -

    -Add HASH_COUNT for counting items in the hash -

    -
  • -
  • -

    -Compatibility with C++. Satisfy additional casting requirements. - Also in the tests/ directory, running make cplusplus now compiles - all the test programs with the C++ compiler. -

    -
  • -
  • -

    -Eliminate elmt pointer from the UT_hash_handle. Calculate elmt - from hash handle address by subtracting hho (hash handle offset). -

    -
  • -
  • -

    -Contributed by L.S.Chin: - Cast void* to char* before pointer arithmetic to suppress compiler - warnings. We assume compilers abide to C standards which impose - requirement that sizeof(void*) == sizeof(char*). -

    -
  • -
  • -

    -Return meaningful exit status from do_tests per Tiago Cunha, - so that package manager-based install can verify tests are successful -

    -
  • -
-
-

Version 1.3 (2008-07-27)

-
-
    -
  • -

    -use integer-only math-- no floating point! Support FPU-less CPU’s. -

    -
  • -
  • -

    -eliminate hash_q metric, which measured the fraction of items with - non-ideal chain positions. We only need to know if this fraction - is below 0.5. This is now determined using fast bitwise tests. -

    -
  • -
  • -

    -when an item is added to the hash, calculate the key’s hash value - upfront and store it, instead of recomputing it as needed. This hashv - is stored in the hash handle. Potentially major speed benefit for - bucket expansion algorithm. Deleting is marginally improved too. -

    -
  • -
  • -

    -fixed a minor bug in the calculation of the max ideal chain length; - line 446 in v1.2 erroneously calculated a/b*2 instead of a/(b*2). - The effect of this bug was that bucket expansion could occur more - readily because the per-bucket max chain length multiplier factor - (which delays bucket expansion when certain buckets are overused) - was set to a lower, expansion-favoring value than intended. -

    -
  • -
  • -

    -improved source commenting and improved variable names in structures -

    -
  • -
  • -

    -remove HASH_JSW. Lengthy random number array made code less readable -

    -
  • -
  • -

    -add HASH_SRT(hh,hash,cmp) as a generalized HASH_SORT(hash,cmp). - It was an omission in uthash 1.2 that there was no sort macro for - hash handles with names other than hh. -

    -
  • -
  • -

    -Corrected HASH_FSCK so it works with any name for the hash handle. -

    -
  • -
  • -

    -behave properly in pathological HASH_DEL(a,a) case where the same - variable references the head and the deletee (advancing the head - then loses the correct reference to the deletee); fix by using - scratch area in the hash table to store deletee hash handle. -

    -
  • -
  • -

    -made tests runnable on MinGW -

    -
  • -
  • -

    -3000+ downloads since uthash-1.0 -

    -
  • -
-
-

Version 1.2 (2006-11-22)

-
-
    -
  • -

    -new HASH_SORT macro -

    -
  • -
  • -

    -Cygwin support -

    -
  • -
  • -

    -User Guide now features a clickable Table of Contents. - (The technique for generating the TOC on the browser was contributed - back to the AsciiDoc project and incorporated into AsciiDoc v8.1.0). -

    -
  • -
-
-

Version 1.1 (2006-06-28)

-
-
    -
  • -

    -uthash-1.1 released -

    -
  • -
  • -

    -supports several built-in user-selectable hash functions -

    -
  • -
  • -

    -new keystats utility quantifies performance of hash functions -

    -
  • -
-
-

Version 1.0 (2006-06-02)

-
-
    -
  • -

    -Initial release -

    -
  • -
-
-
-

- - - diff --git a/3rdparty/uthash-1.9.3/doc/html/img/banner.png b/3rdparty/uthash-1.9.3/doc/html/img/banner.png deleted file mode 100644 index de4f310b9fec8cfda8f394e26cc7850968e1c673..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20477 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - ut hash - - - - - - - - - - - - - - - - - - - - - - - a hash tablefor C structures - - - diff --git a/3rdparty/uthash-1.9.3/doc/html/img/grad_blue.png b/3rdparty/uthash-1.9.3/doc/html/img/grad_blue.png deleted file mode 100644 index 8fab0faf96921882cf2d9507c990aa06820859a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^tAUt{gAGWYUa<}&z?S6g?!xdN1Q+aGJ{c&&S>O>_ z%)r1c48n{Iv*t(u1=&kHeO=kFv9XAVaNRx1)C3e-@9E+g5^?zLq=Q_C3YfWGphgw(XJUjB?4cO}jZ0tt?_27`8Z>*570Gc>PWD`{B#s4ySf) z32(acBX!;7-@EtUH2liOsuK6tDE@wI$=SHfFLr13e_ry@zr2rS_OdXC`&UA015NH< z53fD-{Pr@vU8kj{zT3t$X4oH0H04`u$hW#Mq8EY=XZ0M; dI+K5g@u&WCk=0-J%m6x_!PC{xWt~$(69DlBcvS!Z diff --git a/3rdparty/uthash-1.9.3/doc/html/img/grad_blue.svg b/3rdparty/uthash-1.9.3/doc/html/img/grad_blue.svg deleted file mode 100644 index 8ea0e09..0000000 --- a/3rdparty/uthash-1.9.3/doc/html/img/grad_blue.svg +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - diff --git a/3rdparty/uthash-1.9.3/doc/html/img/rss.png b/3rdparty/uthash-1.9.3/doc/html/img/rss.png deleted file mode 100755 index b3c949d2244f2c0c81d65e74719af2a1b56d06a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 689 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 diff --git a/3rdparty/uthash-1.9.3/doc/html/img/uthash-mini.svg b/3rdparty/uthash-1.9.3/doc/html/img/uthash-mini.svg deleted file mode 100644 index ea2d074..0000000 --- a/3rdparty/uthash-1.9.3/doc/html/img/uthash-mini.svg +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - ut hash - - - - - - - - - - - - - - - - - - - - - - - diff --git a/3rdparty/uthash-1.9.3/doc/html/img/uthash.png b/3rdparty/uthash-1.9.3/doc/html/img/uthash.png deleted file mode 100644 index 20df5a7d3566fa1210102c6512956916d30d43a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21518 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�L6@iTtUNOob*ju%^I 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 FV1mJ@2TK3| diff --git a/3rdparty/uthash-1.9.3/doc/html/index.html b/3rdparty/uthash-1.9.3/doc/html/index.html deleted file mode 100644 index 2c80ee4..0000000 --- a/3rdparty/uthash-1.9.3/doc/html/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - uthash: a hash table for C structures - - - - - -
- sf.net summary page > - uthash home -
- -
-
- - - - -
- Any C structure can be stored in a hash table using uthash. Just add a - UT_hash_handle to the structure and choose one or more fields - in your structure to act as the key. Then use these macros to store, - retrieve or delete items from the hash table. - -
-Example 1. Adding an item to a hash. -
-
-#include "uthash.h"
-
-struct my_struct {
-    int id;            /* we'll use this field as the key */
-    char name[10];             
-    UT_hash_handle hh; /* makes this structure hashable */
-};
-
-struct my_struct *users = NULL;
-
-void add_user(struct my_struct *s) {
-    HASH_ADD_INT( users, id, s );    
-}
-
-
-
-
- -
-Example 2. Looking up an item in a hash. -
-
-struct my_struct *find_user(int user_id) {
-    struct my_struct *s;
-
-    HASH_FIND_INT( users, &user_id, s );  
-    return s;
-}
-
-
-
-
- -
-Example 3. Deleting an item from a hash. -
- -
-void delete_user(struct my_struct *user) {
-    HASH_DEL( users, user);  
-}
-
-
-
-
- - For more information and examples, please see the User Guide. - -
-
- -
- - - - - - diff --git a/3rdparty/uthash-1.9.3/doc/html/license.html b/3rdparty/uthash-1.9.3/doc/html/license.html deleted file mode 100644 index 61b9d82..0000000 --- a/3rdparty/uthash-1.9.3/doc/html/license.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - uthash: a hash table for C structures - - - - - -
- sf.net summary page > - uthash home > - BSD license -
- -
-
-
-
-Copyright (c) 2005-2010, Troy D. Hanson    http://uthash.sourceforge.net
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-
-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 OWNER
-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.
-
-
-
- -
- - - - - - diff --git a/3rdparty/uthash-1.9.3/doc/html/styles.css b/3rdparty/uthash-1.9.3/doc/html/styles.css deleted file mode 100644 index 75035f1..0000000 --- a/3rdparty/uthash-1.9.3/doc/html/styles.css +++ /dev/null @@ -1,130 +0,0 @@ -#banner { - /* font-size: x-large; */ - /* background: #ff00ff; */ - /* height: 100px; */ -} - -#topnav { - /* background-image: url(img/grad_topnav.png); */ - /* background-repeat: repeat-y; */ - /* background-color: #af00af; */ - /* height: 25px; */ - margin-top: 5px; - margin-bottom: 10px; - padding: 3px; - font-size: 9pt; - font-family: sans-serif; - /* border-style: solid; */ - /* border-width: 1px; */ -} - -#topnav a { - padding: 8px; -} - -h1,p { margin: 0; } /* non-0 margin on firefox */ - -#mid { - background-image: url(img/grad_blue.png); - background-repeat: repeat-y; - /* background-color: #ffddaa; */ - padding-top: 20px; - margin-bottom: 10px; -} - -#mid img { - padding-left: 10px; - vertical-align: middle; -} - -a img { - border: 0 -} - -#nav { - background-color: #fff8f1; - margin-left: 10px; - margin-top: 20px; - float: left; - padding: 10px; - border-style: solid; - border-width: 2px; - font-family: sans-serif; -} - - -#nav h2 { - font-weight: bold; - font-size: 10pt; -} - -#nav h3 { - /* font-weight: bold; */ - padding-left: 5px; - /* font-style: oblique; */ - font-family: sans-serif; - font-size: 7pt; -} - -#nav div { - font-size: 9pt; - padding-left: 15px; -} - -#main { - background: #ffffff; - margin-top: 20px; - margin-left: 170px; - padding-left: 20px; - height: 100%; -} - -#main h1 { - font-family: sans-serif; -} - -.listing { - margin: 20px; - font-family: sans-serif; - font-weight: bold; -} - -.code { - padding: 10px; - font-size: 8pt; - font-weight: normal; - background: #f3f3f3; - width: 80%; - border-style: solid; - border-width: 1px; -} - -#footer { - /* background: #00ffff; */ - margin-top: 5px; - font-size: small; - font-family: sans-serif; -} - -hr { - height: 0.04em; - background: black; - margin: 0 10% 0 0; -} - -#footer { - width: 90%; -} - -#footer img { - margin-right: 5px; - float: right; -} - -#footer #support { - float: right; -} - -body { - width: 80%; -} diff --git a/3rdparty/uthash-1.9.3/doc/html/tdh-quirks.css b/3rdparty/uthash-1.9.3/doc/html/tdh-quirks.css deleted file mode 100644 index a39a6d6..0000000 --- a/3rdparty/uthash-1.9.3/doc/html/tdh-quirks.css +++ /dev/null @@ -1,41 +0,0 @@ -/* Workarounds for IE6's broken and incomplete CSS2. */ - -div.sidebar-content { - background: #ffffee; - border: 1px solid silver; - padding: 0.5em; -} -div.sidebar-title, div.image-title { - color: #527bbd; - font-family: sans-serif; - font-weight: bold; - margin-top: 0.0em; - margin-bottom: 0.5em; -} - -div.listingblock div.content { - border: 1px solid silver; - background: #f4f4f4; - padding: 0.5em; -} - -div.quoteblock-attribution { - padding-top: 0.5em; - text-align: right; -} - -div.verseblock-content { - white-space: pre; -} -div.verseblock-attribution { - padding-top: 0.75em; - text-align: left; -} - -div.exampleblock-content { - border-left: 3px solid #dddddd; - padding-left: 0.5em; -} - -/* IE6 sets dynamically generated links as visited. */ -div#toc a:visited { color: blue; } diff --git a/3rdparty/uthash-1.9.3/doc/html/tdh.css b/3rdparty/uthash-1.9.3/doc/html/tdh.css deleted file mode 100644 index 4f927f3..0000000 --- a/3rdparty/uthash-1.9.3/doc/html/tdh.css +++ /dev/null @@ -1,402 +0,0 @@ -/* Debug borders */ -p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 { -/* - border: 1px solid red; -*/ -} - -body { - margin: 1em 5% 1em 5%; -} - -a { - color: blue; - text-decoration: underline; -} -a:visited { - color: fuchsia; -} - -em { - font-style: italic; - color: navy; -} - -strong { - font-weight: bold; - color: #083194; -} - -tt { - color: navy; -} - -h1, h2, h3, h4, h5, h6 { - color: #527bbd; - font-family: sans-serif; - margin-top: 1.2em; - margin-bottom: 0.5em; - line-height: 1.3; -} - -h1, h2, h3 { - border-bottom: 2px solid silver; -} -h2 { - padding-top: 0.5em; -} -h3 { - float: left; -} -h3 + * { - clear: left; -} - -div.sectionbody { - font-family: serif; - margin-left: 0; -} - -hr { - border: 1px solid silver; -} - -p { - margin-top: 0.5em; - margin-bottom: 0.5em; -} - -ul, ol, li > p { - margin-top: 0; -} - -pre { - padding: 0; - margin: 0; -} - -span#author { - color: #527bbd; - font-family: sans-serif; - font-weight: bold; - font-size: 1.1em; -} -span#email { -} -span#revnumber, span#revdate, span#revremark { - font-family: sans-serif; -} - -div#footer { - font-family: sans-serif; - font-size: small; - border-top: 2px solid silver; - padding-top: 0.5em; - margin-top: 4.0em; -} -div#footer-text { - float: left; - padding-bottom: 0.5em; -} -div#footer-badges { - float: right; - padding-bottom: 0.5em; -} - -div#preamble { - margin-top: 1.5em; - margin-bottom: 1.5em; -} -div.tableblock, div.imageblock, div.exampleblock, div.verseblock, -div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock, -div.admonitionblock { - margin-top: 1.0em; - margin-bottom: 1.5em; -} -div.admonitionblock { - margin-top: 2.0em; - margin-bottom: 2.0em; - margin-right: 10%; - color: #606060; -} - -div.content { /* Block element content. */ - padding: 0; -} - -/* Block element titles. */ -div.title, caption.title { - color: #527bbd; - font-family: sans-serif; - font-weight: bold; - text-align: left; - margin-top: 1.0em; - margin-bottom: 0.5em; -} -div.title + * { - margin-top: 0; -} - -td div.title:first-child { - margin-top: 0.0em; -} -div.content div.title:first-child { - margin-top: 0.0em; -} -div.content + div.title { - margin-top: 0.0em; -} - -div.sidebarblock > div.content { - background: #ffffee; - border: 1px solid silver; - padding: 0.5em; -} - -div.listingblock > div.content { - border: 1px solid silver; - background: #f4f4f4; - padding: 0.5em; -} - -div.quoteblock, div.verseblock { - padding-left: 1.0em; - margin-left: 1.0em; - margin-right: 10%; - border-left: 5px solid #dddddd; - color: #777777; -} - -div.quoteblock > div.attribution { - padding-top: 0.5em; - text-align: right; -} - -div.verseblock > div.content { - white-space: pre; -} -div.verseblock > div.attribution { - padding-top: 0.75em; - text-align: left; -} -/* DEPRECATED: Pre version 8.2.7 verse style literal block. */ -div.verseblock + div.attribution { - text-align: left; -} - -div.admonitionblock .icon { - vertical-align: top; - font-size: 1.1em; - font-weight: bold; - text-decoration: underline; - color: #527bbd; - padding-right: 0.5em; -} -div.admonitionblock td.content { - padding-left: 0.5em; - border-left: 3px solid #dddddd; -} - -div.exampleblock > div.content { - border-left: 3px solid #dddddd; - padding-left: 0.5em; -} - -div.imageblock div.content { padding-left: 0; } -span.image img { border-style: none; } -a.image:visited { color: white; } - -dl { - margin-top: 0.8em; - margin-bottom: 0.8em; -} -dt { - margin-top: 0.5em; - margin-bottom: 0; - font-style: normal; - color: navy; -} -dd > *:first-child { - margin-top: 0.1em; -} - -ul, ol { - list-style-position: outside; -} -ol.arabic { - list-style-type: decimal; -} -ol.loweralpha { - list-style-type: lower-alpha; -} -ol.upperalpha { - list-style-type: upper-alpha; -} -ol.lowerroman { - list-style-type: lower-roman; -} -ol.upperroman { - list-style-type: upper-roman; -} - -div.compact ul, div.compact ol, -div.compact p, div.compact p, -div.compact div, div.compact div { - margin-top: 0.1em; - margin-bottom: 0.1em; -} - -div.tableblock > table { - border: 3px solid #527bbd; -} -thead, p.table.header { - font-family: sans-serif; - font-weight: bold; -} -tfoot { - font-weight: bold; -} -td > div.verse { - white-space: pre; -} -p.table { - margin-top: 0; -} -/* Because the table frame attribute is overriden by CSS in most browsers. */ -div.tableblock > table[frame="void"] { - border-style: none; -} -div.tableblock > table[frame="hsides"] { - border-left-style: none; - border-right-style: none; -} -div.tableblock > table[frame="vsides"] { - border-top-style: none; - border-bottom-style: none; -} - - -div.hdlist { - margin-top: 0.8em; - margin-bottom: 0.8em; -} -div.hdlist tr { - padding-bottom: 15px; -} -dt.hdlist1.strong, td.hdlist1.strong { - font-weight: bold; -} -td.hdlist1 { - vertical-align: top; - font-style: normal; - padding-right: 0.8em; - color: navy; -} -td.hdlist2 { - vertical-align: top; -} -div.hdlist.compact tr { - margin: 0; - padding-bottom: 0; -} - -.comment { - background: yellow; -} - -.footnote, .footnoteref { - font-size: 0.8em; -} - -span.footnote, span.footnoteref { - vertical-align: super; -} - -#footnotes { - margin: 20px 0 20px 0; - padding: 7px 0 0 0; -} - -#footnotes div.footnote { - margin: 0 0 5px 0; -} - -#footnotes hr { - border: none; - border-top: 1px solid silver; - height: 1px; - text-align: left; - margin-left: 0; - width: 20%; - min-width: 100px; -} - - -@media print { - div#footer-badges { display: none; } -} - -div#toc { - margin-bottom: 2.5em; -} - -div#toctitle { - color: #527bbd; - font-family: sans-serif; - font-size: 1.1em; - font-weight: bold; - margin-top: 1.0em; - margin-bottom: 0.1em; -} - -div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 { - margin-top: 0; - margin-bottom: 0; -} -div.toclevel2 { - margin-left: 2em; - font-size: 0.9em; -} -div.toclevel3 { - margin-left: 4em; - font-size: 0.9em; -} -div.toclevel4 { - margin-left: 6em; - font-size: 0.9em; -} -#toc { - float: right; - font-family: sans-serif; - border: 1px solid #000; - margin: 0px 0px 20px 20px; - padding: 0px; - background: #f0f0f0; - font-size: 80%; -} - -#toc #hdr { - color:#ffffff; - background:#98b1c4; - text-align:center; - margin-bottom:5px; -} - -a img { - border: 0 -} - -#toc a:visited, #toc a:link { color:#000; text-decoration: none } -#toc a:hover { color:#00f; text-decoration: underline; } - -#toc .level2 { margin-left: 1em; margin-top: 2px; margin-bottom: 2px; text-decoration: underline; } -#toc .level3 { margin-left: 2em; font-size: 0.8em } - -.toplink { - float: right; - font-size: 50%; - cursor: pointer; -} - -#topnav {font-weight: bold} -#topnav a {font-weight: normal} diff --git a/3rdparty/uthash-1.9.3/doc/html/toc.css b/3rdparty/uthash-1.9.3/doc/html/toc.css deleted file mode 100644 index ae3363e..0000000 --- a/3rdparty/uthash-1.9.3/doc/html/toc.css +++ /dev/null @@ -1,35 +0,0 @@ -#toc { - float: right; - font-family: sans-serif; - border: 1px solid #000; - margin: 0px 0px 20px 20px; - padding: 0px; - background: #f0f0f0; - font-size: 80%; -} - -#toc #hdr { - color:#ffffff; - background:#98b1c4; - text-align:center; - margin-bottom:5px; -} - -a img { - border: 0 -} - -#toc a:visited, #toc a:link { color:#000; text-decoration: none } -#toc a:hover { color:#00f; text-decoration: underline; } - -#toc .level2 { margin-left: 1em; margin-top: 2px; margin-bottom: 2px; text-decoration: underline; } -#toc .level3 { margin-left: 2em; font-size: 0.8em } - -.toplink { - float: right; - font-size: 50%; - cursor: pointer; -} - -#topnav {font-weight: bold} -#topnav a {font-weight: normal} diff --git a/3rdparty/uthash-1.9.3/doc/html/userguide.html b/3rdparty/uthash-1.9.3/doc/html/userguide.html deleted file mode 100644 index bc7c250..0000000 --- a/3rdparty/uthash-1.9.3/doc/html/userguide.html +++ /dev/null @@ -1,1941 +0,0 @@ - - - - - -uthash User Guide - - - - - - - -
-
-
-uthash at SourceForge.net -
- sf.net summary page - >> uthash home - >> User Guide - [View PDF] -
-
-
-

A hash in C

-
-
- -

This document is written for C programmers. Since you’re reading this, chances -are that you know a hash is used for looking up items using a key. In scripting -languages like Perl, hashes are used all the time. In C, hashes don’t exist in -the language itself. This software provides a hash table for C structures.

-

What can it do?

-

This software supports these operations on items in a hash table:

-
    -
  1. -

    -add -

    -
  2. -
  3. -

    -find -

    -
  4. -
  5. -

    -delete -

    -
  6. -
  7. -

    -count -

    -
  8. -
  9. -

    -iterate -

    -
  10. -
  11. -

    -sort -

    -
  12. -
  13. -

    -select (explained later) -

    -
  14. -
-

Is it fast?

-

Add, find and delete are normally constant-time operations. This is influenced -by your key domain and the hash function.

-

This hash aims to be minimalistic and efficient. It’s around 900 lines of C. -It inlines automatically because it’s implemented as macros. It’s fast as long -as the hash function is suited to your keys. You can use the default hash -function, or easily compare performance and choose from among several other -built-in hash functions.

-

Is it a library?

-

No, it’s just a single header file: uthash.h. All you need to do is copy -the header file into your project, and:

-
-
-
#include "uthash.h"
-
-

Since uthash is a header file only, there is no library code to link against.

-

C/C++ and platforms

-

This software can be used in C and C++ programs. It has been tested on:

-
    -
  • -

    -Linux -

    -
  • -
  • -

    -Mac OS X -

    -
  • -
  • -

    -Windows using Visual Studio 2008 and 2010 -

    -
  • -
  • -

    -Solaris -

    -
  • -
  • -

    -OpenBSD -

    -
  • -
  • -

    -FreeBSD -

    -
  • -
-

Test suite

-

To run the test suite, look in the tests directory and either run make on -Unix platforms, or on Windows run the "do_tests_win32.cmd" batch file (if you -have Visual Studio 2008 or 2010 installed in a non-standard location you may -have to edit the batch file).

-

BSD licensed

-

This software is made available under the -revised BSD license. -It is free and open source.

-

Obtaining uthash

-

Please follow the link to download on the -uthash website at http://uthash.sourceforge.net.

-

Getting help

- -

Resources

-

Users of uthash may wish to follow the news feed for information about new -releases. Also, there are some extra bonus headers included with uthash.

-
-
-News -
-
-

- The author has a news feed for software updates -(RSS) -. -

-
-
-Extras included with uthash -
-
-

- uthash ships with these "extras"-- independent headers similar to uthash. - First utlist.h provides linked list macros for C structures. - Second, utarray.h implements dynamic arrays using macros. - Third, utstring.h implements a basic dynamic string. -

-
-
-

Who’s using it?

-

Since releasing uthash in 2006, it has been downloaded thousands of times, -incorporated into commercial software, academic research, and into other -open-source software.

-
-

Your structure

-
-

In uthash, a hash table is comprised of structures. Each structure represents a -key-value association. One or more of the structure fields constitute the key. -The structure pointer itself is the value.

-
-
Defining a structure that can be hashed
-
-
#include "uthash.h"
-
-struct my_struct {
-    int id;                    /* key */
-    char name[10];
-    UT_hash_handle hh;         /* makes this structure hashable */
-};
-
-

Note that, in uthash, your structure will never be moved or copied into another -location when you add it into a hash table. This means that you can keep other -data structures that safely point to your structure-- regardless of whether you -add or delete it from a hash table during your program’s lifetime.

-

The key

-

There are no restrictions on the data type or name of the key field. The key -can also comprise multiple contiguous fields, having any names and data types.

-
-
-

Unique keys

-

As with any hash, every item must have a unique key. Your application must -enforce key uniqueness. Before you add an item to the hash table, you must -first know (if in doubt, check!) that the key is not already in use. You -can check whether a key already exists in the hash table using HASH_FIND.

-

The hash handle

-

The UT_hash_handle field must be present in your structure. It is used for -the internal bookkeeping that makes the hash work. It does not require -initialization. It can be named anything, but you can simplify matters by -naming it hh. This allows you to use the easier "convenience" macros to add, -find and delete items.

-
-

Hash operations

-
-

This section introduces the uthash macros by example. For a more succinct -listing, see Macro Reference.

-
-
-

Declare the hash

-

Your hash must be declared as a NULL-initialized pointer to your structure.

-
-
-
struct my_struct *users = NULL;    /* important! initialize to NULL */
-
-

Add item

-

Allocate and initialize your structure as you see fit. The only aspect -of this that matters to uthash is that your key must be initialized to -a unique value. Then call HASH_ADD. (Here we use the convenience macro -HASH_ADD_INT, which offers simplified usage for keys of type int).

-
-
Add an item to a hash
-
-
void add_user(int user_id, char *name) {
-    struct my_struct *s;
-
-    s = malloc(sizeof(struct my_struct));
-    s->id = user_id;
-    strcpy(s->name, name);
-    HASH_ADD_INT( users, id, s );  /* id: name of key field */
-}
-
-

The first parameter to HASH_ADD_INT is the hash table, and the -second parameter is the name of the key field. Here, this is id. The -last parameter is a pointer to the structure being added.

-
-
-

Key must not be modified while in-use

-

Once a structure has been added to the hash, do not change the value of its key. -Instead, delete the item from the hash, change the key, and then re-add it.

-

Find item

-

To look up a structure in a hash, you need its key. Then call HASH_FIND. -(Here we use the convenience macro HASH_FIND_INT for keys of type int).

-
-
Find a structure using its key
-
-
struct my_struct *find_user(int user_id) {
-    struct my_struct *s;
-
-    HASH_FIND_INT( users, &user_id, s );  /* s: output pointer */
-    return s;
-}
-
-

Here, the hash table is users, and &user_id points to the key (an integer -in this case). Last, s is the output variable of HASH_FIND_INT. The -final result is that s points to the structure with the given key, or -is NULL if the key wasn’t found in the hash.

-
- - - -
-
Note
-
The middle argument is a pointer to the key. You can’t pass a literal key -value to HASH_FIND. Instead assign the literal value to a variable, and pass -a pointer to the variable.
-
-

Delete item

-

To delete a structure from a hash, you must have a pointer to it. (If you only -have the key, first do a HASH_FIND to get the structure pointer).

-
-
Delete an item from a hash
-
-
void delete_user(struct my_struct *user) {
-    HASH_DEL( users, user);  /* user: pointer to deletee */
-    free(user);              /* optional; it's up to you! */
-}
-
-

Here again, users is the hash table, and user is a pointer to the -structure we want to remove from the hash.

-

uthash never frees your structure

-

Deleting a structure just removes it from the hash table-- it doesn’t free -it. The choice of when to free your structure is entirely up to you; uthash -will never free your structure.

-

Delete can change the pointer

-

The hash table pointer (which initially points to the first item added to the -hash) can change in response to HASH_DEL (i.e. if you delete the first item -in the hash table).

-

Iterative deletion

-

The HASH_ITER macro is a deletion-safe iteration construct which expands -to a simple for loop.

-
-
Delete all items from a hash
-
-
void delete_all() {
-  struct my_struct *current_user, *tmp;
-
-  HASH_ITER(hh, users, current_user, tmp) {
-    HASH_DEL(users,current_user);  /* delete; users advances to next */
-    free(current_user);            /* optional- if you want to free  */
-  }
-}
-
-

All-at-once deletion

-

If you only want to delete all the items, but not free them or do any -per-element clean up, you can do this more efficiently in a single operation:

-
-
-
HASH_CLEAR(hh,users);
-
-

Afterward, the list head (here, users) will be set to NULL.

-

Count items

-

The number of items in the hash table can be obtained using HASH_COUNT:

-
-
Count of items in the hash table
-
-
unsigned int num_users;
-num_users = HASH_COUNT(users);
-printf("there are %u users\n", num_users);
-
-

Incidentally, this works even the list (users, here) is NULL, in -which case the count is 0.

-

Iterating and sorting

-

You can loop over the items in the hash by starting from the beginning and -following the hh.next pointer.

-
-
Iterating over all the items in a hash
-
-
void print_users() {
-    struct my_struct *s;
-
-    for(s=users; s != NULL; s=s->hh.next) {
-        printf("user id %d: name %s\n", s->id, s->name);
-    }
-}
-
-

There is also an hh.prev pointer you could use to iterate backwards through -the hash, starting from any known item.

-

Deletion-safe iteration

-

In the example above, it would not be safe to delete and free s in the body -of the for loop, (because s is derefenced each time the loop iterates). -This is easy to rewrite correctly (by copying the s->hh.next pointer to a -temporary variable before freeing s), but it comes up often enough that a -deletion-safe iteration macro, HASH_ITER, is included. It expands to a -for-loop header. Here is how it could be used to rewrite the last example:

-
-
-
struct my_struct *s, *tmp;
-
-
-
-
HASH_ITER(hh, users, s, tmp) {
-    printf("user id %d: name %s\n", s->id, s->name);
-    /* ... it is safe to delete and free s here */
-}
-
-
-
-

If you’re using uthash in a C++ program, you need an extra cast on the for -iterator, e.g., s=(struct my_struct*)s->hh.next.

-

Sorted iteration

-

The items in the hash are, by default, traversed in the order they were added -("insertion order") when you follow the hh.next pointer. But you can sort -the items into a new order using HASH_SORT. E.g.,

-
-
-
HASH_SORT( users, name_sort );
-
-

The second argument is a pointer to a comparison function. It must accept two -arguments which are pointers to two items to compare. Its return value should -be less than zero, zero, or greater than zero, if the first item sorts before, -equal to, or after the second item, respectively. (Just like strcmp).

-
-
Sorting the items in the hash
-
-
int name_sort(struct my_struct *a, struct my_struct *b) {
-    return strcmp(a->name,b->name);
-}
-
-int id_sort(struct my_struct *a, struct my_struct *b) {
-    return (a->id - b->id);
-}
-
-void sort_by_name() {
-    HASH_SORT(users, name_sort);
-}
-
-void sort_by_id() {
-    HASH_SORT(users, id_sort);
-}
-
-

When the items in the hash are sorted, the first item may change position. In -the example above, users may point to a different structure after calling -HASH_SORT.

-

A complete example

-

We’ll repeat all the code and embellish it with a main() function to form a -working example.

-

If this code was placed in a file called example.c in the same directory as -uthash.h, it could be compiled and run like this:

-
-
-
cc -o example example.c
-./example
-
-

Follow the prompts to try the program, and type Ctrl-C when done.

-
-
A complete program (part 1 of 2)
-
-
#include <stdio.h>   /* gets */
-#include <stdlib.h>  /* atoi, malloc */
-#include <string.h>  /* strcpy */
-#include "uthash.h"
-
-struct my_struct {
-    int id;                    /* key */
-    char name[10];
-    UT_hash_handle hh;         /* makes this structure hashable */
-};
-
-struct my_struct *users = NULL;
-
-void add_user(int user_id, char *name) {
-    struct my_struct *s;
-
-    s = malloc(sizeof(struct my_struct));
-    s->id = user_id;
-    strcpy(s->name, name);
-    HASH_ADD_INT( users, id, s );  /* id: name of key field */
-}
-
-struct my_struct *find_user(int user_id) {
-    struct my_struct *s;
-
-    HASH_FIND_INT( users, &user_id, s );  /* s: output pointer */
-    return s;
-}
-
-void delete_user(struct my_struct *user) {
-    HASH_DEL( users, user);  /* user: pointer to deletee */
-    free(user);
-}
-
-void delete_all() {
-  struct my_struct *current_user, *tmp;
-
-  HASH_ITER(hh, users, current_user, tmp) {
-    HASH_DEL(users,current_user);  /* delete it (users advances to next) */
-    free(current_user);            /* free it */
-  }
-}
-
-void print_users() {
-    struct my_struct *s;
-
-    for(s=users; s != NULL; s=s->hh.next) {
-        printf("user id %d: name %s\n", s->id, s->name);
-    }
-}
-
-int name_sort(struct my_struct *a, struct my_struct *b) {
-    return strcmp(a->name,b->name);
-}
-
-int id_sort(struct my_struct *a, struct my_struct *b) {
-    return (a->id - b->id);
-}
-
-
-
A complete program (part 2 of 2)
-
-
void sort_by_name() {
-    HASH_SORT(users, name_sort);
-}
-
-void sort_by_id() {
-    HASH_SORT(users, id_sort);
-}
-
-int main(int argc, char *argv[]) {
-    char in[10];
-    int id=1;
-    struct my_struct *s;
-    unsigned num_users;
-
-    while (1) {
-        printf("1. add user\n");
-        printf("2. find user\n");
-        printf("3. delete user\n");
-        printf("4. delete all users\n");
-        printf("5. sort items by name\n");
-        printf("6. sort items by id\n");
-        printf("7. print users\n");
-        printf("8. count users\n");
-        gets(in);
-        switch(atoi(in)) {
-            case 1:
-                printf("name?\n");
-                add_user(id++, gets(in));
-                break;
-            case 2:
-                printf("id?\n");
-                s = find_user(atoi(gets(in)));
-                printf("user: %s\n", s ? s->name : "unknown");
-                break;
-            case 3:
-                printf("id?\n");
-                s = find_user(atoi(gets(in)));
-                if (s) delete_user(s);
-                else printf("id unknown\n");
-                break;
-            case 4:
-                delete_all();
-                break;
-            case 5:
-                sort_by_name();
-                break;
-            case 6:
-                sort_by_id();
-                break;
-            case 7:
-                print_users();
-                break;
-            case 8:
-                num_users=HASH_COUNT(users);
-                printf("there are %u users\n", num_users);
-                break;
-        }
-    }
-}
-
-

This program is included in the distribution in tests/example.c. You can run -make example in that directory to compile it easily.

-
-

Standard key types

-
-

This section goes into specifics of how to work with different kinds of keys. -You can use nearly any type of key-- integers, strings, pointers, structures, etc.

-
- - - -
-
Note
-
-
A note about float
-

You can use floating point keys. This comes with the same caveats as with any -program that tests floating point equality. In other words, even the tiniest -difference in two floating point numbers makes them distinct keys.

-
-
-

Integer keys

-

The preceding examples demonstrated use of integer keys. To recap, use the -convenience macros HASH_ADD_INT and HASH_FIND_INT for structures with -integer keys. (The other operations such as HASH_DELETE and HASH_SORT are -the same for all types of keys).

-

String keys

-

If your structure has a string key, the operations to use depend on whether your -structure points to the key (char *) or the string resides within the -structure (char a[10]). This distinction is important. As we’ll see below, -you need to use HASH_ADD_KEYPTR when your structure points to a key (that is, -the key itself is outside of the structure); in contrast, use HASH_ADD_STR -for a string key that is contained within your structure.

-
- - - -
-
Note
-
-
char[ ] vs. char*
-

The string is within the structure in the first example below-- name is a -char[10] field. In the second example, the key is outside of the -structure-- name is a char *. So the first example uses HASH_ADD_STR but -the second example uses HASH_ADD_KEYPTR. For information on this macro, see -the Macro reference.

-
-
-

String within structure

-
-
A string-keyed hash (string within structure)
-
-
#include <string.h>  /* strcpy */
-#include <stdlib.h>  /* malloc */
-#include <stdio.h>   /* printf */
-#include "uthash.h"
-
-struct my_struct {
-    char name[10];             /* key (string is WITHIN the structure) */
-    int id;
-    UT_hash_handle hh;         /* makes this structure hashable */
-};
-
-
-int main(int argc, char *argv[]) {
-    char **n, *names[] = { "joe", "bob", "betty", NULL };
-    struct my_struct *s, *users = NULL;
-    int i=0;
-
-    for (n = names; *n != NULL; n++) {
-        s = malloc(sizeof(struct my_struct));
-        strcpy(s->name, *n);
-        s->id = i++;
-        HASH_ADD_STR( users, name, s );
-    }
-
-    HASH_FIND_STR( users, "betty", s);
-    if (s) printf("betty's id is %d\n", s->id);
-}
-
-

This example is included in the distribution in tests/test15.c. It prints:

-
-
-
betty's id is 2
-
-

String pointer in structure

-

Now, here is the same example but using a char * key instead of char [ ]:

-
-
A string-keyed hash (structure points to string)
-
-
#include <string.h>  /* strcpy */
-#include <stdlib.h>  /* malloc */
-#include <stdio.h>   /* printf */
-#include "uthash.h"
-
-struct my_struct {
-    char *name;                /* key (structure POINTS TO string */
-    int id;
-    UT_hash_handle hh;         /* makes this structure hashable */
-};
-
-
-int main(int argc, char *argv[]) {
-    char **n, *names[] = { "joe", "bob", "betty", NULL };
-    struct my_struct *s, *users = NULL;
-    int i=0;
-
-    for (n = names; *n != NULL; n++) {
-        s = (struct my_struct*)malloc(sizeof(struct my_struct));
-        s->name = *n;
-        s->id = i++;
-        HASH_ADD_KEYPTR( hh, users, s->name, strlen(s->name), s );
-    }
-
-    HASH_FIND_STR( users, "betty", s);
-    if (s) printf("betty's id is %d\n", s->id);
-   return 0;
-}
-
-

Pointer keys

-

Your key can be a pointer. To be very clear, this means the pointer itself -can be the key (in contrast, if the thing pointed to is the key, this is a -different use case handled by HASH_ADD_KEYPTR).

-

Here is a simple example where a structure has a pointer member, called key.

-
-
A pointer key
-
-
#include <stdio.h>
-#include <stdlib.h>
-#include "uthash.h"
-
-typedef struct {
-  void *key;
-  int i;
-  UT_hash_handle hh;
-} el_t;
-
-el_t *hash = NULL;
-char *someaddr = NULL;
-
-int main() {
-  el_t *d;
-  el_t *e = (el_t*)malloc(sizeof(el_t));
-  if (!e) return -1;
-  e->key = (void*)someaddr;
-  e->i = 1;
-  HASH_ADD_PTR(hash,key,e);
-  HASH_FIND_PTR(hash, &someaddr, d);
-  if (d) printf("found\n");
-  free(e);
-  return 0;
-}
-
-

Structure keys

-

Your key field can have any data type. To uthash, it is just a sequence of -bytes. Therefore, even a nested structure can be used as a key. We’ll use the -general macros HASH_ADD and HASH_FIND to demonstrate.

-
- - - -
-
Note
-
Structures contain padding (wasted internal space used to fulfill -alignment requirements for the members of the structure). These padding bytes -must be zeroed before adding an item to the hash or looking up an item. -Therefore always zero the whole structure before setting the members of -interest. The example below does this-- see the two calls to memset.
-
-
-
A key which is a structure
-
-
#include <stdlib.h>
-#include <stdio.h>
-#include "uthash.h"
-
-typedef struct {   /* this structure will be our key */
-  char a;
-  int b;
-} record_key_t;
-
-typedef struct {  /* the hash is comprised of these */
-    record_key_t key;
-    /* ... other data ... */
-    UT_hash_handle hh;
-} record_t;
-
-int main(int argc, char *argv[]) {
-    record_t l, *p, *r, *records = NULL;
-
-    r = (record_t*)malloc( sizeof(record_t) );
-    memset(r, 0, sizeof(record_t)); /* zero fill! */
-    r->key.a = 'a';
-    r->key.b = 1;
-    HASH_ADD(hh, records, key, sizeof(record_key_t), r);
-
-    memset(&l, 0, sizeof(record_t)); /* zero fill! */
-    l.key.a = 'a';
-    l.key.b = 1;
-    HASH_FIND(hh, records, &l.key, sizeof(record_key_t), p);
-
-    if (p) printf("found %c %d\n", p->key.a, p->key.b);
-    return 0;
-}
-
-

This usage is nearly the same as use of a compound key explained below.

-

Note that the general macros require the name of the UT_hash_handle to be -passed as the first argument (here, this is hh). The general macros are -documented in Macro Reference.

-
-

Advanced Topics

-
-

Compound keys

-

Your key can even comprise multiple contiguous fields.

-
-
A multi-field key
-
-
#include <stdlib.h>    /* malloc       */
-#include <stddef.h>    /* offsetof     */
-#include <stdio.h>     /* printf       */
-#include <string.h>    /* memset       */
-#include "uthash.h"
-
-#define UTF32 1
-
-typedef struct {
-  UT_hash_handle hh;
-  int len;
-  char encoding;      /* these two fields */
-  int text[];         /* comprise the key */
-} msg_t;
-
-int main(int argc, char *argv[]) {
-    int keylen;
-    msg_t *msg, *msgs = NULL;
-    struct { char encoding; int text[]; } *lookup_key;
-
-    int beijing[] = {0x5317, 0x4eac};   /* UTF-32LE for 北京 */
-
-    /* allocate and initialize our structure */
-    msg = malloc( sizeof(msg_t) + sizeof(beijing) );
-    memset(msg, 0, sizeof(msg_t)+sizeof(beijing)); /* zero fill */
-    msg->len = sizeof(beijing);
-    msg->encoding = UTF32;
-    memcpy(msg->text, beijing, sizeof(beijing));
-
-    /* calculate the key length including padding, using formula */
-    keylen =   offsetof(msg_t, text)       /* offset of last key field */
-             + sizeof(beijing)             /* size of last key field */
-             - offsetof(msg_t, encoding);  /* offset of first key field */
-
-    /* add our structure to the hash table */
-    HASH_ADD( hh, msgs, encoding, keylen, msg);
-
-    /* look it up to prove that it worked :-) */
-    msg=NULL;
-
-    lookup_key = malloc(sizeof(*lookup_key) + sizeof(beijing));
-    memset(lookup_key, 0, sizeof(*lookup_key) + sizeof(beijing));
-    lookup_key->encoding = UTF32;
-    memcpy(lookup_key->text, beijing, sizeof(beijing));
-    HASH_FIND( hh, msgs, &lookup_key->encoding, keylen, msg );
-    if (msg) printf("found \n");
-    free(lookup_key);
-}
-
-

This example is included in the distribution in tests/test22.c.

-

If you use multi-field keys, recognize that the compiler pads adjacent fields -(by inserting unused space between them) in order to fulfill the alignment -requirement of each field. For example a structure containing a char followed -by an int will normally have 3 "wasted" bytes of padding after the char, in -order to make the int field start on a multiple-of-4 address (4 is the length -of the int).

-
-
-

When dealing with a multi-field key, you must zero-fill your structure before -HASH_ADD'ing it to a hash table, or using its fields in a HASH_FIND key.

-

In the previous example, memset is used to initialize the structure by -zero-filling it. This zeroes out any padding between the key fields. If we -didn’t zero-fill the structure, this padding would contain random values. The -random values would lead to HASH_FIND failures; as two "identical" keys will -appear to mismatch if there are any differences within their padding.

-

Items in several hash tables

-

A structure can be added to more than one hash table. A few reasons you might do -this include:

-
    -
  • -

    -each hash table may use an alternative key; -

    -
  • -
  • -

    -each hash table may have its own sort order; -

    -
  • -
  • -

    -or you might simply use multiple hash tables for grouping purposes. E.g., - you could have users in an admin_users and a users hash table. -

    -
  • -
-

Your structure needs to have a UT_hash_handle field for each hash table to -which it might be added. You can name them anything. E.g.,

-
-
-
UT_hash_handle hh1, hh2;
-
-

Items with alternative keys

-

You might create a hash table keyed on an ID field, and another hash table keyed -on username (if usernames are unique). You can add the same user structure to -both hash tables (without duplication of the structure), allowing lookup of a -user structure by their name or ID. The way to achieve this is to have a -separate UT_hash_handle for each hash to which the structure may be added.

-
-
A structure with two alternative keys
-
-
struct my_struct {
-    int id;                    /* usual key */
-    char username[10];         /* alternative key */
-    UT_hash_handle hh1;        /* handle for first hash table */
-    UT_hash_handle hh2;        /* handle for second hash table */
-};
-
-

In the example above, the structure can now be added to two separate hash -tables. In one hash, id is its key, while in the other hash, username is -its key. (There is no requirement that the two hashes have different key -fields. They could both use the same key, such as id).

-

Notice the structure has two hash handles (hh1 and hh2). In the code -below, notice that each hash handle is used exclusively with a particular hash -table. (hh1 is always used with the users_by_id hash, while hh2 is -always used with the users_by_name hash table).

-
-
Two keys on a structure
-
-
    struct my_struct *users_by_id = NULL, *users_by_name = NULL, *s;
-    int i;
-    char *name;
-
-    s = malloc(sizeof(struct my_struct));
-    s->id = 1;
-    strcpy(s->username, "thanson");
-
-    /* add the structure to both hash tables */
-    HASH_ADD(hh1, users_by_id, id, sizeof(int), s);
-    HASH_ADD(hh2, users_by_name, username, strlen(s->username), s);
-
-    /* lookup user by ID in the "users_by_id" hash table */
-    i=1;
-    HASH_FIND(hh1, users_by_id, &i, sizeof(int), s);
-    if (s) printf("found id %d: %s\n", i, s->username);
-
-    /* lookup user by username in the "users_by_name" hash table */
-    name = "thanson";
-    HASH_FIND(hh2, users_by_name, name, strlen(name), s);
-    if (s) printf("found user %s: %d\n", name, s->id);
-
-

Several sort orders

-

It comes as no suprise that two hash tables can have different sort orders, but -this fact can also be used advantageously to sort the same items in several -ways. This is based on the ability to store a structure in several hash tables.

-

Extending the previous example, suppose we have many users. We have added each -user structure to the users_by_id hash table and the users_by_name hash table. -(To reiterate, this is done without the need to have two copies of each structure). -Now we can define two sort functions, then use HASH_SRT.

-
-
-
int sort_by_id(struct my_struct *a, struct my_struct *b) {
-  if (a->id == b->id) return 0;
-  return (a->id < b->id) ? -1 : 1;
-}
-
-
-
-
int sort_by_name(struct my_struct *a, struct my_struct *b) {
-  return strcmp(a->username,b->username);
-}
-
-
-
-
HASH_SRT(hh1, users_by_id, sort_by_id);
-HASH_SRT(hh2, users_by_name, sort_by_name);
-
-

Now iterating over the items in users_by_id will traverse them in id-order -while, naturally, iterating over users_by_name will traverse them in -name-order. The items are fully forward-and-backward linked in each order. -So even for one set of users, we might store them in two hash tables to provide -easy iteration in two different sort orders.

-

Bloom filter (faster misses)

-

Programs that generate a fair miss rate (HASH_FIND that result in NULL) may -benefit from the built-in Bloom filter support. This is disabled by default, -because programs that generate only hits would incur a slight penalty from it. -Also, programs that do deletes should not use the Bloom filter. While the -program would operate correctly, deletes diminish the benefit of the filter. -To enable the Bloom filter, simply compile with -DHASH_BLOOM=n like:

-
-
-
-DHASH_BLOOM=27
-
-

where the number can be any value up to 32 which determines the amount of memory -used by the filter, as shown below. Using more memory makes the filter more -accurate and has the potential to speed up your program by making misses bail -out faster.

-
- - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Table 1. Bloom filter sizes for selected values of n
n Bloom filter size (per hash table)

16

8 kilobytes

20

128 kilobytes

24

2 megabytes

28

32 megabytes

32

512 megabytes

-
-

Bloom filters are only a performance feature; they do not change the results of -hash operations in any way. The only way to gauge whether or not a Bloom filter -is right for your program is to test it. Reasonable values for the size of the -Bloom filter are 16-32 bits.

-

Select

-

An experimental select operation is provided that inserts those items from a -source hash that satisfy a given condition into a destination hash. This -insertion is done with somewhat more efficiency than if this were using -HASH_ADD, namely because the hash function is not recalculated for keys of the -selected items. This operation does not remove any items from the source hash. -Rather the selected items obtain dual presence in both hashes. The destination -hash may already have items in it; the selected items are added to it. In order -for a structure to be usable with HASH_SELECT, it must have two or more hash -handles. (As described here, a structure can exist in many -hash tables at the same time; it must have a separate hash handle for each one).

-
-
-
user_t *users=NULL, *admins=NULL; /* two hash tables */
-
-
-
-
typedef struct {
-    int id;
-    UT_hash_handle hh;  /* handle for users hash */
-    UT_hash_handle ah;  /* handle for admins hash */
-} user_t;
-
-

Now suppose we have added some users, and want to select just the administrator -users who have id’s less than 1024.

-
-
-
#define is_admin(x) (((user_t*)x)->id < 1024)
-HASH_SELECT(ah,admins,hh,users,is_admin);
-
-

The first two parameters are the destination hash handle and hash table, the -second two parameters are the source hash handle and hash table, and the last -parameter is the select condition. Here we used a macro is_admin() but we -could just as well have used a function.

-
-
-
int is_admin(void *userv) {
-  user_t *user = (user_t*)userv;
-  return (user->id < 1024) ? 1 : 0;
-}
-
-

If the select condition always evaluates to true, this operation is -essentially a merge of the source hash into the destination hash. Of course, -the source hash remains unchanged under any use of HASH_SELECT. It only adds -items to the destination hash selectively.

-

The two hash handles must differ. An example of using HASH_SELECT is included -in tests/test36.c.

-

Built-in hash functions

-

Internally, a hash function transforms a key into a bucket number. You don’t -have to take any action to use the default hash function, currently Jenkin’s.

-

Some programs may benefit from using another of the built-in hash functions. -There is a simple analysis utility included with uthash to help you determine -if another hash function will give you better performance.

-

You can use a different hash function by compiling your program with --DHASH_FUNCTION=HASH_xyz where xyz is one of the symbolic names listed -below. E.g.,

-
-
-
cc -DHASH_FUNCTION=HASH_BER -o program program.c
-
-
- - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Table 2. Built-in hash functions
Symbol Name

JEN

Jenkins (default)

BER

Bernstein

SAX

Shift-Add-Xor

OAT

One-at-a-time

FNV

Fowler/Noll/Vo

SFH

Paul Hsieh

MUR

MurmurHash (see note)

-
-
- - - -
-
Note
-
-
MurmurHash
-

A special symbol must be defined if you intend to use MurmurHash. To use it, add --DHASH_USING_NO_STRICT_ALIASING to your CFLAGS. And, if you are using -the gcc compiler with optimization, add -fno-strict-aliasing to your CFLAGS.

-
-
-

Which hash function is best?

-

You can easily determine the best hash function for your key domain. To do so, -you’ll need to run your program once in a data-collection pass, and then run -the collected data through an included analysis utility.

-

First you must build the analysis utility. From the top-level directory,

-
-
-
cd tests/
-make
-
-

We’ll use test14.c to demonstrate the data-collection and analysis steps -(here using sh syntax to redirect file descriptor 3 to a file):

-
-
Using keystats
-
-
% cc -DHASH_EMIT_KEYS=3 -I../src -o test14 test14.c
-% ./test14 3>test14.keys
-% ./keystats test14.keys
-fcn  ideal%     #items   #buckets  dup%  fl   add_usec  find_usec  del-all usec
----  ------ ---------- ---------- -----  -- ---------- ----------  ------------
-SFH   91.6%       1219        256    0%  ok         92        131            25
-FNV   90.3%       1219        512    0%  ok        107         97            31
-SAX   88.7%       1219        512    0%  ok        111        109            32
-OAT   87.2%       1219        256    0%  ok         99        138            26
-JEN   86.7%       1219        256    0%  ok         87        130            27
-BER   86.2%       1219        256    0%  ok        121        129            27
-
-
- - - -
-
Note
-
The number 3 in -DHASH_EMIT_KEYS=3 is a file descriptor. Any file descriptor -that your program doesn’t use for its own purposes can be used instead of 3. -The data-collection mode enabled by -DHASH_EMIT_KEYS=x should not be used in -production code.
-
-

Usually, you should just pick the first hash function that is listed. Here, this -is SFH. This is the function that provides the most even distribution for -your keys. If several have the same ideal%, then choose the fastest one -according to the find_usec column.

-

keystats column reference

-
-
-fcn -
-
-

- symbolic name of hash function -

-
-
-ideal% -
-
-

- The percentage of items in the hash table which can be looked up within an - ideal number of steps. (Further explained below). -

-
-
-#items -
-
-

- the number of keys that were read in from the emitted key file -

-
-
-#buckets -
-
-

- the number of buckets in the hash after all the keys were added -

-
-
-dup% -
-
-

- the percent of duplicate keys encountered in the emitted key file. - Duplicates keys are filtered out to maintain key uniqueness. (Duplicates - are normal. For example, if the application adds an item to a hash, - deletes it, then re-adds it, the key is written twice to the emitted file.) -

-
-
-flags -
-
-

- this is either ok, or nx (noexpand) if the expansion inhibited flag is - set, described in Expansion internals. It is not recommended - to use a hash function that has the noexpand flag set. -

-
-
-add_usec -
-
-

- the clock time in microseconds required to add all the keys to a hash -

-
-
-find_usec -
-
-

- the clock time in microseconds required to look up every key in the hash -

-
-
-del-all usec -
-
-

- the clock time in microseconds required to delete every item in the hash -

-
-
-

ideal%

-
-
-

hashscan

-
- - - -
-
Note
-
This utility is only available on Linux, and on FreeBSD (8.1 and up).
-
-

A utility called hashscan is included in the tests/ directory. It -is built automatically when you run make in that directory. This tool -examines a running process and reports on the uthash tables that it finds in -that program’s memory. It can also save the keys from each table in a format -that can be fed into keystats.

-

Here is an example of using hashscan. First ensure that it is built:

-
-
-
cd tests/
-make
-
-

Since hashscan needs a running program to inspect, we’ll start up a simple -program that makes a hash table and then sleeps as our test subject:

-
-
-
./test_sleep &
-pid: 9711
-
-

Now that we have a test program, let’s run hashscan on it:

-
-
-
./hashscan 9711
-Address            ideal    items  buckets mc fl bloom/sat fcn keys saved to
------------------- ----- -------- -------- -- -- --------- --- -------------
-0x862e038            81%    10000     4096 11 ok 16    14% JEN
-
-

If we wanted to copy out all its keys for external analysis using keystats, -add the -k flag:

-
-
-
./hashscan -k 9711
-Address            ideal    items  buckets mc fl bloom/sat fcn keys saved to
------------------- ----- -------- -------- -- -- --------- --- -------------
-0x862e038            81%    10000     4096 11 ok 16    14% JEN /tmp/9711-0.key
-
-

Now we could run ./keystats /tmp/9711-0.key to analyze which hash function -has the best characteristics on this set of keys.

-

hashscan column reference

-
-
-Address -
-
-

- virtual address of the hash table -

-
-
-ideal -
-
-

- The percentage of items in the table which can be looked up within an ideal - number of steps. See [ideal] in the keystats section. -

-
-
-items -
-
-

- number of items in the hash table -

-
-
-buckets -
-
-

- number of buckets in the hash table -

-
-
-mc -
-
-

- the maximum chain length found in the hash table (uthash usually tries to - keep fewer than 10 items in each bucket, or in some cases a multiple of 10) -

-
-
-fl -
-
-

- flags (either ok, or NX if the expansion-inhibited flag is set) -

-
-
-bloom/sat -
-
-

- if the hash table uses a Bloom filter, this is the size (as a power of two) - of the filter (e.g. 16 means the filter is 2^16 bits in size). The second - number is the "saturation" of the bits expressed as a percentage. The lower - the percentage, the more potential benefit to identify cache misses quickly. -

-
-
-fcn -
-
-

- symbolic name of hash function -

-
-
-keys saved to -
-
-

- file to which keys were saved, if any -

-
-
-
-
-

Expansion internals

-

Internally this hash manages the number of buckets, with the goal of having -enough buckets so that each one contains only a small number of items.

-
-
-

Normal expansion

-

This hash attempts to keep fewer than 10 items in each bucket. When an item is -added that would cause a bucket to exceed this number, the number of buckets in -the hash is doubled and the items are redistributed into the new buckets. In an -ideal world, each bucket will then contain half as many items as it did before.

-

Bucket expansion occurs automatically and invisibly as needed. There is -no need for the application to know when it occurs.

-
Per-bucket expansion threshold
-

Normally all buckets share the same threshold (10 items) at which point bucket -expansion is triggered. During the process of bucket expansion, uthash can -adjust this expansion-trigger threshold on a per-bucket basis if it sees that -certain buckets are over-utilized.

-

When this threshold is adjusted, it goes from 10 to a multiple of 10 (for that -particular bucket). The multiple is based on how many times greater the actual -chain length is than the ideal length. It is a practical measure to reduce -excess bucket expansion in the case where a hash function over-utilizes a few -buckets but has good overall distribution. However, if the overall distribution -gets too bad, uthash changes tactics.

-

Inhibited expansion

-

You usually don’t need to know or worry about this, particularly if you used -the keystats utility during development to select a good hash for your keys.

-

A hash function may yield an uneven distribution of items across the buckets. -In moderation this is not a problem. Normal bucket expansion takes place as -the chain lengths grow. But when significant imbalance occurs (because the hash -function is not well suited to the key domain), bucket expansion may be -ineffective at reducing the chain lengths.

-

Imagine a very bad hash function which always puts every item in bucket 0. No -matter how many times the number of buckets is doubled, the chain length of -bucket 0 stays the same. In a situation like this, the best behavior is to -stop expanding, and accept O(n) lookup performance. This is what uthash -does. It degrades gracefully if the hash function is ill-suited to the keys.

-

If two consecutive bucket expansions yield ideal% values below 50%, uthash -inhibits expansion for that hash table. Once set, the bucket expansion -inhibited flag remains in effect as long as the hash has items in it. -Inhibited expansion may cause HASH_FIND to exhibit worse than constant-time -performance.

-

Hooks

-

You don’t need to use these hooks- they are only here if you want to modify -the behavior of uthash. Hooks can be used to change how uthash allocates -memory, and to run code in response to certain internal events.

-

malloc/free

-

By default this hash implementation uses malloc and free to manage memory. -If your application uses its own custom allocator, this hash can use them too.

-
-
Specifying alternate memory management functions
-
-
#include "uthash.h"
-
-/* undefine the defaults */
-#undef uthash_malloc
-#undef uthash_free
-
-/* re-define, specifying alternate functions */
-#define uthash_malloc(sz) my_malloc(sz)
-#define uthash_free(ptr,sz) my_free(ptr)
-
-...
-
-

Notice that uthash_free receives two parameters. The sz parameter is for -convenience on embedded platforms that manage their own memory.

-

Out of memory

-

If memory allocation fails (i.e., the malloc function returned NULL), the -default behavior is to terminate the process by calling exit(-1). This can -be modified by re-defining the uthash_fatal macro.

-
-
-
#undef uthash_fatal
-#define uthash_fatal(msg) my_fatal_function(msg);
-
-

The fatal function should terminate the process or longjmp back to a safe -place. Uthash does not support "returning a failure" if memory cannot be -allocated.

-

Internal events

-

There is no need for the application to set these hooks or take action in -response to these events. They are mainly for diagnostic purposes.

-

These two hooks are "notification" hooks which get executed if uthash is -expanding buckets, or setting the bucket expansion inhibited flag. Normally -both of these hooks are undefined and thus compile away to nothing.

-
Expansion
-

There is a hook for the bucket expansion event.

-
-
Bucket expansion hook
-
-
#include "uthash.h"
-
-#undef uthash_expand_fyi
-#define uthash_expand_fyi(tbl) printf("expanded to %d buckets\n", tbl->num_buckets)
-
-...
-
-
Expansion-inhibition
-

This hook can be defined to code to execute in the event that uthash decides to -set the bucket expansion inhibited flag.

-
-
Bucket expansion inhibited hook
-
-
#include "uthash.h"
-
-#undef uthash_noexpand_fyi
-#define uthash_noexpand_fyi printf("warning: bucket expansion inhibited\n");
-
-...
-
-

Debug mode

-

If a program that uses this hash is compiled with -DHASH_DEBUG=1, a special -internal consistency-checking mode is activated. In this mode, the integrity -of the whole hash is checked following every add or delete operation. This is -for debugging the uthash software only, not for use in production code.

-

In the tests/ directory, running make debug will run all the tests in -this mode.

-

In this mode, any internal errors in the hash data structure will cause a -message to be printed to stderr and the program to exit.

-

The UT_hash_handle data structure includes next, prev, hh_next and -hh_prev fields. The former two fields determine the "application" ordering -(that is, insertion order-- the order the items were added). The latter two -fields determine the "bucket chain" order. These link the UT_hash_handles -together in a doubly-linked list that is a bucket chain.

-

Checks performed in -DHASH_DEBUG=1 mode:

-
    -
  • -

    -the hash is walked in its entirety twice: once in bucket order and a - second time in application order -

    -
  • -
  • -

    -the total number of items encountered in both walks is checked against the - stored number -

    -
  • -
  • -

    -during the walk in bucket order, each item’s hh_prev pointer is compared - for equality with the last visited item -

    -
  • -
  • -

    -during the walk in application order, each item’s prev pointer is compared - for equality with the last visited item -

    -
  • -
-
-
-

Thread safety

-

You can use uthash in a threaded program. But you must do the locking. Use a -read-write lock to protect against concurrent writes. It is ok to have -concurrent readers (since uthash 1.5).

-

For example using pthreads you can create an rwlock like this:

-
-
-
pthread_rwlock_t lock;
-if (pthread_rwlock_init(&lock,NULL) != 0) fatal("can't create rwlock");
-
-

Then, readers must acquire the read lock before doing any HASH_FIND calls or -before iterating over the hash elements:

-
-
-
if (pthread_rwlock_rdlock(&lock) != 0) fatal("can't get rdlock");
-HASH_FIND_INT(elts, &i, e);
-pthread_rwlock_unlock(&lock);
-
-

Writers must acquire the exclusive write lock before doing any update. Add, -delete, and sort are all updates that must be locked.

-
-
-
if (pthread_rwlock_wrlock(&lock) != 0) fatal("can't get wrlock");
-HASH_DEL(elts, e);
-pthread_rwlock_unlock(&lock);
-
-

If you prefer, you can use a mutex instead of a read-write lock, but this will -reduce reader concurrency to a single thread at a time.

-

An example program using uthash with a read-write lock is included in -tests/threads/test1.c.

-
-

Macro reference

-
-

Convenience macros

-

The convenience macros do the same thing as the generalized macros, but -require fewer arguments.

-

In order to use the convenience macros,

-
    -
  1. -

    -the structure’s UT_hash_handle field must be named hh, and -

    -
  2. -
  3. -

    -for add or find, the key field must be of type int or char[] or pointer -

    -
  4. -
-
- - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Table 3. Convenience macros
macro arguments

HASH_ADD_INT

(head, keyfield_name, item_ptr)

HASH_FIND_INT

(head, key_ptr, item_ptr)

HASH_ADD_STR

(head, keyfield_name, item_ptr)

HASH_FIND_STR

(head, key_ptr, item_ptr)

HASH_ADD_PTR

(head, keyfield_name, item_ptr)

HASH_FIND_PTR

(head, key_ptr, item_ptr)

HASH_DEL

(head, item_ptr)

HASH_SORT

(head, cmp)

HASH_COUNT

(head)

-
-

General macros

-

These macros add, find, delete and sort the items in a hash. You need to -use the general macros if your UT_hash_handle is named something other -than hh, or if your key’s data type isn’t int or char[].

-
- - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Table 4. General macros
macro arguments

HASH_ADD

(hh_name, head, keyfield_name, key_len, item_ptr)

HASH_ADD_KEYPTR

(hh_name, head, key_ptr, key_len, item_ptr)

HASH_FIND

(hh_name, head, key_ptr, key_len, item_ptr)

HASH_DELETE

(hh_name, head, item_ptr)

HASH_SRT

(hh_name, head, cmp)

HASH_CNT

(hh_name, head)

HASH_CLEAR

(hh_name, head)

HASH_SELECT

(dst_hh_name, dst_head, src_hh_name, src_head, condition)

HASH_ITER

(hh_name, head, item_ptr, tmp_item_ptr)

-
-
- - - -
-
Note
-
HASH_ADD_KEYPTR is used when the structure contains a pointer to the -key, rather than the key itself.
-
-

Argument descriptions

-
-
-hh_name -
-
-

- name of the UT_hash_handle field in the structure. Conventionally called - hh. -

-
-
-head -
-
-

- the structure pointer variable which acts as the "head" of the hash. So - named because it initially points to the first item that is added to the hash. -

-
-
-keyfield_name -
-
-

- the name of the key field in the structure. (In the case of a multi-field - key, this is the first field of the key). If you’re new to macros, it - might seem strange to pass the name of a field as a parameter. See - note. -

-
-
-key_len -
-
-

- the length of the key field in bytes. E.g. for an integer key, this is - sizeof(int), while for a string key it’s strlen(key). (For a - multi-field key, see the notes in this guide on calculating key length). -

-
-
-key_ptr -
-
-

- for HASH_FIND, this is a pointer to the key to look up in the hash - (since it’s a pointer, you can’t directly pass a literal value here). For - HASH_ADD_KEYPTR, this is the address of the key of the item being added. -

-
-
-item_ptr -
-
-

- pointer to the structure being added, deleted, or looked up, or the current - pointer during iteration. This is an input parameter for HASH_ADD and - HASH_DELETE macros, and an output parameter for HASH_FIND and - HASH_ITER. (When using HASH_ITER to iterate, tmp_item_ptr - is another variable of the same type as item_ptr, used internally). -

-
-
-cmp -
-
-

- pointer to comparison function which accepts two arguments (pointers to - items to compare) and returns an int specifying whether the first item - should sort before, equal to, or after the second item (like strcmp). -

-
-
-condition -
-
-

- a function or macro which accepts a single argument-- a void pointer to a - structure, which needs to be cast to the appropriate structure type. The - function or macro should return (or evaluate to) a non-zero value if the - structure should be "selected" for addition to the destination hash. -

-
-
-
-
-

- - - diff --git a/3rdparty/uthash-1.9.3/doc/html/userguide.pdf b/3rdparty/uthash-1.9.3/doc/html/userguide.pdf deleted file mode 120000 index 7eb72b0..0000000 --- a/3rdparty/uthash-1.9.3/doc/html/userguide.pdf +++ /dev/null @@ -1 +0,0 @@ -../pdf/userguide.pdf \ No newline at end of file diff --git a/3rdparty/uthash-1.9.3/doc/html/utarray.html b/3rdparty/uthash-1.9.3/doc/html/utarray.html deleted file mode 100644 index 1467711..0000000 --- a/3rdparty/uthash-1.9.3/doc/html/utarray.html +++ /dev/null @@ -1,534 +0,0 @@ - - - - - -utarray: dynamic array macros for C - - - - - -
-
-uthash at SourceForge.net -
- uthash home - >> utarray macros -
-
-
-

Introduction

-
-
- -

A set of general-purpose dynamic array macros for C structures are included with -uthash in utarray.h. To use these macros in your own C program, just -copy utarray.h into your source directory and use it in your programs.

-
-
-
#include "utarray.h"
-
-

The dynamic array supports basic operations such as push, pop, and erase on the -array elements. These array elements can be any simple datatype or structure. -The array operations are based loosely on the C++ STL vector methods.

-

Internally the dynamic array contains a contiguous memory region into which -the elements are copied. This buffer is grown as needed using realloc to -accomodate all the data that is pushed into it.

-

Download

-

To download the utarray.h header file, follow the link on the -uthash home page.

-

BSD licensed

-

This software is made available under the -revised BSD license. -It is free and open source.

-

Platforms

-

The utarray macros have been tested on:

-
    -
  • -

    -Linux, -

    -
  • -
  • -

    -Mac OS X, -

    -
  • -
  • -

    -Windows, using Visual Studio 2008 and Visual Studio 2010 -

    -
  • -
-
-

Usage

-
-

Declaration

-

The array itself has the data type UT_array, regardless of the type of -elements to be stored in it. It is declared like,

-
-
-
UT_array *nums;
-
-

New and free

-

The next step is to create the array using utarray_new. Later when you’re -done with the array, utarray_free will free it and all its elements.

-

Push, pop, etc

-

The central features of the utarray involve putting elements into it, taking -them out, and iterating over them. There are several operations -to pick from that deal with either single elements or ranges of elements at a -time. In the examples below we will use only the push operation to insert -elements.

-
-

Elements

-
-

Support for dynamic arrays of integers or strings is especially easy. These are -best shown by example:

-

Integers

-

This example makes a utarray of integers, pushes 0-9 into it, then prints it. -Lastly it frees it.

-
-
Integer elements
-
-
#include <stdio.h>
-#include "utarray.h"
-
-int main() {
-  UT_array *nums;
-  int i, *p;
-
-  utarray_new(nums,&ut_int_icd);
-  for(i=0; i < 10; i++) utarray_push_back(nums,&i);
-
-  for(p=(int*)utarray_front(nums);
-      p!=NULL;
-      p=(int*)utarray_next(nums,p)) {
-    printf("%d\n",*p);
-  }
-
-  utarray_free(nums);
-
-  return 0;
-}
-
-

The second argument to utarray_push_back is always a pointer to the type -(so a literal cannot be used). So for integers, it is an int*.

-

Strings

-

In this example we make a utarray of strings, push two strings into it, print -it and free it.

-
-
String elements
-
-
#include <stdio.h>
-#include "utarray.h"
-
-int main() {
-  UT_array *strs;
-  char *s, **p;
-
-  utarray_new(strs,&ut_str_icd);
-
-  s = "hello"; utarray_push_back(strs, &s);
-  s = "world"; utarray_push_back(strs, &s);
-  p = NULL;
-  while ( (p=(char**)utarray_next(strs,p))) {
-    printf("%s\n",*p);
-  }
-
-  utarray_free(strs);
-
-  return 0;
-}
-
-

In this example, since the element is a char*, we pass a pointer to it -(char**) as the second argument to utarray_push_back. Note that "push" makes -a copy of the source string and pushes that copy into the array.

-

About UT_icd

-

Arrays be made of any type of element, not just integers and strings. The -elements can be basic types or structures. Unless you’re dealing with integers -and strings (which use pre-defined ut_int_icd and ut_str_icd), you’ll need -to define a UT_icd helper structure. This structure contains everything that -utarray needs to initialize, copy or destruct elements.

-
-
-
typedef struct {
-    size_t sz;
-    init_f *init;
-    ctor_f *copy;
-    dtor_f *dtor;
-} UT_icd;
-
-

The three function pointers init, copy, and dtor have these prototypes:

-
-
-
typedef void (ctor_f)(void *dst, const void *src);
-typedef void (dtor_f)(void *elt);
-typedef void (init_f)(void *elt);
-
-

The sz is just the size of the element being stored in the array.

-

The init function will be invoked whenever utarray needs to initialize an -empty element. This only happens as a byproduct of utarray_resize or -utarray_extend_back. If init is NULL, it defaults to zero filling the -new element using memset.

-

The copy function is used whenever an element is copied into the array. -It is invoked during utarray_push_back, utarray_insert, utarray_inserta, -or utarray_concat. If copy is NULL, it defaults to a bitwise copy using -memcpy.

-

The dtor function is used to clean up an element that is being removed from -the array. It may be invoked due to utarray_resize, utarray_pop_back, -utarray_erase, utarray_clear, utarray_done or utarray_free. If the -elements need no cleanup upon destruction, dtor may be NULL.

-

Scalar types

-

The next example uses UT_icd with all its defaults to make a utarray of -long elements. This example pushes two longs, prints them, and frees the -array.

-
-
long elements
-
-
#include <stdio.h>
-#include "utarray.h"
-
-int main() {
-  UT_array *nums;
-  UT_icd long_icd = {sizeof(long), NULL, NULL, NULL };
-  long l, *p;
-  utarray_new(nums, &long_icd);
-
-  l=1; utarray_push_back(nums, &l);
-  l=2; utarray_push_back(nums, &l);
-
-  p=NULL;
-  while( (p=(long*)utarray_next(nums,p))) printf("%ld\n", *p);
-
-  utarray_free(nums);
-  return 0;
-}
-
-

Structures

-

Structures can be used as utarray elements. If the structure requires no -special effort to initialize, copy or destruct, we can use UT_icd with all -its defaults. This example shows a structure that consists of two integers. Here -we push two values, print them and free the array.

-
-
Structure (simple)
-
-
#include <stdio.h>
-#include "utarray.h"
-
-typedef struct {
-    int a;
-    int b;
-} intpair_t;
-
-int main() {
-
-  UT_array *pairs;
-  UT_icd intpair_icd = {sizeof(intpair_t), NULL, NULL, NULL};
-  intpair_t ip, *p;
-  utarray_new(pairs,&intpair_icd);
-
-  ip.a=1;  ip.b=2;  utarray_push_back(pairs, &ip);
-  ip.a=10; ip.b=20; utarray_push_back(pairs, &ip);
-
-  for(p=(intpair_t*)utarray_front(pairs);
-      p!=NULL;
-      p=(intpair_t*)utarray_next(pairs,p)) {
-    printf("%d %d\n", p->a, p->b);
-  }
-
-  utarray_free(pairs);
-  return 0;
-}
-
-

The real utility of UT_icd is apparent when the elements of the utarray are -structures that require special work to initialize, copy or destruct.

-

For example, when a structure contains pointers to related memory areas that -need to be copied when the structure is copied (and freed when the structure is -freed), we can use custom init, copy, and dtor members in the UT_icd.

-

Here we take an example of a structure that contains an integer and a string. -When this element is copied (such as when an element is pushed into the array), -we want to "deep copy" the s pointer (so the original element and the new -element point to their own copies of s). When an element is destructed, we -want to "deep free" its copy of s. Lastly, this example is written to work -even if s has the value NULL.

-
-
Structure (complex)
-
-
#include <stdio.h>
-#include <stdlib.h>
-#include "utarray.h"
-
-typedef struct {
-    int a;
-    char *s;
-} intchar_t;
-
-void intchar_copy(void *_dst, const void *_src) {
-  intchar_t *dst = (intchar_t*)_dst, *src = (intchar_t*)_src;
-  dst->a = src->a;
-  dst->s = src->s ? strdup(src->s) : NULL;
-}
-
-void intchar_dtor(void *_elt) {
-  intchar_t *elt = (intchar_t*)_elt;
-  if (elt->s) free(elt->s);
-}
-
-int main() {
-  UT_array *intchars;
-  UT_icd intchar_icd = {sizeof(intchar_t), NULL, intchar_copy, intchar_dtor};
-  intchar_t ic, *p;
-  utarray_new(intchars, &intchar_icd);
-
-  ic.a=1; ic.s="hello"; utarray_push_back(intchars, &ic);
-  ic.a=2; ic.s="world"; utarray_push_back(intchars, &ic);
-
-  p=NULL;
-  while( (p=(intchar_t*)utarray_next(intchars,p))) {
-    printf("%d %s\n", p->a, (p->s ? p->s : "null"));
-  }
-
-  utarray_free(intchars);
-  return 0;
-}
-
-
-

Reference

-
-

This table lists all the utarray operations. These are loosely based on the C++ -vector class.

-

Operations

-
- --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

utarray_new(UT_array *a, UT_icd *icd)

allocate a new array

utarray_free(UT_array *a)

free an allocated array

utarray_init(UT_array *a,UT_icd *icd)

init an array (non-alloc)

utarray_done(UT_array *a)

dispose of an array (non-allocd)

utarray_reserve(UT_array *a,int n)

ensure space available for n more elements

utarray_push_back(UT_array *a,void *p)

push element p onto a

utarray_pop_back(UT_array *a)

pop last element from a

utarray_extend_back(UT_array *a)

push empty element onto a

utarray_len(UT_array *a)

get length of a

utarray_eltptr(UT_array *a,int j)

get pointer of element from index

utarray_eltidx(UT_array *a,void *e)

get index of element from pointer

utarray_insert(UT_array *a,void *p, int j)

insert element p to index j

utarray_inserta(UT_array *a,UT_array *w, int j)

insert array w into array a at index j

utarray_resize(UT_array *dst,int num)

extend or shrink array to num elements

utarray_concat(UT_array *dst,UT_array *src)

copy src to end of dst array

utarray_erase(UT_array *a,int pos,int len)

remove len elements from a[pos]..a[pos+len-1]

utarray_clear(UT_array *a)

clear all elements from a, setting its length to zero

utarray_sort(UT_array *a,cmpfcn *cmp)

sort elements of a using comparison function

utarray_front(UT_array *a)

get first element of a

utarray_next(UT_array *a,void *e)

get element of a following e (front if e is NULL)

utarray_back(UT_array *a)

get last element of a

-
-

Notes

-
    -
  1. -

    -utarray_new and utarray_free are used to allocate a new array and free it, - while utarray_init and utarray_done can be used if the UT_array is already - allocated and just needs to be initialized or have its internal resources - freed. -

    -
  2. -
  3. -

    -utarray_reserve takes the "delta" of elements to reserve (not the total - desired capacity of the array-- this differs from the C++ STL "reserve" notion) -

    -
  4. -
  5. -

    -utarray_sort expects a comparison function having the usual strcmp -like - convention where it accepts two elements (a and b) and returns a negative - value if a precedes b, 0 if a and b sort equally, and positive if b precedes a. - This is an example of a comparison function: -

    -
    -
    -
    int intsort(const void *a,const void*b) {
    -    int _a = *(int*)a;
    -    int _b = *(int*)b;
    -    return _a - _b;
    -}
    -
    -
  6. -
  7. -

    -A pointer to a particular element (obtained using utarray_eltptr or - utarray_front, utarray_next, utarray_back) becomes invalid whenever - another element is inserted into the utarray. This is because the internal - memory management may need to realloc the element storage to a new address. - For this reason, it’s usually better to refer to an element by its integer - index in code whose duration may include element insertion. -

    -
  8. -
-
- - - diff --git a/3rdparty/uthash-1.9.3/doc/html/utlist.html b/3rdparty/uthash-1.9.3/doc/html/utlist.html deleted file mode 100644 index 4486a8c..0000000 --- a/3rdparty/uthash-1.9.3/doc/html/utlist.html +++ /dev/null @@ -1,436 +0,0 @@ - - - - - -utlist: linked list macros for C structures - - - - - - - -
-
-
-uthash at SourceForge.net -
- uthash home - >> utlist macros -
-
-
-

Introduction

-
-
- -

A set of general-purpose linked list macros for C structures are included with -uthash in utlist.h. To use these macros in your own C program, just -copy utlist.h into your source directory and use it in your programs.

-
-
-
#include "utlist.h"
-
-

These macros support the basic linked list operations: adding and deleting -elements, sorting them and iterating over them.

-

Download

-

To download the utlist.h header file, follow the link on the -uthash home page.

-

BSD licensed

-

This software is made available under the -revised BSD license. -It is free and open source.

-

Platforms

-

The utlist macros have been tested on:

-
    -
  • -

    -Linux, -

    -
  • -
  • -

    -Mac OS X, and -

    -
  • -
  • -

    -Windows, using Visual Studio 2008, Visual Studio 2010, or Cygwin/MinGW. -

    -
  • -
-
-

Using utlist

-
-

Types of lists

-

Three types of linked lists are supported:

-
    -
  • -

    -singly-linked lists, -

    -
  • -
  • -

    -doubly-linked lists, and -

    -
  • -
  • -

    -circular, doubly-linked lists -

    -
  • -
-

Efficiency

-

For all types of lists, prepending elements and deleting elements are -constant-time operations. Appending to a singly-linked list is an O(n) -operation but appending to a doubly-linked list is constant time using these -macros. (This is because, in the utlist implementation of the doubly-linked -list, the head element’s prev member points back to the list tail, even when -the list is non-circular). Sorting is an O(n log(n)) operation. Iteration -and searching are O(n) for all list types.

-

List elements

-

You can use any structure with these macros, as long as the structure -contains a next pointer. If you want to make a doubly-linked list, -the element also needs to have a prev pointer.

-
-
-
typedef struct {
-    char *name;
-    struct element *prev; /* needed for a doubly-linked list only */
-    struct element *next; /* needed for singly- or doubly-linked lists */
-} element;
-
-

You can name your structure anything. In the example above it is called element. -Within a particular list, all elements must be of the same type.

-

List head

-

The list head is simply a pointer to your element structure. You can name it -anything. It must be initialized to NULL.

-
-
-
element *head = NULL;
-
-

List operations

-

The lists support inserting or deleting elements, sorting the elements and -iterating over them.

-
- ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Singly-linked Doubly-linked Circular, doubly-linked

LL_PREPEND(head,add);

DL_PREPEND(head,add);

CDL_PREPEND(head,add;

LL_APPEND(head,add);

DL_APPEND(head,add);

LL_DELETE(head,del);

DL_DELETE(head,del);

CDL_DELETE(head,del);

LL_SORT(head,cmp);

DL_SORT(head,cmp);

CDL_SORT(head,cmp);

LL_FOREACH(head,elt) {…}

DL_FOREACH(head,elt) {…}

CDL_FOREACH(head,elt) {…}

LL_FOREACH_SAFE(head,elt,tmp) {…}

DL_FOREACH_SAFE(head,elt,tmp) {…}

CDL_FOREACH_SAFE(head,elt,tmp1,tmp2) {…}

LL_SEARCH_SCALAR(head,elt,mbr,val);

DL_SEARCH_SCALAR(head,elt,mbr,val);

CDL_SEARCH_SCALAR(head,elt,mbr,val);

LL_SEARCH(head,elt,like,cmp);

DL_SEARCH(head,elt,like,cmp);

CDL_SEARCH(head,elt,like,cmp);

-
-

Prepend means to insert an element in front of the existing list head (if any), -changing the list head to the new element. Append means to add an element at the -end of the list, so it becomes the new tail element.

-

The sort operation never moves the elements in memory; rather it only adjusts -the list order by altering the prev and next pointers in each element. Also -the sort operation can change the list head to point to a new element.

-

The foreach operation is for easy iteration over the list from the head to the -tail. A usage example is shown below. You can of course just use the prev and -next pointers directly instead of using the foreach macros. -The foreach_safe operation should be used if you plan to delete any of the list -elements while iterating.

-

The search operation is a shortcut for iteration in search of a particular -element. It is not any faster than manually iterating and testing each element. -There are two forms: the "scalar" version searches for an element using a -simple equality test on a given structure member, while the general version takes an -element to which all others in the list will be compared using a cmp function.

-

The parameters shown in the table above are explained here:

-
-
-head -
-
-

- The list head (a pointer to your list element structure). -

-
-
-add -
-
-

- A pointer to the list element structure you are adding to the list. -

-
-
-del -
-
-

- A pointer to the list element structure you are deleting from the list. -

-
-
-elt -
-
-

- A pointer that will be assigned to each list element in succession (see - example) in the case of iteration macros; also, the output pointer from - the search macros. -

-
-
-like -
-
-

- An element pointer, having the same type as elt, for which the search macro - seeks a match (if found, the match is stored in elt). A match is determined - by the given cmp function. -

-
-
-cmp -
-
-

- pointer to comparison function which accepts two arguments-- these are - pointers to two element structures to be compared. The comparison function - must return an int that is negative, zero, or positive, which specifies - whether the first item should sort before, equal to, or after the second item, - respectively. (In other words, the same convention that is used by strcmp). - Note that under Visual Studio 2008 you may need to declare the two arguments - as void * and then cast them back to their actual types. -

-
-
-tmp -
-
-

- A pointer of the same type as elt. Used internally. Need not be initialized. -

-
-
-mbr -
-
-

- In the scalar search macro, the name of a member within the elt structure which - will be tested (using ==) for equality with the value val. -

-
-
-val -
-
-

- In the scalar search macro, specifies the value of (of structure member - field) of the element being sought. -

-
-
-

Example

-

This example program reads names from a text file (one name per line), and -appends each name to a doubly-linked list. Then it sorts and prints them.

-
-
A doubly-linked list
-
-
#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "utlist.h"
-
-#define BUFLEN 20
-
-typedef struct el {
-    char bname[BUFLEN];
-    struct el *next, *prev;
-} el;
-
-int namecmp(el *a, el *b) {
-    return strcmp(a->bname,b->bname);
-}
-
-el *head = NULL; /* important- initialize to NULL! */
-
-int main(int argc, char *argv[]) {
-    el *name, *elt, *tmp, etmp;
-
-    char linebuf[BUFLEN];
-    FILE *file;
-
-    if ( (file = fopen( "test11.dat", "r" )) == NULL ) {
-        perror("can't open: ");
-        exit(-1);
-    }
-
-    while (fgets(linebuf,BUFLEN,file) != NULL) {
-        if ( (name = (el*)malloc(sizeof(el))) == NULL) exit(-1);
-        strncpy(name->bname,linebuf,BUFLEN);
-        DL_APPEND(head, name);
-    }
-    DL_SORT(head, namecmp);
-    DL_FOREACH(head,elt) printf("%s", elt->bname);
-
-    memcpy(&etmp.bname, "WES\n", 5);
-    DL_SEARCH(head,elt,&etmp,namecmp);
-    if (elt) printf("found %s\n", elt->bname);
-
-    /* now delete each element, use the safe iterator */
-    DL_FOREACH_SAFE(head,elt,tmp) {
-      DL_DELETE(head,elt);
-    }
-
-    fclose(file);
-
-    return 0;
-}
-
-
-
-

- - - diff --git a/3rdparty/uthash-1.9.3/doc/html/utstring.html b/3rdparty/uthash-1.9.3/doc/html/utstring.html deleted file mode 100644 index eab57b8..0000000 --- a/3rdparty/uthash-1.9.3/doc/html/utstring.html +++ /dev/null @@ -1,316 +0,0 @@ - - - - - -utstring: dynamic string macros for C - - - - - -
-
-uthash at SourceForge.net -
- uthash home - >> utstring macros -
-
-
-

Introduction

-
-
- -

A set of very basic dynamic string macros for C programs are included with -uthash in utstring.h. To use these macros in your own C program, just -copy utstring.h into your source directory and use it in your programs.

-
-
-
#include "utstring.h"
-
-

The dynamic string supports basic operations such as inserting data (including -binary data-- despite its name, utstring is not limited to string content), -concatenation, getting the length and content, and clearing it. The string -operations are listed below.

-

Download

-

To download the utstring.h header file, follow the link on the -uthash home page.

-

BSD licensed

-

This software is made available under the -revised BSD license. -It is free and open source.

-

Platforms

-

The utstring macros have been tested on:

-
    -
  • -

    -Linux, -

    -
  • -
  • -

    -Windows, using Visual Studio 2008 and Visual Studio 2010 -

    -
  • -
-
-

Usage

-
-

Declaration

-

The dynamic string itself has the data type UT_string. It is declared like,

-
-
-
UT_string *str;
-
-

New and free

-

The next step is to create the string using utstring_new. Later when you’re -done with it, utstring_free will free it and all its content.

-

Manipulation

-

The utstring_printf or utstring_bincpy operations insert (copy) data into -the string. To concatenate one utstring to another, use utstring_concat. To -clear the content of the string, use utstring_clear. The length of the string -is available from utstring_len, and its content from utstring_body. This -evaluates to a char*. The buffer it points to is always null-terminated. -So, it can be used directly with external functions that expect a string. -This automatic null terminator is not counted in the length of the string.

-

Samples

-

These examples show how to use utstring.

-
-
Sample 1
-
-
#include <stdio.h>
-#include "utstring.h"
-
-int main() {
-    UT_string *s;
-
-    utstring_new(s);
-    utstring_printf(s, "hello world!" );
-    printf("%s\n", utstring_body(s));
-
-    utstring_free(s);
-    return 0;
-}
-
-

The next example is meant to demonstrate that printf appends to the string. -It also shows concatenation.

-
-
Sample 2
-
-
#include <stdio.h>
-#include "utstring.h"
-
-int main() {
-    UT_string *s, *t;
-
-    utstring_new(s);
-    utstring_new(t);
-
-    utstring_printf(s, "hello " );
-    utstring_printf(s, "world " );
-
-    utstring_printf(t, "hi " );
-    utstring_printf(t, "there " );
-
-    utstring_concat(s, t);
-    printf("length: %u\n", utstring_len(s));
-    printf("%s\n", utstring_body(s));
-
-    utstring_free(s);
-    utstring_free(t);
-    return 0;
-}
-
-

The last example shows how binary data can be inserted into the string. It also -clears the string and prints new data into it.

-
-
Sample 3
-
-
#include <stdio.h>
-#include "utstring.h"
-
-int main() {
-    UT_string *s;
-    char binary[] = "\xff\xff";
-
-    utstring_new(s);
-    utstring_bincpy(s, binary, sizeof(binary));
-    printf("length is %u\n", utstring_len(s));
-
-    utstring_clear(s);
-    utstring_printf(s,"number %d", 10);
-    printf("%s\n", utstring_body(s));
-
-    utstring_free(s);
-    return 0;
-}
-
-
-

Reference

-
-

These are the utstring operations.

-

Operations

-
- --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

utstring_new(s)

allocate a new utstring

utstring_free(s)

free an allocated utstring

utstring_init(s)

init a utstring (non-alloc)

utstring_done(s)

dispose of a utstring (non-allocd)

utstring_printf(s,fmt,…)

printf into a utstring (appends)

utstring_bincpy(s,bin,len)

insert binary data of length len (appends)

utstring_concat(dst,src)

concatenate src utstring to end of dst utstring

utstring_clear(s)

clear the content of s (setting its length to 0)

utstring_len(s)

obtain the length of s as an unsigned integer

utstring_body(s)

get char* to body of s (buffer is always null-terminated)

-
-

Notes

-
    -
  1. -

    -utstring_new and utstring_free are used to allocate a new string and free it, - while utstring_init and utstring_done can be used if the UT_string is already - allocated and just needs to be initialized or have its internal resources - freed. -

    -
  2. -
  3. -

    -utstring_printf is actually a function defined statically in utstring.h - rather than a macro. -

    -
  4. -
-
- - - diff --git a/3rdparty/uthash-1.9.3/doc/pdf/userguide.pdf b/3rdparty/uthash-1.9.3/doc/pdf/userguide.pdf deleted file mode 100644 index e20e18fd1f44170362c29f3d35c7dc3b32825b79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291848 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
- -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -endif::backend-xhtml11[] diff --git a/3rdparty/uthash-1.9.3/doc/txt/topnav.txt b/3rdparty/uthash-1.9.3/doc/txt/topnav.txt deleted file mode 100644 index 46da28a..0000000 --- a/3rdparty/uthash-1.9.3/doc/txt/topnav.txt +++ /dev/null @@ -1,10 +0,0 @@ -ifdef::backend-xhtml11[] -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -
- sf.net summary page - >> uthash home - >> User Guide - [View PDF] -
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -endif::backend-xhtml11[] diff --git a/3rdparty/uthash-1.9.3/doc/txt/topnav_utarray.txt b/3rdparty/uthash-1.9.3/doc/txt/topnav_utarray.txt deleted file mode 100644 index 591076a..0000000 --- a/3rdparty/uthash-1.9.3/doc/txt/topnav_utarray.txt +++ /dev/null @@ -1,8 +0,0 @@ -ifdef::backend-xhtml11[] -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -
- uthash home - >> utarray macros -
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -endif::backend-xhtml11[] diff --git a/3rdparty/uthash-1.9.3/doc/txt/topnav_utlist.txt b/3rdparty/uthash-1.9.3/doc/txt/topnav_utlist.txt deleted file mode 100644 index 6acdf7b..0000000 --- a/3rdparty/uthash-1.9.3/doc/txt/topnav_utlist.txt +++ /dev/null @@ -1,8 +0,0 @@ -ifdef::backend-xhtml11[] -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -
- uthash home - >> utlist macros -
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -endif::backend-xhtml11[] diff --git a/3rdparty/uthash-1.9.3/doc/txt/topnav_utstring.txt b/3rdparty/uthash-1.9.3/doc/txt/topnav_utstring.txt deleted file mode 100644 index 192117b..0000000 --- a/3rdparty/uthash-1.9.3/doc/txt/topnav_utstring.txt +++ /dev/null @@ -1,8 +0,0 @@ -ifdef::backend-xhtml11[] -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -
- uthash home - >> utstring macros -
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -endif::backend-xhtml11[] diff --git a/3rdparty/uthash-1.9.3/doc/txt/userguide.txt b/3rdparty/uthash-1.9.3/doc/txt/userguide.txt deleted file mode 100644 index 1e66c41..0000000 --- a/3rdparty/uthash-1.9.3/doc/txt/userguide.txt +++ /dev/null @@ -1,1527 +0,0 @@ -uthash User Guide -================= -Troy D. Hanson -v1.9.2, October 2010 - -include::sflogo.txt[] -include::topnav.txt[] - -A hash in C ------------ -include::toc.txt[] - -This document is written for C programmers. Since you're reading this, chances -are that you know a hash is used for looking up items using a key. In scripting -languages like Perl, hashes are used all the time. In C, hashes don't exist in -the language itself. This software provides a hash table for C structures. - -What can it do? -~~~~~~~~~~~~~~~~~ -This software supports these operations on items in a hash table: - -1. add -2. find -3. delete -4. count -5. iterate -6. sort -7. select (explained later) - -Is it fast? -~~~~~~~~~~~ -Add, find and delete are normally constant-time operations. This is influenced -by your key domain and the hash function. - -This hash aims to be minimalistic and efficient. It's around 900 lines of C. -It inlines automatically because it's implemented as macros. It's fast as long -as the hash function is suited to your keys. You can use the default hash -function, or easily compare performance and choose from among several other -<>. - -Is it a library? -~~~~~~~~~~~~~~~~ -No, it's just a single header file: `uthash.h`. All you need to do is copy -the header file into your project, and: - - #include "uthash.h" - -Since uthash is a header file only, there is no library code to link against. - -C/C++ and platforms -~~~~~~~~~~~~~~~~~~~ -This software can be used in C and C++ programs. It has been tested on: - - * Linux - * Mac OS X - * Windows using Visual Studio 2008 and 2010 - * Solaris - * OpenBSD - * FreeBSD - -Test suite -^^^^^^^^^^ -To run the test suite, look in the `tests` directory and either run `make` on -Unix platforms, or on Windows run the "do_tests_win32.cmd" batch file (if you -have Visual Studio 2008 or 2010 installed in a non-standard location you may -have to edit the batch file). - -BSD licensed -~~~~~~~~~~~~ -This software is made available under the -link:license.html[revised BSD license]. -It is free and open source. - -Obtaining uthash -~~~~~~~~~~~~~~~~ -Please follow the link to download on the -http://uthash.sourceforge.net[uthash website] at http://uthash.sourceforge.net. - -Getting help -~~~~~~~~~~~~ -Feel free to mailto:tdh@tkhanson.net[email the author] at -tdh@tkhanson.net. - -Resources -~~~~~~~~~ -Users of uthash may wish to follow the news feed for information about new -releases. Also, there are some extra bonus headers included with uthash. - -News:: - The author has a news feed for http://troydhanson.wordpress.com/feed/[software updates] image:img/rss.png[(RSS)]. -Extras included with uthash:: - uthash ships with these "extras"-- independent headers similar to uthash. - First link:utlist.html[utlist.h] provides linked list macros for C structures. - Second, link:utarray.html[utarray.h] implements dynamic arrays using macros. - Third, link:utstring.html[utstring.h] implements a basic dynamic string. - -Who's using it? -~~~~~~~~~~~~~~~ -Since releasing uthash in 2006, it has been downloaded thousands of times, -incorporated into commercial software, academic research, and into other -open-source software. - -Your structure --------------- - -In uthash, a hash table is comprised of structures. Each structure represents a -key-value association. One or more of the structure fields constitute the key. -The structure pointer itself is the value. - -.Defining a structure that can be hashed ----------------------------------------------------------------------- -#include "uthash.h" - -struct my_struct { - int id; /* key */ - char name[10]; - UT_hash_handle hh; /* makes this structure hashable */ -}; ----------------------------------------------------------------------- - -Note that, in uthash, your structure will never be moved or copied into another -location when you add it into a hash table. This means that you can keep other -data structures that safely point to your structure-- regardless of whether you -add or delete it from a hash table during your program's lifetime. - -The key -~~~~~~~ -There are no restrictions on the data type or name of the key field. The key -can also comprise multiple contiguous fields, having any names and data types. - -.Any data type... really? -***************************************************************************** -Yes, your key and structure can have any data type. Unlike function calls with -fixed prototypes, uthash consists of macros-- whose arguments are untyped-- and -thus able to work with any type of structure or key. -***************************************************************************** - -Unique keys -^^^^^^^^^^^ -As with any hash, every item must have a unique key. Your application must -enforce key uniqueness. Before you add an item to the hash table, you must -first know (if in doubt, check!) that the key is not already in use. You -can check whether a key already exists in the hash table using `HASH_FIND`. - -The hash handle -~~~~~~~~~~~~~~~ -The `UT_hash_handle` field must be present in your structure. It is used for -the internal bookkeeping that makes the hash work. It does not require -initialization. It can be named anything, but you can simplify matters by -naming it `hh`. This allows you to use the easier "convenience" macros to add, -find and delete items. - -Hash operations ---------------- - -This section introduces the uthash macros by example. For a more succinct -listing, see <>. - -.Convenience vs. general macros: -***************************************************************************** -The uthash macros fall into two categories. The 'convenience' macros can be used -with integer, pointer or string keys (and require that you chose the conventional -name `hh` for the `UT_hash_handle` field). The convenience macros take fewer -arguments than the general macros, making their usage a bit simpler for these -common types of keys. - -The 'general' macros can be used for any types of keys, or for multi-field keys, -or when the `UT_hash_handle` has been named something other than `hh`. These -macros take more arguments and offer greater flexibility in return. But if the -convenience macros suit your needs, use them-- your code will be more readable. -***************************************************************************** - -Declare the hash -~~~~~~~~~~~~~~~~ -Your hash must be declared as a `NULL`-initialized pointer to your structure. - - struct my_struct *users = NULL; /* important! initialize to NULL */ - -Add item -~~~~~~~~ -Allocate and initialize your structure as you see fit. The only aspect -of this that matters to uthash is that your key must be initialized to -a unique value. Then call `HASH_ADD`. (Here we use the convenience macro -`HASH_ADD_INT`, which offers simplified usage for keys of type `int`). - -.Add an item to a hash ----------------------------------------------------------------------- -void add_user(int user_id, char *name) { - struct my_struct *s; - - s = malloc(sizeof(struct my_struct)); - s->id = user_id; - strcpy(s->name, name); - HASH_ADD_INT( users, id, s ); /* id: name of key field */ -} ----------------------------------------------------------------------- - -The first parameter to `HASH_ADD_INT` is the hash table, and the -second parameter is the 'name' of the key field. Here, this is `id`. The -last parameter is a pointer to the structure being added. - -[[validc]] -.Wait.. the field name is a parameter? -******************************************************************************* -If you find it strange that `id`, which is the 'name of a field' in the -structure, can be passed as a parameter, welcome to the world of macros. Don't -worry- the C preprocessor expands this to valid C code. -******************************************************************************* - -Key must not be modified while in-use -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Once a structure has been added to the hash, do not change the value of its key. -Instead, delete the item from the hash, change the key, and then re-add it. - -Find item -~~~~~~~~~ -To look up a structure in a hash, you need its key. Then call `HASH_FIND`. -(Here we use the convenience macro `HASH_FIND_INT` for keys of type `int`). - -.Find a structure using its key ----------------------------------------------------------------------- -struct my_struct *find_user(int user_id) { - struct my_struct *s; - - HASH_FIND_INT( users, &user_id, s ); /* s: output pointer */ - return s; -} ----------------------------------------------------------------------- - -Here, the hash table is `users`, and `&user_id` points to the key (an integer -in this case). Last, `s` is the 'output' variable of `HASH_FIND_INT`. The -final result is that `s` points to the structure with the given key, or -is `NULL` if the key wasn't found in the hash. - -[NOTE] -The middle argument is a 'pointer' to the key. You can't pass a literal key -value to `HASH_FIND`. Instead assign the literal value to a variable, and pass -a pointer to the variable. - - -Delete item -~~~~~~~~~~~ -To delete a structure from a hash, you must have a pointer to it. (If you only -have the key, first do a `HASH_FIND` to get the structure pointer). - -.Delete an item from a hash ----------------------------------------------------------------------- -void delete_user(struct my_struct *user) { - HASH_DEL( users, user); /* user: pointer to deletee */ - free(user); /* optional; it's up to you! */ -} ----------------------------------------------------------------------- - -Here again, `users` is the hash table, and `user` is a pointer to the -structure we want to remove from the hash. - -uthash never frees your structure -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Deleting a structure just removes it from the hash table-- it doesn't `free` -it. The choice of when to free your structure is entirely up to you; uthash -will never free your structure. - -Delete can change the pointer -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The hash table pointer (which initially points to the first item added to the -hash) can change in response to `HASH_DEL` (i.e. if you delete the first item -in the hash table). - -Iterative deletion -^^^^^^^^^^^^^^^^^^ -The `HASH_ITER` macro is a deletion-safe iteration construct which expands -to a simple 'for' loop. - -.Delete all items from a hash ----------------------------------------------------------------------- -void delete_all() { - struct my_struct *current_user, *tmp; - - HASH_ITER(hh, users, current_user, tmp) { - HASH_DEL(users,current_user); /* delete; users advances to next */ - free(current_user); /* optional- if you want to free */ - } -} ----------------------------------------------------------------------- - -All-at-once deletion -^^^^^^^^^^^^^^^^^^^^ -If you only want to delete all the items, but not free them or do any -per-element clean up, you can do this more efficiently in a single operation: - - HASH_CLEAR(hh,users); - -Afterward, the list head (here, `users`) will be set to `NULL`. - -Count items -~~~~~~~~~~~ - -The number of items in the hash table can be obtained using `HASH_COUNT`: - -.Count of items in the hash table ----------------------------------------------------------------------- -unsigned int num_users; -num_users = HASH_COUNT(users); -printf("there are %u users\n", num_users); ----------------------------------------------------------------------- - -Incidentally, this works even the list (`users`, here) is `NULL`, in -which case the count is 0. - -Iterating and sorting -~~~~~~~~~~~~~~~~~~~~~ - -You can loop over the items in the hash by starting from the beginning and -following the `hh.next` pointer. - -.Iterating over all the items in a hash ----------------------------------------------------------------------- -void print_users() { - struct my_struct *s; - - for(s=users; s != NULL; s=s->hh.next) { - printf("user id %d: name %s\n", s->id, s->name); - } -} ----------------------------------------------------------------------- - -There is also an `hh.prev` pointer you could use to iterate backwards through -the hash, starting from any known item. - -[[deletesafe]] -Deletion-safe iteration -^^^^^^^^^^^^^^^^^^^^^^^ -In the example above, it would not be safe to delete and free `s` in the body -of the 'for' loop, (because `s` is derefenced each time the loop iterates). -This is easy to rewrite correctly (by copying the `s->hh.next` pointer to a -temporary variable 'before' freeing `s`), but it comes up often enough that a -deletion-safe iteration macro, `HASH_ITER`, is included. It expands to a -`for`-loop header. Here is how it could be used to rewrite the last example: - - struct my_struct *s, *tmp; - - HASH_ITER(hh, users, s, tmp) { - printf("user id %d: name %s\n", s->id, s->name); - /* ... it is safe to delete and free s here */ - } - -.A hash is also a doubly-linked list. -******************************************************************************* -Iterating backward and forward through the items in the hash is possible -because of the `hh.prev` and `hh.next` fields. All the items in the hash can -be reached by repeatedly following these pointers, thus the hash is also a -doubly-linked list. -******************************************************************************* - -If you're using uthash in a C++ program, you need an extra cast on the `for` -iterator, e.g., `s=(struct my_struct*)s->hh.next`. - -Sorted iteration -^^^^^^^^^^^^^^^^ -The items in the hash are, by default, traversed in the order they were added -("insertion order") when you follow the `hh.next` pointer. But you can sort -the items into a new order using `HASH_SORT`. E.g., - - HASH_SORT( users, name_sort ); - -The second argument is a pointer to a comparison function. It must accept two -arguments which are pointers to two items to compare. Its return value should -be less than zero, zero, or greater than zero, if the first item sorts before, -equal to, or after the second item, respectively. (Just like `strcmp`). - -.Sorting the items in the hash ----------------------------------------------------------------------- -int name_sort(struct my_struct *a, struct my_struct *b) { - return strcmp(a->name,b->name); -} - -int id_sort(struct my_struct *a, struct my_struct *b) { - return (a->id - b->id); -} - -void sort_by_name() { - HASH_SORT(users, name_sort); -} - -void sort_by_id() { - HASH_SORT(users, id_sort); -} ----------------------------------------------------------------------- - -When the items in the hash are sorted, the first item may change position. In -the example above, `users` may point to a different structure after calling -`HASH_SORT`. - -A complete example -~~~~~~~~~~~~~~~~~~ - -We'll repeat all the code and embellish it with a `main()` function to form a -working example. - -If this code was placed in a file called `example.c` in the same directory as -`uthash.h`, it could be compiled and run like this: - - cc -o example example.c - ./example - -Follow the prompts to try the program, and type `Ctrl-C` when done. - -.A complete program (part 1 of 2) ----------------------------------------------------------------------- -#include /* gets */ -#include /* atoi, malloc */ -#include /* strcpy */ -#include "uthash.h" - -struct my_struct { - int id; /* key */ - char name[10]; - UT_hash_handle hh; /* makes this structure hashable */ -}; - -struct my_struct *users = NULL; - -void add_user(int user_id, char *name) { - struct my_struct *s; - - s = malloc(sizeof(struct my_struct)); - s->id = user_id; - strcpy(s->name, name); - HASH_ADD_INT( users, id, s ); /* id: name of key field */ -} - -struct my_struct *find_user(int user_id) { - struct my_struct *s; - - HASH_FIND_INT( users, &user_id, s ); /* s: output pointer */ - return s; -} - -void delete_user(struct my_struct *user) { - HASH_DEL( users, user); /* user: pointer to deletee */ - free(user); -} - -void delete_all() { - struct my_struct *current_user, *tmp; - - HASH_ITER(hh, users, current_user, tmp) { - HASH_DEL(users,current_user); /* delete it (users advances to next) */ - free(current_user); /* free it */ - } -} - -void print_users() { - struct my_struct *s; - - for(s=users; s != NULL; s=s->hh.next) { - printf("user id %d: name %s\n", s->id, s->name); - } -} - -int name_sort(struct my_struct *a, struct my_struct *b) { - return strcmp(a->name,b->name); -} - -int id_sort(struct my_struct *a, struct my_struct *b) { - return (a->id - b->id); -} ----------------------------------------------------------------------- - -.A complete program (part 2 of 2) ----------------------------------------------------------------------- -void sort_by_name() { - HASH_SORT(users, name_sort); -} - -void sort_by_id() { - HASH_SORT(users, id_sort); -} - -int main(int argc, char *argv[]) { - char in[10]; - int id=1; - struct my_struct *s; - unsigned num_users; - - while (1) { - printf("1. add user\n"); - printf("2. find user\n"); - printf("3. delete user\n"); - printf("4. delete all users\n"); - printf("5. sort items by name\n"); - printf("6. sort items by id\n"); - printf("7. print users\n"); - printf("8. count users\n"); - gets(in); - switch(atoi(in)) { - case 1: - printf("name?\n"); - add_user(id++, gets(in)); - break; - case 2: - printf("id?\n"); - s = find_user(atoi(gets(in))); - printf("user: %s\n", s ? s->name : "unknown"); - break; - case 3: - printf("id?\n"); - s = find_user(atoi(gets(in))); - if (s) delete_user(s); - else printf("id unknown\n"); - break; - case 4: - delete_all(); - break; - case 5: - sort_by_name(); - break; - case 6: - sort_by_id(); - break; - case 7: - print_users(); - break; - case 8: - num_users=HASH_COUNT(users); - printf("there are %u users\n", num_users); - break; - } - } -} ----------------------------------------------------------------------- - -This program is included in the distribution in `tests/example.c`. You can run -`make example` in that directory to compile it easily. - -Standard key types ------------------- -This section goes into specifics of how to work with different kinds of keys. -You can use nearly any type of key-- integers, strings, pointers, structures, etc. - -[NOTE] -.A note about float -================================================================================ -You can use floating point keys. This comes with the same caveats as with any -program that tests floating point equality. In other words, even the tiniest -difference in two floating point numbers makes them distinct keys. -================================================================================ - -Integer keys -~~~~~~~~~~~~ -The preceding examples demonstrated use of integer keys. To recap, use the -convenience macros `HASH_ADD_INT` and `HASH_FIND_INT` for structures with -integer keys. (The other operations such as `HASH_DELETE` and `HASH_SORT` are -the same for all types of keys). - -String keys -~~~~~~~~~~~ -If your structure has a string key, the operations to use depend on whether your -structure 'points to' the key (`char *`) or the string resides `within` the -structure (`char a[10]`). *This distinction is important*. As we'll see below, -you need to use `HASH_ADD_KEYPTR` when your structure 'points' to a key (that is, -the key itself is 'outside' of the structure); in contrast, use `HASH_ADD_STR` -for a string key that is contained *within* your structure. - -[NOTE] -.char[ ] vs. char* -================================================================================ -The string is 'within' the structure in the first example below-- `name` is a -`char[10]` field. In the second example, the key is 'outside' of the -structure-- `name` is a `char *`. So the first example uses `HASH_ADD_STR` but -the second example uses `HASH_ADD_KEYPTR`. For information on this macro, see -the <>. -================================================================================ - -String 'within' structure -^^^^^^^^^^^^^^^^^^^^^^^^^ - -.A string-keyed hash (string within structure) ----------------------------------------------------------------------- -#include /* strcpy */ -#include /* malloc */ -#include /* printf */ -#include "uthash.h" - -struct my_struct { - char name[10]; /* key (string is WITHIN the structure) */ - int id; - UT_hash_handle hh; /* makes this structure hashable */ -}; - - -int main(int argc, char *argv[]) { - char **n, *names[] = { "joe", "bob", "betty", NULL }; - struct my_struct *s, *users = NULL; - int i=0; - - for (n = names; *n != NULL; n++) { - s = malloc(sizeof(struct my_struct)); - strcpy(s->name, *n); - s->id = i++; - HASH_ADD_STR( users, name, s ); - } - - HASH_FIND_STR( users, "betty", s); - if (s) printf("betty's id is %d\n", s->id); -} ----------------------------------------------------------------------- - -This example is included in the distribution in `tests/test15.c`. It prints: - - betty's id is 2 - -String 'pointer' in structure -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Now, here is the same example but using a `char *` key instead of `char [ ]`: - -.A string-keyed hash (structure points to string) ----------------------------------------------------------------------- -#include /* strcpy */ -#include /* malloc */ -#include /* printf */ -#include "uthash.h" - -struct my_struct { - char *name; /* key (structure POINTS TO string */ - int id; - UT_hash_handle hh; /* makes this structure hashable */ -}; - - -int main(int argc, char *argv[]) { - char **n, *names[] = { "joe", "bob", "betty", NULL }; - struct my_struct *s, *users = NULL; - int i=0; - - for (n = names; *n != NULL; n++) { - s = (struct my_struct*)malloc(sizeof(struct my_struct)); - s->name = *n; - s->id = i++; - HASH_ADD_KEYPTR( hh, users, s->name, strlen(s->name), s ); - } - - HASH_FIND_STR( users, "betty", s); - if (s) printf("betty's id is %d\n", s->id); - return 0; -} ----------------------------------------------------------------------- - -Pointer keys -~~~~~~~~~~~~ -Your key can be a pointer. To be very clear, this means the 'pointer itself' -can be the key (in contrast, if the thing 'pointed to' is the key, this is a -different use case handled by `HASH_ADD_KEYPTR`). - -Here is a simple example where a structure has a pointer member, called `key`. - -.A pointer key ----------------------------------------------------------------------- -#include -#include -#include "uthash.h" - -typedef struct { - void *key; - int i; - UT_hash_handle hh; -} el_t; - -el_t *hash = NULL; -char *someaddr = NULL; - -int main() { - el_t *d; - el_t *e = (el_t*)malloc(sizeof(el_t)); - if (!e) return -1; - e->key = (void*)someaddr; - e->i = 1; - HASH_ADD_PTR(hash,key,e); - HASH_FIND_PTR(hash, &someaddr, d); - if (d) printf("found\n"); - free(e); - return 0; -} ----------------------------------------------------------------------- - -Structure keys -~~~~~~~~~~~~~~ -Your key field can have any data type. To uthash, it is just a sequence of -bytes. Therefore, even a nested structure can be used as a key. We'll use the -general macros `HASH_ADD` and `HASH_FIND` to demonstrate. - -NOTE: Structures contain padding (wasted internal space used to fulfill -alignment requirements for the members of the structure). These padding bytes -'must be zeroed' before adding an item to the hash or looking up an item. -Therefore always zero the whole structure before setting the members of -interest. The example below does this-- see the two calls to `memset`. - -.A key which is a structure ----------------------------------------------------------------------- -#include -#include -#include "uthash.h" - -typedef struct { /* this structure will be our key */ - char a; - int b; -} record_key_t; - -typedef struct { /* the hash is comprised of these */ - record_key_t key; - /* ... other data ... */ - UT_hash_handle hh; -} record_t; - -int main(int argc, char *argv[]) { - record_t l, *p, *r, *records = NULL; - - r = (record_t*)malloc( sizeof(record_t) ); - memset(r, 0, sizeof(record_t)); /* zero fill! */ - r->key.a = 'a'; - r->key.b = 1; - HASH_ADD(hh, records, key, sizeof(record_key_t), r); - - memset(&l, 0, sizeof(record_t)); /* zero fill! */ - l.key.a = 'a'; - l.key.b = 1; - HASH_FIND(hh, records, &l.key, sizeof(record_key_t), p); - - if (p) printf("found %c %d\n", p->key.a, p->key.b); - return 0; -} - ----------------------------------------------------------------------- - -This usage is nearly the same as use of a compound key explained below. - -Note that the general macros require the name of the `UT_hash_handle` to be -passed as the first argument (here, this is `hh`). The general macros are -documented in <>. - -Advanced Topics ---------------- - -Compound keys -~~~~~~~~~~~~~ -Your key can even comprise multiple contiguous fields. - -.A multi-field key ----------------------------------------------------------------------- -#include /* malloc */ -#include /* offsetof */ -#include /* printf */ -#include /* memset */ -#include "uthash.h" - -#define UTF32 1 - -typedef struct { - UT_hash_handle hh; - int len; - char encoding; /* these two fields */ - int text[]; /* comprise the key */ -} msg_t; - -int main(int argc, char *argv[]) { - int keylen; - msg_t *msg, *msgs = NULL; - struct { char encoding; int text[]; } *lookup_key; - - int beijing[] = {0x5317, 0x4eac}; /* UTF-32LE for 北京 */ - - /* allocate and initialize our structure */ - msg = malloc( sizeof(msg_t) + sizeof(beijing) ); - memset(msg, 0, sizeof(msg_t)+sizeof(beijing)); /* zero fill */ - msg->len = sizeof(beijing); - msg->encoding = UTF32; - memcpy(msg->text, beijing, sizeof(beijing)); - - /* calculate the key length including padding, using formula */ - keylen = offsetof(msg_t, text) /* offset of last key field */ - + sizeof(beijing) /* size of last key field */ - - offsetof(msg_t, encoding); /* offset of first key field */ - - /* add our structure to the hash table */ - HASH_ADD( hh, msgs, encoding, keylen, msg); - - /* look it up to prove that it worked :-) */ - msg=NULL; - - lookup_key = malloc(sizeof(*lookup_key) + sizeof(beijing)); - memset(lookup_key, 0, sizeof(*lookup_key) + sizeof(beijing)); - lookup_key->encoding = UTF32; - memcpy(lookup_key->text, beijing, sizeof(beijing)); - HASH_FIND( hh, msgs, &lookup_key->encoding, keylen, msg ); - if (msg) printf("found \n"); - free(lookup_key); -} ----------------------------------------------------------------------- - -This example is included in the distribution in `tests/test22.c`. - -If you use multi-field keys, recognize that the compiler pads adjacent fields -(by inserting unused space between them) in order to fulfill the alignment -requirement of each field. For example a structure containing a `char` followed -by an `int` will normally have 3 "wasted" bytes of padding after the char, in -order to make the `int` field start on a multiple-of-4 address (4 is the length -of the int). - -.Calculating the length of a multi-field key: -******************************************************************************* -To determine the key length when using a multi-field key, you must include any -intervening structure padding the compiler adds for alignment purposes. - -An easy way to calculate the key length is to use the `offsetof` macro from -``. The formula is: - - key length = offsetof(last_key_field) - + sizeof(last_key_field) - - offsetof(first_key_field) - -In the example above, the `keylen` variable is set using this formula. -******************************************************************************* - -When dealing with a multi-field key, you must zero-fill your structure before -`HASH_ADD`'ing it to a hash table, or using its fields in a `HASH_FIND` key. - -In the previous example, `memset` is used to initialize the structure by -zero-filling it. This zeroes out any padding between the key fields. If we -didn't zero-fill the structure, this padding would contain random values. The -random values would lead to `HASH_FIND` failures; as two "identical" keys will -appear to mismatch if there are any differences within their padding. - -[[multihash]] -Items in several hash tables -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -A structure can be added to more than one hash table. A few reasons you might do -this include: - -- each hash table may use an alternative key; -- each hash table may have its own sort order; -- or you might simply use multiple hash tables for grouping purposes. E.g., - you could have users in an `admin_users` and a `users` hash table. - -Your structure needs to have a `UT_hash_handle` field for each hash table to -which it might be added. You can name them anything. E.g., - - UT_hash_handle hh1, hh2; - -Items with alternative keys -~~~~~~~~~~~~~~~~~~~~~~~~~~~ -You might create a hash table keyed on an ID field, and another hash table keyed -on username (if usernames are unique). You can add the same user structure to -both hash tables (without duplication of the structure), allowing lookup of a -user structure by their name or ID. The way to achieve this is to have a -separate `UT_hash_handle` for each hash to which the structure may be added. - -.A structure with two alternative keys ----------------------------------------------------------------------- -struct my_struct { - int id; /* usual key */ - char username[10]; /* alternative key */ - UT_hash_handle hh1; /* handle for first hash table */ - UT_hash_handle hh2; /* handle for second hash table */ -}; ----------------------------------------------------------------------- - -In the example above, the structure can now be added to two separate hash -tables. In one hash, `id` is its key, while in the other hash, `username` is -its key. (There is no requirement that the two hashes have different key -fields. They could both use the same key, such as `id`). - -Notice the structure has two hash handles (`hh1` and `hh2`). In the code -below, notice that each hash handle is used exclusively with a particular hash -table. (`hh1` is always used with the `users_by_id` hash, while `hh2` is -always used with the `users_by_name` hash table). - -.Two keys on a structure ----------------------------------------------------------------------- - struct my_struct *users_by_id = NULL, *users_by_name = NULL, *s; - int i; - char *name; - - s = malloc(sizeof(struct my_struct)); - s->id = 1; - strcpy(s->username, "thanson"); - - /* add the structure to both hash tables */ - HASH_ADD(hh1, users_by_id, id, sizeof(int), s); - HASH_ADD(hh2, users_by_name, username, strlen(s->username), s); - - /* lookup user by ID in the "users_by_id" hash table */ - i=1; - HASH_FIND(hh1, users_by_id, &i, sizeof(int), s); - if (s) printf("found id %d: %s\n", i, s->username); - - /* lookup user by username in the "users_by_name" hash table */ - name = "thanson"; - HASH_FIND(hh2, users_by_name, name, strlen(name), s); - if (s) printf("found user %s: %d\n", name, s->id); ----------------------------------------------------------------------- - - -Several sort orders -~~~~~~~~~~~~~~~~~~~ -It comes as no suprise that two hash tables can have different sort orders, but -this fact can also be used advantageously to sort the 'same items' in several -ways. This is based on the ability to store a structure in several hash tables. - -Extending the previous example, suppose we have many users. We have added each -user structure to the `users_by_id` hash table and the `users_by_name` hash table. -(To reiterate, this is done without the need to have two copies of each structure). -Now we can define two sort functions, then use `HASH_SRT`. - - int sort_by_id(struct my_struct *a, struct my_struct *b) { - if (a->id == b->id) return 0; - return (a->id < b->id) ? -1 : 1; - } - - int sort_by_name(struct my_struct *a, struct my_struct *b) { - return strcmp(a->username,b->username); - } - - HASH_SRT(hh1, users_by_id, sort_by_id); - HASH_SRT(hh2, users_by_name, sort_by_name); - -Now iterating over the items in `users_by_id` will traverse them in id-order -while, naturally, iterating over `users_by_name` will traverse them in -name-order. The items are fully forward-and-backward linked in each order. -So even for one set of users, we might store them in two hash tables to provide -easy iteration in two different sort orders. - -Bloom filter (faster misses) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Programs that generate a fair miss rate (`HASH_FIND` that result in `NULL`) may -benefit from the built-in Bloom filter support. This is disabled by default, -because programs that generate only hits would incur a slight penalty from it. -Also, programs that do deletes should not use the Bloom filter. While the -program would operate correctly, deletes diminish the benefit of the filter. -To enable the Bloom filter, simply compile with `-DHASH_BLOOM=n` like: - - -DHASH_BLOOM=27 - -where the number can be any value up to 32 which determines the amount of memory -used by the filter, as shown below. Using more memory makes the filter more -accurate and has the potential to speed up your program by making misses bail -out faster. - -.Bloom filter sizes for selected values of n -[width="50%",cols="10m,30",grid="none",options="header"] -|===================================================================== -| n | Bloom filter size (per hash table) -| 16 | 8 kilobytes -| 20 | 128 kilobytes -| 24 | 2 megabytes -| 28 | 32 megabytes -| 32 | 512 megabytes -|===================================================================== - -Bloom filters are only a performance feature; they do not change the results of -hash operations in any way. The only way to gauge whether or not a Bloom filter -is right for your program is to test it. Reasonable values for the size of the -Bloom filter are 16-32 bits. - -Select -~~~~~~ -An experimental 'select' operation is provided that inserts those items from a -source hash that satisfy a given condition into a destination hash. This -insertion is done with somewhat more efficiency than if this were using -`HASH_ADD`, namely because the hash function is not recalculated for keys of the -selected items. This operation does not remove any items from the source hash. -Rather the selected items obtain dual presence in both hashes. The destination -hash may already have items in it; the selected items are added to it. In order -for a structure to be usable with `HASH_SELECT`, it must have two or more hash -handles. (As described <>, a structure can exist in many -hash tables at the same time; it must have a separate hash handle for each one). - - user_t *users=NULL, *admins=NULL; /* two hash tables */ - - typedef struct { - int id; - UT_hash_handle hh; /* handle for users hash */ - UT_hash_handle ah; /* handle for admins hash */ - } user_t; - -Now suppose we have added some users, and want to select just the administrator -users who have id's less than 1024. - - #define is_admin(x) (((user_t*)x)->id < 1024) - HASH_SELECT(ah,admins,hh,users,is_admin); - -The first two parameters are the 'destination' hash handle and hash table, the -second two parameters are the 'source' hash handle and hash table, and the last -parameter is the 'select condition'. Here we used a macro `is_admin()` but we -could just as well have used a function. - - int is_admin(void *userv) { - user_t *user = (user_t*)userv; - return (user->id < 1024) ? 1 : 0; - } - -If the select condition always evaluates to true, this operation is -essentially a 'merge' of the source hash into the destination hash. Of course, -the source hash remains unchanged under any use of `HASH_SELECT`. It only adds -items to the destination hash selectively. - -The two hash handles must differ. An example of using `HASH_SELECT` is included -in `tests/test36.c`. - - -[[hash_functions]] -Built-in hash functions -~~~~~~~~~~~~~~~~~~~~~~~ -Internally, a hash function transforms a key into a bucket number. You don't -have to take any action to use the default hash function, currently Jenkin's. - -Some programs may benefit from using another of the built-in hash functions. -There is a simple analysis utility included with uthash to help you determine -if another hash function will give you better performance. - -You can use a different hash function by compiling your program with -`-DHASH_FUNCTION=HASH_xyz` where `xyz` is one of the symbolic names listed -below. E.g., - - cc -DHASH_FUNCTION=HASH_BER -o program program.c - -.Built-in hash functions -[width="50%",cols="^5m,20",grid="none",options="header"] -|=============================================================================== -|Symbol | Name -|JEN | Jenkins (default) -|BER | Bernstein -|SAX | Shift-Add-Xor -|OAT | One-at-a-time -|FNV | Fowler/Noll/Vo -|SFH | Paul Hsieh -|MUR | MurmurHash (see note) -|=============================================================================== - -[NOTE] -.MurmurHash -================================================================================ -A special symbol must be defined if you intend to use MurmurHash. To use it, add -`-DHASH_USING_NO_STRICT_ALIASING` to your `CFLAGS`. And, if you are using -the gcc compiler with optimization, add `-fno-strict-aliasing` to your `CFLAGS`. -================================================================================ - -Which hash function is best? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -You can easily determine the best hash function for your key domain. To do so, -you'll need to run your program once in a data-collection pass, and then run -the collected data through an included analysis utility. - -First you must build the analysis utility. From the top-level directory, - - cd tests/ - make - -We'll use `test14.c` to demonstrate the data-collection and analysis steps -(here using `sh` syntax to redirect file descriptor 3 to a file): - -.Using keystats --------------------------------------------------------------------------------- -% cc -DHASH_EMIT_KEYS=3 -I../src -o test14 test14.c -% ./test14 3>test14.keys -% ./keystats test14.keys -fcn ideal% #items #buckets dup% fl add_usec find_usec del-all usec ---- ------ ---------- ---------- ----- -- ---------- ---------- ------------ -SFH 91.6% 1219 256 0% ok 92 131 25 -FNV 90.3% 1219 512 0% ok 107 97 31 -SAX 88.7% 1219 512 0% ok 111 109 32 -OAT 87.2% 1219 256 0% ok 99 138 26 -JEN 86.7% 1219 256 0% ok 87 130 27 -BER 86.2% 1219 256 0% ok 121 129 27 --------------------------------------------------------------------------------- - -[NOTE] -The number 3 in `-DHASH_EMIT_KEYS=3` is a file descriptor. Any file descriptor -that your program doesn't use for its own purposes can be used instead of 3. -The data-collection mode enabled by `-DHASH_EMIT_KEYS=x` should not be used in -production code. - -Usually, you should just pick the first hash function that is listed. Here, this -is `SFH`. This is the function that provides the most even distribution for -your keys. If several have the same `ideal%`, then choose the fastest one -according to the `find_usec` column. - -keystats column reference -^^^^^^^^^^^^^^^^^^^^^^^^^ -fcn:: - symbolic name of hash function -ideal%:: - The percentage of items in the hash table which can be looked up within an - ideal number of steps. (Further explained below). -#items:: - the number of keys that were read in from the emitted key file -#buckets:: - the number of buckets in the hash after all the keys were added -dup%:: - the percent of duplicate keys encountered in the emitted key file. - Duplicates keys are filtered out to maintain key uniqueness. (Duplicates - are normal. For example, if the application adds an item to a hash, - deletes it, then re-adds it, the key is written twice to the emitted file.) -flags:: - this is either `ok`, or `nx` (noexpand) if the expansion inhibited flag is - set, described in <>. It is not recommended - to use a hash function that has the `noexpand` flag set. -add_usec:: - the clock time in microseconds required to add all the keys to a hash -find_usec:: - the clock time in microseconds required to look up every key in the hash -del-all usec:: - the clock time in microseconds required to delete every item in the hash - -[[ideal]] -ideal% -^^^^^^ - -.What is ideal%? -***************************************************************************** -The 'n' items in a hash are distributed into 'k' buckets. Ideally each bucket -would contain an equal share '(n/k)' of the items. In other words, the maximum -linear position of any item in a bucket chain would be 'n/k' if every bucket is -equally used. If some buckets are overused and others are underused, the -overused buckets will contain items whose linear position surpasses 'n/k'. -Such items are considered non-ideal. - -As you might guess, `ideal%` is the percentage of ideal items in the hash. These -items have favorable linear positions in their bucket chains. As `ideal%` -approaches 100%, the hash table approaches constant-time lookup performance. -***************************************************************************** - -[[hashscan]] -hashscan -~~~~~~~~ -NOTE: This utility is only available on Linux, and on FreeBSD (8.1 and up). - -A utility called `hashscan` is included in the `tests/` directory. It -is built automatically when you run `make` in that directory. This tool -examines a running process and reports on the uthash tables that it finds in -that program's memory. It can also save the keys from each table in a format -that can be fed into `keystats`. - -Here is an example of using `hashscan`. First ensure that it is built: - - cd tests/ - make - -Since `hashscan` needs a running program to inspect, we'll start up a simple -program that makes a hash table and then sleeps as our test subject: - - ./test_sleep & - pid: 9711 - -Now that we have a test program, let's run `hashscan` on it: - - ./hashscan 9711 - Address ideal items buckets mc fl bloom/sat fcn keys saved to - ------------------ ----- -------- -------- -- -- --------- --- ------------- - 0x862e038 81% 10000 4096 11 ok 16 14% JEN - -If we wanted to copy out all its keys for external analysis using `keystats`, -add the `-k` flag: - - ./hashscan -k 9711 - Address ideal items buckets mc fl bloom/sat fcn keys saved to - ------------------ ----- -------- -------- -- -- --------- --- ------------- - 0x862e038 81% 10000 4096 11 ok 16 14% JEN /tmp/9711-0.key - -Now we could run `./keystats /tmp/9711-0.key` to analyze which hash function -has the best characteristics on this set of keys. - -hashscan column reference -^^^^^^^^^^^^^^^^^^^^^^^^^ -Address:: - virtual address of the hash table -ideal:: - The percentage of items in the table which can be looked up within an ideal - number of steps. See <> in the `keystats` section. -items:: - number of items in the hash table -buckets:: - number of buckets in the hash table -mc:: - the maximum chain length found in the hash table (uthash usually tries to - keep fewer than 10 items in each bucket, or in some cases a multiple of 10) -fl:: - flags (either `ok`, or `NX` if the expansion-inhibited flag is set) -bloom/sat:: - if the hash table uses a Bloom filter, this is the size (as a power of two) - of the filter (e.g. 16 means the filter is 2^16 bits in size). The second - number is the "saturation" of the bits expressed as a percentage. The lower - the percentage, the more potential benefit to identify cache misses quickly. -fcn:: - symbolic name of hash function -keys saved to:: - file to which keys were saved, if any - -.How hashscan works -***************************************************************************** -When hashscan runs, it attaches itself to the target process, which suspends -the target process momentarily. During this brief suspension, it scans the -target's virtual memory for the signature of a uthash hash table. It then -checks if a valid hash table structure accompanies the signature and reports -what it finds. When it detaches, the target process resumes running normally. -The hashscan is performed "read-only"-- the target process is not modified. -Since hashscan is analyzing a momentary snapshot of a running process, it may -return different results from one run to another. -***************************************************************************** - -[[expansion]] -Expansion internals -~~~~~~~~~~~~~~~~~~~ -Internally this hash manages the number of buckets, with the goal of having -enough buckets so that each one contains only a small number of items. - -.Why does the number of buckets matter? -******************************************************************************** -When looking up an item by its key, this hash scans linearly through the items -in the appropriate bucket. In order for the linear scan to run in constant -time, the number of items in each bucket must be bounded. This is accomplished -by increasing the number of buckets as needed. -******************************************************************************** - -Normal expansion -^^^^^^^^^^^^^^^^ -This hash attempts to keep fewer than 10 items in each bucket. When an item is -added that would cause a bucket to exceed this number, the number of buckets in -the hash is doubled and the items are redistributed into the new buckets. In an -ideal world, each bucket will then contain half as many items as it did before. - -Bucket expansion occurs automatically and invisibly as needed. There is -no need for the application to know when it occurs. - -Per-bucket expansion threshold -++++++++++++++++++++++++++++++ -Normally all buckets share the same threshold (10 items) at which point bucket -expansion is triggered. During the process of bucket expansion, uthash can -adjust this expansion-trigger threshold on a per-bucket basis if it sees that -certain buckets are over-utilized. - -When this threshold is adjusted, it goes from 10 to a multiple of 10 (for that -particular bucket). The multiple is based on how many times greater the actual -chain length is than the ideal length. It is a practical measure to reduce -excess bucket expansion in the case where a hash function over-utilizes a few -buckets but has good overall distribution. However, if the overall distribution -gets too bad, uthash changes tactics. - -Inhibited expansion -^^^^^^^^^^^^^^^^^^^ -You usually don't need to know or worry about this, particularly if you used -the `keystats` utility during development to select a good hash for your keys. - -A hash function may yield an uneven distribution of items across the buckets. -In moderation this is not a problem. Normal bucket expansion takes place as -the chain lengths grow. But when significant imbalance occurs (because the hash -function is not well suited to the key domain), bucket expansion may be -ineffective at reducing the chain lengths. - -Imagine a very bad hash function which always puts every item in bucket 0. No -matter how many times the number of buckets is doubled, the chain length of -bucket 0 stays the same. In a situation like this, the best behavior is to -stop expanding, and accept O(n) lookup performance. This is what uthash -does. It degrades gracefully if the hash function is ill-suited to the keys. - -If two consecutive bucket expansions yield `ideal%` values below 50%, uthash -inhibits expansion for that hash table. Once set, the 'bucket expansion -inhibited' flag remains in effect as long as the hash has items in it. -Inhibited expansion may cause `HASH_FIND` to exhibit worse than constant-time -performance. - -Hooks -~~~~~ -You don't need to use these hooks- they are only here if you want to modify -the behavior of uthash. Hooks can be used to change how uthash allocates -memory, and to run code in response to certain internal events. - -malloc/free -^^^^^^^^^^^ -By default this hash implementation uses `malloc` and `free` to manage memory. -If your application uses its own custom allocator, this hash can use them too. - -.Specifying alternate memory management functions ----------------------------------------------------------------------------- -#include "uthash.h" - -/* undefine the defaults */ -#undef uthash_malloc -#undef uthash_free - -/* re-define, specifying alternate functions */ -#define uthash_malloc(sz) my_malloc(sz) -#define uthash_free(ptr,sz) my_free(ptr) - -... ----------------------------------------------------------------------------- - -Notice that `uthash_free` receives two parameters. The `sz` parameter is for -convenience on embedded platforms that manage their own memory. - -Out of memory -^^^^^^^^^^^^^ -If memory allocation fails (i.e., the malloc function returned `NULL`), the -default behavior is to terminate the process by calling `exit(-1)`. This can -be modified by re-defining the `uthash_fatal` macro. - - #undef uthash_fatal - #define uthash_fatal(msg) my_fatal_function(msg); - -The fatal function should terminate the process or `longjmp` back to a safe -place. Uthash does not support "returning a failure" if memory cannot be -allocated. - -Internal events -^^^^^^^^^^^^^^^ -There is no need for the application to set these hooks or take action in -response to these events. They are mainly for diagnostic purposes. - -These two hooks are "notification" hooks which get executed if uthash is -expanding buckets, or setting the 'bucket expansion inhibited' flag. Normally -both of these hooks are undefined and thus compile away to nothing. - -Expansion -+++++++++ -There is a hook for the bucket expansion event. - -.Bucket expansion hook ----------------------------------------------------------------------------- -#include "uthash.h" - -#undef uthash_expand_fyi -#define uthash_expand_fyi(tbl) printf("expanded to %d buckets\n", tbl->num_buckets) - -... ----------------------------------------------------------------------------- - -Expansion-inhibition -++++++++++++++++++++ -This hook can be defined to code to execute in the event that uthash decides to -set the 'bucket expansion inhibited' flag. - -.Bucket expansion inhibited hook ----------------------------------------------------------------------------- -#include "uthash.h" - -#undef uthash_noexpand_fyi -#define uthash_noexpand_fyi printf("warning: bucket expansion inhibited\n"); - -... ----------------------------------------------------------------------------- - - -Debug mode -~~~~~~~~~~ -If a program that uses this hash is compiled with `-DHASH_DEBUG=1`, a special -internal consistency-checking mode is activated. In this mode, the integrity -of the whole hash is checked following every add or delete operation. This is -for debugging the uthash software only, not for use in production code. - -In the `tests/` directory, running `make debug` will run all the tests in -this mode. - -In this mode, any internal errors in the hash data structure will cause a -message to be printed to `stderr` and the program to exit. - -The `UT_hash_handle` data structure includes `next`, `prev`, `hh_next` and -`hh_prev` fields. The former two fields determine the "application" ordering -(that is, insertion order-- the order the items were added). The latter two -fields determine the "bucket chain" order. These link the `UT_hash_handles` -together in a doubly-linked list that is a bucket chain. - -Checks performed in `-DHASH_DEBUG=1` mode: - -- the hash is walked in its entirety twice: once in 'bucket' order and a - second time in 'application' order -- the total number of items encountered in both walks is checked against the - stored number -- during the walk in 'bucket' order, each item's `hh_prev` pointer is compared - for equality with the last visited item -- during the walk in 'application' order, each item's `prev` pointer is compared - for equality with the last visited item - -.Macro debugging: -******************************************************************************** -Sometimes it's difficult to interpret a compiler warning on a line which -contains a macro call. In the case of uthash, one macro can expand to dozens of -lines. In this case, it is helpful to expand the macros and then recompile. -By doing so, the warning message will refer to the exact line within the macro. - -Here is an example of how to expand the macros and then recompile. This uses the -`test1.c` program in the `tests/` subdirectory. - - gcc -E -I../src test1.c > /tmp/a.c - egrep -v '^#' /tmp/a.c > /tmp/b.c - indent /tmp/b.c - gcc -o /tmp/b /tmp/b.c - -The last line compiles the original program (test1.c) with all macros expanded. -If there was a warning, the referenced line number can be checked in `/tmp/b.c`. -******************************************************************************** - -Thread safety -~~~~~~~~~~~~~ -You can use uthash in a threaded program. But you must do the locking. Use a -read-write lock to protect against concurrent writes. It is ok to have -concurrent readers (since uthash 1.5). - -For example using pthreads you can create an rwlock like this: - - pthread_rwlock_t lock; - if (pthread_rwlock_init(&lock,NULL) != 0) fatal("can't create rwlock"); - -Then, readers must acquire the read lock before doing any `HASH_FIND` calls or -before iterating over the hash elements: - - if (pthread_rwlock_rdlock(&lock) != 0) fatal("can't get rdlock"); - HASH_FIND_INT(elts, &i, e); - pthread_rwlock_unlock(&lock); - -Writers must acquire the exclusive write lock before doing any update. Add, -delete, and sort are all updates that must be locked. - - if (pthread_rwlock_wrlock(&lock) != 0) fatal("can't get wrlock"); - HASH_DEL(elts, e); - pthread_rwlock_unlock(&lock); - -If you prefer, you can use a mutex instead of a read-write lock, but this will -reduce reader concurrency to a single thread at a time. - -An example program using uthash with a read-write lock is included in -`tests/threads/test1.c`. - -[[Macro_reference]] -Macro reference ---------------- - -Convenience macros -~~~~~~~~~~~~~~~~~~ -The convenience macros do the same thing as the generalized macros, but -require fewer arguments. - -In order to use the convenience macros, - -1. the structure's `UT_hash_handle` field must be named `hh`, and -2. for add or find, the key field must be of type `int` or `char[]` or pointer - -.Convenience macros -[width="90%",cols="10m,30m",grid="none",options="header"] -|=============================================================================== -|macro | arguments -|HASH_ADD_INT | (head, keyfield_name, item_ptr) -|HASH_FIND_INT | (head, key_ptr, item_ptr) -|HASH_ADD_STR | (head, keyfield_name, item_ptr) -|HASH_FIND_STR | (head, key_ptr, item_ptr) -|HASH_ADD_PTR | (head, keyfield_name, item_ptr) -|HASH_FIND_PTR | (head, key_ptr, item_ptr) -|HASH_DEL | (head, item_ptr) -|HASH_SORT | (head, cmp) -|HASH_COUNT | (head) -|=============================================================================== - -General macros -~~~~~~~~~~~~~~ - -These macros add, find, delete and sort the items in a hash. You need to -use the general macros if your `UT_hash_handle` is named something other -than `hh`, or if your key's data type isn't `int` or `char[]`. - -.General macros -[width="90%",cols="10m,30m",grid="none",options="header"] -|=============================================================================== -|macro | arguments -|HASH_ADD | (hh_name, head, keyfield_name, key_len, item_ptr) -|HASH_ADD_KEYPTR| (hh_name, head, key_ptr, key_len, item_ptr) -|HASH_FIND | (hh_name, head, key_ptr, key_len, item_ptr) -|HASH_DELETE | (hh_name, head, item_ptr) -|HASH_SRT | (hh_name, head, cmp) -|HASH_CNT | (hh_name, head) -|HASH_CLEAR | (hh_name, head) -|HASH_SELECT | (dst_hh_name, dst_head, src_hh_name, src_head, condition) -|HASH_ITER | (hh_name, head, item_ptr, tmp_item_ptr) -|=============================================================================== - -[NOTE] -`HASH_ADD_KEYPTR` is used when the structure contains a pointer to the -key, rather than the key itself. - - -Argument descriptions -^^^^^^^^^^^^^^^^^^^^^ -hh_name:: - name of the `UT_hash_handle` field in the structure. Conventionally called - `hh`. -head:: - the structure pointer variable which acts as the "head" of the hash. So - named because it initially points to the first item that is added to the hash. -keyfield_name:: - the name of the key field in the structure. (In the case of a multi-field - key, this is the first field of the key). If you're new to macros, it - might seem strange to pass the name of a field as a parameter. See - <>. -key_len:: - the length of the key field in bytes. E.g. for an integer key, this is - `sizeof(int)`, while for a string key it's `strlen(key)`. (For a - multi-field key, see the notes in this guide on calculating key length). -key_ptr:: - for `HASH_FIND`, this is a pointer to the key to look up in the hash - (since it's a pointer, you can't directly pass a literal value here). For - `HASH_ADD_KEYPTR`, this is the address of the key of the item being added. -item_ptr:: - pointer to the structure being added, deleted, or looked up, or the current - pointer during iteration. This is an input parameter for `HASH_ADD` and - `HASH_DELETE` macros, and an output parameter for `HASH_FIND` and - `HASH_ITER`. (When using `HASH_ITER` to iterate, `tmp_item_ptr` - is another variable of the same type as `item_ptr`, used internally). -cmp:: - pointer to comparison function which accepts two arguments (pointers to - items to compare) and returns an int specifying whether the first item - should sort before, equal to, or after the second item (like `strcmp`). -condition:: - a function or macro which accepts a single argument-- a void pointer to a - structure, which needs to be cast to the appropriate structure type. The - function or macro should return (or evaluate to) a non-zero value if the - structure should be "selected" for addition to the destination hash. - -// vim: set tw=80 wm=2 syntax=asciidoc: - diff --git a/3rdparty/uthash-1.9.3/doc/txt/utarray.txt b/3rdparty/uthash-1.9.3/doc/txt/utarray.txt deleted file mode 100644 index 0275653..0000000 --- a/3rdparty/uthash-1.9.3/doc/txt/utarray.txt +++ /dev/null @@ -1,366 +0,0 @@ -utarray: dynamic array macros for C -=================================== -Troy D. Hanson -v1.9, March 2010 - -include::sflogo.txt[] -include::topnav_utarray.txt[] - -Introduction ------------- -include::toc.txt[] - -A set of general-purpose dynamic array macros for C structures are included with -uthash in `utarray.h`. To use these macros in your own C program, just -copy `utarray.h` into your source directory and use it in your programs. - - #include "utarray.h" - -The dynamic array supports basic operations such as push, pop, and erase on the -array elements. These array elements can be any simple datatype or structure. -The array <> are based loosely on the C++ STL vector methods. - -Internally the dynamic array contains a contiguous memory region into which -the elements are copied. This buffer is grown as needed using `realloc` to -accomodate all the data that is pushed into it. - -Download -~~~~~~~~ -To download the `utarray.h` header file, follow the link on the -http://uthash.sourceforge.net[uthash home page]. - -BSD licensed -~~~~~~~~~~~~ -This software is made available under the -link:license.html[revised BSD license]. -It is free and open source. - -Platforms -~~~~~~~~~ -The 'utarray' macros have been tested on: - - * Linux, - * Mac OS X, - * Windows, using Visual Studio 2008 and Visual Studio 2010 - -Usage ------ - -Declaration -~~~~~~~~~~~ - -The array itself has the data type `UT_array`, regardless of the type of -elements to be stored in it. It is declared like, - - UT_array *nums; - -New and free -~~~~~~~~~~~~ -The next step is to create the array using `utarray_new`. Later when you're -done with the array, `utarray_free` will free it and all its elements. - -Push, pop, etc -~~~~~~~~~~~~~~ -The central features of the utarray involve putting elements into it, taking -them out, and iterating over them. There are several <> -to pick from that deal with either single elements or ranges of elements at a -time. In the examples below we will use only the push operation to insert -elements. - -Elements --------- - -Support for dynamic arrays of integers or strings is especially easy. These are -best shown by example: - -Integers -~~~~~~~~ -This example makes a utarray of integers, pushes 0-9 into it, then prints it. -Lastly it frees it. - -.Integer elements -------------------------------------------------------------------------------- -#include -#include "utarray.h" - -int main() { - UT_array *nums; - int i, *p; - - utarray_new(nums,&ut_int_icd); - for(i=0; i < 10; i++) utarray_push_back(nums,&i); - - for(p=(int*)utarray_front(nums); - p!=NULL; - p=(int*)utarray_next(nums,p)) { - printf("%d\n",*p); - } - - utarray_free(nums); - - return 0; -} -------------------------------------------------------------------------------- - -The second argument to `utarray_push_back` is always a 'pointer' to the type -(so a literal cannot be used). So for integers, it is an `int*`. - -Strings -~~~~~~~ -In this example we make a utarray of strings, push two strings into it, print -it and free it. - -.String elements -------------------------------------------------------------------------------- -#include -#include "utarray.h" - -int main() { - UT_array *strs; - char *s, **p; - - utarray_new(strs,&ut_str_icd); - - s = "hello"; utarray_push_back(strs, &s); - s = "world"; utarray_push_back(strs, &s); - p = NULL; - while ( (p=(char**)utarray_next(strs,p))) { - printf("%s\n",*p); - } - - utarray_free(strs); - - return 0; -} -------------------------------------------------------------------------------- - -In this example, since the element is a `char*`, we pass a pointer to it -(`char**`) as the second argument to `utarray_push_back`. Note that "push" makes -a copy of the source string and pushes that copy into the array. - -About UT_icd -~~~~~~~~~~~~ - -Arrays be made of any type of element, not just integers and strings. The -elements can be basic types or structures. Unless you're dealing with integers -and strings (which use pre-defined `ut_int_icd` and `ut_str_icd`), you'll need -to define a `UT_icd` helper structure. This structure contains everything that -utarray needs to initialize, copy or destruct elements. - - typedef struct { - size_t sz; - init_f *init; - ctor_f *copy; - dtor_f *dtor; - } UT_icd; - -The three function pointers `init`, `copy`, and `dtor` have these prototypes: - - typedef void (ctor_f)(void *dst, const void *src); - typedef void (dtor_f)(void *elt); - typedef void (init_f)(void *elt); - -The `sz` is just the size of the element being stored in the array. - -The `init` function will be invoked whenever utarray needs to initialize an -empty element. This only happens as a byproduct of `utarray_resize` or -`utarray_extend_back`. If `init` is `NULL`, it defaults to zero filling the -new element using memset. - -The `copy` function is used whenever an element is copied into the array. -It is invoked during `utarray_push_back`, `utarray_insert`, `utarray_inserta`, -or `utarray_concat`. If `copy` is `NULL`, it defaults to a bitwise copy using -memcpy. - -The `dtor` function is used to clean up an element that is being removed from -the array. It may be invoked due to `utarray_resize`, `utarray_pop_back`, -`utarray_erase`, `utarray_clear`, `utarray_done` or `utarray_free`. If the -elements need no cleanup upon destruction, `dtor` may be `NULL`. - -Scalar types -~~~~~~~~~~~~ - -The next example uses `UT_icd` with all its defaults to make a utarray of -`long` elements. This example pushes two longs, prints them, and frees the -array. - -.long elements -------------------------------------------------------------------------------- -#include -#include "utarray.h" - -int main() { - UT_array *nums; - UT_icd long_icd = {sizeof(long), NULL, NULL, NULL }; - long l, *p; - utarray_new(nums, &long_icd); - - l=1; utarray_push_back(nums, &l); - l=2; utarray_push_back(nums, &l); - - p=NULL; - while( (p=(long*)utarray_next(nums,p))) printf("%ld\n", *p); - - utarray_free(nums); - return 0; -} -------------------------------------------------------------------------------- - -Structures -~~~~~~~~~~ - -Structures can be used as utarray elements. If the structure requires no -special effort to initialize, copy or destruct, we can use `UT_icd` with all -its defaults. This example shows a structure that consists of two integers. Here -we push two values, print them and free the array. - -.Structure (simple) -------------------------------------------------------------------------------- -#include -#include "utarray.h" - -typedef struct { - int a; - int b; -} intpair_t; - -int main() { - - UT_array *pairs; - UT_icd intpair_icd = {sizeof(intpair_t), NULL, NULL, NULL}; - intpair_t ip, *p; - utarray_new(pairs,&intpair_icd); - - ip.a=1; ip.b=2; utarray_push_back(pairs, &ip); - ip.a=10; ip.b=20; utarray_push_back(pairs, &ip); - - for(p=(intpair_t*)utarray_front(pairs); - p!=NULL; - p=(intpair_t*)utarray_next(pairs,p)) { - printf("%d %d\n", p->a, p->b); - } - - utarray_free(pairs); - return 0; -} -------------------------------------------------------------------------------- - -The real utility of `UT_icd` is apparent when the elements of the utarray are -structures that require special work to initialize, copy or destruct. - -For example, when a structure contains pointers to related memory areas that -need to be copied when the structure is copied (and freed when the structure is -freed), we can use custom `init`, `copy`, and `dtor` members in the `UT_icd`. - -Here we take an example of a structure that contains an integer and a string. -When this element is copied (such as when an element is pushed into the array), -we want to "deep copy" the `s` pointer (so the original element and the new -element point to their own copies of `s`). When an element is destructed, we -want to "deep free" its copy of `s`. Lastly, this example is written to work -even if `s` has the value `NULL`. - -.Structure (complex) -------------------------------------------------------------------------------- -#include -#include -#include "utarray.h" - -typedef struct { - int a; - char *s; -} intchar_t; - -void intchar_copy(void *_dst, const void *_src) { - intchar_t *dst = (intchar_t*)_dst, *src = (intchar_t*)_src; - dst->a = src->a; - dst->s = src->s ? strdup(src->s) : NULL; -} - -void intchar_dtor(void *_elt) { - intchar_t *elt = (intchar_t*)_elt; - if (elt->s) free(elt->s); -} - -int main() { - UT_array *intchars; - UT_icd intchar_icd = {sizeof(intchar_t), NULL, intchar_copy, intchar_dtor}; - intchar_t ic, *p; - utarray_new(intchars, &intchar_icd); - - ic.a=1; ic.s="hello"; utarray_push_back(intchars, &ic); - ic.a=2; ic.s="world"; utarray_push_back(intchars, &ic); - - p=NULL; - while( (p=(intchar_t*)utarray_next(intchars,p))) { - printf("%d %s\n", p->a, (p->s ? p->s : "null")); - } - - utarray_free(intchars); - return 0; -} - -------------------------------------------------------------------------------- - -[[operations]] -Reference ---------- -This table lists all the utarray operations. These are loosely based on the C++ -vector class. - -Operations -~~~~~~~~~~ - -[width="100%",cols="50 -v1.9, March 2010 - -include::sflogo.txt[] -include::topnav_utlist.txt[] - -Introduction ------------- -include::toc.txt[] - -A set of general-purpose 'linked list' macros for C structures are included with -uthash in `utlist.h`. To use these macros in your own C program, just -copy `utlist.h` into your source directory and use it in your programs. - - #include "utlist.h" - -These macros support the basic linked list operations: adding and deleting -elements, sorting them and iterating over them. - -Download -~~~~~~~~ -To download the `utlist.h` header file, follow the link on the -http://uthash.sourceforge.net[uthash home page]. - -BSD licensed -~~~~~~~~~~~~ -This software is made available under the -link:license.html[revised BSD license]. -It is free and open source. - -Platforms -~~~~~~~~~ -The 'utlist' macros have been tested on: - - * Linux, - * Mac OS X, and - * Windows, using Visual Studio 2008, Visual Studio 2010, or Cygwin/MinGW. - -Using utlist ------------- - -Types of lists -~~~~~~~~~~~~~~ -Three types of linked lists are supported: - -- *singly-linked* lists, -- *doubly-linked* lists, and -- *circular, doubly-linked* lists - -Efficiency -^^^^^^^^^^ -For all types of lists, prepending elements and deleting elements are -constant-time operations. Appending to a singly-linked list is an 'O(n)' -operation but appending to a doubly-linked list is constant time using these -macros. (This is because, in the utlist implementation of the doubly-linked -list, the head element's `prev` member points back to the list tail, even when -the list is non-circular). Sorting is an 'O(n log(n))' operation. Iteration -and searching are `O(n)` for all list types. - -List elements -~~~~~~~~~~~~~ -You can use any structure with these macros, as long as the structure -contains a `next` pointer. If you want to make a doubly-linked list, -the element also needs to have a `prev` pointer. - - typedef struct { - char *name; - struct element *prev; /* needed for a doubly-linked list only */ - struct element *next; /* needed for singly- or doubly-linked lists */ - } element; - -You can name your structure anything. In the example above it is called `element`. -Within a particular list, all elements must be of the same type. - -List head -~~~~~~~~~ -The list head is simply a pointer to your element structure. You can name it -anything. *It must be initialized to `NULL`*. - - element *head = NULL; - -List operations -~~~~~~~~~~~~~~~ -The lists support inserting or deleting elements, sorting the elements and -iterating over them. - -[width="100%",cols="10 -#include -#include -#include "utlist.h" - -#define BUFLEN 20 - -typedef struct el { - char bname[BUFLEN]; - struct el *next, *prev; -} el; - -int namecmp(el *a, el *b) { - return strcmp(a->bname,b->bname); -} - -el *head = NULL; /* important- initialize to NULL! */ - -int main(int argc, char *argv[]) { - el *name, *elt, *tmp, etmp; - - char linebuf[BUFLEN]; - FILE *file; - - if ( (file = fopen( "test11.dat", "r" )) == NULL ) { - perror("can't open: "); - exit(-1); - } - - while (fgets(linebuf,BUFLEN,file) != NULL) { - if ( (name = (el*)malloc(sizeof(el))) == NULL) exit(-1); - strncpy(name->bname,linebuf,BUFLEN); - DL_APPEND(head, name); - } - DL_SORT(head, namecmp); - DL_FOREACH(head,elt) printf("%s", elt->bname); - - memcpy(&etmp.bname, "WES\n", 5); - DL_SEARCH(head,elt,&etmp,namecmp); - if (elt) printf("found %s\n", elt->bname); - - /* now delete each element, use the safe iterator */ - DL_FOREACH_SAFE(head,elt,tmp) { - DL_DELETE(head,elt); - } - - fclose(file); - - return 0; -} --------------------------------------------------------------------------------- - -// vim: set nowrap syntax=asciidoc: - diff --git a/3rdparty/uthash-1.9.3/doc/txt/utstring.txt b/3rdparty/uthash-1.9.3/doc/txt/utstring.txt deleted file mode 100644 index e9e6f87..0000000 --- a/3rdparty/uthash-1.9.3/doc/txt/utstring.txt +++ /dev/null @@ -1,177 +0,0 @@ -utstring: dynamic string macros for C -===================================== -Troy D. Hanson -v1.9, March 2010 - -include::sflogo.txt[] -include::topnav_utstring.txt[] - -Introduction ------------- -include::toc.txt[] - -A set of very basic dynamic string macros for C programs are included with -uthash in `utstring.h`. To use these macros in your own C program, just -copy `utstring.h` into your source directory and use it in your programs. - - #include "utstring.h" - -The dynamic string supports basic operations such as inserting data (including -binary data-- despite its name, utstring is not limited to string content), -concatenation, getting the length and content, and clearing it. The string -<> are listed below. - -Download -~~~~~~~~ -To download the `utstring.h` header file, follow the link on the -http://uthash.sourceforge.net[uthash home page]. - -BSD licensed -~~~~~~~~~~~~ -This software is made available under the -link:license.html[revised BSD license]. -It is free and open source. - -Platforms -~~~~~~~~~ -The 'utstring' macros have been tested on: - - * Linux, - * Windows, using Visual Studio 2008 and Visual Studio 2010 - -Usage ------ - -Declaration -~~~~~~~~~~~ - -The dynamic string itself has the data type `UT_string`. It is declared like, - - UT_string *str; - -New and free -~~~~~~~~~~~~ -The next step is to create the string using `utstring_new`. Later when you're -done with it, `utstring_free` will free it and all its content. - -Manipulation -~~~~~~~~~~~~ -The `utstring_printf` or `utstring_bincpy` operations insert (copy) data into -the string. To concatenate one utstring to another, use `utstring_concat`. To -clear the content of the string, use `utstring_clear`. The length of the string -is available from `utstring_len`, and its content from `utstring_body`. This -evaluates to a `char*`. The buffer it points to is always null-terminated. -So, it can be used directly with external functions that expect a string. -This automatic null terminator is not counted in the length of the string. - -Samples -~~~~~~~ - -These examples show how to use utstring. - -.Sample 1 -------------------------------------------------------------------------------- -#include -#include "utstring.h" - -int main() { - UT_string *s; - - utstring_new(s); - utstring_printf(s, "hello world!" ); - printf("%s\n", utstring_body(s)); - - utstring_free(s); - return 0; -} -------------------------------------------------------------------------------- - -The next example is meant to demonstrate that printf 'appends' to the string. -It also shows concatenation. - -.Sample 2 -------------------------------------------------------------------------------- -#include -#include "utstring.h" - -int main() { - UT_string *s, *t; - - utstring_new(s); - utstring_new(t); - - utstring_printf(s, "hello " ); - utstring_printf(s, "world " ); - - utstring_printf(t, "hi " ); - utstring_printf(t, "there " ); - - utstring_concat(s, t); - printf("length: %u\n", utstring_len(s)); - printf("%s\n", utstring_body(s)); - - utstring_free(s); - utstring_free(t); - return 0; -} -------------------------------------------------------------------------------- - -The last example shows how binary data can be inserted into the string. It also -clears the string and prints new data into it. - -.Sample 3 -------------------------------------------------------------------------------- -#include -#include "utstring.h" - -int main() { - UT_string *s; - char binary[] = "\xff\xff"; - - utstring_new(s); - utstring_bincpy(s, binary, sizeof(binary)); - printf("length is %u\n", utstring_len(s)); - - utstring_clear(s); - utstring_printf(s,"number %d", 10); - printf("%s\n", utstring_body(s)); - - utstring_free(s); - return 0; -} -------------------------------------------------------------------------------- - -[[operations]] -Reference ---------- -These are the utstring operations. - -Operations -~~~~~~~~~~ - -[width="100%",cols="50 /* size_t */ -#include /* memset, etc */ -#include /* exit */ - -#define oom() exit(-1) - -typedef void (ctor_f)(void *dst, const void *src); -typedef void (dtor_f)(void *elt); -typedef void (init_f)(void *elt); -typedef struct { - size_t sz; - init_f *init; - ctor_f *copy; - dtor_f *dtor; -} UT_icd; - -typedef struct { - unsigned i,n;/* i: index of next available slot, n: num slots */ - const UT_icd *icd; /* initializer, copy and destructor functions */ - char *d; /* n slots of size icd->sz*/ -} UT_array; - -#define utarray_init(a,_icd) do { \ - memset(a,0,sizeof(UT_array)); \ - (a)->icd=_icd; \ -} while(0) - -#define utarray_done(a) do { \ - if ((a)->n) { \ - if ((a)->icd->dtor) { \ - size_t _ut_i; \ - for(_ut_i=0; _ut_i < (a)->i; _ut_i++) { \ - (a)->icd->dtor(utarray_eltptr(a,_ut_i)); \ - } \ - } \ - free((a)->d); \ - } \ - (a)->n=0; \ -} while(0) - -#define utarray_new(a,_icd) do { \ - a=(UT_array*)malloc(sizeof(UT_array)); \ - utarray_init(a,_icd); \ -} while(0) - -#define utarray_free(a) do { \ - utarray_done(a); \ - free(a); \ -} while(0) - -#define utarray_reserve(a,by) do { \ - if (((a)->i+by) > ((a)->n)) { \ - while(((a)->i+by) > ((a)->n)) { (a)->n = ((a)->n ? (2*(a)->n) : 8); } \ - if ( ((a)->d=(char*)realloc((a)->d, (a)->n*(a)->icd->sz)) == NULL) oom(); \ - } \ -} while(0) - -#define utarray_push_back(a,p) do { \ - utarray_reserve(a,1); \ - if ((a)->icd->copy) { (a)->icd->copy( _utarray_eltptr(a,(a)->i++), p); } \ - else { memcpy(_utarray_eltptr(a,(a)->i++), p, (a)->icd->sz); }; \ -} while(0) - -#define utarray_pop_back(a) do { \ - if ((a)->icd->dtor) { (a)->icd->dtor( _utarray_eltptr(a,--((a)->i))); } \ - else { (a)->i--; } \ -} while(0) - -#define utarray_extend_back(a) do { \ - utarray_reserve(a,1); \ - if ((a)->icd->init) { (a)->icd->init(_utarray_eltptr(a,(a)->i)); } \ - else { memset(_utarray_eltptr(a,(a)->i),0,(a)->icd->sz); } \ - (a)->i++; \ -} while(0) - -#define utarray_len(a) ((a)->i) - -#define utarray_eltptr(a,j) (((j) < (a)->i) ? _utarray_eltptr(a,j) : NULL) -#define _utarray_eltptr(a,j) ((char*)((a)->d + ((a)->icd->sz*(j) ))) - -#define utarray_insert(a,p,j) do { \ - utarray_reserve(a,1); \ - if (j > (a)->i) break; \ - if ((j) < (a)->i) { \ - memmove( _utarray_eltptr(a,(j)+1), _utarray_eltptr(a,j), \ - ((a)->i - (j))*((a)->icd->sz)); \ - } \ - if ((a)->icd->copy) { (a)->icd->copy( _utarray_eltptr(a,j), p); } \ - else { memcpy(_utarray_eltptr(a,j), p, (a)->icd->sz); }; \ - (a)->i++; \ -} while(0) - -#define utarray_inserta(a,w,j) do { \ - if (utarray_len(w) == 0) break; \ - if (j > (a)->i) break; \ - utarray_reserve(a,utarray_len(w)); \ - if ((j) < (a)->i) { \ - memmove(_utarray_eltptr(a,(j)+utarray_len(w)), \ - _utarray_eltptr(a,j), \ - ((a)->i - (j))*((a)->icd->sz)); \ - } \ - if (a->icd->copy) { \ - size_t _ut_i; \ - for(_ut_i=0;_ut_i<(w)->i;_ut_i++) { \ - (a)->icd->copy(_utarray_eltptr(a,j+_ut_i), _utarray_eltptr(w,_ut_i)); \ - } \ - } else { \ - memcpy(_utarray_eltptr(a,j), _utarray_eltptr(w,0), \ - utarray_len(w)*((a)->icd->sz)); \ - } \ - (a)->i += utarray_len(w); \ -} while(0) - -#define utarray_resize(dst,num) do { \ - size_t _ut_i; \ - if (dst->i > (size_t)(num)) { \ - if ((dst)->icd->dtor) { \ - for(_ut_i=num; _ut_i < dst->i; _ut_i++) { \ - (dst)->icd->dtor(utarray_eltptr(dst,_ut_i)); \ - } \ - } \ - } else if (dst->i < (size_t)(num)) { \ - utarray_reserve(dst,num-dst->i); \ - if ((dst)->icd->init) { \ - for(_ut_i=dst->i; _ut_i < num; _ut_i++) { \ - (dst)->icd->init(utarray_eltptr(dst,_ut_i)); \ - } \ - } else { \ - memset(_utarray_eltptr(dst,dst->i),0,(dst)->icd->sz*(num-dst->i)); \ - } \ - } \ - dst->i = num; \ -} while(0) - -#define utarray_concat(dst,src) do { \ - utarray_inserta(dst,src,utarray_len(dst)); \ -} while(0) - -#define utarray_erase(a,pos,len) do { \ - if ((a)->icd->dtor) { \ - size_t _ut_i; \ - for(_ut_i=0; _ut_i < len; _ut_i++) { \ - (a)->icd->dtor(utarray_eltptr(a,pos+_ut_i)); \ - } \ - } \ - if ((a)->i > (pos+len)) { \ - memmove( _utarray_eltptr(a,pos), _utarray_eltptr(a,pos+len), \ - ((a->i)-(pos+len))*((a)->icd->sz)); \ - } \ - (a)->i -= (len); \ -} while(0) - -#define utarray_clear(a) do { \ - if ((a)->i > 0) { \ - if ((a)->icd->dtor) { \ - size_t _ut_i; \ - for(_ut_i=0; _ut_i < (a)->i; _ut_i++) { \ - (a)->icd->dtor(utarray_eltptr(a,_ut_i)); \ - } \ - } \ - (a)->i = 0; \ - } \ -} while(0) - -#define utarray_sort(a,cmp) do { \ - qsort((a)->d, (a)->i, (a)->icd->sz, cmp); \ -} while(0) - -#define utarray_front(a) (((a)->i) ? (_utarray_eltptr(a,0)) : NULL) -#define utarray_next(a,e) (((e)==NULL) ? utarray_front(a) : ((((a)->i) > (utarray_eltidx(a,e)+1)) ? _utarray_eltptr(a,utarray_eltidx(a,e)+1) : NULL)) -#define utarray_back(a) (((a)->i) ? (_utarray_eltptr(a,(a)->i-1)) : NULL) -#define utarray_eltidx(a,e) (((char*)(e) >= (char*)((a)->d)) ? (((char*)(e) - (char*)((a)->d))/(a)->icd->sz) : -1) - -/* last we pre-define a few icd for common utarrays of ints and strings */ -static void utarray_str_cpy(void *dst, const void *src) { - char **_src = (char**)src, **_dst = (char**)dst; - *_dst = (*_src == NULL) ? NULL : strdup(*_src); -} -static void utarray_str_dtor(void *elt) { - char **eltc = (char**)elt; - if (*eltc) free(*eltc); -} -static const UT_icd ut_str_icd _UNUSED_ = {sizeof(char*),NULL,utarray_str_cpy,utarray_str_dtor}; -static const UT_icd ut_int_icd _UNUSED_ = {sizeof(int),NULL,NULL,NULL}; - - -#endif /* UTARRAY_H */ diff --git a/3rdparty/uthash-1.9.3/src/uthash.h b/3rdparty/uthash-1.9.3/src/uthash.h deleted file mode 100644 index a4bdc18..0000000 --- a/3rdparty/uthash-1.9.3/src/uthash.h +++ /dev/null @@ -1,972 +0,0 @@ -/* -Copyright (c) 2003-2010, Troy D. Hanson http://uthash.sourceforge.net -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -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 OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef UTHASH_H -#define UTHASH_H - -#include /* memcmp,strlen */ -#include /* ptrdiff_t */ - -/* These macros use decltype or the earlier __typeof GNU extension. - As decltype is only available in newer compilers (VS2010 or gcc 4.3+ - when compiling c++ source) this code uses whatever method is needed - or, for VS2008 where neither is available, uses casting workarounds. */ -#ifdef _MSC_VER /* MS compiler */ -#if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */ -#define DECLTYPE(x) (decltype(x)) -#else /* VS2008 or older (or VS2010 in C mode) */ -#define NO_DECLTYPE -#define DECLTYPE(x) -#endif -#else /* GNU, Sun and other compilers */ -#define DECLTYPE(x) (__typeof(x)) -#endif - -#ifdef NO_DECLTYPE -#define DECLTYPE_ASSIGN(dst,src) \ -do { \ - char **_da_dst = (char**)(&(dst)); \ - *_da_dst = (char*)(src); \ -} while(0) -#else -#define DECLTYPE_ASSIGN(dst,src) \ -do { \ - (dst) = DECLTYPE(dst)(src); \ -} while(0) -#endif - -/* a number of the hash function use uint32_t which isn't defined on win32 */ -#ifdef _MSC_VER -typedef unsigned int uint32_t; -#else -#include /* uint32_t */ -#endif - -#define UTHASH_VERSION 1.9.3 - -#define uthash_fatal(msg) exit(-1) /* fatal error (out of memory,etc) */ -#define uthash_malloc(sz) malloc(sz) /* malloc fcn */ -#define uthash_free(ptr,sz) free(ptr) /* free fcn */ - -#define uthash_noexpand_fyi(tbl) /* can be defined to log noexpand */ -#define uthash_expand_fyi(tbl) /* can be defined to log expands */ - -/* initial number of buckets */ -#define HASH_INITIAL_NUM_BUCKETS 32 /* initial number of buckets */ -#define HASH_INITIAL_NUM_BUCKETS_LOG2 5 /* lg2 of initial number of buckets */ -#define HASH_BKT_CAPACITY_THRESH 10 /* expand when bucket count reaches */ - -/* calculate the element whose hash handle address is hhe */ -#define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho))) - -#define HASH_FIND(hh,head,keyptr,keylen,out) \ -do { \ - unsigned _hf_bkt,_hf_hashv; \ - out=NULL; \ - if (head) { \ - HASH_FCN(keyptr,keylen, (head)->hh.tbl->num_buckets, _hf_hashv, _hf_bkt); \ - if (HASH_BLOOM_TEST((head)->hh.tbl, _hf_hashv)) { \ - HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], \ - keyptr,keylen,out); \ - } \ - } \ -} while (0) - -#ifdef HASH_BLOOM -#define HASH_BLOOM_BITLEN (1ULL << HASH_BLOOM) -#define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8) + ((HASH_BLOOM_BITLEN%8) ? 1:0) -#define HASH_BLOOM_MAKE(tbl) \ -do { \ - (tbl)->bloom_nbits = HASH_BLOOM; \ - (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN); \ - if (!((tbl)->bloom_bv)) { uthash_fatal( "out of memory"); } \ - memset((tbl)->bloom_bv, 0, HASH_BLOOM_BYTELEN); \ - (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE; \ -} while (0); - -#define HASH_BLOOM_FREE(tbl) \ -do { \ - uthash_free((tbl)->bloom_bv, HASH_BLOOM_BYTELEN); \ -} while (0); - -#define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8] |= (1U << ((idx)%8))) -#define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8] & (1U << ((idx)%8))) - -#define HASH_BLOOM_ADD(tbl,hashv) \ - HASH_BLOOM_BITSET((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1))) - -#define HASH_BLOOM_TEST(tbl,hashv) \ - HASH_BLOOM_BITTEST((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1))) - -#else -#define HASH_BLOOM_MAKE(tbl) -#define HASH_BLOOM_FREE(tbl) -#define HASH_BLOOM_ADD(tbl,hashv) -#define HASH_BLOOM_TEST(tbl,hashv) (1) -#endif - -#define HASH_MAKE_TABLE(hh,head) \ -do { \ - (head)->hh.tbl = (UT_hash_table*)uthash_malloc( \ - sizeof(UT_hash_table)); \ - if (!((head)->hh.tbl)) { uthash_fatal( "out of memory"); } \ - memset((head)->hh.tbl, 0, sizeof(UT_hash_table)); \ - (head)->hh.tbl->tail = &((head)->hh); \ - (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \ - (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \ - (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \ - (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \ - HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ - if (! (head)->hh.tbl->buckets) { uthash_fatal( "out of memory"); } \ - memset((head)->hh.tbl->buckets, 0, \ - HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ - HASH_BLOOM_MAKE((head)->hh.tbl); \ - (head)->hh.tbl->signature = HASH_SIGNATURE; \ -} while(0) - -#define HASH_ADD(hh,head,fieldname,keylen_in,add) \ - HASH_ADD_KEYPTR(hh,head,&add->fieldname,keylen_in,add) - -#define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \ -do { \ - unsigned _ha_bkt; \ - (add)->hh.next = NULL; \ - (add)->hh.key = (char*)keyptr; \ - (add)->hh.keylen = keylen_in; \ - if (!(head)) { \ - head = (add); \ - (head)->hh.prev = NULL; \ - HASH_MAKE_TABLE(hh,head); \ - } else { \ - (head)->hh.tbl->tail->next = (add); \ - (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail); \ - (head)->hh.tbl->tail = &((add)->hh); \ - } \ - (head)->hh.tbl->num_items++; \ - (add)->hh.tbl = (head)->hh.tbl; \ - HASH_FCN(keyptr,keylen_in, (head)->hh.tbl->num_buckets, \ - (add)->hh.hashv, _ha_bkt); \ - HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt],&(add)->hh); \ - HASH_BLOOM_ADD((head)->hh.tbl,(add)->hh.hashv); \ - HASH_EMIT_KEY(hh,head,keyptr,keylen_in); \ - HASH_FSCK(hh,head); \ -} while(0) - -#define HASH_TO_BKT( hashv, num_bkts, bkt ) \ -do { \ - bkt = ((hashv) & ((num_bkts) - 1)); \ -} while(0) - -/* delete "delptr" from the hash table. - * "the usual" patch-up process for the app-order doubly-linked-list. - * The use of _hd_hh_del below deserves special explanation. - * These used to be expressed using (delptr) but that led to a bug - * if someone used the same symbol for the head and deletee, like - * HASH_DELETE(hh,users,users); - * We want that to work, but by changing the head (users) below - * we were forfeiting our ability to further refer to the deletee (users) - * in the patch-up process. Solution: use scratch space to - * copy the deletee pointer, then the latter references are via that - * scratch pointer rather than through the repointed (users) symbol. - */ -#define HASH_DELETE(hh,head,delptr) \ -do { \ - unsigned _hd_bkt; \ - struct UT_hash_handle *_hd_hh_del; \ - if ( ((delptr)->hh.prev == NULL) && ((delptr)->hh.next == NULL) ) { \ - uthash_free((head)->hh.tbl->buckets, \ - (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \ - HASH_BLOOM_FREE((head)->hh.tbl); \ - uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ - head = NULL; \ - } else { \ - _hd_hh_del = &((delptr)->hh); \ - if ((delptr) == ELMT_FROM_HH((head)->hh.tbl,(head)->hh.tbl->tail)) { \ - (head)->hh.tbl->tail = \ - (UT_hash_handle*)((char*)((delptr)->hh.prev) + \ - (head)->hh.tbl->hho); \ - } \ - if ((delptr)->hh.prev) { \ - ((UT_hash_handle*)((char*)((delptr)->hh.prev) + \ - (head)->hh.tbl->hho))->next = (delptr)->hh.next; \ - } else { \ - DECLTYPE_ASSIGN(head,(delptr)->hh.next); \ - } \ - if (_hd_hh_del->next) { \ - ((UT_hash_handle*)((char*)_hd_hh_del->next + \ - (head)->hh.tbl->hho))->prev = \ - _hd_hh_del->prev; \ - } \ - HASH_TO_BKT( _hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \ - HASH_DEL_IN_BKT(hh,(head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del); \ - (head)->hh.tbl->num_items--; \ - } \ - HASH_FSCK(hh,head); \ -} while (0) - - -/* convenience forms of HASH_FIND/HASH_ADD/HASH_DEL */ -#define HASH_FIND_STR(head,findstr,out) \ - HASH_FIND(hh,head,findstr,strlen(findstr),out) -#define HASH_ADD_STR(head,strfield,add) \ - HASH_ADD(hh,head,strfield,strlen(add->strfield),add) -#define HASH_FIND_INT(head,findint,out) \ - HASH_FIND(hh,head,findint,sizeof(int),out) -#define HASH_ADD_INT(head,intfield,add) \ - HASH_ADD(hh,head,intfield,sizeof(int),add) -#define HASH_FIND_PTR(head,findptr,out) \ - HASH_FIND(hh,head,findptr,sizeof(void *),out) -#define HASH_ADD_PTR(head,ptrfield,add) \ - HASH_ADD(hh,head,ptrfield,sizeof(void *),add) -#define HASH_DEL(head,delptr) \ - HASH_DELETE(hh,head,delptr) - -/* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined. - * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined. - */ -#ifdef HASH_DEBUG -#define HASH_OOPS(...) do { fprintf(stderr,__VA_ARGS__); exit(-1); } while (0) -#define HASH_FSCK(hh,head) \ -do { \ - unsigned _bkt_i; \ - unsigned _count, _bkt_count; \ - char *_prev; \ - struct UT_hash_handle *_thh; \ - if (head) { \ - _count = 0; \ - for( _bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; _bkt_i++) { \ - _bkt_count = 0; \ - _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head; \ - _prev = NULL; \ - while (_thh) { \ - if (_prev != (char*)(_thh->hh_prev)) { \ - HASH_OOPS("invalid hh_prev %p, actual %p\n", \ - _thh->hh_prev, _prev ); \ - } \ - _bkt_count++; \ - _prev = (char*)(_thh); \ - _thh = _thh->hh_next; \ - } \ - _count += _bkt_count; \ - if ((head)->hh.tbl->buckets[_bkt_i].count != _bkt_count) { \ - HASH_OOPS("invalid bucket count %d, actual %d\n", \ - (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \ - } \ - } \ - if (_count != (head)->hh.tbl->num_items) { \ - HASH_OOPS("invalid hh item count %d, actual %d\n", \ - (head)->hh.tbl->num_items, _count ); \ - } \ - /* traverse hh in app order; check next/prev integrity, count */ \ - _count = 0; \ - _prev = NULL; \ - _thh = &(head)->hh; \ - while (_thh) { \ - _count++; \ - if (_prev !=(char*)(_thh->prev)) { \ - HASH_OOPS("invalid prev %p, actual %p\n", \ - _thh->prev, _prev ); \ - } \ - _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh); \ - _thh = ( _thh->next ? (UT_hash_handle*)((char*)(_thh->next) + \ - (head)->hh.tbl->hho) : NULL ); \ - } \ - if (_count != (head)->hh.tbl->num_items) { \ - HASH_OOPS("invalid app item count %d, actual %d\n", \ - (head)->hh.tbl->num_items, _count ); \ - } \ - } \ -} while (0) -#else -#define HASH_FSCK(hh,head) -#endif - -/* When compiled with -DHASH_EMIT_KEYS, length-prefixed keys are emitted to - * the descriptor to which this macro is defined for tuning the hash function. - * The app can #include to get the prototype for write(2). */ -#ifdef HASH_EMIT_KEYS -#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) \ -do { \ - unsigned _klen = fieldlen; \ - write(HASH_EMIT_KEYS, &_klen, sizeof(_klen)); \ - write(HASH_EMIT_KEYS, keyptr, fieldlen); \ -} while (0) -#else -#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) -#endif - -/* default to Jenkin's hash unless overridden e.g. DHASH_FUNCTION=HASH_SAX */ -#ifdef HASH_FUNCTION -#define HASH_FCN HASH_FUNCTION -#else -#define HASH_FCN HASH_JEN -#endif - -/* The Bernstein hash function, used in Perl prior to v5.6 */ -#define HASH_BER(key,keylen,num_bkts,hashv,bkt) \ -do { \ - unsigned _hb_keylen=keylen; \ - char *_hb_key=(char*)(key); \ - (hashv) = 0; \ - while (_hb_keylen--) { (hashv) = ((hashv) * 33) + *_hb_key++; } \ - bkt = (hashv) & (num_bkts-1); \ -} while (0) - - -/* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at - * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx */ -#define HASH_SAX(key,keylen,num_bkts,hashv,bkt) \ -do { \ - unsigned _sx_i; \ - char *_hs_key=(char*)(key); \ - hashv = 0; \ - for(_sx_i=0; _sx_i < keylen; _sx_i++) \ - hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i]; \ - bkt = hashv & (num_bkts-1); \ -} while (0) - -#define HASH_FNV(key,keylen,num_bkts,hashv,bkt) \ -do { \ - unsigned _fn_i; \ - char *_hf_key=(char*)(key); \ - hashv = 2166136261UL; \ - for(_fn_i=0; _fn_i < keylen; _fn_i++) \ - hashv = (hashv * 16777619) ^ _hf_key[_fn_i]; \ - bkt = hashv & (num_bkts-1); \ -} while(0); - -#define HASH_OAT(key,keylen,num_bkts,hashv,bkt) \ -do { \ - unsigned _ho_i; \ - char *_ho_key=(char*)(key); \ - hashv = 0; \ - for(_ho_i=0; _ho_i < keylen; _ho_i++) { \ - hashv += _ho_key[_ho_i]; \ - hashv += (hashv << 10); \ - hashv ^= (hashv >> 6); \ - } \ - hashv += (hashv << 3); \ - hashv ^= (hashv >> 11); \ - hashv += (hashv << 15); \ - bkt = hashv & (num_bkts-1); \ -} while(0) - -#define HASH_JEN_MIX(a,b,c) \ -do { \ - a -= b; a -= c; a ^= ( c >> 13 ); \ - b -= c; b -= a; b ^= ( a << 8 ); \ - c -= a; c -= b; c ^= ( b >> 13 ); \ - a -= b; a -= c; a ^= ( c >> 12 ); \ - b -= c; b -= a; b ^= ( a << 16 ); \ - c -= a; c -= b; c ^= ( b >> 5 ); \ - a -= b; a -= c; a ^= ( c >> 3 ); \ - b -= c; b -= a; b ^= ( a << 10 ); \ - c -= a; c -= b; c ^= ( b >> 15 ); \ -} while (0) - -#define HASH_JEN(key,keylen,num_bkts,hashv,bkt) \ -do { \ - unsigned _hj_i,_hj_j,_hj_k; \ - char *_hj_key=(char*)(key); \ - hashv = 0xfeedbeef; \ - _hj_i = _hj_j = 0x9e3779b9; \ - _hj_k = keylen; \ - while (_hj_k >= 12) { \ - _hj_i += (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 ) \ - + ( (unsigned)_hj_key[2] << 16 ) \ - + ( (unsigned)_hj_key[3] << 24 ) ); \ - _hj_j += (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 ) \ - + ( (unsigned)_hj_key[6] << 16 ) \ - + ( (unsigned)_hj_key[7] << 24 ) ); \ - hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 ) \ - + ( (unsigned)_hj_key[10] << 16 ) \ - + ( (unsigned)_hj_key[11] << 24 ) ); \ - \ - HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ - \ - _hj_key += 12; \ - _hj_k -= 12; \ - } \ - hashv += keylen; \ - switch ( _hj_k ) { \ - case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); \ - case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); \ - case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); \ - case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); \ - case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); \ - case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); \ - case 5: _hj_j += _hj_key[4]; \ - case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); \ - case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); \ - case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); \ - case 1: _hj_i += _hj_key[0]; \ - } \ - HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ - bkt = hashv & (num_bkts-1); \ -} while(0) - -/* The Paul Hsieh hash function */ -#undef get16bits -#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \ - || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__) -#define get16bits(d) (*((const uint16_t *) (d))) -#endif - -#if !defined (get16bits) -#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) \ - +(uint32_t)(((const uint8_t *)(d))[0]) ) -#endif -#define HASH_SFH(key,keylen,num_bkts,hashv,bkt) \ -do { \ - char *_sfh_key=(char*)(key); \ - uint32_t _sfh_tmp, _sfh_len = keylen; \ - \ - int _sfh_rem = _sfh_len & 3; \ - _sfh_len >>= 2; \ - hashv = 0xcafebabe; \ - \ - /* Main loop */ \ - for (;_sfh_len > 0; _sfh_len--) { \ - hashv += get16bits (_sfh_key); \ - _sfh_tmp = (get16bits (_sfh_key+2) << 11) ^ hashv; \ - hashv = (hashv << 16) ^ _sfh_tmp; \ - _sfh_key += 2*sizeof (uint16_t); \ - hashv += hashv >> 11; \ - } \ - \ - /* Handle end cases */ \ - switch (_sfh_rem) { \ - case 3: hashv += get16bits (_sfh_key); \ - hashv ^= hashv << 16; \ - hashv ^= _sfh_key[sizeof (uint16_t)] << 18; \ - hashv += hashv >> 11; \ - break; \ - case 2: hashv += get16bits (_sfh_key); \ - hashv ^= hashv << 11; \ - hashv += hashv >> 17; \ - break; \ - case 1: hashv += *_sfh_key; \ - hashv ^= hashv << 10; \ - hashv += hashv >> 1; \ - } \ - \ - /* Force "avalanching" of final 127 bits */ \ - hashv ^= hashv << 3; \ - hashv += hashv >> 5; \ - hashv ^= hashv << 4; \ - hashv += hashv >> 17; \ - hashv ^= hashv << 25; \ - hashv += hashv >> 6; \ - bkt = hashv & (num_bkts-1); \ -} while(0); - -#ifdef HASH_USING_NO_STRICT_ALIASING -/* The MurmurHash exploits some CPU's (e.g. x86) tolerance for unaligned reads. - * For other types of CPU's (e.g. Sparc) an unaligned read causes a bus error. - * So MurmurHash comes in two versions, the faster unaligned one and the slower - * aligned one. We only use the faster one on CPU's where we know it's safe. - * - * Note the preprocessor built-in defines can be emitted using: - * - * gcc -m64 -dM -E - < /dev/null (on gcc) - * cc -## a.c (where a.c is a simple test file) (Sun Studio) - */ -#if (defined(__i386__) || defined(__x86_64__)) -#define HASH_MUR HASH_MUR_UNALIGNED -#else -#define HASH_MUR HASH_MUR_ALIGNED -#endif - -/* Appleby's MurmurHash fast version for unaligned-tolerant archs like i386 */ -#define HASH_MUR_UNALIGNED(key,keylen,num_bkts,hashv,bkt) \ -do { \ - const unsigned int _mur_m = 0x5bd1e995; \ - const int _mur_r = 24; \ - hashv = 0xcafebabe ^ keylen; \ - char *_mur_key = (char *)(key); \ - uint32_t _mur_tmp, _mur_len = keylen; \ - \ - for (;_mur_len >= 4; _mur_len-=4) { \ - _mur_tmp = *(uint32_t *)_mur_key; \ - _mur_tmp *= _mur_m; \ - _mur_tmp ^= _mur_tmp >> _mur_r; \ - _mur_tmp *= _mur_m; \ - hashv *= _mur_m; \ - hashv ^= _mur_tmp; \ - _mur_key += 4; \ - } \ - \ - switch(_mur_len) \ - { \ - case 3: hashv ^= _mur_key[2] << 16; \ - case 2: hashv ^= _mur_key[1] << 8; \ - case 1: hashv ^= _mur_key[0]; \ - hashv *= _mur_m; \ - }; \ - \ - hashv ^= hashv >> 13; \ - hashv *= _mur_m; \ - hashv ^= hashv >> 15; \ - \ - bkt = hashv & (num_bkts-1); \ -} while(0) - -/* Appleby's MurmurHash version for alignment-sensitive archs like Sparc */ -#define HASH_MUR_ALIGNED(key,keylen,num_bkts,hashv,bkt) \ -do { \ - const unsigned int _mur_m = 0x5bd1e995; \ - const int _mur_r = 24; \ - hashv = 0xcafebabe ^ (keylen); \ - char *_mur_key = (char *)(key); \ - uint32_t _mur_len = keylen; \ - int _mur_align = (int)_mur_key & 3; \ - \ - if (_mur_align && (_mur_len >= 4)) { \ - unsigned _mur_t = 0, _mur_d = 0; \ - switch(_mur_align) { \ - case 1: _mur_t |= _mur_key[2] << 16; \ - case 2: _mur_t |= _mur_key[1] << 8; \ - case 3: _mur_t |= _mur_key[0]; \ - } \ - _mur_t <<= (8 * _mur_align); \ - _mur_key += 4-_mur_align; \ - _mur_len -= 4-_mur_align; \ - int _mur_sl = 8 * (4-_mur_align); \ - int _mur_sr = 8 * _mur_align; \ - \ - for (;_mur_len >= 4; _mur_len-=4) { \ - _mur_d = *(unsigned *)_mur_key; \ - _mur_t = (_mur_t >> _mur_sr) | (_mur_d << _mur_sl); \ - unsigned _mur_k = _mur_t; \ - _mur_k *= _mur_m; \ - _mur_k ^= _mur_k >> _mur_r; \ - _mur_k *= _mur_m; \ - hashv *= _mur_m; \ - hashv ^= _mur_k; \ - _mur_t = _mur_d; \ - _mur_key += 4; \ - } \ - _mur_d = 0; \ - if(_mur_len >= _mur_align) { \ - switch(_mur_align) { \ - case 3: _mur_d |= _mur_key[2] << 16; \ - case 2: _mur_d |= _mur_key[1] << 8; \ - case 1: _mur_d |= _mur_key[0]; \ - } \ - unsigned _mur_k = (_mur_t >> _mur_sr) | (_mur_d << _mur_sl); \ - _mur_k *= _mur_m; \ - _mur_k ^= _mur_k >> _mur_r; \ - _mur_k *= _mur_m; \ - hashv *= _mur_m; \ - hashv ^= _mur_k; \ - _mur_k += _mur_align; \ - _mur_len -= _mur_align; \ - \ - switch(_mur_len) \ - { \ - case 3: hashv ^= _mur_key[2] << 16; \ - case 2: hashv ^= _mur_key[1] << 8; \ - case 1: hashv ^= _mur_key[0]; \ - hashv *= _mur_m; \ - } \ - } else { \ - switch(_mur_len) \ - { \ - case 3: _mur_d ^= _mur_key[2] << 16; \ - case 2: _mur_d ^= _mur_key[1] << 8; \ - case 1: _mur_d ^= _mur_key[0]; \ - case 0: hashv ^= (_mur_t >> _mur_sr) | (_mur_d << _mur_sl); \ - hashv *= _mur_m; \ - } \ - } \ - \ - hashv ^= hashv >> 13; \ - hashv *= _mur_m; \ - hashv ^= hashv >> 15; \ - } else { \ - for (;_mur_len >= 4; _mur_len-=4) { \ - unsigned _mur_k = *(unsigned*)_mur_key; \ - _mur_k *= _mur_m; \ - _mur_k ^= _mur_k >> _mur_r; \ - _mur_k *= _mur_m; \ - hashv *= _mur_m; \ - hashv ^= _mur_k; \ - _mur_key += 4; \ - } \ - switch(_mur_len) \ - { \ - case 3: hashv ^= _mur_key[2] << 16; \ - case 2: hashv ^= _mur_key[1] << 8; \ - case 1: hashv ^= _mur_key[0]; \ - hashv *= _mur_m; \ - } \ - \ - hashv ^= hashv >> 13; \ - hashv *= _mur_m; \ - hashv ^= hashv >> 15; \ - } \ - bkt = hashv & (num_bkts-1); \ -} while(0) -#endif /* HASH_USING_NO_STRICT_ALIASING */ - -/* key comparison function; return 0 if keys equal */ -#define HASH_KEYCMP(a,b,len) memcmp(a,b,len) - -/* iterate over items in a known bucket to find desired item */ -#define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,out) \ -do { \ - if (head.hh_head) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,head.hh_head)); \ - else out=NULL; \ - while (out) { \ - if (out->hh.keylen == keylen_in) { \ - if ((HASH_KEYCMP(out->hh.key,keyptr,keylen_in)) == 0) break; \ - } \ - if (out->hh.hh_next) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,out->hh.hh_next)); \ - else out = NULL; \ - } \ -} while(0) - -/* add an item to a bucket */ -#define HASH_ADD_TO_BKT(head,addhh) \ -do { \ - head.count++; \ - (addhh)->hh_next = head.hh_head; \ - (addhh)->hh_prev = NULL; \ - if (head.hh_head) { (head).hh_head->hh_prev = (addhh); } \ - (head).hh_head=addhh; \ - if (head.count >= ((head.expand_mult+1) * HASH_BKT_CAPACITY_THRESH) \ - && (addhh)->tbl->noexpand != 1) { \ - HASH_EXPAND_BUCKETS((addhh)->tbl); \ - } \ -} while(0) - -/* remove an item from a given bucket */ -#define HASH_DEL_IN_BKT(hh,head,hh_del) \ - (head).count--; \ - if ((head).hh_head == hh_del) { \ - (head).hh_head = hh_del->hh_next; \ - } \ - if (hh_del->hh_prev) { \ - hh_del->hh_prev->hh_next = hh_del->hh_next; \ - } \ - if (hh_del->hh_next) { \ - hh_del->hh_next->hh_prev = hh_del->hh_prev; \ - } - -/* Bucket expansion has the effect of doubling the number of buckets - * and redistributing the items into the new buckets. Ideally the - * items will distribute more or less evenly into the new buckets - * (the extent to which this is true is a measure of the quality of - * the hash function as it applies to the key domain). - * - * With the items distributed into more buckets, the chain length - * (item count) in each bucket is reduced. Thus by expanding buckets - * the hash keeps a bound on the chain length. This bounded chain - * length is the essence of how a hash provides constant time lookup. - * - * The calculation of tbl->ideal_chain_maxlen below deserves some - * explanation. First, keep in mind that we're calculating the ideal - * maximum chain length based on the *new* (doubled) bucket count. - * In fractions this is just n/b (n=number of items,b=new num buckets). - * Since the ideal chain length is an integer, we want to calculate - * ceil(n/b). We don't depend on floating point arithmetic in this - * hash, so to calculate ceil(n/b) with integers we could write - * - * ceil(n/b) = (n/b) + ((n%b)?1:0) - * - * and in fact a previous version of this hash did just that. - * But now we have improved things a bit by recognizing that b is - * always a power of two. We keep its base 2 log handy (call it lb), - * so now we can write this with a bit shift and logical AND: - * - * ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0) - * - */ -#define HASH_EXPAND_BUCKETS(tbl) \ -do { \ - unsigned _he_bkt; \ - unsigned _he_bkt_i; \ - struct UT_hash_handle *_he_thh, *_he_hh_nxt; \ - UT_hash_bucket *_he_new_buckets, *_he_newbkt; \ - _he_new_buckets = (UT_hash_bucket*)uthash_malloc( \ - 2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ - if (!_he_new_buckets) { uthash_fatal( "out of memory"); } \ - memset(_he_new_buckets, 0, \ - 2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ - tbl->ideal_chain_maxlen = \ - (tbl->num_items >> (tbl->log2_num_buckets+1)) + \ - ((tbl->num_items & ((tbl->num_buckets*2)-1)) ? 1 : 0); \ - tbl->nonideal_items = 0; \ - for(_he_bkt_i = 0; _he_bkt_i < tbl->num_buckets; _he_bkt_i++) \ - { \ - _he_thh = tbl->buckets[ _he_bkt_i ].hh_head; \ - while (_he_thh) { \ - _he_hh_nxt = _he_thh->hh_next; \ - HASH_TO_BKT( _he_thh->hashv, tbl->num_buckets*2, _he_bkt); \ - _he_newbkt = &(_he_new_buckets[ _he_bkt ]); \ - if (++(_he_newbkt->count) > tbl->ideal_chain_maxlen) { \ - tbl->nonideal_items++; \ - _he_newbkt->expand_mult = _he_newbkt->count / \ - tbl->ideal_chain_maxlen; \ - } \ - _he_thh->hh_prev = NULL; \ - _he_thh->hh_next = _he_newbkt->hh_head; \ - if (_he_newbkt->hh_head) _he_newbkt->hh_head->hh_prev = \ - _he_thh; \ - _he_newbkt->hh_head = _he_thh; \ - _he_thh = _he_hh_nxt; \ - } \ - } \ - uthash_free( tbl->buckets, tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \ - tbl->num_buckets *= 2; \ - tbl->log2_num_buckets++; \ - tbl->buckets = _he_new_buckets; \ - tbl->ineff_expands = (tbl->nonideal_items > (tbl->num_items >> 1)) ? \ - (tbl->ineff_expands+1) : 0; \ - if (tbl->ineff_expands > 1) { \ - tbl->noexpand=1; \ - uthash_noexpand_fyi(tbl); \ - } \ - uthash_expand_fyi(tbl); \ -} while(0) - - -/* This is an adaptation of Simon Tatham's O(n log(n)) mergesort */ -/* Note that HASH_SORT assumes the hash handle name to be hh. - * HASH_SRT was added to allow the hash handle name to be passed in. */ -#define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn) -#define HASH_SRT(hh,head,cmpfcn) \ -do { \ - unsigned _hs_i; \ - unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize; \ - struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail; \ - if (head) { \ - _hs_insize = 1; \ - _hs_looping = 1; \ - _hs_list = &((head)->hh); \ - while (_hs_looping) { \ - _hs_p = _hs_list; \ - _hs_list = NULL; \ - _hs_tail = NULL; \ - _hs_nmerges = 0; \ - while (_hs_p) { \ - _hs_nmerges++; \ - _hs_q = _hs_p; \ - _hs_psize = 0; \ - for ( _hs_i = 0; _hs_i < _hs_insize; _hs_i++ ) { \ - _hs_psize++; \ - _hs_q = (UT_hash_handle*)((_hs_q->next) ? \ - ((void*)((char*)(_hs_q->next) + \ - (head)->hh.tbl->hho)) : NULL); \ - if (! (_hs_q) ) break; \ - } \ - _hs_qsize = _hs_insize; \ - while ((_hs_psize > 0) || ((_hs_qsize > 0) && _hs_q )) { \ - if (_hs_psize == 0) { \ - _hs_e = _hs_q; \ - _hs_q = (UT_hash_handle*)((_hs_q->next) ? \ - ((void*)((char*)(_hs_q->next) + \ - (head)->hh.tbl->hho)) : NULL); \ - _hs_qsize--; \ - } else if ( (_hs_qsize == 0) || !(_hs_q) ) { \ - _hs_e = _hs_p; \ - _hs_p = (UT_hash_handle*)((_hs_p->next) ? \ - ((void*)((char*)(_hs_p->next) + \ - (head)->hh.tbl->hho)) : NULL); \ - _hs_psize--; \ - } else if (( \ - cmpfcn(DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_p)), \ - DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_q))) \ - ) <= 0) { \ - _hs_e = _hs_p; \ - _hs_p = (UT_hash_handle*)((_hs_p->next) ? \ - ((void*)((char*)(_hs_p->next) + \ - (head)->hh.tbl->hho)) : NULL); \ - _hs_psize--; \ - } else { \ - _hs_e = _hs_q; \ - _hs_q = (UT_hash_handle*)((_hs_q->next) ? \ - ((void*)((char*)(_hs_q->next) + \ - (head)->hh.tbl->hho)) : NULL); \ - _hs_qsize--; \ - } \ - if ( _hs_tail ) { \ - _hs_tail->next = ((_hs_e) ? \ - ELMT_FROM_HH((head)->hh.tbl,_hs_e) : NULL); \ - } else { \ - _hs_list = _hs_e; \ - } \ - _hs_e->prev = ((_hs_tail) ? \ - ELMT_FROM_HH((head)->hh.tbl,_hs_tail) : NULL); \ - _hs_tail = _hs_e; \ - } \ - _hs_p = _hs_q; \ - } \ - _hs_tail->next = NULL; \ - if ( _hs_nmerges <= 1 ) { \ - _hs_looping=0; \ - (head)->hh.tbl->tail = _hs_tail; \ - DECLTYPE_ASSIGN(head,ELMT_FROM_HH((head)->hh.tbl, _hs_list)); \ - } \ - _hs_insize *= 2; \ - } \ - HASH_FSCK(hh,head); \ - } \ -} while (0) - -/* This function selects items from one hash into another hash. - * The end result is that the selected items have dual presence - * in both hashes. There is no copy of the items made; rather - * they are added into the new hash through a secondary hash - * hash handle that must be present in the structure. */ -#define HASH_SELECT(hh_dst, dst, hh_src, src, cond) \ -do { \ - unsigned _src_bkt, _dst_bkt; \ - void *_last_elt=NULL, *_elt; \ - UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL; \ - ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst)); \ - if (src) { \ - for(_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) { \ - for(_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head; \ - _src_hh; \ - _src_hh = _src_hh->hh_next) { \ - _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh); \ - if (cond(_elt)) { \ - _dst_hh = (UT_hash_handle*)(((char*)_elt) + _dst_hho); \ - _dst_hh->key = _src_hh->key; \ - _dst_hh->keylen = _src_hh->keylen; \ - _dst_hh->hashv = _src_hh->hashv; \ - _dst_hh->prev = _last_elt; \ - _dst_hh->next = NULL; \ - if (_last_elt_hh) { _last_elt_hh->next = _elt; } \ - if (!dst) { \ - DECLTYPE_ASSIGN(dst,_elt); \ - HASH_MAKE_TABLE(hh_dst,dst); \ - } else { \ - _dst_hh->tbl = (dst)->hh_dst.tbl; \ - } \ - HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt); \ - HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt],_dst_hh); \ - (dst)->hh_dst.tbl->num_items++; \ - _last_elt = _elt; \ - _last_elt_hh = _dst_hh; \ - } \ - } \ - } \ - } \ - HASH_FSCK(hh_dst,dst); \ -} while (0) - -#define HASH_CLEAR(hh,head) \ -do { \ - if (head) { \ - uthash_free((head)->hh.tbl->buckets, \ - (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket)); \ - uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ - (head)=NULL; \ - } \ -} while(0) - -#ifdef NO_DECLTYPE -#define HASH_ITER(hh,head,el,tmp) \ -for((el)=(head), (*(char**)(&(tmp)))=(char*)((head)?(head)->hh.next:NULL); \ - el; (el)=(tmp),(*(char**)(&(tmp)))=(char*)((tmp)?(tmp)->hh.next:NULL)) -#else -#define HASH_ITER(hh,head,el,tmp) \ -for((el)=(head),(tmp)=DECLTYPE(el)((head)?(head)->hh.next:NULL); \ - el; (el)=(tmp),(tmp)=DECLTYPE(el)((tmp)?(tmp)->hh.next:NULL)) -#endif - -/* obtain a count of items in the hash */ -#define HASH_COUNT(head) HASH_CNT(hh,head) -#define HASH_CNT(hh,head) ((head)?((head)->hh.tbl->num_items):0) - -typedef struct UT_hash_bucket { - struct UT_hash_handle *hh_head; - unsigned count; - - /* expand_mult is normally set to 0. In this situation, the max chain length - * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If - * the bucket's chain exceeds this length, bucket expansion is triggered). - * However, setting expand_mult to a non-zero value delays bucket expansion - * (that would be triggered by additions to this particular bucket) - * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH. - * (The multiplier is simply expand_mult+1). The whole idea of this - * multiplier is to reduce bucket expansions, since they are expensive, in - * situations where we know that a particular bucket tends to be overused. - * It is better to let its chain length grow to a longer yet-still-bounded - * value, than to do an O(n) bucket expansion too often. - */ - unsigned expand_mult; - -} UT_hash_bucket; - -/* random signature used only to find hash tables in external analysis */ -#define HASH_SIGNATURE 0xa0111fe1 -#define HASH_BLOOM_SIGNATURE 0xb12220f2 - -typedef struct UT_hash_table { - UT_hash_bucket *buckets; - unsigned num_buckets, log2_num_buckets; - unsigned num_items; - struct UT_hash_handle *tail; /* tail hh in app order, for fast append */ - ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */ - - /* in an ideal situation (all buckets used equally), no bucket would have - * more than ceil(#items/#buckets) items. that's the ideal chain length. */ - unsigned ideal_chain_maxlen; - - /* nonideal_items is the number of items in the hash whose chain position - * exceeds the ideal chain maxlen. these items pay the penalty for an uneven - * hash distribution; reaching them in a chain traversal takes >ideal steps */ - unsigned nonideal_items; - - /* ineffective expands occur when a bucket doubling was performed, but - * afterward, more than half the items in the hash had nonideal chain - * positions. If this happens on two consecutive expansions we inhibit any - * further expansion, as it's not helping; this happens when the hash - * function isn't a good fit for the key domain. When expansion is inhibited - * the hash will still work, albeit no longer in constant time. */ - unsigned ineff_expands, noexpand; - - uint32_t signature; /* used only to find hash tables in external analysis */ -#ifdef HASH_BLOOM - uint32_t bloom_sig; /* used only to test bloom exists in external analysis */ - uint8_t *bloom_bv; - char bloom_nbits; -#endif - -} UT_hash_table; - -typedef struct UT_hash_handle { - struct UT_hash_table *tbl; - void *prev; /* prev element in app order */ - void *next; /* next element in app order */ - struct UT_hash_handle *hh_prev; /* previous hh in bucket order */ - struct UT_hash_handle *hh_next; /* next hh in bucket order */ - void *key; /* ptr to enclosing struct's key */ - unsigned keylen; /* enclosing struct's key len */ - unsigned hashv; /* result of hash-fcn(key) */ -} UT_hash_handle; - -#endif /* UTHASH_H */ diff --git a/3rdparty/uthash-1.9.3/src/utlist.h b/3rdparty/uthash-1.9.3/src/utlist.h deleted file mode 100644 index 34c725b..0000000 --- a/3rdparty/uthash-1.9.3/src/utlist.h +++ /dev/null @@ -1,490 +0,0 @@ -/* -Copyright (c) 2007-2010, Troy D. Hanson http://uthash.sourceforge.net -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -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 OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef UTLIST_H -#define UTLIST_H - -#define UTLIST_VERSION 1.9.1 - -/* - * This file contains macros to manipulate singly and doubly-linked lists. - * - * 1. LL_ macros: singly-linked lists. - * 2. DL_ macros: doubly-linked lists. - * 3. CDL_ macros: circular doubly-linked lists. - * - * To use singly-linked lists, your structure must have a "next" pointer. - * To use doubly-linked lists, your structure must "prev" and "next" pointers. - * Either way, the pointer to the head of the list must be initialized to NULL. - * - * ----------------.EXAMPLE ------------------------- - * struct item { - * int id; - * struct item *prev, *next; - * } - * - * struct item *list = NULL: - * - * int main() { - * struct item *item; - * ... allocate and populate item ... - * DL_APPEND(list, item); - * } - * -------------------------------------------------- - * - * For doubly-linked lists, the append and delete macros are O(1) - * For singly-linked lists, append and delete are O(n) but prepend is O(1) - * The sort macro is O(n log(n)) for all types of single/double/circular lists. - */ - -/* These macros use decltype or the earlier __typeof GNU extension. - As decltype is only available in newer compilers (VS2010 or gcc 4.3+ - when compiling c++ code), this code uses whatever method is needed - or, for VS2008 where neither is available, uses casting workarounds. */ -#ifdef _MSC_VER /* MS compiler */ -#if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */ -#define LDECLTYPE(x) decltype(x) -#else /* VS2008 or older (or VS2010 in C mode) */ -#define NO_DECLTYPE -#define LDECLTYPE(x) char* -#endif -#else /* GNU, Sun and other compilers */ -#define LDECLTYPE(x) __typeof(x) -#endif - -/* for VS2008 we use some workarounds to get around the lack of decltype, - * namely, we always reassign our tmp variable to the list head if we need - * to dereference its prev/next pointers, and save/restore the real head.*/ -#ifdef NO_DECLTYPE -#define _SV(elt,list) _tmp = (char*)(list); {char **_alias = (char**)&(list); *_alias = (elt); } -#define _NEXT(elt,list) ((char*)((list)->next)) -#define _NEXTASGN(elt,list,to) { char **_alias = (char**)&((list)->next); *_alias=(char*)(to); } -#define _PREV(elt,list) ((char*)((list)->prev)) -#define _PREVASGN(elt,list,to) { char **_alias = (char**)&((list)->prev); *_alias=(char*)(to); } -#define _RS(list) { char **_alias = (char**)&(list); *_alias=_tmp; } -#define _CASTASGN(a,b) { char **_alias = (char**)&(a); *_alias=(char*)(b); } -#else -#define _SV(elt,list) -#define _NEXT(elt,list) ((elt)->next) -#define _NEXTASGN(elt,list,to) ((elt)->next)=(to) -#define _PREV(elt,list) ((elt)->prev) -#define _PREVASGN(elt,list,to) ((elt)->prev)=(to) -#define _RS(list) -#define _CASTASGN(a,b) (a)=(b) -#endif - -/****************************************************************************** - * The sort macro is an adaptation of Simon Tatham's O(n log(n)) mergesort * - * Unwieldy variable names used here to avoid shadowing passed-in variables. * - *****************************************************************************/ -#define LL_SORT(list, cmp) \ -do { \ - LDECLTYPE(list) _ls_p; \ - LDECLTYPE(list) _ls_q; \ - LDECLTYPE(list) _ls_e; \ - LDECLTYPE(list) _ls_tail; \ - LDECLTYPE(list) _ls_oldhead; \ - LDECLTYPE(list) _tmp; \ - int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \ - if (list) { \ - _ls_insize = 1; \ - _ls_looping = 1; \ - while (_ls_looping) { \ - _CASTASGN(_ls_p,list); \ - _CASTASGN(_ls_oldhead,list); \ - list = NULL; \ - _ls_tail = NULL; \ - _ls_nmerges = 0; \ - while (_ls_p) { \ - _ls_nmerges++; \ - _ls_q = _ls_p; \ - _ls_psize = 0; \ - for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \ - _ls_psize++; \ - _SV(_ls_q,list); _ls_q = _NEXT(_ls_q,list); _RS(list); \ - if (!_ls_q) break; \ - } \ - _ls_qsize = _ls_insize; \ - while (_ls_psize > 0 || (_ls_qsize > 0 && _ls_q)) { \ - if (_ls_psize == 0) { \ - _ls_e = _ls_q; _SV(_ls_q,list); _ls_q = _NEXT(_ls_q,list); _RS(list); _ls_qsize--; \ - } else if (_ls_qsize == 0 || !_ls_q) { \ - _ls_e = _ls_p; _SV(_ls_p,list); _ls_p = _NEXT(_ls_p,list); _RS(list); _ls_psize--; \ - } else if (cmp(_ls_p,_ls_q) <= 0) { \ - _ls_e = _ls_p; _SV(_ls_p,list); _ls_p = _NEXT(_ls_p,list); _RS(list); _ls_psize--; \ - } else { \ - _ls_e = _ls_q; _SV(_ls_q,list); _ls_q = _NEXT(_ls_q,list); _RS(list); _ls_qsize--; \ - } \ - if (_ls_tail) { \ - _SV(_ls_tail,list); _NEXTASGN(_ls_tail,list,_ls_e); _RS(list); \ - } else { \ - _CASTASGN(list,_ls_e); \ - } \ - _ls_tail = _ls_e; \ - } \ - _ls_p = _ls_q; \ - } \ - _SV(_ls_tail,list); _NEXTASGN(_ls_tail,list,NULL); _RS(list); \ - if (_ls_nmerges <= 1) { \ - _ls_looping=0; \ - } \ - _ls_insize *= 2; \ - } \ - } else _tmp=NULL; /* quiet gcc unused variable warning */ \ -} while (0) - -#define DL_SORT(list, cmp) \ -do { \ - LDECLTYPE(list) _ls_p; \ - LDECLTYPE(list) _ls_q; \ - LDECLTYPE(list) _ls_e; \ - LDECLTYPE(list) _ls_tail; \ - LDECLTYPE(list) _ls_oldhead; \ - LDECLTYPE(list) _tmp; \ - int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \ - if (list) { \ - _ls_insize = 1; \ - _ls_looping = 1; \ - while (_ls_looping) { \ - _CASTASGN(_ls_p,list); \ - _CASTASGN(_ls_oldhead,list); \ - list = NULL; \ - _ls_tail = NULL; \ - _ls_nmerges = 0; \ - while (_ls_p) { \ - _ls_nmerges++; \ - _ls_q = _ls_p; \ - _ls_psize = 0; \ - for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \ - _ls_psize++; \ - _SV(_ls_q,list); _ls_q = _NEXT(_ls_q,list); _RS(list); \ - if (!_ls_q) break; \ - } \ - _ls_qsize = _ls_insize; \ - while (_ls_psize > 0 || (_ls_qsize > 0 && _ls_q)) { \ - if (_ls_psize == 0) { \ - _ls_e = _ls_q; _SV(_ls_q,list); _ls_q = _NEXT(_ls_q,list); _RS(list); _ls_qsize--; \ - } else if (_ls_qsize == 0 || !_ls_q) { \ - _ls_e = _ls_p; _SV(_ls_p,list); _ls_p = _NEXT(_ls_p,list); _RS(list); _ls_psize--; \ - } else if (cmp(_ls_p,_ls_q) <= 0) { \ - _ls_e = _ls_p; _SV(_ls_p,list); _ls_p = _NEXT(_ls_p,list); _RS(list); _ls_psize--; \ - } else { \ - _ls_e = _ls_q; _SV(_ls_q,list); _ls_q = _NEXT(_ls_q,list); _RS(list); _ls_qsize--; \ - } \ - if (_ls_tail) { \ - _SV(_ls_tail,list); _NEXTASGN(_ls_tail,list,_ls_e); _RS(list); \ - } else { \ - _CASTASGN(list,_ls_e); \ - } \ - _SV(_ls_e,list); _PREVASGN(_ls_e,list,_ls_tail); _RS(list); \ - _ls_tail = _ls_e; \ - } \ - _ls_p = _ls_q; \ - } \ - _CASTASGN(list->prev, _ls_tail); \ - _SV(_ls_tail,list); _NEXTASGN(_ls_tail,list,NULL); _RS(list); \ - if (_ls_nmerges <= 1) { \ - _ls_looping=0; \ - } \ - _ls_insize *= 2; \ - } \ - } else _tmp=NULL; /* quiet gcc unused variable warning */ \ -} while (0) - -#define CDL_SORT(list, cmp) \ -do { \ - LDECLTYPE(list) _ls_p; \ - LDECLTYPE(list) _ls_q; \ - LDECLTYPE(list) _ls_e; \ - LDECLTYPE(list) _ls_tail; \ - LDECLTYPE(list) _ls_oldhead; \ - LDECLTYPE(list) _tmp; \ - LDECLTYPE(list) _tmp2; \ - int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \ - if (list) { \ - _ls_insize = 1; \ - _ls_looping = 1; \ - while (_ls_looping) { \ - _CASTASGN(_ls_p,list); \ - _CASTASGN(_ls_oldhead,list); \ - list = NULL; \ - _ls_tail = NULL; \ - _ls_nmerges = 0; \ - while (_ls_p) { \ - _ls_nmerges++; \ - _ls_q = _ls_p; \ - _ls_psize = 0; \ - for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \ - _ls_psize++; \ - _SV(_ls_q,list); \ - if (_NEXT(_ls_q,list) == _ls_oldhead) { \ - _ls_q = NULL; \ - } else { \ - _ls_q = _NEXT(_ls_q,list); \ - } \ - _RS(list); \ - if (!_ls_q) break; \ - } \ - _ls_qsize = _ls_insize; \ - while (_ls_psize > 0 || (_ls_qsize > 0 && _ls_q)) { \ - if (_ls_psize == 0) { \ - _ls_e = _ls_q; _SV(_ls_q,list); _ls_q = _NEXT(_ls_q,list); _RS(list); _ls_qsize--; \ - if (_ls_q == _ls_oldhead) { _ls_q = NULL; } \ - } else if (_ls_qsize == 0 || !_ls_q) { \ - _ls_e = _ls_p; _SV(_ls_p,list); _ls_p = _NEXT(_ls_p,list); _RS(list); _ls_psize--; \ - if (_ls_p == _ls_oldhead) { _ls_p = NULL; } \ - } else if (cmp(_ls_p,_ls_q) <= 0) { \ - _ls_e = _ls_p; _SV(_ls_p,list); _ls_p = _NEXT(_ls_p,list); _RS(list); _ls_psize--; \ - if (_ls_p == _ls_oldhead) { _ls_p = NULL; } \ - } else { \ - _ls_e = _ls_q; _SV(_ls_q,list); _ls_q = _NEXT(_ls_q,list); _RS(list); _ls_qsize--; \ - if (_ls_q == _ls_oldhead) { _ls_q = NULL; } \ - } \ - if (_ls_tail) { \ - _SV(_ls_tail,list); _NEXTASGN(_ls_tail,list,_ls_e); _RS(list); \ - } else { \ - _CASTASGN(list,_ls_e); \ - } \ - _SV(_ls_e,list); _PREVASGN(_ls_e,list,_ls_tail); _RS(list); \ - _ls_tail = _ls_e; \ - } \ - _ls_p = _ls_q; \ - } \ - _CASTASGN(list->prev,_ls_tail); \ - _CASTASGN(_tmp2,list); \ - _SV(_ls_tail,list); _NEXTASGN(_ls_tail,list,_tmp2); _RS(list); \ - if (_ls_nmerges <= 1) { \ - _ls_looping=0; \ - } \ - _ls_insize *= 2; \ - } \ - } else _tmp=NULL; /* quiet gcc unused variable warning */ \ -} while (0) - -/****************************************************************************** - * singly linked list macros (non-circular) * - *****************************************************************************/ -#define LL_PREPEND(head,add) \ -do { \ - (add)->next = head; \ - head = add; \ -} while (0) - -#define LL_APPEND(head,add) \ -do { \ - LDECLTYPE(head) _tmp; \ - (add)->next=NULL; \ - if (head) { \ - _tmp = head; \ - while (_tmp->next) { _tmp = _tmp->next; } \ - _tmp->next=(add); \ - } else { \ - (head)=(add); \ - } \ -} while (0) - -#define LL_DELETE(head,del) \ -do { \ - LDECLTYPE(head) _tmp; \ - if ((head) == (del)) { \ - (head)=(head)->next; \ - } else { \ - _tmp = head; \ - while (_tmp->next && (_tmp->next != (del))) { \ - _tmp = _tmp->next; \ - } \ - if (_tmp->next) { \ - _tmp->next = ((del)->next); \ - } \ - } \ -} while (0) - -/* Here are VS2008 replacements for LL_APPEND and LL_DELETE */ -#define LL_APPEND_VS2008(head,add) \ -do { \ - if (head) { \ - (add)->next = head; /* use add->next as a temp variable */ \ - while ((add)->next->next) { (add)->next = (add)->next->next; } \ - (add)->next->next=(add); \ - } else { \ - (head)=(add); \ - } \ - (add)->next=NULL; \ -} while (0) - -#define LL_DELETE_VS2008(head,del) \ -do { \ - if ((head) == (del)) { \ - (head)=(head)->next; \ - } else { \ - char *_tmp = (char*)(head); \ - while (head->next && (head->next != (del))) { \ - head = head->next; \ - } \ - if (head->next) { \ - head->next = ((del)->next); \ - } \ - { \ - char **_head_alias = (char**)&(head); \ - *_head_alias = _tmp; \ - } \ - } \ -} while (0) -#ifdef NO_DECLTYPE -#undef LL_APPEND -#define LL_APPEND LL_APPEND_VS2008 -#undef LL_DELETE -#define LL_DELETE LL_DELETE_VS2008 -#endif -/* end VS2008 replacements */ - -#define LL_FOREACH(head,el) \ - for(el=head;el;el=el->next) - -#define LL_FOREACH_SAFE(head,el,tmp) \ - for((el)=(head);(el) && (tmp = (el)->next, 1); (el) = tmp) - -#define LL_SEARCH_SCALAR(head,out,field,val) \ -do { \ - LL_FOREACH(head,out) { \ - if ((out)->field == (val)) break; \ - } \ -} while(0) - -#define LL_SEARCH(head,out,elt,cmp) \ -do { \ - LL_FOREACH(head,out) { \ - if ((cmp(out,elt))==0) break; \ - } \ -} while(0) - -/****************************************************************************** - * doubly linked list macros (non-circular) * - *****************************************************************************/ -#define DL_PREPEND(head,add) \ -do { \ - (add)->next = head; \ - if (head) { \ - (add)->prev = (head)->prev; \ - (head)->prev = (add); \ - } else { \ - (add)->prev = (add); \ - } \ - (head) = (add); \ -} while (0) - -#define DL_APPEND(head,add) \ -do { \ - if (head) { \ - (add)->prev = (head)->prev; \ - (head)->prev->next = (add); \ - (head)->prev = (add); \ - (add)->next = NULL; \ - } else { \ - (head)=(add); \ - (head)->prev = (head); \ - (head)->next = NULL; \ - } \ -} while (0); - -#define DL_DELETE(head,del) \ -do { \ - if ((del)->prev == (del)) { \ - (head)=NULL; \ - } else if ((del)==(head)) { \ - (del)->next->prev = (del)->prev; \ - (head) = (del)->next; \ - } else { \ - (del)->prev->next = (del)->next; \ - if ((del)->next) { \ - (del)->next->prev = (del)->prev; \ - } else { \ - (head)->prev = (del)->prev; \ - } \ - } \ -} while (0); - - -#define DL_FOREACH(head,el) \ - for(el=head;el;el=el->next) - -/* this version is safe for deleting the elements during iteration */ -#define DL_FOREACH_SAFE(head,el,tmp) \ - for((el)=(head);(el) && (tmp = (el)->next, 1); (el) = tmp) - -/* these are identical to their singly-linked list counterparts */ -#define DL_SEARCH_SCALAR LL_SEARCH_SCALAR -#define DL_SEARCH LL_SEARCH - -/****************************************************************************** - * circular doubly linked list macros * - *****************************************************************************/ -#define CDL_PREPEND(head,add) \ -do { \ - if (head) { \ - (add)->prev = (head)->prev; \ - (add)->next = (head); \ - (head)->prev = (add); \ - (add)->prev->next = (add); \ - } else { \ - (add)->prev = (add); \ - (add)->next = (add); \ - } \ -(head)=(add); \ -} while (0) - -#define CDL_DELETE(head,del) \ -do { \ - if ( ((head)==(del)) && ((head)->next == (head))) { \ - (head) = 0L; \ - } else { \ - (del)->next->prev = (del)->prev; \ - (del)->prev->next = (del)->next; \ - if ((del) == (head)) (head)=(del)->next; \ - } \ -} while (0); - -#define CDL_FOREACH(head,el) \ - for(el=head;el;el=(el->next==head ? 0L : el->next)) - -#define CDL_FOREACH_SAFE(head,el,tmp1,tmp2) \ - for((el)=(head), ((tmp1)=(head)?((head)->prev):NULL); \ - (el) && ((tmp2)=(el)->next, 1); \ - ((el) = (((el)==(tmp1)) ? 0L : (tmp2)))) - -#define CDL_SEARCH_SCALAR(head,out,field,val) \ -do { \ - CDL_FOREACH(head,out) { \ - if ((out)->field == (val)) break; \ - } \ -} while(0) - -#define CDL_SEARCH(head,out,elt,cmp) \ -do { \ - CDL_FOREACH(head,out) { \ - if ((cmp(out,elt))==0) break; \ - } \ -} while(0) - -#endif /* UTLIST_H */ - diff --git a/3rdparty/uthash-1.9.3/src/utstring.h b/3rdparty/uthash-1.9.3/src/utstring.h deleted file mode 100644 index 277874f..0000000 --- a/3rdparty/uthash-1.9.3/src/utstring.h +++ /dev/null @@ -1,137 +0,0 @@ -/* -Copyright (c) 2008-2010, Troy D. Hanson http://uthash.sourceforge.net -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -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 OWNER -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. -*/ - -/* a dynamic string implementation using macros - * see http://uthash.sourceforge.net/utstring - */ -#ifndef UTSTRING_H -#define UTSTRING_H - -#define UTSTRING_VERSION 1.9.1 - -#ifdef __GNUC__ -#define _UNUSED_ __attribute__ ((__unused__)) -#else -#define _UNUSED_ -#endif - -#include -#include -#include -#define oom() exit(-1) - -typedef struct { - char *d; - size_t n; /* allocd size */ - size_t i; /* index of first unused byte */ -} UT_string; - -#define utstring_reserve(s,amt) \ -do { \ - if (((s)->n - (s)->i) < (size_t)(amt)) { \ - (s)->d = (char*)realloc((s)->d, (s)->n + amt); \ - if ((s)->d == NULL) oom(); \ - (s)->n += amt; \ - } \ -} while(0) - -#define utstring_init(s) \ -do { \ - (s)->n = 0; (s)->i = 0; (s)->d = NULL; \ - utstring_reserve(s,100); \ -} while(0) - -#define utstring_done(s) \ -do { \ - if ((s)->d != NULL) free((s)->d); \ - (s)->n = 0; \ -} while(0) - -#define utstring_free(s) \ -do { \ - utstring_done(s); \ - free(s); \ -} while(0) - -#define utstring_new(s) \ -do { \ - s = (UT_string*)calloc(sizeof(UT_string),1); \ - if (!s) oom(); \ - utstring_init(s); \ -} while(0) - -#define utstring_clear(s) \ -do { \ - (s)->i = 0; \ -} while(0) - -#define utstring_bincpy(s,b,l) \ -do { \ - utstring_reserve(s,(l)+1); \ - if (l) memcpy(&(s)->d[(s)->i], b, l); \ - s->i += l; \ - s->d[s->i]='\0'; \ -} while(0) - -#define utstring_concat(dst,src) \ -do { \ - utstring_reserve(dst,(src->i)+1); \ - if (src->i) memcpy(&(dst)->d[(dst)->i], src->d, src->i); \ - dst->i += src->i; \ - dst->d[dst->i]='\0'; \ -} while(0) - -#define utstring_len(s) ((unsigned)((s)->i)) - -#define utstring_body(s) ((s)->d) - -_UNUSED_ static void utstring_printf_va(UT_string *s, const char *fmt, va_list ap) { - int n; - va_list cp; - while (1) { -#ifdef _WIN32 - cp = ap; -#else - va_copy(cp, ap); -#endif - n = vsnprintf (&s->d[s->i], s->n-s->i, fmt, cp); - va_end(cp); - - if ((n > -1) && (n < (int)(s->n-s->i))) { - s->i += n; - return; - } - - /* Else try again with more space. */ - if (n > -1) utstring_reserve(s,n+1); /* exact */ - else utstring_reserve(s,(s->n)*2); /* 2x */ - } -} -_UNUSED_ static void utstring_printf(UT_string *s, const char *fmt, ...) { - va_list ap; - va_start(ap,fmt); - utstring_printf_va(s,fmt,ap); - va_end(ap); -} - -#endif /* UTSTRING_H */ diff --git a/3rdparty/uthash-1.9.3/tests/Makefile b/3rdparty/uthash-1.9.3/tests/Makefile deleted file mode 100644 index 84084b7..0000000 --- a/3rdparty/uthash-1.9.3/tests/Makefile +++ /dev/null @@ -1,111 +0,0 @@ -HASHDIR = ../src -FUNCS = BER SAX FNV OAT JEN SFH -SPECIAL_FUNCS = MUR -UTILS = emit_keys -PROGS = test1 test2 test3 test4 test5 test6 test7 test8 test9 \ - test10 test11 test12 test13 test14 test15 test16 test17 \ - test18 test19 test20 test21 test22 test23 test24 test25 \ - test26 test27 test28 test29 test30 test31 test32 test33 \ - test34 test35 test36 test37 test38 test39 test40 test41 \ - test42 test43 test44 test45 test46 test47 test48 test49 \ - test50 test51 test52 test53 test54 test55 test56 test57 \ - test58 -CFLAGS = -I$(HASHDIR) -#CFLAGS += -DHASH_BLOOM=16 -#CFLAGS += -O3 -CFLAGS += -g -#CFLAGS += -Wstrict-aliasing=2 -CFLAGS += -Wall -#CFLAGS += -std=c89 -CFLAGS += ${EXTRA_CFLAGS} - -ifeq ($(HASH_DEBUG),1) -CFLAGS += -DHASH_DEBUG=1 -endif - -ifeq ($(HASH_PEDANTIC),1) -CFLAGS += -pedantic -endif - -TEST_TARGET=run_tests -TESTS=./do_tests - -MUR_CFLAGS = -DHASH_USING_NO_STRICT_ALIASING -fno-strict-aliasing -# On GNU we use -fno-strict-aliasing when using the Murmurhash -ifneq ($(strip $(shell $(CC) -v 2>&1 |egrep "gcc")),) -ifeq ($(HASH_FUNCTION),"HASH_MUR") - CFLAGS += $(MUR_CFLAGS) -endif -endif - -# Prefer 64-bit compilation on Mac OS X (not necessary, just faster) -ifneq ($(strip $(shell $(CC) -v 2>&1 |egrep "i[0-9]+-apple-darwin")),) - CFLAGS += -m64 -endif - -# detect Cygwin -ifneq ($(strip $(shell $(CC) -v 2>&1 |grep "cygwin")),) - TESTS=./do_tests.cygwin -endif - -# detect MinGW -ifneq ($(strip $(shell $(CC) -v 2>&1 |grep "mingw")),) - TEST_TARGET=run_tests_mingw - TESTS=./do_tests.mingw -endif - -#detect Linux (platform specific utilities) -ifneq ($(strip $(shell $(CC) -v 2>&1 |grep "linux")),) - PLAT_UTILS = hashscan sleep_test -endif - -#detect FreeBSD (platform specific utilities) -ifeq ($(strip $(shell uname -s)), FreeBSD) - ifeq ($(shell if [ `sysctl -n kern.osreldate` -ge 0801000 ]; then echo "ok"; fi), ok) - PLAT_UTILS = hashscan sleep_test - endif -endif - - -all: $(PROGS) $(UTILS) $(PLAT_UTILS) $(FUNCS) $(SPECIAL_FUNCS) $(TEST_TARGET) - -tests_only: $(PROGS) $(TEST_TARGET) - -debug: - $(MAKE) all HASH_DEBUG=1 - -pedantic: - $(MAKE) all HASH_PEDANTIC=1 - -cplusplus: - CC=$(CXX) $(MAKE) all - -example: example.c $(HASHDIR)/uthash.h - $(CC) $(CFLAGS) -o $@ $(@).c - -$(PROGS) $(UTILS) : $(HASHDIR)/uthash.h - $(CC) $(CFLAGS) -o $@ $(@).c - -hashscan : $(HASHDIR)/uthash.h - $(CC) $(CFLAGS) $(MUR_CFLAGS) -o $@ $(@).c - -sleep_test : $(HASHDIR)/uthash.h - $(CC) $(CFLAGS) -DHASH_BLOOM=16 -o $@ $(@).c - -$(FUNCS) : $(HASHDIR)/uthash.h - $(CC) $(CFLAGS) -DHASH_FUNCTION=HASH_$@ -o keystat.$@ keystat.c - -$(SPECIAL_FUNCS) : $(HASHDIR)/uthash.h - $(CC) $(CFLAGS) $(MUR_CFLAGS) -DHASH_FUNCTION=HASH_$@ -o keystat.$@ keystat.c - -run_tests: $(PROGS) - perl $(TESTS) - -run_tests_mingw: $(PROGS) - /bin/sh do_tests.mingw - -.PHONY: clean - -clean: - rm -f $(UTILS) $(PLAT_UTILS) $(PROGS) test*.out keystat.??? example *.exe - rm -rf *.dSYM diff --git a/3rdparty/uthash-1.9.3/tests/README b/3rdparty/uthash-1.9.3/tests/README deleted file mode 100644 index 7ddb36d..0000000 --- a/3rdparty/uthash-1.9.3/tests/README +++ /dev/null @@ -1,88 +0,0 @@ -Automated tests for uthash -============================================================================== -Run "make" in this directory to build the tests and run them. - -test1: make 10-item hash, iterate and print each one -test2: make 10-item hash, lookup items with even keys, print -test3: make 10-item hash, delete items with even keys, print others -test4: 10 structs have dual hash handles, separate keys -test5: 10 structs have dual hash handles, lookup evens by alt key -test6: test alt malloc macros -test7: test alt malloc macros with 1000 structs so bucket expansion occurs -test8: test num_items counter in UT_hash_handle -test9: test "find" after bucket expansion -test10: dual-hash handle test, bucket expansion on one and not the other -test11: read dat file of names into hash, sort them and print -test12: create hash with string keys, add 10 items, lookup each item -test13: make 10-item hash, delete items with even keys, reverse print others -test14: read dat file of names into hash, read file again and lookup each one -test15: build string-keyed hash of 3 items, lookup one item (c.f. test40.c) -test16: hash on aggregate key, iterate, lookup, using generalized macros -test17: sort, add more items, sort again -test18: test pathological HASH_DEL(a,a) scenario (single head,deletee variable) -test19: sort two hash tables with shared elements using HASH_SRT -test20: test a 5-byte "binary" key -test21: test a structure key (userguide) -test22: test multi-field key using flexible array member (userguide utf32) -test23: test whether delete in iteration works -test24: make 10-item hash and confirm item count (HASH_COUNT) -test25: CDL / DL / LL tests -test26: test the linked list sort macros in utlist.h -test27: LL_APPEND, SORT -test28: CDL / DL / LL tests -test29: DL_APPEND, SORT -test30: CDL_PREPEND, SORT -test31: CDL_PREPEND, SORT -test32: DL_PREPEND -test33: LL_PREPEND -test34: CDL_PREPEND -test35: CDL_PREPEND -test36: HASH_SELECT -test37: HASH_CLEAR -test38: find-or-add test on integer keys in short loop -test39: HASH_ADD_KEYPTR then HASH_FIND using array element as key pointer -test40: HASH_ADD_KEYPTR on string keys; pointer equivalent to test15.c -test41: test LL_FOREACH_SAFE,DL_FOREACH_SAFE,CDL_FOREACH_SAFE -test42: test LL_SEARCH, LL_SEARCH_SCALAR, and DL and CDL counterparts -test43: test utarray with intpair objects -test44: test utarray with int objects -test45: test utarray with int objects -test46: test utarray with char* objects -test47: test utstring -test48: test utarray of int -test49: test utarray of str -test50: test utarray of long -test51: test utarray of intpair -test52: test utarray of intchar -test53: test utstring -test54: test utstring -test55: test utstring -test56: test uthash, utlist and utstring together for #define conflicts etc -test57: test uthash HASH_ADD_PTR and HASH_FIND_PTR - -Other Make targets -================================================================================ -pedantic: makes the tests with extra CFLAGS for pedantic compiling -cplusplus: compiles all the C tests using the C++ compiler to test compatibility -debug: makes the tests with debugging symbols and no optimization -example: builds the 'example' program from the user guide -================================================================================ - -Other files -================================================================================ -keystats: key statistics analyzer. See the User Guide (http://uthash.sf.net) -emit_keys: reads a data file of unique strings, emits as keys w/HASH_EMIT_KEYS=1 -all_funcs: a script which executes the test suite with every hash function -win32tests:builds and runs the test suite under Microsoft Visual Studio - -LINUX-ONLY ----------- -hashscan: tool to examine a running process and get info on its hash tables -test_sleep:used as a subject for inspection by hashscan - -Manual performance testing -================================================================================ - # test performance characteristics on keys that are English dictionary words - emit_keys /usr/share/dict/words > words.keys - ./keystats words.keys - diff --git a/3rdparty/uthash-1.9.3/tests/all_funcs b/3rdparty/uthash-1.9.3/tests/all_funcs deleted file mode 100755 index 18df8a1..0000000 --- a/3rdparty/uthash-1.9.3/tests/all_funcs +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -function proceed { - read -p "proceed ? [n] " response - if [ "$response" != "y" ]; then exit -1; fi -} - -make clean tests_only EXTRA_CFLAGS='-DHASH_FUNCTION=HASH_BER'; proceed -make clean tests_only EXTRA_CFLAGS='-DHASH_FUNCTION=HASH_SAX'; proceed -make clean tests_only EXTRA_CFLAGS='-DHASH_FUNCTION=HASH_FNV'; proceed -make clean tests_only EXTRA_CFLAGS='-DHASH_FUNCTION=HASH_OAT'; proceed -make clean tests_only EXTRA_CFLAGS='-DHASH_FUNCTION=HASH_JEN'; proceed -make clean tests_only EXTRA_CFLAGS='-DHASH_FUNCTION=HASH_MUR'; proceed -make clean tests_only EXTRA_CFLAGS='-DHASH_FUNCTION=HASH_SFH'; diff --git a/3rdparty/uthash-1.9.3/tests/bloom_perf.c b/3rdparty/uthash-1.9.3/tests/bloom_perf.c deleted file mode 100644 index 58b3002..0000000 --- a/3rdparty/uthash-1.9.3/tests/bloom_perf.c +++ /dev/null @@ -1,64 +0,0 @@ -#include /* malloc */ -#include /* gettimeofday */ -#include /* perror */ -#include /* printf */ -#include "uthash.h" - -#define BUFLEN 20 -#if 0 -#undef uthash_expand_fyi -#define uthash_expand_fyi(tbl) printf("expanding to %d buckets\n", tbl->num_buckets) -#endif - -typedef struct name_rec { - char boy_name[BUFLEN]; - UT_hash_handle hh; -} name_rec; - -int main(int argc,char *argv[]) { - name_rec *name, *names=NULL; - char linebuf[BUFLEN]; - FILE *file; - int i=0,j,nloops=3,loopnum=0,miss; - struct timeval tv1,tv2; - long elapsed_usec; - if (argc > 1) nloops = atoi(argv[1]); - - if ( (file = fopen( "test14.dat", "r" )) == NULL ) { - perror("can't open: "); - exit(-1); - } - - while (fgets(linebuf,BUFLEN,file) != NULL) { - i++; - if ( (name = (name_rec*)malloc(sizeof(name_rec))) == NULL) exit(-1); - strncpy(name->boy_name,linebuf,BUFLEN); - HASH_ADD_STR(names,boy_name,name); - } - - again: - if (fseek(file,0,SEEK_SET) == -1) { - fprintf(stderr,"fseek failed: %s\n", strerror(errno)); - } - j=0; - - if (gettimeofday(&tv1,NULL) == -1) perror("gettimeofday: "); - while (fgets(linebuf,BUFLEN,file) != NULL) { - /* if we do 10 loops, the first has a 0% miss rate, - * the second has a 10% miss rate, etc */ - miss = ((rand()*1.0/RAND_MAX) < (loopnum*1.0/nloops)) ? 1 : 0; - /* generate a miss if we want one */ - if (miss) { linebuf[0]++; if (linebuf[1] != '\0') linebuf[1]++; } - HASH_FIND_STR(names,linebuf,name); - if (name) j++; - } - if (gettimeofday(&tv2,NULL) == -1) perror("gettimeofday: "); - elapsed_usec = ((tv2.tv_sec - tv1.tv_sec) * 1000000) + (tv2.tv_usec - tv1.tv_usec); - printf("lookup on %d of %d (%.2f%%) names succeeded (%.2f usec)\n", j, i, - j*100.0/i, (double)(elapsed_usec)); - if (++loopnum < nloops) goto again; - fclose(file); - - return 0; -} - diff --git a/3rdparty/uthash-1.9.3/tests/bloom_perf.sh b/3rdparty/uthash-1.9.3/tests/bloom_perf.sh deleted file mode 100755 index 0a04f23..0000000 --- a/3rdparty/uthash-1.9.3/tests/bloom_perf.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -BITS="16" - -cc -I../src -O3 -Wall -m64 bloom_perf.c -o bloom_perf.none -for bits in $BITS -do -cc -I../src -DHASH_BLOOM=$bits -O3 -Wall -m64 bloom_perf.c -o bloom_perf.$bits -done - -for bits in none $BITS -do -echo -echo "using $bits-bit filter:" -./bloom_perf.$bits 10 -done - diff --git a/3rdparty/uthash-1.9.3/tests/do_tests b/3rdparty/uthash-1.9.3/tests/do_tests deleted file mode 100755 index 574403f..0000000 --- a/3rdparty/uthash-1.9.3/tests/do_tests +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; - -my @tests; -for (glob "test*[0-9]") { - push @tests, $_ if -e "$_.ans"; -} - -my $num_failed=0; - -for my $test (@tests) { - `./$test > $test.out`; - `diff $test.out $test.ans`; - print "$test failed\n" if $?; - $num_failed++ if $?; -} - -print scalar @tests . " tests conducted, $num_failed failed.\n"; -exit $num_failed; diff --git a/3rdparty/uthash-1.9.3/tests/do_tests.cygwin b/3rdparty/uthash-1.9.3/tests/do_tests.cygwin deleted file mode 100755 index 0c01ebe..0000000 --- a/3rdparty/uthash-1.9.3/tests/do_tests.cygwin +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; - -my @tests; -for (glob "test*[0-9].exe") { - push @tests, "$_" if -e substr($_, 0, - 4).".ans"; -} - -my $num_failed=0; - -for my $test (@tests) { - `./$test > $test.out`; - my $ansfile = substr($test, 0, - 4).".ans"; - `diff $test.out $ansfile`; - print "$test failed\n" if $?; - $num_failed++ if $?; -} - -print scalar @tests . " tests conducted, $num_failed failed.\n"; -exit $num_failed; diff --git a/3rdparty/uthash-1.9.3/tests/do_tests.mingw b/3rdparty/uthash-1.9.3/tests/do_tests.mingw deleted file mode 100644 index 1820334..0000000 --- a/3rdparty/uthash-1.9.3/tests/do_tests.mingw +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -echo "MinGW test script starting" - -for f in test*.exe -do - t=`echo $f | sed s/.exe//` - `$f > $t.out` - diff -qb "$t.out" "$t.ans" - if [ $? -eq 1 ] - then - echo "$f failed" - else - true # can't have empty else - #echo "$f passed" - fi -done - -echo -echo "All tests complete" diff --git a/3rdparty/uthash-1.9.3/tests/do_tests_win32.cmd b/3rdparty/uthash-1.9.3/tests/do_tests_win32.cmd deleted file mode 100644 index be89301..0000000 --- a/3rdparty/uthash-1.9.3/tests/do_tests_win32.cmd +++ /dev/null @@ -1,16 +0,0 @@ -:: this compiles and runs the test suite under Visual Studio 2008 -::@echo off -call "C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat" > vc.out -::call "C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat" > vc.out -set "COMPILE=cl.exe /I ..\src /EHsc /nologo" -echo compiling... -%COMPILE% tdiff.cpp > compile.out -::for %%f in (test*.c) do %COMPILE% /Tp %%f >> compile.out -for %%f in (test*.c) do %COMPILE% /Tc %%f >> compile.out -echo running tests... -for %%f in (test*.exe) do %%f > %%~nf.out -echo scanning for failures... -for %%f in (test*.out) do tdiff %%f %%~nf.ans -echo tests completed -::for %%f in (test*.out test*.obj test*.exe vc.out compile.out tdiff.obj tdiff.exe) do del %%f -pause diff --git a/3rdparty/uthash-1.9.3/tests/emit_keys.c b/3rdparty/uthash-1.9.3/tests/emit_keys.c deleted file mode 100644 index 8a0c0cd..0000000 --- a/3rdparty/uthash-1.9.3/tests/emit_keys.c +++ /dev/null @@ -1,44 +0,0 @@ -#include /* malloc */ -#include /* perror */ -#include /* printf */ -#include /* write */ - -/* this define must precede uthash.h */ -#define HASH_EMIT_KEYS 1 -#include "uthash.h" - -#define BUFLEN 30 - -typedef struct name_rec { - char boy_name[BUFLEN]; - UT_hash_handle hh; -} name_rec; - -int main(int argc,char *argv[]) { - name_rec *name, *names=NULL; - char linebuf[BUFLEN]; - FILE *file; - int i=0; - - if (argc != 2) { - fprintf(stderr,"usage: %s file\n", argv[0]); - exit(-1); - } - - if ( (file = fopen( argv[1], "r" )) == NULL ) { - perror("can't open: "); - exit(-1); - } - - while (fgets(linebuf,BUFLEN,file) != NULL) { - if ( (name = (name_rec*)malloc(sizeof(name_rec))) == NULL) exit(-1); - strncpy(name->boy_name,linebuf,BUFLEN); - HASH_ADD_STR(names,boy_name,name); - i++; - } - - fprintf(stderr,"%d keys emitted.\n", i); - fclose(file); - return 0; -} - diff --git a/3rdparty/uthash-1.9.3/tests/example.c b/3rdparty/uthash-1.9.3/tests/example.c deleted file mode 100644 index 3403c9a..0000000 --- a/3rdparty/uthash-1.9.3/tests/example.c +++ /dev/null @@ -1,118 +0,0 @@ -#include /* gets */ -#include /* atoi, malloc */ -#include /* strcpy */ -#include "uthash.h" - -struct my_struct { - int id; /* key */ - char name[10]; - UT_hash_handle hh; /* makes this structure hashable */ -}; - -struct my_struct *users = NULL; - -void add_user(int user_id, char *name) { - struct my_struct *s; - - s = (struct my_struct*)malloc(sizeof(struct my_struct)); - s->id = user_id; - strcpy(s->name, name); - HASH_ADD_INT( users, id, s ); /* id: name of key field */ -} - -struct my_struct *find_user(int user_id) { - struct my_struct *s; - - HASH_FIND_INT( users, &user_id, s ); /* s: output pointer */ - return s; -} - -void delete_user(struct my_struct *user) { - HASH_DEL( users, user); /* user: pointer to deletee */ - free(user); -} - -void delete_all() { - struct my_struct *current_user, *tmp; - - HASH_ITER(hh, users, current_user, tmp) { - HASH_DEL(users,current_user); /* delete it (users advances to next) */ - free(current_user); /* free it */ - } -} - -void print_users() { - struct my_struct *s; - - for(s=users; s != NULL; s=(struct my_struct*)(s->hh.next)) { - printf("user id %d: name %s\n", s->id, s->name); - } -} - -int name_sort(struct my_struct *a, struct my_struct *b) { - return strcmp(a->name,b->name); -} - -int id_sort(struct my_struct *a, struct my_struct *b) { - return (a->id - b->id); -} - -void sort_by_name() { - HASH_SORT(users, name_sort); -} - -void sort_by_id() { - HASH_SORT(users, id_sort); -} - -int main(int argc, char *argv[]) { - char in[10]; - int id=1; - struct my_struct *s; - unsigned num_users; - - while (1) { - printf("1. add user\n"); - printf("2. find user\n"); - printf("3. delete user\n"); - printf("4. delete all users\n"); - printf("5. sort items by name\n"); - printf("6. sort items by id\n"); - printf("7. print users\n"); - printf("8. count users\n"); - gets(in); - switch(atoi(in)) { - case 1: - printf("name?\n"); - add_user(id++, gets(in)); - break; - case 2: - printf("id?\n"); - s = find_user(atoi(gets(in))); - printf("user: %s\n", s ? s->name : "unknown"); - break; - case 3: - printf("id?\n"); - s = find_user(atoi(gets(in))); - if (s) delete_user(s); - else printf("id unknown\n"); - break; - case 4: - delete_all(); - break; - case 5: - sort_by_name(); - break; - case 6: - sort_by_id(); - break; - case 7: - print_users(); - break; - case 8: - num_users=HASH_COUNT(users); - printf("there are %u users\n", num_users); - break; - } - } -} diff --git a/3rdparty/uthash-1.9.3/tests/hashscan.c b/3rdparty/uthash-1.9.3/tests/hashscan.c deleted file mode 100644 index 9944b07..0000000 --- a/3rdparty/uthash-1.9.3/tests/hashscan.c +++ /dev/null @@ -1,588 +0,0 @@ -/* -Copyright (c) 2005-2010, Troy D. Hanson http://uthash.sourceforge.net -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -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 OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __FreeBSD__ -#include /* MAXPATHLEN */ -#include /* VM_PROT_* flags */ -#endif - -/* need this defined so offsetof can give us bloom offsets in UT_hash_table */ -#define HASH_BLOOM 16 -#include "uthash.h" - -#ifdef __FreeBSD__ -typedef struct { - void *start; - void *end; -} vma_t; -#else -typedef struct { - off_t start; - off_t end; - char perms[4]; /* rwxp */ - char device[5]; /* fd:01 or 00:00 */ -} vma_t; -#endif - -const uint32_t sig = HASH_SIGNATURE; -int verbose=0; -int getkeys=0; - -#define vv(...) do {if (verbose>0) printf(__VA_ARGS__);} while(0) -#define vvv(...) do {if (verbose>1) printf(__VA_ARGS__);} while(0) - -/* these id's are arbitrary, only meaningful within this file */ -#define JEN 1 -#define BER 2 -#define SFH 3 -#define SAX 4 -#define FNV 5 -#define OAT 6 -#define MUR 7 -#define NUM_HASH_FUNCS 8 /* includes id 0, the non-function */ -char *hash_fcns[] = {"???","JEN","BER","SFH","SAX","FNV","OAT","MUR"}; - -/* given a peer key/len/hashv, reverse engineer its hash function */ -int infer_hash_function(char *key, size_t keylen, uint32_t hashv) { - uint32_t obkt, ohashv, num_bkts=0x01000000; /* anything ok */ - /* BER SAX FNV OAT JEN SFH */ - HASH_JEN(key,keylen,num_bkts,ohashv,obkt); if (ohashv == hashv) return JEN; - HASH_BER(key,keylen,num_bkts,ohashv,obkt); if (ohashv == hashv) return BER; - HASH_SFH(key,keylen,num_bkts,ohashv,obkt); if (ohashv == hashv) return SFH; - HASH_SAX(key,keylen,num_bkts,ohashv,obkt); if (ohashv == hashv) return SAX; - HASH_FNV(key,keylen,num_bkts,ohashv,obkt); if (ohashv == hashv) return FNV; - HASH_OAT(key,keylen,num_bkts,ohashv,obkt); if (ohashv == hashv) return OAT; - HASH_MUR(key,keylen,num_bkts,ohashv,obkt); if (ohashv == hashv) return MUR; - return 0; -} - -/* read peer's memory from addr for len bytes, store into our dst */ -#ifdef __FreeBSD__ -int read_mem(void *dst, pid_t pid, void *start, size_t len) { - struct ptrace_io_desc io_desc; - int ret; - - io_desc.piod_op = PIOD_READ_D; - io_desc.piod_offs = start; - io_desc.piod_addr = dst; - io_desc.piod_len = len; - - ret = ptrace(PT_IO, pid, (void *) &io_desc, 0); - - if (ret) { - vv("read_mem: ptrace failed: %s\n", strerror(errno)); - return -1; - } else if (io_desc.piod_len != len) { - vv("read_mem: short read!\n"); - return -1; - } - - return 0; -} -#else -int read_mem(void *dst, int fd, off_t start, size_t len) { - int rc; - size_t bytes_read=0; - if (lseek(fd, start, SEEK_SET) == (off_t)-1) { - fprintf(stderr, "lseek failed: %s\n", strerror(errno)); - return -1; - } - while ( len && ((rc=read(fd, (char*)dst+bytes_read, len)) > 0)) { - len -= rc; - bytes_read += rc; - } - if (rc==-1) vv("read_mem failed (%s)\n",strerror(errno)); - if ((len != 0 && rc >= 0)) vv("INTERNAL ERROR\n"); - return (rc == -1) ? -1 : 0; -} -#endif - -/* later compensate for possible presence of bloom filter */ -char *tbl_from_sig_addr(char *sig) { - return (sig - offsetof(UT_hash_table,signature)); -} - -#define HS_BIT_TEST(v,i) (v[i/8] & (1U << (i%8))) -void found(int fd, char* peer_sig, pid_t pid) { - UT_hash_table *tbl=NULL; - UT_hash_bucket *bkts=NULL; - UT_hash_handle hh; - size_t i, bloom_len, bloom_bitlen, bloom_on_bits=0,bloom_off_bits=0; - char *peer_tbl, *peer_bloom_sig, *peer_bloom_nbits, *peer_bloombv_ptr, - *peer_bloombv, *peer_bkts, *peer_key, *peer_hh, *key=NULL, - *hash_fcn=NULL, sat[10]; - unsigned char *bloombv=NULL; - static int fileno=0; - char keyfile[50]; - unsigned char bloom_nbits=0; - int keyfd=-1, mode=S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, - hash_fcn_hits[NUM_HASH_FUNCS], hash_fcn_winner; - unsigned max_chain=0; - uint32_t bloomsig; - double bloom_sat=0; - snprintf(sat,sizeof(sat)," "); - for(i=0; i < NUM_HASH_FUNCS; i++) hash_fcn_hits[i]=0; - - if (getkeys) { - snprintf(keyfile, sizeof(keyfile), "/tmp/%u-%u.key", (unsigned)pid,fileno++); - if ( (keyfd = open(keyfile, O_WRONLY|O_CREAT|O_TRUNC, mode)) == -1) { - fprintf(stderr, "can't open %s: %s\n", keyfile, strerror(errno)); - exit(-1); - } - } - - vv("found signature at peer %p\n", peer_sig); - peer_tbl = tbl_from_sig_addr(peer_sig); - vvv("reading table at peer %p\n", peer_tbl); - - if ( (tbl = (UT_hash_table*)malloc(sizeof(UT_hash_table))) == NULL) { - fprintf(stderr, "out of memory\n"); - exit(-1); - } -#ifdef __FreeBSD__ - if (read_mem(tbl, pid, (void *)peer_tbl, sizeof(UT_hash_table)) != 0) { -#else - if (read_mem(tbl, fd, (off_t)peer_tbl, sizeof(UT_hash_table)) != 0) { -#endif - fprintf(stderr, "failed to read peer memory\n"); - goto done; - } - - /* got the table. how about the buckets */ - peer_bkts = (char*)tbl->buckets; - vvv("reading buckets at peer %p\n", peer_bkts); - bkts = (UT_hash_bucket*)malloc(sizeof(UT_hash_bucket)*tbl->num_buckets); - if (bkts == NULL) { - fprintf(stderr, "out of memory\n"); - exit(-1); - } -#ifdef __FreeBSD__ - if (read_mem(bkts, pid, (void *)peer_bkts, sizeof(UT_hash_bucket)*tbl->num_buckets) != 0) { -#else - if (read_mem(bkts, fd, (off_t)peer_bkts, sizeof(UT_hash_bucket)*tbl->num_buckets) != 0) { -#endif - fprintf(stderr, "failed to read peer memory\n"); - goto done; - } - - vvv("scanning %u peer buckets\n", tbl->num_buckets); - for(i=0; i < tbl->num_buckets; i++) { - vvv("bucket %u has %u items\n", (unsigned)i, (unsigned)(bkts[i].count)); - if (bkts[i].count > max_chain) max_chain = bkts[i].count; - if (bkts[i].expand_mult) vvv(" bucket %u has expand_mult %u\n", (unsigned)i, (unsigned)(bkts[i].expand_mult)); - - vvv("scanning bucket %u chain:\n", (unsigned)i); - peer_hh = (char*)bkts[i].hh_head; - while(peer_hh) { -#ifdef __FreeBSD__ - if (read_mem(&hh, pid, (void *)peer_hh, sizeof(hh)) != 0) { -#else - if (read_mem(&hh, fd, (off_t)peer_hh, sizeof(hh)) != 0) { -#endif - fprintf(stderr, "failed to read peer memory\n"); - goto done; - } - if ((char*)hh.tbl != peer_tbl) goto done; - peer_hh = (char*)hh.hh_next; - peer_key = (char*)(hh.key); - /* malloc space to read the key, and read it */ - if ( (key = (char*)malloc(sizeof(hh.keylen))) == NULL) { - fprintf(stderr, "out of memory\n"); - exit(-1); - } -#ifdef __FreeBSD__ - if (read_mem(key, pid, (void*)peer_key, hh.keylen) != 0) { -#else - if (read_mem(key, fd, (off_t)peer_key, hh.keylen) != 0) { -#endif - fprintf(stderr, "failed to read peer memory\n"); - goto done; - } - hash_fcn_hits[infer_hash_function(key,hh.keylen,hh.hashv)]++; - /* write the key if requested */ - if (getkeys) { - write(keyfd, &hh.keylen, sizeof(unsigned)); - write(keyfd, key, hh.keylen); - } - free(key); key=NULL; - } - } - - /* does it have a bloom filter? */ - peer_bloom_sig = peer_tbl + offsetof(UT_hash_table, bloom_sig); - peer_bloombv_ptr = peer_tbl + offsetof(UT_hash_table, bloom_bv); - peer_bloom_nbits = peer_tbl + offsetof(UT_hash_table, bloom_nbits); - vvv("looking for bloom signature at peer %p\n", peer_bloom_sig); -#ifdef __FreeBSD__ - if ((read_mem(&bloomsig, pid, (void *)peer_bloom_sig, sizeof(uint32_t)) == 0) && - (bloomsig == HASH_BLOOM_SIGNATURE)) { -#else - if ((read_mem(&bloomsig, fd, (off_t)peer_bloom_sig, sizeof(uint32_t)) == 0) && - (bloomsig == HASH_BLOOM_SIGNATURE)) { -#endif - vvv("bloom signature (%x) found\n",bloomsig); - /* bloom found. get at bv, nbits */ -#ifdef __FreeBSD__ - if (read_mem(&bloom_nbits, pid, (void *)peer_bloom_nbits, sizeof(char)) == 0) { -#else - if (read_mem(&bloom_nbits, fd, (off_t)peer_bloom_nbits, sizeof(char)) == 0) { -#endif - /* scan bloom filter, calculate saturation */ - bloom_bitlen = (1ULL << bloom_nbits); - bloom_len = (bloom_bitlen / 8) + ((bloom_bitlen % 8) ? 1 : 0); - vvv("bloom bitlen is %u, bloom_bytelen is %u\n", (unsigned)bloom_bitlen, (unsigned)bloom_len); - if ( (bloombv = (unsigned char*)malloc(bloom_len)) == NULL) { - fprintf(stderr, "out of memory\n"); - exit(-1); - } - /* read the address of the bitvector in the peer, then read the bv itself */ -#ifdef __FreeBSD__ - if ((read_mem(&peer_bloombv, pid, (void *)peer_bloombv_ptr, sizeof(void*)) == 0) && - (read_mem(bloombv, pid, (void *)peer_bloombv, bloom_len) == 0)) { -#else - if ((read_mem(&peer_bloombv, fd, (off_t)peer_bloombv_ptr, sizeof(void*)) == 0) && - (read_mem(bloombv, fd, (off_t)peer_bloombv, bloom_len) == 0)) { -#endif - /* calculate saturation */ - vvv("read peer bloom bitvector from %p (%u bytes)\n", peer_bloombv, (unsigned)bloom_len); - for(i=0; i < bloom_bitlen; i++) { - if (HS_BIT_TEST(bloombv,(unsigned)i)) { - /* vvv("bit %u set\n",(unsigned)i); */ - bloom_on_bits++; - } else bloom_off_bits++; - } - vvv("there were %u on_bits among %u total bits\n", (unsigned)bloom_on_bits, (unsigned)bloom_bitlen); - bloom_sat = bloom_on_bits * 100.0 / bloom_bitlen; - snprintf(sat,sizeof(sat),"%2u %5.0f%%", bloom_nbits, bloom_sat); - } - } - } - - /* choose apparent hash function */ - hash_fcn_winner=0; - for(i=0;i hash_fcn_hits[hash_fcn_winner]) hash_fcn_winner=i; - } - hash_fcn = hash_fcns[hash_fcn_winner]; - -/* -Address items ideal buckets mxch/<10 fl bloom/sat fcn keys saved to ------------------- -------- ----- -------- -------- -- --------- --- ------------- -0x0123456789abcdef 10000000 98% 32000000 10 100% ok BER /tmp/9110-0.key -0x0123456789abcdef 10000000 100% 32000000 9 90% NX 27/0.010% BER /tmp/9110-1.key -*/ - printf("Address ideal items buckets mc fl bloom/sat fcn keys saved to\n"); - printf("------------------ ----- -------- -------- -- -- --------- --- -------------\n"); - printf("%-18p %4.0f%% %8u %8u %2u %s %s %s %s\n", - (void*)peer_tbl, - (tbl->num_items - tbl->nonideal_items) * 100.0 / tbl->num_items, - tbl->num_items, - tbl->num_buckets, - max_chain, - tbl->noexpand ? "NX" : "ok", - sat, - hash_fcn, - (getkeys ? keyfile : "")); - -#if 0 - printf("read peer tbl:\n"); - printf("num_buckets: %u\n", tbl->num_buckets); - printf("num_items: %u\n", tbl->num_items); - printf("nonideal_items: %u (%.2f%%)\n", tbl->nonideal_items, - tbl->nonideal_items*100.0/tbl->num_items); - printf("expand: %s\n", tbl->noexpand ? "inhibited": "normal"); - if (getkeys) printf("keys written to %s\n", keyfile); -#endif - - done: - if (bkts) free(bkts); - if (tbl) free(tbl); - if (key) free(key); - if (keyfd != -1) close(keyfd); - if (bloombv) free(bloombv); -} - - -#ifdef __FreeBSD__ -void sigscan(pid_t pid, void *start, void *end, uint32_t sig) { - struct ptrace_io_desc io_desc; - int page_size = getpagesize(); - char *buf; - char *pos; - - /* make sure page_size is a multiple of the signature size, code below assumes this */ - assert(page_size % sizeof(sig) == 0); - - buf = malloc(page_size); - - if (buf == NULL) { - fprintf(stderr, "malloc failed in sigscan()\n"); - return; - } - - io_desc.piod_op = PIOD_READ_D; - io_desc.piod_offs = start; - io_desc.piod_addr = buf; - io_desc.piod_len = page_size; - - /* read in one page after another and search sig */ - while(!ptrace(PT_IO, pid, (void *) &io_desc, 0)) { - if (io_desc.piod_len != page_size) { - fprintf(stderr, "PT_IO returned less than page size in sigscan()\n"); - return; - } - - /* iterate over the the page using the signature size and look for the sig */ - for (pos = buf; pos < (buf + page_size); pos += sizeof(sig)) { - if (*(uint32_t *) pos == sig) { - found(pid, (char *) io_desc.piod_offs + (pos - buf), pid); - } - } - - /* - * 'end' is inclusive (the address of the last valid byte), so if the current offset - * plus a page is beyond 'end', we're already done. since all vm map entries consist - * of entire pages and 'end' is inclusive, current offset plus one page should point - * exactly one byte beyond 'end'. this is assert()ed below to be on the safe side. - */ - if (io_desc.piod_offs + page_size > end) { - assert(io_desc.piod_offs + page_size == (end + 1)); - break; - } - - /* advance to the next page */ - io_desc.piod_offs += page_size; - } -} -#else -void sigscan(int fd, off_t start, off_t end, uint32_t sig, pid_t pid) { - int rlen; - uint32_t u; - off_t at=0; - - if (lseek(fd, start, SEEK_SET) == (off_t)-1) { - fprintf(stderr, "lseek failed: %s\n", strerror(errno)); - return; - } - - while ( (rlen = read(fd,&u,sizeof(u))) == sizeof(u)) { - if (!memcmp(&u,&sig,sizeof(u))) found(fd, (char*)(start+at),pid); - at += sizeof(u); - if ((off_t)(at + sizeof(u)) > end-start) break; - } - - if (rlen == -1) { - //fprintf(stderr,"read failed: %s\n", strerror(errno)); - //exit(-1); - } -} -#endif - - -#ifdef __FreeBSD__ -int scan(pid_t pid) { - vma_t *vmas=NULL, vma; - unsigned i, num_vmas = 0; - int ret; - struct ptrace_vm_entry vm_entry; - char path[MAXPATHLEN]; - - vv("attaching to peer\n"); - if (ptrace(PT_ATTACH,pid,NULL,0) == -1) { - fprintf(stderr,"failed to attach to %u: %s\n", (unsigned)pid, strerror(errno)); - exit(EXIT_FAILURE); - } - vv("waiting for peer to suspend temporarily\n"); - if (waitpid(pid,NULL,0) != pid) { - fprintf(stderr,"failed to wait for pid %u: %s\n",(unsigned)pid, strerror(errno)); - goto die; - } - - /* read memory map using ptrace */ - vv("listing peer virtual memory areas\n"); - vm_entry.pve_entry = 0; - vm_entry.pve_path = path; /* not used but required to make vm_entry.pve_pathlen work */ - while(1) { - /* set pve_pathlen every turn, it gets overwritten by ptrace */ - vm_entry.pve_pathlen = MAXPATHLEN; - errno = 0; - - ret = ptrace(PT_VM_ENTRY, pid, (void *) &vm_entry, 0); - - if (ret) { - if (errno == ENOENT) { - /* we've reached the last entry */ - break; - } - fprintf(stderr, "fetching vm map entry failed: %s (%i)\n", strerror(errno), errno); - goto die; - } - - vvv("vmmap entry: start: %p, end: %p", (void *) vm_entry.pve_start, (void *) vm_entry.pve_end); - - /* skip unreadable or vnode-backed entries */ - if (!(vm_entry.pve_prot & VM_PROT_READ) || vm_entry.pve_pathlen > 0) { - vvv(" -> skipped (not readable or vnode-backed)\n"); - vm_entry.pve_path[0] = 0; - continue; - } - - /* useful entry, add to list */ - vvv(" -> will be scanned\n"); - vma.start = (void *)vm_entry.pve_start; - vma.end = (void *)vm_entry.pve_end; - vmas = (vma_t *) realloc(vmas, (num_vmas + 1) * sizeof(vma_t)); - vmas[num_vmas++] = vma; - } - - vv("peer has %u virtual memory areas\n", num_vmas); - - /* look for the hash signature */ - vv("scanning peer memory for hash table signatures\n"); - for(i=0;i\n", prog); - exit(-1); -} - -int main(int argc, char *argv[]) { - pid_t pid; - int opt; - - while ( (opt = getopt(argc, argv, "kv")) != -1) { - switch (opt) { - case 'v': - verbose++; - break; - case 'k': - getkeys++; - break; - default: - usage(argv[0]); - break; - } - } - - if (optind < argc) pid=atoi(argv[optind++]); - else usage(argv[0]); - - return scan(pid); -} diff --git a/3rdparty/uthash-1.9.3/tests/keystat.c b/3rdparty/uthash-1.9.3/tests/keystat.c deleted file mode 100644 index bf1d6ff..0000000 --- a/3rdparty/uthash-1.9.3/tests/keystat.c +++ /dev/null @@ -1,219 +0,0 @@ -#include /* for 'open' */ -#include /* for 'open' */ -#include /* for 'open' */ -#include /* for 'malloc' */ -#include /* for 'printf' */ -#include /* for 'read' */ -#include /* for 'sterror' */ -#include /* for 'gettimeofday' */ -#include "uthash.h" - -#undef uthash_noexpand_fyi -#define uthash_noexpand_fyi(t) die() -#define UNALIGNED_KEYS 0 - -void die() { - fprintf(stderr,"expansion inhibited\n"); - exit(-1); -} - -/* Windows doesn't have gettimeofday. While Cygwin and some - * versions of MinGW supply one, it is very coarse. This substitute - * gives much more accurate elapsed times under Windows. */ -#if (( defined __CYGWIN__ ) || ( defined __MINGW32__ )) -#include -void win_gettimeofday(struct timeval* p, void* tz /* IGNORED */) { - LARGE_INTEGER q; - static long long freq; - static long long cyg_timer; - QueryPerformanceFrequency(&q); - freq = q.QuadPart; - QueryPerformanceCounter(&q); - cyg_timer = q.QuadPart; - p->tv_sec = (long)(cyg_timer / freq); - p->tv_usec = (long)(((cyg_timer % freq) * 1000000) / freq); -} -#define gettimeofday win_gettimeofday -#define MODE (O_RDONLY|O_BINARY) -#else -#define MODE (O_RDONLY) -#endif - -#ifndef timersub -#define timersub(a, b, result) \ - do { \ - (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ - (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ - if ((result)->tv_usec < 0) { \ - --(result)->tv_sec; \ - (result)->tv_usec += 1000000; \ - } \ - } while (0) -#endif - -typedef struct stat_key { - char *key; - unsigned len; - UT_hash_handle hh, hh2; -} stat_key; - -#define CHAIN_0 0 -#define CHAIN_5 1 -#define CHAIN_10 2 -#define CHAIN_20 3 -#define CHAIN_100 4 -#define CHAIN_MAX 5 -void hash_chain_len_histogram(UT_hash_table *tbl) { - unsigned i, bkt_hist[CHAIN_MAX+1]; - double pct = 100.0/tbl->num_buckets; - memset(bkt_hist,0,sizeof(bkt_hist)); - for(i=0; i < tbl->num_buckets; i++) { - unsigned count = tbl->buckets[i].count; - if (count == 0) bkt_hist[CHAIN_0]++; - else if (count < 5) bkt_hist[CHAIN_5]++; - else if (count < 10) bkt_hist[CHAIN_10]++; - else if (count < 20) bkt_hist[CHAIN_20]++; - else if (count < 100) bkt_hist[CHAIN_100]++; - else bkt_hist[CHAIN_MAX]++; - } - fprintf(stderr, "Buckets with 0 items: %.1f%%\n", bkt_hist[CHAIN_0 ]*pct); - fprintf(stderr, "Buckets with < 5 items: %.1f%%\n", bkt_hist[CHAIN_5 ]*pct); - fprintf(stderr, "Buckets with < 10 items: %.1f%%\n", bkt_hist[CHAIN_10]*pct); - fprintf(stderr, "Buckets with < 20 items: %.1f%%\n", bkt_hist[CHAIN_20]*pct); - fprintf(stderr, "Buckets with < 100 items: %.1f%%\n", bkt_hist[CHAIN_100]*pct); - fprintf(stderr, "Buckets with > 100 items: %.1f%%\n", bkt_hist[CHAIN_MAX]*pct); -} - -int main(int argc, char *argv[]) { - int dups=0, rc, fd, done=0, err=0, want, i=0, padding=0, v=1, percent=100; - unsigned keylen, max_keylen=0, verbose=0; - const char *filename = "/dev/stdin"; - char *dst; - stat_key *keyt, *keytmp, *keys=NULL, *keys2=NULL; - struct timeval start_tm, end_tm, elapsed_tm, elapsed_tm2, elapsed_tm3; - - if ((argc >= 3) && !strcmp(argv[1],"-p")) {percent = atoi(argv[2]); v = 3;} - if ((argc >= v) && !strcmp(argv[v],"-v")) {verbose=1; v++;} - if (argc >= v) filename=argv[v]; - fd=open(filename,MODE); - - if ( fd == -1 ) { - fprintf(stderr,"open failed %s: %s\n", filename, strerror(errno)); - return -1; - } - - for(i=0; !done; i++) { - - want = sizeof(int); - dst = (char*)&keylen; - readmore1: - rc = read(fd,dst,want); - if (rc != want) { - if (rc == 0) done=1; - else if (rc == -1) { - fprintf(stderr,"read failed: %s\n", strerror(errno)); - err=1; - } - else if (rc > 0) { want -= rc; dst += rc; goto readmore1; } - } - - if (done || err) break; - if (keylen > max_keylen) max_keylen=keylen; - - if ( (keyt = (stat_key*)malloc(sizeof(stat_key))) == NULL) { - fprintf(stderr,"out of memory\n"); - exit(-1); - } - - /* read key */ -#ifdef UNALIGNED_KEYS - padding = i%8; -#endif - if ( (keyt->key = (char*)malloc(padding+keylen)) == NULL) { - fprintf(stderr,"out of memory\n"); - exit(-1); - } - keyt->key += padding; /* forcibly alter the alignment of key */ - keyt->len = keylen; - - want = keylen; - dst = keyt->key; - readmore2: - rc = read(fd,dst,want); - if (rc != want) { - if (rc == -1) { - fprintf(stderr,"read failed: %s\n", strerror(errno)); - err=1; - } else if (rc == 0) { - fprintf(stderr,"incomplete file\n"); - err=1; - } else if (rc >= 0) { want -= rc; dst += rc; goto readmore2; } - } - if (err) break; - /* if percent was set to something less than 100%, skip some keys*/ - if (((rand()*1.0) / RAND_MAX) > ((percent*1.0)/100)) { - free(keyt->key-padding); - free(keyt); - continue; - } - - /* eliminate dups */ - HASH_FIND(hh,keys,keyt->key,keylen,keytmp); - if (keytmp) { - dups++; - free(keyt->key - padding); - free(keyt); - } else { - HASH_ADD_KEYPTR(hh,keys,keyt->key,keylen,keyt); - } - } - - if (verbose) { - unsigned key_count = HASH_COUNT(keys); - fprintf(stderr,"max key length: %u\n", max_keylen); - fprintf(stderr,"number unique keys: %u\n", key_count); - fprintf(stderr,"keystats memory: %u\n", - (unsigned)((sizeof(stat_key)+max_keylen)*key_count)); - hash_chain_len_histogram(keys->hh.tbl); - } - - /* add all keys to a new hash, so we can measure add time w/o malloc */ - gettimeofday(&start_tm,NULL); - for(keyt = keys; keyt != NULL; keyt=(stat_key*)keyt->hh.next) { - HASH_ADD_KEYPTR(hh2,keys2,keyt->key,keyt->len,keyt); - } - gettimeofday(&end_tm,NULL); - timersub(&end_tm, &start_tm, &elapsed_tm); - - /* now look up all keys in the new hash, again measuring elapsed time */ - gettimeofday(&start_tm,NULL); - for(keyt = keys; keyt != NULL; keyt=(stat_key*)keyt->hh.next) { - HASH_FIND(hh2,keys2,keyt->key,keyt->len,keytmp); - if (!keytmp) fprintf(stderr,"internal error, key not found\n"); - } - gettimeofday(&end_tm,NULL); - timersub(&end_tm, &start_tm, &elapsed_tm2); - - /* now delete all items in the new hash, measuring elapsed time */ - gettimeofday(&start_tm,NULL); - while (keys2) { - keytmp = keys2; - HASH_DELETE(hh2,keys2,keytmp); - } - gettimeofday(&end_tm,NULL); - timersub(&end_tm, &start_tm, &elapsed_tm3); - - if (!err) { - printf("%.3f,%d,%d,%d,%s,%ld,%ld,%ld\n", - 1-(1.0*keys->hh.tbl->nonideal_items/keys->hh.tbl->num_items), - keys->hh.tbl->num_items, - keys->hh.tbl->num_buckets, - dups, - (keys->hh.tbl->noexpand ? "nx" : "ok"), - (elapsed_tm.tv_sec * 1000000) + elapsed_tm.tv_usec, - (elapsed_tm2.tv_sec * 1000000) + elapsed_tm2.tv_usec, - (elapsed_tm3.tv_sec * 1000000) + elapsed_tm3.tv_usec ); - } - return 0; -} - diff --git a/3rdparty/uthash-1.9.3/tests/keystats b/3rdparty/uthash-1.9.3/tests/keystats deleted file mode 100755 index ea217b0..0000000 --- a/3rdparty/uthash-1.9.3/tests/keystats +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/perl - -use strict; - -use FindBin; - -sub usage { - print "usage: keystats [-v] keyfile\n"; - print "usage: keystats [-p [-v]] keyfile\n"; - exit -1; -} - -usage if ((@ARGV == 0) or ($ARGV[0] eq '-h')); - -my @exes = glob "$FindBin::Bin/keystat.???"; -my %stats; -for my $exe (@exes) { - $stats{$exe} = `$exe @ARGV`; - delete $stats{$exe} if ($? != 0); # omit hash functions that fail to produce stats (nx) -} - -print( "fcn ideal% #items #buckets dup% fl add_usec find_usec del-all usec\n"); -printf("--- ------ ---------- ---------- ----- -- ---------- ---------- ------------\n"); -for my $exe (sort statsort keys %stats) { - my ($ideal,$items,$bkts,$dups,$ok,$add,$find,$del) = split /,/, $stats{$exe}; - - # convert 0-1 values to percentages - $dups = $items ? (100.0 * $dups / $items) : 0.0; - $ideal = 100.0 * $ideal; - - printf("%3s %5.1f%% %10d %10d %4.0f%% %2s %10d %10d %12d\n", substr($exe,-3,3), - $ideal,$items,$bkts,$dups,$ok,$add,$find,$del); -} - -# sort on hash_q (desc) then by find_usec (asc) -sub statsort { - my @a_stats = split /,/, $stats{$a}; - my @b_stats = split /,/, $stats{$b}; - return ($b_stats[0] <=> $a_stats[0]) || ($a_stats[-1] <=> $b_stats[-1]); -} diff --git a/3rdparty/uthash-1.9.3/tests/mexpand b/3rdparty/uthash-1.9.3/tests/mexpand deleted file mode 100755 index e1562d9..0000000 --- a/3rdparty/uthash-1.9.3/tests/mexpand +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -# utility to macro-expand a test program -CC=gcc -#CPPFLAGS=-DHASH_DEBUG=1 -#CC=g++ -CPPFLAGS="-m64 -O3" -CFLAGS="-O3 -m64 -pedantic -Wall" - -${CC} ${CPPFLAGS} -E -I../src $1 | egrep -v '^#' > /tmp/$1 -indent /tmp/$1 -${CC} ${CFLAGS} -o /tmp/$1.$$ /tmp/$1 -rm -f /tmp/$1.$$ - -read -p "open /tmp/$1 ? [n] " response -if [ "$response" = "y" ] -then - vi /tmp/$1 -fi - - diff --git a/3rdparty/uthash-1.9.3/tests/simkeys.pl b/3rdparty/uthash-1.9.3/tests/simkeys.pl deleted file mode 100755 index acc5583..0000000 --- a/3rdparty/uthash-1.9.3/tests/simkeys.pl +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/perl - -# This program generates a simkey10.dat (100, 1000, etc) each -# containing 100 random keys of length 10 (100, 1000, etc). -# These files can then be fed into keystats to observe that -# the time to add or find the keys is directly proportional to -# keylength n [in other words, O(n)]. -# -# The conclusion is that really long keys (e.g. 100k) are not -# efficient. TDH 23Jan07 - -use strict; -use warnings; - - -#for my $len (10,100,1000,10000,100000,1000000) { -for my $len (100) { - open OUTFILE, ">simkeys$len.dat" or die "can't open: $!\n"; - # we'll do 100 keys of $len - print "keylen $len\n"; - for my $i (0..99) { - my $key = pack "I", $len; - $key .= pack "C", (int(rand(256))) for (1..$len); - print OUTFILE $key; - } - close OUTFILE; -} - diff --git a/3rdparty/uthash-1.9.3/tests/sleep_test.c b/3rdparty/uthash-1.9.3/tests/sleep_test.c deleted file mode 100644 index ccc50c9..0000000 --- a/3rdparty/uthash-1.9.3/tests/sleep_test.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ -#include /* getpid */ - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; -} example_user_t; - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *users=NULL; - - /* create elements */ - for(i=0;i<10000;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - } - - printf("pid: %u\n", (unsigned)getpid()); - /* printf("sig: %p\n", &users->hh.tbl->signature); */ - /* printf("bbv: %p\n", &users->hh.tbl->bloom_bv); */ - sleep(60*10); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/tdiff.cpp b/3rdparty/uthash-1.9.3/tests/tdiff.cpp deleted file mode 100644 index 4be14fe..0000000 --- a/3rdparty/uthash-1.9.3/tests/tdiff.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// Windows does not have unix diff so this is a simple replacement -#include -#include -using namespace std; -int main(int argc, char *argv[] ) { - int rc=-1; - if (argc != 3) { - cout << "usage: " << argv[0] << " file1 file2\n"; - return -1; - } - char *file1 = argv[1]; - char *file2 = argv[2]; - ifstream is1(file1, ios::in); - ifstream is2(file2, ios::in); - if (is1.fail()) {cerr << "failed to open " << file1 << "\n"; goto done;} - if (is2.fail()) {cerr << "failed to open " << file2 << "\n"; goto done;} - char d1[256], d2[256]; - do { - is1.read(d1,sizeof(d1)); - is2.read(d2,sizeof(d2)); - if ((is1.gcount() != is2.gcount()) || memcmp(d1,d2,is1.gcount())) { - cout << file1 << " and " << file2 << " differ\n"; - goto done; - } - } while (!is1.eof() && !is2.eof()); - - rc=0; - - done: - is1.close(); - is2.close(); - return rc; -} - diff --git a/3rdparty/uthash-1.9.3/tests/test1.ans b/3rdparty/uthash-1.9.3/tests/test1.ans deleted file mode 100644 index 0b08c48..0000000 --- a/3rdparty/uthash-1.9.3/tests/test1.ans +++ /dev/null @@ -1,10 +0,0 @@ -user 0, cookie 0 -user 1, cookie 1 -user 2, cookie 4 -user 3, cookie 9 -user 4, cookie 16 -user 5, cookie 25 -user 6, cookie 36 -user 7, cookie 49 -user 8, cookie 64 -user 9, cookie 81 diff --git a/3rdparty/uthash-1.9.3/tests/test1.c b/3rdparty/uthash-1.9.3/tests/test1.c deleted file mode 100644 index afae6d6..0000000 --- a/3rdparty/uthash-1.9.3/tests/test1.c +++ /dev/null @@ -1,27 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; -} example_user_t; - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *users=NULL; - - /* create elements */ - for(i=0;i<10;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - } - - for(user=users; user != NULL; user=(example_user_t*)(user->hh.next)) { - printf("user %d, cookie %d\n", user->id, user->cookie); - } - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test10.ans b/3rdparty/uthash-1.9.3/tests/test10.ans deleted file mode 100644 index b1a27a8..0000000 --- a/3rdparty/uthash-1.9.3/tests/test10.ans +++ /dev/null @@ -1,4 +0,0 @@ -9 found in hh -9 found in alth -10 not found in hh -10 found in alth diff --git a/3rdparty/uthash-1.9.3/tests/test10.c b/3rdparty/uthash-1.9.3/tests/test10.c deleted file mode 100644 index e8efc3b..0000000 --- a/3rdparty/uthash-1.9.3/tests/test10.c +++ /dev/null @@ -1,45 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; - UT_hash_handle alth; -} example_user_t; - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *tmp, *users=NULL, *altusers=NULL; - - /* create elements */ - for(i=0;i<1000;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - if (i<10) HASH_ADD_INT(users,id,user); - HASH_ADD(alth,altusers,id,sizeof(int),user); - } - - /* - printf("hh items: %d, alth items: %d\n", - users->hh.tbl->num_items, users->alth.tbl->num_items); - printf("hh buckets: %d, alth buckets: %d\n", - users->hh.tbl->num_buckets, users->alth.tbl->num_buckets); - */ - - i=9; - HASH_FIND_INT(users,&i,tmp); - printf("%d %s in hh\n", i, (tmp ? "found" : "not found")); - HASH_FIND(alth,altusers,&i,sizeof(int),tmp); - printf("%d %s in alth\n", i, (tmp ? "found" : "not found")); - - i=10; - HASH_FIND_INT(users,&i,tmp); - printf("%d %s in hh\n", i, (tmp ? "found" : "not found")); - HASH_FIND(alth,altusers,&i,sizeof(int),tmp); - printf("%d %s in alth\n", i, (tmp ? "found" : "not found")); - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test11.ans b/3rdparty/uthash-1.9.3/tests/test11.ans deleted file mode 100644 index 2b72e98..0000000 --- a/3rdparty/uthash-1.9.3/tests/test11.ans +++ /dev/null @@ -1,51 +0,0 @@ -ADRIAN -ARNOLDO -CARROLL -CARY -CHONG -CLIFTON -CODY -COLTON -CORNELL -DAMON -DANNIE -DARIO -DONN -DOUG -DOUGLAS -FREDERICK -FRITZ -GERALD -GUS -HARVEY -IRVING -ISAIAH -JARVIS -JOHN -KENTON -LAURENCE -LESTER -LINCOLN -LOWELL -NELSON -NEVILLE -NIGEL -NORMAND -ODIS -OMAR -ORLANDO -RAYMUNDO -REX -ROLANDO -RON -SHANE -TONEY -TRINIDAD -WALTER -WARNER -WARREN -WES -WILLARD -WILLIAM -WINFRED -XAVIER diff --git a/3rdparty/uthash-1.9.3/tests/test11.c b/3rdparty/uthash-1.9.3/tests/test11.c deleted file mode 100644 index 81986c5..0000000 --- a/3rdparty/uthash-1.9.3/tests/test11.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* perror */ -#include /* printf */ - -#define BUFLEN 20 - -#if 0 -/* Print a message if the hash's no-expand flag is set. */ -#undef uthash_noexpand_fyi -#undef uthash_expand_fyi -#define uthash_noexpand_fyi(tbl) printf("noexpand set\n"); -#define uthash_expand_fyi(tbl) printf("hash expanded\n"); -#endif - -typedef struct name_rec { - char boy_name[BUFLEN]; - UT_hash_handle hh; -} name_rec; - -int namecmp(void *_a, void *_b) { - name_rec *a = (name_rec*)_a; - name_rec *b = (name_rec*)_b; - return strcmp(a->boy_name,b->boy_name); -} - -int main(int argc,char *argv[]) { - name_rec *name, *names=NULL; - char linebuf[BUFLEN]; - FILE *file; - - if ( (file = fopen( "test11.dat", "r" )) == NULL ) { - perror("can't open: "); - exit(-1); - } - - while (fgets(linebuf,BUFLEN,file) != NULL) { - if ( (name = (name_rec*)malloc(sizeof(name_rec))) == NULL) exit(-1); - strncpy(name->boy_name,linebuf,BUFLEN); - HASH_ADD_STR(names,boy_name,name); - } - - fclose(file); - HASH_SORT(names,namecmp); - for(name=names;name;name=(name_rec*)(name->hh.next)) - printf("%s",name->boy_name); - - return 0; -} - diff --git a/3rdparty/uthash-1.9.3/tests/test11.dat b/3rdparty/uthash-1.9.3/tests/test11.dat deleted file mode 100644 index bb6051b..0000000 --- a/3rdparty/uthash-1.9.3/tests/test11.dat +++ /dev/null @@ -1,51 +0,0 @@ -JOHN -WILLIAM -WALTER -DOUGLAS -GERALD -FREDERICK -WARREN -SHANE -LESTER -RON -HARVEY -ADRIAN -CODY -NELSON -CLIFTON -WILLARD -DOUG -ORLANDO -REX -OMAR -DAMON -LOWELL -IRVING -CARROLL -LAURENCE -ROLANDO -CARY -XAVIER -ISAIAH -GUS -JARVIS -WINFRED -RAYMUNDO -LINCOLN -CORNELL -NIGEL -NORMAND -FRITZ -DONN -TRINIDAD -ODIS -DANNIE -DARIO -KENTON -CHONG -NEVILLE -TONEY -WARNER -WES -COLTON -ARNOLDO diff --git a/3rdparty/uthash-1.9.3/tests/test12.ans b/3rdparty/uthash-1.9.3/tests/test12.ans deleted file mode 100644 index 727f397..0000000 --- a/3rdparty/uthash-1.9.3/tests/test12.ans +++ /dev/null @@ -1,20 +0,0 @@ -added bob (id 0) -added jack (id 1) -added gary (id 2) -added ty (id 3) -added bo (id 4) -added phil (id 5) -added art (id 6) -added gil (id 7) -added buck (id 8) -added ted (id 9) -found bob (id 0) -found jack (id 1) -found gary (id 2) -found ty (id 3) -found bo (id 4) -found phil (id 5) -found art (id 6) -found gil (id 7) -found buck (id 8) -found ted (id 9) diff --git a/3rdparty/uthash-1.9.3/tests/test12.c b/3rdparty/uthash-1.9.3/tests/test12.c deleted file mode 100644 index dfed3f4..0000000 --- a/3rdparty/uthash-1.9.3/tests/test12.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "uthash.h" -#include -#include /* malloc */ - -typedef struct person_t { - char first_name[10]; - int id; - UT_hash_handle hh; -} person_t; - -int main(int argc, char*argv[]) { - person_t *people=NULL, *person; - const char **name; - const char * names[] = { "bob", "jack", "gary", "ty", "bo", "phil", "art", - "gil", "buck", "ted", NULL }; - int id=0; - - for(name=names; *name; name++) { - if ( (person = (person_t*)malloc(sizeof(person_t))) == NULL) exit(-1); - strncpy(person->first_name, *name,10); - person->id = id++; - HASH_ADD_STR(people,first_name,person); - printf("added %s (id %d)\n", person->first_name, person->id); - } - - for(name=names; *name; name++) { - HASH_FIND_STR(people,*name,person); - if (person) - printf("found %s (id %d)\n", person->first_name, person->id); - else - printf("failed to find %s\n", *name); - } - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test13.ans b/3rdparty/uthash-1.9.3/tests/test13.ans deleted file mode 100644 index baf3ff2..0000000 --- a/3rdparty/uthash-1.9.3/tests/test13.ans +++ /dev/null @@ -1,5 +0,0 @@ -id 9, following prev... -id 7, following prev... -id 5, following prev... -id 3, following prev... -id 1, following prev... diff --git a/3rdparty/uthash-1.9.3/tests/test13.c b/3rdparty/uthash-1.9.3/tests/test13.c deleted file mode 100644 index ed624a8..0000000 --- a/3rdparty/uthash-1.9.3/tests/test13.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; -} example_user_t; - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *tmp, *users=NULL; - - /* create elements */ - for(i=0;i<10;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - } - - /* delete each even ID */ - for(i=0;i<10;i+=2) { - HASH_FIND_INT(users,&i,tmp); - if (tmp) { - HASH_DEL(users,tmp); - free(tmp); - } else printf("user id %d not found\n", i); - } - - i=9; - HASH_FIND_INT(users,&i,tmp); - if (tmp) { - while(tmp) { - printf("id %d, following prev...\n", tmp->id); - tmp = (example_user_t*)tmp->hh.prev; - } - } else printf("user id %d not found\n", i); - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test14.ans b/3rdparty/uthash-1.9.3/tests/test14.ans deleted file mode 100644 index 77aeaeb..0000000 --- a/3rdparty/uthash-1.9.3/tests/test14.ans +++ /dev/null @@ -1 +0,0 @@ -lookup on 1219 of 1219 names succeeded diff --git a/3rdparty/uthash-1.9.3/tests/test14.c b/3rdparty/uthash-1.9.3/tests/test14.c deleted file mode 100644 index c31f42a..0000000 --- a/3rdparty/uthash-1.9.3/tests/test14.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* perror */ -#include /* printf */ - -#define BUFLEN 20 -#if 0 -#undef uthash_expand_fyi -#define uthash_expand_fyi(tbl) printf("expanding to %d buckets\n", tbl->num_buckets) -#endif - -typedef struct name_rec { - char boy_name[BUFLEN]; - UT_hash_handle hh; -} name_rec; - -int main(int argc,char *argv[]) { - name_rec *name, *names=NULL; - char linebuf[BUFLEN]; - FILE *file; - int i=0,j=0; - - if ( (file = fopen( "test14.dat", "r" )) == NULL ) { - perror("can't open: "); - exit(-1); - } - - while (fgets(linebuf,BUFLEN,file) != NULL) { - i++; - if ( (name = (name_rec*)malloc(sizeof(name_rec))) == NULL) exit(-1); - strncpy(name->boy_name,linebuf,BUFLEN); - HASH_ADD_STR(names,boy_name,name); - } - - fseek(file,0,SEEK_SET); - - while (fgets(linebuf,BUFLEN,file) != NULL) { - HASH_FIND_STR(names,linebuf,name); - if (!name) printf("failed to find: %s", linebuf); - else j++; - } - fclose(file); - printf("lookup on %d of %d names succeeded\n", j, i); - return 0; -} - diff --git a/3rdparty/uthash-1.9.3/tests/test14.dat b/3rdparty/uthash-1.9.3/tests/test14.dat deleted file mode 100644 index ea0b4ea..0000000 --- a/3rdparty/uthash-1.9.3/tests/test14.dat +++ /dev/null @@ -1,1219 +0,0 @@ -JAMES -JOHN -ROBERT -MICHAEL -WILLIAM -DAVID -RICHARD -CHARLES -JOSEPH -THOMAS -CHRISTOPHER -DANIEL -PAUL -MARK -DONALD -GEORGE -KENNETH -STEVEN -EDWARD -BRIAN -RONALD -ANTHONY -KEVIN -JASON -MATTHEW -GARY -TIMOTHY -JOSE -LARRY -JEFFREY -FRANK -SCOTT -ERIC -STEPHEN -ANDREW -RAYMOND -GREGORY -JOSHUA -JERRY -DENNIS -WALTER -PATRICK -PETER -HAROLD -DOUGLAS -HENRY -CARL -ARTHUR -RYAN -ROGER -JOE -JUAN -JACK -ALBERT -JONATHAN -JUSTIN -TERRY -GERALD -KEITH -SAMUEL -WILLIE -RALPH -LAWRENCE -NICHOLAS -ROY -BENJAMIN -BRUCE -BRANDON -ADAM -HARRY -FRED -WAYNE -BILLY -STEVE -LOUIS -JEREMY -AARON -RANDY -HOWARD -EUGENE -CARLOS -RUSSELL -BOBBY -VICTOR -MARTIN -ERNEST -PHILLIP -TODD -JESSE -CRAIG -ALAN -SHAWN -CLARENCE -SEAN -PHILIP -CHRIS -JOHNNY -EARL -JIMMY -ANTONIO -DANNY -BRYAN -TONY -LUIS -MIKE -STANLEY -LEONARD -NATHAN -DALE -MANUEL -RODNEY -CURTIS -NORMAN -ALLEN -MARVIN -VINCENT -GLENN -JEFFERY -TRAVIS -JEFF -CHAD -JACOB -LEE -MELVIN -ALFRED -KYLE -FRANCIS -BRADLEY -JESUS -HERBERT -FREDERICK -RAY -JOEL -EDWIN -DON -EDDIE -RICKY -TROY -RANDALL -BARRY -ALEXANDER -BERNARD -MARIO -LEROY -FRANCISCO -MARCUS -MICHEAL -THEODORE -CLIFFORD -MIGUEL -OSCAR -JAY -JIM -TOM -CALVIN -ALEX -JON -RONNIE -BILL -LLOYD -TOMMY -LEON -DEREK -WARREN -DARRELL -JEROME -FLOYD -LEO -ALVIN -TIM -WESLEY -GORDON -DEAN -GREG -JORGE -DUSTIN -PEDRO -DERRICK -DAN -LEWIS -ZACHARY -COREY -HERMAN -MAURICE -VERNON -ROBERTO -CLYDE -GLEN -HECTOR -SHANE -RICARDO -SAM -RICK -LESTER -BRENT -RAMON -CHARLIE -TYLER -GILBERT -GENE -MARC -REGINALD -RUBEN -BRETT -ANGEL -NATHANIEL -RAFAEL -LESLIE -EDGAR -MILTON -RAUL -BEN -CHESTER -CECIL -DUANE -FRANKLIN -ANDRE -ELMER -BRAD -GABRIEL -RON -MITCHELL -ROLAND -ARNOLD -HARVEY -JARED -ADRIAN -KARL -CORY -CLAUDE -ERIK -DARRYL -JAMIE -NEIL -JESSIE -CHRISTIAN -JAVIER -FERNANDO -CLINTON -TED -MATHEW -TYRONE -DARREN -LONNIE -LANCE -CODY -JULIO -KELLY -KURT -ALLAN -NELSON -GUY -CLAYTON -HUGH -MAX -DWAYNE -DWIGHT -ARMANDO -FELIX -JIMMIE -EVERETT -JORDAN -IAN -WALLACE -KEN -BOB -JAIME -CASEY -ALFREDO -ALBERTO -DAVE -IVAN -JOHNNIE -SIDNEY -BYRON -JULIAN -ISAAC -MORRIS -CLIFTON -WILLARD -DARYL -ROSS -VIRGIL -ANDY -MARSHALL -SALVADOR -PERRY -KIRK -SERGIO -MARION -TRACY -SETH -KENT -TERRANCE -RENE -EDUARDO -TERRENCE -ENRIQUE -FREDDIE -WADE -AUSTIN -STUART -FREDRICK -ARTURO -ALEJANDRO -JACKIE -JOEY -NICK -LUTHER -WENDELL -JEREMIAH -EVAN -JULIUS -DANA -DONNIE -OTIS -SHANNON -TREVOR -OLIVER -LUKE -HOMER -GERARD -DOUG -KENNY -HUBERT -ANGELO -SHAUN -LYLE -MATT -LYNN -ALFONSO -ORLANDO -REX -CARLTON -ERNESTO -CAMERON -NEAL -PABLO -LORENZO -OMAR -WILBUR -BLAKE -GRANT -HORACE -RODERICK -KERRY -ABRAHAM -WILLIS -RICKEY -JEAN -IRA -ANDRES -CESAR -JOHNATHAN -MALCOLM -RUDOLPH -DAMON -KELVIN -RUDY -PRESTON -ALTON -ARCHIE -MARCO -WM -PETE -RANDOLPH -GARRY -GEOFFREY -JONATHON -FELIPE -BENNIE -GERARDO -ED -DOMINIC -ROBIN -LOREN -DELBERT -COLIN -GUILLERMO -EARNEST -LUCAS -BENNY -NOEL -SPENCER -RODOLFO -MYRON -EDMUND -GARRETT -SALVATORE -CEDRIC -LOWELL -GREGG -SHERMAN -WILSON -DEVIN -SYLVESTER -KIM -ROOSEVELT -ISRAEL -JERMAINE -FORREST -WILBERT -LELAND -SIMON -GUADALUPE -CLARK -IRVING -CARROLL -BRYANT -OWEN -RUFUS -WOODROW -SAMMY -KRISTOPHER -MACK -LEVI -MARCOS -GUSTAVO -JAKE -LIONEL -MARTY -TAYLOR -ELLIS -DALLAS -GILBERTO -CLINT -NICOLAS -LAURENCE -ISMAEL -ORVILLE -DREW -JODY -ERVIN -DEWEY -AL -WILFRED -JOSH -HUGO -IGNACIO -CALEB -TOMAS -SHELDON -ERICK -FRANKIE -STEWART -DOYLE -DARREL -ROGELIO -TERENCE -SANTIAGO -ALONZO -ELIAS -BERT -ELBERT -RAMIRO -CONRAD -PAT -NOAH -GRADY -PHIL -CORNELIUS -LAMAR -ROLANDO -CLAY -PERCY -DEXTER -BRADFORD -MERLE -DARIN -AMOS -TERRELL -MOSES -IRVIN -SAUL -ROMAN -DARNELL -RANDAL -TOMMIE -TIMMY -DARRIN -WINSTON -BRENDAN -TOBY -VAN -ABEL -DOMINICK -BOYD -COURTNEY -JAN -EMILIO -ELIJAH -CARY -DOMINGO -SANTOS -AUBREY -EMMETT -MARLON -EMANUEL -JERALD -EDMOND -EMIL -DEWAYNE -WILL -OTTO -TEDDY -REYNALDO -BRET -MORGAN -JESS -TRENT -HUMBERTO -EMMANUEL -STEPHAN -LOUIE -VICENTE -LAMONT -STACY -GARLAND -MILES -MICAH -EFRAIN -BILLIE -LOGAN -HEATH -RODGER -HARLEY -DEMETRIUS -ETHAN -ELDON -ROCKY -PIERRE -JUNIOR -FREDDY -ELI -BRYCE -ANTOINE -ROBBIE -KENDALL -ROYCE -STERLING -MICKEY -CHASE -GROVER -ELTON -CLEVELAND -DYLAN -CHUCK -DAMIAN -REUBEN -STAN -AUGUST -LEONARDO -JASPER -RUSSEL -ERWIN -BENITO -HANS -MONTE -BLAINE -ERNIE -CURT -QUENTIN -AGUSTIN -MURRAY -JAMAL -DEVON -ADOLFO -HARRISON -TYSON -BURTON -BRADY -ELLIOTT -WILFREDO -BART -JARROD -VANCE -DENIS -DAMIEN -JOAQUIN -HARLAN -DESMOND -ELLIOT -DARWIN -ASHLEY -GREGORIO -BUDDY -XAVIER -KERMIT -ROSCOE -ESTEBAN -ANTON -SOLOMON -SCOTTY -NORBERT -ELVIN -WILLIAMS -NOLAN -CAREY -ROD -QUINTON -HAL -BRAIN -ROB -ELWOOD -KENDRICK -DARIUS -MOISES -SON -MARLIN -FIDEL -THADDEUS -CLIFF -MARCEL -ALI -JACKSON -RAPHAEL -BRYON -ARMAND -ALVARO -JEFFRY -DANE -JOESPH -THURMAN -NED -SAMMIE -RUSTY -MICHEL -MONTY -RORY -FABIAN -REGGIE -MASON -GRAHAM -KRIS -ISAIAH -VAUGHN -GUS -AVERY -LOYD -DIEGO -ALEXIS -ADOLPH -NORRIS -MILLARD -ROCCO -GONZALO -DERICK -RODRIGO -GERRY -STACEY -CARMEN -WILEY -RIGOBERTO -ALPHONSO -TY -SHELBY -RICKIE -NOE -VERN -BOBBIE -REED -JEFFERSON -ELVIS -BERNARDO -MAURICIO -HIRAM -DONOVAN -BASIL -RILEY -OLLIE -NICKOLAS -MAYNARD -SCOT -VINCE -QUINCY -EDDY -SEBASTIAN -FEDERICO -ULYSSES -HERIBERTO -DONNELL -COLE -DENNY -DAVIS -GAVIN -EMERY -WARD -ROMEO -JAYSON -DION -DANTE -CLEMENT -COY -ODELL -MAXWELL -JARVIS -BRUNO -ISSAC -MARY -DUDLEY -BROCK -SANFORD -COLBY -CARMELO -BARNEY -NESTOR -HOLLIS -STEFAN -DONNY -ART -LINWOOD -BEAU -WELDON -GALEN -ISIDRO -TRUMAN -DELMAR -JOHNATHON -SILAS -FREDERIC -DICK -KIRBY -IRWIN -CRUZ -MERLIN -MERRILL -CHARLEY -MARCELINO -LANE -HARRIS -CLEO -CARLO -TRENTON -KURTIS -HUNTER -AURELIO -WINFRED -VITO -COLLIN -DENVER -CARTER -LEONEL -EMORY -PASQUALE -MOHAMMAD -MARIANO -DANIAL -BLAIR -LANDON -DIRK -BRANDEN -ADAN -NUMBERS -CLAIR -BUFORD -GERMAN -BERNIE -WILMER -JOAN -EMERSON -ZACHERY -FLETCHER -JACQUES -ERROL -DALTON -MONROE -JOSUE -DOMINIQUE -EDWARDO -BOOKER -WILFORD -SONNY -SHELTON -CARSON -THERON -RAYMUNDO -DAREN -TRISTAN -HOUSTON -ROBBY -LINCOLN -JAME -GENARO -GALE -BENNETT -OCTAVIO -CORNELL -LAVERNE -HUNG -ARRON -ANTONY -HERSCHEL -ALVA -GIOVANNI -GARTH -CYRUS -CYRIL -RONNY -STEVIE -LON -FREEMAN -ERIN -DUNCAN -KENNITH -CARMINE -AUGUSTINE -YOUNG -ERICH -CHADWICK -WILBURN -RUSS -REID -MYLES -ANDERSON -MORTON -JONAS -FOREST -MITCHEL -MERVIN -ZANE -RICH -JAMEL -LAZARO -ALPHONSE -RANDELL -MAJOR -JOHNIE -JARRETT -BROOKS -ARIEL -ABDUL -DUSTY -LUCIANO -LINDSEY -TRACEY -SEYMOUR -SCOTTIE -EUGENIO -MOHAMMED -SANDY -VALENTIN -CHANCE -ARNULFO -LUCIEN -FERDINAND -THAD -EZRA -SYDNEY -ALDO -RUBIN -ROYAL -MITCH -EARLE -ABE -WYATT -MARQUIS -LANNY -KAREEM -JAMAR -BORIS -ISIAH -EMILE -ELMO -ARON -LEOPOLDO -EVERETTE -JOSEF -GAIL -ELOY -DORIAN -RODRICK -REINALDO -LUCIO -JERROD -WESTON -HERSHEL -BARTON -PARKER -LEMUEL -LAVERN -BURT -JULES -GIL -ELISEO -AHMAD -NIGEL -EFREN -ANTWAN -ALDEN -MARGARITO -COLEMAN -REFUGIO -DINO -OSVALDO -LES -DEANDRE -NORMAND -KIETH -IVORY -ANDREA -TREY -NORBERTO -NAPOLEON -JEROLD -FRITZ -ROSENDO -MILFORD -SANG -DEON -CHRISTOPER -ALFONZO -LYMAN -JOSIAH -BRANT -WILTON -RICO -JAMAAL -DEWITT -CAROL -BRENTON -YONG -OLIN -FOSTER -FAUSTINO -CLAUDIO -JUDSON -GINO -EDGARDO -BERRY -ALEC -TANNER -JARRED -DONN -TRINIDAD -TAD -SHIRLEY -PRINCE -PORFIRIO -ODIS -MARIA -LENARD -CHAUNCEY -CHANG -TOD -MEL -MARCELO -KORY -AUGUSTUS -KEVEN -HILARIO -BUD -SAL -ROSARIO -ORVAL -MAURO -DANNIE -ZACHARIAH -OLEN -ANIBAL -MILO -JED -FRANCES -THANH -DILLON -AMADO -NEWTON -CONNIE -LENNY -TORY -RICHIE -LUPE -HORACIO -BRICE -MOHAMED -DELMER -DARIO -REYES -DEE -MAC -JONAH -JERROLD -ROBT -HANK -SUNG -RUPERT -ROLLAND -KENTON -DAMION -CHI -ANTONE -WALDO -FREDRIC -BRADLY -QUINN -KIP -BURL -WALKER -TYREE -JEFFEREY -AHMED -WILLY -STANFORD -OREN -NOBLE -MOSHE -MIKEL -ENOCH -BRENDON -QUINTIN -JAMISON -FLORENCIO -DARRICK -TOBIAS -MINH -HASSAN -GIUSEPPE -DEMARCUS -CLETUS -TYRELL -LYNDON -KEENAN -WERNER -THEO -GERALDO -LOU -COLUMBUS -CHET -BERTRAM -MARKUS -HUEY -HILTON -DWAIN -DONTE -TYRON -OMER -ISAIAS -HIPOLITO -FERMIN -CHUNG -ADALBERTO -VALENTINE -JAMEY -BO -BARRETT -WHITNEY -TEODORO -MCKINLEY -MAXIMO -GARFIELD -SOL -RALEIGH -LAWERENCE -ABRAM -RASHAD -KING -EMMITT -DARON -CHONG -SAMUAL -PARIS -OTHA -MIQUEL -LACY -EUSEBIO -DONG -DOMENIC -DARRON -BUSTER -ANTONIA -WILBER -RENATO -JC -HOYT -HAYWOOD -EZEKIEL -CHAS -FLORENTINO -ELROY -CLEMENTE -ARDEN -NEVILLE -KELLEY -EDISON -DESHAWN -CARROL -SHAYNE -NATHANIAL -JORDON -DANILO -CLAUD -VAL -SHERWOOD -RAYMON -RAYFORD -CRISTOBAL -AMBROSE -TITUS -HYMAN -FELTON -EZEQUIEL -ERASMO -STANTON -LONNY -LEN -IKE -MILAN -LINO -JAROD -HERB -ANDREAS -WALTON -RHETT -PALMER -JUDE -DOUGLASS -CORDELL -OSWALDO -ELLSWORTH -VIRGILIO -TONEY -NATHANAEL -DEL -BRITT -BENEDICT -MOSE -HONG -LEIGH -JOHNSON -ISREAL -GAYLE -GARRET -FAUSTO -ASA -ARLEN -ZACK -WARNER -MODESTO -FRANCESCO -MANUAL -JAE -GAYLORD -GASTON -FILIBERTO -DEANGELO -MICHALE -GRANVILLE -WES -MALIK -ZACKARY -TUAN -NICKY -ELDRIDGE -CRISTOPHER -CORTEZ -ANTIONE -MALCOM -LONG -KOREY -JOSPEH -COLTON -WAYLON -VON -HOSEA -SHAD -SANTO -RUDOLF -ROLF -REY -RENALDO -MARCELLUS -LUCIUS -LESLEY -KRISTOFER -BOYCE -BENTON -MAN -KASEY -JEWELL -HAYDEN -HARLAND -ARNOLDO -RUEBEN -LEANDRO -KRAIG -JERRELL -JEROMY -HOBERT -CEDRICK -ARLIE -WINFORD -WALLY -PATRICIA -LUIGI -KENETH -JACINTO -GRAIG -FRANKLYN -EDMUNDO -SID -PORTER -LEIF -LAUREN -JERAMY -ELISHA -BUCK -WILLIAN -VINCENZO -SHON -MICHAL -LYNWOOD -LINDSAY -JEWEL -JERE -HAI -ELDEN -DORSEY -DARELL -BRODERICK -ALONSO diff --git a/3rdparty/uthash-1.9.3/tests/test15.ans b/3rdparty/uthash-1.9.3/tests/test15.ans deleted file mode 100644 index ad69a94..0000000 --- a/3rdparty/uthash-1.9.3/tests/test15.ans +++ /dev/null @@ -1 +0,0 @@ -betty's id is 2 diff --git a/3rdparty/uthash-1.9.3/tests/test15.c b/3rdparty/uthash-1.9.3/tests/test15.c deleted file mode 100644 index cbeffe3..0000000 --- a/3rdparty/uthash-1.9.3/tests/test15.c +++ /dev/null @@ -1,28 +0,0 @@ -#include /* strcpy */ -#include /* malloc */ -#include /* printf */ -#include "uthash.h" - -struct my_struct { - char name[10]; /* key */ - int id; - UT_hash_handle hh; /* makes this structure hashable */ -}; - - -int main(int argc, char *argv[]) { - const char **n, *names[] = { "joe", "bob", "betty", NULL }; - struct my_struct *s, *users = NULL; - int i=0; - - for (n = names; *n != NULL; n++) { - s = (struct my_struct*)malloc(sizeof(struct my_struct)); - strncpy(s->name, *n,10); - s->id = i++; - HASH_ADD_STR( users, name, s ); - } - - HASH_FIND_STR( users, "betty", s); - if (s) printf("betty's id is %d\n", s->id); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test16.ans b/3rdparty/uthash-1.9.3/tests/test16.ans deleted file mode 100644 index 1b4d7e1..0000000 --- a/3rdparty/uthash-1.9.3/tests/test16.ans +++ /dev/null @@ -1 +0,0 @@ -found: user 5, unix time 157680000 diff --git a/3rdparty/uthash-1.9.3/tests/test16.c b/3rdparty/uthash-1.9.3/tests/test16.c deleted file mode 100644 index 59b14f4..0000000 --- a/3rdparty/uthash-1.9.3/tests/test16.c +++ /dev/null @@ -1,46 +0,0 @@ -#include /* malloc */ -#include /* offsetof */ -#include /* printf */ -#include /* memset */ -#include "uthash.h" - -struct inner { - int a; - int b; -}; - -struct my_event { - struct inner is; /* key is aggregate of this field */ - char event_code; /* and this field. */ - int user_id; - UT_hash_handle hh; /* makes this structure hashable */ -}; - - -int main(int argc, char *argv[]) { - struct my_event *e, ev, *events = NULL; - unsigned i, keylen; - - keylen = offsetof(struct my_event, event_code) + sizeof(char) - - offsetof(struct my_event, is); - - for(i = 0; i < 10; i++) { - e = (struct my_event*)malloc(sizeof(struct my_event)); - memset(e,0,sizeof(struct my_event)); - e->is.a = i * (60*60*24*365); /* i years (sec)*/ - e->is.b = 0; - e->event_code = 'a'+(i%2); /* meaningless */ - e->user_id = i; - - HASH_ADD( hh, events, is, keylen, e); - } - - /* look for one specific event */ - memset(&ev,0,sizeof(struct my_event)); - ev.is.a = 5 * (60*60*24*365); - ev.is.b = 0; - ev.event_code = 'b'; - HASH_FIND( hh, events, &ev.is, keylen , e); - if (e) printf("found: user %d, unix time %d\n", e->user_id, e->is.a); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test17.ans b/3rdparty/uthash-1.9.3/tests/test17.ans deleted file mode 100644 index 92ae3ef..0000000 --- a/3rdparty/uthash-1.9.3/tests/test17.ans +++ /dev/null @@ -1,134 +0,0 @@ -user 9, cookie 81 -user 8, cookie 64 -user 7, cookie 49 -user 6, cookie 36 -user 5, cookie 25 -user 4, cookie 16 -user 3, cookie 9 -user 2, cookie 4 -user 1, cookie 1 -user 0, cookie 0 -sorting -called for a:9, b:8 -called for a:7, b:6 -called for a:5, b:4 -called for a:3, b:2 -called for a:1, b:0 -called for a:8, b:6 -called for a:8, b:7 -called for a:4, b:2 -called for a:4, b:3 -called for a:6, b:2 -called for a:6, b:3 -called for a:6, b:4 -called for a:6, b:5 -called for a:2, b:0 -called for a:2, b:1 -user 0, cookie 0 -user 1, cookie 1 -user 2, cookie 4 -user 3, cookie 9 -user 4, cookie 16 -user 5, cookie 25 -user 6, cookie 36 -user 7, cookie 49 -user 8, cookie 64 -user 9, cookie 81 -adding 10-20 -user 0, cookie 0 -user 1, cookie 1 -user 2, cookie 4 -user 3, cookie 9 -user 4, cookie 16 -user 5, cookie 25 -user 6, cookie 36 -user 7, cookie 49 -user 8, cookie 64 -user 9, cookie 81 -user 20, cookie 400 -user 19, cookie 361 -user 18, cookie 324 -user 17, cookie 289 -user 16, cookie 256 -user 15, cookie 225 -user 14, cookie 196 -user 13, cookie 169 -user 12, cookie 144 -user 11, cookie 121 -user 10, cookie 100 -sorting -called for a:0, b:1 -called for a:2, b:3 -called for a:4, b:5 -called for a:6, b:7 -called for a:8, b:9 -called for a:20, b:19 -called for a:18, b:17 -called for a:16, b:15 -called for a:14, b:13 -called for a:12, b:11 -called for a:0, b:2 -called for a:1, b:2 -called for a:4, b:6 -called for a:5, b:6 -called for a:8, b:19 -called for a:9, b:19 -called for a:17, b:15 -called for a:17, b:16 -called for a:13, b:11 -called for a:13, b:12 -called for a:0, b:4 -called for a:1, b:4 -called for a:2, b:4 -called for a:3, b:4 -called for a:8, b:15 -called for a:9, b:15 -called for a:19, b:15 -called for a:19, b:16 -called for a:19, b:17 -called for a:19, b:18 -called for a:11, b:10 -called for a:0, b:8 -called for a:1, b:8 -called for a:2, b:8 -called for a:3, b:8 -called for a:4, b:8 -called for a:5, b:8 -called for a:6, b:8 -called for a:7, b:8 -called for a:0, b:10 -called for a:1, b:10 -called for a:2, b:10 -called for a:3, b:10 -called for a:4, b:10 -called for a:5, b:10 -called for a:6, b:10 -called for a:7, b:10 -called for a:8, b:10 -called for a:9, b:10 -called for a:15, b:10 -called for a:15, b:11 -called for a:15, b:12 -called for a:15, b:13 -called for a:15, b:14 -user 0, cookie 0 -user 1, cookie 1 -user 2, cookie 4 -user 3, cookie 9 -user 4, cookie 16 -user 5, cookie 25 -user 6, cookie 36 -user 7, cookie 49 -user 8, cookie 64 -user 9, cookie 81 -user 10, cookie 100 -user 11, cookie 121 -user 12, cookie 144 -user 13, cookie 169 -user 14, cookie 196 -user 15, cookie 225 -user 16, cookie 256 -user 17, cookie 289 -user 18, cookie 324 -user 19, cookie 361 -user 20, cookie 400 diff --git a/3rdparty/uthash-1.9.3/tests/test17.c b/3rdparty/uthash-1.9.3/tests/test17.c deleted file mode 100644 index 4684e45..0000000 --- a/3rdparty/uthash-1.9.3/tests/test17.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; -} example_user_t; - -int rev(void *_a, void *_b) { - example_user_t *a = (example_user_t*)_a; - example_user_t *b = (example_user_t*)_b; - printf("called for a:%d, b:%d\n",a->id, b->id); - return (a->id - b->id); -} - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *users=NULL; - - /* create elements */ - for(i=9;i>=0;i--) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - } - - for(user=users; user != NULL; user=(example_user_t*)user->hh.next) { - printf("user %d, cookie %d\n", user->id, user->cookie); - } - printf("sorting\n"); - HASH_SORT(users,rev); - for(user=users; user != NULL; user=(example_user_t*)user->hh.next) { - printf("user %d, cookie %d\n", user->id, user->cookie); - } - - printf("adding 10-20\n"); - for(i=20;i>=10;i--) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - } - for(user=users; user != NULL; user=(example_user_t*)user->hh.next) { - printf("user %d, cookie %d\n", user->id, user->cookie); - } - printf("sorting\n"); - HASH_SORT(users,rev); - for(user=users; user != NULL; user=(example_user_t*)user->hh.next) { - printf("user %d, cookie %d\n", user->id, user->cookie); - } - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test18.ans b/3rdparty/uthash-1.9.3/tests/test18.ans deleted file mode 100644 index db48dcf..0000000 --- a/3rdparty/uthash-1.9.3/tests/test18.ans +++ /dev/null @@ -1,20 +0,0 @@ -user 0, cookie 0 -user 1, cookie 1 -user 2, cookie 4 -user 3, cookie 9 -user 4, cookie 16 -user 5, cookie 25 -user 6, cookie 36 -user 7, cookie 49 -user 8, cookie 64 -user 9, cookie 81 -deleting id 0 -deleting id 1 -deleting id 2 -deleting id 3 -deleting id 4 -deleting id 5 -deleting id 6 -deleting id 7 -deleting id 8 -deleting id 9 diff --git a/3rdparty/uthash-1.9.3/tests/test18.c b/3rdparty/uthash-1.9.3/tests/test18.c deleted file mode 100644 index 80c4cf6..0000000 --- a/3rdparty/uthash-1.9.3/tests/test18.c +++ /dev/null @@ -1,33 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; -} example_user_t; - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *users=NULL; - - /* create elements */ - for(i=0;i<10;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - } - - for(user=users; user != NULL; user=(example_user_t*)user->hh.next) { - printf("user %d, cookie %d\n", user->id, user->cookie); - } - - /* delete them all, pathologically */ - while(users) { - printf("deleting id %i\n", users->id); - HASH_DEL(users,users); /* single head/deletee var! */ - } - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test19.ans b/3rdparty/uthash-1.9.3/tests/test19.ans deleted file mode 100644 index 588d0d9..0000000 --- a/3rdparty/uthash-1.9.3/tests/test19.ans +++ /dev/null @@ -1,1012 +0,0 @@ -sorting users ascending -user 0 -user 1 -user 2 -user 3 -user 4 -user 5 -user 6 -user 7 -user 8 -user 9 -sorting altusers descending -altuser 999 -altuser 998 -altuser 997 -altuser 996 -altuser 995 -altuser 994 -altuser 993 -altuser 992 -altuser 991 -altuser 990 -altuser 989 -altuser 988 -altuser 987 -altuser 986 -altuser 985 -altuser 984 -altuser 983 -altuser 982 -altuser 981 -altuser 980 -altuser 979 -altuser 978 -altuser 977 -altuser 976 -altuser 975 -altuser 974 -altuser 973 -altuser 972 -altuser 971 -altuser 970 -altuser 969 -altuser 968 -altuser 967 -altuser 966 -altuser 965 -altuser 964 -altuser 963 -altuser 962 -altuser 961 -altuser 960 -altuser 959 -altuser 958 -altuser 957 -altuser 956 -altuser 955 -altuser 954 -altuser 953 -altuser 952 -altuser 951 -altuser 950 -altuser 949 -altuser 948 -altuser 947 -altuser 946 -altuser 945 -altuser 944 -altuser 943 -altuser 942 -altuser 941 -altuser 940 -altuser 939 -altuser 938 -altuser 937 -altuser 936 -altuser 935 -altuser 934 -altuser 933 -altuser 932 -altuser 931 -altuser 930 -altuser 929 -altuser 928 -altuser 927 -altuser 926 -altuser 925 -altuser 924 -altuser 923 -altuser 922 -altuser 921 -altuser 920 -altuser 919 -altuser 918 -altuser 917 -altuser 916 -altuser 915 -altuser 914 -altuser 913 -altuser 912 -altuser 911 -altuser 910 -altuser 909 -altuser 908 -altuser 907 -altuser 906 -altuser 905 -altuser 904 -altuser 903 -altuser 902 -altuser 901 -altuser 900 -altuser 899 -altuser 898 -altuser 897 -altuser 896 -altuser 895 -altuser 894 -altuser 893 -altuser 892 -altuser 891 -altuser 890 -altuser 889 -altuser 888 -altuser 887 -altuser 886 -altuser 885 -altuser 884 -altuser 883 -altuser 882 -altuser 881 -altuser 880 -altuser 879 -altuser 878 -altuser 877 -altuser 876 -altuser 875 -altuser 874 -altuser 873 -altuser 872 -altuser 871 -altuser 870 -altuser 869 -altuser 868 -altuser 867 -altuser 866 -altuser 865 -altuser 864 -altuser 863 -altuser 862 -altuser 861 -altuser 860 -altuser 859 -altuser 858 -altuser 857 -altuser 856 -altuser 855 -altuser 854 -altuser 853 -altuser 852 -altuser 851 -altuser 850 -altuser 849 -altuser 848 -altuser 847 -altuser 846 -altuser 845 -altuser 844 -altuser 843 -altuser 842 -altuser 841 -altuser 840 -altuser 839 -altuser 838 -altuser 837 -altuser 836 -altuser 835 -altuser 834 -altuser 833 -altuser 832 -altuser 831 -altuser 830 -altuser 829 -altuser 828 -altuser 827 -altuser 826 -altuser 825 -altuser 824 -altuser 823 -altuser 822 -altuser 821 -altuser 820 -altuser 819 -altuser 818 -altuser 817 -altuser 816 -altuser 815 -altuser 814 -altuser 813 -altuser 812 -altuser 811 -altuser 810 -altuser 809 -altuser 808 -altuser 807 -altuser 806 -altuser 805 -altuser 804 -altuser 803 -altuser 802 -altuser 801 -altuser 800 -altuser 799 -altuser 798 -altuser 797 -altuser 796 -altuser 795 -altuser 794 -altuser 793 -altuser 792 -altuser 791 -altuser 790 -altuser 789 -altuser 788 -altuser 787 -altuser 786 -altuser 785 -altuser 784 -altuser 783 -altuser 782 -altuser 781 -altuser 780 -altuser 779 -altuser 778 -altuser 777 -altuser 776 -altuser 775 -altuser 774 -altuser 773 -altuser 772 -altuser 771 -altuser 770 -altuser 769 -altuser 768 -altuser 767 -altuser 766 -altuser 765 -altuser 764 -altuser 763 -altuser 762 -altuser 761 -altuser 760 -altuser 759 -altuser 758 -altuser 757 -altuser 756 -altuser 755 -altuser 754 -altuser 753 -altuser 752 -altuser 751 -altuser 750 -altuser 749 -altuser 748 -altuser 747 -altuser 746 -altuser 745 -altuser 744 -altuser 743 -altuser 742 -altuser 741 -altuser 740 -altuser 739 -altuser 738 -altuser 737 -altuser 736 -altuser 735 -altuser 734 -altuser 733 -altuser 732 -altuser 731 -altuser 730 -altuser 729 -altuser 728 -altuser 727 -altuser 726 -altuser 725 -altuser 724 -altuser 723 -altuser 722 -altuser 721 -altuser 720 -altuser 719 -altuser 718 -altuser 717 -altuser 716 -altuser 715 -altuser 714 -altuser 713 -altuser 712 -altuser 711 -altuser 710 -altuser 709 -altuser 708 -altuser 707 -altuser 706 -altuser 705 -altuser 704 -altuser 703 -altuser 702 -altuser 701 -altuser 700 -altuser 699 -altuser 698 -altuser 697 -altuser 696 -altuser 695 -altuser 694 -altuser 693 -altuser 692 -altuser 691 -altuser 690 -altuser 689 -altuser 688 -altuser 687 -altuser 686 -altuser 685 -altuser 684 -altuser 683 -altuser 682 -altuser 681 -altuser 680 -altuser 679 -altuser 678 -altuser 677 -altuser 676 -altuser 675 -altuser 674 -altuser 673 -altuser 672 -altuser 671 -altuser 670 -altuser 669 -altuser 668 -altuser 667 -altuser 666 -altuser 665 -altuser 664 -altuser 663 -altuser 662 -altuser 661 -altuser 660 -altuser 659 -altuser 658 -altuser 657 -altuser 656 -altuser 655 -altuser 654 -altuser 653 -altuser 652 -altuser 651 -altuser 650 -altuser 649 -altuser 648 -altuser 647 -altuser 646 -altuser 645 -altuser 644 -altuser 643 -altuser 642 -altuser 641 -altuser 640 -altuser 639 -altuser 638 -altuser 637 -altuser 636 -altuser 635 -altuser 634 -altuser 633 -altuser 632 -altuser 631 -altuser 630 -altuser 629 -altuser 628 -altuser 627 -altuser 626 -altuser 625 -altuser 624 -altuser 623 -altuser 622 -altuser 621 -altuser 620 -altuser 619 -altuser 618 -altuser 617 -altuser 616 -altuser 615 -altuser 614 -altuser 613 -altuser 612 -altuser 611 -altuser 610 -altuser 609 -altuser 608 -altuser 607 -altuser 606 -altuser 605 -altuser 604 -altuser 603 -altuser 602 -altuser 601 -altuser 600 -altuser 599 -altuser 598 -altuser 597 -altuser 596 -altuser 595 -altuser 594 -altuser 593 -altuser 592 -altuser 591 -altuser 590 -altuser 589 -altuser 588 -altuser 587 -altuser 586 -altuser 585 -altuser 584 -altuser 583 -altuser 582 -altuser 581 -altuser 580 -altuser 579 -altuser 578 -altuser 577 -altuser 576 -altuser 575 -altuser 574 -altuser 573 -altuser 572 -altuser 571 -altuser 570 -altuser 569 -altuser 568 -altuser 567 -altuser 566 -altuser 565 -altuser 564 -altuser 563 -altuser 562 -altuser 561 -altuser 560 -altuser 559 -altuser 558 -altuser 557 -altuser 556 -altuser 555 -altuser 554 -altuser 553 -altuser 552 -altuser 551 -altuser 550 -altuser 549 -altuser 548 -altuser 547 -altuser 546 -altuser 545 -altuser 544 -altuser 543 -altuser 542 -altuser 541 -altuser 540 -altuser 539 -altuser 538 -altuser 537 -altuser 536 -altuser 535 -altuser 534 -altuser 533 -altuser 532 -altuser 531 -altuser 530 -altuser 529 -altuser 528 -altuser 527 -altuser 526 -altuser 525 -altuser 524 -altuser 523 -altuser 522 -altuser 521 -altuser 520 -altuser 519 -altuser 518 -altuser 517 -altuser 516 -altuser 515 -altuser 514 -altuser 513 -altuser 512 -altuser 511 -altuser 510 -altuser 509 -altuser 508 -altuser 507 -altuser 506 -altuser 505 -altuser 504 -altuser 503 -altuser 502 -altuser 501 -altuser 500 -altuser 499 -altuser 498 -altuser 497 -altuser 496 -altuser 495 -altuser 494 -altuser 493 -altuser 492 -altuser 491 -altuser 490 -altuser 489 -altuser 488 -altuser 487 -altuser 486 -altuser 485 -altuser 484 -altuser 483 -altuser 482 -altuser 481 -altuser 480 -altuser 479 -altuser 478 -altuser 477 -altuser 476 -altuser 475 -altuser 474 -altuser 473 -altuser 472 -altuser 471 -altuser 470 -altuser 469 -altuser 468 -altuser 467 -altuser 466 -altuser 465 -altuser 464 -altuser 463 -altuser 462 -altuser 461 -altuser 460 -altuser 459 -altuser 458 -altuser 457 -altuser 456 -altuser 455 -altuser 454 -altuser 453 -altuser 452 -altuser 451 -altuser 450 -altuser 449 -altuser 448 -altuser 447 -altuser 446 -altuser 445 -altuser 444 -altuser 443 -altuser 442 -altuser 441 -altuser 440 -altuser 439 -altuser 438 -altuser 437 -altuser 436 -altuser 435 -altuser 434 -altuser 433 -altuser 432 -altuser 431 -altuser 430 -altuser 429 -altuser 428 -altuser 427 -altuser 426 -altuser 425 -altuser 424 -altuser 423 -altuser 422 -altuser 421 -altuser 420 -altuser 419 -altuser 418 -altuser 417 -altuser 416 -altuser 415 -altuser 414 -altuser 413 -altuser 412 -altuser 411 -altuser 410 -altuser 409 -altuser 408 -altuser 407 -altuser 406 -altuser 405 -altuser 404 -altuser 403 -altuser 402 -altuser 401 -altuser 400 -altuser 399 -altuser 398 -altuser 397 -altuser 396 -altuser 395 -altuser 394 -altuser 393 -altuser 392 -altuser 391 -altuser 390 -altuser 389 -altuser 388 -altuser 387 -altuser 386 -altuser 385 -altuser 384 -altuser 383 -altuser 382 -altuser 381 -altuser 380 -altuser 379 -altuser 378 -altuser 377 -altuser 376 -altuser 375 -altuser 374 -altuser 373 -altuser 372 -altuser 371 -altuser 370 -altuser 369 -altuser 368 -altuser 367 -altuser 366 -altuser 365 -altuser 364 -altuser 363 -altuser 362 -altuser 361 -altuser 360 -altuser 359 -altuser 358 -altuser 357 -altuser 356 -altuser 355 -altuser 354 -altuser 353 -altuser 352 -altuser 351 -altuser 350 -altuser 349 -altuser 348 -altuser 347 -altuser 346 -altuser 345 -altuser 344 -altuser 343 -altuser 342 -altuser 341 -altuser 340 -altuser 339 -altuser 338 -altuser 337 -altuser 336 -altuser 335 -altuser 334 -altuser 333 -altuser 332 -altuser 331 -altuser 330 -altuser 329 -altuser 328 -altuser 327 -altuser 326 -altuser 325 -altuser 324 -altuser 323 -altuser 322 -altuser 321 -altuser 320 -altuser 319 -altuser 318 -altuser 317 -altuser 316 -altuser 315 -altuser 314 -altuser 313 -altuser 312 -altuser 311 -altuser 310 -altuser 309 -altuser 308 -altuser 307 -altuser 306 -altuser 305 -altuser 304 -altuser 303 -altuser 302 -altuser 301 -altuser 300 -altuser 299 -altuser 298 -altuser 297 -altuser 296 -altuser 295 -altuser 294 -altuser 293 -altuser 292 -altuser 291 -altuser 290 -altuser 289 -altuser 288 -altuser 287 -altuser 286 -altuser 285 -altuser 284 -altuser 283 -altuser 282 -altuser 281 -altuser 280 -altuser 279 -altuser 278 -altuser 277 -altuser 276 -altuser 275 -altuser 274 -altuser 273 -altuser 272 -altuser 271 -altuser 270 -altuser 269 -altuser 268 -altuser 267 -altuser 266 -altuser 265 -altuser 264 -altuser 263 -altuser 262 -altuser 261 -altuser 260 -altuser 259 -altuser 258 -altuser 257 -altuser 256 -altuser 255 -altuser 254 -altuser 253 -altuser 252 -altuser 251 -altuser 250 -altuser 249 -altuser 248 -altuser 247 -altuser 246 -altuser 245 -altuser 244 -altuser 243 -altuser 242 -altuser 241 -altuser 240 -altuser 239 -altuser 238 -altuser 237 -altuser 236 -altuser 235 -altuser 234 -altuser 233 -altuser 232 -altuser 231 -altuser 230 -altuser 229 -altuser 228 -altuser 227 -altuser 226 -altuser 225 -altuser 224 -altuser 223 -altuser 222 -altuser 221 -altuser 220 -altuser 219 -altuser 218 -altuser 217 -altuser 216 -altuser 215 -altuser 214 -altuser 213 -altuser 212 -altuser 211 -altuser 210 -altuser 209 -altuser 208 -altuser 207 -altuser 206 -altuser 205 -altuser 204 -altuser 203 -altuser 202 -altuser 201 -altuser 200 -altuser 199 -altuser 198 -altuser 197 -altuser 196 -altuser 195 -altuser 194 -altuser 193 -altuser 192 -altuser 191 -altuser 190 -altuser 189 -altuser 188 -altuser 187 -altuser 186 -altuser 185 -altuser 184 -altuser 183 -altuser 182 -altuser 181 -altuser 180 -altuser 179 -altuser 178 -altuser 177 -altuser 176 -altuser 175 -altuser 174 -altuser 173 -altuser 172 -altuser 171 -altuser 170 -altuser 169 -altuser 168 -altuser 167 -altuser 166 -altuser 165 -altuser 164 -altuser 163 -altuser 162 -altuser 161 -altuser 160 -altuser 159 -altuser 158 -altuser 157 -altuser 156 -altuser 155 -altuser 154 -altuser 153 -altuser 152 -altuser 151 -altuser 150 -altuser 149 -altuser 148 -altuser 147 -altuser 146 -altuser 145 -altuser 144 -altuser 143 -altuser 142 -altuser 141 -altuser 140 -altuser 139 -altuser 138 -altuser 137 -altuser 136 -altuser 135 -altuser 134 -altuser 133 -altuser 132 -altuser 131 -altuser 130 -altuser 129 -altuser 128 -altuser 127 -altuser 126 -altuser 125 -altuser 124 -altuser 123 -altuser 122 -altuser 121 -altuser 120 -altuser 119 -altuser 118 -altuser 117 -altuser 116 -altuser 115 -altuser 114 -altuser 113 -altuser 112 -altuser 111 -altuser 110 -altuser 109 -altuser 108 -altuser 107 -altuser 106 -altuser 105 -altuser 104 -altuser 103 -altuser 102 -altuser 101 -altuser 100 -altuser 99 -altuser 98 -altuser 97 -altuser 96 -altuser 95 -altuser 94 -altuser 93 -altuser 92 -altuser 91 -altuser 90 -altuser 89 -altuser 88 -altuser 87 -altuser 86 -altuser 85 -altuser 84 -altuser 83 -altuser 82 -altuser 81 -altuser 80 -altuser 79 -altuser 78 -altuser 77 -altuser 76 -altuser 75 -altuser 74 -altuser 73 -altuser 72 -altuser 71 -altuser 70 -altuser 69 -altuser 68 -altuser 67 -altuser 66 -altuser 65 -altuser 64 -altuser 63 -altuser 62 -altuser 61 -altuser 60 -altuser 59 -altuser 58 -altuser 57 -altuser 56 -altuser 55 -altuser 54 -altuser 53 -altuser 52 -altuser 51 -altuser 50 -altuser 49 -altuser 48 -altuser 47 -altuser 46 -altuser 45 -altuser 44 -altuser 43 -altuser 42 -altuser 41 -altuser 40 -altuser 39 -altuser 38 -altuser 37 -altuser 36 -altuser 35 -altuser 34 -altuser 33 -altuser 32 -altuser 31 -altuser 30 -altuser 29 -altuser 28 -altuser 27 -altuser 26 -altuser 25 -altuser 24 -altuser 23 -altuser 22 -altuser 21 -altuser 20 -altuser 19 -altuser 18 -altuser 17 -altuser 16 -altuser 15 -altuser 14 -altuser 13 -altuser 12 -altuser 11 -altuser 10 -altuser 9 -altuser 8 -altuser 7 -altuser 6 -altuser 5 -altuser 4 -altuser 3 -altuser 2 -altuser 1 -altuser 0 diff --git a/3rdparty/uthash-1.9.3/tests/test19.c b/3rdparty/uthash-1.9.3/tests/test19.c deleted file mode 100644 index f0e26b6..0000000 --- a/3rdparty/uthash-1.9.3/tests/test19.c +++ /dev/null @@ -1,52 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; - UT_hash_handle alth; -} example_user_t; - -int ascending_sort(void *_a, void *_b) { - example_user_t *a = (example_user_t*)_a; - example_user_t *b = (example_user_t*)_b; - if (a->id == b->id) return 0; - return (a->id < b->id) ? -1 : 1; -} - -int descending_sort(void *_a, void *_b) { - example_user_t *a = (example_user_t*)_a; - example_user_t *b = (example_user_t*)_b; - if (a->id == b->id) return 0; - return (a->id < b->id) ? 1 : -1; -} - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *users=NULL, *altusers=NULL; - - /* create elements */ - for(i=0;i<1000;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - if (i<10) HASH_ADD_INT(users,id,user); - HASH_ADD(alth,altusers,id,sizeof(int),user); - } - - printf("sorting users ascending\n"); - HASH_SRT(hh,users,ascending_sort); - for(user=users; user; user=(example_user_t*)user->hh.next) - printf("user %d\n", user->id); - - printf("sorting altusers descending\n"); - HASH_SRT(alth,altusers,descending_sort); - for(user=altusers; user; user=(example_user_t*)user->alth.next) - printf("altuser %d\n", user->id); - - /* HASH_FSCK(hh,users); */ - /* HASH_FSCK(alth,altusers); */ - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test2.ans b/3rdparty/uthash-1.9.3/tests/test2.ans deleted file mode 100644 index fd4e2f8..0000000 --- a/3rdparty/uthash-1.9.3/tests/test2.ans +++ /dev/null @@ -1,5 +0,0 @@ -user id 0 found, cookie 0 -user id 2 found, cookie 4 -user id 4 found, cookie 16 -user id 6 found, cookie 36 -user id 8 found, cookie 64 diff --git a/3rdparty/uthash-1.9.3/tests/test2.c b/3rdparty/uthash-1.9.3/tests/test2.c deleted file mode 100644 index 591ca79..0000000 --- a/3rdparty/uthash-1.9.3/tests/test2.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "uthash.h" -#include -#include /* malloc */ -#include /* printf */ - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; -} example_user_t; - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *tmp, *users=NULL; - - /* create elements */ - for(i=0;i<10;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - } - - /* find each even ID */ - for(i=0;i<10;i+=2) { - HASH_FIND_INT(users,&i,tmp); - if (tmp) printf("user id %d found, cookie %d\n", tmp->id, tmp->cookie); - else printf("user id %d not found\n", i); - } - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test20.ans b/3rdparty/uthash-1.9.3/tests/test20.ans deleted file mode 100644 index 4d3bb1d..0000000 --- a/3rdparty/uthash-1.9.3/tests/test20.ans +++ /dev/null @@ -1 +0,0 @@ -found diff --git a/3rdparty/uthash-1.9.3/tests/test20.c b/3rdparty/uthash-1.9.3/tests/test20.c deleted file mode 100644 index 152df39..0000000 --- a/3rdparty/uthash-1.9.3/tests/test20.c +++ /dev/null @@ -1,28 +0,0 @@ -#include /* memcpy */ -#include /* malloc */ -#include /* printf */ -#include "uthash.h" - -struct my_struct { - char bkey[5]; /* "binary" key */ - int data; - UT_hash_handle hh; -}; - -int main(int argc, char *argv[]) { - struct my_struct *s, *t, *bins = NULL; - char binary[5] = {3,1,4,1,6}; - - /* allocate our structure. initialize to some values */ - s = (struct my_struct*)calloc(1,sizeof(struct my_struct)); - memcpy(s->bkey, binary, sizeof(binary)); - - /* add to hash table using general macro */ - HASH_ADD( hh, bins, bkey, sizeof(binary), s); - - /* look up the structure we just added */ - HASH_FIND( hh, bins, binary, sizeof(binary), t ); - - if (t) printf("found\n"); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test21.ans b/3rdparty/uthash-1.9.3/tests/test21.ans deleted file mode 100644 index af89f48..0000000 --- a/3rdparty/uthash-1.9.3/tests/test21.ans +++ /dev/null @@ -1 +0,0 @@ -found a 1 diff --git a/3rdparty/uthash-1.9.3/tests/test21.c b/3rdparty/uthash-1.9.3/tests/test21.c deleted file mode 100644 index 7eb101a..0000000 --- a/3rdparty/uthash-1.9.3/tests/test21.c +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include -#include "uthash.h" - -typedef struct { - char a; - int b; -} record_key_t; - -typedef struct { - record_key_t key; - /* ... other data ... */ - UT_hash_handle hh; -} record_t; - -int main(int argc, char *argv[]) { - record_t l, *p, *r, *records = NULL; - - r = (record_t*)malloc( sizeof(record_t) ); - memset(r, 0, sizeof(record_t)); - r->key.a = 'a'; - r->key.b = 1; - HASH_ADD(hh, records, key, sizeof(record_key_t), r); - - memset(&l, 0, sizeof(record_t)); - l.key.a = 'a'; - l.key.b = 1; - HASH_FIND(hh, records, &l.key, sizeof(record_key_t), p); - - if (p) printf("found %c %d\n", p->key.a, p->key.b); - return 0; -} - diff --git a/3rdparty/uthash-1.9.3/tests/test22.ans b/3rdparty/uthash-1.9.3/tests/test22.ans deleted file mode 100644 index 2483a24..0000000 --- a/3rdparty/uthash-1.9.3/tests/test22.ans +++ /dev/null @@ -1 +0,0 @@ -found diff --git a/3rdparty/uthash-1.9.3/tests/test22.c b/3rdparty/uthash-1.9.3/tests/test22.c deleted file mode 100644 index 63f3a21..0000000 --- a/3rdparty/uthash-1.9.3/tests/test22.c +++ /dev/null @@ -1,54 +0,0 @@ -#include /* malloc */ -#include /* offsetof */ -#include /* printf */ -#include /* memset */ -#include "uthash.h" - -#define UTF32 1 - -typedef struct { - UT_hash_handle hh; - int len; - char encoding; /* these two fields */ - int text[]; /* comprise the key */ -} msg_t; - -typedef struct { - char encoding; - int text[]; -} lookup_key_t; - -int main(int argc, char *argv[]) { - unsigned keylen; - msg_t *msg, *msgs = NULL; - lookup_key_t *lookup_key; - - int beijing[] = {0x5317, 0x4eac}; /* UTF-32LE for 北京 */ - - /* allocate and initialize our structure */ - msg = (msg_t*)malloc( sizeof(msg_t) + sizeof(beijing) ); - memset(msg, 0, sizeof(msg_t)+sizeof(beijing)); /* zero fill */ - msg->len = sizeof(beijing); - msg->encoding = UTF32; - memcpy(msg->text, beijing, sizeof(beijing)); - - /* calculate the key length including padding, using formula */ - keylen = offsetof(msg_t, text) /* offset of last key field */ - + sizeof(beijing) /* size of last key field */ - - offsetof(msg_t, encoding); /* offset of first key field */ - - /* add our structure to the hash table */ - HASH_ADD( hh, msgs, encoding, keylen, msg); - - /* look it up to prove that it worked :-) */ - msg=NULL; - - lookup_key = (lookup_key_t*)malloc(sizeof(*lookup_key) + sizeof(beijing)); - memset(lookup_key, 0, sizeof(*lookup_key) + sizeof(beijing)); - lookup_key->encoding = UTF32; - memcpy(lookup_key->text, beijing, sizeof(beijing)); - HASH_FIND( hh, msgs, &lookup_key->encoding, keylen, msg ); - if (msg) printf("found \n"); - free(lookup_key); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test23.ans b/3rdparty/uthash-1.9.3/tests/test23.ans deleted file mode 100644 index 79ed10a..0000000 --- a/3rdparty/uthash-1.9.3/tests/test23.ans +++ /dev/null @@ -1,6 +0,0 @@ -found 12345 -found 6789 -found 98765 -deleting 12345 -deleting 6789 -deleting 98765 diff --git a/3rdparty/uthash-1.9.3/tests/test23.c b/3rdparty/uthash-1.9.3/tests/test23.c deleted file mode 100644 index 78b633c..0000000 --- a/3rdparty/uthash-1.9.3/tests/test23.c +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include -#include "uthash.h" - -typedef struct { - int key; - int data; - UT_hash_handle hh; -} item; - -int main() { - item *i, *j, *items=NULL; - int k; - - /* first item */ - k = 12345; - i = (item*)malloc(sizeof(item)); - i->key = k; i->data = 0; - HASH_ADD_INT(items,key,i); - - /* second item */ - k = 6789; - i = (item*)malloc(sizeof(item)); - i->key = k; i->data = 0; - HASH_ADD_INT(items,key,i); - - /* third item */ - k = 98765; - i = (item*)malloc(sizeof(item)); - i->key = k; i->data = 0; - HASH_ADD_INT(items,key,i); - - /* look them all up */ - k = 12345; HASH_FIND_INT(items, &k, j); if (j) printf("found %d\n",k); - k = 6789; HASH_FIND_INT(items, &k, j); if (j) printf("found %d\n",k); - k = 98765; HASH_FIND_INT(items, &k, j); if (j) printf("found %d\n",k); - - /* delete them not the way we prefer but it works */ - for(j=items; j != NULL; j=(item*)j->hh.next) { - printf("deleting %d\n", j->key); - HASH_DEL(items,j); - } - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test24.ans b/3rdparty/uthash-1.9.3/tests/test24.ans deleted file mode 100644 index 4a2034a..0000000 --- a/3rdparty/uthash-1.9.3/tests/test24.ans +++ /dev/null @@ -1 +0,0 @@ -hash contains 10 items diff --git a/3rdparty/uthash-1.9.3/tests/test24.c b/3rdparty/uthash-1.9.3/tests/test24.c deleted file mode 100644 index 28d3bf4..0000000 --- a/3rdparty/uthash-1.9.3/tests/test24.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; -} example_user_t; - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *users=NULL; - - /* create elements */ - for(i=0;i<10;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - } - - printf("hash contains %d items\n", HASH_COUNT(users)); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test25.ans b/3rdparty/uthash-1.9.3/tests/test25.ans deleted file mode 100644 index 5c71cdf..0000000 --- a/3rdparty/uthash-1.9.3/tests/test25.ans +++ /dev/null @@ -1,28 +0,0 @@ -CDL macros -c b a -advancing head pointer -b a c -b a c b a c b a c b -b c a b c a b c a b -deleting b -a c -deleting (a) -c -deleting (c) - -DL macros -a b c -deleting tail c -a b -deleting head a -b -deleting head b - -LL macros -a b c -deleting tail c -a b -deleting head a -b -deleting head b - diff --git a/3rdparty/uthash-1.9.3/tests/test25.c b/3rdparty/uthash-1.9.3/tests/test25.c deleted file mode 100644 index c22be85..0000000 --- a/3rdparty/uthash-1.9.3/tests/test25.c +++ /dev/null @@ -1,112 +0,0 @@ -#include -#include "utlist.h" - -typedef struct el { - int id; - struct el *next, *prev; -} el; - -el *head = NULL; - -int main(int argc, char *argv[]) { - int i; - el els[10], *e; - for(i=0;i<10;i++) els[i].id='a'+i; - - /* test CDL macros */ - printf("CDL macros\n"); - CDL_PREPEND(head,&els[0]); - CDL_PREPEND(head,&els[1]); - CDL_PREPEND(head,&els[2]); - CDL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - /* point head to head->next */ - printf("advancing head pointer\n"); - head = head->next; - CDL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - /* follow circular loop a few times */ - for(i=0,e=head;e && i<10;i++,e=e->next) - printf("%c ", e->id); - printf("\n"); - - /* follow circular loop backwards a few times */ - for(i=0,e=head;e && i<10;i++,e=e->prev) - printf("%c ", e->id); - printf("\n"); - - printf("deleting b\n"); - CDL_DELETE(head,&els[1]); - CDL_FOREACH(head,e) printf("%c ", e->id); - printf("\n"); - printf("deleting (a)\n"); - CDL_DELETE(head,&els[0]); - CDL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - printf("deleting (c)\n"); - CDL_DELETE(head,&els[2]); - CDL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - /* test DL macros */ - printf("DL macros\n"); - DL_APPEND(head,&els[0]); - DL_APPEND(head,&els[1]); - DL_APPEND(head,&els[2]); - DL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting tail c\n"); - DL_DELETE(head,&els[2]); - DL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting head a\n"); - DL_DELETE(head,&els[0]); - DL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting head b\n"); - DL_DELETE(head,&els[1]); - DL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - /* test LL macros */ - printf("LL macros\n"); - LL_APPEND(head,&els[0]); - LL_APPEND(head,&els[1]); - LL_APPEND(head,&els[2]); - LL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting tail c\n"); - LL_DELETE(head,&els[2]); - LL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting head a\n"); - LL_DELETE(head,&els[0]); - LL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting head b\n"); - LL_DELETE(head,&els[1]); - LL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test26.ans b/3rdparty/uthash-1.9.3/tests/test26.ans deleted file mode 100644 index 764b01d..0000000 --- a/3rdparty/uthash-1.9.3/tests/test26.ans +++ /dev/null @@ -1,53 +0,0 @@ -ADRIAN -ARNOLDO -CARROLL -CARY -CHONG -CLIFTON -CODY -COLTON -CORNELL -DAMON -DANNIE -DARIO -DONN -DOUG -DOUGLAS -FREDERICK -FRITZ -GERALD -GUS -HARVEY -IRVING -ISAIAH -JARVIS -JOHN -KENTON -LAURENCE -LESTER -LINCOLN -LOWELL -NELSON -NEVILLE -NIGEL -NORMAND -ODIS -OMAR -ORLANDO -RAYMUNDO -REX -ROLANDO -RON -SHANE -TONEY -TRINIDAD -WALTER -WARNER -WARREN -WES -WILLARD -WILLIAM -WINFRED -XAVIER -found WES - diff --git a/3rdparty/uthash-1.9.3/tests/test26.c b/3rdparty/uthash-1.9.3/tests/test26.c deleted file mode 100644 index 0627739..0000000 --- a/3rdparty/uthash-1.9.3/tests/test26.c +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include -#include -#include "utlist.h" - -#define BUFLEN 20 - -typedef struct el { - char bname[BUFLEN]; - struct el *next, *prev; -} el; - -int namecmp(void *_a, void *_b) { - el *a = (el*)_a; - el *b = (el*)_b; - return strcmp(a->bname,b->bname); -} - -el *head = NULL; /* important- initialize to NULL! */ - -int main(int argc, char *argv[]) { - el *name, *elt, *tmp, etmp; - - char linebuf[BUFLEN]; - FILE *file; - - if ( (file = fopen( "test11.dat", "r" )) == NULL ) { - perror("can't open: "); - exit(-1); - } - - while (fgets(linebuf,BUFLEN,file) != NULL) { - if ( (name = (el*)malloc(sizeof(el))) == NULL) exit(-1); - strncpy(name->bname,linebuf,BUFLEN); - DL_APPEND(head, name); - } - DL_SORT(head, namecmp); - DL_FOREACH(head,elt) printf("%s", elt->bname); - - memcpy(&etmp.bname, "WES\n", 5); - DL_SEARCH(head,elt,&etmp,namecmp); - if (elt) printf("found %s\n", elt->bname); - - /* now delete each element, use the safe iterator */ - DL_FOREACH_SAFE(head,elt,tmp) { - DL_DELETE(head,elt); - } - - fclose(file); - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test27.ans b/3rdparty/uthash-1.9.3/tests/test27.ans deleted file mode 100644 index 80b476c..0000000 --- a/3rdparty/uthash-1.9.3/tests/test27.ans +++ /dev/null @@ -1,28 +0,0 @@ -CDL macros -c b a -advancing head pointer -b a c -b a c b a c b a c b -b c a b c a b c a b -deleting b -a c -deleting head (a) -c -deleting new head (c) - -DL macros -c b a -deleting c -b a -deleting a -b -deleting b - -LL macros -c b a -deleting c -b a -deleting a -b -deleting b - diff --git a/3rdparty/uthash-1.9.3/tests/test27.c b/3rdparty/uthash-1.9.3/tests/test27.c deleted file mode 100644 index 1b33e8c..0000000 --- a/3rdparty/uthash-1.9.3/tests/test27.c +++ /dev/null @@ -1,112 +0,0 @@ -#include -#include "utlist.h" - -typedef struct el { - int id; - struct el *next, *prev; -} el; - -el *head = NULL; - -int main(int argc, char *argv[]) { - int i; - el els[10], *e; - for(i=0;i<10;i++) els[i].id='a'+i; - - /* test CDL macros */ - printf("CDL macros\n"); - CDL_PREPEND(head,&els[0]); - CDL_PREPEND(head,&els[1]); - CDL_PREPEND(head,&els[2]); - CDL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - /* point head to head->next */ - printf("advancing head pointer\n"); - head = head->next; - CDL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - /* follow circular loop a few times */ - for(i=0,e=head;e && i<10;i++,e=e->next) - printf("%c ", e->id); - printf("\n"); - - /* follow circular loop backwards a few times */ - for(i=0,e=head;e && i<10;i++,e=e->prev) - printf("%c ", e->id); - printf("\n"); - - printf("deleting b\n"); - CDL_DELETE(head,&els[1]); - CDL_FOREACH(head,e) printf("%c ", e->id); - printf("\n"); - printf("deleting head (a)\n"); - CDL_DELETE(head,&els[0]); - CDL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - printf("deleting new head (c)\n"); - CDL_DELETE(head,&els[2]); - CDL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - /* test DL macros */ - printf("DL macros\n"); - DL_PREPEND(head,&els[0]); - DL_PREPEND(head,&els[1]); - DL_PREPEND(head,&els[2]); - DL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting c\n"); - DL_DELETE(head,&els[2]); - DL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting a\n"); - DL_DELETE(head,&els[0]); - DL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting b\n"); - DL_DELETE(head,&els[1]); - DL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - /* test LL macros */ - printf("LL macros\n"); - LL_PREPEND(head,&els[0]); - LL_PREPEND(head,&els[1]); - LL_PREPEND(head,&els[2]); - LL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting c\n"); - LL_DELETE(head,&els[2]); - LL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting a\n"); - LL_DELETE(head,&els[0]); - LL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting b\n"); - LL_DELETE(head,&els[1]); - LL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test28.ans b/3rdparty/uthash-1.9.3/tests/test28.ans deleted file mode 100644 index eb88650..0000000 --- a/3rdparty/uthash-1.9.3/tests/test28.ans +++ /dev/null @@ -1,34 +0,0 @@ -CDL macros -d c b a -advancing head pointer -c b a d -c b a d c b a d c b -c d a b c d a b c d -deleting b -c a d -deleting (a) -c d -deleting (c) -d -deleting (d) - -DL macros -c b a d -deleting c -b a d -deleting a -b d -deleting b -d -deleting d - -LL macros -c b a d -deleting c -b a d -deleting a -b d -deleting b -d -deleting d - diff --git a/3rdparty/uthash-1.9.3/tests/test28.c b/3rdparty/uthash-1.9.3/tests/test28.c deleted file mode 100644 index 279d891..0000000 --- a/3rdparty/uthash-1.9.3/tests/test28.c +++ /dev/null @@ -1,132 +0,0 @@ -#include -#include "utlist.h" - -typedef struct el { - int id; - struct el *next, *prev; -} el; - -el *head = NULL; - -int main(int argc, char *argv[]) { - int i; - el els[10], *e; - for(i=0;i<10;i++) els[i].id='a'+i; - - /* test CDL macros */ - printf("CDL macros\n"); - CDL_PREPEND(head,&els[0]); - CDL_PREPEND(head,&els[1]); - CDL_PREPEND(head,&els[2]); - CDL_PREPEND(head,&els[3]); - CDL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - /* point head to head->next */ - printf("advancing head pointer\n"); - head = head->next; - CDL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - /* follow circular loop a few times */ - for(i=0,e=head;e && i<10;i++,e=e->next) - printf("%c ", e->id); - printf("\n"); - - /* follow circular loop backwards a few times */ - for(i=0,e=head;e && i<10;i++,e=e->prev) - printf("%c ", e->id); - printf("\n"); - - printf("deleting b\n"); - CDL_DELETE(head,&els[1]); - CDL_FOREACH(head,e) printf("%c ", e->id); - printf("\n"); - printf("deleting (a)\n"); - CDL_DELETE(head,&els[0]); - CDL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - printf("deleting (c)\n"); - CDL_DELETE(head,&els[2]); - CDL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - printf("deleting (d)\n"); - CDL_DELETE(head,&els[3]); - CDL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - /* test DL macros */ - printf("DL macros\n"); - DL_PREPEND(head,&els[0]); - DL_PREPEND(head,&els[1]); - DL_PREPEND(head,&els[2]); - DL_APPEND(head,&els[3]); - DL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting c\n"); - DL_DELETE(head,&els[2]); - DL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting a\n"); - DL_DELETE(head,&els[0]); - DL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting b\n"); - DL_DELETE(head,&els[1]); - DL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting d\n"); - DL_DELETE(head,&els[3]); - DL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - /* test LL macros */ - printf("LL macros\n"); - LL_PREPEND(head,&els[0]); - LL_PREPEND(head,&els[1]); - LL_PREPEND(head,&els[2]); - LL_APPEND(head,&els[3]); - LL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting c\n"); - LL_DELETE(head,&els[2]); - LL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting a\n"); - LL_DELETE(head,&els[0]); - LL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting b\n"); - LL_DELETE(head,&els[1]); - LL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - printf("deleting d\n"); - LL_DELETE(head,&els[3]); - LL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test29.ans b/3rdparty/uthash-1.9.3/tests/test29.ans deleted file mode 100644 index 6467b60..0000000 --- a/3rdparty/uthash-1.9.3/tests/test29.ans +++ /dev/null @@ -1,103 +0,0 @@ -ADRIAN -ARNOLDO -CARROLL -CARY -CHONG -CLIFTON -CODY -COLTON -CORNELL -DAMON -DANNIE -DARIO -DONN -DOUG -DOUGLAS -FREDERICK -FRITZ -GERALD -GUS -HARVEY -IRVING -ISAIAH -JARVIS -JOHN -KENTON -LAURENCE -LESTER -LINCOLN -LOWELL -NELSON -NEVILLE -NIGEL -NORMAND -ODIS -OMAR -ORLANDO -RAYMUNDO -REX -ROLANDO -RON -SHANE -TONEY -TRINIDAD -WALTER -WARNER -WARREN -WES -WILLARD -WILLIAM -WINFRED -XAVIER -deleting head ADRIAN -head->prev: XAVIER -ARNOLDO -CARROLL -CARY -CHONG -CLIFTON -CODY -COLTON -CORNELL -DAMON -DANNIE -DARIO -DONN -DOUG -DOUGLAS -FREDERICK -FRITZ -GERALD -GUS -HARVEY -IRVING -ISAIAH -JARVIS -JOHN -KENTON -LAURENCE -LESTER -LINCOLN -LOWELL -NELSON -NEVILLE -NIGEL -NORMAND -ODIS -OMAR -ORLANDO -RAYMUNDO -REX -ROLANDO -RON -SHANE -TONEY -TRINIDAD -WALTER -WARNER -WARREN -WES -WILLARD -WILLIAM -WINFRED -XAVIER diff --git a/3rdparty/uthash-1.9.3/tests/test29.c b/3rdparty/uthash-1.9.3/tests/test29.c deleted file mode 100644 index 8e54a02..0000000 --- a/3rdparty/uthash-1.9.3/tests/test29.c +++ /dev/null @@ -1,48 +0,0 @@ -#include -#include -#include -#include "utlist.h" - -#define BUFLEN 20 - -typedef struct el { - char bname[BUFLEN]; - struct el *next, *prev; -} el; - -int namecmp(void *_a, void *_b) { - el *a = (el*)_a; - el *b = (el*)_b; - return strcmp(a->bname,b->bname); -} - -el *head = NULL; - -int main(int argc, char *argv[]) { - el *name, *tmp; - - char linebuf[BUFLEN]; - FILE *file; - - if ( (file = fopen( "test11.dat", "r" )) == NULL ) { - perror("can't open: "); - exit(-1); - } - - while (fgets(linebuf,BUFLEN,file) != NULL) { - if ( (name = (el*)malloc(sizeof(el))) == NULL) exit(-1); - strncpy(name->bname,linebuf,BUFLEN); - DL_APPEND(head, name); - } - DL_SORT(head, namecmp); - DL_FOREACH(head,tmp) printf("%s", tmp->bname); - - /* now delete the list head */ - printf("deleting head %shead->prev: %s", head->bname, head->prev->bname); - DL_DELETE(head,head); - DL_FOREACH(head,tmp) printf("%s", tmp->bname); - - fclose(file); - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test3.ans b/3rdparty/uthash-1.9.3/tests/test3.ans deleted file mode 100644 index 56a52a3..0000000 --- a/3rdparty/uthash-1.9.3/tests/test3.ans +++ /dev/null @@ -1,5 +0,0 @@ -user 1, cookie 1 -user 3, cookie 9 -user 5, cookie 25 -user 7, cookie 49 -user 9, cookie 81 diff --git a/3rdparty/uthash-1.9.3/tests/test3.c b/3rdparty/uthash-1.9.3/tests/test3.c deleted file mode 100644 index 3f3e479..0000000 --- a/3rdparty/uthash-1.9.3/tests/test3.c +++ /dev/null @@ -1,38 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; -} example_user_t; - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *tmp, *users=NULL; - - /* create elements */ - for(i=0;i<10;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) - exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - } - - /* delete each even ID */ - for(i=0;i<10;i+=2) { - HASH_FIND_INT(users,&i,tmp); - if (tmp) { - HASH_DEL(users,tmp); - free(tmp); - } else printf("user id %d not found\n", i); - } - - /* show the hash */ - for(user=users; user != NULL; user=(example_user_t*)(user->hh.next)) { - printf("user %d, cookie %d\n", user->id, user->cookie); - } - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test30.ans b/3rdparty/uthash-1.9.3/tests/test30.ans deleted file mode 100644 index 2b72e98..0000000 --- a/3rdparty/uthash-1.9.3/tests/test30.ans +++ /dev/null @@ -1,51 +0,0 @@ -ADRIAN -ARNOLDO -CARROLL -CARY -CHONG -CLIFTON -CODY -COLTON -CORNELL -DAMON -DANNIE -DARIO -DONN -DOUG -DOUGLAS -FREDERICK -FRITZ -GERALD -GUS -HARVEY -IRVING -ISAIAH -JARVIS -JOHN -KENTON -LAURENCE -LESTER -LINCOLN -LOWELL -NELSON -NEVILLE -NIGEL -NORMAND -ODIS -OMAR -ORLANDO -RAYMUNDO -REX -ROLANDO -RON -SHANE -TONEY -TRINIDAD -WALTER -WARNER -WARREN -WES -WILLARD -WILLIAM -WINFRED -XAVIER diff --git a/3rdparty/uthash-1.9.3/tests/test30.c b/3rdparty/uthash-1.9.3/tests/test30.c deleted file mode 100644 index 711c7d9..0000000 --- a/3rdparty/uthash-1.9.3/tests/test30.c +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include -#include -#include "utlist.h" - -#define BUFLEN 20 - -typedef struct el { - char bname[BUFLEN]; - struct el *next, *prev; -} el; - -int namecmp(void *_a, void *_b) { - el *a = (el*)_a; - el *b = (el*)_b; - return strcmp(a->bname,b->bname); -} - -el *head = NULL; - -int main(int argc, char *argv[]) { - el *name, *tmp; - - char linebuf[BUFLEN]; - FILE *file; - - if ( (file = fopen( "test11.dat", "r" )) == NULL ) { - perror("can't open: "); - exit(-1); - } - - while (fgets(linebuf,BUFLEN,file) != NULL) { - if ( (name = (el*)malloc(sizeof(el))) == NULL) exit(-1); - strncpy(name->bname,linebuf,BUFLEN); - CDL_PREPEND(head, name); - } - CDL_SORT(head, namecmp); - CDL_FOREACH(head,tmp) printf("%s", tmp->bname); - - fclose(file); - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test31.ans b/3rdparty/uthash-1.9.3/tests/test31.ans deleted file mode 100644 index 2b72e98..0000000 --- a/3rdparty/uthash-1.9.3/tests/test31.ans +++ /dev/null @@ -1,51 +0,0 @@ -ADRIAN -ARNOLDO -CARROLL -CARY -CHONG -CLIFTON -CODY -COLTON -CORNELL -DAMON -DANNIE -DARIO -DONN -DOUG -DOUGLAS -FREDERICK -FRITZ -GERALD -GUS -HARVEY -IRVING -ISAIAH -JARVIS -JOHN -KENTON -LAURENCE -LESTER -LINCOLN -LOWELL -NELSON -NEVILLE -NIGEL -NORMAND -ODIS -OMAR -ORLANDO -RAYMUNDO -REX -ROLANDO -RON -SHANE -TONEY -TRINIDAD -WALTER -WARNER -WARREN -WES -WILLARD -WILLIAM -WINFRED -XAVIER diff --git a/3rdparty/uthash-1.9.3/tests/test31.c b/3rdparty/uthash-1.9.3/tests/test31.c deleted file mode 100644 index 711c7d9..0000000 --- a/3rdparty/uthash-1.9.3/tests/test31.c +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include -#include -#include "utlist.h" - -#define BUFLEN 20 - -typedef struct el { - char bname[BUFLEN]; - struct el *next, *prev; -} el; - -int namecmp(void *_a, void *_b) { - el *a = (el*)_a; - el *b = (el*)_b; - return strcmp(a->bname,b->bname); -} - -el *head = NULL; - -int main(int argc, char *argv[]) { - el *name, *tmp; - - char linebuf[BUFLEN]; - FILE *file; - - if ( (file = fopen( "test11.dat", "r" )) == NULL ) { - perror("can't open: "); - exit(-1); - } - - while (fgets(linebuf,BUFLEN,file) != NULL) { - if ( (name = (el*)malloc(sizeof(el))) == NULL) exit(-1); - strncpy(name->bname,linebuf,BUFLEN); - CDL_PREPEND(head, name); - } - CDL_SORT(head, namecmp); - CDL_FOREACH(head,tmp) printf("%s", tmp->bname); - - fclose(file); - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test32.ans b/3rdparty/uthash-1.9.3/tests/test32.ans deleted file mode 100644 index 2a4d7f7..0000000 --- a/3rdparty/uthash-1.9.3/tests/test32.ans +++ /dev/null @@ -1,51 +0,0 @@ -ARNOLDO -COLTON -WES -WARNER -TONEY -NEVILLE -CHONG -KENTON -DARIO -DANNIE -ODIS -TRINIDAD -DONN -FRITZ -NORMAND -NIGEL -CORNELL -LINCOLN -RAYMUNDO -WINFRED -JARVIS -GUS -ISAIAH -XAVIER -CARY -ROLANDO -LAURENCE -CARROLL -IRVING -LOWELL -DAMON -OMAR -REX -ORLANDO -DOUG -WILLARD -CLIFTON -NELSON -CODY -ADRIAN -HARVEY -RON -LESTER -SHANE -WARREN -FREDERICK -GERALD -DOUGLAS -WALTER -WILLIAM -JOHN diff --git a/3rdparty/uthash-1.9.3/tests/test32.c b/3rdparty/uthash-1.9.3/tests/test32.c deleted file mode 100644 index fad2030..0000000 --- a/3rdparty/uthash-1.9.3/tests/test32.c +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include -#include -#include "utlist.h" - -#define BUFLEN 20 - -typedef struct el { - char bname[BUFLEN]; - struct el *next, *prev; -} el; - -int namecmp(el *a, el *b) { - return strcmp(a->bname,b->bname); -} - -el *head = NULL; - -int main(int argc, char *argv[]) { - el *name, *tmp; - - char linebuf[BUFLEN]; - FILE *file; - - if ( (file = fopen( "test11.dat", "r" )) == NULL ) { - perror("can't open: "); - exit(-1); - } - - while (fgets(linebuf,BUFLEN,file) != NULL) { - if ( (name = (el*)malloc(sizeof(el))) == NULL) exit(-1); - strncpy(name->bname,linebuf,BUFLEN); - DL_PREPEND(head, name); - } - /* DL_SORT(head, namecmp); */ - DL_FOREACH(head,tmp) printf("%s", tmp->bname); - - fclose(file); - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test33.ans b/3rdparty/uthash-1.9.3/tests/test33.ans deleted file mode 100644 index 2b72e98..0000000 --- a/3rdparty/uthash-1.9.3/tests/test33.ans +++ /dev/null @@ -1,51 +0,0 @@ -ADRIAN -ARNOLDO -CARROLL -CARY -CHONG -CLIFTON -CODY -COLTON -CORNELL -DAMON -DANNIE -DARIO -DONN -DOUG -DOUGLAS -FREDERICK -FRITZ -GERALD -GUS -HARVEY -IRVING -ISAIAH -JARVIS -JOHN -KENTON -LAURENCE -LESTER -LINCOLN -LOWELL -NELSON -NEVILLE -NIGEL -NORMAND -ODIS -OMAR -ORLANDO -RAYMUNDO -REX -ROLANDO -RON -SHANE -TONEY -TRINIDAD -WALTER -WARNER -WARREN -WES -WILLARD -WILLIAM -WINFRED -XAVIER diff --git a/3rdparty/uthash-1.9.3/tests/test33.c b/3rdparty/uthash-1.9.3/tests/test33.c deleted file mode 100644 index d946ec1..0000000 --- a/3rdparty/uthash-1.9.3/tests/test33.c +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include -#include -#include "utlist.h" - -#define BUFLEN 20 - -typedef struct el { - char bname[BUFLEN]; - struct el *next, *prev; -} el; - -int namecmp(void *_a, void *_b) { - el *a = (el*)_a; - el *b = (el*)_b; - return strcmp(a->bname,b->bname); -} - -el *head = NULL; - -int main(int argc, char *argv[]) { - el *name, *tmp; - - char linebuf[BUFLEN]; - FILE *file; - - if ( (file = fopen( "test11.dat", "r" )) == NULL ) { - perror("can't open: "); - exit(-1); - } - - while (fgets(linebuf,BUFLEN,file) != NULL) { - if ( (name = (el*)malloc(sizeof(el))) == NULL) exit(-1); - strncpy(name->bname,linebuf,BUFLEN); - LL_PREPEND(head, name); - } - LL_SORT(head, namecmp); - LL_FOREACH(head,tmp) printf("%s", tmp->bname); - - fclose(file); - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test34.ans b/3rdparty/uthash-1.9.3/tests/test34.ans deleted file mode 100644 index 2a4d7f7..0000000 --- a/3rdparty/uthash-1.9.3/tests/test34.ans +++ /dev/null @@ -1,51 +0,0 @@ -ARNOLDO -COLTON -WES -WARNER -TONEY -NEVILLE -CHONG -KENTON -DARIO -DANNIE -ODIS -TRINIDAD -DONN -FRITZ -NORMAND -NIGEL -CORNELL -LINCOLN -RAYMUNDO -WINFRED -JARVIS -GUS -ISAIAH -XAVIER -CARY -ROLANDO -LAURENCE -CARROLL -IRVING -LOWELL -DAMON -OMAR -REX -ORLANDO -DOUG -WILLARD -CLIFTON -NELSON -CODY -ADRIAN -HARVEY -RON -LESTER -SHANE -WARREN -FREDERICK -GERALD -DOUGLAS -WALTER -WILLIAM -JOHN diff --git a/3rdparty/uthash-1.9.3/tests/test34.c b/3rdparty/uthash-1.9.3/tests/test34.c deleted file mode 100644 index 653cdb8..0000000 --- a/3rdparty/uthash-1.9.3/tests/test34.c +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include -#include -#include "utlist.h" - -#define BUFLEN 20 - -typedef struct el { - char bname[BUFLEN]; - struct el *next, *prev; -} el; - -int namecmp(el *a, el *b) { - return strcmp(a->bname,b->bname); -} - -el *head = NULL; - -int main(int argc, char *argv[]) { - el *name, *tmp; - - char linebuf[BUFLEN]; - FILE *file; - - if ( (file = fopen( "test11.dat", "r" )) == NULL ) { - perror("can't open: "); - exit(-1); - } - - while (fgets(linebuf,BUFLEN,file) != NULL) { - if ( (name = (el*)malloc(sizeof(el))) == NULL) exit(-1); - strncpy(name->bname,linebuf,BUFLEN); - CDL_PREPEND(head, name); - } - /* CDL_SORT(head, namecmp); */ - CDL_FOREACH(head,tmp) printf("%s", tmp->bname); - - fclose(file); - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test35.ans b/3rdparty/uthash-1.9.3/tests/test35.ans deleted file mode 100644 index b33c808..0000000 --- a/3rdparty/uthash-1.9.3/tests/test35.ans +++ /dev/null @@ -1,30 +0,0 @@ -0: aello -1: bello -2: cello -3: dello -4: eello -5: fello -6: gello -7: hello -8: iello -9: jello -found aello -right address? yes -found bello -right address? yes -found cello -right address? yes -found dello -right address? yes -found eello -right address? yes -found fello -right address? yes -found gello -right address? yes -found hello -right address? yes -found iello -right address? yes -found jello -right address? yes diff --git a/3rdparty/uthash-1.9.3/tests/test35.c b/3rdparty/uthash-1.9.3/tests/test35.c deleted file mode 100644 index 6d41e5e..0000000 --- a/3rdparty/uthash-1.9.3/tests/test35.c +++ /dev/null @@ -1,37 +0,0 @@ -#include "uthash.h" -#include /* strcpy */ -#include /* malloc */ -#include /* printf */ - -typedef struct elt { - char *s; - UT_hash_handle hh; -} elt; - -int main(int argc,char *argv[]) { - int i; - elt *head = NULL; - elt elts[10]; - char label[6]; - for(i=0;i<10;i++) { - elts[i].s = (char*)malloc(6); - strncpy(elts[i].s, "hello",6); - elts[i].s[0] = 'a' + i; - printf("%d: %s\n", i, elts[i].s); - HASH_ADD_KEYPTR(hh, head, elts[i].s, 6, &elts[i]); - } - - /* look up each element and verify the result pointer */ - strncpy(label, "hello", 6); - for(i=0;i<10;i++) { - elt *e; - label[0] = 'a' + i; - HASH_FIND(hh,head,label,6,e); - if (e) { - printf( "found %s\n", e->s); - printf( "right address? %s\n", (e == &elts[i]) ? "yes" : "no"); - } - } - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test36.ans b/3rdparty/uthash-1.9.3/tests/test36.ans deleted file mode 100644 index 3b5283b..0000000 --- a/3rdparty/uthash-1.9.3/tests/test36.ans +++ /dev/null @@ -1,15 +0,0 @@ -user 0 -user 1 -user 2 -user 3 -user 4 -user 5 -user 6 -user 7 -user 8 -user 9 -auser 0 -auser 2 -auser 4 -auser 6 -auser 8 diff --git a/3rdparty/uthash-1.9.3/tests/test36.c b/3rdparty/uthash-1.9.3/tests/test36.c deleted file mode 100644 index d91350b..0000000 --- a/3rdparty/uthash-1.9.3/tests/test36.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - -typedef struct { - int id; - UT_hash_handle hh; - UT_hash_handle ah; -} example_user_t; - -#define EVENS(x) (((x)->id & 1) == 0) -int evens(void *userv) { - example_user_t *user = (example_user_t*)userv; - return ((user->id & 1) ? 0 : 1); -} - -int idcmp(void *_a, void *_b) { - example_user_t *a = (example_user_t*)_a; - example_user_t *b = (example_user_t*)_b; - return (a->id - b->id); -} - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *users=NULL, *ausers=NULL; - - /* create elements */ - for(i=0;i<10;i++) { - user = (example_user_t*)malloc(sizeof(example_user_t)); - user->id = i; - HASH_ADD_INT(users,id,user); - } - - for(user=users; user; user=(example_user_t*)(user->hh.next)) { - printf("user %d\n", user->id); - } - - /* now select some users into ausers */ - HASH_SELECT(ah,ausers,hh,users,evens); - HASH_SRT(ah,ausers,idcmp); - - for(user=ausers; user; user=(example_user_t*)(user->ah.next)) { - printf("auser %d\n", user->id); - } - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test37.ans b/3rdparty/uthash-1.9.3/tests/test37.ans deleted file mode 100644 index f42a945..0000000 --- a/3rdparty/uthash-1.9.3/tests/test37.ans +++ /dev/null @@ -1,20 +0,0 @@ -user 0 -user 1 -user 2 -user 3 -user 4 -user 5 -user 6 -user 7 -user 8 -user 9 -users count: 10 -auser 0 -auser 2 -auser 4 -auser 6 -auser 8 -ausers count: 5 -cleared ausers. -ausers count: 0 -users count: 10 diff --git a/3rdparty/uthash-1.9.3/tests/test37.c b/3rdparty/uthash-1.9.3/tests/test37.c deleted file mode 100644 index 7071e1c..0000000 --- a/3rdparty/uthash-1.9.3/tests/test37.c +++ /dev/null @@ -1,51 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - -typedef struct { - int id; - UT_hash_handle hh; - UT_hash_handle ah; -} example_user_t; - -#define EVENS(x) ((((example_user_t*)(x))->id & 1) == 0) - -int idcmp(void *_a, void *_b) { - example_user_t *a = (example_user_t*)_a; - example_user_t *b = (example_user_t*)_b; - return (a->id - b->id); -} - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *users=NULL, *ausers=NULL; - - /* create elements */ - for(i=0;i<10;i++) { - user = (example_user_t*)malloc(sizeof(example_user_t)); - user->id = i; - HASH_ADD_INT(users,id,user); - } - - for(user=users; user; user=(example_user_t*)(user->hh.next)) { - printf("user %d\n", user->id); - } - printf("users count: %u\n", HASH_CNT(hh,users)); - - /* now select some users into ausers */ - HASH_SELECT(ah,ausers,hh,users,EVENS); - HASH_SRT(ah,ausers,idcmp); - - for(user=ausers; user; user=(example_user_t*)(user->ah.next)) { - printf("auser %d\n", user->id); - } - printf("ausers count: %u\n", HASH_CNT(ah,ausers)); - HASH_CLEAR(ah,ausers); - printf("cleared ausers.\n"); - printf("ausers count: %u\n", HASH_CNT(ah,ausers)); - for(user=ausers; user; user=(example_user_t*)(user->ah.next)) { - printf("auser %d\n", user->id); - } - printf("users count: %u\n", HASH_CNT(hh,users)); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test38.ans b/3rdparty/uthash-1.9.3/tests/test38.ans deleted file mode 100644 index b20e04b..0000000 --- a/3rdparty/uthash-1.9.3/tests/test38.ans +++ /dev/null @@ -1 +0,0 @@ -hash count 10 diff --git a/3rdparty/uthash-1.9.3/tests/test38.c b/3rdparty/uthash-1.9.3/tests/test38.c deleted file mode 100644 index 500d160..0000000 --- a/3rdparty/uthash-1.9.3/tests/test38.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "uthash.h" -#include -#include - -struct test_t { - int a; - UT_hash_handle hh; -}; - -struct test_t *tests=NULL, *test; - -int main(void) { - int a, b; - for (b=0; b < 3; b++) { - for (a=0; a < 10; a++) { - test = NULL; - HASH_FIND(hh, tests, &a, sizeof(a), test); - if (! test) { - test = (struct test_t*)malloc(sizeof(struct test_t)); - memset(test, 0, sizeof(struct test_t)); - test->a = a; - HASH_ADD(hh, tests, a, sizeof(a), test); - } - } - } - printf("hash count %u\n", HASH_COUNT(tests)); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test39.ans b/3rdparty/uthash-1.9.3/tests/test39.ans deleted file mode 100644 index a7e7e6c..0000000 --- a/3rdparty/uthash-1.9.3/tests/test39.ans +++ /dev/null @@ -1,7 +0,0 @@ -adding key eins -adding key zwei -adding key drei -hash count is 3 -looking for key eins... found. -looking for key zwei... found. -looking for key drei... found. diff --git a/3rdparty/uthash-1.9.3/tests/test39.c b/3rdparty/uthash-1.9.3/tests/test39.c deleted file mode 100644 index b0a5310..0000000 --- a/3rdparty/uthash-1.9.3/tests/test39.c +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include -#include "uthash.h" - -typedef struct { - const char *name; - UT_hash_handle hh; -} ns_t; - -ns_t *head = NULL; - -int main() { - const char *keys[] = {"eins", "zwei", "drei"}; - unsigned i; - ns_t *nsp; - - for(i=0; i < sizeof(keys)/sizeof(keys[0]); i++) { - printf("adding key %s\n", keys[i]); - nsp = (ns_t*)malloc(sizeof(ns_t)); - nsp->name = keys[i]; - HASH_ADD_KEYPTR(hh,head,nsp->name,strlen(nsp->name),nsp); - } - printf("hash count is %u\n", HASH_COUNT(head)); - - for(i=0; i < sizeof(keys)/sizeof(keys[0]); i++) { - printf("looking for key %s... ", keys[i]); - HASH_FIND(hh,head,keys[i],strlen(keys[i]),nsp); - printf("%s.\n", (nsp?"found":"not found")); - } - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test4.ans b/3rdparty/uthash-1.9.3/tests/test4.ans deleted file mode 100644 index 19b148f..0000000 --- a/3rdparty/uthash-1.9.3/tests/test4.ans +++ /dev/null @@ -1,10 +0,0 @@ -cookie 0, user 0 -cookie 1, user 1 -cookie 4, user 2 -cookie 9, user 3 -cookie 16, user 4 -cookie 25, user 5 -cookie 36, user 6 -cookie 49, user 7 -cookie 64, user 8 -cookie 81, user 9 diff --git a/3rdparty/uthash-1.9.3/tests/test4.c b/3rdparty/uthash-1.9.3/tests/test4.c deleted file mode 100644 index 945c9ae..0000000 --- a/3rdparty/uthash-1.9.3/tests/test4.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; - UT_hash_handle alth; -} example_user_t; - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *users=NULL, *altusers=NULL; - - /* create elements */ - for(i=0;i<10;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - HASH_ADD(alth,altusers,cookie,sizeof(int),user); - } - - for(user=altusers; user != NULL; user=(example_user_t*)(user->alth.next)) { - printf("cookie %d, user %d\n", user->cookie, user->id); - } - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test40.ans b/3rdparty/uthash-1.9.3/tests/test40.ans deleted file mode 100644 index ad69a94..0000000 --- a/3rdparty/uthash-1.9.3/tests/test40.ans +++ /dev/null @@ -1 +0,0 @@ -betty's id is 2 diff --git a/3rdparty/uthash-1.9.3/tests/test40.c b/3rdparty/uthash-1.9.3/tests/test40.c deleted file mode 100644 index fd68f16..0000000 --- a/3rdparty/uthash-1.9.3/tests/test40.c +++ /dev/null @@ -1,28 +0,0 @@ -#include /* strcpy */ -#include /* malloc */ -#include /* printf */ -#include "uthash.h" - -struct my_struct { - const char *name; /* key */ - int id; - UT_hash_handle hh; /* makes this structure hashable */ -}; - - -int main(int argc, char *argv[]) { - const char **n, *names[] = { "joe", "bob", "betty", NULL }; - struct my_struct *s, *users = NULL; - int i=0; - - for (n = names; *n != NULL; n++) { - s = (struct my_struct*)malloc(sizeof(struct my_struct)); - s->name = *n; - s->id = i++; - HASH_ADD_KEYPTR( hh, users, s->name, strlen(s->name), s ); - } - - HASH_FIND_STR( users, "betty", s); - if (s) printf("betty's id is %d\n", s->id); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test41.ans b/3rdparty/uthash-1.9.3/tests/test41.ans deleted file mode 100644 index f19e34b..0000000 --- a/3rdparty/uthash-1.9.3/tests/test41.ans +++ /dev/null @@ -1,6 +0,0 @@ -CDL macros -c b a deleting c deleting b deleting a -DL macros -a b c deleting a deleting b deleting c -LL macros -a b c deleting a deleting b deleting c diff --git a/3rdparty/uthash-1.9.3/tests/test41.c b/3rdparty/uthash-1.9.3/tests/test41.c deleted file mode 100644 index 1e35443..0000000 --- a/3rdparty/uthash-1.9.3/tests/test41.c +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include "utlist.h" - -typedef struct el { - int id; - struct el *next, *prev; -} el; - -el *head = NULL; - -int main(int argc, char *argv[]) { - int i; - el els[10], *e, *tmp, *tmp2; - for(i=0;i<10;i++) els[i].id='a'+i; - - /* test CDL macros */ - printf("CDL macros\n"); - CDL_PREPEND(head,&els[0]); - CDL_PREPEND(head,&els[1]); - CDL_PREPEND(head,&els[2]); - CDL_FOREACH(head,e) printf("%c ", e->id); - - /* point head to head->next */ - CDL_FOREACH_SAFE(head,e,tmp,tmp2) { - printf("deleting %c ", e->id); - CDL_DELETE(head,e); - } - printf("\n"); - if (head) printf("non-null head\n"); - - /* test DL macros */ - printf("DL macros\n"); - DL_APPEND(head,&els[0]); - DL_APPEND(head,&els[1]); - DL_APPEND(head,&els[2]); - DL_FOREACH(head,e) printf("%c ", e->id); - DL_FOREACH_SAFE(head,e,tmp) { - printf("deleting %c ", e->id); - DL_DELETE(head,e); - } - printf("\n"); - if (head) printf("non-null head\n"); - - /* test LL macros */ - printf("LL macros\n"); - LL_APPEND(head,&els[0]); - LL_APPEND(head,&els[1]); - LL_APPEND(head,&els[2]); - LL_FOREACH(head,e) printf("%c ", e->id); - LL_FOREACH_SAFE(head,e,tmp) { - printf("deleting %c ", e->id); - LL_DELETE(head,e); - } - printf("\n"); - if (head) printf("non-null head\n"); - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test42.ans b/3rdparty/uthash-1.9.3/tests/test42.ans deleted file mode 100644 index 581660e..0000000 --- a/3rdparty/uthash-1.9.3/tests/test42.ans +++ /dev/null @@ -1,14 +0,0 @@ -LL macros -a b c -search scalar found b -search found a - -DL macros -a b c -search scalar found b -search found a - -CDL macros -c b a -search scalar found b -search found a diff --git a/3rdparty/uthash-1.9.3/tests/test42.c b/3rdparty/uthash-1.9.3/tests/test42.c deleted file mode 100644 index b20c579..0000000 --- a/3rdparty/uthash-1.9.3/tests/test42.c +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include "utlist.h" - -typedef struct el { - int id; - struct el *next, *prev; -} el; - -el *head = NULL; - -int eltcmp(el *a, el *b) {return a->id - b->id;} - -int main(int argc, char *argv[]) { - int i; - el els[10], *e, *tmp, *tmp2; - for(i=0;i<10;i++) els[i].id='a'+i; - - /* test LL macros */ - printf("LL macros\n"); - LL_APPEND(head,&els[0]); - LL_APPEND(head,&els[1]); - LL_APPEND(head,&els[2]); - LL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - LL_SEARCH_SCALAR(head, e, id, 'b'); - if (e) printf("search scalar found b\n"); - LL_SEARCH(head, e, &els[0], eltcmp); - if (e) printf("search found %c\n",e->id); - LL_FOREACH_SAFE(head,e,tmp) LL_DELETE(head,e); - - printf("\n"); - - /* test DL macros */ - printf("DL macros\n"); - DL_APPEND(head,&els[0]); - DL_APPEND(head,&els[1]); - DL_APPEND(head,&els[2]); - DL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - DL_SEARCH_SCALAR(head, e, id, 'b'); - if (e) printf("search scalar found b\n"); - DL_SEARCH(head, e, &els[0], eltcmp); - if (e) printf("search found %c\n",e->id); - DL_FOREACH_SAFE(head,e,tmp) DL_DELETE(head,e); - printf("\n"); - - /* test CDL macros */ - printf("CDL macros\n"); - CDL_PREPEND(head,&els[0]); - CDL_PREPEND(head,&els[1]); - CDL_PREPEND(head,&els[2]); - CDL_FOREACH(head,e) - printf("%c ", e->id); - printf("\n"); - CDL_SEARCH_SCALAR(head, e, id, 'b'); - if (e) printf("search scalar found b\n"); - CDL_SEARCH(head, e, &els[0], eltcmp); - if (e) printf("search found %c\n",e->id); - CDL_FOREACH_SAFE(head,e,tmp,tmp2) CDL_DELETE(head,e); - - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test43.ans b/3rdparty/uthash-1.9.3/tests/test43.ans deleted file mode 100644 index d09e9bd..0000000 --- a/3rdparty/uthash-1.9.3/tests/test43.ans +++ /dev/null @@ -1,88 +0,0 @@ -length is 0 -push -length is 1 -back is 1 2 -pop -length is 0 -push -push -length is 2 -1 2 -3 4 -erase [0] -length is 1 -3 4 -push -3 4 -1 2 -clear -length is 0 -extend -length is 1 -ip points to [0] ? yes -push -0 0 -1 2 -erase [1] -length is 1 -0 0 -push -0 0 -3 4 -back is 3 4 -copy -cpy length is 2 -cpy 0 0 -cpy 3 4 -insert cpy[0] -cpy length is 3 -cpy 5 6 -cpy 0 0 -cpy 3 4 -erase cpy [0] [1] -cpy length is 1 -cpy 3 4 -inserta at cpy[1] -cpy length is 3 -cpy 3 4 -cpy 0 0 -cpy 3 4 -free cpy -length is 2 -resize to 30 -length is 30 -0 0 -3 4 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -0 0 -resize to 1 -length is 1 -resize to 0 -length is 0 -free diff --git a/3rdparty/uthash-1.9.3/tests/test43.c b/3rdparty/uthash-1.9.3/tests/test43.c deleted file mode 100644 index fbd40c8..0000000 --- a/3rdparty/uthash-1.9.3/tests/test43.c +++ /dev/null @@ -1,76 +0,0 @@ -#include -#include "utarray.h" - -typedef struct { - int a; - int b; -} intpair_t; - -UT_icd pairicd = { sizeof(intpair_t),NULL,NULL,NULL}; - -int main() { - UT_array *pairs, *pairs_cpy; - intpair_t it, *ip; - size_t zero=0; - utarray_new(pairs, &pairicd); - printf("length is %d\n", utarray_len(pairs)); - it.a = 1; it.b=2; utarray_push_back(pairs, &it); printf("push\n"); - printf("length is %d\n", utarray_len(pairs)); - ip = (intpair_t*)utarray_back(pairs); - printf("back is %d %d\n", ip->a, ip->b); - utarray_pop_back(pairs); printf("pop\n"); - printf("length is %d\n", utarray_len(pairs)); - it.a = 1; it.b=2; utarray_push_back(pairs, &it); printf("push\n"); - it.a = 3; it.b=4; utarray_push_back(pairs, &it); printf("push\n"); - printf("length is %d\n", utarray_len(pairs)); - ip=NULL; - while( (ip=(intpair_t*)utarray_next(pairs,ip))) printf("%d %d\n", ip->a, ip->b); - utarray_erase(pairs,0,1); printf("erase [0]\n"); - printf("length is %d\n", utarray_len(pairs)); - while( (ip=(intpair_t*)utarray_next(pairs,ip))) printf("%d %d\n", ip->a, ip->b); - it.a = 1; it.b=2; utarray_push_back(pairs, &it); printf("push\n"); - while( (ip=(intpair_t*)utarray_next(pairs,ip))) printf("%d %d\n", ip->a, ip->b); - utarray_clear(pairs); printf("clear\n"); - printf("length is %d\n", utarray_len(pairs)); - utarray_extend_back(pairs); printf("extend\n"); - ip = (intpair_t*)utarray_back(pairs); - printf("length is %d\n", utarray_len(pairs)); - printf("ip points to [0] ? %s\n", (ip==(intpair_t*)utarray_front(pairs)) ? "yes" : "no"); - it.a = 1; it.b=2; utarray_push_back(pairs, &it); printf("push\n"); - ip=NULL; - while( (ip=(intpair_t*)utarray_next(pairs,ip))) printf("%d %d\n", ip->a, ip->b); - utarray_erase(pairs,1,1); printf("erase [1]\n"); - printf("length is %d\n", utarray_len(pairs)); - while( (ip=(intpair_t*)utarray_next(pairs,ip))) printf("%d %d\n", ip->a, ip->b); - it.a = 3; it.b=4; utarray_push_back(pairs, &it); printf("push\n"); - for(ip=(intpair_t*)utarray_front(pairs);ip;ip=(intpair_t*)utarray_next(pairs,ip)) { - printf("%d %d\n", ip->a,ip->b); - } - ip = (intpair_t*)utarray_back(pairs); - printf("back is %d %d\n", ip->a, ip->b); - utarray_new(pairs_cpy, &pairicd); - utarray_concat(pairs_cpy, pairs); printf("copy\n"); - printf("cpy length is %d\n", utarray_len(pairs_cpy)); - ip=NULL; - while( (ip=(intpair_t*)utarray_next(pairs_cpy,ip))) printf("cpy %d %d\n", ip->a, ip->b); - it.a=5; it.b=6; utarray_insert(pairs_cpy, &it, 0); printf("insert cpy[0]\n"); - printf("cpy length is %d\n", utarray_len(pairs_cpy)); - while( (ip=(intpair_t*)utarray_next(pairs_cpy,ip))) printf("cpy %d %d\n", ip->a, ip->b); - utarray_erase(pairs_cpy,0,2); printf("erase cpy [0] [1]\n"); - printf("cpy length is %d\n", utarray_len(pairs_cpy)); - while( (ip=(intpair_t*)utarray_next(pairs_cpy,ip))) printf("cpy %d %d\n", ip->a, ip->b); - utarray_inserta(pairs_cpy, pairs, 1); printf("inserta at cpy[1]\n"); - printf("cpy length is %d\n", utarray_len(pairs_cpy)); - while( (ip=(intpair_t*)utarray_next(pairs_cpy,ip))) printf("cpy %d %d\n", ip->a, ip->b); - utarray_free(pairs_cpy); printf("free cpy\n"); - printf("length is %d\n", utarray_len(pairs)); - utarray_resize(pairs, 30); printf("resize to 30\n"); - printf("length is %d\n", utarray_len(pairs)); - while( (ip=(intpair_t*)utarray_next(pairs,ip))) printf("%d %d\n", ip->a, ip->b); - utarray_resize(pairs, 1); printf("resize to 1\n"); - printf("length is %d\n", utarray_len(pairs)); - utarray_resize(pairs, zero); printf("resize to 0\n"); - printf("length is %d\n", utarray_len(pairs)); - utarray_free(pairs); printf("free\n"); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test44.ans b/3rdparty/uthash-1.9.3/tests/test44.ans deleted file mode 100644 index f771df8..0000000 --- a/3rdparty/uthash-1.9.3/tests/test44.ans +++ /dev/null @@ -1,9 +0,0 @@ -0 1 2 3 4 5 6 7 8 9 -9 8 7 6 5 4 3 2 1 0 -9 8 7 3 2 1 0 -9 3 2 1 0 -3 2 1 0 -3 2 1 -3 2 1 0 0 -3 2 1 - diff --git a/3rdparty/uthash-1.9.3/tests/test44.c b/3rdparty/uthash-1.9.3/tests/test44.c deleted file mode 100644 index 6c419c2..0000000 --- a/3rdparty/uthash-1.9.3/tests/test44.c +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include "utarray.h" - -int reverse(const void *a,const void*b) { - int _a = *(int*)a; - int _b = *(int*)b; - return _b - _a; -} - -int main() { - UT_array *a; - int i, *p; - utarray_new(a, &ut_int_icd); - for(i=0;i<10;i++) utarray_push_back(a,&i); - for(p=(int*)utarray_front(a); p; p=(int*)utarray_next(a,p)) printf("%d ",*p); - printf("\n"); - utarray_sort(a,reverse); - while ( (p=(int*)utarray_next(a,p))) printf("%d ", *p); - printf("\n"); - utarray_erase(a,3,3); - while ( (p=(int*)utarray_next(a,p))) printf("%d ", *p); - printf("\n"); - utarray_erase(a,1,2); - while ( (p=(int*)utarray_next(a,p))) printf("%d ", *p); - printf("\n"); - utarray_erase(a,0,1); - while ( (p=(int*)utarray_next(a,p))) printf("%d ", *p); - printf("\n"); - utarray_erase(a,3,1); - while ( (p=(int*)utarray_next(a,p))) printf("%d ", *p); - printf("\n"); - utarray_resize(a,5); - while ( (p=(int*)utarray_next(a,p))) printf("%d ", *p); - printf("\n"); - utarray_resize(a,3); - while ( (p=(int*)utarray_next(a,p))) printf("%d ", *p); - printf("\n"); - utarray_erase(a,0,3); - while ( (p=(int*)utarray_next(a,p))) printf("%d ", *p); - printf("\n"); - utarray_free(a); - return 0; -} - diff --git a/3rdparty/uthash-1.9.3/tests/test45.ans b/3rdparty/uthash-1.9.3/tests/test45.ans deleted file mode 100644 index 7e744bc..0000000 --- a/3rdparty/uthash-1.9.3/tests/test45.ans +++ /dev/null @@ -1,3 +0,0 @@ -1 2 3 4 5 6 7 8 -1 2 3 100 4 5 6 7 8 -1 2 3 100 4 5 6 7 8 1000 diff --git a/3rdparty/uthash-1.9.3/tests/test45.c b/3rdparty/uthash-1.9.3/tests/test45.c deleted file mode 100644 index dca7d9b..0000000 --- a/3rdparty/uthash-1.9.3/tests/test45.c +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include "utarray.h" - -int main() { - UT_array *a; - int i, *p=NULL; - utarray_new(a, &ut_int_icd); - for(i=0;i<10;i++) utarray_push_back(a,&i); - utarray_pop_back(a); - utarray_erase(a,0,1); - while ( (p=(int*)utarray_next(a,p))) printf("%d ",*p); printf("\n"); - i = 100; - utarray_insert(a,&i,3); - while ( (p=(int*)utarray_next(a,p))) printf("%d ",*p); printf("\n"); - utarray_extend_back(a); - p = (int*)utarray_back(a); - *p = 1000; - p = NULL; - while ( (p=(int*)utarray_next(a,p))) printf("%d ",*p); printf("\n"); - utarray_clear(a); - utarray_free(a); - return 0; -} - diff --git a/3rdparty/uthash-1.9.3/tests/test46.ans b/3rdparty/uthash-1.9.3/tests/test46.ans deleted file mode 100644 index 0eeb830..0000000 --- a/3rdparty/uthash-1.9.3/tests/test46.ans +++ /dev/null @@ -1,7 +0,0 @@ -hello world -begin hello world -alt begin hello world oth -hello world oth -hello world -hello world begin hello world -begin hello world diff --git a/3rdparty/uthash-1.9.3/tests/test46.c b/3rdparty/uthash-1.9.3/tests/test46.c deleted file mode 100644 index ff25b99..0000000 --- a/3rdparty/uthash-1.9.3/tests/test46.c +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include "utarray.h" - -int main() { - UT_array *strs,*strs2; - char *s, **p=NULL; - utarray_new(strs, &ut_str_icd); - s="hello"; utarray_push_back(strs, &s); - s="world"; utarray_push_back(strs, &s); - while ( (p=(char**)utarray_next(strs,p))) printf("%s ",*p); printf("\n"); - s="begin"; utarray_insert(strs,&s,0); - while ( (p=(char**)utarray_next(strs,p))) printf("%s ",*p); printf("\n"); - utarray_new(strs2, &ut_str_icd); - s="alt"; utarray_push_back(strs2, &s); - s="oth"; utarray_push_back(strs2, &s); - utarray_inserta(strs2, strs, 1); - while ( (p=(char**)utarray_next(strs2,p))) printf("%s ",*p); printf("\n"); - utarray_erase(strs2,0,2); - while ( (p=(char**)utarray_next(strs2,p))) printf("%s ",*p); printf("\n"); - utarray_pop_back(strs2); - while ( (p=(char**)utarray_next(strs2,p))) printf("%s ",*p); printf("\n"); - utarray_concat(strs2, strs); - while ( (p=(char**)utarray_next(strs2,p))) printf("%s ",*p); printf("\n"); - utarray_clear(strs2); - utarray_concat(strs2, strs); - while ( (p=(char**)utarray_next(strs2,p))) printf("%s ",*p); printf("\n"); - utarray_clear(strs2); - utarray_free(strs2); - utarray_free(strs); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test47.ans b/3rdparty/uthash-1.9.3/tests/test47.ans deleted file mode 100644 index 546e064..0000000 --- a/3rdparty/uthash-1.9.3/tests/test47.ans +++ /dev/null @@ -1,8 +0,0 @@ -hello world -hello world text - second -hello world text second -cleared, length t now: 0 -length s now: 23 -one 1 two 2 three (3) -length t now: 21 diff --git a/3rdparty/uthash-1.9.3/tests/test47.c b/3rdparty/uthash-1.9.3/tests/test47.c deleted file mode 100644 index 1434d5a..0000000 --- a/3rdparty/uthash-1.9.3/tests/test47.c +++ /dev/null @@ -1,28 +0,0 @@ -#include /* printf */ -#include "utstring.h" - -int main() { - UT_string *s,*t; - char a[] = " text"; - utstring_new(s); - utstring_new(t); - - utstring_printf(s,"hello %s", "world"); - printf("%s\n", utstring_body(s)); - utstring_bincpy(s,a,sizeof(a)-1); - printf("%s\n", utstring_body(s)); - utstring_printf(t," second"); - printf("%s\n", utstring_body(t)); - utstring_concat(s,t); - printf("%s\n", utstring_body(s)); - utstring_clear(t); - printf("cleared, length t now: %d\n", utstring_len(t)); - printf("length s now: %d\n", utstring_len(s)); - utstring_printf(t,"one %d two %u three %s", 1, 2, "(3)"); - printf("%s\n", utstring_body(t)); - printf("length t now: %d\n", utstring_len(t)); - - - utstring_free(s); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test48.ans b/3rdparty/uthash-1.9.3/tests/test48.ans deleted file mode 100644 index 8b1acc1..0000000 --- a/3rdparty/uthash-1.9.3/tests/test48.ans +++ /dev/null @@ -1,10 +0,0 @@ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 diff --git a/3rdparty/uthash-1.9.3/tests/test48.c b/3rdparty/uthash-1.9.3/tests/test48.c deleted file mode 100644 index dd0fa75..0000000 --- a/3rdparty/uthash-1.9.3/tests/test48.c +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include "utarray.h" - -int main() { - UT_array *nums; - int i, *p; - - utarray_new(nums,&ut_int_icd); - for(i=0; i < 10; i++) utarray_push_back(nums,&i); - - for(p=(int*)utarray_front(nums); - p!=NULL; - p=(int*)utarray_next(nums,p)) { - printf("%d\n",*p); - } - - utarray_free(nums); - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test49.ans b/3rdparty/uthash-1.9.3/tests/test49.ans deleted file mode 100644 index 94954ab..0000000 --- a/3rdparty/uthash-1.9.3/tests/test49.ans +++ /dev/null @@ -1,2 +0,0 @@ -hello -world diff --git a/3rdparty/uthash-1.9.3/tests/test49.c b/3rdparty/uthash-1.9.3/tests/test49.c deleted file mode 100644 index 00afb7a..0000000 --- a/3rdparty/uthash-1.9.3/tests/test49.c +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include "utarray.h" - -int main() { - UT_array *strs; - char *s, **p; - - utarray_new(strs,&ut_str_icd); - - s = "hello"; utarray_push_back(strs, &s); - s = "world"; utarray_push_back(strs, &s); - p = NULL; - while ( (p=(char**)utarray_next(strs,p))) { - printf("%s\n",*p); - } - - utarray_free(strs); - - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test5.ans b/3rdparty/uthash-1.9.3/tests/test5.ans deleted file mode 100644 index 2ece88f..0000000 --- a/3rdparty/uthash-1.9.3/tests/test5.ans +++ /dev/null @@ -1,5 +0,0 @@ -cookie 0 found, user id 0 -cookie 4 found, user id 2 -cookie 16 found, user id 4 -cookie 36 found, user id 6 -cookie 64 found, user id 8 diff --git a/3rdparty/uthash-1.9.3/tests/test5.c b/3rdparty/uthash-1.9.3/tests/test5.c deleted file mode 100644 index 7cfd278..0000000 --- a/3rdparty/uthash-1.9.3/tests/test5.c +++ /dev/null @@ -1,33 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; - UT_hash_handle alth; -} example_user_t; - -int main(int argc,char *argv[]) { - int i,j; - example_user_t *user, *tmp, *users=NULL, *altusers=NULL; - - /* create elements */ - for(i=0;i<10;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - HASH_ADD(alth,altusers,cookie,sizeof(int),user); - } - - /* find cookie corresponding to each even ID */ - for(i=0;i<10;i+=2) { - j=i*i; - HASH_FIND(alth,altusers,&j,sizeof(int),tmp); - if (tmp) printf("cookie %d found, user id %d\n", tmp->cookie, tmp->id); - else printf("cookie %d not found\n", j); - } - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test50.ans b/3rdparty/uthash-1.9.3/tests/test50.ans deleted file mode 100644 index 1191247..0000000 --- a/3rdparty/uthash-1.9.3/tests/test50.ans +++ /dev/null @@ -1,2 +0,0 @@ -1 -2 diff --git a/3rdparty/uthash-1.9.3/tests/test50.c b/3rdparty/uthash-1.9.3/tests/test50.c deleted file mode 100644 index 428116a..0000000 --- a/3rdparty/uthash-1.9.3/tests/test50.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include "utarray.h" - -int main() { - UT_array *nums; - UT_icd long_icd = {sizeof(long), NULL, NULL, NULL }; - long l, *p; - utarray_new(nums, &long_icd); - - l=1; utarray_push_back(nums, &l); - l=2; utarray_push_back(nums, &l); - - p=NULL; - while( (p=(long*)utarray_next(nums,p))) printf("%ld\n", *p); - - utarray_free(nums); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test51.ans b/3rdparty/uthash-1.9.3/tests/test51.ans deleted file mode 100644 index 3caf269..0000000 --- a/3rdparty/uthash-1.9.3/tests/test51.ans +++ /dev/null @@ -1,2 +0,0 @@ -1 2 -10 20 diff --git a/3rdparty/uthash-1.9.3/tests/test51.c b/3rdparty/uthash-1.9.3/tests/test51.c deleted file mode 100644 index 16ba88b..0000000 --- a/3rdparty/uthash-1.9.3/tests/test51.c +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include "utarray.h" - -typedef struct { - int a; - int b; -} intpair_t; - -int main() { - - UT_array *pairs; - UT_icd intpair_icd = {sizeof(intpair_t), NULL, NULL, NULL}; - intpair_t ip, *p; - utarray_new(pairs,&intpair_icd); - - ip.a=1; ip.b=2; utarray_push_back(pairs, &ip); - ip.a=10; ip.b=20; utarray_push_back(pairs, &ip); - - for(p=(intpair_t*)utarray_front(pairs); - p!=NULL; - p=(intpair_t*)utarray_next(pairs,p)) { - printf("%d %d\n", p->a, p->b); - } - - utarray_free(pairs); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test52.ans b/3rdparty/uthash-1.9.3/tests/test52.ans deleted file mode 100644 index bd37407..0000000 --- a/3rdparty/uthash-1.9.3/tests/test52.ans +++ /dev/null @@ -1,2 +0,0 @@ -1 hello -2 world diff --git a/3rdparty/uthash-1.9.3/tests/test52.c b/3rdparty/uthash-1.9.3/tests/test52.c deleted file mode 100644 index 84b7a48..0000000 --- a/3rdparty/uthash-1.9.3/tests/test52.c +++ /dev/null @@ -1,38 +0,0 @@ -#include -#include -#include "utarray.h" - -typedef struct { - int a; - char *s; -} intchar_t; - -void intchar_copy(void *_dst, const void *_src) { - intchar_t *dst = (intchar_t*)_dst, *src = (intchar_t*)_src; - dst->a = src->a; - dst->s = src->s ? strdup(src->s) : NULL; -} - -void intchar_dtor(void *_elt) { - intchar_t *elt = (intchar_t*)_elt; - if (elt->s) free(elt->s); -} - -int main() { - UT_array *intchars; - UT_icd intchar_icd = {sizeof(intchar_t), NULL, intchar_copy, intchar_dtor}; - intchar_t ic, *p; - utarray_new(intchars, &intchar_icd); - - ic.a=1; ic.s="hello"; utarray_push_back(intchars, &ic); - ic.a=2; ic.s="world"; utarray_push_back(intchars, &ic); - - p=NULL; - while( (p=(intchar_t*)utarray_next(intchars,p))) { - printf("%d %s\n", p->a, (p->s ? p->s : "null")); - } - - utarray_free(intchars); - return 0; -} - diff --git a/3rdparty/uthash-1.9.3/tests/test53.ans b/3rdparty/uthash-1.9.3/tests/test53.ans deleted file mode 100644 index a042389..0000000 --- a/3rdparty/uthash-1.9.3/tests/test53.ans +++ /dev/null @@ -1 +0,0 @@ -hello world! diff --git a/3rdparty/uthash-1.9.3/tests/test53.c b/3rdparty/uthash-1.9.3/tests/test53.c deleted file mode 100644 index b8fafc5..0000000 --- a/3rdparty/uthash-1.9.3/tests/test53.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include "utstring.h" - -int main() { - UT_string *s; - - utstring_new(s); - utstring_printf(s, "hello world!" ); - printf("%s\n", utstring_body(s)); - - utstring_free(s); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test54.ans b/3rdparty/uthash-1.9.3/tests/test54.ans deleted file mode 100644 index df0083e..0000000 --- a/3rdparty/uthash-1.9.3/tests/test54.ans +++ /dev/null @@ -1,2 +0,0 @@ -length: 21 -hello world hi there diff --git a/3rdparty/uthash-1.9.3/tests/test54.c b/3rdparty/uthash-1.9.3/tests/test54.c deleted file mode 100644 index 8774bc5..0000000 --- a/3rdparty/uthash-1.9.3/tests/test54.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include "utstring.h" - -int main() { - UT_string *s, *t; - - utstring_new(s); - utstring_new(t); - - utstring_printf(s, "hello " ); - utstring_printf(s, "world " ); - - utstring_printf(t, "hi " ); - utstring_printf(t, "there " ); - - utstring_concat(s, t); - printf("length: %u\n", utstring_len(s)); - printf("%s\n", utstring_body(s)); - - utstring_free(s); - utstring_free(t); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test55.ans b/3rdparty/uthash-1.9.3/tests/test55.ans deleted file mode 100644 index a75e7be..0000000 --- a/3rdparty/uthash-1.9.3/tests/test55.ans +++ /dev/null @@ -1,2 +0,0 @@ -length is 3 -number 10 diff --git a/3rdparty/uthash-1.9.3/tests/test55.c b/3rdparty/uthash-1.9.3/tests/test55.c deleted file mode 100644 index e421d68..0000000 --- a/3rdparty/uthash-1.9.3/tests/test55.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include "utstring.h" - -int main() { - UT_string *s; - char binary[] = "\xff\xff"; - - utstring_new(s); - utstring_bincpy(s, binary, sizeof(binary)); - printf("length is %u\n", utstring_len(s)); - - utstring_clear(s); - utstring_printf(s,"number %d", 10); - printf("%s\n", utstring_body(s)); - - utstring_free(s); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test56.ans b/3rdparty/uthash-1.9.3/tests/test56.ans deleted file mode 100644 index f615d00..0000000 --- a/3rdparty/uthash-1.9.3/tests/test56.ans +++ /dev/null @@ -1,65 +0,0 @@ -ADRIAN -ARNOLDO -CARROLL -CARY -CHONG -CLIFTON -CODY -COLTON -CORNELL -DAMON -DANNIE -DARIO -DONN -DOUG -DOUGLAS -FREDERICK -FRITZ -GERALD -GUS -HARVEY -IRVING -ISAIAH -JARVIS -JOHN -KENTON -LAURENCE -LESTER -LINCOLN -LOWELL -NELSON -NEVILLE -NIGEL -NORMAND -ODIS -OMAR -ORLANDO -RAYMUNDO -REX -ROLANDO -RON -SHANE -TONEY -TRINIDAD -WALTER -WARNER -WARREN -WES -WILLARD -WILLIAM -WINFRED -XAVIER -found WES - -user 0, cookie 0 -user 1, cookie 1 -user 2, cookie 4 -user 3, cookie 9 -user 4, cookie 16 -user 5, cookie 25 -user 6, cookie 36 -user 7, cookie 49 -user 8, cookie 64 -user 9, cookie 81 -length is 3 -number 10 diff --git a/3rdparty/uthash-1.9.3/tests/test56.c b/3rdparty/uthash-1.9.3/tests/test56.c deleted file mode 100644 index 88c015c..0000000 --- a/3rdparty/uthash-1.9.3/tests/test56.c +++ /dev/null @@ -1,86 +0,0 @@ -#include /* malloc */ -#include /* printf */ -#include -#include "uthash.h" -#include "utlist.h" -#include "utstring.h" - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; -} example_user_t; - -#define BUFLEN 20 - -typedef struct el { - char bname[BUFLEN]; - struct el *next, *prev; -} el; - -int namecmp(void *_a, void *_b) { - el *a = (el*)_a; - el *b = (el*)_b; - return strcmp(a->bname,b->bname); -} - -el *head = NULL; /* important- initialize to NULL! */ - -int main(int argc, char *argv[]) { - el *name, *elt, *tmp, etmp; - int i; - example_user_t *user, *users=NULL; - - char linebuf[BUFLEN]; - FILE *file; - - UT_string *s; - char binary[] = "\xff\xff"; - - if ( (file = fopen( "test11.dat", "r" )) == NULL ) { - perror("can't open: "); - exit(-1); - } - - while (fgets(linebuf,BUFLEN,file) != NULL) { - if ( (name = (el*)malloc(sizeof(el))) == NULL) exit(-1); - strncpy(name->bname,linebuf,BUFLEN); - DL_APPEND(head, name); - } - DL_SORT(head, namecmp); - DL_FOREACH(head,elt) printf("%s", elt->bname); - - memcpy(&etmp.bname, "WES\n", 5); - DL_SEARCH(head,elt,&etmp,namecmp); - if (elt) printf("found %s\n", elt->bname); - - /* now delete each element, use the safe iterator */ - DL_FOREACH_SAFE(head,elt,tmp) { - DL_DELETE(head,elt); - } - - fclose(file); - - /* create elements */ - for(i=0;i<10;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - } - - for(user=users; user != NULL; user=(example_user_t*)(user->hh.next)) { - printf("user %d, cookie %d\n", user->id, user->cookie); - } - - utstring_new(s); - utstring_bincpy(s, binary, sizeof(binary)); - printf("length is %u\n", utstring_len(s)); - - utstring_clear(s); - utstring_printf(s,"number %d", 10); - printf("%s\n", utstring_body(s)); - - utstring_free(s); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test57.ans b/3rdparty/uthash-1.9.3/tests/test57.ans deleted file mode 100644 index 4d3bb1d..0000000 --- a/3rdparty/uthash-1.9.3/tests/test57.ans +++ /dev/null @@ -1 +0,0 @@ -found diff --git a/3rdparty/uthash-1.9.3/tests/test57.c b/3rdparty/uthash-1.9.3/tests/test57.c deleted file mode 100644 index f788f87..0000000 --- a/3rdparty/uthash-1.9.3/tests/test57.c +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include "uthash.h" - -typedef struct { - void *key; - int i; - UT_hash_handle hh; -} el_t; - -el_t *hash = NULL; -char *someaddr = NULL; - -int main() { - el_t *d; - el_t *e = (el_t*)malloc(sizeof(el_t)); - if (!e) return -1; - e->key = (void*)someaddr; - e->i = 1; - HASH_ADD_PTR(hash,key,e); - HASH_FIND_PTR(hash, &someaddr, d); - if (d) printf("found\n"); - free(e); - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test58.ans b/3rdparty/uthash-1.9.3/tests/test58.ans deleted file mode 100644 index a23ca72..0000000 --- a/3rdparty/uthash-1.9.3/tests/test58.ans +++ /dev/null @@ -1,18 +0,0 @@ -user 0, cookie 0 -user 1, cookie 1 -user 2, cookie 4 -user 3, cookie 9 -user 4, cookie 16 -user 5, cookie 25 -user 6, cookie 36 -user 7, cookie 49 -user 8, cookie 64 -user 9, cookie 81 -10 users. Deleting odd id's... -user 0, cookie 0 -user 2, cookie 4 -user 4, cookie 16 -user 6, cookie 36 -user 8, cookie 64 -5 users. Deleting remaining id's... -0 users. diff --git a/3rdparty/uthash-1.9.3/tests/test58.c b/3rdparty/uthash-1.9.3/tests/test58.c deleted file mode 100644 index 6ec891c..0000000 --- a/3rdparty/uthash-1.9.3/tests/test58.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; -} example_user_t; - -int main(int argc,char *argv[]) { - int i,c; - example_user_t *user, *tmp, *users=NULL; - - /* create elements */ - for(i=0;i<10;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) - exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - } - /* show the hash */ - for(user=users; user != NULL; user=(example_user_t*)(user->hh.next)) { - printf("user %d, cookie %d\n", user->id, user->cookie); - } - - - c = HASH_COUNT(users); - printf("%d users. Deleting odd id's...\n", c); - /* delete the odd id's */ - HASH_ITER(hh, users, user, tmp) { - if (user->id & 1) HASH_DEL(users,user); - } - - /* show the hash */ - for(user=users; user != NULL; user=(example_user_t*)(user->hh.next)) { - printf("user %d, cookie %d\n", user->id, user->cookie); - } - - c = HASH_COUNT(users); - printf("%d users. Deleting remaining id's...\n", c); - /* delete all that are left */ - HASH_ITER(hh, users, user, tmp) { - HASH_DEL(users,user); - } - - c = HASH_COUNT(users); - printf("%d users.\n", c); - /* show the hash */ - for(user=users; user != NULL; user=(example_user_t*)(user->hh.next)) { - printf("user %d, cookie %d\n", user->id, user->cookie); - } - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test6.ans b/3rdparty/uthash-1.9.3/tests/test6.ans deleted file mode 100644 index 5c95811..0000000 --- a/3rdparty/uthash-1.9.3/tests/test6.ans +++ /dev/null @@ -1 +0,0 @@ -alt malloc table diff --git a/3rdparty/uthash-1.9.3/tests/test6.c b/3rdparty/uthash-1.9.3/tests/test6.c deleted file mode 100644 index 40fc2aa..0000000 --- a/3rdparty/uthash-1.9.3/tests/test6.c +++ /dev/null @@ -1,52 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - -/* Set up macros for alternative malloc/free functions */ -#undef uthash_malloc -#undef uthash_free -#define uthash_malloc(sz) alt_malloc(sz) -#define uthash_free(ptr,sz) alt_free(ptr) - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; -} example_user_t; - -void *alt_malloc(size_t sz) { - if (sz == sizeof(UT_hash_table)) printf("%s\n", "alt malloc table"); - return malloc(sz); -} -void alt_free(void *ptr) { - /* printf("%s\n", "alt_free"); */ - free(ptr); -} - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *tmp, *users=NULL; - - /* create elements */ - for(i=0;i<10;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - } - - /* delete each ID */ - for(i=0;i<10;i++) { - HASH_FIND_INT(users,&i,tmp); - if (tmp) { - HASH_DEL(users,tmp); - free(tmp); - } else printf("user id %d not found\n", i); - } - - /* show the hash */ - for(user=users; user != NULL; user=(example_user_t*)(user->hh.next)) { - printf("user %d, cookie %d\n", user->id, user->cookie); - } - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test7.ans b/3rdparty/uthash-1.9.3/tests/test7.ans deleted file mode 100644 index e69de29..0000000 diff --git a/3rdparty/uthash-1.9.3/tests/test7.c b/3rdparty/uthash-1.9.3/tests/test7.c deleted file mode 100644 index 3f76c8d..0000000 --- a/3rdparty/uthash-1.9.3/tests/test7.c +++ /dev/null @@ -1,38 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; -} example_user_t; - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *tmp, *users=NULL; - - /* create elements */ - for(i=0;i<1000;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - } - - /* delete each ID */ - for(i=0;i<1000;i++) { - HASH_FIND_INT(users,&i,tmp); - if (tmp) { - HASH_DEL(users,tmp); - free(tmp); - } else printf("user id %d not found\n", i); - } - - /* show the hash */ - for(user=users; user != NULL; user=(example_user_t*)(user->hh.next)) { - printf("user %d, cookie %d\n", user->id, user->cookie); - } - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test8.ans b/3rdparty/uthash-1.9.3/tests/test8.ans deleted file mode 100644 index 9d28857..0000000 --- a/3rdparty/uthash-1.9.3/tests/test8.ans +++ /dev/null @@ -1,15 +0,0 @@ -num_items in hash: 1 -num_items in hash: 2 -num_items in hash: 3 -num_items in hash: 4 -num_items in hash: 5 -num_items in hash: 6 -num_items in hash: 7 -num_items in hash: 8 -num_items in hash: 9 -num_items in hash: 10 -deleted; num_items in hash: 9 -deleted; num_items in hash: 8 -deleted; num_items in hash: 7 -deleted; num_items in hash: 6 -deleted; num_items in hash: 5 diff --git a/3rdparty/uthash-1.9.3/tests/test8.c b/3rdparty/uthash-1.9.3/tests/test8.c deleted file mode 100644 index f7c7c8d..0000000 --- a/3rdparty/uthash-1.9.3/tests/test8.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; -} example_user_t; - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *tmp, *users=NULL; - - /* create elements */ - for(i=0;i<10;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - printf("num_items in hash: %d\n", user->hh.tbl->num_items); - } - - /* delete each even ID */ - for(i=0;i<10;i+=2) { - HASH_FIND_INT(users,&i,tmp); - if (tmp) { - HASH_DEL(users,tmp); - free(tmp); - printf("deleted; num_items in hash: %d\n", user->hh.tbl->num_items); - } else printf("user id %d not found\n", i); - } - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/test9.ans b/3rdparty/uthash-1.9.3/tests/test9.ans deleted file mode 100644 index 13a9402..0000000 --- a/3rdparty/uthash-1.9.3/tests/test9.ans +++ /dev/null @@ -1,500 +0,0 @@ -user 0, cookie 0 -user 2, cookie 4 -user 4, cookie 16 -user 6, cookie 36 -user 8, cookie 64 -user 10, cookie 100 -user 12, cookie 144 -user 14, cookie 196 -user 16, cookie 256 -user 18, cookie 324 -user 20, cookie 400 -user 22, cookie 484 -user 24, cookie 576 -user 26, cookie 676 -user 28, cookie 784 -user 30, cookie 900 -user 32, cookie 1024 -user 34, cookie 1156 -user 36, cookie 1296 -user 38, cookie 1444 -user 40, cookie 1600 -user 42, cookie 1764 -user 44, cookie 1936 -user 46, cookie 2116 -user 48, cookie 2304 -user 50, cookie 2500 -user 52, cookie 2704 -user 54, cookie 2916 -user 56, cookie 3136 -user 58, cookie 3364 -user 60, cookie 3600 -user 62, cookie 3844 -user 64, cookie 4096 -user 66, cookie 4356 -user 68, cookie 4624 -user 70, cookie 4900 -user 72, cookie 5184 -user 74, cookie 5476 -user 76, cookie 5776 -user 78, cookie 6084 -user 80, cookie 6400 -user 82, cookie 6724 -user 84, cookie 7056 -user 86, cookie 7396 -user 88, cookie 7744 -user 90, cookie 8100 -user 92, cookie 8464 -user 94, cookie 8836 -user 96, cookie 9216 -user 98, cookie 9604 -user 100, cookie 10000 -user 102, cookie 10404 -user 104, cookie 10816 -user 106, cookie 11236 -user 108, cookie 11664 -user 110, cookie 12100 -user 112, cookie 12544 -user 114, cookie 12996 -user 116, cookie 13456 -user 118, cookie 13924 -user 120, cookie 14400 -user 122, cookie 14884 -user 124, cookie 15376 -user 126, cookie 15876 -user 128, cookie 16384 -user 130, cookie 16900 -user 132, cookie 17424 -user 134, cookie 17956 -user 136, cookie 18496 -user 138, cookie 19044 -user 140, cookie 19600 -user 142, cookie 20164 -user 144, cookie 20736 -user 146, cookie 21316 -user 148, cookie 21904 -user 150, cookie 22500 -user 152, cookie 23104 -user 154, cookie 23716 -user 156, cookie 24336 -user 158, cookie 24964 -user 160, cookie 25600 -user 162, cookie 26244 -user 164, cookie 26896 -user 166, cookie 27556 -user 168, cookie 28224 -user 170, cookie 28900 -user 172, cookie 29584 -user 174, cookie 30276 -user 176, cookie 30976 -user 178, cookie 31684 -user 180, cookie 32400 -user 182, cookie 33124 -user 184, cookie 33856 -user 186, cookie 34596 -user 188, cookie 35344 -user 190, cookie 36100 -user 192, cookie 36864 -user 194, cookie 37636 -user 196, cookie 38416 -user 198, cookie 39204 -user 200, cookie 40000 -user 202, cookie 40804 -user 204, cookie 41616 -user 206, cookie 42436 -user 208, cookie 43264 -user 210, cookie 44100 -user 212, cookie 44944 -user 214, cookie 45796 -user 216, cookie 46656 -user 218, cookie 47524 -user 220, cookie 48400 -user 222, cookie 49284 -user 224, cookie 50176 -user 226, cookie 51076 -user 228, cookie 51984 -user 230, cookie 52900 -user 232, cookie 53824 -user 234, cookie 54756 -user 236, cookie 55696 -user 238, cookie 56644 -user 240, cookie 57600 -user 242, cookie 58564 -user 244, cookie 59536 -user 246, cookie 60516 -user 248, cookie 61504 -user 250, cookie 62500 -user 252, cookie 63504 -user 254, cookie 64516 -user 256, cookie 65536 -user 258, cookie 66564 -user 260, cookie 67600 -user 262, cookie 68644 -user 264, cookie 69696 -user 266, cookie 70756 -user 268, cookie 71824 -user 270, cookie 72900 -user 272, cookie 73984 -user 274, cookie 75076 -user 276, cookie 76176 -user 278, cookie 77284 -user 280, cookie 78400 -user 282, cookie 79524 -user 284, cookie 80656 -user 286, cookie 81796 -user 288, cookie 82944 -user 290, cookie 84100 -user 292, cookie 85264 -user 294, cookie 86436 -user 296, cookie 87616 -user 298, cookie 88804 -user 300, cookie 90000 -user 302, cookie 91204 -user 304, cookie 92416 -user 306, cookie 93636 -user 308, cookie 94864 -user 310, cookie 96100 -user 312, cookie 97344 -user 314, cookie 98596 -user 316, cookie 99856 -user 318, cookie 101124 -user 320, cookie 102400 -user 322, cookie 103684 -user 324, cookie 104976 -user 326, cookie 106276 -user 328, cookie 107584 -user 330, cookie 108900 -user 332, cookie 110224 -user 334, cookie 111556 -user 336, cookie 112896 -user 338, cookie 114244 -user 340, cookie 115600 -user 342, cookie 116964 -user 344, cookie 118336 -user 346, cookie 119716 -user 348, cookie 121104 -user 350, cookie 122500 -user 352, cookie 123904 -user 354, cookie 125316 -user 356, cookie 126736 -user 358, cookie 128164 -user 360, cookie 129600 -user 362, cookie 131044 -user 364, cookie 132496 -user 366, cookie 133956 -user 368, cookie 135424 -user 370, cookie 136900 -user 372, cookie 138384 -user 374, cookie 139876 -user 376, cookie 141376 -user 378, cookie 142884 -user 380, cookie 144400 -user 382, cookie 145924 -user 384, cookie 147456 -user 386, cookie 148996 -user 388, cookie 150544 -user 390, cookie 152100 -user 392, cookie 153664 -user 394, cookie 155236 -user 396, cookie 156816 -user 398, cookie 158404 -user 400, cookie 160000 -user 402, cookie 161604 -user 404, cookie 163216 -user 406, cookie 164836 -user 408, cookie 166464 -user 410, cookie 168100 -user 412, cookie 169744 -user 414, cookie 171396 -user 416, cookie 173056 -user 418, cookie 174724 -user 420, cookie 176400 -user 422, cookie 178084 -user 424, cookie 179776 -user 426, cookie 181476 -user 428, cookie 183184 -user 430, cookie 184900 -user 432, cookie 186624 -user 434, cookie 188356 -user 436, cookie 190096 -user 438, cookie 191844 -user 440, cookie 193600 -user 442, cookie 195364 -user 444, cookie 197136 -user 446, cookie 198916 -user 448, cookie 200704 -user 450, cookie 202500 -user 452, cookie 204304 -user 454, cookie 206116 -user 456, cookie 207936 -user 458, cookie 209764 -user 460, cookie 211600 -user 462, cookie 213444 -user 464, cookie 215296 -user 466, cookie 217156 -user 468, cookie 219024 -user 470, cookie 220900 -user 472, cookie 222784 -user 474, cookie 224676 -user 476, cookie 226576 -user 478, cookie 228484 -user 480, cookie 230400 -user 482, cookie 232324 -user 484, cookie 234256 -user 486, cookie 236196 -user 488, cookie 238144 -user 490, cookie 240100 -user 492, cookie 242064 -user 494, cookie 244036 -user 496, cookie 246016 -user 498, cookie 248004 -user 500, cookie 250000 -user 502, cookie 252004 -user 504, cookie 254016 -user 506, cookie 256036 -user 508, cookie 258064 -user 510, cookie 260100 -user 512, cookie 262144 -user 514, cookie 264196 -user 516, cookie 266256 -user 518, cookie 268324 -user 520, cookie 270400 -user 522, cookie 272484 -user 524, cookie 274576 -user 526, cookie 276676 -user 528, cookie 278784 -user 530, cookie 280900 -user 532, cookie 283024 -user 534, cookie 285156 -user 536, cookie 287296 -user 538, cookie 289444 -user 540, cookie 291600 -user 542, cookie 293764 -user 544, cookie 295936 -user 546, cookie 298116 -user 548, cookie 300304 -user 550, cookie 302500 -user 552, cookie 304704 -user 554, cookie 306916 -user 556, cookie 309136 -user 558, cookie 311364 -user 560, cookie 313600 -user 562, cookie 315844 -user 564, cookie 318096 -user 566, cookie 320356 -user 568, cookie 322624 -user 570, cookie 324900 -user 572, cookie 327184 -user 574, cookie 329476 -user 576, cookie 331776 -user 578, cookie 334084 -user 580, cookie 336400 -user 582, cookie 338724 -user 584, cookie 341056 -user 586, cookie 343396 -user 588, cookie 345744 -user 590, cookie 348100 -user 592, cookie 350464 -user 594, cookie 352836 -user 596, cookie 355216 -user 598, cookie 357604 -user 600, cookie 360000 -user 602, cookie 362404 -user 604, cookie 364816 -user 606, cookie 367236 -user 608, cookie 369664 -user 610, cookie 372100 -user 612, cookie 374544 -user 614, cookie 376996 -user 616, cookie 379456 -user 618, cookie 381924 -user 620, cookie 384400 -user 622, cookie 386884 -user 624, cookie 389376 -user 626, cookie 391876 -user 628, cookie 394384 -user 630, cookie 396900 -user 632, cookie 399424 -user 634, cookie 401956 -user 636, cookie 404496 -user 638, cookie 407044 -user 640, cookie 409600 -user 642, cookie 412164 -user 644, cookie 414736 -user 646, cookie 417316 -user 648, cookie 419904 -user 650, cookie 422500 -user 652, cookie 425104 -user 654, cookie 427716 -user 656, cookie 430336 -user 658, cookie 432964 -user 660, cookie 435600 -user 662, cookie 438244 -user 664, cookie 440896 -user 666, cookie 443556 -user 668, cookie 446224 -user 670, cookie 448900 -user 672, cookie 451584 -user 674, cookie 454276 -user 676, cookie 456976 -user 678, cookie 459684 -user 680, cookie 462400 -user 682, cookie 465124 -user 684, cookie 467856 -user 686, cookie 470596 -user 688, cookie 473344 -user 690, cookie 476100 -user 692, cookie 478864 -user 694, cookie 481636 -user 696, cookie 484416 -user 698, cookie 487204 -user 700, cookie 490000 -user 702, cookie 492804 -user 704, cookie 495616 -user 706, cookie 498436 -user 708, cookie 501264 -user 710, cookie 504100 -user 712, cookie 506944 -user 714, cookie 509796 -user 716, cookie 512656 -user 718, cookie 515524 -user 720, cookie 518400 -user 722, cookie 521284 -user 724, cookie 524176 -user 726, cookie 527076 -user 728, cookie 529984 -user 730, cookie 532900 -user 732, cookie 535824 -user 734, cookie 538756 -user 736, cookie 541696 -user 738, cookie 544644 -user 740, cookie 547600 -user 742, cookie 550564 -user 744, cookie 553536 -user 746, cookie 556516 -user 748, cookie 559504 -user 750, cookie 562500 -user 752, cookie 565504 -user 754, cookie 568516 -user 756, cookie 571536 -user 758, cookie 574564 -user 760, cookie 577600 -user 762, cookie 580644 -user 764, cookie 583696 -user 766, cookie 586756 -user 768, cookie 589824 -user 770, cookie 592900 -user 772, cookie 595984 -user 774, cookie 599076 -user 776, cookie 602176 -user 778, cookie 605284 -user 780, cookie 608400 -user 782, cookie 611524 -user 784, cookie 614656 -user 786, cookie 617796 -user 788, cookie 620944 -user 790, cookie 624100 -user 792, cookie 627264 -user 794, cookie 630436 -user 796, cookie 633616 -user 798, cookie 636804 -user 800, cookie 640000 -user 802, cookie 643204 -user 804, cookie 646416 -user 806, cookie 649636 -user 808, cookie 652864 -user 810, cookie 656100 -user 812, cookie 659344 -user 814, cookie 662596 -user 816, cookie 665856 -user 818, cookie 669124 -user 820, cookie 672400 -user 822, cookie 675684 -user 824, cookie 678976 -user 826, cookie 682276 -user 828, cookie 685584 -user 830, cookie 688900 -user 832, cookie 692224 -user 834, cookie 695556 -user 836, cookie 698896 -user 838, cookie 702244 -user 840, cookie 705600 -user 842, cookie 708964 -user 844, cookie 712336 -user 846, cookie 715716 -user 848, cookie 719104 -user 850, cookie 722500 -user 852, cookie 725904 -user 854, cookie 729316 -user 856, cookie 732736 -user 858, cookie 736164 -user 860, cookie 739600 -user 862, cookie 743044 -user 864, cookie 746496 -user 866, cookie 749956 -user 868, cookie 753424 -user 870, cookie 756900 -user 872, cookie 760384 -user 874, cookie 763876 -user 876, cookie 767376 -user 878, cookie 770884 -user 880, cookie 774400 -user 882, cookie 777924 -user 884, cookie 781456 -user 886, cookie 784996 -user 888, cookie 788544 -user 890, cookie 792100 -user 892, cookie 795664 -user 894, cookie 799236 -user 896, cookie 802816 -user 898, cookie 806404 -user 900, cookie 810000 -user 902, cookie 813604 -user 904, cookie 817216 -user 906, cookie 820836 -user 908, cookie 824464 -user 910, cookie 828100 -user 912, cookie 831744 -user 914, cookie 835396 -user 916, cookie 839056 -user 918, cookie 842724 -user 920, cookie 846400 -user 922, cookie 850084 -user 924, cookie 853776 -user 926, cookie 857476 -user 928, cookie 861184 -user 930, cookie 864900 -user 932, cookie 868624 -user 934, cookie 872356 -user 936, cookie 876096 -user 938, cookie 879844 -user 940, cookie 883600 -user 942, cookie 887364 -user 944, cookie 891136 -user 946, cookie 894916 -user 948, cookie 898704 -user 950, cookie 902500 -user 952, cookie 906304 -user 954, cookie 910116 -user 956, cookie 913936 -user 958, cookie 917764 -user 960, cookie 921600 -user 962, cookie 925444 -user 964, cookie 929296 -user 966, cookie 933156 -user 968, cookie 937024 -user 970, cookie 940900 -user 972, cookie 944784 -user 974, cookie 948676 -user 976, cookie 952576 -user 978, cookie 956484 -user 980, cookie 960400 -user 982, cookie 964324 -user 984, cookie 968256 -user 986, cookie 972196 -user 988, cookie 976144 -user 990, cookie 980100 -user 992, cookie 984064 -user 994, cookie 988036 -user 996, cookie 992016 -user 998, cookie 996004 diff --git a/3rdparty/uthash-1.9.3/tests/test9.c b/3rdparty/uthash-1.9.3/tests/test9.c deleted file mode 100644 index a8a16dd..0000000 --- a/3rdparty/uthash-1.9.3/tests/test9.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "uthash.h" -#include /* malloc */ -#include /* printf */ - -typedef struct example_user_t { - int id; - int cookie; - UT_hash_handle hh; -} example_user_t; - -int main(int argc,char *argv[]) { - int i; - example_user_t *user, *tmp, *users=NULL; - - /* create elements */ - for(i=0;i<1000;i++) { - if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); - user->id = i; - user->cookie = i*i; - HASH_ADD_INT(users,id,user); - } - - /* delete each ID */ - for(i=0;i<1000;i+=2) { - HASH_FIND_INT(users,&i,tmp); - if (tmp) { - printf("user %d, cookie %d\n", tmp->id, tmp->cookie); - } else printf("user id %d not found\n", i); - } - return 0; -} diff --git a/3rdparty/uthash-1.9.3/tests/threads/Makefile b/3rdparty/uthash-1.9.3/tests/threads/Makefile deleted file mode 100644 index 4140fa7..0000000 --- a/3rdparty/uthash-1.9.3/tests/threads/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -HASHDIR = ../../src -PROGS = test1 test2 - -# Thread support requires compiler-specific options -# ---------------------------------------------------------------------------- -# GNU -CFLAGS = -I$(HASHDIR) -g -pthread -# Solaris (Studio 11) -#CFLAGS = -I$(HASHDIR) -g -mt -# ---------------------------------------------------------------------------- - -ifeq ($(HASH_DEBUG),1) -CFLAGS += -DHASH_DEBUG=1 -endif - -all: $(PROGS) run_tests - -$(PROGS) : $(HASHDIR)/uthash.h - $(CC) $(CFLAGS) -o $@ $(@).c - -debug: - $(MAKE) all HASH_DEBUG=1 - -run_tests: $(PROGS) - perl ../do_tests - -.PHONY: clean - -clean: - rm -f $(PROGS) test*.out - rm -rf test*.dSYM diff --git a/3rdparty/uthash-1.9.3/tests/threads/README b/3rdparty/uthash-1.9.3/tests/threads/README deleted file mode 100644 index e49a62e..0000000 --- a/3rdparty/uthash-1.9.3/tests/threads/README +++ /dev/null @@ -1,2 +0,0 @@ -test1: exercise a two-reader, one-writer, rwlock-protected hash. -test2: a template for a nthread, nloop kind of program diff --git a/3rdparty/uthash-1.9.3/tests/threads/do_tests b/3rdparty/uthash-1.9.3/tests/threads/do_tests deleted file mode 100755 index e6809a1..0000000 --- a/3rdparty/uthash-1.9.3/tests/threads/do_tests +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; - -my @tests; -for (glob "test*[0-9]") { - push @tests, $_ if -e "$_.ans"; -} - -my $num_failed=0; - -for my $test (@tests) { - `./$test > $test.out 2> $test.err`; - `diff $test.out $test.ans`; - print "$test failed\n" if $?; - $num_failed++ if $?; - unlink "$test.err" if -z "$test.err"; -} - -print scalar @tests . " tests conducted, $num_failed failed.\n"; -exit $num_failed; diff --git a/3rdparty/uthash-1.9.3/tests/threads/test1.c b/3rdparty/uthash-1.9.3/tests/threads/test1.c deleted file mode 100644 index 1045086..0000000 --- a/3rdparty/uthash-1.9.3/tests/threads/test1.c +++ /dev/null @@ -1,111 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "uthash.h" - -#undef uthash_noexpand_fyi -#define uthash_noexpand_fyi fprintf(stderr,"warning: bucket expansion inhibited\n"); - -#define LOOPS 100000 - -typedef struct { - int i; - UT_hash_handle hh; -} elt; - -elt *elts=NULL; /* this is our hash table which two threads will use */ -pthread_rwlock_t lock; - -void *thread_routine_r( void *arg ) { - int i; - long num_found=0; - elt *e; - - for(i=0;ii = i; - HASH_ADD_INT(elts, i, e); - } - pthread_rwlock_unlock(&lock); - } - return (void*)num_deld; -} - -int main() { - unsigned i; - long num_added=0; - int status; - pthread_t thread_r1,thread_r2,thread_w1,thread_w2; - void *thread_result; - elt tmp, *e; - - if (pthread_rwlock_init(&lock,NULL) != 0) { - fprintf(stderr,"lock init failed\n"); - exit(-1); - } - - if ( status = pthread_create( &thread_r1, NULL, thread_routine_r, NULL )) { - printf("failure: status %d\n", status); - exit(-1); - } - if ( status = pthread_create( &thread_r2, NULL, thread_routine_r, NULL )) { - printf("failure: status %d\n", status); - exit(-1); - } - if ( status = pthread_create( &thread_w1, NULL, thread_routine_w, NULL )) { - printf("failure: status %d\n", status); - exit(-1); - } - if ( status = pthread_create( &thread_w2, NULL, thread_routine_w, NULL )) { - printf("failure: status %d\n", status); - exit(-1); - } - - status = pthread_join( thread_r1, &thread_result ); - printf("thread result: %d %ld\n", status, (long)thread_result); - - status = pthread_join( thread_r2, &thread_result ); - printf("thread result: %d %ld\n", status, (long)thread_result); - - status = pthread_join( thread_w1, &thread_result ); - printf("thread result: %d %ld\n", status, (long)thread_result); - - status = pthread_join( thread_w2, &thread_result ); - printf("thread result: %d %ld\n", status, (long)thread_result); - - i = HASH_COUNT(elts); - printf("final count of items in hash: %u\n", i); -} diff --git a/3rdparty/uthash-1.9.3/tests/threads/test2.c b/3rdparty/uthash-1.9.3/tests/threads/test2.c deleted file mode 100644 index 20d984f..0000000 --- a/3rdparty/uthash-1.9.3/tests/threads/test2.c +++ /dev/null @@ -1,70 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "uthash.h" - -#undef uthash_noexpand_fyi -#define uthash_noexpand_fyi fprintf(stderr,"warning: bucket expansion inhibited\n"); - -#define LOOPS 100000 -#define NTHREADS 2 - -typedef struct { - int i; - int v; - UT_hash_handle hh; -} elt; - -elt *elts=NULL; /* this is our hash table which two threads will use */ -pthread_rwlock_t lock; - -void *thread_routine( void *arg ) { - int keepgoing=0; - /* TODO write me */ - return NULL; -} - -int main() { - unsigned i; - long num_added=0; - int status; - pthread_t thread[NTHREADS]; - void *thread_result; - elt tmp, *e; - - if (pthread_rwlock_init(&lock,NULL) != 0) { - fprintf(stderr,"lock init failed\n"); - exit(-1); - } - - /* populate it to start */ - for(i=0; ii = i; - e->v = 0; - HASH_ADD_INT(elts, i, e); - } - - for(i=0; i

y8Mc04;^^S{d++``yLYw3Ic}MW4dWU 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 pointer back to the list tail. - -Version 1.7 (2009-06-11) --------------------------- -* The MurmurHash has been removed, and Jenkin's hash is once again the default. - While MurmurHash performed well, it's unsafe with regard to the strict - aliasing rule. This results in incorrect code when compiled with optimization. - It's not possible to enable `-fno-strict-aliasing` from within a header file. -* The linked list macros in `utlist.h` now comply with the strict-aliasing - rule so they generate correct code under high optimization levels (O2 or O3). - The use of the `__typeof__` extension, which was originally a GNU extension, - may reduce portability to other compilers that do not support this extension. - This extension is used in the singly-linked list macros and the sort macros. - -Version 1.6 (2009-05-08) --------------------------- -Special thanks to Alfred Heisner for contributing several enhancements: - -* Support for two new hash functions: - - the Paul Hsieh hash function (`HASH_SFH`) - - Austin Appleby's MurmurHash function (`HASH_MUR`) -* Because of its excellent performance, MurmurHash is now the default hash function. -* `keystats` now has much better elapsed time accuracy under Cygwin and MinGW -* fixed casting in `HASH_FNV`, `HASH_SAX` and `HASH_OAT` for non-char keys - -This release also includes: - -* a new `HASH_CLEAR` operation clears a hash table in one step. -* a new `HASH_SELECT` operation inserts those elements from one hash that - satisfy a given condition into another hash. The selected items have - dual presence in both hash tables. For example a game could select the - visible polygons from a hash of all polygons. -* fixed a compile-time error which occurred if the final argument to - `HASH_ADD_KEYPTR` was a pointer to an array member like `&a[i]` -* added another test script `tests/all_funcs` which executes the test suite - using every supported hash function - -And lastly, - -* a new, separate header called link:utlist.html[utlist.h] is included which - provides 'linked list macros' for C structures, similar in style to the - uthash macros - -Version 1.5 (2009-02-19) --------------------------- -* now thread-safe for concurrent readers -* use scratch variables on stack rather than in table (thanks, Petter Arvidsson!). - This change made HASH_FIND about 13% faster and enabled reader concurrency. -* made link:license.html[BSD license] terms even more permissive -* added link:userguide.pdf[PDF version] of User Guide -* added http://troydhanson.wordpress.com/feed/[update news] image:img/rss.png[(RSS)] - -Version 1.4 (2008-09-23) --------------------------- -* Add `HASH_COUNT` for counting items in the hash -* Compatibility with C\+\+. Satisfy additional casting requirements. - Also in the `tests/` directory, running `make cplusplus` now compiles - all the test programs with the C++ compiler. -* Eliminate `elmt` pointer from the UT_hash_handle. Calculate elmt - from hash handle address by subtracting `hho` (hash handle offset). -* Contributed by L.S.Chin: - Cast `void*` to char* before pointer arithmetic to suppress compiler - warnings. We assume compilers abide to C standards which impose - requirement that `sizeof(void*) == sizeof(char*)`. -* Return meaningful exit status from do_tests per Tiago Cunha, - so that package manager-based install can verify tests are successful - - -Version 1.3 (2008-07-27) ------------------------- -* use integer-only math-- no floating point! Support FPU-less CPU's. -* eliminate `hash_q` metric, which measured the fraction of items with - non-ideal chain positions. We only need to know if this fraction - is below 0.5. This is now determined using fast bitwise tests. -* when an item is added to the hash, calculate the key's hash value - upfront and store it, instead of recomputing it as needed. This hashv - is stored in the hash handle. Potentially major speed benefit for - bucket expansion algorithm. Deleting is marginally improved too. -* fixed a minor bug in the calculation of the max ideal chain length; - line 446 in v1.2 erroneously calculated a/b*2 instead of a/(b*2). - The effect of this bug was that bucket expansion could occur more - readily because the per-bucket 'max chain length multiplier factor' - (which delays bucket expansion when certain buckets are overused) - was set to a lower, expansion-favoring value than intended. -* improved source commenting and improved variable names in structures -* remove `HASH_JSW`. Lengthy random number array made code less readable -* add `HASH_SRT(hh,hash,cmp)` as a generalized `HASH_SORT(hash,cmp)`. - It was an omission in uthash 1.2 that there was no sort macro for - hash handles with names other than hh. -* Corrected `HASH_FSCK` so it works with any name for the hash handle. -* behave properly in pathological `HASH_DEL(a,a)` case where the same - variable references the head and the deletee (advancing the head - then loses the correct reference to the deletee); fix by using - scratch area in the hash table to store deletee hash handle. -* made tests runnable on MinGW -* 3000+ downloads since uthash-1.0 - - -Version 1.2 (2006-11-22) ------------------------- -* new `HASH_SORT` macro -* Cygwin support -* User Guide now features a clickable Table of Contents. - (The technique for generating the TOC on the browser was contributed - back to the AsciiDoc project and incorporated into AsciiDoc v8.1.0). - - -Version 1.1 (2006-06-28) ------------------------- -* uthash-1.1 released -* supports several built-in user-selectable hash functions -* new keystats utility quantifies performance of hash functions - - -Version 1.0 (2006-06-02) ------------------------- -* Initial release - -// vim: set syntax=asciidoc: diff --git a/3rdparty/uthash-1.9.3/doc/txt/sflogo.txt b/3rdparty/uthash-1.9.3/doc/txt/sflogo.txt deleted file mode 100644 index 3eca8c4..0000000 --- a/3rdparty/uthash-1.9.3/doc/txt/sflogo.txt +++ /dev/null @@ -1,5 +0,0 @@ -ifdef::backend-xhtml11[] -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -uthash at SourceForge.net -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -endif::backend-xhtml11[] diff --git a/3rdparty/uthash-1.9.3/doc/txt/toc.txt b/3rdparty/uthash-1.9.3/doc/txt/toc.txt deleted file mode 100644 index 458eed1..0000000 --- a/3rdparty/uthash-1.9.3/doc/txt/toc.txt +++ /dev/null @@ -1,85 +0,0 @@ -ifdef::backend-xhtml11[] -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -