Revert "Import uthash-1.9.3 as a 3rd-party item"
authorMika Bostrom <mika.bostrom@nomovok.com>
Fri, 3 Dec 2010 12:50:29 +0000 (14:50 +0200)
committerMika Bostrom <mika.bostrom@nomovok.com>
Tue, 7 Dec 2010 05:48:26 +0000 (07:48 +0200)
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.

181 files changed:
3rdparty/uthash-1.9.3/LICENSE [deleted file]
3rdparty/uthash-1.9.3/README [deleted file]
3rdparty/uthash-1.9.3/doc/Makefile [deleted file]
3rdparty/uthash-1.9.3/doc/NOTES [deleted file]
3rdparty/uthash-1.9.3/doc/html/ChangeLog.html [deleted file]
3rdparty/uthash-1.9.3/doc/html/img/banner.png [deleted file]
3rdparty/uthash-1.9.3/doc/html/img/banner.svg [deleted file]
3rdparty/uthash-1.9.3/doc/html/img/grad_blue.png [deleted file]
3rdparty/uthash-1.9.3/doc/html/img/grad_blue.svg [deleted file]
3rdparty/uthash-1.9.3/doc/html/img/rss.png [deleted file]
3rdparty/uthash-1.9.3/doc/html/img/uthash-mini.png [deleted file]
3rdparty/uthash-1.9.3/doc/html/img/uthash-mini.svg [deleted file]
3rdparty/uthash-1.9.3/doc/html/img/uthash.png [deleted file]
3rdparty/uthash-1.9.3/doc/html/index.html [deleted file]
3rdparty/uthash-1.9.3/doc/html/license.html [deleted file]
3rdparty/uthash-1.9.3/doc/html/styles.css [deleted file]
3rdparty/uthash-1.9.3/doc/html/tdh-quirks.css [deleted file]
3rdparty/uthash-1.9.3/doc/html/tdh.css [deleted file]
3rdparty/uthash-1.9.3/doc/html/toc.css [deleted file]
3rdparty/uthash-1.9.3/doc/html/userguide.html [deleted file]
3rdparty/uthash-1.9.3/doc/html/userguide.pdf [deleted symlink]
3rdparty/uthash-1.9.3/doc/html/utarray.html [deleted file]
3rdparty/uthash-1.9.3/doc/html/utlist.html [deleted file]
3rdparty/uthash-1.9.3/doc/html/utstring.html [deleted file]
3rdparty/uthash-1.9.3/doc/pdf/userguide.pdf [deleted file]
3rdparty/uthash-1.9.3/doc/txt/ChangeLog.txt [deleted file]
3rdparty/uthash-1.9.3/doc/txt/sflogo.txt [deleted file]
3rdparty/uthash-1.9.3/doc/txt/toc.txt [deleted file]
3rdparty/uthash-1.9.3/doc/txt/topnav.txt [deleted file]
3rdparty/uthash-1.9.3/doc/txt/topnav_utarray.txt [deleted file]
3rdparty/uthash-1.9.3/doc/txt/topnav_utlist.txt [deleted file]
3rdparty/uthash-1.9.3/doc/txt/topnav_utstring.txt [deleted file]
3rdparty/uthash-1.9.3/doc/txt/userguide.txt [deleted file]
3rdparty/uthash-1.9.3/doc/txt/utarray.txt [deleted file]
3rdparty/uthash-1.9.3/doc/txt/utlist.txt [deleted file]
3rdparty/uthash-1.9.3/doc/txt/utstring.txt [deleted file]
3rdparty/uthash-1.9.3/src/utarray.h [deleted file]
3rdparty/uthash-1.9.3/src/uthash.h [deleted file]
3rdparty/uthash-1.9.3/src/utlist.h [deleted file]
3rdparty/uthash-1.9.3/src/utstring.h [deleted file]
3rdparty/uthash-1.9.3/tests/Makefile [deleted file]
3rdparty/uthash-1.9.3/tests/README [deleted file]
3rdparty/uthash-1.9.3/tests/all_funcs [deleted file]
3rdparty/uthash-1.9.3/tests/bloom_perf.c [deleted file]
3rdparty/uthash-1.9.3/tests/bloom_perf.sh [deleted file]
3rdparty/uthash-1.9.3/tests/do_tests [deleted file]
3rdparty/uthash-1.9.3/tests/do_tests.cygwin [deleted file]
3rdparty/uthash-1.9.3/tests/do_tests.mingw [deleted file]
3rdparty/uthash-1.9.3/tests/do_tests_win32.cmd [deleted file]
3rdparty/uthash-1.9.3/tests/emit_keys.c [deleted file]
3rdparty/uthash-1.9.3/tests/example.c [deleted file]
3rdparty/uthash-1.9.3/tests/hashscan.c [deleted file]
3rdparty/uthash-1.9.3/tests/keystat.c [deleted file]
3rdparty/uthash-1.9.3/tests/keystats [deleted file]
3rdparty/uthash-1.9.3/tests/mexpand [deleted file]
3rdparty/uthash-1.9.3/tests/simkeys.pl [deleted file]
3rdparty/uthash-1.9.3/tests/sleep_test.c [deleted file]
3rdparty/uthash-1.9.3/tests/tdiff.cpp [deleted file]
3rdparty/uthash-1.9.3/tests/test1.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test1.c [deleted file]
3rdparty/uthash-1.9.3/tests/test10.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test10.c [deleted file]
3rdparty/uthash-1.9.3/tests/test11.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test11.c [deleted file]
3rdparty/uthash-1.9.3/tests/test11.dat [deleted file]
3rdparty/uthash-1.9.3/tests/test12.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test12.c [deleted file]
3rdparty/uthash-1.9.3/tests/test13.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test13.c [deleted file]
3rdparty/uthash-1.9.3/tests/test14.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test14.c [deleted file]
3rdparty/uthash-1.9.3/tests/test14.dat [deleted file]
3rdparty/uthash-1.9.3/tests/test15.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test15.c [deleted file]
3rdparty/uthash-1.9.3/tests/test16.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test16.c [deleted file]
3rdparty/uthash-1.9.3/tests/test17.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test17.c [deleted file]
3rdparty/uthash-1.9.3/tests/test18.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test18.c [deleted file]
3rdparty/uthash-1.9.3/tests/test19.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test19.c [deleted file]
3rdparty/uthash-1.9.3/tests/test2.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test2.c [deleted file]
3rdparty/uthash-1.9.3/tests/test20.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test20.c [deleted file]
3rdparty/uthash-1.9.3/tests/test21.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test21.c [deleted file]
3rdparty/uthash-1.9.3/tests/test22.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test22.c [deleted file]
3rdparty/uthash-1.9.3/tests/test23.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test23.c [deleted file]
3rdparty/uthash-1.9.3/tests/test24.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test24.c [deleted file]
3rdparty/uthash-1.9.3/tests/test25.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test25.c [deleted file]
3rdparty/uthash-1.9.3/tests/test26.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test26.c [deleted file]
3rdparty/uthash-1.9.3/tests/test27.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test27.c [deleted file]
3rdparty/uthash-1.9.3/tests/test28.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test28.c [deleted file]
3rdparty/uthash-1.9.3/tests/test29.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test29.c [deleted file]
3rdparty/uthash-1.9.3/tests/test3.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test3.c [deleted file]
3rdparty/uthash-1.9.3/tests/test30.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test30.c [deleted file]
3rdparty/uthash-1.9.3/tests/test31.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test31.c [deleted file]
3rdparty/uthash-1.9.3/tests/test32.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test32.c [deleted file]
3rdparty/uthash-1.9.3/tests/test33.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test33.c [deleted file]
3rdparty/uthash-1.9.3/tests/test34.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test34.c [deleted file]
3rdparty/uthash-1.9.3/tests/test35.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test35.c [deleted file]
3rdparty/uthash-1.9.3/tests/test36.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test36.c [deleted file]
3rdparty/uthash-1.9.3/tests/test37.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test37.c [deleted file]
3rdparty/uthash-1.9.3/tests/test38.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test38.c [deleted file]
3rdparty/uthash-1.9.3/tests/test39.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test39.c [deleted file]
3rdparty/uthash-1.9.3/tests/test4.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test4.c [deleted file]
3rdparty/uthash-1.9.3/tests/test40.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test40.c [deleted file]
3rdparty/uthash-1.9.3/tests/test41.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test41.c [deleted file]
3rdparty/uthash-1.9.3/tests/test42.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test42.c [deleted file]
3rdparty/uthash-1.9.3/tests/test43.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test43.c [deleted file]
3rdparty/uthash-1.9.3/tests/test44.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test44.c [deleted file]
3rdparty/uthash-1.9.3/tests/test45.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test45.c [deleted file]
3rdparty/uthash-1.9.3/tests/test46.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test46.c [deleted file]
3rdparty/uthash-1.9.3/tests/test47.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test47.c [deleted file]
3rdparty/uthash-1.9.3/tests/test48.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test48.c [deleted file]
3rdparty/uthash-1.9.3/tests/test49.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test49.c [deleted file]
3rdparty/uthash-1.9.3/tests/test5.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test5.c [deleted file]
3rdparty/uthash-1.9.3/tests/test50.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test50.c [deleted file]
3rdparty/uthash-1.9.3/tests/test51.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test51.c [deleted file]
3rdparty/uthash-1.9.3/tests/test52.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test52.c [deleted file]
3rdparty/uthash-1.9.3/tests/test53.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test53.c [deleted file]
3rdparty/uthash-1.9.3/tests/test54.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test54.c [deleted file]
3rdparty/uthash-1.9.3/tests/test55.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test55.c [deleted file]
3rdparty/uthash-1.9.3/tests/test56.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test56.c [deleted file]
3rdparty/uthash-1.9.3/tests/test57.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test57.c [deleted file]
3rdparty/uthash-1.9.3/tests/test58.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test58.c [deleted file]
3rdparty/uthash-1.9.3/tests/test6.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test6.c [deleted file]
3rdparty/uthash-1.9.3/tests/test7.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test7.c [deleted file]
3rdparty/uthash-1.9.3/tests/test8.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test8.c [deleted file]
3rdparty/uthash-1.9.3/tests/test9.ans [deleted file]
3rdparty/uthash-1.9.3/tests/test9.c [deleted file]
3rdparty/uthash-1.9.3/tests/threads/Makefile [deleted file]
3rdparty/uthash-1.9.3/tests/threads/README [deleted file]
3rdparty/uthash-1.9.3/tests/threads/do_tests [deleted file]
3rdparty/uthash-1.9.3/tests/threads/test1.c [deleted file]
3rdparty/uthash-1.9.3/tests/threads/test2.c [deleted file]

diff --git a/3rdparty/uthash-1.9.3/LICENSE b/3rdparty/uthash-1.9.3/LICENSE
deleted file mode 100755 (executable)
index 6e41e33..0000000
+++ /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 (file)
index 1c78a98..0000000
+++ /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 (file)
index f68c4d1..0000000
+++ /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 (file)
index da577ac..0000000
+++ /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 (file)
index 245cace..0000000
+++ /dev/null
@@ -1,1014 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
-    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
-<head>\r
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
-<meta name="generator" content="AsciiDoc 8.5.2" />\r
-<title>uthash ChangeLog</title>\r
-<style type="text/css">\r
-/* Debug borders */\r
-p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {\r
-/*\r
-  border: 1px solid red;\r
-*/\r
-}\r
-\r
-body {\r
-  margin: 1em 5% 1em 5%;\r
-}\r
-\r
-a {\r
-  color: blue;\r
-  text-decoration: underline;\r
-}\r
-a:visited {\r
-  color: fuchsia;\r
-}\r
-\r
-em {\r
-  font-style: italic;\r
-  color: navy;\r
-}\r
-\r
-strong {\r
-  font-weight: bold;\r
-  color: #083194;\r
-}\r
-\r
-tt {\r
-  color: navy;\r
-}\r
-\r
-h1, h2, h3, h4, h5, h6 {\r
-  color: #527bbd;\r
-  font-family: sans-serif;\r
-  margin-top: 1.2em;\r
-  margin-bottom: 0.5em;\r
-  line-height: 1.3;\r
-}\r
-\r
-h1, h2, h3 {\r
-  border-bottom: 2px solid silver;\r
-}\r
-h2 {\r
-  padding-top: 0.5em;\r
-}\r
-h3 {\r
-  float: left;\r
-}\r
-h3 + * {\r
-  clear: left;\r
-}\r
-\r
-div.sectionbody {\r
-  font-family: serif;\r
-  margin-left: 0;\r
-}\r
-\r
-hr {\r
-  border: 1px solid silver;\r
-}\r
-\r
-p {\r
-  margin-top: 0.5em;\r
-  margin-bottom: 0.5em;\r
-}\r
-\r
-ul, ol, li > p {\r
-  margin-top: 0;\r
-}\r
-\r
-pre {\r
-  padding: 0;\r
-  margin: 0;\r
-}\r
-\r
-span#author {\r
-  color: #527bbd;\r
-  font-family: sans-serif;\r
-  font-weight: bold;\r
-  font-size: 1.1em;\r
-}\r
-span#email {\r
-}\r
-span#revnumber, span#revdate, span#revremark {\r
-  font-family: sans-serif;\r
-}\r
-\r
-div#footer {\r
-  font-family: sans-serif;\r
-  font-size: small;\r
-  border-top: 2px solid silver;\r
-  padding-top: 0.5em;\r
-  margin-top: 4.0em;\r
-}\r
-div#footer-text {\r
-  float: left;\r
-  padding-bottom: 0.5em;\r
-}\r
-div#footer-badges {\r
-  float: right;\r
-  padding-bottom: 0.5em;\r
-}\r
-\r
-div#preamble {\r
-  margin-top: 1.5em;\r
-  margin-bottom: 1.5em;\r
-}\r
-div.tableblock, div.imageblock, div.exampleblock, div.verseblock,\r
-div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,\r
-div.admonitionblock {\r
-  margin-top: 1.0em;\r
-  margin-bottom: 1.5em;\r
-}\r
-div.admonitionblock {\r
-  margin-top: 2.0em;\r
-  margin-bottom: 2.0em;\r
-  margin-right: 10%;\r
-  color: #606060;\r
-}\r
-\r
-div.content { /* Block element content. */\r
-  padding: 0;\r
-}\r
-\r
-/* Block element titles. */\r
-div.title, caption.title {\r
-  color: #527bbd;\r
-  font-family: sans-serif;\r
-  font-weight: bold;\r
-  text-align: left;\r
-  margin-top: 1.0em;\r
-  margin-bottom: 0.5em;\r
-}\r
-div.title + * {\r
-  margin-top: 0;\r
-}\r
-\r
-td div.title:first-child {\r
-  margin-top: 0.0em;\r
-}\r
-div.content div.title:first-child {\r
-  margin-top: 0.0em;\r
-}\r
-div.content + div.title {\r
-  margin-top: 0.0em;\r
-}\r
-\r
-div.sidebarblock > div.content {\r
-  background: #ffffee;\r
-  border: 1px solid silver;\r
-  padding: 0.5em;\r
-}\r
-\r
-div.listingblock > div.content {\r
-  border: 1px solid silver;\r
-  background: #f4f4f4;\r
-  padding: 0.5em;\r
-}\r
-\r
-div.quoteblock, div.verseblock {\r
-  padding-left: 1.0em;\r
-  margin-left: 1.0em;\r
-  margin-right: 10%;\r
-  border-left: 5px solid #dddddd;\r
-  color: #777777;\r
-}\r
-\r
-div.quoteblock > div.attribution {\r
-  padding-top: 0.5em;\r
-  text-align: right;\r
-}\r
-\r
-div.verseblock > div.content {\r
-  white-space: pre;\r
-}\r
-div.verseblock > div.attribution {\r
-  padding-top: 0.75em;\r
-  text-align: left;\r
-}\r
-/* DEPRECATED: Pre version 8.2.7 verse style literal block. */\r
-div.verseblock + div.attribution {\r
-  text-align: left;\r
-}\r
-\r
-div.admonitionblock .icon {\r
-  vertical-align: top;\r
-  font-size: 1.1em;\r
-  font-weight: bold;\r
-  text-decoration: underline;\r
-  color: #527bbd;\r
-  padding-right: 0.5em;\r
-}\r
-div.admonitionblock td.content {\r
-  padding-left: 0.5em;\r
-  border-left: 3px solid #dddddd;\r
-}\r
-\r
-div.exampleblock > div.content {\r
-  border-left: 3px solid #dddddd;\r
-  padding-left: 0.5em;\r
-}\r
-\r
-div.imageblock div.content { padding-left: 0; }\r
-span.image img { border-style: none; }\r
-a.image:visited { color: white; }\r
-\r
-dl {\r
-  margin-top: 0.8em;\r
-  margin-bottom: 0.8em;\r
-}\r
-dt {\r
-  margin-top: 0.5em;\r
-  margin-bottom: 0;\r
-  font-style: normal;\r
-  color: navy;\r
-}\r
-dd > *:first-child {\r
-  margin-top: 0.1em;\r
-}\r
-\r
-ul, ol {\r
-    list-style-position: outside;\r
-}\r
-ol.arabic {\r
-  list-style-type: decimal;\r
-}\r
-ol.loweralpha {\r
-  list-style-type: lower-alpha;\r
-}\r
-ol.upperalpha {\r
-  list-style-type: upper-alpha;\r
-}\r
-ol.lowerroman {\r
-  list-style-type: lower-roman;\r
-}\r
-ol.upperroman {\r
-  list-style-type: upper-roman;\r
-}\r
-\r
-div.compact ul, div.compact ol,\r
-div.compact p, div.compact p,\r
-div.compact div, div.compact div {\r
-  margin-top: 0.1em;\r
-  margin-bottom: 0.1em;\r
-}\r
-\r
-div.tableblock > table {\r
-  border: 3px solid #527bbd;\r
-}\r
-thead, p.table.header {\r
-  font-family: sans-serif;\r
-  font-weight: bold;\r
-}\r
-tfoot {\r
-  font-weight: bold;\r
-}\r
-td > div.verse {\r
-  white-space: pre;\r
-}\r
-p.table {\r
-  margin-top: 0;\r
-}\r
-/* Because the table frame attribute is overriden by CSS in most browsers. */\r
-div.tableblock > table[frame="void"] {\r
-  border-style: none;\r
-}\r
-div.tableblock > table[frame="hsides"] {\r
-  border-left-style: none;\r
-  border-right-style: none;\r
-}\r
-div.tableblock > table[frame="vsides"] {\r
-  border-top-style: none;\r
-  border-bottom-style: none;\r
-}\r
-\r
-\r
-div.hdlist {\r
-  margin-top: 0.8em;\r
-  margin-bottom: 0.8em;\r
-}\r
-div.hdlist tr {\r
-  padding-bottom: 15px;\r
-}\r
-dt.hdlist1.strong, td.hdlist1.strong {\r
-  font-weight: bold;\r
-}\r
-td.hdlist1 {\r
-  vertical-align: top;\r
-  font-style: normal;\r
-  padding-right: 0.8em;\r
-  color: navy;\r
-}\r
-td.hdlist2 {\r
-  vertical-align: top;\r
-}\r
-div.hdlist.compact tr {\r
-  margin: 0;\r
-  padding-bottom: 0;\r
-}\r
-\r
-.comment {\r
-  background: yellow;\r
-}\r
-\r
-.footnote, .footnoteref {\r
-  font-size: 0.8em;\r
-}\r
-\r
-span.footnote, span.footnoteref {\r
-  vertical-align: super;\r
-}\r
-\r
-#footnotes {\r
-  margin: 20px 0 20px 0;\r
-  padding: 7px 0 0 0;\r
-}\r
-\r
-#footnotes div.footnote {\r
-  margin: 0 0 5px 0;\r
-}\r
-\r
-#footnotes hr {\r
-  border: none;\r
-  border-top: 1px solid silver;\r
-  height: 1px;\r
-  text-align: left;\r
-  margin-left: 0;\r
-  width: 20%;\r
-  min-width: 100px;\r
-}\r
-\r
-\r
-@media print {\r
-  div#footer-badges { display: none; }\r
-}\r
-\r
-div#toc {\r
-  margin-bottom: 2.5em;\r
-}\r
-\r
-div#toctitle {\r
-  color: #527bbd;\r
-  font-family: sans-serif;\r
-  font-size: 1.1em;\r
-  font-weight: bold;\r
-  margin-top: 1.0em;\r
-  margin-bottom: 0.1em;\r
-}\r
-\r
-div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {\r
-  margin-top: 0;\r
-  margin-bottom: 0;\r
-}\r
-div.toclevel2 {\r
-  margin-left: 2em;\r
-  font-size: 0.9em;\r
-}\r
-div.toclevel3 {\r
-  margin-left: 4em;\r
-  font-size: 0.9em;\r
-}\r
-div.toclevel4 {\r
-  margin-left: 6em;\r
-  font-size: 0.9em;\r
-}\r
-/* Workarounds for IE6's broken and incomplete CSS2. */\r
-\r
-div.sidebar-content {\r
-  background: #ffffee;\r
-  border: 1px solid silver;\r
-  padding: 0.5em;\r
-}\r
-div.sidebar-title, div.image-title {\r
-  color: #527bbd;\r
-  font-family: sans-serif;\r
-  font-weight: bold;\r
-  margin-top: 0.0em;\r
-  margin-bottom: 0.5em;\r
-}\r
-\r
-div.listingblock div.content {\r
-  border: 1px solid silver;\r
-  background: #f4f4f4;\r
-  padding: 0.5em;\r
-}\r
-\r
-div.quoteblock-attribution {\r
-  padding-top: 0.5em;\r
-  text-align: right;\r
-}\r
-\r
-div.verseblock-content {\r
-  white-space: pre;\r
-}\r
-div.verseblock-attribution {\r
-  padding-top: 0.75em;\r
-  text-align: left;\r
-}\r
-\r
-div.exampleblock-content {\r
-  border-left: 3px solid #dddddd;\r
-  padding-left: 0.5em;\r
-}\r
-\r
-/* IE6 sets dynamically generated links as visited. */\r
-div#toc a:visited { color: blue; }\r
-</style>\r
-<script type="text/javascript">\r
-/*<![CDATA[*/\r
-window.onload = function(){asciidoc.footnotes();}\r
-var asciidoc = {  // Namespace.\r
-\r
-/////////////////////////////////////////////////////////////////////\r
-// Table Of Contents generator\r
-/////////////////////////////////////////////////////////////////////\r
-\r
-/* Author: Mihai Bazon, September 2002\r
- * http://students.infoiasi.ro/~mishoo\r
- *\r
- * Table Of Content generator\r
- * Version: 0.4\r
- *\r
- * Feel free to use this script under the terms of the GNU General Public\r
- * License, as long as you do not remove or alter this notice.\r
- */\r
-\r
- /* modified by Troy D. Hanson, September 2006. License: GPL */\r
- /* modified by Stuart Rackham, 2006, 2009. License: GPL */\r
-\r
-// toclevels = 1..4.\r
-toc: function (toclevels) {\r
-\r
-  function getText(el) {\r
-    var text = "";\r
-    for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
-      if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.\r
-        text += i.data;\r
-      else if (i.firstChild != null)\r
-        text += getText(i);\r
-    }\r
-    return text;\r
-  }\r
-\r
-  function TocEntry(el, text, toclevel) {\r
-    this.element = el;\r
-    this.text = text;\r
-    this.toclevel = toclevel;\r
-  }\r
-\r
-  function tocEntries(el, toclevels) {\r
-    var result = new Array;\r
-    var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');\r
-    // Function that scans the DOM tree for header elements (the DOM2\r
-    // nodeIterator API would be a better technique but not supported by all\r
-    // browsers).\r
-    var iterate = function (el) {\r
-      for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
-        if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {\r
-          var mo = re.exec(i.tagName);\r
-          if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {\r
-            result[result.length] = new TocEntry(i, getText(i), mo[1]-1);\r
-          }\r
-          iterate(i);\r
-        }\r
-      }\r
-    }\r
-    iterate(el);\r
-    return result;\r
-  }\r
-\r
-  var toc = document.getElementById("toc");\r
-  var entries = tocEntries(document.getElementById("content"), toclevels);\r
-  for (var i = 0; i < entries.length; ++i) {\r
-    var entry = entries[i];\r
-    if (entry.element.id == "")\r
-      entry.element.id = "_toc_" + i;\r
-    var a = document.createElement("a");\r
-    a.href = "#" + entry.element.id;\r
-    a.appendChild(document.createTextNode(entry.text));\r
-    var div = document.createElement("div");\r
-    div.appendChild(a);\r
-    div.className = "toclevel" + entry.toclevel;\r
-    toc.appendChild(div);\r
-  }\r
-  if (entries.length == 0)\r
-    toc.parentNode.removeChild(toc);\r
-},\r
-\r
-\r
-/////////////////////////////////////////////////////////////////////\r
-// Footnotes generator\r
-/////////////////////////////////////////////////////////////////////\r
-\r
-/* Based on footnote generation code from:\r
- * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html\r
- */\r
-\r
-footnotes: function () {\r
-  var cont = document.getElementById("content");\r
-  var noteholder = document.getElementById("footnotes");\r
-  var spans = cont.getElementsByTagName("span");\r
-  var refs = {};\r
-  var n = 0;\r
-  for (i=0; i<spans.length; i++) {\r
-    if (spans[i].className == "footnote") {\r
-      n++;\r
-      // Use [\s\S] in place of . so multi-line matches work.\r
-      // Because JavaScript has no s (dotall) regex flag.\r
-      note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];\r
-      noteholder.innerHTML +=\r
-        "<div class='footnote' id='_footnote_" + n + "'>" +\r
-        "<a href='#_footnoteref_" + n + "' title='Return to text'>" +\r
-        n + "</a>. " + note + "</div>";\r
-      spans[i].innerHTML =\r
-        "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +\r
-        "' title='View footnote' class='footnote'>" + n + "</a>]";\r
-      var id =spans[i].getAttribute("id");\r
-      if (id != null) refs["#"+id] = n;\r
-    }\r
-  }\r
-  if (n == 0)\r
-    noteholder.parentNode.removeChild(noteholder);\r
-  else {\r
-    // Process footnoterefs.\r
-    for (i=0; i<spans.length; i++) {\r
-      if (spans[i].className == "footnoteref") {\r
-        var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");\r
-        href = href.match(/#.*/)[0];  // Because IE return full URL.\r
-        n = refs[href];\r
-        spans[i].innerHTML =\r
-          "[<a href='#_footnote_" + n +\r
-          "' title='View footnote' class='footnote'>" + n + "</a>]";\r
-      }\r
-    }\r
-  }\r
-}\r
-\r
-}\r
-/*]]>*/\r
-</script>\r
-</head>\r
-<body>\r
-<div id="header">\r
-<h1>uthash ChangeLog</h1>\r
-</div>\r
-<div id="content">\r
-<div id="preamble">\r
-<div class="sectionbody">\r
-<a style="float: right; padding-right: 50px" href="http://sourceforge.net/projects/uthash"><img style="border: 0" src="http://sflogo.sourceforge.net/sflogo.php?group_id=163879&amp;type=13" width="120" height="30" alt="uthash at SourceForge.net" /></a>\r
-<div class="paragraph"><p>Click to return to the <a href="index.html">uthash home page</a>.</p></div>\r
-</div>\r
-</div>\r
-<h2 id="_version_1_9_3_2010_10_31">Version 1.9.3 (2010-10-31)</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-fix an ifdef for compatibility with Intel compiler (thanks, degski!)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-fix HASH_ITER macro to satisfy C++ casting rules (thanks, Erik Bai!)\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<h2 id="_version_1_9_2_2010_10_04">Version 1.9.2 (2010-10-04)</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-new <tt>HASH_ITER</tt> macro for more convenient deletion-safe iteration\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>hashscan</tt> can now run on FreeBSD 8.1 and later (thanks, Markus Gebert!)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-More parens to evaluate complex macro arguments properly (thanks, ngg!)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Add sz parameter to the <tt>uthash_free</tt> hook for platforms that do their own memory management. Hopefully this minor API change doesn&#8217;t cause too much breakage for people. (thanks, Niall Douglas!)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-uthash has been downloaded 12,294 times\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<h2 id="_version_1_9_1_2010_05_15">Version 1.9.1 (2010-05-15)</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Fix a redefinition warning when using <tt>uthash.h</tt> and <tt>utstring.h</tt> together\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fix a bug in <tt>utstring_init</tt>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added <tt>HASH_FIND_PTR</tt> and <tt>HASH_ADD_PTR</tt> (thanks, Niall Douglas!)\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<h2 id="_version_1_9_2010_03_31">Version 1.9 (2010-03-31)</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-uthash now supports Visual Studio 2008 and 2010 in C or C++ code!\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-new headers <a href="utarray.html">utarray.h</a> and <a href="utstring.html">utstring.h</a>\r
-        are now included. These implement dynamic arrays and strings using macros\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<a href="utlist.html">utlist.h</a> now has deletion-safe iterators and search macros\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-the test suite now runs under Visual Studio (thanks again degski!)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-special thanks for suggesting utarray and utlist features to Charalampos P.!\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-uthash has been downloaded 9,616 times\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<h2 id="_version_1_8_2009_09_08">Version 1.8 (2009-09-08)</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Added the <tt>hashscan</tt> utility that can report on the size and quality of\r
-  hash tables in a running process (Linux-only)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Added Bloom filter support. This has the potential to speed up certain\r
-  types of programs that look up non-existant keys in sufficient numbers.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Restored the MurmurHash, which can once again be used, if an additional\r
-  symbol is defined. This is a "safety" by which the user declares they\r
-  understand that <tt>-fno-strict-aliasing</tt> flag must be used if they are\r
-  using MurmurHash under gcc with optimization.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Unified the bucket/table malloc hooks; now there is only one malloc hook\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Re-organized the manual into a main section and advanced topics section\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed a bug in <tt>utlist.h</tt> where sorting a singly-linked list threw a\r
-  compile-time error.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Fixed a bug in <tt>utlist.h</tt> where a doubly-linked list that is sorted\r
-  did not maintain the special <tt>head-&gt;prev</tt> pointer back to the list tail.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<h2 id="_version_1_7_2009_06_11">Version 1.7 (2009-06-11)</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-The MurmurHash has been removed, and Jenkin&#8217;s hash is once again the default.\r
-  While MurmurHash performed well, it&#8217;s unsafe with regard to the strict\r
-  aliasing rule. This results in incorrect code when compiled with optimization.\r
-  It&#8217;s not possible to enable <tt>-fno-strict-aliasing</tt> from within a header file.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-The linked list macros in <tt>utlist.h</tt> now comply with the strict-aliasing\r
-  rule so they generate correct code under high optimization levels (O2 or O3).\r
-  The use of the <tt>__typeof__</tt> extension, which was originally a GNU extension,\r
-  may reduce portability to other compilers that do not support this extension.\r
-  This extension is used in the singly-linked list macros and the sort macros.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<h2 id="_version_1_6_2009_05_08">Version 1.6 (2009-05-08)</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Special thanks to Alfred Heisner for contributing several enhancements:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Support for two new hash functions:\r
-</p>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-the Paul Hsieh hash function (<tt>HASH_SFH</tt>)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Austin Appleby&#8217;s MurmurHash function (<tt>HASH_MUR</tt>)\r
-</p>\r
-</li>\r
-</ul></div>\r
-</li>\r
-<li>\r
-<p>\r
-Because of its excellent performance, MurmurHash is now the default hash function.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>keystats</tt> now has much better elapsed time accuracy under Cygwin and MinGW\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-fixed casting in <tt>HASH_FNV</tt>, <tt>HASH_SAX</tt> and <tt>HASH_OAT</tt> for non-char keys\r
-</p>\r
-</li>\r
-</ul></div>\r
-<div class="paragraph"><p>This release also includes:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-a new <tt>HASH_CLEAR</tt> operation clears a hash table in one step.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-a new <tt>HASH_SELECT</tt> operation inserts those elements from one hash that\r
-  satisfy a given condition into another hash. The selected items have\r
-  dual presence in both hash tables. For example a game could select the\r
-  visible polygons from a hash of all polygons.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-fixed a compile-time error which occurred if the final argument to\r
-  <tt>HASH_ADD_KEYPTR</tt> was a pointer to an array member like <tt>&amp;a[i]</tt>\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added another test script <tt>tests/all_funcs</tt> which executes the test suite\r
-  using every supported hash function\r
-</p>\r
-</li>\r
-</ul></div>\r
-<div class="paragraph"><p>And lastly,</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-a new, separate header called <a href="utlist.html">utlist.h</a> is included which\r
-  provides <em>linked list macros</em> for C structures, similar in style to the\r
-  uthash macros\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<h2 id="_version_1_5_2009_02_19">Version 1.5 (2009-02-19)</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-now thread-safe for concurrent readers\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-use scratch variables on stack rather than in table (thanks, Petter Arvidsson!).\r
-  This change made HASH_FIND about 13% faster and enabled reader concurrency.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-made <a href="license.html">BSD license</a> terms even more permissive\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added <a href="userguide.pdf">PDF version</a> of User Guide\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-added <a href="http://troydhanson.wordpress.com/feed/">update news</a> <span class="image">\r
-<img src="img/rss.png" alt="(RSS)" />\r
-</span>\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<h2 id="_version_1_4_2008_09_23">Version 1.4 (2008-09-23)</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Add <tt>HASH_COUNT</tt> for counting items in the hash\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Compatibility with C++. Satisfy additional casting requirements.\r
-  Also in the <tt>tests/</tt> directory, running <tt>make cplusplus</tt> now compiles\r
-  all the test programs with the C++ compiler.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Eliminate <tt>elmt</tt> pointer from the UT_hash_handle. Calculate elmt\r
-  from hash handle address by subtracting <tt>hho</tt> (hash handle offset).\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Contributed by L.S.Chin:\r
-  Cast <tt>void*</tt> to char* before pointer arithmetic to suppress compiler\r
-  warnings. We assume compilers abide to C standards which impose\r
-  requirement that <tt>sizeof(void*) == sizeof(char*)</tt>.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Return meaningful exit status from do_tests per Tiago Cunha,\r
-  so that package manager-based install can verify tests are successful\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<h2 id="_version_1_3_2008_07_27">Version 1.3 (2008-07-27)</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-use integer-only math-- no floating point! Support FPU-less CPU&#8217;s.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-eliminate <tt>hash_q</tt> metric, which measured the fraction of items with\r
-  non-ideal chain positions. We only need to know if this fraction\r
-  is below 0.5. This is now determined using fast bitwise tests.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-when an item is added to the hash, calculate the key&#8217;s hash value\r
-  upfront and store it, instead of recomputing it as needed. This hashv\r
-  is stored in the hash handle. Potentially major speed benefit for\r
-  bucket expansion algorithm. Deleting is marginally improved too.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-fixed a minor bug in the calculation of the max ideal chain length;\r
-  line 446 in v1.2 erroneously calculated a/b*2 instead of a/(b*2).\r
-  The effect of this bug was that bucket expansion could occur more\r
-  readily because the per-bucket <em>max chain length multiplier factor</em>\r
-  (which delays bucket expansion when certain buckets are overused)\r
-  was set to a lower, expansion-favoring value than intended.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-improved source commenting and improved variable names in structures\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-remove <tt>HASH_JSW</tt>. Lengthy random number array made code less readable\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-add <tt>HASH_SRT(hh,hash,cmp)</tt> as a generalized <tt>HASH_SORT(hash,cmp)</tt>.\r
-  It was an omission in uthash 1.2 that there was no sort macro for\r
-  hash handles with names other than hh.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Corrected <tt>HASH_FSCK</tt> so it works with any name for the hash handle.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-behave properly in pathological <tt>HASH_DEL(a,a)</tt> case where the same\r
-  variable references the head and the deletee (advancing the head\r
-  then loses the correct reference to the deletee); fix by using\r
-  scratch area in the hash table to store deletee hash handle.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-made tests runnable on MinGW\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-3000+ downloads since uthash-1.0\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<h2 id="_version_1_2_2006_11_22">Version 1.2 (2006-11-22)</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-new <tt>HASH_SORT</tt> macro\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Cygwin support\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-User Guide now features a clickable Table of Contents.\r
-  (The technique for generating the TOC on the browser was contributed\r
-  back to the AsciiDoc project and incorporated into AsciiDoc v8.1.0).\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<h2 id="_version_1_1_2006_06_28">Version 1.1 (2006-06-28)</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-uthash-1.1 released\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-supports several built-in user-selectable hash functions\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-new keystats utility quantifies performance of hash functions\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<h2 id="_version_1_0_2006_06_02">Version 1.0 (2006-06-02)</h2>\r
-<div class="sectionbody">\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Initial release\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-</div>\r
-<div id="footnotes"><hr /></div>\r
-<div id="footer">\r
-<div id="footer-text">\r
-Last updated 2010-10-31 15:46:35 EDT\r
-</div>\r
-</div>\r
-</body>\r
-</html>\r
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 (file)
index de4f310..0000000
Binary files a/3rdparty/uthash-1.9.3/doc/html/img/banner.png and /dev/null differ
diff --git a/3rdparty/uthash-1.9.3/doc/html/img/banner.svg b/3rdparty/uthash-1.9.3/doc/html/img/banner.svg
deleted file mode 100644 (file)
index f3143f1..0000000
+++ /dev/null
@@ -1,451 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="728px"
-   height="90px"
-   id="svg1307"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/Users/thanson/code/uthash/trunk/doc/html/img"
-   sodipodi:docname="banner.svg"
-   inkscape:export-filename="/home/thanson/code/uthash/doc/html/img/banner.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs1309">
-    <linearGradient
-       id="linearGradient12743">
-      <stop
-         style="stop-color:#99e1fa;stop-opacity:1;"
-         offset="0"
-         id="stop12745" />
-      <stop
-         id="stop12753"
-         offset="0"
-         style="stop-color:#99e1fa;stop-opacity:0.49803922;" />
-      <stop
-         style="stop-color:#99e1fa;stop-opacity:0;"
-         offset="1"
-         id="stop12747" />
-    </linearGradient>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mend"
-       style="overflow:visible;">
-      <path
-         id="path7755"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
-         transform="scale(0.4) rotate(180)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Sstart"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Sstart"
-       style="overflow:visible">
-      <path
-         id="path7752"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
-         transform="scale(0.2)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Send"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Send"
-       style="overflow:visible;">
-      <path
-         id="path7749"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
-         transform="scale(0.2) rotate(180)" />
-    </marker>
-    <marker
-       inkscape:stockid="StopM"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="StopM"
-       style="overflow:visible">
-      <path
-         id="path7651"
-         d="M 0.0,5.65 L 0.0,-5.65"
-         style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
-         transform="scale(0.4)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow2Mend"
-       style="overflow:visible;">
-      <path
-         id="path7737"
-         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
-         transform="scale(0.6) rotate(180) translate(-5,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="TriangleInM"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="TriangleInM"
-       style="overflow:visible">
-      <path
-         id="path7669"
-         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
-         transform="scale(-0.4)" />
-    </marker>
-    <marker
-       inkscape:stockid="StopL"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="StopL"
-       style="overflow:visible">
-      <path
-         id="path7654"
-         d="M 0.0,5.65 L 0.0,-5.65"
-         style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
-         transform="scale(0.8)" />
-    </marker>
-    <marker
-       inkscape:stockid="TriangleOutM"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="TriangleOutM"
-       style="overflow:visible">
-      <path
-         id="path7660"
-         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
-         transform="scale(0.4)" />
-    </marker>
-    <marker
-       inkscape:stockid="DiamondS"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="DiamondS"
-       style="overflow:visible">
-      <path
-         id="path7675"
-         d="M -2.1579186e-005,-7.0710768 L -7.0710894,-8.9383918e-006 L -2.1579186e-005,7.0710589 L 7.0710462,-8.9383918e-006 L -2.1579186e-005,-7.0710768 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
-         transform="scale(0.2)" />
-    </marker>
-    <marker
-       inkscape:stockid="Tail"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Tail"
-       style="overflow:visible">
-      <g
-         id="g7716"
-         transform="scale(-1.2)">
-        <path
-           id="path7718"
-           d="M -3.8048674,-3.9585227 L 0.54352094,-0.00068114835"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
-        <path
-           id="path7720"
-           d="M -1.2866832,-3.9585227 L 3.0617053,-0.00068114835"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
-        <path
-           id="path7722"
-           d="M 1.3053582,-3.9585227 L 5.6537466,-0.00068114835"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
-        <path
-           id="path7724"
-           d="M -3.8048674,4.1775838 L 0.54352094,0.21974226"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
-        <path
-           id="path7726"
-           d="M -1.2866832,4.1775838 L 3.0617053,0.21974226"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
-        <path
-           id="path7728"
-           d="M 1.3053582,4.1775838 L 5.6537466,0.21974226"
-           style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;marker-start:none;marker-end:none;stroke-linecap:round" />
-      </g>
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lstart"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Lstart"
-       style="overflow:visible">
-      <path
-         id="path7764"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
-         transform="scale(0.8)" />
-    </marker>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3964">
-      <stop
-         style="stop-color:#00eb00;stop-opacity:1;"
-         offset="0"
-         id="stop3966" />
-      <stop
-         style="stop-color:#00eb00;stop-opacity:0;"
-         offset="1"
-         id="stop3968" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3964"
-       id="radialGradient3996"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.237347,4.901628e-13,36.5688)"
-       cx="176.99219"
-       cy="47.949429"
-       fx="176.99219"
-       fy="47.949429"
-       r="78.257812" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient12743"
-       id="radialGradient12751"
-       cx="165.91866"
-       cy="45.584854"
-       fx="165.91866"
-       fy="45.584854"
-       r="56.51194"
-       gradientTransform="matrix(1,0,0,0.603517,0,18.07364)"
-       gradientUnits="userSpaceOnUse" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.9793956"
-     inkscape:cx="372.32157"
-     inkscape:cy="45"
-     inkscape:document-units="px"
-     inkscape:current-layer="g2335"
-     inkscape:window-width="791"
-     inkscape:window-height="581"
-     inkscape:window-x="4"
-     inkscape:window-y="48" />
-  <metadata
-     id="metadata1312">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <rect
-       style="opacity:1;fill:#393be9;fill-opacity:1;stroke:#f18a00;stroke-width:5.65522385;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect3981"
-       width="435.17825"
-       height="78.666664"
-       x="5.1747785"
-       y="6"
-       rx="29.141403"
-       ry="20"
-       inkscape:export-filename="/home/thanson/code/uthash/doc/html/img/logo.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90" />
-    <flowRoot
-       transform="matrix(1.673678,0,0,1.673678,-141.8484,-37.12273)"
-       style="font-size:47.99999774;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr;text-anchor:start;fill:#faf599;fill-opacity:1;stroke:#f3bf33;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       id="flowRoot3988"
-       xml:space="preserve"
-       inkscape:export-filename="/home/thanson/code/uthash/doc/html/img/logo.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90"><flowRegion
-         style="fill:url(#radialGradient3996);fill-opacity:1"
-         id="flowRegion3990"><rect
-           style="font-size:47.99999774;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr;text-anchor:start;fill:#faf599;fill-opacity:1;stroke:#f3bf33;stroke-opacity:1;font-family:Bitstream Vera Sans"
-           y="18"
-           x="94.666664"
-           height="61.333332"
-           width="321.33334"
-           id="rect3992" /></flowRegion><flowPara
-         id="flowPara7831">ut     hash</flowPara></flowRoot>    <rect
-       style="opacity:1;fill:url(#radialGradient12751);fill-opacity:1.0;stroke:none;stroke-width:2.82532263;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect10995"
-       width="113.02388"
-       height="68.211792"
-       x="109.40672"
-       y="11.478957"
-       inkscape:export-filename="/home/thanson/code/uthash/doc/html/img/logo.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90" />
-    <g
-       id="g7808"
-       transform="matrix(0.807859,0,0,0.807859,-140.848,9.677403)"
-       inkscape:export-filename="/home/thanson/code/uthash/doc/html/img/logo.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90">
-      <rect
-         y="37.730064"
-         x="382.39673"
-         height="18.405188"
-         width="23.206543"
-         id="rect4882"
-         style="opacity:1;fill:#9be5ea;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         style="opacity:1;fill:#d48c21;fill-opacity:0.97777776;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect4886"
-         width="23.206543"
-         height="18.405188"
-         x="416.39673"
-         y="37.730064" />
-      <path
-         inkscape:connector-type="polyline"
-         id="path4890"
-         d="M 372.60327,46.932658 L 381.39673,46.932658"
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <path
-         inkscape:connector-type="polyline"
-         id="path4892"
-         d="M 406.60327,46.932658 L 415.39673,46.932658"
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <rect
-         y="9.7300644"
-         x="348.39673"
-         height="18.405188"
-         width="23.206543"
-         id="rect4896"
-         style="opacity:1;fill:#79c71a;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         style="opacity:1;fill:#f5e1a2;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect4898"
-         width="23.206543"
-         height="18.405188"
-         x="382.39673"
-         y="9.7300644" />
-      <path
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="M 372.60327,18.932658 L 381.39673,18.932658"
-         id="path4902"
-         inkscape:connector-type="polyline" />
-      <rect
-         y="14.207111"
-         x="318.45328"
-         height="10.1194"
-         width="10.1194"
-         id="rect4906"
-         style="opacity:1;fill:#1336e6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <path
-         inkscape:connector-type="polyline"
-         id="path5789"
-         d="M 328.57268,19.220474 L 347.39673,19.048081"
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <path
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="M 328.57268,19.220474 L 347.39673,19.048081"
-         id="path5795"
-         inkscape:connector-type="polyline" />
-      <rect
-         y="37.789951"
-         x="348.20978"
-         height="18.405188"
-         width="23.206543"
-         id="rect5803"
-         style="opacity:1;fill:#e5e5e5;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="42.267002"
-         x="318.26633"
-         height="10.1194"
-         width="10.1194"
-         id="rect5805"
-         style="opacity:1;fill:#1336e6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <path
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="M 328.38572,47.280365 L 347.20977,47.107972"
-         id="path5807"
-         inkscape:connector-type="polyline" />
-      <rect
-         style="opacity:1;fill:#ddf9ed;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect5809"
-         width="23.206543"
-         height="18.405188"
-         x="348.20978"
-         y="63.720913" />
-      <rect
-         style="opacity:1;fill:#1336e6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect5811"
-         width="10.1194"
-         height="10.1194"
-         x="318.26633"
-         y="68.197968" />
-      <path
-         inkscape:connector-type="polyline"
-         id="path5813"
-         d="M 328.38572,73.211328 L 347.20977,73.038935"
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <path
-         inkscape:connector-type="polyline"
-         id="path5833"
-         d="M 323.47927,24.326511 L 323.35974,42.267002"
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#2f29df;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <path
-         inkscape:connector-type="polyline"
-         id="path5835"
-         d="M 323.32603,52.386402 L 323.32603,68.197968"
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#2f29df;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <path
-         id="path6716"
-         d="M 429.08836,47.11641 L 394.37307,18.527349 L 394.37307,49.158485 L 359.65778,18.527349 L 359.65778,50.179523 L 359.65778,75.70547"
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#f3bf33;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#StopM);marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    </g>
-    <g
-       id="g2335"
-       transform="translate(0,-10)"
-       inkscape:export-filename="/home/thanson/code/uthash/doc/html/img/logo_tag.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90">
-      <text
-         xml:space="preserve"
-         style="font-size:18.43119621px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-         x="565.8512"
-         y="50.633156"
-         id="text2331"><tspan
-           sodipodi:role="line"
-           id="tspan2333"
-           x="565.85119"
-           y="50.633156">a hash table</tspan><tspan
-           sodipodi:role="line"
-           x="565.8512"
-           y="73.672151"
-           id="tspan2361">for C structures</tspan></text>
-    </g>
-  </g>
-</svg>
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 (file)
index 8fab0fa..0000000
Binary files a/3rdparty/uthash-1.9.3/doc/html/img/grad_blue.png and /dev/null differ
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 (file)
index 8ea0e09..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.43"
-   sodipodi:docbase="/home/thanson/code/uthash/doc/html/img"
-   sodipodi:docname="grad_blue.svg">
-  <defs
-     id="defs4">
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient2194">
-      <stop
-         style="stop-color:#0000e0;stop-opacity:1;"
-         offset="0"
-         id="stop2196" />
-      <stop
-         style="stop-color:#0000e0;stop-opacity:0;"
-         offset="1"
-         id="stop2198" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient2184">
-      <stop
-         style="stop-color:#0000e0;stop-opacity:1;"
-         offset="0"
-         id="stop2186" />
-      <stop
-         style="stop-color:#0000e0;stop-opacity:0;"
-         offset="1"
-         id="stop2188" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2184"
-       id="linearGradient2190"
-       x1="76.642857"
-       y1="679.50504"
-       x2="523.35714"
-       y2="679.50504"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2194"
-       id="linearGradient2200"
-       x1="335.5"
-       y1="654.61218"
-       x2="506"
-       y2="654.61218"
-       gradientUnits="userSpaceOnUse" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2"
-     inkscape:cx="488.2215"
-     inkscape:cy="372.85714"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     inkscape:window-width="791"
-     inkscape:window-height="543"
-     inkscape:window-x="115"
-     inkscape:window-y="82" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <rect
-       style="opacity:0.96629214;fill:url(#linearGradient2200);fill-opacity:1.0;stroke:none;stroke-width:4.68499994;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect2192"
-       width="170.5"
-       height="9.5"
-       x="335.5"
-       y="649.86218" />
-  </g>
-</svg>
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 (executable)
index b3c949d..0000000
Binary files a/3rdparty/uthash-1.9.3/doc/html/img/rss.png and /dev/null differ
diff --git a/3rdparty/uthash-1.9.3/doc/html/img/uthash-mini.png b/3rdparty/uthash-1.9.3/doc/html/img/uthash-mini.png
deleted file mode 100644 (file)
index 9536b2a..0000000
Binary files a/3rdparty/uthash-1.9.3/doc/html/img/uthash-mini.png and /dev/null differ
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 (file)
index ea2d074..0000000
+++ /dev/null
@@ -1,288 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="118.44112"
-   height="22.655222"
-   id="svg2018"
-   sodipodi:version="0.32"
-   inkscape:version="0.44"
-   version="1.0"
-   sodipodi:docbase="/home/thanson/code/uthash/trunk/doc/html/img"
-   sodipodi:docname="uthash-mini.svg">
-  <defs
-     id="defs3">
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3964">
-      <stop
-         style="stop-color:#00eb00;stop-opacity:1;"
-         offset="0"
-         id="stop3966" />
-      <stop
-         style="stop-color:#00eb00;stop-opacity:0;"
-         offset="1"
-         id="stop3968" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3964"
-       id="radialGradient3996"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.237347,0,36.5688)"
-       cx="176.99219"
-       cy="47.949429"
-       fx="176.99219"
-       fy="47.949429"
-       r="78.257812" />
-    <linearGradient
-       id="linearGradient12743">
-      <stop
-         style="stop-color:#99e1fa;stop-opacity:1;"
-         offset="0"
-         id="stop12745" />
-      <stop
-         id="stop12753"
-         offset="0"
-         style="stop-color:#99e1fa;stop-opacity:0.49803922;" />
-      <stop
-         style="stop-color:#99e1fa;stop-opacity:0;"
-         offset="1"
-         id="stop12747" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient12743"
-       id="radialGradient12751"
-       cx="165.91866"
-       cy="45.584854"
-       fx="165.91866"
-       fy="45.584854"
-       r="56.51194"
-       gradientTransform="matrix(0.268675,0,0,0.16215,17.28599,40.67469)"
-       gradientUnits="userSpaceOnUse" />
-    <marker
-       inkscape:stockid="Arrow1Send"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Send"
-       style="overflow:visible">
-      <path
-         id="path7749"
-         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
-         style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
-         transform="scale(-0.2,-0.2)" />
-    </marker>
-    <marker
-       inkscape:stockid="StopM"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="StopM"
-       style="overflow:visible">
-      <path
-         id="path7651"
-         d="M 0,5.65 L 0,-5.65"
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1pt"
-         transform="scale(0.4,0.4)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.2"
-     inkscape:cx="160"
-     inkscape:cy="90"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer1"
-     inkscape:window-width="916"
-     inkscape:window-height="626"
-     inkscape:window-x="5"
-     inkscape:window-y="73" />
-  <metadata
-     id="metadata2022">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-17.9166,-36.67108)">
-    <rect
-       style="opacity:1;fill:#393be9;fill-opacity:1;stroke:#f18a00;stroke-width:1.51941979;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect3981"
-       width="116.92171"
-       height="21.135801"
-       x="18.67631"
-       y="37.430794"
-       rx="7.8295798"
-       ry="5.3735089"
-       inkscape:export-filename="/home/thanson/code/uthash/doc/html/img/logo.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90" />
-    <flowRoot
-       transform="matrix(0.449676,0,0,0.449676,-20.8252,25.84477)"
-       style="font-size:47.99999619px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#faf599;fill-opacity:1;stroke:#f3bf33;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       id="flowRoot3988"
-       xml:space="preserve"
-       inkscape:export-filename="/home/thanson/code/uthash/doc/html/img/logo.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90"><flowRegion
-         style="fill:url(#radialGradient3996);fill-opacity:1"
-         id="flowRegion3990"><rect
-           style="font-size:47.99999619px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#faf599;fill-opacity:1;stroke:#f3bf33;stroke-opacity:1;font-family:Bitstream Vera Sans"
-           y="18"
-           x="94.666664"
-           height="61.333332"
-           width="321.33334"
-           id="rect3992" /></flowRegion><flowPara
-         id="flowPara7831">ut     hash</flowPara></flowRoot>    <rect
-       style="opacity:1;fill:url(#radialGradient12751);fill-opacity:1;stroke:none;stroke-width:2.82532263;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect10995"
-       width="30.366741"
-       height="18.326834"
-       x="46.68087"
-       y="38.902855"
-       inkscape:export-filename="/home/thanson/code/uthash/doc/html/img/logo.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90" />
-    <g
-       id="g7808"
-       transform="matrix(0.217052,0,0,0.217052,-20.55641,38.41883)"
-       inkscape:export-filename="/home/thanson/code/uthash/doc/html/img/logo.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90">
-      <rect
-         y="37.730064"
-         x="382.39673"
-         height="18.405188"
-         width="23.206543"
-         id="rect4882"
-         style="opacity:1;fill:#9be5ea;fill-opacity:1;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         style="opacity:1;fill:#d48c21;fill-opacity:0.97777776;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect4886"
-         width="23.206543"
-         height="18.405188"
-         x="416.39673"
-         y="37.730064" />
-      <path
-         inkscape:connector-type="polyline"
-         id="path4890"
-         d="M 372.60327,46.932658 L 381.39673,46.932658"
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <path
-         inkscape:connector-type="polyline"
-         id="path4892"
-         d="M 406.60327,46.932658 L 415.39673,46.932658"
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <rect
-         y="9.7300644"
-         x="348.39673"
-         height="18.405188"
-         width="23.206543"
-         id="rect4896"
-         style="opacity:1;fill:#79c71a;fill-opacity:1;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         style="opacity:1;fill:#f5e1a2;fill-opacity:1;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect4898"
-         width="23.206543"
-         height="18.405188"
-         x="382.39673"
-         y="9.7300644" />
-      <path
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="M 372.60327,18.932658 L 381.39673,18.932658"
-         id="path4902"
-         inkscape:connector-type="polyline" />
-      <rect
-         y="14.207111"
-         x="318.45328"
-         height="10.1194"
-         width="10.1194"
-         id="rect4906"
-         style="opacity:1;fill:#1336e6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <path
-         inkscape:connector-type="polyline"
-         id="path5789"
-         d="M 328.57268,19.220474 L 347.39673,19.048081"
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <path
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="M 328.57268,19.220474 L 347.39673,19.048081"
-         id="path5795"
-         inkscape:connector-type="polyline" />
-      <rect
-         y="37.789951"
-         x="348.20978"
-         height="18.405188"
-         width="23.206543"
-         id="rect5803"
-         style="opacity:1;fill:#e5e5e5;fill-opacity:1;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="42.267002"
-         x="318.26633"
-         height="10.1194"
-         width="10.1194"
-         id="rect5805"
-         style="opacity:1;fill:#1336e6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <path
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="M 328.38572,47.280365 L 347.20977,47.107972"
-         id="path5807"
-         inkscape:connector-type="polyline" />
-      <rect
-         style="opacity:1;fill:#ddf9ed;fill-opacity:1;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect5809"
-         width="23.206543"
-         height="18.405188"
-         x="348.20978"
-         y="63.720913" />
-      <rect
-         style="opacity:1;fill:#1336e6;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="rect5811"
-         width="10.1194"
-         height="10.1194"
-         x="318.26633"
-         y="68.197968" />
-      <path
-         inkscape:connector-type="polyline"
-         id="path5813"
-         d="M 328.38572,73.211328 L 347.20977,73.038935"
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <path
-         inkscape:connector-type="polyline"
-         id="path5833"
-         d="M 323.47927,24.326511 L 323.35974,42.267002"
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#2f29df;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <path
-         inkscape:connector-type="polyline"
-         id="path5835"
-         d="M 323.32603,52.386402 L 323.32603,68.197968"
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#2f29df;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <path
-         id="path6716"
-         d="M 429.08836,47.11641 L 394.37307,18.527349 L 394.37307,49.158485 L 359.65778,18.527349 L 359.65778,50.179523 L 359.65778,75.70547"
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#f3bf33;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#StopM);marker-end:url(#Arrow1Send);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    </g>
-  </g>
-</svg>
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 (file)
index 20df5a7..0000000
Binary files a/3rdparty/uthash-1.9.3/doc/html/img/uthash.png and /dev/null differ
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 (file)
index 2c80ee4..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-<!DOCTYPE html
-     PUBLIC "-//W3C//DTD XTHML 1.0 Strict//EN"
-     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-  <head>
-    <link rel="stylesheet" type="text/css" href="styles.css" />
-    <title>uthash: a hash table for C structures</title>
-  </head>
-  <body>
-
-  <div id="banner">
-  <img src="img/banner.png" alt="uthash: a hash table for C structures" />
-  </div> <!-- banner -->
-
-  <div id="topnav">
-  <a href="http://sourceforge.net/projects/uthash/">sf.net summary page</a> &gt;
-  uthash home
-  </div>
-
-  <hr />
-  <div id="mid">
-
-      <div id="nav">
-
-        <h2>documentation</h2>
-        <div><a href="userguide.html">uthash</a> (<a href="userguide.html">html</a>) (<a href="userguide.pdf">pdf</a>)</div>
-
-        <h2>extras included</h2>
-        <div><a href="utlist.html">utlist</a></div>
-        <div><a href="utarray.html">utarray</a></div>
-        <div><a href="utstring.html">utstring</a></div>
-
-        <h2>download</h2>
-        <h3>Linux, Mac OSX, Solaris, BSD</h3>
-        <div><a href="http://downloads.sourceforge.net/uthash/uthash-1.9.3.tar.bz2">uthash-1.9.3.tar.bz2</a></div>
-        <h3>Windows</h3>
-        <div><a href="http://downloads.sourceforge.net/uthash/uthash-1.9.3.zip">uthash-1.9.3.zip</a></div>
-
-        <h2>last release</h2>
-        <div>October, 2010</div>
-        <div><a href="ChangeLog.html">ChangeLog</a></div>
-
-        <h2>license</h2>
-        <div><a href="license.html">BSD revised</a></div>
-
-        <h2>resources</h2>
-        <div><a href="http://troydhanson.wordpress.com/">updates</a> [<a href="http://troydhanson.wordpress.com/feed/">rss</a>]<img alt=" rss" src="img/rss.png"/></div>
-
-        <h2>other projects</h2>
-        <div><a href="http://tpl.sourceforge.net/">tpl</a></div>
-        <div><a href="http://tkhanson.net/misc/">scripts & snippets</a></div>
-
-        <h2>developer</h2>
-        <div>Troy D. Hanson</div>
-        <div>tdh@tkhanson.net</div>
-
-      </div>
-
-
-      <div id="main">
-        Any C structure can be stored in a hash table using uthash. Just add a
-        <em>UT_hash_handle</em> 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.
-
-<div class="listing">
-Example 1. Adding an item to a hash.
-<div class="code">
-<pre>
-#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 );    
-}
-
-</pre>
-</div> <!-- code -->
-</div> <!-- listing -->
-
-<div class="listing">
-Example 2. Looking up an item in a hash.
-<div class="code">
-<pre>
-struct my_struct *find_user(int user_id) {
-    struct my_struct *s;
-
-    HASH_FIND_INT( users, &amp;user_id, s );  
-    return s;
-}
-
-</pre>
-</div> <!-- code -->
-</div> <!-- listing -->
-
-<div class="listing">
-Example 3. Deleting an item from a hash.
-<div class="code">
-
-<pre>
-void delete_user(struct my_struct *user) {
-    HASH_DEL( users, user);  
-}
-
-</pre>
-</div> <!-- code -->
-</div> <!-- listing -->
-
- For more information and examples, please see the <a href="userguide.html">User Guide.</a>
-
-</div> <!-- main -->
-</div> <!-- mid -->
-
-   <hr />
-  <div id="footer">
-    <a href="http://sourceforge.net/projects/uthash"><img src="http://sflogo.sourceforge.net/sflogo.php?group_id=163879&amp;type=13" width="120" height="30" alt="Get uthash at SourceForge.net. Fast, secure and Free Open Source software downloads" /></a>
-    <p>This project is hosted on SourceForge.net</p>
-    <p>$Id: index.html 121 2010-10-31 03:03:06Z thanson $</p>
-  </div> <!-- footer -->
-
-  </body>
-
-</html>
-
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 (file)
index 61b9d82..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE html
-     PUBLIC "-//W3C//DTD XTHML 1.0 Strict//EN"
-     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-  <head>
-    <link rel="stylesheet" type="text/css" href="styles.css" />
-    <title>uthash: a hash table for C structures</title>
-  </head>
-  <body>
-
-  <div id="banner">
-  <img src="img/banner.png" alt="uthash: a hash table for C structures" />
-  </div> <!-- banner -->
-
-  <div id="topnav">
-  <a href="http://sourceforge.net/projects/uthash/">sf.net summary page</a> &gt;
-  <a href="index.html">uthash home</a> &gt;
-  BSD license
-  </div>
-
-  <hr />
-  <div id="mid">
-      <div id="main">
-<pre>
-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.
-</pre>
-</div> <!-- mid -->
-</div> <!-- main -->
-
-   <hr />
-  <div id="footer">
-    <a href="http://sourceforge.net/projects/uthash"><img src="http://sflogo.sourceforge.net/sflogo.php?group_id=163879&amp;type=13" width="120" height="30" alt="Get uthash at SourceForge.net. Fast, secure and Free Open Source software downloads" /></a>
-    <p>This project is hosted on SourceForge.net</p>
-    <p>$Id: index.html 69 2008-09-24 01:36:50Z thanson $</p>
-  </div> <!-- footer -->
-
-  </body>
-
-</html>
-
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 (file)
index 75035f1..0000000
+++ /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 (file)
index a39a6d6..0000000
+++ /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 (file)
index 4f927f3..0000000
+++ /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 (file)
index ae3363e..0000000
+++ /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 (file)
index bc7c250..0000000
+++ /dev/null
@@ -1,1941 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
-    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
-<head>\r
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
-<meta name="generator" content="AsciiDoc 8.5.2" />\r
-<title>uthash User Guide</title>\r
-<link rel="stylesheet" href="./tdh.css" type="text/css" />\r
-<link rel="stylesheet" href="./tdh-quirks.css" type="text/css" />\r
-<script type="text/javascript">\r
-/*<![CDATA[*/\r
-window.onload = function(){asciidoc.footnotes();}\r
-/*]]>*/\r
-</script>\r
-<script type="text/javascript" src="./asciidoc-xhtml11.js"></script>\r
-</head>\r
-<body>\r
-<div id="header">\r
-<h1>uthash User Guide</h1>\r
-<span id="author">Troy D. Hanson</span><br />\r
-<span id="email"><tt>&lt;<a href="mailto:thanson@users.sourceforge.net">thanson@users.sourceforge.net</a>&gt;</tt></span><br />\r
-<span id="revnumber">version 1.9.2,</span>\r
-<span id="revdate">October 2010</span>\r
-</div>\r
-<div id="content">\r
-<div id="preamble">\r
-<div class="sectionbody">\r
-<a style="float: right; padding-right: 50px" href="http://sourceforge.net/projects/uthash"><img style="border: 0" src="http://sflogo.sourceforge.net/sflogo.php?group_id=163879&amp;type=13" width="120" height="30" alt="uthash at SourceForge.net" /></a>\r
-  <div id="topnav" style="font-size: 9pt; font-family: sans-serif;">\r
-  <a style="padding-right: 8px;" href="http://sourceforge.net/projects/uthash/">sf.net summary page</a>\r
-  >> <a style="padding: 8px;" href="index.html">uthash home</a>\r
-  >>  User Guide\r
-  <a style="padding: 8px;" href="userguide.pdf">[View PDF]</a>\r
-  </div>\r
-</div>\r
-</div>\r
-<h2 id="_a_hash_in_c">A hash in C</h2>\r
-<div class="sectionbody">\r
-<div id="toc"></div>\r
-<script>\r
-window.onload=generate_TOC\r
-\r
-/* Author: Mihai Bazon, September 2002\r
- * <a href="http://students.infoiasi.ro/~mishoo">http://students.infoiasi.ro/~mishoo</a>\r
- *\r
- * Table Of Content generator\r
- * Version: 0.4\r
- *\r
- * Feel free to use this script under the terms of the GNU General Public\r
- * License, as long as you do not remove or alter this notice.\r
- */\r
-\r
- /* modified by Troy D. Hanson, September 2006. License: GPL */\r
-\r
-function H_getText(el) {\r
-  var text = "";\r
-  for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
-    if (i.nodeType == 3 /* Node.TEXT_NODE, IE doesn't speak constants */)\r
-      text += i.data;\r
-    else if (i.firstChild != null)\r
-      text += H_getText(i);\r
-  }\r
-  return text;\r
-}\r
-\r
-function TOC_EL(el, text, level) {\r
-  this.element = el;\r
-  this.text = text;\r
-  this.level = level;\r
-}\r
-\r
-function getHeadlines(el) {\r
-  var l = new Array;\r
-  var rx = /[hH]([2-3])/;\r
-  // internal recursive function that scans the DOM tree\r
-  var rec = function (el) {\r
-    for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
-      if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {\r
-        if (rx.exec(i.tagName))\r
-          l[l.length] = new TOC_EL(i, H_getText(i), parseInt(RegExp.$1));\r
-        rec(i);\r
-      }\r
-    }\r
-  }\r
-  rec(el);\r
-  return l;\r
-}\r
-\r
-function generate_TOC() {\r
-  var parent = document.getElementById("toc");\r
-  var toc_hdr = document.createElement("div");\r
-  var toc_hdr_txt = document.createTextNode("CONTENTS");\r
-  toc_hdr.appendChild(toc_hdr_txt);\r
-  /* toc_hdr.setAttribute("id","hdr"); */\r
-  toc_hdr.id = "hdr";\r
-  parent.appendChild(toc_hdr);\r
-  var hs = getHeadlines(document.getElementsByTagName("body")[0]);\r
-  for (var i = 0; i < hs.length; ++i) {\r
-    var hi = hs[i];\r
-    var d = document.createElement("div");\r
-    if (hi.element.id == "") hi.element.id = "gen" + i;\r
-    var a = document.createElement("a");\r
-    a.href = "#" + hi.element.id;\r
-    a.appendChild(document.createTextNode(hi.text));\r
-    d.appendChild(a);\r
-    d.className = "level" + hi.level;\r
-    parent.appendChild(d);\r
-    /*\r
-    if (hi.level == 3) {\r
-        var dvtop = document.createElement("div");\r
-        dvtop.className = "toplink";\r
-        dvtop.appendChild(document.createTextNode("^top^"));\r
-        dvtop.onclick=function(){scrollTo(0,0);};\r
-        hi.element.appendChild(dvtop);\r
-    }\r
-    */\r
-  }\r
-}\r
-</script>\r
-<div class="paragraph"><p>This document is written for C programmers. Since you&#8217;re reading this, chances\r
-are that you know a hash is used for looking up items using a key. In scripting\r
-languages like Perl, hashes are used all the time.  In C, hashes don&#8217;t exist in\r
-the language itself. This software provides a hash table for C structures.</p></div>\r
-<h3 id="_what_can_it_do">What can it do?</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>This software supports these operations on items in a hash table:</p></div>\r
-<div class="olist arabic"><ol class="arabic">\r
-<li>\r
-<p>\r
-add\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-find\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-delete\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-count\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-iterate\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-sort\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-select (explained later)\r
-</p>\r
-</li>\r
-</ol></div>\r
-<h3 id="_is_it_fast">Is it fast?</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>Add, find and delete are normally constant-time operations. This is influenced\r
-by your key domain and the hash function.</p></div>\r
-<div class="paragraph"><p>This hash aims to be minimalistic and efficient. It&#8217;s around 900 lines of C.\r
-It inlines automatically because it&#8217;s implemented as macros. It&#8217;s fast as long\r
-as the hash function is suited to your keys. You can use the default hash\r
-function, or easily compare performance and choose from among several other\r
-<a href="#hash_functions">built-in hash functions</a>.</p></div>\r
-<h3 id="_is_it_a_library">Is it a library?</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>No, it&#8217;s just a single header file: <tt>uthash.h</tt>.  All you need to do is copy\r
-the header file into your project, and:</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>#include "uthash.h"</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>Since uthash is a header file only, there is no library code to link against.</p></div>\r
-<h3 id="_c_c_and_platforms">C/C++ and platforms</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>This software can be used in C and C++ programs.  It has been tested on:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Linux\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Mac OS X\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Windows using Visual Studio 2008 and 2010\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Solaris\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-OpenBSD\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-FreeBSD\r
-</p>\r
-</li>\r
-</ul></div>\r
-<h4 id="_test_suite">Test suite</h4>\r
-<div class="paragraph"><p>To run the test suite, look in the <tt>tests</tt> directory and either run <tt>make</tt> on\r
-Unix platforms, or on Windows run the "do_tests_win32.cmd" batch file (if you\r
-have Visual Studio 2008 or 2010 installed in a non-standard location you may\r
-have to edit the batch file).</p></div>\r
-<h3 id="_bsd_licensed">BSD licensed</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>This software is made available under the\r
-<a href="license.html">revised BSD license</a>.\r
-It is free and open source.</p></div>\r
-<h3 id="_obtaining_uthash">Obtaining uthash</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>Please follow the link to download on the\r
-<a href="http://uthash.sourceforge.net">uthash website</a> at <a href="http://uthash.sourceforge.net">http://uthash.sourceforge.net</a>.</p></div>\r
-<h3 id="_getting_help">Getting help</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>Feel free to <a href="mailto:tdh@tkhanson.net">email the author</a> at\r
-<a href="mailto:tdh@tkhanson.net">tdh@tkhanson.net</a>.</p></div>\r
-<h3 id="_resources">Resources</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>Users of uthash may wish to follow the news feed for information about new\r
-releases. Also, there are some extra bonus headers included with uthash.</p></div>\r
-<div class="dlist"><dl>\r
-<dt class="hdlist1">\r
-News\r
-</dt>\r
-<dd>\r
-<p>\r
- The author has a news feed for <a href="http://troydhanson.wordpress.com/feed/">software updates</a> <span class="image">\r
-<img src="img/rss.png" alt="(RSS)" />\r
-</span>.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-Extras included with uthash\r
-</dt>\r
-<dd>\r
-<p>\r
- uthash ships with these "extras"-- independent headers similar to uthash.\r
- First <a href="utlist.html">utlist.h</a> provides linked list macros for C structures.\r
- Second, <a href="utarray.html">utarray.h</a> implements dynamic arrays using macros.\r
- Third, <a href="utstring.html">utstring.h</a> implements a basic dynamic string.\r
-</p>\r
-</dd>\r
-</dl></div>\r
-<h3 id="_who_8217_s_using_it">Who&#8217;s using it?</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>Since releasing uthash in 2006, it has been downloaded thousands of times,\r
-incorporated into commercial software, academic research, and into other\r
-open-source software.</p></div>\r
-</div>\r
-<h2 id="_your_structure">Your structure</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>In uthash, a hash table is comprised of structures. Each structure represents a\r
-key-value association. One or more of the structure fields constitute the key.\r
-The structure pointer itself is the value.</p></div>\r
-<div class="listingblock">\r
-<div class="title">Defining a structure that can be hashed</div>\r
-<div class="content">\r
-<pre><tt>#include "uthash.h"\r
-\r
-struct my_struct {\r
-    int id;                    /* key */\r
-    char name[10];\r
-    UT_hash_handle hh;         /* makes this structure hashable */\r
-};</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>Note that, in uthash, your structure will never be moved or copied into another\r
-location when you add it into a hash table. This means that you can keep other\r
-data structures that safely point to your structure-- regardless of whether you\r
-add or delete it from a hash table during your program&#8217;s lifetime.</p></div>\r
-<h3 id="_the_key">The key</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>There are no restrictions on the data type or name of the key field. The key\r
-can also comprise multiple contiguous fields, having any names and data types.</p></div>\r
-<div class="sidebarblock">\r
-<div class="sidebar-content">\r
-<div class="sidebar-title">Any data type&#8230; really?</div>\r
-<div class="paragraph"><p>Yes, your key and structure can have any data type. Unlike function calls with\r
-fixed prototypes, uthash consists of macros-- whose arguments are untyped-- and\r
-thus able to work with any type of structure or key.</p></div>\r
-</div></div>\r
-<h4 id="_unique_keys">Unique keys</h4>\r
-<div class="paragraph"><p>As with any hash, every item must have a unique key.  Your application must\r
-enforce key uniqueness. Before you add an item to the hash table, you must\r
-first know (if in doubt, check!) that the key is not already in use.  You\r
-can check whether a key already exists in the hash table using <tt>HASH_FIND</tt>.</p></div>\r
-<h3 id="_the_hash_handle">The hash handle</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>The <tt>UT_hash_handle</tt> field must be present in your structure.  It is used for\r
-the internal bookkeeping that makes the hash work.  It does not require\r
-initialization. It can be named anything, but you can simplify matters by\r
-naming it <tt>hh</tt>. This allows you to use the easier "convenience" macros to add,\r
-find and delete items.</p></div>\r
-</div>\r
-<h2 id="_hash_operations">Hash operations</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>This section introduces the uthash macros by example. For a more succinct\r
-listing, see <a href="#Macro_reference">Macro Reference</a>.</p></div>\r
-<div class="sidebarblock">\r
-<div class="sidebar-content">\r
-<div class="sidebar-title">Convenience vs. general macros:</div>\r
-<div class="paragraph"><p>The uthash macros fall into two categories. The <em>convenience</em> macros can be used\r
-with integer, pointer or string keys (and require that you chose the conventional\r
-name <tt>hh</tt> for the <tt>UT_hash_handle</tt> field).  The convenience macros take fewer\r
-arguments than the general macros, making their usage a bit simpler for these\r
-common types of keys.</p></div>\r
-<div class="paragraph"><p>The <em>general</em> macros can be used for any types of keys, or for multi-field keys,\r
-or when the <tt>UT_hash_handle</tt> has been named something other than <tt>hh</tt>. These\r
-macros take more arguments and offer greater flexibility in return. But if the\r
-convenience macros suit your needs, use them-- your code will be more readable.</p></div>\r
-</div></div>\r
-<h3 id="_declare_the_hash">Declare the hash</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>Your hash must be declared as a <tt>NULL</tt>-initialized pointer to your structure.</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>struct my_struct *users = NULL;    /* important! initialize to NULL */</tt></pre>\r
-</div></div>\r
-<h3 id="_add_item">Add item</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>Allocate and initialize your structure as you see fit. The only aspect\r
-of this that matters to uthash is that your key must be initialized to\r
-a unique value. Then call <tt>HASH_ADD</tt>. (Here we use the convenience macro\r
-<tt>HASH_ADD_INT</tt>, which offers simplified usage for keys of type <tt>int</tt>).</p></div>\r
-<div class="listingblock">\r
-<div class="title">Add an item to a hash</div>\r
-<div class="content">\r
-<pre><tt>void add_user(int user_id, char *name) {\r
-    struct my_struct *s;\r
-\r
-    s = malloc(sizeof(struct my_struct));\r
-    s-&gt;id = user_id;\r
-    strcpy(s-&gt;name, name);\r
-    HASH_ADD_INT( users, id, s );  /* id: name of key field */\r
-}</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>The first parameter to <tt>HASH_ADD_INT</tt> is the hash table, and the\r
-second parameter is the <em>name</em> of the key field. Here, this is <tt>id</tt>. The\r
-last parameter is a pointer to the structure being added.</p></div>\r
-<div class="sidebarblock" id="validc">\r
-<div class="sidebar-content">\r
-<div class="sidebar-title">Wait.. the field name is a parameter?</div>\r
-<div class="paragraph"><p>If you find it strange that <tt>id</tt>, which is the <em>name of a field</em> in the\r
-structure, can be passed as a parameter, welcome to the world of macros. Don&#8217;t\r
-worry- the C preprocessor expands this to valid C code.</p></div>\r
-</div></div>\r
-<h4 id="_key_must_not_be_modified_while_in_use">Key must not be modified while in-use</h4>\r
-<div class="paragraph"><p>Once a structure has been added to the hash, do not change the value of its key.\r
-Instead, delete the item from the hash, change the key, and then re-add it.</p></div>\r
-<h3 id="_find_item">Find item</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>To look up a structure in a hash, you need its key.  Then call <tt>HASH_FIND</tt>.\r
-(Here we use the convenience macro <tt>HASH_FIND_INT</tt> for keys of type <tt>int</tt>).</p></div>\r
-<div class="listingblock">\r
-<div class="title">Find a structure using its key</div>\r
-<div class="content">\r
-<pre><tt>struct my_struct *find_user(int user_id) {\r
-    struct my_struct *s;\r
-\r
-    HASH_FIND_INT( users, &amp;user_id, s );  /* s: output pointer */\r
-    return s;\r
-}</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>Here, the hash table is <tt>users</tt>, and <tt>&amp;user_id</tt> points to the key (an integer\r
-in this case).  Last, <tt>s</tt> is the <em>output</em> variable of <tt>HASH_FIND_INT</tt>. The\r
-final result is that <tt>s</tt> points to the structure with the given key, or\r
-is <tt>NULL</tt> if the key wasn&#8217;t found in the hash.</p></div>\r
-<div class="admonitionblock">\r
-<table><tr>\r
-<td class="icon">\r
-<div class="title">Note</div>\r
-</td>\r
-<td class="content">The middle argument is a <em>pointer</em> to the key. You can&#8217;t pass a literal key\r
-value to <tt>HASH_FIND</tt>. Instead assign the literal value to a variable, and pass\r
-a pointer to the variable.</td>\r
-</tr></table>\r
-</div>\r
-<h3 id="_delete_item">Delete item</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>To delete a structure from a hash, you must have a pointer to it. (If you only\r
-have the key, first do a <tt>HASH_FIND</tt> to get the structure pointer).</p></div>\r
-<div class="listingblock">\r
-<div class="title">Delete an item from a hash</div>\r
-<div class="content">\r
-<pre><tt>void delete_user(struct my_struct *user) {\r
-    HASH_DEL( users, user);  /* user: pointer to deletee */\r
-    free(user);              /* optional; it's up to you! */\r
-}</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>Here again, <tt>users</tt> is the hash table, and <tt>user</tt> is a pointer to the\r
-structure we want to remove from the hash.</p></div>\r
-<h4 id="_uthash_never_frees_your_structure">uthash never frees your structure</h4>\r
-<div class="paragraph"><p>Deleting a structure just removes it from the hash table-- it doesn&#8217;t <tt>free</tt>\r
-it.  The choice of when to free your structure is entirely up to you; uthash\r
-will never free your structure.</p></div>\r
-<h4 id="_delete_can_change_the_pointer">Delete can change the pointer</h4>\r
-<div class="paragraph"><p>The hash table pointer (which initially points to the first item added to the\r
-hash) can change in response to <tt>HASH_DEL</tt> (i.e. if you delete the first item\r
-in the hash table).</p></div>\r
-<h4 id="_iterative_deletion">Iterative deletion</h4>\r
-<div class="paragraph"><p>The <tt>HASH_ITER</tt> macro is a deletion-safe iteration construct which expands\r
-to a simple <em>for</em> loop.</p></div>\r
-<div class="listingblock">\r
-<div class="title">Delete all items from a hash</div>\r
-<div class="content">\r
-<pre><tt>void delete_all() {\r
-  struct my_struct *current_user, *tmp;\r
-\r
-  HASH_ITER(hh, users, current_user, tmp) {\r
-    HASH_DEL(users,current_user);  /* delete; users advances to next */\r
-    free(current_user);            /* optional- if you want to free  */\r
-  }\r
-}</tt></pre>\r
-</div></div>\r
-<h4 id="_all_at_once_deletion">All-at-once deletion</h4>\r
-<div class="paragraph"><p>If you only want to delete all the items, but not free them or do any\r
-per-element clean up, you can do this more efficiently in a single operation:</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>HASH_CLEAR(hh,users);</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>Afterward, the list head (here, <tt>users</tt>) will be set to <tt>NULL</tt>.</p></div>\r
-<h3 id="_count_items">Count items</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>The number of items in the hash table can be obtained using <tt>HASH_COUNT</tt>:</p></div>\r
-<div class="listingblock">\r
-<div class="title">Count of items in the hash table</div>\r
-<div class="content">\r
-<pre><tt>unsigned int num_users;\r
-num_users = HASH_COUNT(users);\r
-printf("there are %u users\n", num_users);</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>Incidentally, this works even the list (<tt>users</tt>, here) is <tt>NULL</tt>, in\r
-which case the count is 0.</p></div>\r
-<h3 id="_iterating_and_sorting">Iterating and sorting</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>You can loop over the items in the hash by starting from the beginning and\r
-following the <tt>hh.next</tt> pointer.</p></div>\r
-<div class="listingblock">\r
-<div class="title">Iterating over all the items in a hash</div>\r
-<div class="content">\r
-<pre><tt>void print_users() {\r
-    struct my_struct *s;\r
-\r
-    for(s=users; s != NULL; s=s-&gt;hh.next) {\r
-        printf("user id %d: name %s\n", s-&gt;id, s-&gt;name);\r
-    }\r
-}</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>There is also an <tt>hh.prev</tt> pointer you could use to iterate backwards through\r
-the hash, starting from any known item.</p></div>\r
-<h4 id="deletesafe">Deletion-safe iteration</h4>\r
-<div class="paragraph"><p>In the example above, it would not be safe to delete and free <tt>s</tt> in the body\r
-of the <em>for</em> loop, (because <tt>s</tt> is derefenced each time the loop iterates).\r
-This is easy to rewrite correctly (by copying the <tt>s-&gt;hh.next</tt> pointer to a\r
-temporary variable <em>before</em> freeing <tt>s</tt>), but it comes up often enough that a\r
-deletion-safe iteration macro, <tt>HASH_ITER</tt>, is included. It expands to a\r
-<tt>for</tt>-loop header. Here is how it could be used to rewrite the last example:</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>struct my_struct *s, *tmp;</tt></pre>\r
-</div></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>HASH_ITER(hh, users, s, tmp) {\r
-    printf("user id %d: name %s\n", s-&gt;id, s-&gt;name);\r
-    /* ... it is safe to delete and free s here */\r
-}</tt></pre>\r
-</div></div>\r
-<div class="sidebarblock">\r
-<div class="sidebar-content">\r
-<div class="sidebar-title">A hash is also a doubly-linked list.</div>\r
-<div class="paragraph"><p>Iterating backward and forward through the items in the hash is possible\r
-because of the <tt>hh.prev</tt> and <tt>hh.next</tt> fields. All the items in the hash can\r
-be reached by repeatedly following these pointers, thus the hash is also a\r
-doubly-linked list.</p></div>\r
-</div></div>\r
-<div class="paragraph"><p>If you&#8217;re using uthash in a C++ program, you need an extra cast on the <tt>for</tt>\r
-iterator, e.g., <tt>s=(struct my_struct*)s-&gt;hh.next</tt>.</p></div>\r
-<h4 id="_sorted_iteration">Sorted iteration</h4>\r
-<div class="paragraph"><p>The items in the hash are, by default, traversed in the order they were added\r
-("insertion order") when you follow the <tt>hh.next</tt> pointer. But you can sort\r
-the items into a new order using <tt>HASH_SORT</tt>. E.g.,</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>HASH_SORT( users, name_sort );</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>The second argument is a pointer to a comparison function. It must accept two\r
-arguments which are pointers to two items to compare. Its return value should\r
-be less than zero, zero, or greater than zero, if the first item sorts before,\r
-equal to, or after the second item, respectively. (Just like <tt>strcmp</tt>).</p></div>\r
-<div class="listingblock">\r
-<div class="title">Sorting the items in the hash</div>\r
-<div class="content">\r
-<pre><tt>int name_sort(struct my_struct *a, struct my_struct *b) {\r
-    return strcmp(a-&gt;name,b-&gt;name);\r
-}\r
-\r
-int id_sort(struct my_struct *a, struct my_struct *b) {\r
-    return (a-&gt;id - b-&gt;id);\r
-}\r
-\r
-void sort_by_name() {\r
-    HASH_SORT(users, name_sort);\r
-}\r
-\r
-void sort_by_id() {\r
-    HASH_SORT(users, id_sort);\r
-}</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>When the items in the hash are sorted, the first item may change position.  In\r
-the example above, <tt>users</tt> may point to a different structure after calling\r
-<tt>HASH_SORT</tt>.</p></div>\r
-<h3 id="_a_complete_example">A complete example</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>We&#8217;ll repeat all the code and embellish it with a <tt>main()</tt> function to form a\r
-working example.</p></div>\r
-<div class="paragraph"><p>If this code was placed in a file called <tt>example.c</tt> in the same directory as\r
-<tt>uthash.h</tt>, it could be compiled and run like this:</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>cc -o example example.c\r
-./example</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>Follow the prompts to try the program, and type <tt>Ctrl-C</tt> when done.</p></div>\r
-<div class="listingblock">\r
-<div class="title">A complete program (part 1 of 2)</div>\r
-<div class="content">\r
-<pre><tt>#include &lt;stdio.h&gt;   /* gets */\r
-#include &lt;stdlib.h&gt;  /* atoi, malloc */\r
-#include &lt;string.h&gt;  /* strcpy */\r
-#include "uthash.h"\r
-\r
-struct my_struct {\r
-    int id;                    /* key */\r
-    char name[10];\r
-    UT_hash_handle hh;         /* makes this structure hashable */\r
-};\r
-\r
-struct my_struct *users = NULL;\r
-\r
-void add_user(int user_id, char *name) {\r
-    struct my_struct *s;\r
-\r
-    s = malloc(sizeof(struct my_struct));\r
-    s-&gt;id = user_id;\r
-    strcpy(s-&gt;name, name);\r
-    HASH_ADD_INT( users, id, s );  /* id: name of key field */\r
-}\r
-\r
-struct my_struct *find_user(int user_id) {\r
-    struct my_struct *s;\r
-\r
-    HASH_FIND_INT( users, &amp;user_id, s );  /* s: output pointer */\r
-    return s;\r
-}\r
-\r
-void delete_user(struct my_struct *user) {\r
-    HASH_DEL( users, user);  /* user: pointer to deletee */\r
-    free(user);\r
-}\r
-\r
-void delete_all() {\r
-  struct my_struct *current_user, *tmp;\r
-\r
-  HASH_ITER(hh, users, current_user, tmp) {\r
-    HASH_DEL(users,current_user);  /* delete it (users advances to next) */\r
-    free(current_user);            /* free it */\r
-  }\r
-}\r
-\r
-void print_users() {\r
-    struct my_struct *s;\r
-\r
-    for(s=users; s != NULL; s=s-&gt;hh.next) {\r
-        printf("user id %d: name %s\n", s-&gt;id, s-&gt;name);\r
-    }\r
-}\r
-\r
-int name_sort(struct my_struct *a, struct my_struct *b) {\r
-    return strcmp(a-&gt;name,b-&gt;name);\r
-}\r
-\r
-int id_sort(struct my_struct *a, struct my_struct *b) {\r
-    return (a-&gt;id - b-&gt;id);\r
-}</tt></pre>\r
-</div></div>\r
-<div class="listingblock">\r
-<div class="title">A complete program (part 2 of 2)</div>\r
-<div class="content">\r
-<pre><tt>void sort_by_name() {\r
-    HASH_SORT(users, name_sort);\r
-}\r
-\r
-void sort_by_id() {\r
-    HASH_SORT(users, id_sort);\r
-}\r
-\r
-int main(int argc, char *argv[]) {\r
-    char in[10];\r
-    int id=1;\r
-    struct my_struct *s;\r
-    unsigned num_users;\r
-\r
-    while (1) {\r
-        printf("1. add user\n");\r
-        printf("2. find user\n");\r
-        printf("3. delete user\n");\r
-        printf("4. delete all users\n");\r
-        printf("5. sort items by name\n");\r
-        printf("6. sort items by id\n");\r
-        printf("7. print users\n");\r
-        printf("8. count users\n");\r
-        gets(in);\r
-        switch(atoi(in)) {\r
-            case 1:\r
-                printf("name?\n");\r
-                add_user(id++, gets(in));\r
-                break;\r
-            case 2:\r
-                printf("id?\n");\r
-                s = find_user(atoi(gets(in)));\r
-                printf("user: %s\n", s ? s-&gt;name : "unknown");\r
-                break;\r
-            case 3:\r
-                printf("id?\n");\r
-                s = find_user(atoi(gets(in)));\r
-                if (s) delete_user(s);\r
-                else printf("id unknown\n");\r
-                break;\r
-            case 4:\r
-                delete_all();\r
-                break;\r
-            case 5:\r
-                sort_by_name();\r
-                break;\r
-            case 6:\r
-                sort_by_id();\r
-                break;\r
-            case 7:\r
-                print_users();\r
-                break;\r
-            case 8:\r
-                num_users=HASH_COUNT(users);\r
-                printf("there are %u users\n", num_users);\r
-                break;\r
-        }\r
-    }\r
-}</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>This program is included in the distribution in <tt>tests/example.c</tt>. You can run\r
-<tt>make example</tt> in that directory to compile it easily.</p></div>\r
-</div>\r
-<h2 id="_standard_key_types">Standard key types</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>This section goes into specifics of how to work with different kinds of keys.\r
-You can use nearly any type of key-- integers, strings, pointers, structures, etc.</p></div>\r
-<div class="admonitionblock">\r
-<table><tr>\r
-<td class="icon">\r
-<div class="title">Note</div>\r
-</td>\r
-<td class="content">\r
-<div class="title">A note about float</div>\r
-<div class="paragraph"><p>You can use floating point keys. This comes with the same caveats as with any\r
-program that tests floating point equality. In other words, even the tiniest\r
-difference in two floating point numbers makes them distinct keys.</p></div>\r
-</td>\r
-</tr></table>\r
-</div>\r
-<h3 id="_integer_keys">Integer keys</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>The preceding examples demonstrated use of integer keys. To recap, use the\r
-convenience macros <tt>HASH_ADD_INT</tt> and <tt>HASH_FIND_INT</tt> for structures with\r
-integer keys. (The other operations such as <tt>HASH_DELETE</tt> and <tt>HASH_SORT</tt> are\r
-the same for all types of keys).</p></div>\r
-<h3 id="_string_keys">String keys</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>If your structure has a string key, the operations to use depend on whether your\r
-structure <em>points to</em> the key (<tt>char *</tt>) or the string resides <tt>within</tt> the\r
-structure (<tt>char a[10]</tt>).  <strong>This distinction is important</strong>.  As we&#8217;ll see below,\r
-you need to use <tt>HASH_ADD_KEYPTR</tt> when your structure <em>points</em> to a key (that is,\r
-the key itself is <em>outside</em> of the structure); in contrast, use <tt>HASH_ADD_STR</tt>\r
-for a string key that is contained <strong>within</strong> your structure.</p></div>\r
-<div class="admonitionblock">\r
-<table><tr>\r
-<td class="icon">\r
-<div class="title">Note</div>\r
-</td>\r
-<td class="content">\r
-<div class="title">char[ ] vs. char*</div>\r
-<div class="paragraph"><p>The string is <em>within</em> the structure in the first example below-- <tt>name</tt> is a\r
-<tt>char[10]</tt> field.  In the second example, the key is <em>outside</em> of the\r
-structure-- <tt>name</tt> is a <tt>char *</tt>. So the first example uses <tt>HASH_ADD_STR</tt> but\r
-the second example uses <tt>HASH_ADD_KEYPTR</tt>.  For information on this macro, see\r
-the <a href="#Macro_reference">Macro reference</a>.</p></div>\r
-</td>\r
-</tr></table>\r
-</div>\r
-<h4 id="_string_em_within_em_structure">String <em>within</em> structure</h4>\r
-<div class="listingblock">\r
-<div class="title">A string-keyed hash (string within structure)</div>\r
-<div class="content">\r
-<pre><tt>#include &lt;string.h&gt;  /* strcpy */\r
-#include &lt;stdlib.h&gt;  /* malloc */\r
-#include &lt;stdio.h&gt;   /* printf */\r
-#include "uthash.h"\r
-\r
-struct my_struct {\r
-    char name[10];             /* key (string is WITHIN the structure) */\r
-    int id;\r
-    UT_hash_handle hh;         /* makes this structure hashable */\r
-};\r
-\r
-\r
-int main(int argc, char *argv[]) {\r
-    char **n, *names[] = { "joe", "bob", "betty", NULL };\r
-    struct my_struct *s, *users = NULL;\r
-    int i=0;\r
-\r
-    for (n = names; *n != NULL; n++) {\r
-        s = malloc(sizeof(struct my_struct));\r
-        strcpy(s-&gt;name, *n);\r
-        s-&gt;id = i++;\r
-        HASH_ADD_STR( users, name, s );\r
-    }\r
-\r
-    HASH_FIND_STR( users, "betty", s);\r
-    if (s) printf("betty's id is %d\n", s-&gt;id);\r
-}</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>This example is included in the distribution in <tt>tests/test15.c</tt>. It prints:</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>betty's id is 2</tt></pre>\r
-</div></div>\r
-<h4 id="_string_em_pointer_em_in_structure">String <em>pointer</em> in structure</h4>\r
-<div class="paragraph"><p>Now, here is the same example but using a <tt>char *</tt> key instead of <tt>char [ ]</tt>:</p></div>\r
-<div class="listingblock">\r
-<div class="title">A string-keyed hash (structure points to string)</div>\r
-<div class="content">\r
-<pre><tt>#include &lt;string.h&gt;  /* strcpy */\r
-#include &lt;stdlib.h&gt;  /* malloc */\r
-#include &lt;stdio.h&gt;   /* printf */\r
-#include "uthash.h"\r
-\r
-struct my_struct {\r
-    char *name;                /* key (structure POINTS TO string */\r
-    int id;\r
-    UT_hash_handle hh;         /* makes this structure hashable */\r
-};\r
-\r
-\r
-int main(int argc, char *argv[]) {\r
-    char **n, *names[] = { "joe", "bob", "betty", NULL };\r
-    struct my_struct *s, *users = NULL;\r
-    int i=0;\r
-\r
-    for (n = names; *n != NULL; n++) {\r
-        s = (struct my_struct*)malloc(sizeof(struct my_struct));\r
-        s-&gt;name = *n;\r
-        s-&gt;id = i++;\r
-        HASH_ADD_KEYPTR( hh, users, s-&gt;name, strlen(s-&gt;name), s );\r
-    }\r
-\r
-    HASH_FIND_STR( users, "betty", s);\r
-    if (s) printf("betty's id is %d\n", s-&gt;id);\r
-   return 0;\r
-}</tt></pre>\r
-</div></div>\r
-<h3 id="_pointer_keys">Pointer keys</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>Your key can be a pointer. To be very clear, this means the <em>pointer itself</em>\r
-can be the key (in contrast, if the thing <em>pointed to</em> is the key, this is a\r
-different use case handled by <tt>HASH_ADD_KEYPTR</tt>).</p></div>\r
-<div class="paragraph"><p>Here is a simple example where a structure has a pointer member, called <tt>key</tt>.</p></div>\r
-<div class="listingblock">\r
-<div class="title">A pointer key</div>\r
-<div class="content">\r
-<pre><tt>#include &lt;stdio.h&gt;\r
-#include &lt;stdlib.h&gt;\r
-#include "uthash.h"\r
-\r
-typedef struct {\r
-  void *key;\r
-  int i;\r
-  UT_hash_handle hh;\r
-} el_t;\r
-\r
-el_t *hash = NULL;\r
-char *someaddr = NULL;\r
-\r
-int main() {\r
-  el_t *d;\r
-  el_t *e = (el_t*)malloc(sizeof(el_t));\r
-  if (!e) return -1;\r
-  e-&gt;key = (void*)someaddr;\r
-  e-&gt;i = 1;\r
-  HASH_ADD_PTR(hash,key,e);\r
-  HASH_FIND_PTR(hash, &amp;someaddr, d);\r
-  if (d) printf("found\n");\r
-  free(e);\r
-  return 0;\r
-}</tt></pre>\r
-</div></div>\r
-<h3 id="_structure_keys">Structure keys</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>Your key field can have any data type. To uthash, it is just a sequence of\r
-bytes.  Therefore, even a nested structure can be used as a key. We&#8217;ll use the\r
-general macros <tt>HASH_ADD</tt> and <tt>HASH_FIND</tt> to demonstrate.</p></div>\r
-<div class="admonitionblock">\r
-<table><tr>\r
-<td class="icon">\r
-<div class="title">Note</div>\r
-</td>\r
-<td class="content">Structures contain padding (wasted internal space used to fulfill\r
-alignment requirements for the members of the structure). These padding bytes\r
-<em>must be zeroed</em> before adding an item to the hash or looking up an item.\r
-Therefore always zero the whole structure before setting the members of\r
-interest. The example below does this-- see the two calls to <tt>memset</tt>.</td>\r
-</tr></table>\r
-</div>\r
-<div class="listingblock">\r
-<div class="title">A key which is a structure</div>\r
-<div class="content">\r
-<pre><tt>#include &lt;stdlib.h&gt;\r
-#include &lt;stdio.h&gt;\r
-#include "uthash.h"\r
-\r
-typedef struct {   /* this structure will be our key */\r
-  char a;\r
-  int b;\r
-} record_key_t;\r
-\r
-typedef struct {  /* the hash is comprised of these */\r
-    record_key_t key;\r
-    /* ... other data ... */\r
-    UT_hash_handle hh;\r
-} record_t;\r
-\r
-int main(int argc, char *argv[]) {\r
-    record_t l, *p, *r, *records = NULL;\r
-\r
-    r = (record_t*)malloc( sizeof(record_t) );\r
-    memset(r, 0, sizeof(record_t)); /* zero fill! */\r
-    r-&gt;key.a = 'a';\r
-    r-&gt;key.b = 1;\r
-    HASH_ADD(hh, records, key, sizeof(record_key_t), r);\r
-\r
-    memset(&amp;l, 0, sizeof(record_t)); /* zero fill! */\r
-    l.key.a = 'a';\r
-    l.key.b = 1;\r
-    HASH_FIND(hh, records, &amp;l.key, sizeof(record_key_t), p);\r
-\r
-    if (p) printf("found %c %d\n", p-&gt;key.a, p-&gt;key.b);\r
-    return 0;\r
-}</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>This usage is nearly the same as use of a compound key explained below.</p></div>\r
-<div class="paragraph"><p>Note that the general macros require the name of the <tt>UT_hash_handle</tt> to be\r
-passed as the first argument (here, this is <tt>hh</tt>). The general macros are\r
-documented in <a href="#Macro_reference">Macro Reference</a>.</p></div>\r
-</div>\r
-<h2 id="_advanced_topics">Advanced Topics</h2>\r
-<div class="sectionbody">\r
-<h3 id="_compound_keys">Compound keys</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>Your key can even comprise multiple contiguous fields.</p></div>\r
-<div class="listingblock">\r
-<div class="title">A multi-field key</div>\r
-<div class="content">\r
-<pre><tt>#include &lt;stdlib.h&gt;    /* malloc       */\r
-#include &lt;stddef.h&gt;    /* offsetof     */\r
-#include &lt;stdio.h&gt;     /* printf       */\r
-#include &lt;string.h&gt;    /* memset       */\r
-#include "uthash.h"\r
-\r
-#define UTF32 1\r
-\r
-typedef struct {\r
-  UT_hash_handle hh;\r
-  int len;\r
-  char encoding;      /* these two fields */\r
-  int text[];         /* comprise the key */\r
-} msg_t;\r
-\r
-int main(int argc, char *argv[]) {\r
-    int keylen;\r
-    msg_t *msg, *msgs = NULL;\r
-    struct { char encoding; int text[]; } *lookup_key;\r
-\r
-    int beijing[] = {0x5317, 0x4eac};   /* UTF-32LE for åŒ—京 */\r
-\r
-    /* allocate and initialize our structure */\r
-    msg = malloc( sizeof(msg_t) + sizeof(beijing) );\r
-    memset(msg, 0, sizeof(msg_t)+sizeof(beijing)); /* zero fill */\r
-    msg-&gt;len = sizeof(beijing);\r
-    msg-&gt;encoding = UTF32;\r
-    memcpy(msg-&gt;text, beijing, sizeof(beijing));\r
-\r
-    /* calculate the key length including padding, using formula */\r
-    keylen =   offsetof(msg_t, text)       /* offset of last key field */\r
-             + sizeof(beijing)             /* size of last key field */\r
-             - offsetof(msg_t, encoding);  /* offset of first key field */\r
-\r
-    /* add our structure to the hash table */\r
-    HASH_ADD( hh, msgs, encoding, keylen, msg);\r
-\r
-    /* look it up to prove that it worked :-) */\r
-    msg=NULL;\r
-\r
-    lookup_key = malloc(sizeof(*lookup_key) + sizeof(beijing));\r
-    memset(lookup_key, 0, sizeof(*lookup_key) + sizeof(beijing));\r
-    lookup_key-&gt;encoding = UTF32;\r
-    memcpy(lookup_key-&gt;text, beijing, sizeof(beijing));\r
-    HASH_FIND( hh, msgs, &amp;lookup_key-&gt;encoding, keylen, msg );\r
-    if (msg) printf("found \n");\r
-    free(lookup_key);\r
-}</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>This example is included in the distribution in <tt>tests/test22.c</tt>.</p></div>\r
-<div class="paragraph"><p>If you use multi-field keys, recognize that the compiler pads adjacent fields\r
-(by inserting unused space between them) in order to fulfill the alignment\r
-requirement of each field. For example a structure containing a <tt>char</tt> followed\r
-by an <tt>int</tt> will normally have 3 "wasted" bytes of padding after the char, in\r
-order to make the <tt>int</tt> field start on a multiple-of-4 address (4 is the length\r
-of the int).</p></div>\r
-<div class="sidebarblock">\r
-<div class="sidebar-content">\r
-<div class="sidebar-title">Calculating the length of a multi-field key:</div>\r
-<div class="paragraph"><p>To determine the key length when using a multi-field key, you must include any\r
-intervening structure padding the compiler adds for alignment purposes.</p></div>\r
-<div class="paragraph"><p>An easy way to calculate the key length is to use the <tt>offsetof</tt> macro from\r
-<tt>&lt;stddef.h&gt;</tt>.  The formula is:</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>key length =   offsetof(last_key_field)\r
-             + sizeof(last_key_field)\r
-             - offsetof(first_key_field)</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>In the example above, the <tt>keylen</tt> variable is set using this formula.</p></div>\r
-</div></div>\r
-<div class="paragraph"><p>When dealing with a multi-field key, you must zero-fill your structure before\r
-<tt>HASH_ADD</tt>'ing it to a hash table, or using its fields in a <tt>HASH_FIND</tt> key.</p></div>\r
-<div class="paragraph"><p>In the previous example, <tt>memset</tt> is used to initialize the structure by\r
-zero-filling it. This zeroes out any padding between the key fields. If we\r
-didn&#8217;t zero-fill the structure, this padding would contain random values.  The\r
-random values would lead to <tt>HASH_FIND</tt> failures; as two "identical" keys will\r
-appear to mismatch if there are any differences within their padding.</p></div>\r
-<h3 id="multihash">Items in several hash tables</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>A structure can be added to more than one hash table. A few reasons you might do\r
-this include:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-each hash table may use an alternative key;\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-each hash table may have its own sort order;\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-or you might simply use multiple hash tables for grouping purposes.  E.g.,\r
-  you could have users in an <tt>admin_users</tt> and a <tt>users</tt> hash table.\r
-</p>\r
-</li>\r
-</ul></div>\r
-<div class="paragraph"><p>Your structure needs to have a <tt>UT_hash_handle</tt> field for each hash table to\r
-which it might be added. You can name them anything. E.g.,</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>UT_hash_handle hh1, hh2;</tt></pre>\r
-</div></div>\r
-<h3 id="_items_with_alternative_keys">Items with alternative keys</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>You might create a hash table keyed on an ID field, and another hash table keyed\r
-on username (if usernames are unique). You can add the same user structure to\r
-both hash tables (without duplication of the structure), allowing lookup of a\r
-user structure by their name or ID.  The way to achieve this is to have a\r
-separate <tt>UT_hash_handle</tt> for each hash to which the structure may be added.</p></div>\r
-<div class="listingblock">\r
-<div class="title">A structure with two alternative keys</div>\r
-<div class="content">\r
-<pre><tt>struct my_struct {\r
-    int id;                    /* usual key */\r
-    char username[10];         /* alternative key */\r
-    UT_hash_handle hh1;        /* handle for first hash table */\r
-    UT_hash_handle hh2;        /* handle for second hash table */\r
-};</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>In the example above, the structure can now be added to two separate hash\r
-tables. In one hash, <tt>id</tt> is its key, while in the other hash, <tt>username</tt> is\r
-its key.  (There is no requirement that the two hashes have different key\r
-fields. They could both use the same key, such as <tt>id</tt>).</p></div>\r
-<div class="paragraph"><p>Notice the structure has two hash handles (<tt>hh1</tt> and <tt>hh2</tt>).  In the code\r
-below, notice that each hash handle is used exclusively with a particular hash\r
-table.  (<tt>hh1</tt> is always used with the <tt>users_by_id</tt> hash, while <tt>hh2</tt> is\r
-always used with the <tt>users_by_name</tt> hash table).</p></div>\r
-<div class="listingblock">\r
-<div class="title">Two keys on a structure</div>\r
-<div class="content">\r
-<pre><tt>    struct my_struct *users_by_id = NULL, *users_by_name = NULL, *s;\r
-    int i;\r
-    char *name;\r
-\r
-    s = malloc(sizeof(struct my_struct));\r
-    s-&gt;id = 1;\r
-    strcpy(s-&gt;username, "thanson");\r
-\r
-    /* add the structure to both hash tables */\r
-    HASH_ADD(hh1, users_by_id, id, sizeof(int), s);\r
-    HASH_ADD(hh2, users_by_name, username, strlen(s-&gt;username), s);\r
-\r
-    /* lookup user by ID in the "users_by_id" hash table */\r
-    i=1;\r
-    HASH_FIND(hh1, users_by_id, &amp;i, sizeof(int), s);\r
-    if (s) printf("found id %d: %s\n", i, s-&gt;username);\r
-\r
-    /* lookup user by username in the "users_by_name" hash table */\r
-    name = "thanson";\r
-    HASH_FIND(hh2, users_by_name, name, strlen(name), s);\r
-    if (s) printf("found user %s: %d\n", name, s-&gt;id);</tt></pre>\r
-</div></div>\r
-<h3 id="_several_sort_orders">Several sort orders</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>It comes as no suprise that two hash tables can have different sort orders, but\r
-this fact can also be used advantageously to sort the <em>same items</em> in several\r
-ways. This is based on the ability to store a structure in several hash tables.</p></div>\r
-<div class="paragraph"><p>Extending the previous example, suppose we have many users. We have added each\r
-user structure to the <tt>users_by_id</tt> hash table and the <tt>users_by_name</tt> hash table.\r
-(To reiterate, this is done without the need to have two copies of each structure).\r
-Now we can define two sort functions, then use <tt>HASH_SRT</tt>.</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>int sort_by_id(struct my_struct *a, struct my_struct *b) {\r
-  if (a-&gt;id == b-&gt;id) return 0;\r
-  return (a-&gt;id &lt; b-&gt;id) ? -1 : 1;\r
-}</tt></pre>\r
-</div></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>int sort_by_name(struct my_struct *a, struct my_struct *b) {\r
-  return strcmp(a-&gt;username,b-&gt;username);\r
-}</tt></pre>\r
-</div></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>HASH_SRT(hh1, users_by_id, sort_by_id);\r
-HASH_SRT(hh2, users_by_name, sort_by_name);</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>Now iterating over the items in <tt>users_by_id</tt> will traverse them in id-order\r
-while, naturally, iterating over <tt>users_by_name</tt> will traverse them in\r
-name-order. The items are fully forward-and-backward linked in each order.\r
-So even for one set of users, we might store them in two hash tables to provide\r
-easy iteration in two different sort orders.</p></div>\r
-<h3 id="_bloom_filter_faster_misses">Bloom filter (faster misses)</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>Programs that generate a fair miss rate (<tt>HASH_FIND</tt> that result in <tt>NULL</tt>) may\r
-benefit from the built-in Bloom filter support. This is disabled by default,\r
-because programs that generate only hits would incur a slight penalty from it.\r
-Also, programs that do deletes should not use the Bloom filter. While the\r
-program would operate correctly, deletes diminish the benefit of the filter.\r
-To enable the Bloom filter, simply compile with <tt>-DHASH_BLOOM=n</tt> like:</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>-DHASH_BLOOM=27</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>where the number can be any value up to 32 which determines the amount of memory\r
-used by the filter, as shown below. Using more memory makes the filter more\r
-accurate and has the potential to speed up your program by making misses bail\r
-out faster.</p></div>\r
-<div class="tableblock">\r
-<table rules="none"\r
-width="50%"\r
-frame="border"\r
-cellspacing="0" cellpadding="4">\r
-<caption class="title">Table 1. Bloom filter sizes for selected values of n</caption>\r
-<col width="25%" />\r
-<col width="75%" />\r
-<thead>\r
-<tr>\r
-<th align="left" valign="top"> n   </th>\r
-<th align="left" valign="top"> Bloom filter size (per hash table)</th>\r
-</tr>\r
-</thead>\r
-<tbody>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>16</tt></p></td>\r
-<td align="left" valign="top"><p class="table">8 kilobytes</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>20</tt></p></td>\r
-<td align="left" valign="top"><p class="table">128 kilobytes</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>24</tt></p></td>\r
-<td align="left" valign="top"><p class="table">2 megabytes</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>28</tt></p></td>\r
-<td align="left" valign="top"><p class="table">32 megabytes</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>32</tt></p></td>\r
-<td align="left" valign="top"><p class="table">512 megabytes</p></td>\r
-</tr>\r
-</tbody>\r
-</table>\r
-</div>\r
-<div class="paragraph"><p>Bloom filters are only a performance feature; they do not change the results of\r
-hash operations in any way. The only way to gauge whether or not a Bloom filter\r
-is right for your program is to test it. Reasonable values for the size of the\r
-Bloom filter are 16-32 bits.</p></div>\r
-<h3 id="_select">Select</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>An experimental <em>select</em> operation is provided that inserts those items from a\r
-source hash that satisfy a given condition into a destination hash. This\r
-insertion is done with somewhat more efficiency than if this were using\r
-<tt>HASH_ADD</tt>, namely because the hash function is not recalculated for keys of the\r
-selected items.  This operation does not remove any items from the source hash.\r
-Rather the selected items obtain dual presence in both hashes.  The destination\r
-hash may already have items in it; the selected items are added to it. In order\r
-for a structure to be usable with <tt>HASH_SELECT</tt>, it must have two or more hash\r
-handles. (As described <a href="#multihash">here</a>, a structure can exist in many\r
-hash tables at the same time; it must have a separate hash handle for each one).</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>user_t *users=NULL, *admins=NULL; /* two hash tables */</tt></pre>\r
-</div></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>typedef struct {\r
-    int id;\r
-    UT_hash_handle hh;  /* handle for users hash */\r
-    UT_hash_handle ah;  /* handle for admins hash */\r
-} user_t;</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>Now suppose we have added some users, and want to select just the administrator\r
-users who have id&#8217;s less than 1024.</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>#define is_admin(x) (((user_t*)x)-&gt;id &lt; 1024)\r
-HASH_SELECT(ah,admins,hh,users,is_admin);</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>The first two parameters are the <em>destination</em> hash handle and hash table, the\r
-second two parameters are the <em>source</em> hash handle and hash table, and the last\r
-parameter is the <em>select condition</em>. Here we used a macro <tt>is_admin()</tt> but we\r
-could just as well have used a function.</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>int is_admin(void *userv) {\r
-  user_t *user = (user_t*)userv;\r
-  return (user-&gt;id &lt; 1024) ? 1 : 0;\r
-}</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>If the select condition always evaluates to true, this operation is\r
-essentially a <em>merge</em> of the source hash into the destination hash. Of course,\r
-the source hash remains unchanged under any use of <tt>HASH_SELECT</tt>. It only adds\r
-items to the destination hash selectively.</p></div>\r
-<div class="paragraph"><p>The two hash handles must differ. An example of using <tt>HASH_SELECT</tt> is included\r
-in <tt>tests/test36.c</tt>.</p></div>\r
-<h3 id="hash_functions">Built-in hash functions</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>Internally, a hash function transforms a key into a bucket number.  You don&#8217;t\r
-have to take any action to use the default hash function, currently Jenkin&#8217;s.</p></div>\r
-<div class="paragraph"><p>Some programs may benefit from using another of the built-in hash functions.\r
-There is a simple analysis utility included with uthash to help you determine\r
-if another hash function will give you better performance.</p></div>\r
-<div class="paragraph"><p>You can use a different hash function by compiling your program with\r
-<tt>-DHASH_FUNCTION=HASH_xyz</tt> where <tt>xyz</tt> is one of the symbolic names listed\r
-below. E.g.,</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>cc -DHASH_FUNCTION=HASH_BER -o program program.c</tt></pre>\r
-</div></div>\r
-<div class="tableblock">\r
-<table rules="none"\r
-width="50%"\r
-frame="border"\r
-cellspacing="0" cellpadding="4">\r
-<caption class="title">Table 2. Built-in hash functions</caption>\r
-<col width="20%" />\r
-<col width="80%" />\r
-<thead>\r
-<tr>\r
-<th align="center" valign="top">Symbol </th>\r
-<th align="left" valign="top">   Name</th>\r
-</tr>\r
-</thead>\r
-<tbody>\r
-<tr>\r
-<td align="center" valign="top"><p class="table"><tt>JEN</tt></p></td>\r
-<td align="left" valign="top"><p class="table">Jenkins (default)</p></td>\r
-</tr>\r
-<tr>\r
-<td align="center" valign="top"><p class="table"><tt>BER</tt></p></td>\r
-<td align="left" valign="top"><p class="table">Bernstein</p></td>\r
-</tr>\r
-<tr>\r
-<td align="center" valign="top"><p class="table"><tt>SAX</tt></p></td>\r
-<td align="left" valign="top"><p class="table">Shift-Add-Xor</p></td>\r
-</tr>\r
-<tr>\r
-<td align="center" valign="top"><p class="table"><tt>OAT</tt></p></td>\r
-<td align="left" valign="top"><p class="table">One-at-a-time</p></td>\r
-</tr>\r
-<tr>\r
-<td align="center" valign="top"><p class="table"><tt>FNV</tt></p></td>\r
-<td align="left" valign="top"><p class="table">Fowler/Noll/Vo</p></td>\r
-</tr>\r
-<tr>\r
-<td align="center" valign="top"><p class="table"><tt>SFH</tt></p></td>\r
-<td align="left" valign="top"><p class="table">Paul Hsieh</p></td>\r
-</tr>\r
-<tr>\r
-<td align="center" valign="top"><p class="table"><tt>MUR</tt></p></td>\r
-<td align="left" valign="top"><p class="table">MurmurHash (see note)</p></td>\r
-</tr>\r
-</tbody>\r
-</table>\r
-</div>\r
-<div class="admonitionblock">\r
-<table><tr>\r
-<td class="icon">\r
-<div class="title">Note</div>\r
-</td>\r
-<td class="content">\r
-<div class="title">MurmurHash</div>\r
-<div class="paragraph"><p>A special symbol must be defined if you intend to use MurmurHash. To use it, add\r
-<tt>-DHASH_USING_NO_STRICT_ALIASING</tt> to your <tt>CFLAGS</tt>. And, if you are using\r
-the gcc compiler with optimization, add <tt>-fno-strict-aliasing</tt> to your <tt>CFLAGS</tt>.</p></div>\r
-</td>\r
-</tr></table>\r
-</div>\r
-<h4 id="_which_hash_function_is_best">Which hash function is best?</h4>\r
-<div class="paragraph"><p>You can easily determine the best hash function for your key domain. To do so,\r
-you&#8217;ll need to run your program once in a data-collection pass, and then run\r
-the collected data through an included analysis utility.</p></div>\r
-<div class="paragraph"><p>First you must build the analysis utility. From the top-level directory,</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>cd tests/\r
-make</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>We&#8217;ll use <tt>test14.c</tt> to demonstrate the data-collection and analysis steps\r
-(here using <tt>sh</tt> syntax to redirect file descriptor 3 to a file):</p></div>\r
-<div class="listingblock">\r
-<div class="title">Using keystats</div>\r
-<div class="content">\r
-<pre><tt>% cc -DHASH_EMIT_KEYS=3 -I../src -o test14 test14.c\r
-% ./test14 3&gt;test14.keys\r
-% ./keystats test14.keys\r
-fcn  ideal%     #items   #buckets  dup%  fl   add_usec  find_usec  del-all usec\r
----  ------ ---------- ---------- -----  -- ---------- ----------  ------------\r
-SFH   91.6%       1219        256    0%  ok         92        131            25\r
-FNV   90.3%       1219        512    0%  ok        107         97            31\r
-SAX   88.7%       1219        512    0%  ok        111        109            32\r
-OAT   87.2%       1219        256    0%  ok         99        138            26\r
-JEN   86.7%       1219        256    0%  ok         87        130            27\r
-BER   86.2%       1219        256    0%  ok        121        129            27</tt></pre>\r
-</div></div>\r
-<div class="admonitionblock">\r
-<table><tr>\r
-<td class="icon">\r
-<div class="title">Note</div>\r
-</td>\r
-<td class="content">The number 3 in <tt>-DHASH_EMIT_KEYS=3</tt> is a file descriptor. Any file descriptor\r
-that your program doesn&#8217;t use for its own purposes can be used instead of 3.\r
-The data-collection mode enabled by <tt>-DHASH_EMIT_KEYS=x</tt> should not be used in\r
-production code.</td>\r
-</tr></table>\r
-</div>\r
-<div class="paragraph"><p>Usually, you should just pick the first hash function that is listed. Here, this\r
-is <tt>SFH</tt>.  This is the function that provides the most even distribution for\r
-your keys. If several have the same <tt>ideal%</tt>, then choose the fastest one\r
-according to the <tt>find_usec</tt> column.</p></div>\r
-<h4 id="_keystats_column_reference">keystats column reference</h4>\r
-<div class="dlist"><dl>\r
-<dt class="hdlist1">\r
-fcn\r
-</dt>\r
-<dd>\r
-<p>\r
-    symbolic name of hash function\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-ideal%\r
-</dt>\r
-<dd>\r
-<p>\r
-    The percentage of items in the hash table which can be looked up within an\r
-    ideal number of steps. (Further explained below).\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-#items\r
-</dt>\r
-<dd>\r
-<p>\r
-    the number of keys that were read in from the emitted key file\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-#buckets\r
-</dt>\r
-<dd>\r
-<p>\r
-    the number of buckets in the hash after all the keys were added\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-dup%\r
-</dt>\r
-<dd>\r
-<p>\r
-    the percent of duplicate keys encountered in the emitted key file.\r
-    Duplicates keys are filtered out to maintain key uniqueness. (Duplicates\r
-    are normal.  For example, if the application adds an item to a hash,\r
-    deletes it, then re-adds it, the key is written twice to the emitted file.)\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-flags\r
-</dt>\r
-<dd>\r
-<p>\r
-    this is either <tt>ok</tt>, or <tt>nx</tt> (noexpand) if the expansion inhibited flag is\r
-    set, described in <a href="#expansion">Expansion internals</a>.  It is not recommended\r
-    to use a hash function that has the <tt>noexpand</tt> flag set.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-add_usec\r
-</dt>\r
-<dd>\r
-<p>\r
-    the clock time in microseconds required to add all the keys to a hash\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-find_usec\r
-</dt>\r
-<dd>\r
-<p>\r
-    the clock time in microseconds required to look up every key in the hash\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-del-all usec\r
-</dt>\r
-<dd>\r
-<p>\r
-    the clock time in microseconds required to delete every item in the hash\r
-</p>\r
-</dd>\r
-</dl></div>\r
-<h4 id="ideal">ideal%</h4>\r
-<div class="sidebarblock">\r
-<div class="sidebar-content">\r
-<div class="sidebar-title">What is ideal%?</div>\r
-<div class="paragraph"><p>The <em>n</em> items in a hash are distributed into <em>k</em> buckets. Ideally each bucket\r
-would contain an equal share <em>(n/k)</em> of the items. In other words, the maximum\r
-linear position of any item in a bucket chain would be <em>n/k</em> if every bucket is\r
-equally used. If some buckets are overused and others are underused, the\r
-overused buckets will contain items whose linear position surpasses <em>n/k</em>.\r
-Such items are considered non-ideal.</p></div>\r
-<div class="paragraph"><p>As you might guess, <tt>ideal%</tt> is the percentage of ideal items in the hash. These\r
-items have favorable linear positions in their bucket chains.  As <tt>ideal%</tt>\r
-approaches 100%, the hash table approaches constant-time lookup performance.</p></div>\r
-</div></div>\r
-<h3 id="hashscan">hashscan</h3><div style="clear:left"></div>\r
-<div class="admonitionblock">\r
-<table><tr>\r
-<td class="icon">\r
-<div class="title">Note</div>\r
-</td>\r
-<td class="content">This utility is only available on Linux, and on FreeBSD (8.1 and up).</td>\r
-</tr></table>\r
-</div>\r
-<div class="paragraph"><p>A utility called <tt>hashscan</tt> is included in the <tt>tests/</tt> directory. It\r
-is built automatically when you run <tt>make</tt> in that directory. This tool\r
-examines a running process and reports on the uthash tables that it finds in\r
-that program&#8217;s memory. It can also save the keys from each table in a format\r
-that can be fed into <tt>keystats</tt>.</p></div>\r
-<div class="paragraph"><p>Here is an example of using <tt>hashscan</tt>. First ensure that it is built:</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>cd tests/\r
-make</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>Since <tt>hashscan</tt> needs a running program to inspect, we&#8217;ll start up a simple\r
-program that makes a hash table and then sleeps as our test subject:</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>./test_sleep &amp;\r
-pid: 9711</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>Now that we have a test program, let&#8217;s run <tt>hashscan</tt> on it:</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>./hashscan 9711\r
-Address            ideal    items  buckets mc fl bloom/sat fcn keys saved to\r
------------------- ----- -------- -------- -- -- --------- --- -------------\r
-0x862e038            81%    10000     4096 11 ok 16    14% JEN</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>If we wanted to copy out all its keys for external analysis using <tt>keystats</tt>,\r
-add the <tt>-k</tt> flag:</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>./hashscan -k 9711\r
-Address            ideal    items  buckets mc fl bloom/sat fcn keys saved to\r
------------------- ----- -------- -------- -- -- --------- --- -------------\r
-0x862e038            81%    10000     4096 11 ok 16    14% JEN /tmp/9711-0.key</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>Now we could run <tt>./keystats /tmp/9711-0.key</tt> to analyze which hash function\r
-has the best characteristics on this set of keys.</p></div>\r
-<h4 id="_hashscan_column_reference">hashscan column reference</h4>\r
-<div class="dlist"><dl>\r
-<dt class="hdlist1">\r
-Address\r
-</dt>\r
-<dd>\r
-<p>\r
-    virtual address of the hash table\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-ideal\r
-</dt>\r
-<dd>\r
-<p>\r
-    The percentage of items in the table which can be looked up within an ideal\r
-    number of steps. See <a href="#ideal">[ideal]</a> in the <tt>keystats</tt> section.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-items\r
-</dt>\r
-<dd>\r
-<p>\r
-    number of items in the hash table\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-buckets\r
-</dt>\r
-<dd>\r
-<p>\r
-    number of buckets in the hash table\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-mc\r
-</dt>\r
-<dd>\r
-<p>\r
-    the maximum chain length found in the hash table (uthash usually tries to\r
-    keep fewer than 10 items in each bucket, or in some cases a multiple of 10)\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-fl\r
-</dt>\r
-<dd>\r
-<p>\r
-    flags (either <tt>ok</tt>, or <tt>NX</tt> if the expansion-inhibited flag is set)\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-bloom/sat\r
-</dt>\r
-<dd>\r
-<p>\r
-    if the hash table uses a Bloom filter, this is the size (as a power of two)\r
-    of the filter (e.g. 16 means the filter is 2^16 bits in size). The second\r
-    number is the "saturation" of the bits expressed as a percentage. The lower\r
-    the percentage, the more potential benefit to identify cache misses quickly.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-fcn\r
-</dt>\r
-<dd>\r
-<p>\r
-    symbolic name of hash function\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-keys saved to\r
-</dt>\r
-<dd>\r
-<p>\r
-    file to which keys were saved, if any\r
-</p>\r
-</dd>\r
-</dl></div>\r
-<div class="sidebarblock">\r
-<div class="sidebar-content">\r
-<div class="sidebar-title">How hashscan works</div>\r
-<div class="paragraph"><p>When hashscan runs, it attaches itself to the target process, which suspends\r
-the target process momentarily. During this brief suspension, it scans the\r
-target&#8217;s virtual memory for the signature of a uthash hash table. It then\r
-checks if a valid hash table structure accompanies the signature and reports\r
-what it finds. When it detaches, the target process resumes running normally.\r
-The hashscan is performed "read-only"-- the target process is not modified.\r
-Since hashscan is analyzing a momentary snapshot of a running process, it may\r
-return different results from one run to another.</p></div>\r
-</div></div>\r
-<h3 id="expansion">Expansion internals</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>Internally this hash manages the number of buckets, with the goal of having\r
-enough buckets so that each one contains only a small number of items.</p></div>\r
-<div class="sidebarblock">\r
-<div class="sidebar-content">\r
-<div class="sidebar-title">Why does the number of buckets matter?</div>\r
-<div class="paragraph"><p>When looking up an item by its key, this hash scans linearly through the items\r
-in the appropriate bucket. In order for the linear scan to run in constant\r
-time, the number of items in each bucket must be bounded. This is accomplished\r
-by increasing the number of buckets as needed.</p></div>\r
-</div></div>\r
-<h4 id="_normal_expansion">Normal expansion</h4>\r
-<div class="paragraph"><p>This hash attempts to keep fewer than 10 items in each bucket. When an item is\r
-added that would cause a bucket to exceed this number, the number of buckets in\r
-the hash is doubled and the items are redistributed into the new buckets. In an\r
-ideal world, each bucket will then contain half as many items as it did before.</p></div>\r
-<div class="paragraph"><p>Bucket expansion occurs automatically and invisibly as needed. There is\r
-no need for the application to know when it occurs.</p></div>\r
-<h5 id="_per_bucket_expansion_threshold">Per-bucket expansion threshold</h5>\r
-<div class="paragraph"><p>Normally all buckets share the same threshold (10 items) at which point bucket\r
-expansion is triggered. During the process of bucket expansion, uthash can\r
-adjust this expansion-trigger threshold on a per-bucket basis if it sees that\r
-certain buckets are over-utilized.</p></div>\r
-<div class="paragraph"><p>When this threshold is adjusted, it goes from 10 to a multiple of 10 (for that\r
-particular bucket).  The multiple is based on how many times greater the actual\r
-chain length is than the ideal length. It is a practical measure to reduce\r
-excess bucket expansion in the case where a hash function over-utilizes a few\r
-buckets but has good overall distribution. However, if the overall distribution\r
-gets too bad, uthash changes tactics.</p></div>\r
-<h4 id="_inhibited_expansion">Inhibited expansion</h4>\r
-<div class="paragraph"><p>You usually don&#8217;t need to know or worry about this, particularly if you used\r
-the <tt>keystats</tt> utility during development to select a good hash for your keys.</p></div>\r
-<div class="paragraph"><p>A hash function may yield an uneven distribution of items across the buckets.\r
-In moderation this is not a problem. Normal bucket expansion takes place as\r
-the chain lengths grow. But when significant imbalance occurs (because the hash\r
-function is not well suited to the key domain), bucket expansion may be\r
-ineffective at reducing the chain lengths.</p></div>\r
-<div class="paragraph"><p>Imagine a very bad hash function which always puts every item in bucket 0. No\r
-matter how many times the number of buckets is doubled, the chain length of\r
-bucket 0 stays the same. In a situation like this, the best behavior is to\r
-stop expanding, and accept O(n) lookup performance. This is what uthash\r
-does. It degrades gracefully if the hash function is ill-suited to the keys.</p></div>\r
-<div class="paragraph"><p>If two consecutive bucket expansions yield <tt>ideal%</tt> values below 50%, uthash\r
-inhibits expansion for that hash table.  Once set, the <em>bucket expansion\r
-inhibited</em> flag remains in effect as long as the hash has items in it.\r
-Inhibited expansion may cause <tt>HASH_FIND</tt> to exhibit worse than constant-time\r
-performance.</p></div>\r
-<h3 id="_hooks">Hooks</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>You don&#8217;t need to use these hooks- they are only here if you want to modify\r
-the behavior of uthash.  Hooks can be used to change how uthash allocates\r
-memory, and to run code in response to certain internal events.</p></div>\r
-<h4 id="_malloc_free">malloc/free</h4>\r
-<div class="paragraph"><p>By default this hash implementation uses <tt>malloc</tt> and <tt>free</tt> to manage memory.\r
-If your application uses its own custom allocator, this hash can use them too.</p></div>\r
-<div class="listingblock">\r
-<div class="title">Specifying alternate memory management functions</div>\r
-<div class="content">\r
-<pre><tt>#include "uthash.h"\r
-\r
-/* undefine the defaults */\r
-#undef uthash_malloc\r
-#undef uthash_free\r
-\r
-/* re-define, specifying alternate functions */\r
-#define uthash_malloc(sz) my_malloc(sz)\r
-#define uthash_free(ptr,sz) my_free(ptr)\r
-\r
-...</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>Notice that <tt>uthash_free</tt> receives two parameters. The <tt>sz</tt> parameter is for\r
-convenience on embedded platforms that manage their own memory.</p></div>\r
-<h4 id="_out_of_memory">Out of memory</h4>\r
-<div class="paragraph"><p>If memory allocation fails (i.e., the malloc function returned <tt>NULL</tt>), the\r
-default behavior is to terminate the process by calling <tt>exit(-1)</tt>. This can\r
-be modified by re-defining the <tt>uthash_fatal</tt> macro.</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>#undef uthash_fatal\r
-#define uthash_fatal(msg) my_fatal_function(msg);</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>The fatal function should terminate the process or <tt>longjmp</tt> back to a safe\r
-place. Uthash does not support "returning a failure" if memory cannot be\r
-allocated.</p></div>\r
-<h4 id="_internal_events">Internal events</h4>\r
-<div class="paragraph"><p>There is no need for the application to set these hooks or take action in\r
-response to these events. They are mainly for diagnostic purposes.</p></div>\r
-<div class="paragraph"><p>These two hooks are "notification" hooks which get executed if uthash is\r
-expanding buckets, or setting the <em>bucket expansion inhibited</em> flag. Normally\r
-both of these hooks are undefined and thus compile away to nothing.</p></div>\r
-<h5 id="_expansion">Expansion</h5>\r
-<div class="paragraph"><p>There is a hook for the bucket expansion event.</p></div>\r
-<div class="listingblock">\r
-<div class="title">Bucket expansion hook</div>\r
-<div class="content">\r
-<pre><tt>#include "uthash.h"\r
-\r
-#undef uthash_expand_fyi\r
-#define uthash_expand_fyi(tbl) printf("expanded to %d buckets\n", tbl-&gt;num_buckets)\r
-\r
-...</tt></pre>\r
-</div></div>\r
-<h5 id="_expansion_inhibition">Expansion-inhibition</h5>\r
-<div class="paragraph"><p>This hook can be defined to code to execute in the event that uthash decides to\r
-set the <em>bucket expansion inhibited</em> flag.</p></div>\r
-<div class="listingblock">\r
-<div class="title">Bucket expansion inhibited hook</div>\r
-<div class="content">\r
-<pre><tt>#include "uthash.h"\r
-\r
-#undef uthash_noexpand_fyi\r
-#define uthash_noexpand_fyi printf("warning: bucket expansion inhibited\n");\r
-\r
-...</tt></pre>\r
-</div></div>\r
-<h3 id="_debug_mode">Debug mode</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>If a program that uses this hash is compiled with <tt>-DHASH_DEBUG=1</tt>, a special\r
-internal consistency-checking mode is activated.  In this mode, the integrity\r
-of the whole hash is checked following every add or delete operation.  This is\r
-for debugging the uthash software only, not for use in production code.</p></div>\r
-<div class="paragraph"><p>In the <tt>tests/</tt> directory, running <tt>make debug</tt> will run all the tests in\r
-this mode.</p></div>\r
-<div class="paragraph"><p>In this mode, any internal errors in the hash data structure will cause a\r
-message to be printed to <tt>stderr</tt> and the program to exit.</p></div>\r
-<div class="paragraph"><p>The <tt>UT_hash_handle</tt> data structure includes <tt>next</tt>, <tt>prev</tt>, <tt>hh_next</tt> and\r
-<tt>hh_prev</tt> fields.  The former two fields determine the "application" ordering\r
-(that is, insertion order-- the order the items were added).  The latter two\r
-fields determine the "bucket chain" order.  These link the <tt>UT_hash_handles</tt>\r
-together in a doubly-linked list that is a bucket chain.</p></div>\r
-<div class="paragraph"><p>Checks performed in <tt>-DHASH_DEBUG=1</tt> mode:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-the hash is walked in its entirety twice: once in <em>bucket</em> order and a\r
-  second time in <em>application</em> order\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-the total number of items encountered in both walks is checked against the\r
-  stored number\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-during the walk in <em>bucket</em> order, each item&#8217;s <tt>hh_prev</tt> pointer is compared\r
-  for equality with the last visited item\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-during the walk in <em>application</em> order, each item&#8217;s <tt>prev</tt> pointer is compared\r
-  for equality with the last visited item\r
-</p>\r
-</li>\r
-</ul></div>\r
-<div class="sidebarblock">\r
-<div class="sidebar-content">\r
-<div class="sidebar-title">Macro debugging:</div>\r
-<div class="paragraph"><p>Sometimes it&#8217;s difficult to interpret a compiler warning on a line which\r
-contains a macro call.  In the case of uthash, one macro can expand to dozens of\r
-lines. In this case, it is helpful to expand the macros and then recompile.\r
-By doing so, the warning message will refer to the exact line within the macro.</p></div>\r
-<div class="paragraph"><p>Here is an example of how to expand the macros and then recompile. This uses the\r
-<tt>test1.c</tt> program in the <tt>tests/</tt> subdirectory.</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>gcc -E -I../src test1.c &gt; /tmp/a.c\r
-egrep -v '^#' /tmp/a.c &gt; /tmp/b.c\r
-indent /tmp/b.c\r
-gcc -o /tmp/b /tmp/b.c</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>The last line compiles the original program (test1.c) with all macros expanded.\r
-If there was a warning, the referenced line number can be checked in <tt>/tmp/b.c</tt>.</p></div>\r
-</div></div>\r
-<h3 id="_thread_safety">Thread safety</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>You can use uthash in a threaded program. But you must do the locking. Use a\r
-read-write lock to protect against concurrent writes. It is ok to have\r
-concurrent readers (since uthash 1.5).</p></div>\r
-<div class="paragraph"><p>For example using pthreads you can create an rwlock like this:</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>pthread_rwlock_t lock;\r
-if (pthread_rwlock_init(&amp;lock,NULL) != 0) fatal("can't create rwlock");</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>Then, readers must acquire the read lock before doing any <tt>HASH_FIND</tt> calls or\r
-before iterating over the hash elements:</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>if (pthread_rwlock_rdlock(&amp;lock) != 0) fatal("can't get rdlock");\r
-HASH_FIND_INT(elts, &amp;i, e);\r
-pthread_rwlock_unlock(&amp;lock);</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>Writers must acquire the exclusive write lock before doing any update. Add,\r
-delete, and sort are all updates that must be locked.</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>if (pthread_rwlock_wrlock(&amp;lock) != 0) fatal("can't get wrlock");\r
-HASH_DEL(elts, e);\r
-pthread_rwlock_unlock(&amp;lock);</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>If you prefer, you can use a mutex instead of a read-write lock, but this will\r
-reduce reader concurrency to a single thread at a time.</p></div>\r
-<div class="paragraph"><p>An example program using uthash with a read-write lock is included in\r
-<tt>tests/threads/test1.c</tt>.</p></div>\r
-</div>\r
-<h2 id="Macro_reference">Macro reference</h2>\r
-<div class="sectionbody">\r
-<h3 id="_convenience_macros">Convenience macros</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>The convenience macros do the same thing as the generalized macros, but\r
-require fewer arguments.</p></div>\r
-<div class="paragraph"><p>In order to use the convenience macros,</p></div>\r
-<div class="olist arabic"><ol class="arabic">\r
-<li>\r
-<p>\r
-the structure&#8217;s <tt>UT_hash_handle</tt> field must be named <tt>hh</tt>, and\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-for add or find, the key field must be of type <tt>int</tt> or <tt>char[]</tt> or pointer\r
-</p>\r
-</li>\r
-</ol></div>\r
-<div class="tableblock">\r
-<table rules="none"\r
-width="90%"\r
-frame="border"\r
-cellspacing="0" cellpadding="4">\r
-<caption class="title">Table 3. Convenience macros</caption>\r
-<col width="25%" />\r
-<col width="75%" />\r
-<thead>\r
-<tr>\r
-<th align="left" valign="top">macro         </th>\r
-<th align="left" valign="top"> arguments</th>\r
-</tr>\r
-</thead>\r
-<tbody>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_ADD_INT</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(head, keyfield_name, item_ptr)</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_FIND_INT</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(head, key_ptr, item_ptr)</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_ADD_STR</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(head, keyfield_name, item_ptr)</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_FIND_STR</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(head, key_ptr, item_ptr)</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_ADD_PTR</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(head, keyfield_name, item_ptr)</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_FIND_PTR</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(head, key_ptr, item_ptr)</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_DEL</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(head, item_ptr)</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_SORT</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(head, cmp)</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_COUNT</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(head)</tt></p></td>\r
-</tr>\r
-</tbody>\r
-</table>\r
-</div>\r
-<h3 id="_general_macros">General macros</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>These macros add, find, delete and sort the items in a hash.  You need to\r
-use the general macros if your <tt>UT_hash_handle</tt> is named something other\r
-than <tt>hh</tt>, or if your key&#8217;s data type isn&#8217;t <tt>int</tt> or <tt>char[]</tt>.</p></div>\r
-<div class="tableblock">\r
-<table rules="none"\r
-width="90%"\r
-frame="border"\r
-cellspacing="0" cellpadding="4">\r
-<caption class="title">Table 4. General macros</caption>\r
-<col width="25%" />\r
-<col width="75%" />\r
-<thead>\r
-<tr>\r
-<th align="left" valign="top">macro          </th>\r
-<th align="left" valign="top"> arguments</th>\r
-</tr>\r
-</thead>\r
-<tbody>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_ADD</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(hh_name, head, keyfield_name, key_len, item_ptr)</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_ADD_KEYPTR</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(hh_name, head, key_ptr, key_len, item_ptr)</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_FIND</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(hh_name, head, key_ptr, key_len, item_ptr)</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_DELETE</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(hh_name, head, item_ptr)</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_SRT</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(hh_name, head, cmp)</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_CNT</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(hh_name, head)</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_CLEAR</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(hh_name, head)</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_SELECT</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(dst_hh_name, dst_head, src_hh_name, src_head, condition)</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>HASH_ITER</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>(hh_name, head, item_ptr, tmp_item_ptr)</tt></p></td>\r
-</tr>\r
-</tbody>\r
-</table>\r
-</div>\r
-<div class="admonitionblock">\r
-<table><tr>\r
-<td class="icon">\r
-<div class="title">Note</div>\r
-</td>\r
-<td class="content"><tt>HASH_ADD_KEYPTR</tt> is used when the structure contains a pointer to the\r
-key, rather than the key itself.</td>\r
-</tr></table>\r
-</div>\r
-<h4 id="_argument_descriptions">Argument descriptions</h4>\r
-<div class="dlist"><dl>\r
-<dt class="hdlist1">\r
-hh_name\r
-</dt>\r
-<dd>\r
-<p>\r
-    name of the <tt>UT_hash_handle</tt> field in the structure. Conventionally called\r
-    <tt>hh</tt>.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-head\r
-</dt>\r
-<dd>\r
-<p>\r
-    the structure pointer variable which acts as the "head" of the hash. So\r
-    named because it initially points to the first item that is added to the hash.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-keyfield_name\r
-</dt>\r
-<dd>\r
-<p>\r
-    the name of the key field in the structure. (In the case of a multi-field\r
-    key, this is the first field of the key). If you&#8217;re new to macros, it\r
-    might seem strange to pass the name of a field as a parameter. See\r
-    <a href="#validc">note</a>.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-key_len\r
-</dt>\r
-<dd>\r
-<p>\r
-    the length of the key field in bytes. E.g. for an integer key, this is\r
-    <tt>sizeof(int)</tt>, while for a string key it&#8217;s <tt>strlen(key)</tt>. (For a\r
-    multi-field key, see the notes in this guide on calculating key length).\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-key_ptr\r
-</dt>\r
-<dd>\r
-<p>\r
-    for <tt>HASH_FIND</tt>, this is a pointer to the key to look up in the hash\r
-    (since it&#8217;s a pointer, you can&#8217;t directly pass a literal value here). For\r
-    <tt>HASH_ADD_KEYPTR</tt>, this is the address of the key of the item being added.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-item_ptr\r
-</dt>\r
-<dd>\r
-<p>\r
-    pointer to the structure being added, deleted, or looked up, or the current\r
-    pointer during iteration. This is an input parameter for <tt>HASH_ADD</tt> and\r
-    <tt>HASH_DELETE</tt> macros, and an output parameter for <tt>HASH_FIND</tt> and\r
-    <tt>HASH_ITER</tt>. (When using <tt>HASH_ITER</tt> to iterate, <tt>tmp_item_ptr</tt>\r
-    is another variable of the same type as <tt>item_ptr</tt>, used internally).\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-cmp\r
-</dt>\r
-<dd>\r
-<p>\r
-    pointer to comparison function which accepts two arguments (pointers to\r
-    items to compare) and returns an int specifying whether the first item\r
-    should sort before, equal to, or after the second item (like <tt>strcmp</tt>).\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-condition\r
-</dt>\r
-<dd>\r
-<p>\r
-    a function or macro which accepts a single argument-- a void pointer to a\r
-    structure, which needs to be cast to the appropriate structure type. The\r
-    function or macro should return (or evaluate to) a non-zero value if the\r
-    structure should be "selected" for addition to the destination hash.\r
-</p>\r
-</dd>\r
-</dl></div>\r
-</div>\r
-</div>\r
-<div id="footnotes"><hr /></div>\r
-<div id="footer">\r
-<div id="footer-text">\r
-Version 1.9.2<br />\r
-Last updated 2010-10-28 23:25:58 EDT\r
-</div>\r
-</div>\r
-</body>\r
-</html>\r
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 (symlink)
index 7eb72b0..0000000
+++ /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 (file)
index 1467711..0000000
+++ /dev/null
@@ -1,534 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
-    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
-<head>\r
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
-<meta name="generator" content="AsciiDoc 8.5.0" />\r
-<title>utarray: dynamic array macros for C</title>\r
-<link rel="stylesheet" href="./tdh.css" type="text/css" />\r
-<link rel="stylesheet" href="./tdh-quirks.css" type="text/css" />\r
-</head>\r
-<body>\r
-<div id="header">\r
-<h1>utarray: dynamic array macros for C</h1>\r
-<span id="author">Troy D. Hanson</span><br />\r
-<span id="email"><tt>&lt;<a href="mailto:thanson@users.sourceforge.net">thanson@users.sourceforge.net</a>&gt;</tt></span><br />\r
-<span id="revnumber">version 1.9,</span>\r
-<span id="revdate">March 2010</span>\r
-</div>\r
-<div id="preamble">\r
-<div class="sectionbody">\r
-<a style="float: right; padding-right: 50px" href="http://sourceforge.net/projects/uthash"><img style="border: 0" src="http://sflogo.sourceforge.net/sflogo.php?group_id=163879&amp;type=13" width="120" height="30" alt="uthash at SourceForge.net" /></a>\r
-  <div id="topnav" style="font-size: 9pt; font-family: sans-serif;">\r
-  <a style="padding: 8px;" href="index.html">uthash home</a>\r
-  >>  utarray macros\r
-  </div>\r
-</div>\r
-</div>\r
-<h2 id="_introduction">Introduction</h2>\r
-<div class="sectionbody">\r
-<div id="toc"></div>\r
-<script>\r
-window.onload=generate_TOC\r
-\r
-/* Author: Mihai Bazon, September 2002\r
- * <a href="http://students.infoiasi.ro/~mishoo">http://students.infoiasi.ro/~mishoo</a>\r
- *\r
- * Table Of Content generator\r
- * Version: 0.4\r
- *\r
- * Feel free to use this script under the terms of the GNU General Public\r
- * License, as long as you do not remove or alter this notice.\r
- */\r
-\r
- /* modified by Troy D. Hanson, September 2006. License: GPL */\r
-\r
-function H_getText(el) {\r
-  var text = "";\r
-  for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
-    if (i.nodeType == 3 /* Node.TEXT_NODE, IE doesn't speak constants */)\r
-      text += i.data;\r
-    else if (i.firstChild != null)\r
-      text += H_getText(i);\r
-  }\r
-  return text;\r
-}\r
-\r
-function TOC_EL(el, text, level) {\r
-  this.element = el;\r
-  this.text = text;\r
-  this.level = level;\r
-}\r
-\r
-function getHeadlines(el) {\r
-  var l = new Array;\r
-  var rx = /[hH]([2-3])/;\r
-  // internal recursive function that scans the DOM tree\r
-  var rec = function (el) {\r
-    for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
-      if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {\r
-        if (rx.exec(i.tagName))\r
-          l[l.length] = new TOC_EL(i, H_getText(i), parseInt(RegExp.$1));\r
-        rec(i);\r
-      }\r
-    }\r
-  }\r
-  rec(el);\r
-  return l;\r
-}\r
-\r
-function generate_TOC() {\r
-  var parent = document.getElementById("toc");\r
-  var toc_hdr = document.createElement("div");\r
-  var toc_hdr_txt = document.createTextNode("CONTENTS");\r
-  toc_hdr.appendChild(toc_hdr_txt);\r
-  /* toc_hdr.setAttribute("id","hdr"); */\r
-  toc_hdr.id = "hdr";\r
-  parent.appendChild(toc_hdr);\r
-  var hs = getHeadlines(document.getElementsByTagName("body")[0]);\r
-  for (var i = 0; i < hs.length; ++i) {\r
-    var hi = hs[i];\r
-    var d = document.createElement("div");\r
-    if (hi.element.id == "") hi.element.id = "gen" + i;\r
-    var a = document.createElement("a");\r
-    a.href = "#" + hi.element.id;\r
-    a.appendChild(document.createTextNode(hi.text));\r
-    d.appendChild(a);\r
-    d.className = "level" + hi.level;\r
-    parent.appendChild(d);\r
-    /*\r
-    if (hi.level == 3) {\r
-        var dvtop = document.createElement("div");\r
-        dvtop.className = "toplink";\r
-        dvtop.appendChild(document.createTextNode("^top^"));\r
-        dvtop.onclick=function(){scrollTo(0,0);};\r
-        hi.element.appendChild(dvtop);\r
-    }\r
-    */\r
-  }\r
-}\r
-</script>\r
-<div class="paragraph"><p>A set of general-purpose dynamic array macros for C structures are included with\r
-uthash in <tt>utarray.h</tt>.  To use these macros in your own C program, just\r
-copy <tt>utarray.h</tt> into your source directory and use it in your programs.</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>#include "utarray.h"</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>The dynamic array supports basic operations such as push, pop, and erase on the\r
-array elements. These array elements can be any simple datatype or structure.\r
-The array <a href="#operations">operations</a> are based loosely on the C++ STL vector methods.</p></div>\r
-<div class="paragraph"><p>Internally the dynamic array contains a contiguous memory region into which\r
-the elements are copied. This buffer is grown as needed using <tt>realloc</tt> to\r
-accomodate all the data that is pushed into it.</p></div>\r
-<h3 id="_download">Download</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>To download the <tt>utarray.h</tt> header file, follow the link on the\r
-<a href="http://uthash.sourceforge.net">uthash home page</a>.</p></div>\r
-<h3 id="_bsd_licensed">BSD licensed</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>This software is made available under the\r
-<a href="license.html">revised BSD license</a>.\r
-It is free and open source.</p></div>\r
-<h3 id="_platforms">Platforms</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>The <em>utarray</em> macros have been tested on:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Linux,\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Mac OS X,\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Windows, using Visual Studio 2008 and Visual Studio 2010\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<h2 id="_usage">Usage</h2>\r
-<div class="sectionbody">\r
-<h3 id="_declaration">Declaration</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>The array itself has the data type <tt>UT_array</tt>, regardless of the type of\r
-elements to be stored in it. It is declared like,</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>UT_array *nums;</tt></pre>\r
-</div></div>\r
-<h3 id="_new_and_free">New and free</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>The next step is to create the array using <tt>utarray_new</tt>. Later when you&#8217;re\r
-done with the array, <tt>utarray_free</tt> will free it and all its elements.</p></div>\r
-<h3 id="_push_pop_etc">Push, pop, etc</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>The central features of the utarray involve putting elements into it, taking\r
-them out, and iterating over them. There are several <a href="#operations">operations</a>\r
-to pick from that deal with either single elements or ranges of elements at a\r
-time. In the examples below we will use only the push operation to insert\r
-elements.</p></div>\r
-</div>\r
-<h2 id="_elements">Elements</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>Support for dynamic arrays of integers or strings is especially easy. These are\r
-best shown by example:</p></div>\r
-<h3 id="_integers">Integers</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>This example makes a utarray of integers, pushes 0-9 into it, then prints it.\r
-Lastly it frees it.</p></div>\r
-<div class="listingblock">\r
-<div class="title">Integer elements</div>\r
-<div class="content">\r
-<pre><tt>#include &lt;stdio.h&gt;\r
-#include "utarray.h"\r
-\r
-int main() {\r
-  UT_array *nums;\r
-  int i, *p;\r
-\r
-  utarray_new(nums,&amp;ut_int_icd);\r
-  for(i=0; i &lt; 10; i++) utarray_push_back(nums,&amp;i);\r
-\r
-  for(p=(int*)utarray_front(nums);\r
-      p!=NULL;\r
-      p=(int*)utarray_next(nums,p)) {\r
-    printf("%d\n",*p);\r
-  }\r
-\r
-  utarray_free(nums);\r
-\r
-  return 0;\r
-}</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>The second argument to <tt>utarray_push_back</tt> is always a <em>pointer</em> to the type\r
-(so a literal cannot be used). So for integers, it is an <tt>int*</tt>.</p></div>\r
-<h3 id="_strings">Strings</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>In this example we make a utarray of strings, push two strings into it, print\r
-it and free it.</p></div>\r
-<div class="listingblock">\r
-<div class="title">String elements</div>\r
-<div class="content">\r
-<pre><tt>#include &lt;stdio.h&gt;\r
-#include "utarray.h"\r
-\r
-int main() {\r
-  UT_array *strs;\r
-  char *s, **p;\r
-\r
-  utarray_new(strs,&amp;ut_str_icd);\r
-\r
-  s = "hello"; utarray_push_back(strs, &amp;s);\r
-  s = "world"; utarray_push_back(strs, &amp;s);\r
-  p = NULL;\r
-  while ( (p=(char**)utarray_next(strs,p))) {\r
-    printf("%s\n",*p);\r
-  }\r
-\r
-  utarray_free(strs);\r
-\r
-  return 0;\r
-}</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>In this example, since the element is a <tt>char*</tt>, we pass a pointer to it\r
-(<tt>char**</tt>) as the second argument to <tt>utarray_push_back</tt>. Note that "push" makes\r
-a copy of the source string and pushes that copy into the array.</p></div>\r
-<h3 id="_about_ut_icd">About UT_icd</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>Arrays be made of any type of element, not just integers and strings.  The\r
-elements can be basic types or structures. Unless you&#8217;re dealing with integers\r
-and strings (which use pre-defined <tt>ut_int_icd</tt> and <tt>ut_str_icd</tt>), you&#8217;ll need\r
-to define a <tt>UT_icd</tt> helper structure. This structure contains everything that\r
-utarray needs to initialize, copy or destruct elements.</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>typedef struct {\r
-    size_t sz;\r
-    init_f *init;\r
-    ctor_f *copy;\r
-    dtor_f *dtor;\r
-} UT_icd;</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>The three function pointers <tt>init</tt>, <tt>copy</tt>, and <tt>dtor</tt> have these prototypes:</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>typedef void (ctor_f)(void *dst, const void *src);\r
-typedef void (dtor_f)(void *elt);\r
-typedef void (init_f)(void *elt);</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>The <tt>sz</tt> is just the size of the element being stored in the array.</p></div>\r
-<div class="paragraph"><p>The <tt>init</tt> function will be invoked whenever utarray needs to initialize an\r
-empty element. This only happens as a byproduct of <tt>utarray_resize</tt> or\r
-<tt>utarray_extend_back</tt>. If <tt>init</tt> is <tt>NULL</tt>, it defaults to zero filling the\r
-new element using memset.</p></div>\r
-<div class="paragraph"><p>The <tt>copy</tt> function is used whenever an element is copied into the array.\r
-It is invoked during <tt>utarray_push_back</tt>, <tt>utarray_insert</tt>, <tt>utarray_inserta</tt>,\r
-or <tt>utarray_concat</tt>. If <tt>copy</tt> is <tt>NULL</tt>, it defaults to a bitwise copy using\r
-memcpy.</p></div>\r
-<div class="paragraph"><p>The <tt>dtor</tt> function is used to clean up an element that is being removed from\r
-the array. It may be invoked due to <tt>utarray_resize</tt>, <tt>utarray_pop_back</tt>,\r
-<tt>utarray_erase</tt>, <tt>utarray_clear</tt>, <tt>utarray_done</tt> or <tt>utarray_free</tt>. If the\r
-elements need no cleanup upon destruction, <tt>dtor</tt> may be <tt>NULL</tt>.</p></div>\r
-<h3 id="_scalar_types">Scalar types</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>The next example uses <tt>UT_icd</tt> with all its defaults to make a utarray of\r
-<tt>long</tt> elements. This example pushes two longs, prints them, and frees the\r
-array.</p></div>\r
-<div class="listingblock">\r
-<div class="title">long elements</div>\r
-<div class="content">\r
-<pre><tt>#include &lt;stdio.h&gt;\r
-#include "utarray.h"\r
-\r
-int main() {\r
-  UT_array *nums;\r
-  UT_icd long_icd = {sizeof(long), NULL, NULL, NULL };\r
-  long l, *p;\r
-  utarray_new(nums, &amp;long_icd);\r
-\r
-  l=1; utarray_push_back(nums, &amp;l);\r
-  l=2; utarray_push_back(nums, &amp;l);\r
-\r
-  p=NULL;\r
-  while( (p=(long*)utarray_next(nums,p))) printf("%ld\n", *p);\r
-\r
-  utarray_free(nums);\r
-  return 0;\r
-}</tt></pre>\r
-</div></div>\r
-<h3 id="_structures">Structures</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>Structures can be used as utarray elements. If the structure requires no\r
-special effort to initialize, copy or destruct, we can use <tt>UT_icd</tt> with all\r
-its defaults. This example shows a structure that consists of two integers. Here\r
-we push two values, print them and free the array.</p></div>\r
-<div class="listingblock">\r
-<div class="title">Structure (simple)</div>\r
-<div class="content">\r
-<pre><tt>#include &lt;stdio.h&gt;\r
-#include "utarray.h"\r
-\r
-typedef struct {\r
-    int a;\r
-    int b;\r
-} intpair_t;\r
-\r
-int main() {\r
-\r
-  UT_array *pairs;\r
-  UT_icd intpair_icd = {sizeof(intpair_t), NULL, NULL, NULL};\r
-  intpair_t ip, *p;\r
-  utarray_new(pairs,&amp;intpair_icd);\r
-\r
-  ip.a=1;  ip.b=2;  utarray_push_back(pairs, &amp;ip);\r
-  ip.a=10; ip.b=20; utarray_push_back(pairs, &amp;ip);\r
-\r
-  for(p=(intpair_t*)utarray_front(pairs);\r
-      p!=NULL;\r
-      p=(intpair_t*)utarray_next(pairs,p)) {\r
-    printf("%d %d\n", p-&gt;a, p-&gt;b);\r
-  }\r
-\r
-  utarray_free(pairs);\r
-  return 0;\r
-}</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>The real utility of <tt>UT_icd</tt> is apparent when the elements of the utarray are\r
-structures that require special work to initialize, copy or destruct.</p></div>\r
-<div class="paragraph"><p>For example, when a structure contains pointers to related memory areas that\r
-need to be copied when the structure is copied (and freed when the structure is\r
-freed), we can use custom <tt>init</tt>, <tt>copy</tt>, and <tt>dtor</tt> members in the <tt>UT_icd</tt>.</p></div>\r
-<div class="paragraph"><p>Here we take an example of a structure that contains an integer and a string.\r
-When this element is copied (such as when an element is pushed into the array),\r
-we want to "deep copy" the <tt>s</tt> pointer (so the original element and the new\r
-element point to their own copies of <tt>s</tt>). When an element is destructed, we\r
-want to "deep free" its copy of <tt>s</tt>. Lastly, this example is written to work\r
-even if <tt>s</tt> has the value <tt>NULL</tt>.</p></div>\r
-<div class="listingblock">\r
-<div class="title">Structure (complex)</div>\r
-<div class="content">\r
-<pre><tt>#include &lt;stdio.h&gt;\r
-#include &lt;stdlib.h&gt;\r
-#include "utarray.h"\r
-\r
-typedef struct {\r
-    int a;\r
-    char *s;\r
-} intchar_t;\r
-\r
-void intchar_copy(void *_dst, const void *_src) {\r
-  intchar_t *dst = (intchar_t*)_dst, *src = (intchar_t*)_src;\r
-  dst-&gt;a = src-&gt;a;\r
-  dst-&gt;s = src-&gt;s ? strdup(src-&gt;s) : NULL;\r
-}\r
-\r
-void intchar_dtor(void *_elt) {\r
-  intchar_t *elt = (intchar_t*)_elt;\r
-  if (elt-&gt;s) free(elt-&gt;s);\r
-}\r
-\r
-int main() {\r
-  UT_array *intchars;\r
-  UT_icd intchar_icd = {sizeof(intchar_t), NULL, intchar_copy, intchar_dtor};\r
-  intchar_t ic, *p;\r
-  utarray_new(intchars, &amp;intchar_icd);\r
-\r
-  ic.a=1; ic.s="hello"; utarray_push_back(intchars, &amp;ic);\r
-  ic.a=2; ic.s="world"; utarray_push_back(intchars, &amp;ic);\r
-\r
-  p=NULL;\r
-  while( (p=(intchar_t*)utarray_next(intchars,p))) {\r
-    printf("%d %s\n", p-&gt;a, (p-&gt;s ? p-&gt;s : "null"));\r
-  }\r
-\r
-  utarray_free(intchars);\r
-  return 0;\r
-}</tt></pre>\r
-</div></div>\r
-</div>\r
-<h2 id="operations">Reference</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>This table lists all the utarray operations. These are loosely based on the C++\r
-vector class.</p></div>\r
-<h3 id="_operations">Operations</h3><div style="clear:left"></div>\r
-<div class="tableblock">\r
-<table rules="none"\r
-width="100%"\r
-frame="border"\r
-cellspacing="0" cellpadding="4">\r
-<col width="55%" />\r
-<col width="44%" />\r
-<tbody>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_new(UT_array *a, UT_icd *icd)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">allocate a new array</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_free(UT_array *a)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">free an allocated array</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_init(UT_array *a,UT_icd *icd)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">init an array (non-alloc)</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_done(UT_array *a)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">dispose of an array (non-allocd)</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_reserve(UT_array *a,int n)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">ensure space available for <em>n</em> more elements</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_push_back(UT_array *a,void *p)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">push element p onto a</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_pop_back(UT_array *a)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">pop last element from a</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_extend_back(UT_array *a)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">push empty element onto a</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_len(UT_array *a)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">get length of a</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_eltptr(UT_array *a,int j)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">get pointer of element from index</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_eltidx(UT_array *a,void *e)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">get index of element from pointer</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_insert(UT_array *a,void *p, int j)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">insert element p to index j</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_inserta(UT_array *a,UT_array *w, int j)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">insert array w into array a at index j</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_resize(UT_array *dst,int num)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">extend or shrink array to num elements</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_concat(UT_array *dst,UT_array *src)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">copy src to end of dst array</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_erase(UT_array *a,int pos,int len)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">remove len elements from a[pos]..a[pos+len-1]</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_clear(UT_array *a)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">clear all elements from a, setting its length to zero</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_sort(UT_array *a,cmpfcn *cmp)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">sort elements of a using comparison function</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_front(UT_array *a)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">get first element of a</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_next(UT_array *a,void *e)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">get element of a following e (front if e is NULL)</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utarray_back(UT_array *a)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">get last element of a</p></td>\r
-</tr>\r
-</tbody>\r
-</table>\r
-</div>\r
-<h3 id="_notes">Notes</h3><div style="clear:left"></div>\r
-<div class="olist arabic"><ol class="arabic">\r
-<li>\r
-<p>\r
-<tt>utarray_new</tt> and <tt>utarray_free</tt> are used to allocate a new array and free it,\r
-   while <tt>utarray_init</tt> and <tt>utarray_done</tt> can be used if the UT_array is already\r
-   allocated and just needs to be initialized or have its internal resources\r
-   freed.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>utarray_reserve</tt> takes the "delta" of elements to reserve (not the total\r
-   desired capacity of the array-- this differs from the C++ STL "reserve" notion)\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>utarray_sort</tt> expects a comparison function having the usual <tt>strcmp</tt> -like\r
-   convention where it accepts two elements (a and b) and returns a negative\r
-   value if a precedes b, 0 if a and b sort equally, and positive if b precedes a.\r
-   This is an example of a comparison function:\r
-</p>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>int intsort(const void *a,const void*b) {\r
-    int _a = *(int*)a;\r
-    int _b = *(int*)b;\r
-    return _a - _b;\r
-}</tt></pre>\r
-</div></div>\r
-</li>\r
-<li>\r
-<p>\r
-A <em>pointer</em> to a particular element (obtained using <tt>utarray_eltptr</tt> or\r
-   <tt>utarray_front</tt>, <tt>utarray_next</tt>, <tt>utarray_back</tt>) becomes invalid whenever\r
-   another element is inserted into the utarray. This is because the internal\r
-   memory management may need to <tt>realloc</tt> the element storage to a new address.\r
-   For this reason, it&#8217;s usually better to refer to an element by its integer\r
-   <em>index</em> in code whose duration may include element insertion.\r
-</p>\r
-</li>\r
-</ol></div>\r
-</div>\r
-<div id="footer">\r
-<div id="footer-text">\r
-Version 1.9<br />\r
-Last updated 2010-03-31 08:05:39 PDT\r
-</div>\r
-</div>\r
-</body>\r
-</html>\r
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 (file)
index 4486a8c..0000000
+++ /dev/null
@@ -1,436 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
-    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
-<head>\r
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
-<meta name="generator" content="AsciiDoc 8.5.2" />\r
-<title>utlist: linked list macros for C structures</title>\r
-<link rel="stylesheet" href="./tdh.css" type="text/css" />\r
-<link rel="stylesheet" href="./tdh-quirks.css" type="text/css" />\r
-<script type="text/javascript">\r
-/*<![CDATA[*/\r
-window.onload = function(){asciidoc.footnotes();}\r
-/*]]>*/\r
-</script>\r
-<script type="text/javascript" src="./asciidoc-xhtml11.js"></script>\r
-</head>\r
-<body>\r
-<div id="header">\r
-<h1>utlist: linked list macros for C structures</h1>\r
-<span id="author">Troy D. Hanson</span><br />\r
-<span id="email"><tt>&lt;<a href="mailto:thanson@users.sourceforge.net">thanson@users.sourceforge.net</a>&gt;</tt></span><br />\r
-<span id="revnumber">version 1.9,</span>\r
-<span id="revdate">March 2010</span>\r
-</div>\r
-<div id="content">\r
-<div id="preamble">\r
-<div class="sectionbody">\r
-<a style="float: right; padding-right: 50px" href="http://sourceforge.net/projects/uthash"><img style="border: 0" src="http://sflogo.sourceforge.net/sflogo.php?group_id=163879&amp;type=13" width="120" height="30" alt="uthash at SourceForge.net" /></a>\r
-  <div id="topnav" style="font-size: 9pt; font-family: sans-serif;">\r
-  <a style="padding: 8px;" href="index.html">uthash home</a>\r
-  >>  utlist macros\r
-  </div>\r
-</div>\r
-</div>\r
-<h2 id="_introduction">Introduction</h2>\r
-<div class="sectionbody">\r
-<div id="toc"></div>\r
-<script>\r
-window.onload=generate_TOC\r
-\r
-/* Author: Mihai Bazon, September 2002\r
- * <a href="http://students.infoiasi.ro/~mishoo">http://students.infoiasi.ro/~mishoo</a>\r
- *\r
- * Table Of Content generator\r
- * Version: 0.4\r
- *\r
- * Feel free to use this script under the terms of the GNU General Public\r
- * License, as long as you do not remove or alter this notice.\r
- */\r
-\r
- /* modified by Troy D. Hanson, September 2006. License: GPL */\r
-\r
-function H_getText(el) {\r
-  var text = "";\r
-  for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
-    if (i.nodeType == 3 /* Node.TEXT_NODE, IE doesn't speak constants */)\r
-      text += i.data;\r
-    else if (i.firstChild != null)\r
-      text += H_getText(i);\r
-  }\r
-  return text;\r
-}\r
-\r
-function TOC_EL(el, text, level) {\r
-  this.element = el;\r
-  this.text = text;\r
-  this.level = level;\r
-}\r
-\r
-function getHeadlines(el) {\r
-  var l = new Array;\r
-  var rx = /[hH]([2-3])/;\r
-  // internal recursive function that scans the DOM tree\r
-  var rec = function (el) {\r
-    for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
-      if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {\r
-        if (rx.exec(i.tagName))\r
-          l[l.length] = new TOC_EL(i, H_getText(i), parseInt(RegExp.$1));\r
-        rec(i);\r
-      }\r
-    }\r
-  }\r
-  rec(el);\r
-  return l;\r
-}\r
-\r
-function generate_TOC() {\r
-  var parent = document.getElementById("toc");\r
-  var toc_hdr = document.createElement("div");\r
-  var toc_hdr_txt = document.createTextNode("CONTENTS");\r
-  toc_hdr.appendChild(toc_hdr_txt);\r
-  /* toc_hdr.setAttribute("id","hdr"); */\r
-  toc_hdr.id = "hdr";\r
-  parent.appendChild(toc_hdr);\r
-  var hs = getHeadlines(document.getElementsByTagName("body")[0]);\r
-  for (var i = 0; i < hs.length; ++i) {\r
-    var hi = hs[i];\r
-    var d = document.createElement("div");\r
-    if (hi.element.id == "") hi.element.id = "gen" + i;\r
-    var a = document.createElement("a");\r
-    a.href = "#" + hi.element.id;\r
-    a.appendChild(document.createTextNode(hi.text));\r
-    d.appendChild(a);\r
-    d.className = "level" + hi.level;\r
-    parent.appendChild(d);\r
-    /*\r
-    if (hi.level == 3) {\r
-        var dvtop = document.createElement("div");\r
-        dvtop.className = "toplink";\r
-        dvtop.appendChild(document.createTextNode("^top^"));\r
-        dvtop.onclick=function(){scrollTo(0,0);};\r
-        hi.element.appendChild(dvtop);\r
-    }\r
-    */\r
-  }\r
-}\r
-</script>\r
-<div class="paragraph"><p>A set of general-purpose <em>linked list</em> macros for C structures are included with\r
-uthash in <tt>utlist.h</tt>.  To use these macros in your own C program, just\r
-copy <tt>utlist.h</tt> into your source directory and use it in your programs.</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>#include "utlist.h"</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>These macros support the basic linked list operations: adding and deleting\r
-elements, sorting them and iterating over them.</p></div>\r
-<h3 id="_download">Download</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>To download the <tt>utlist.h</tt> header file, follow the link on the\r
-<a href="http://uthash.sourceforge.net">uthash home page</a>.</p></div>\r
-<h3 id="_bsd_licensed">BSD licensed</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>This software is made available under the\r
-<a href="license.html">revised BSD license</a>.\r
-It is free and open source.</p></div>\r
-<h3 id="_platforms">Platforms</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>The <em>utlist</em> macros have been tested on:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Linux,\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Mac OS X, and\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Windows, using Visual Studio 2008, Visual Studio 2010, or Cygwin/MinGW.\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<h2 id="_using_utlist">Using utlist</h2>\r
-<div class="sectionbody">\r
-<h3 id="_types_of_lists">Types of lists</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>Three types of linked lists are supported:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-<strong>singly-linked</strong> lists,\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<strong>doubly-linked</strong> lists, and\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<strong>circular, doubly-linked</strong> lists\r
-</p>\r
-</li>\r
-</ul></div>\r
-<h4 id="_efficiency">Efficiency</h4>\r
-<div class="paragraph"><p>For all types of lists, prepending elements and deleting elements are\r
-constant-time operations. Appending to a singly-linked list is an <em>O(n)</em>\r
-operation but appending to a doubly-linked list is constant time using these\r
-macros.  (This is because, in the utlist implementation of the doubly-linked\r
-list, the head element&#8217;s <tt>prev</tt> member points back to the list tail, even when\r
-the list is non-circular). Sorting is an <em>O(n log(n))</em> operation. Iteration\r
-and searching are <tt>O(n)</tt> for all list types.</p></div>\r
-<h3 id="_list_elements">List elements</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>You can use any structure with these macros, as long as the structure\r
-contains a <tt>next</tt> pointer. If you want to make a doubly-linked list,\r
-the element also needs to have a <tt>prev</tt> pointer.</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>typedef struct {\r
-    char *name;\r
-    struct element *prev; /* needed for a doubly-linked list only */\r
-    struct element *next; /* needed for singly- or doubly-linked lists */\r
-} element;</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>You can name your structure anything. In the example above it is called <tt>element</tt>.\r
-Within a particular list, all elements must be of the same type.</p></div>\r
-<h3 id="_list_head">List head</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>The list head is simply a pointer to your element structure. You can name it\r
-anything. <strong>It must be initialized to <tt>NULL</tt></strong>.</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>element *head = NULL;</tt></pre>\r
-</div></div>\r
-<h3 id="_list_operations">List operations</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>The lists support inserting or deleting elements, sorting the elements and\r
-iterating over them.</p></div>\r
-<div class="tableblock">\r
-<table rules="cols"\r
-width="100%"\r
-frame="border"\r
-cellspacing="0" cellpadding="4">\r
-<col width="33%" />\r
-<col width="33%" />\r
-<col width="33%" />\r
-<thead>\r
-<tr>\r
-<th align="left" valign="top">Singly-linked             </th>\r
-<th align="left" valign="top"> Doubly-linked              </th>\r
-<th align="left" valign="top"> Circular, doubly-linked</th>\r
-</tr>\r
-</thead>\r
-<tbody>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>LL_PREPEND(head,add);</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>DL_PREPEND(head,add);</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>CDL_PREPEND(head,add;</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>LL_APPEND(head,add);</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>DL_APPEND(head,add);</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt></tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>LL_DELETE(head,del);</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>DL_DELETE(head,del);</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>CDL_DELETE(head,del);</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>LL_SORT(head,cmp);</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>DL_SORT(head,cmp);</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>CDL_SORT(head,cmp);</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>LL_FOREACH(head,elt) {&#8230;}</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>DL_FOREACH(head,elt) {&#8230;}</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>CDL_FOREACH(head,elt) {&#8230;}</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>LL_FOREACH_SAFE(head,elt,tmp) {&#8230;}</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>DL_FOREACH_SAFE(head,elt,tmp) {&#8230;}</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>CDL_FOREACH_SAFE(head,elt,tmp1,tmp2) {&#8230;}</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>LL_SEARCH_SCALAR(head,elt,mbr,val);</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>DL_SEARCH_SCALAR(head,elt,mbr,val);</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>CDL_SEARCH_SCALAR(head,elt,mbr,val);</tt></p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>LL_SEARCH(head,elt,like,cmp);</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>DL_SEARCH(head,elt,like,cmp);</tt></p></td>\r
-<td align="left" valign="top"><p class="table"><tt>CDL_SEARCH(head,elt,like,cmp);</tt></p></td>\r
-</tr>\r
-</tbody>\r
-</table>\r
-</div>\r
-<div class="paragraph"><p><em>Prepend</em> means to insert an element in front of the existing list head (if any),\r
-changing the list head to the new element. <em>Append</em> means to add an element at the\r
-end of the list, so it becomes the new tail element.</p></div>\r
-<div class="paragraph"><p>The <em>sort</em> operation never moves the elements in memory; rather it only adjusts\r
-the list order by altering the <tt>prev</tt> and <tt>next</tt> pointers in each element. Also\r
-the sort operation can change the list head to point to a new element.</p></div>\r
-<div class="paragraph"><p>The <em>foreach</em> operation is for easy iteration over the list from the head to the\r
-tail. A usage example is shown below. You can of course just use the <tt>prev</tt> and\r
-<tt>next</tt> pointers directly instead of using the <em>foreach</em> macros.\r
-The <em>foreach_safe</em> operation should be used if you plan to delete any of the list\r
-elements while iterating.</p></div>\r
-<div class="paragraph"><p>The <em>search</em> operation is a shortcut for iteration in search of a particular\r
-element. It is not any faster than manually iterating and testing each element.\r
-There are two forms: the "scalar" version searches for an element using a\r
-simple equality test on a given structure member, while the general version takes an\r
-element to which all others in the list will be compared using a <tt>cmp</tt> function.</p></div>\r
-<div class="paragraph"><p>The parameters shown in the table above are explained here:</p></div>\r
-<div class="dlist"><dl>\r
-<dt class="hdlist1">\r
-head\r
-</dt>\r
-<dd>\r
-<p>\r
-  The list head (a pointer to your list element structure).\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-add\r
-</dt>\r
-<dd>\r
-<p>\r
-  A pointer to the list element structure you are adding to the list.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-del\r
-</dt>\r
-<dd>\r
-<p>\r
-  A pointer to the list element structure you are deleting from the list.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-elt\r
-</dt>\r
-<dd>\r
-<p>\r
-  A pointer that will be assigned to each list element in succession (see\r
-  example) in the case of iteration macros; also, the output pointer from\r
-  the search macros.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-like\r
-</dt>\r
-<dd>\r
-<p>\r
-  An element pointer, having the same type as <tt>elt</tt>, for which the search macro\r
-  seeks a match (if found, the match is stored in <tt>elt</tt>). A match is determined\r
-  by the given <tt>cmp</tt> function.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-cmp\r
-</dt>\r
-<dd>\r
-<p>\r
-  pointer to comparison function which accepts two arguments-- these are\r
-  pointers to two element structures to be compared. The comparison function\r
-  must return an <tt>int</tt> that is negative, zero, or positive, which specifies\r
-  whether the first item should sort before, equal to, or after the second item,\r
-  respectively. (In other words, the same convention that is used by <tt>strcmp</tt>).\r
-  Note that under Visual Studio 2008 you may need to declare the two arguments\r
-  as <tt>void *</tt> and then cast them back to their actual types.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-tmp\r
-</dt>\r
-<dd>\r
-<p>\r
-  A pointer of the same type as <tt>elt</tt>. Used internally. Need not be initialized.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-mbr\r
-</dt>\r
-<dd>\r
-<p>\r
-  In the scalar search macro, the name of a member within the <tt>elt</tt> structure which\r
-  will be tested (using <tt>==</tt>) for equality with the value <tt>val</tt>.\r
-</p>\r
-</dd>\r
-<dt class="hdlist1">\r
-val\r
-</dt>\r
-<dd>\r
-<p>\r
-  In the scalar search macro, specifies the value of (of structure member\r
-  <tt>field</tt>) of the element being sought.\r
-</p>\r
-</dd>\r
-</dl></div>\r
-<h3 id="_example">Example</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>This example program reads names from a text file (one name per line), and\r
-appends each name to a doubly-linked list. Then it sorts and prints them.</p></div>\r
-<div class="listingblock">\r
-<div class="title">A doubly-linked list</div>\r
-<div class="content">\r
-<pre><tt>#include &lt;stdio.h&gt;\r
-#include &lt;stdlib.h&gt;\r
-#include &lt;string.h&gt;\r
-#include "utlist.h"\r
-\r
-#define BUFLEN 20\r
-\r
-typedef struct el {\r
-    char bname[BUFLEN];\r
-    struct el *next, *prev;\r
-} el;\r
-\r
-int namecmp(el *a, el *b) {\r
-    return strcmp(a-&gt;bname,b-&gt;bname);\r
-}\r
-\r
-el *head = NULL; /* important- initialize to NULL! */\r
-\r
-int main(int argc, char *argv[]) {\r
-    el *name, *elt, *tmp, etmp;\r
-\r
-    char linebuf[BUFLEN];\r
-    FILE *file;\r
-\r
-    if ( (file = fopen( "test11.dat", "r" )) == NULL ) {\r
-        perror("can't open: ");\r
-        exit(-1);\r
-    }\r
-\r
-    while (fgets(linebuf,BUFLEN,file) != NULL) {\r
-        if ( (name = (el*)malloc(sizeof(el))) == NULL) exit(-1);\r
-        strncpy(name-&gt;bname,linebuf,BUFLEN);\r
-        DL_APPEND(head, name);\r
-    }\r
-    DL_SORT(head, namecmp);\r
-    DL_FOREACH(head,elt) printf("%s", elt-&gt;bname);\r
-\r
-    memcpy(&amp;etmp.bname, "WES\n", 5);\r
-    DL_SEARCH(head,elt,&amp;etmp,namecmp);\r
-    if (elt) printf("found %s\n", elt-&gt;bname);\r
-\r
-    /* now delete each element, use the safe iterator */\r
-    DL_FOREACH_SAFE(head,elt,tmp) {\r
-      DL_DELETE(head,elt);\r
-    }\r
-\r
-    fclose(file);\r
-\r
-    return 0;\r
-}</tt></pre>\r
-</div></div>\r
-</div>\r
-</div>\r
-<div id="footnotes"><hr /></div>\r
-<div id="footer">\r
-<div id="footer-text">\r
-Version 1.9<br />\r
-Last updated 2010-07-18 21:14:24 EDT\r
-</div>\r
-</div>\r
-</body>\r
-</html>\r
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 (file)
index eab57b8..0000000
+++ /dev/null
@@ -1,316 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
-    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
-<head>\r
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
-<meta name="generator" content="AsciiDoc 8.5.0" />\r
-<title>utstring: dynamic string macros for C</title>\r
-<link rel="stylesheet" href="./tdh.css" type="text/css" />\r
-<link rel="stylesheet" href="./tdh-quirks.css" type="text/css" />\r
-</head>\r
-<body>\r
-<div id="header">\r
-<h1>utstring: dynamic string macros for C</h1>\r
-<span id="author">Troy D. Hanson</span><br />\r
-<span id="email"><tt>&lt;<a href="mailto:thanson@users.sourceforge.net">thanson@users.sourceforge.net</a>&gt;</tt></span><br />\r
-<span id="revnumber">version 1.9,</span>\r
-<span id="revdate">March 2010</span>\r
-</div>\r
-<div id="preamble">\r
-<div class="sectionbody">\r
-<a style="float: right; padding-right: 50px" href="http://sourceforge.net/projects/uthash"><img style="border: 0" src="http://sflogo.sourceforge.net/sflogo.php?group_id=163879&amp;type=13" width="120" height="30" alt="uthash at SourceForge.net" /></a>\r
-  <div id="topnav" style="font-size: 9pt; font-family: sans-serif;">\r
-  <a style="padding: 8px;" href="index.html">uthash home</a>\r
-  >>  utstring macros\r
-  </div>\r
-</div>\r
-</div>\r
-<h2 id="_introduction">Introduction</h2>\r
-<div class="sectionbody">\r
-<div id="toc"></div>\r
-<script>\r
-window.onload=generate_TOC\r
-\r
-/* Author: Mihai Bazon, September 2002\r
- * <a href="http://students.infoiasi.ro/~mishoo">http://students.infoiasi.ro/~mishoo</a>\r
- *\r
- * Table Of Content generator\r
- * Version: 0.4\r
- *\r
- * Feel free to use this script under the terms of the GNU General Public\r
- * License, as long as you do not remove or alter this notice.\r
- */\r
-\r
- /* modified by Troy D. Hanson, September 2006. License: GPL */\r
-\r
-function H_getText(el) {\r
-  var text = "";\r
-  for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
-    if (i.nodeType == 3 /* Node.TEXT_NODE, IE doesn't speak constants */)\r
-      text += i.data;\r
-    else if (i.firstChild != null)\r
-      text += H_getText(i);\r
-  }\r
-  return text;\r
-}\r
-\r
-function TOC_EL(el, text, level) {\r
-  this.element = el;\r
-  this.text = text;\r
-  this.level = level;\r
-}\r
-\r
-function getHeadlines(el) {\r
-  var l = new Array;\r
-  var rx = /[hH]([2-3])/;\r
-  // internal recursive function that scans the DOM tree\r
-  var rec = function (el) {\r
-    for (var i = el.firstChild; i != null; i = i.nextSibling) {\r
-      if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {\r
-        if (rx.exec(i.tagName))\r
-          l[l.length] = new TOC_EL(i, H_getText(i), parseInt(RegExp.$1));\r
-        rec(i);\r
-      }\r
-    }\r
-  }\r
-  rec(el);\r
-  return l;\r
-}\r
-\r
-function generate_TOC() {\r
-  var parent = document.getElementById("toc");\r
-  var toc_hdr = document.createElement("div");\r
-  var toc_hdr_txt = document.createTextNode("CONTENTS");\r
-  toc_hdr.appendChild(toc_hdr_txt);\r
-  /* toc_hdr.setAttribute("id","hdr"); */\r
-  toc_hdr.id = "hdr";\r
-  parent.appendChild(toc_hdr);\r
-  var hs = getHeadlines(document.getElementsByTagName("body")[0]);\r
-  for (var i = 0; i < hs.length; ++i) {\r
-    var hi = hs[i];\r
-    var d = document.createElement("div");\r
-    if (hi.element.id == "") hi.element.id = "gen" + i;\r
-    var a = document.createElement("a");\r
-    a.href = "#" + hi.element.id;\r
-    a.appendChild(document.createTextNode(hi.text));\r
-    d.appendChild(a);\r
-    d.className = "level" + hi.level;\r
-    parent.appendChild(d);\r
-    /*\r
-    if (hi.level == 3) {\r
-        var dvtop = document.createElement("div");\r
-        dvtop.className = "toplink";\r
-        dvtop.appendChild(document.createTextNode("^top^"));\r
-        dvtop.onclick=function(){scrollTo(0,0);};\r
-        hi.element.appendChild(dvtop);\r
-    }\r
-    */\r
-  }\r
-}\r
-</script>\r
-<div class="paragraph"><p>A set of very basic dynamic string macros for C programs are included with\r
-uthash in <tt>utstring.h</tt>.  To use these macros in your own C program, just\r
-copy <tt>utstring.h</tt> into your source directory and use it in your programs.</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>#include "utstring.h"</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>The dynamic string supports basic operations such as inserting data (including\r
-binary data-- despite its name, utstring is not limited to string content),\r
-concatenation, getting the length and content, and clearing it.  The string\r
-<a href="#operations">operations</a> are listed below.</p></div>\r
-<h3 id="_download">Download</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>To download the <tt>utstring.h</tt> header file, follow the link on the\r
-<a href="http://uthash.sourceforge.net">uthash home page</a>.</p></div>\r
-<h3 id="_bsd_licensed">BSD licensed</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>This software is made available under the\r
-<a href="license.html">revised BSD license</a>.\r
-It is free and open source.</p></div>\r
-<h3 id="_platforms">Platforms</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>The <em>utstring</em> macros have been tested on:</p></div>\r
-<div class="ulist"><ul>\r
-<li>\r
-<p>\r
-Linux,\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-Windows, using Visual Studio 2008 and Visual Studio 2010\r
-</p>\r
-</li>\r
-</ul></div>\r
-</div>\r
-<h2 id="_usage">Usage</h2>\r
-<div class="sectionbody">\r
-<h3 id="_declaration">Declaration</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>The dynamic string itself has the data type <tt>UT_string</tt>.  It is declared like,</p></div>\r
-<div class="literalblock">\r
-<div class="content">\r
-<pre><tt>UT_string *str;</tt></pre>\r
-</div></div>\r
-<h3 id="_new_and_free">New and free</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>The next step is to create the string using <tt>utstring_new</tt>. Later when you&#8217;re\r
-done with it, <tt>utstring_free</tt> will free it and all its content.</p></div>\r
-<h3 id="_manipulation">Manipulation</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>The <tt>utstring_printf</tt> or <tt>utstring_bincpy</tt> operations insert (copy) data into\r
-the string. To concatenate one utstring to another, use <tt>utstring_concat</tt>.  To\r
-clear the content of the string, use <tt>utstring_clear</tt>. The length of the string\r
-is available from <tt>utstring_len</tt>, and its content from <tt>utstring_body</tt>. This\r
-evaluates to a <tt>char*</tt>.  The buffer it points to is always null-terminated.\r
-So, it can be used directly with external functions that expect a string.\r
-This automatic null terminator is not counted in the length of the string.</p></div>\r
-<h3 id="_samples">Samples</h3><div style="clear:left"></div>\r
-<div class="paragraph"><p>These examples show how to use utstring.</p></div>\r
-<div class="listingblock">\r
-<div class="title">Sample 1</div>\r
-<div class="content">\r
-<pre><tt>#include &lt;stdio.h&gt;\r
-#include "utstring.h"\r
-\r
-int main() {\r
-    UT_string *s;\r
-\r
-    utstring_new(s);\r
-    utstring_printf(s, "hello world!" );\r
-    printf("%s\n", utstring_body(s));\r
-\r
-    utstring_free(s);\r
-    return 0;\r
-}</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>The next example is meant to demonstrate that printf <em>appends</em> to the string.\r
-It also shows concatenation.</p></div>\r
-<div class="listingblock">\r
-<div class="title">Sample 2</div>\r
-<div class="content">\r
-<pre><tt>#include &lt;stdio.h&gt;\r
-#include "utstring.h"\r
-\r
-int main() {\r
-    UT_string *s, *t;\r
-\r
-    utstring_new(s);\r
-    utstring_new(t);\r
-\r
-    utstring_printf(s, "hello " );\r
-    utstring_printf(s, "world " );\r
-\r
-    utstring_printf(t, "hi " );\r
-    utstring_printf(t, "there " );\r
-\r
-    utstring_concat(s, t);\r
-    printf("length: %u\n", utstring_len(s));\r
-    printf("%s\n", utstring_body(s));\r
-\r
-    utstring_free(s);\r
-    utstring_free(t);\r
-    return 0;\r
-}</tt></pre>\r
-</div></div>\r
-<div class="paragraph"><p>The last example shows how binary data can be inserted into the string. It also\r
-clears the string and prints new data into it.</p></div>\r
-<div class="listingblock">\r
-<div class="title">Sample 3</div>\r
-<div class="content">\r
-<pre><tt>#include &lt;stdio.h&gt;\r
-#include "utstring.h"\r
-\r
-int main() {\r
-    UT_string *s;\r
-    char binary[] = "\xff\xff";\r
-\r
-    utstring_new(s);\r
-    utstring_bincpy(s, binary, sizeof(binary));\r
-    printf("length is %u\n", utstring_len(s));\r
-\r
-    utstring_clear(s);\r
-    utstring_printf(s,"number %d", 10);\r
-    printf("%s\n", utstring_body(s));\r
-\r
-    utstring_free(s);\r
-    return 0;\r
-}</tt></pre>\r
-</div></div>\r
-</div>\r
-<h2 id="operations">Reference</h2>\r
-<div class="sectionbody">\r
-<div class="paragraph"><p>These are the utstring operations.</p></div>\r
-<h3 id="_operations">Operations</h3><div style="clear:left"></div>\r
-<div class="tableblock">\r
-<table rules="none"\r
-width="100%"\r
-frame="border"\r
-cellspacing="0" cellpadding="4">\r
-<col width="55%" />\r
-<col width="44%" />\r
-<tbody>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utstring_new(s)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">allocate a new utstring</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utstring_free(s)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">free an allocated utstring</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utstring_init(s)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">init a utstring (non-alloc)</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utstring_done(s)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">dispose of a utstring (non-allocd)</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utstring_printf(s,fmt,&#8230;)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">printf into a utstring (appends)</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utstring_bincpy(s,bin,len)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">insert binary data of length len (appends)</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utstring_concat(dst,src)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">concatenate src utstring to end of dst utstring</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utstring_clear(s)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">clear the content of s (setting its length to 0)</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utstring_len(s)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">obtain the length of s as an unsigned integer</p></td>\r
-</tr>\r
-<tr>\r
-<td align="left" valign="top"><p class="table"><tt>utstring_body(s)</tt></p></td>\r
-<td align="left" valign="top"><p class="table">get <tt>char*</tt> to body of s (buffer is always null-terminated)</p></td>\r
-</tr>\r
-</tbody>\r
-</table>\r
-</div>\r
-<h3 id="_notes">Notes</h3><div style="clear:left"></div>\r
-<div class="olist arabic"><ol class="arabic">\r
-<li>\r
-<p>\r
-<tt>utstring_new</tt> and <tt>utstring_free</tt> are used to allocate a new string and free it,\r
-   while <tt>utstring_init</tt> and <tt>utstring_done</tt> can be used if the UT_string is already\r
-   allocated and just needs to be initialized or have its internal resources\r
-   freed.\r
-</p>\r
-</li>\r
-<li>\r
-<p>\r
-<tt>utstring_printf</tt> is actually a function defined statically in <tt>utstring.h</tt>\r
-   rather than a macro.\r
-</p>\r
-</li>\r
-</ol></div>\r
-</div>\r
-<div id="footer">\r
-<div id="footer-text">\r
-Version 1.9<br />\r
-Last updated 2010-03-31 09:01:34 PDT\r
-</div>\r
-</div>\r
-</body>\r
-</html>\r
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 (file)
index e20e18f..0000000
Binary files a/3rdparty/uthash-1.9.3/doc/pdf/userguide.pdf and /dev/null differ
diff --git a/3rdparty/uthash-1.9.3/doc/txt/ChangeLog.txt b/3rdparty/uthash-1.9.3/doc/txt/ChangeLog.txt
deleted file mode 100644 (file)
index 8133357..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-uthash ChangeLog
-================
-
-include::sflogo.txt[]
-
-Click to return to the link:index.html[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 link:utarray.html[utarray.h] and link:utstring.html[utstring.h] 
-       are now included. These implement dynamic arrays and strings using macros
-* link:utlist.html[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 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 (file)
index 3eca8c4..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-ifdef::backend-xhtml11[]
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-<a style="float: right; padding-right: 50px" href="http://sourceforge.net/projects/uthash"><img style="border: 0" src="http://sflogo.sourceforge.net/sflogo.php?group_id=163879&amp;type=13" width="120" height="30" alt="uthash at SourceForge.net" /></a>
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-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 (file)
index 458eed1..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-ifdef::backend-xhtml11[]
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-<div id="toc"></div>
-<script>
-window.onload=generate_TOC
-
-/* Author: Mihai Bazon, September 2002
- * http://students.infoiasi.ro/~mishoo
- *
- * Table Of Content generator
- * Version: 0.4
- *
- * Feel free to use this script under the terms of the GNU General Public
- * License, as long as you do not remove or alter this notice.
- */
-
- /* modified by Troy D. Hanson, September 2006. License: GPL */
-
-function H_getText(el) {
-  var text = "";
-  for (var i = el.firstChild; i != null; i = i.nextSibling) {
-    if (i.nodeType == 3 /* Node.TEXT_NODE, IE doesn't speak constants */)
-      text += i.data;
-    else if (i.firstChild != null)
-      text += H_getText(i);
-  }
-  return text;
-}
-
-function TOC_EL(el, text, level) {
-  this.element = el;
-  this.text = text;
-  this.level = level;
-}
-
-function getHeadlines(el) {
-  var l = new Array;
-  var rx = /[hH]([2-3])/;
-  // internal recursive function that scans the DOM tree
-  var rec = function (el) {
-    for (var i = el.firstChild; i != null; i = i.nextSibling) {
-      if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
-        if (rx.exec(i.tagName))
-          l[l.length] = new TOC_EL(i, H_getText(i), parseInt(RegExp.$1));
-        rec(i);
-      }
-    }
-  }
-  rec(el);
-  return l;
-}
-
-function generate_TOC() {
-  var parent = document.getElementById("toc"); 
-  var toc_hdr = document.createElement("div");
-  var toc_hdr_txt = document.createTextNode("CONTENTS");
-  toc_hdr.appendChild(toc_hdr_txt);
-  /* toc_hdr.setAttribute("id","hdr"); */
-  toc_hdr.id = "hdr";
-  parent.appendChild(toc_hdr);
-  var hs = getHeadlines(document.getElementsByTagName("body")[0]);
-  for (var i = 0; i < hs.length; ++i) {
-    var hi = hs[i];
-    var d = document.createElement("div");
-    if (hi.element.id == "") hi.element.id = "gen" + i;
-    var a = document.createElement("a");
-    a.href = "#" + hi.element.id;
-    a.appendChild(document.createTextNode(hi.text));
-    d.appendChild(a);
-    d.className = "level" + hi.level;
-    parent.appendChild(d);
-    /*
-    if (hi.level == 3) {
-        var dvtop = document.createElement("div");
-        dvtop.className = "toplink";
-        dvtop.appendChild(document.createTextNode("^top^"));
-        dvtop.onclick=function(){scrollTo(0,0);};
-        hi.element.appendChild(dvtop);
-    }
-    */
-  }
-}
-</script>
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-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 (file)
index 46da28a..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-ifdef::backend-xhtml11[]
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-  <div id="topnav" style="font-size: 9pt; font-family: sans-serif;">
-  <a style="padding-right: 8px;" href="http://sourceforge.net/projects/uthash/">sf.net summary page</a> 
-  >> <a style="padding: 8px;" href="index.html">uthash home</a> 
-  >>  User Guide 
-  <a style="padding: 8px;" href="userguide.pdf">[View PDF]</a> 
-  </div>
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-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 (file)
index 591076a..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-ifdef::backend-xhtml11[]
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-  <div id="topnav" style="font-size: 9pt; font-family: sans-serif;">
-  <a style="padding: 8px;" href="index.html">uthash home</a> 
-  >>  utarray macros
-  </div>
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-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 (file)
index 6acdf7b..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-ifdef::backend-xhtml11[]
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-  <div id="topnav" style="font-size: 9pt; font-family: sans-serif;">
-  <a style="padding: 8px;" href="index.html">uthash home</a> 
-  >>  utlist macros
-  </div>
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-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 (file)
index 192117b..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-ifdef::backend-xhtml11[]
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-  <div id="topnav" style="font-size: 9pt; font-family: sans-serif;">
-  <a style="padding: 8px;" href="index.html">uthash home</a> 
-  >>  utstring macros
-  </div>
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-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 (file)
index 1e66c41..0000000
+++ /dev/null
@@ -1,1527 +0,0 @@
-uthash User Guide
-=================
-Troy D. Hanson <thanson@users.sourceforge.net>
-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
-<<hash_functions,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 
-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 <<Macro_reference,Macro Reference>>. 
-
-.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 <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,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,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). 
-
-.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
-`<stddef.h>`.  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 <<multihash,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`.
-
-
-[[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 <<expansion,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]]
-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 <<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
-
-.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
-    <<validc,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.
-
-// 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 (file)
index 0275653..0000000
+++ /dev/null
@@ -1,366 +0,0 @@
-utarray: dynamic array macros for C 
-===================================
-Troy D. Hanson <thanson@users.sourceforge.net>
-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 <<operations,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
-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 <<operations,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;
-}
-
--------------------------------------------------------------------------------
-
-[[operations]]
-Reference
----------
-This table lists all the utarray operations. These are loosely based on the C++
-vector class.
-
-Operations
-~~~~~~~~~~
-
-[width="100%",cols="50<m,40<",grid="none",options="none"]
-|===============================================================================
-| 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. `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)
-3. `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;
-  }
-
-4. 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.
-
-// vim: set nowrap syntax=asciidoc: 
-
diff --git a/3rdparty/uthash-1.9.3/doc/txt/utlist.txt b/3rdparty/uthash-1.9.3/doc/txt/utlist.txt
deleted file mode 100644 (file)
index 045eddb..0000000
+++ /dev/null
@@ -1,216 +0,0 @@
-utlist: linked list macros for C structures
-===========================================
-Troy D. Hanson <thanson@users.sourceforge.net>
-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<m,10<m,10<m",grid="cols",options="header"]
-|===============================================================================
-|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;
-}
---------------------------------------------------------------------------------
-
-// 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 (file)
index e9e6f87..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-utstring: dynamic string macros for C 
-=====================================
-Troy D. Hanson <thanson@users.sourceforge.net>
-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
-<<operations,operations>> 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 <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;
-}
--------------------------------------------------------------------------------
-
-[[operations]]
-Reference
----------
-These are the utstring operations. 
-
-Operations
-~~~~~~~~~~
-
-[width="100%",cols="50<m,40<",grid="none",options="none"]
-|===============================================================================
-| 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. `utstring_printf` is actually a function defined statically in `utstring.h`
-   rather than a macro.
-
-// vim: set nowrap syntax=asciidoc: 
-
diff --git a/3rdparty/uthash-1.9.3/src/utarray.h b/3rdparty/uthash-1.9.3/src/utarray.h
deleted file mode 100644 (file)
index e3d4074..0000000
+++ /dev/null
@@ -1,224 +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 array implementation using macros 
- * see http://uthash.sourceforge.net/utarray
- */
-#ifndef UTARRAY_H
-#define UTARRAY_H
-
-#define UTARRAY_VERSION 1.9.1
-
-#ifdef __GNUC__
-#define _UNUSED_ __attribute__ ((__unused__)) 
-#else
-#define _UNUSED_ 
-#endif
-
-#include <stddef.h>  /* size_t */
-#include <string.h>  /* memset, etc */
-#include <stdlib.h>  /* 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 (file)
index a4bdc18..0000000
+++ /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 <string.h>   /* memcmp,strlen */
-#include <stddef.h>   /* 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 <inttypes.h>   /* 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 <unistd.h> 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 (file)
index 34c725b..0000000
+++ /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 (file)
index 277874f..0000000
+++ /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 <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#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 (file)
index 84084b7..0000000
+++ /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 (file)
index 7ddb36d..0000000
+++ /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 (executable)
index 18df8a1..0000000
+++ /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 (file)
index 58b3002..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-#include <stdlib.h>   /* malloc */
-#include <sys/time.h> /* gettimeofday */
-#include <errno.h>    /* perror */
-#include <stdio.h>    /* 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 (executable)
index 0a04f23..0000000
+++ /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 (executable)
index 574403f..0000000
+++ /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 (executable)
index 0c01ebe..0000000
+++ /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 (file)
index 1820334..0000000
+++ /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 (file)
index be89301..0000000
+++ /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 (file)
index 8a0c0cd..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-#include <stdlib.h>   /* malloc */
-#include <errno.h>    /* perror */
-#include <stdio.h>    /* printf */
-#include <unistd.h>   /* 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 (file)
index 3403c9a..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-#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 = (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 (file)
index 9944b07..0000000
+++ /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 <string.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <sys/ptrace.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <sys/wait.h>
-#include <assert.h>
-
-#ifdef __FreeBSD__
-#include <sys/param.h>  /* MAXPATHLEN */
-#include <vm/vm.h>      /* 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<NUM_HASH_FUNCS;i++) {
-    if (hash_fcn_hits[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<num_vmas;i++) {
-    vma = vmas[i];
-    sigscan(pid, vma.start, vma.end, sig);
-  }
-die:
-  vv("detaching and resuming peer\n");
-  if (ptrace(PT_DETACH, pid, NULL, 0) == -1) {
-    fprintf(stderr,"failed to detach from %u: %s\n", (unsigned)pid, strerror(errno));
-  }
-  return 0;
-}
-# else
-int scan(pid_t pid) {
-  FILE *mapf;
-  char mapfile[30], memfile[30], line[100];
-  vma_t *vmas=NULL, vma;
-  unsigned i, num_vmas = 0;
-  int memfd;
-  void *pstart, *pend, *unused;
-  
-  /* attach to the target process and wait for it to suspend */
-  vv("attaching to peer\n");
-  if (ptrace(PTRACE_ATTACH,pid,NULL,NULL) == -1) {
-    fprintf(stderr,"failed to attach to %u: %s\n", (unsigned)pid, strerror(errno));
-    exit(-1);
-  }
-  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;
-  }
-
-  /* get ready to open its memory map. this gives us its valid memory areas */
-  snprintf(mapfile,sizeof(mapfile),"/proc/%u/maps",(unsigned)pid);
-  snprintf(memfile,sizeof(memfile),"/proc/%u/mem", (unsigned)pid);
-  vv("opening peer memory map [%s]\n", mapfile);
-  if ( (mapf = fopen(mapfile,"r")) == NULL) {
-    fprintf(stderr,"failed to open %s: %s\n", mapfile, strerror(errno));
-    goto die;
-  }
-  vv("listing peer virtual memory areas\n");
-  while(fgets(line,sizeof(line),mapf)) {
-    if (sscanf(line, "%p-%p %4c %p %5c", &pstart, &pend, vma.perms,
-         &unused, vma.device) == 5) {
-      vma.start = (off_t)pstart;
-      vma.end = (off_t)pend;
-      if (vma.perms[0] != 'r') continue;          /* only readable vma's */
-      if (memcmp(vma.device,"fd",2)==0) continue; /* skip mapped files */
-      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);
-  fclose(mapf);
-
-  /* ok, open up its memory and start looking around in there */
-  vv("opening peer memory\n");
-  if ( (memfd=open(memfile,O_RDONLY)) == -1) {
-    fprintf(stderr,"failed to open %s: %s\n", memfile, strerror(errno));
-    goto die;
-  }
-  /* look for the hash signature */
-  vv("scanning peer memory for hash table signatures\n");
-  for(i=0;i<num_vmas;i++) {
-    vma = vmas[i];
-    pstart = (void*)vma.start;
-    pend = (void*)vma.end;
-    /*fprintf(stderr,"scanning %p-%p %.4s %.5s\n", pstart, pend, 
-              vma.perms, vma.device);*/
-    sigscan(memfd, vma.start, vma.end, sig, pid);
-  }
-
-  /* done. close memory and detach. this resumes the target process */
-  close(memfd);
-
- die:
-  vv("detaching and resuming peer\n");
-  if (ptrace(PTRACE_DETACH, pid, NULL, NULL) == -1) {
-    fprintf(stderr,"failed to detach from %u: %s\n", (unsigned)pid, strerror(errno));
-  }
-  return 0;
-}
-#endif
-
-
-void usage(const char *prog) {
-  fprintf(stderr,"usage: %s [-v] [-k] <pid>\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 (file)
index bf1d6ff..0000000
+++ /dev/null
@@ -1,219 +0,0 @@
-#include <sys/types.h>  /* for 'open' */
-#include <sys/stat.h>   /* for 'open' */
-#include <fcntl.h>      /* for 'open' */
-#include <stdlib.h>     /* for 'malloc' */
-#include <stdio.h>      /* for 'printf' */
-#include <unistd.h>     /* for 'read' */
-#include <errno.h>      /* for 'sterror' */
-#include <sys/time.h>   /* 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 <windows.h>
-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 (executable)
index ea217b0..0000000
+++ /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 <pct> [-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 (executable)
index e1562d9..0000000
+++ /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 (executable)
index acc5583..0000000
+++ /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 (file)
index ccc50c9..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* printf */
-#include <unistd.h>   /* 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 (file)
index 4be14fe..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-// Windows does not have unix diff so this is a simple replacement
-#include <iostream>
-#include <fstream>
-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 (file)
index 0b08c48..0000000
+++ /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 (file)
index afae6d6..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index b1a27a8..0000000
+++ /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 (file)
index e8efc3b..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index 2b72e98..0000000
+++ /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 (file)
index 81986c5..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <errno.h>    /* perror */
-#include <stdio.h>    /* 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 (file)
index bb6051b..0000000
+++ /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 (file)
index 727f397..0000000
+++ /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 (file)
index dfed3f4..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#include "uthash.h"
-#include <stdio.h>
-#include <stdlib.h>  /* 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 (file)
index baf3ff2..0000000
+++ /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 (file)
index ed624a8..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index 77aeaeb..0000000
+++ /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 (file)
index c31f42a..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <errno.h>    /* perror */
-#include <stdio.h>    /* 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 (file)
index ea0b4ea..0000000
+++ /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 (file)
index ad69a94..0000000
+++ /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 (file)
index cbeffe3..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <string.h>  /* strcpy */
-#include <stdlib.h>  /* malloc */
-#include <stdio.h>   /* 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 (file)
index 1b4d7e1..0000000
+++ /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 (file)
index 59b14f4..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#include <stdlib.h>    /* malloc       */
-#include <stddef.h>    /* offsetof     */
-#include <stdio.h>     /* printf       */
-#include <string.h>    /* 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 (file)
index 92ae3ef..0000000
+++ /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 (file)
index 4684e45..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index db48dcf..0000000
+++ /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 (file)
index 80c4cf6..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index 588d0d9..0000000
+++ /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 (file)
index f0e26b6..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index fd4e2f8..0000000
+++ /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 (file)
index 591ca79..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "uthash.h"
-#include <time.h> 
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index 4d3bb1d..0000000
+++ /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 (file)
index 152df39..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <string.h>  /* memcpy */
-#include <stdlib.h>  /* malloc */
-#include <stdio.h>   /* 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 (file)
index af89f48..0000000
+++ /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 (file)
index 7eb101a..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#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 (file)
index 2483a24..0000000
+++ /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 (file)
index 63f3a21..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#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;
-
-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 (file)
index 79ed10a..0000000
+++ /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 (file)
index 78b633c..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#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 (file)
index 4a2034a..0000000
+++ /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 (file)
index 28d3bf4..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index 5c71cdf..0000000
+++ /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 (file)
index c22be85..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-#include <stdio.h>
-#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 (file)
index 764b01d..0000000
+++ /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 (file)
index 0627739..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-#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(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 (file)
index 80b476c..0000000
+++ /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 (file)
index 1b33e8c..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-#include <stdio.h>
-#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 (file)
index eb88650..0000000
+++ /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 (file)
index 279d891..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-#include <stdio.h>
-#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 (file)
index 6467b60..0000000
+++ /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 (file)
index 8e54a02..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-#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(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 (file)
index 56a52a3..0000000
+++ /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 (file)
index 3f3e479..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index 2b72e98..0000000
+++ /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 (file)
index 711c7d9..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-#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(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 (file)
index 2b72e98..0000000
+++ /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 (file)
index 711c7d9..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-#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(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 (file)
index 2a4d7f7..0000000
+++ /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 (file)
index fad2030..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-#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;
-
-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 (file)
index 2b72e98..0000000
+++ /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 (file)
index d946ec1..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-#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(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 (file)
index 2a4d7f7..0000000
+++ /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 (file)
index 653cdb8..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-#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;
-
-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 (file)
index b33c808..0000000
+++ /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 (file)
index 6d41e5e..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-#include "uthash.h"
-#include <string.h>   /* strcpy */
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index 3b5283b..0000000
+++ /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 (file)
index d91350b..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index f42a945..0000000
+++ /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 (file)
index 7071e1c..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index b20e04b..0000000
+++ /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 (file)
index 500d160..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>
-#include <stdio.h>
-
-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 (file)
index a7e7e6c..0000000
+++ /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 (file)
index b0a5310..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#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 (file)
index 19b148f..0000000
+++ /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 (file)
index 945c9ae..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index ad69a94..0000000
+++ /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 (file)
index fd68f16..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <string.h>  /* strcpy */
-#include <stdlib.h>  /* malloc */
-#include <stdio.h>   /* 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 (file)
index f19e34b..0000000
+++ /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 (file)
index 1e35443..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <stdio.h>
-#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 (file)
index 581660e..0000000
+++ /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 (file)
index b20c579..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-#include <stdio.h>
-#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 (file)
index d09e9bd..0000000
+++ /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 (file)
index fbd40c8..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-#include <stdio.h>
-#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 (file)
index f771df8..0000000
+++ /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 (file)
index 6c419c2..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-#include <stdio.h>
-#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 (file)
index 7e744bc..0000000
+++ /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 (file)
index dca7d9b..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <stdio.h>
-#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 (file)
index 0eeb830..0000000
+++ /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 (file)
index ff25b99..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <stdio.h>
-#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 (file)
index 546e064..0000000
+++ /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 (file)
index 1434d5a..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <stdio.h>    /* 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 (file)
index 8b1acc1..0000000
+++ /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 (file)
index dd0fa75..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#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;
-}
diff --git a/3rdparty/uthash-1.9.3/tests/test49.ans b/3rdparty/uthash-1.9.3/tests/test49.ans
deleted file mode 100644 (file)
index 94954ab..0000000
+++ /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 (file)
index 00afb7a..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#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;
-}
diff --git a/3rdparty/uthash-1.9.3/tests/test5.ans b/3rdparty/uthash-1.9.3/tests/test5.ans
deleted file mode 100644 (file)
index 2ece88f..0000000
+++ /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 (file)
index 7cfd278..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index 1191247..0000000
+++ /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 (file)
index 428116a..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#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;
-}
diff --git a/3rdparty/uthash-1.9.3/tests/test51.ans b/3rdparty/uthash-1.9.3/tests/test51.ans
deleted file mode 100644 (file)
index 3caf269..0000000
+++ /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 (file)
index 16ba88b..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#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;
-}
diff --git a/3rdparty/uthash-1.9.3/tests/test52.ans b/3rdparty/uthash-1.9.3/tests/test52.ans
deleted file mode 100644 (file)
index bd37407..0000000
+++ /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 (file)
index 84b7a48..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#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;
-}
-
diff --git a/3rdparty/uthash-1.9.3/tests/test53.ans b/3rdparty/uthash-1.9.3/tests/test53.ans
deleted file mode 100644 (file)
index a042389..0000000
+++ /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 (file)
index b8fafc5..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#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;
-}
diff --git a/3rdparty/uthash-1.9.3/tests/test54.ans b/3rdparty/uthash-1.9.3/tests/test54.ans
deleted file mode 100644 (file)
index df0083e..0000000
+++ /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 (file)
index 8774bc5..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#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;
-}
diff --git a/3rdparty/uthash-1.9.3/tests/test55.ans b/3rdparty/uthash-1.9.3/tests/test55.ans
deleted file mode 100644 (file)
index a75e7be..0000000
+++ /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 (file)
index e421d68..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#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;
-}
diff --git a/3rdparty/uthash-1.9.3/tests/test56.ans b/3rdparty/uthash-1.9.3/tests/test56.ans
deleted file mode 100644 (file)
index f615d00..0000000
+++ /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 (file)
index 88c015c..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* printf */
-#include <string.h>
-#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 (file)
index 4d3bb1d..0000000
+++ /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 (file)
index f788f87..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-#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;
-}
diff --git a/3rdparty/uthash-1.9.3/tests/test58.ans b/3rdparty/uthash-1.9.3/tests/test58.ans
deleted file mode 100644 (file)
index a23ca72..0000000
+++ /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 (file)
index 6ec891c..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index 5c95811..0000000
+++ /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 (file)
index 40fc2aa..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
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 (file)
index 3f76c8d..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index 9d28857..0000000
+++ /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 (file)
index f7c7c8d..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index 13a9402..0000000
+++ /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 (file)
index a8a16dd..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "uthash.h"
-#include <stdlib.h>   /* malloc */
-#include <stdio.h>    /* 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 (file)
index 4140fa7..0000000
+++ /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 (file)
index e49a62e..0000000
+++ /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 (executable)
index e6809a1..0000000
+++ /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 (file)
index 1045086..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <pthread.h>
-#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;i<LOOPS;i++) {
-      if (pthread_rwlock_rdlock(&lock) != 0) {
-        fprintf(stderr,"can't acquire readlock\n");
-        exit(-1);
-      }
-      HASH_FIND_INT(elts, &i, e);
-      pthread_rwlock_unlock(&lock);
-      if (e) num_found++;
-    }
-    return (void*)num_found;
-}
-void *thread_routine_w( void *arg ) {
-    int i;
-    long num_deld=0;
-    elt *e;
-
-    for(i=0;i<LOOPS;i++) {
-      if (pthread_rwlock_wrlock(&lock) != 0) {
-        fprintf(stderr,"can't acquire write lock\n");
-        exit(-1);
-      }
-      HASH_FIND_INT(elts, &i, e);
-      if (e) {
-        /* HASH_DEL(elts, e); */
-        /* num_deld++; */
-      } else {
-        e = malloc(sizeof(elt));
-        if (!e) exit(-1);
-        e->i = 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 (file)
index 20d984f..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <pthread.h>
-#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; i<LOOPS; i++) {
-      e = malloc(sizeof(elt));
-      if (!e) exit(-1);
-      e->i = i;
-      e->v = 0;
-      HASH_ADD_INT(elts, i, e);
-    }
-
-    for(i=0; i<NTHREADS; i++) {
-      if ( status = pthread_create( &thread[i], NULL, thread_routine, NULL )) {
-          printf("failure: status %d\n", status);
-          exit(-1);
-      }
-    }
-
-    for(i=0; i<NTHREADS; i++) {
-      status = pthread_join( thread[i], &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);
-}