From 7b684c7d070987d7d026f40adef74e8b576e0b83 Mon Sep 17 00:00:00 2001 From: falkTX Date: Fri, 7 Sep 2012 22:00:57 +0100 Subject: [PATCH] Update carla-lilv to latest upstream, refresh custom patches --- c++/carla-includes/lilv | 2 +- c++/carla-includes/serd | 2 +- c++/carla-includes/sord | 2 +- c++/carla-includes/sratom | 2 +- c++/carla-lilv/Makefile | 48 +- c++/carla-lilv/config/lilv_config.h | 33 +- c++/carla-lilv/config/serd_config.h | 22 +- c++/carla-lilv/config/sord_config.h | 2 +- c++/carla-lilv/config/sratom_config.h | 4 +- .../lilv_ui-features+lilvmm.patch | 137 +++++ .../custom-patches/lilv_ui-features.patch | 90 --- .../custom-patches/serd_static-fix.patch | 39 ++ .../custom-patches/sord_zix-tree-size.patch | 75 --- c++/carla-lilv/lilv-0.14.2/INSTALL | 35 -- c++/carla-lilv/lilv-0.14.2/waf | Bin 91475 -> 0 bytes .../{lilv-0.14.2 => lilv-0.14.4}/AUTHORS | 0 .../{lilv-0.14.2 => lilv-0.14.4}/COPYING | 0 c++/carla-lilv/lilv-0.14.4/INSTALL | 59 ++ .../{lilv-0.14.2 => lilv-0.14.4}/NEWS | 20 + .../{lilv-0.14.2 => lilv-0.14.4}/PACKAGING | 0 .../{lilv-0.14.2 => lilv-0.14.4}/README | 0 .../bindings/lilv.i | 0 .../bindings/python/lv2_apply.py | 0 .../bindings/python/lv2_list.py | 0 .../doc/lv2info.1 | 0 .../{lilv-0.14.2 => lilv-0.14.4}/doc/lv2ls.1 | 0 .../doc/reference.doxygen.in | 528 +++++++++++++----- .../doc/style.css | 27 +- .../{lilv-0.14.2 => lilv-0.14.4}/lilv.pc.in | 0 .../{lilv-0.14.2 => lilv-0.14.4}/lilv.ttl | 0 .../{lilv-0.14.2 => lilv-0.14.4}/lilv/lilv.h | 2 +- .../lilv/lilvmm.hpp | 49 +- .../src/collections.c | 13 +- .../src/instance.c | 2 +- .../{lilv-0.14.2 => lilv-0.14.4}/src/lib.c | 0 .../src/lilv_internal.h | 20 +- .../{lilv-0.14.2 => lilv-0.14.4}/src/node.c | 116 ++-- .../{lilv-0.14.2 => lilv-0.14.4}/src/plugin.c | 65 ++- .../src/pluginclass.c | 0 .../{lilv-0.14.2 => lilv-0.14.4}/src/port.c | 3 +- .../{lilv-0.14.2 => lilv-0.14.4}/src/query.c | 2 +- .../src/scalepoint.c | 0 .../{lilv-0.14.2 => lilv-0.14.4}/src/state.c | 52 +- .../{lilv-0.14.2 => lilv-0.14.4}/src/ui.c | 2 +- .../{lilv-0.14.2 => lilv-0.14.4}/src/util.c | 26 +- .../{lilv-0.14.2 => lilv-0.14.4}/src/world.c | 34 +- .../src/zix/common.h | 7 + .../src/zix/tree.c | 97 +++- .../src/zix/tree.h | 32 +- .../test/lilv_test.c | 85 +-- .../test/manifest.ttl.in | 0 .../test/test_plugin.c | 2 +- .../test/test_plugin.ttl.in | 0 c++/carla-lilv/lilv-0.14.4/utils/bench.h | 52 ++ .../utils/lilv-bench.c | 17 - .../utils/lilv.bash_completion | 0 c++/carla-lilv/lilv-0.14.4/utils/lv2bench.c | 226 ++++++++ .../utils/lv2info.c | 26 +- .../utils/lv2ls.c | 6 +- c++/carla-lilv/lilv-0.14.4/utils/uri_table.h | 73 +++ c++/carla-lilv/lilv-0.14.4/waf | Bin 0 -> 72589 bytes .../{lilv-0.14.2 => lilv-0.14.4}/wscript | 197 +++---- c++/carla-lilv/lilv.c | 27 +- c++/carla-lilv/serd-0.14.0/INSTALL | 35 -- c++/carla-lilv/serd-0.14.0/doc/layout.xml | 184 ------ c++/carla-lilv/serd-0.14.0/waf | Bin 92192 -> 0 bytes .../{serd-0.14.0 => serd-0.18.0}/AUTHORS | 0 .../{serd-0.14.0 => serd-0.18.0}/COPYING | 0 c++/carla-lilv/serd-0.18.0/INSTALL | 59 ++ .../{serd-0.14.0 => serd-0.18.0}/NEWS | 18 + .../{serd-0.14.0 => serd-0.18.0}/PACKAGING | 0 .../{serd-0.14.0 => serd-0.18.0}/README | 0 .../doc/reference.doxygen.in | 526 +++++++++++++---- .../{serd-0.14.0 => serd-0.18.0}/doc/serdi.1 | 10 +- .../doc/style.css | 41 +- .../{serd-0.14.0 => serd-0.18.0}/serd.pc.in | 0 .../{serd-0.14.0 => serd-0.18.0}/serd/serd.h | 85 ++- .../{serd-0.14.0 => serd-0.18.0}/src/env.c | 9 +- .../{serd-0.14.0 => serd-0.18.0}/src/node.c | 14 +- .../{serd-0.14.0 => serd-0.18.0}/src/reader.c | 152 +++-- .../src/serd_internal.h | 15 +- .../{serd-0.14.0 => serd-0.18.0}/src/serdi.c | 36 +- .../{serd-0.14.0 => serd-0.18.0}/src/string.c | 5 +- .../{serd-0.14.0 => serd-0.18.0}/src/uri.c | 6 +- .../{serd-0.14.0 => serd-0.18.0}/src/writer.c | 109 ++-- .../tests/README.txt | 0 .../tests/UTF-8.ttl | 0 .../tests/bad-00.ttl | 0 .../tests/bad-01.ttl | 0 .../tests/bad-02.ttl | 0 .../tests/bad-03.ttl | 0 .../tests/bad-04.ttl | 0 .../tests/bad-05.ttl | 0 .../tests/bad-06.ttl | 0 .../tests/bad-07.ttl | 0 .../tests/bad-08.ttl | 0 .../tests/bad-09.ttl | 0 .../tests/bad-10.ttl | 0 .../tests/bad-11.ttl | 0 .../tests/bad-12.ttl | 0 .../tests/bad-13.ttl | 0 .../tests/bad-14.ttl | 0 .../tests/bad-base.ttl | 0 .../tests/bad-blank.ttl | 0 .../tests/bad-datatype.ttl | 0 .../tests/bad-eof-in-blank.ttl | 0 .../tests/bad-eof-in-escape.ttl | 0 .../tests/bad-eof-in-lang-suffix.ttl | 0 .../tests/bad-eof-in-lang.ttl | 0 .../tests/bad-eof-in-list.ttl | 0 .../tests/bad-eof-in-object-list.ttl | 0 .../tests/bad-eof-in-object-list2.ttl | 0 .../tests/bad-eof-in-predicate-list.ttl | 0 .../tests/bad-eof-in-string.ttl | 0 .../tests/bad-eof-in-triple-quote.ttl | 0 .../tests/bad-eof-in-uri.ttl | 0 .../tests/bad-escape.ttl | 0 .../tests/bad-hex-digit.ttl | 0 .../tests/bad-id-clash.ttl | 0 .../tests/bad-lang.ttl | 0 .../tests/bad-list.ttl | 0 .../tests/bad-list2.ttl | 0 .../tests/bad-namespace.ttl | 0 .../tests/bad-ns.ttl | 0 .../tests/bad-num.ttl | 0 .../tests/bad-object.ttl | 0 .../tests/bad-object2.ttl | 0 .../tests/bad-prefix.ttl | 0 .../tests/bad-string.ttl | 0 .../tests/bad-uri-escape.ttl | 0 .../tests/bad-verb.ttl | 0 .../tests/base.out | 0 .../tests/base.ttl | 0 .../tests/manifest-bad.ttl | 0 .../tests/manifest.ttl | 0 .../tests/rdf-schema.out | 0 .../tests/rdf-schema.ttl | 0 .../tests/rdfq-results.out | 0 .../tests/rdfq-results.ttl | 0 .../tests/rdfs-namespace.out | 0 .../tests/rdfs-namespace.ttl | 0 .../tests/serd_test.c | 4 +- .../tests/test-00.out | 0 .../tests/test-00.ttl | 0 .../tests/test-01.out | 0 .../tests/test-01.ttl | 0 .../tests/test-02.out | 0 .../tests/test-02.ttl | 0 .../tests/test-03.out | 0 .../tests/test-03.ttl | 0 .../tests/test-04.out | 0 .../tests/test-04.ttl | 0 .../tests/test-05.out | 0 .../tests/test-05.ttl | 0 .../tests/test-06.out | 0 .../tests/test-06.ttl | 0 .../tests/test-07.out | 0 .../tests/test-07.ttl | 0 .../tests/test-08.out | 0 .../tests/test-08.ttl | 0 .../tests/test-09.out | 0 .../tests/test-09.ttl | 0 .../tests/test-10.out | 0 .../tests/test-10.ttl | 0 .../tests/test-11.out | 0 .../tests/test-11.ttl | 0 .../tests/test-12.out | 0 .../tests/test-12.ttl | 0 .../tests/test-13.out | 0 .../tests/test-13.ttl | 0 .../tests/test-14.out | 0 .../tests/test-14.ttl | 0 .../tests/test-15.out | 0 .../tests/test-15.ttl | 0 .../tests/test-16.out | 0 .../tests/test-16.ttl | 0 .../tests/test-17.out | 0 .../tests/test-17.ttl | 0 .../tests/test-18.out | 0 .../tests/test-18.ttl | 0 .../tests/test-19.out | 0 .../tests/test-19.ttl | 0 .../tests/test-20.out | 0 .../tests/test-20.ttl | 0 .../tests/test-21.out | 0 .../tests/test-21.ttl | 0 .../tests/test-22.out | 0 .../tests/test-22.ttl | 0 .../tests/test-23.out | 0 .../tests/test-23.ttl | 0 .../tests/test-24.out | 0 .../tests/test-24.ttl | 0 .../tests/test-25.out | 0 .../tests/test-25.ttl | 0 .../tests/test-26.out | 0 .../tests/test-26.ttl | 0 .../tests/test-27.out | 0 .../tests/test-27.ttl | 0 .../tests/test-29.out | 0 .../tests/test-29.ttl | 0 .../tests/test-30.out | 0 .../tests/test-30.ttl | 0 .../tests/test-backspace.out | 0 .../tests/test-backspace.ttl | 0 .../tests/test-bad-utf8.out | 0 .../tests/test-bad-utf8.ttl | 0 .../tests/test-base-query.out | 0 .../tests/test-base-query.ttl | 0 .../tests/test-blank-cont.out | 0 .../tests/test-blank-cont.ttl | 0 .../tests/test-blank-in-list.out | 0 .../tests/test-blank-in-list.ttl | 0 .../tests/test-bom.out | 0 .../tests/test-bom.ttl | 0 .../tests/test-cr.out | 0 .../tests/test-cr.ttl | 0 .../tests/test-delete.out | 0 .../tests/test-delete.ttl | 0 .../tests/test-digit-start-pname.out | 1 + .../tests/test-digit-start-pname.ttl | 3 + .../tests/test-eof-at-page-end.out | 0 .../tests/test-eof-at-page-end.ttl | 0 .../tests/test-escapes.out | 0 .../tests/test-escapes.ttl | 0 .../tests/test-id.out | 0 .../tests/test-id.ttl | 0 .../tests/test-lang.out | 0 .../tests/test-lang.ttl | 0 .../tests/test-list-in-blank.out | 0 .../tests/test-list-in-blank.ttl | 0 .../tests/test-list-subject.out | 0 .../tests/test-list-subject.ttl | 0 .../tests/test-list.out | 0 .../tests/test-list.ttl | 0 .../tests/test-long-string.out | 0 .../tests/test-long-string.ttl | 0 .../tests/test-no-spaces.out | 0 .../tests/test-no-spaces.ttl | 0 .../tests/test-num.out | 0 .../tests/test-num.ttl | 0 .../tests/test-out-of-range-unicode.out | 0 .../tests/test-out-of-range-unicode.ttl | 0 .../tests/test-prefix.out | 0 .../tests/test-prefix.ttl | 0 .../tests/test-pretty.out | 0 .../tests/test-pretty.ttl | 0 .../tests/test-rel.out | 0 .../tests/test-rel.ttl | 0 .../tests/test-semi-dot.out | 0 .../tests/test-semi-dot.ttl | 0 .../tests/test-uri.out | 0 .../tests/test-uri.ttl | 0 .../tests/test-utf8-uri.out | 0 .../tests/test-utf8-uri.ttl | 0 c++/carla-lilv/serd-0.18.0/waf | Bin 0 -> 72589 bytes .../{serd-0.14.0 => serd-0.18.0}/wscript | 227 ++++---- c++/carla-lilv/serd.c | 12 +- .../{sord-0.8.0 => sord-0.10.0}/AUTHORS | 0 .../{sord-0.8.0 => sord-0.10.0}/COPYING | 0 c++/carla-lilv/sord-0.10.0/INSTALL | 59 ++ .../{sord-0.8.0 => sord-0.10.0}/NEWS | 18 + .../{sord-0.8.0 => sord-0.10.0}/PACKAGING | 0 .../{sord-0.8.0 => sord-0.10.0}/README | 0 .../doc/reference.doxygen.in | 526 +++++++++++++---- .../doc/sord_validate.1 | 0 .../{sord-0.8.0 => sord-0.10.0}/doc/sordi.1 | 0 .../doc/style.css | 41 +- .../sord-0.10.0/sord-0.10.0.tar.bz2.sig | Bin 0 -> 543 bytes .../{sord-0.8.0 => sord-0.10.0}/sord.pc.in | 0 .../{sord-0.8.0 => sord-0.10.0}/sord/sord.h | 12 + .../sord/sordmm.hpp | 30 +- .../{sord-0.8.0 => sord-0.10.0}/src/sord.c | 379 ++++++------- .../src/sord_internal.h | 25 +- .../src/sord_test.c | 12 +- .../src/sord_validate.c | 26 +- .../{sord-0.8.0 => sord-0.10.0}/src/sordi.c | 13 +- .../src/sordmm_test.cpp | 2 +- .../{sord-0.8.0 => sord-0.10.0}/src/syntax.c | 0 .../src/zix/common.h | 12 + c++/carla-lilv/sord-0.10.0/src/zix/digest.c | 57 ++ c++/carla-lilv/sord-0.10.0/src/zix/digest.h | 39 ++ c++/carla-lilv/sord-0.10.0/src/zix/hash.c | 228 ++++++++ c++/carla-lilv/sord-0.10.0/src/zix/hash.h | 140 +++++ .../src/zix/tree.c | 215 +++++-- .../src/zix/tree.h | 51 +- .../tests/README.txt | 0 .../tests/UTF-8.ttl | 0 .../tests/manifest.ttl | 0 .../tests/rdf-schema.out | 0 .../tests/rdf-schema.ttl | 0 .../tests/rdfq-results.out | 0 .../tests/rdfq-results.ttl | 0 .../tests/rdfs-namespace.out | 0 .../tests/rdfs-namespace.ttl | 0 .../tests/test-00.out | 0 .../tests/test-00.ttl | 0 .../tests/test-01.out | 0 .../tests/test-01.ttl | 0 .../tests/test-02.out | 0 .../tests/test-02.ttl | 0 .../tests/test-03.out | 0 .../tests/test-03.ttl | 0 .../tests/test-04.out | 0 .../tests/test-04.ttl | 0 .../tests/test-05.out | 0 .../tests/test-05.ttl | 0 .../tests/test-06.out | 0 .../tests/test-06.ttl | 0 .../tests/test-07.out | 0 .../tests/test-07.ttl | 0 .../tests/test-08.out | 0 .../tests/test-08.ttl | 0 .../tests/test-09.out | 0 .../tests/test-09.ttl | 0 .../tests/test-10.out | 0 .../tests/test-10.ttl | 0 .../tests/test-11.out | 0 .../tests/test-11.ttl | 0 .../tests/test-12.out | 0 .../tests/test-12.ttl | 0 .../tests/test-13.out | 0 .../tests/test-13.ttl | 0 .../tests/test-14.out | 0 .../tests/test-14.ttl | 0 .../tests/test-15.out | 0 .../tests/test-15.ttl | 0 .../tests/test-16.out | 0 .../tests/test-16.ttl | 0 .../tests/test-17.out | 0 .../tests/test-17.ttl | 0 .../tests/test-18.out | 0 .../tests/test-18.ttl | 0 .../tests/test-19.out | 0 .../tests/test-19.ttl | 0 .../tests/test-20.out | 0 .../tests/test-20.ttl | 0 .../tests/test-21.out | 0 .../tests/test-21.ttl | 0 .../tests/test-22.out | 0 .../tests/test-22.ttl | 0 .../tests/test-23.out | 0 .../tests/test-23.ttl | 0 .../tests/test-24.out | 0 .../tests/test-24.ttl | 0 .../tests/test-25.out | 0 .../tests/test-25.ttl | 0 .../tests/test-26.out | 0 .../tests/test-26.ttl | 0 .../tests/test-27.out | 0 .../tests/test-27.ttl | 0 .../tests/test-29.out | 0 .../tests/test-29.ttl | 0 .../tests/test-30.out | 0 .../tests/test-30.ttl | 0 .../tests/test-id.out | 0 .../tests/test-id.ttl | 0 .../tests/test-lang.out | 0 .../tests/test-lang.ttl | 0 .../tests/test-num.out | 0 .../tests/test-num.ttl | 0 c++/carla-lilv/sord-0.10.0/waf | Bin 0 -> 72589 bytes .../{sord-0.8.0 => sord-0.10.0}/wscript | 172 +++--- c++/carla-lilv/sord-0.8.0/INSTALL | 35 -- c++/carla-lilv/sord-0.8.0/doc/layout.xml | 184 ------ c++/carla-lilv/sord-0.8.0/src/zix/hash.c | 226 -------- c++/carla-lilv/sord-0.8.0/src/zix/hash.h | 75 --- c++/carla-lilv/sord-0.8.0/waf | Bin 92192 -> 0 bytes c++/carla-lilv/sord.c | 6 +- c++/carla-lilv/sratom-0.2.0/NEWS | 6 - c++/carla-lilv/sratom-0.2.0/doc/layout.xml | 184 ------ c++/carla-lilv/sratom-0.2.0/waf | Bin 91475 -> 0 bytes .../{sratom-0.2.0 => sratom-0.4.0}/COPYING | 0 c++/carla-lilv/sratom-0.4.0/NEWS | 16 + .../{sratom-0.2.0 => sratom-0.4.0}/README | 0 .../doc/reference.doxygen.in | 526 +++++++++++++---- .../doc/style.css | 41 +- .../sratom.pc.in | 0 .../sratom/sratom.h | 35 +- .../src/sratom.c | 188 ++++--- .../tests/sratom_test.c | 65 ++- c++/carla-lilv/sratom-0.4.0/waf | Bin 0 -> 72589 bytes .../{sratom-0.2.0 => sratom-0.4.0}/wscript | 97 ++-- c++/carla-lilv/sratom.c | 2 +- 383 files changed, 4704 insertions(+), 2950 deletions(-) create mode 100644 c++/carla-lilv/custom-patches/lilv_ui-features+lilvmm.patch delete mode 100644 c++/carla-lilv/custom-patches/lilv_ui-features.patch create mode 100644 c++/carla-lilv/custom-patches/serd_static-fix.patch delete mode 100644 c++/carla-lilv/custom-patches/sord_zix-tree-size.patch delete mode 100644 c++/carla-lilv/lilv-0.14.2/INSTALL delete mode 100755 c++/carla-lilv/lilv-0.14.2/waf rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/AUTHORS (100%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/COPYING (100%) create mode 100644 c++/carla-lilv/lilv-0.14.4/INSTALL rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/NEWS (75%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/PACKAGING (100%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/README (100%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/bindings/lilv.i (100%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/bindings/python/lv2_apply.py (100%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/bindings/python/lv2_list.py (100%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/doc/lv2info.1 (100%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/doc/lv2ls.1 (100%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/doc/reference.doxygen.in (73%) rename c++/carla-lilv/{serd-0.14.0 => lilv-0.14.4}/doc/style.css (97%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/lilv.pc.in (100%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/lilv.ttl (100%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/lilv/lilv.h (99%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/lilv/lilvmm.hpp (87%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/collections.c (92%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/instance.c (98%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/lib.c (100%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/lilv_internal.h (97%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/node.c (75%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/plugin.c (94%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/pluginclass.c (100%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/port.c (98%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/query.c (99%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/scalepoint.c (100%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/state.c (96%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/ui.c (98%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/util.c (97%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/world.c (96%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/zix/common.h (90%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/zix/tree.c (93%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/src/zix/tree.h (90%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/test/lilv_test.c (98%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/test/manifest.ttl.in (100%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/test/test_plugin.c (99%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/test/test_plugin.ttl.in (100%) create mode 100644 c++/carla-lilv/lilv-0.14.4/utils/bench.h rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/utils/lilv-bench.c (71%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/utils/lilv.bash_completion (100%) create mode 100644 c++/carla-lilv/lilv-0.14.4/utils/lv2bench.c rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/utils/lv2info.c (96%) rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/utils/lv2ls.c (98%) create mode 100644 c++/carla-lilv/lilv-0.14.4/utils/uri_table.h create mode 100755 c++/carla-lilv/lilv-0.14.4/waf rename c++/carla-lilv/{lilv-0.14.2 => lilv-0.14.4}/wscript (66%) delete mode 100644 c++/carla-lilv/serd-0.14.0/INSTALL delete mode 100644 c++/carla-lilv/serd-0.14.0/doc/layout.xml delete mode 100755 c++/carla-lilv/serd-0.14.0/waf rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/AUTHORS (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/COPYING (100%) create mode 100644 c++/carla-lilv/serd-0.18.0/INSTALL rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/NEWS (80%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/PACKAGING (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/README (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/doc/reference.doxygen.in (73%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/doc/serdi.1 (73%) rename c++/carla-lilv/{lilv-0.14.2 => serd-0.18.0}/doc/style.css (95%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/serd.pc.in (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/serd/serd.h (89%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/src/env.c (96%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/src/node.c (96%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/src/reader.c (90%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/src/serd_internal.h (95%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/src/serdi.c (87%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/src/string.c (94%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/src/uri.c (98%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/src/writer.c (91%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/README.txt (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/UTF-8.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-00.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-01.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-02.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-03.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-04.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-05.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-06.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-07.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-08.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-09.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-10.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-11.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-12.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-13.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-14.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-base.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-blank.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-datatype.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-eof-in-blank.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-eof-in-escape.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-eof-in-lang-suffix.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-eof-in-lang.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-eof-in-list.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-eof-in-object-list.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-eof-in-object-list2.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-eof-in-predicate-list.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-eof-in-string.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-eof-in-triple-quote.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-eof-in-uri.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-escape.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-hex-digit.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-id-clash.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-lang.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-list.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-list2.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-namespace.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-ns.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-num.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-object.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-object2.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-prefix.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-string.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-uri-escape.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/bad-verb.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/base.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/base.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/manifest-bad.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/manifest.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/rdf-schema.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/rdf-schema.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/rdfq-results.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/rdfq-results.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/rdfs-namespace.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/rdfs-namespace.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/serd_test.c (99%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-00.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-00.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-01.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-01.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-02.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-02.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-03.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-03.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-04.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-04.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-05.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-05.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-06.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-06.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-07.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-07.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-08.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-08.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-09.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-09.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-10.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-10.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-11.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-11.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-12.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-12.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-13.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-13.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-14.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-14.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-15.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-15.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-16.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-16.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-17.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-17.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-18.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-18.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-19.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-19.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-20.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-20.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-21.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-21.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-22.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-22.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-23.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-23.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-24.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-24.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-25.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-25.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-26.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-26.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-27.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-27.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-29.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-29.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-30.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-30.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-backspace.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-backspace.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-bad-utf8.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-bad-utf8.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-base-query.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-base-query.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-blank-cont.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-blank-cont.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-blank-in-list.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-blank-in-list.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-bom.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-bom.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-cr.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-cr.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-delete.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-delete.ttl (100%) create mode 100644 c++/carla-lilv/serd-0.18.0/tests/test-digit-start-pname.out create mode 100644 c++/carla-lilv/serd-0.18.0/tests/test-digit-start-pname.ttl rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-eof-at-page-end.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-eof-at-page-end.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-escapes.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-escapes.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-id.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-id.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-lang.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-lang.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-list-in-blank.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-list-in-blank.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-list-subject.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-list-subject.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-list.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-list.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-long-string.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-long-string.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-no-spaces.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-no-spaces.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-num.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-num.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-out-of-range-unicode.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-out-of-range-unicode.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-prefix.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-prefix.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-pretty.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-pretty.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-rel.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-rel.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-semi-dot.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-semi-dot.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-uri.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-uri.ttl (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-utf8-uri.out (100%) rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/tests/test-utf8-uri.ttl (100%) create mode 100755 c++/carla-lilv/serd-0.18.0/waf rename c++/carla-lilv/{serd-0.14.0 => serd-0.18.0}/wscript (63%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/AUTHORS (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/COPYING (100%) create mode 100644 c++/carla-lilv/sord-0.10.0/INSTALL rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/NEWS (63%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/PACKAGING (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/README (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/doc/reference.doxygen.in (73%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/doc/sord_validate.1 (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/doc/sordi.1 (100%) rename c++/carla-lilv/{sratom-0.2.0 => sord-0.10.0}/doc/style.css (95%) create mode 100644 c++/carla-lilv/sord-0.10.0/sord-0.10.0.tar.bz2.sig rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/sord.pc.in (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/sord/sord.h (97%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/sord/sordmm.hpp (96%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/src/sord.c (78%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/src/sord_internal.h (67%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/src/sord_test.c (99%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/src/sord_validate.c (97%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/src/sordi.c (97%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/src/sordmm_test.cpp (94%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/src/syntax.c (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/src/zix/common.h (86%) create mode 100644 c++/carla-lilv/sord-0.10.0/src/zix/digest.c create mode 100644 c++/carla-lilv/sord-0.10.0/src/zix/digest.h create mode 100644 c++/carla-lilv/sord-0.10.0/src/zix/hash.c create mode 100644 c++/carla-lilv/sord-0.10.0/src/zix/hash.h rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/src/zix/tree.c (74%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/src/zix/tree.h (74%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/README.txt (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/UTF-8.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/manifest.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/rdf-schema.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/rdf-schema.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/rdfq-results.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/rdfq-results.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/rdfs-namespace.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/rdfs-namespace.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-00.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-00.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-01.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-01.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-02.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-02.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-03.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-03.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-04.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-04.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-05.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-05.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-06.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-06.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-07.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-07.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-08.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-08.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-09.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-09.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-10.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-10.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-11.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-11.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-12.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-12.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-13.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-13.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-14.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-14.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-15.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-15.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-16.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-16.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-17.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-17.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-18.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-18.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-19.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-19.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-20.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-20.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-21.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-21.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-22.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-22.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-23.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-23.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-24.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-24.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-25.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-25.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-26.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-26.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-27.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-27.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-29.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-29.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-30.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-30.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-id.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-id.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-lang.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-lang.ttl (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-num.out (100%) rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/tests/test-num.ttl (100%) create mode 100755 c++/carla-lilv/sord-0.10.0/waf rename c++/carla-lilv/{sord-0.8.0 => sord-0.10.0}/wscript (66%) delete mode 100644 c++/carla-lilv/sord-0.8.0/INSTALL delete mode 100644 c++/carla-lilv/sord-0.8.0/doc/layout.xml delete mode 100644 c++/carla-lilv/sord-0.8.0/src/zix/hash.c delete mode 100644 c++/carla-lilv/sord-0.8.0/src/zix/hash.h delete mode 100755 c++/carla-lilv/sord-0.8.0/waf delete mode 100644 c++/carla-lilv/sratom-0.2.0/NEWS delete mode 100644 c++/carla-lilv/sratom-0.2.0/doc/layout.xml delete mode 100755 c++/carla-lilv/sratom-0.2.0/waf rename c++/carla-lilv/{sratom-0.2.0 => sratom-0.4.0}/COPYING (100%) create mode 100644 c++/carla-lilv/sratom-0.4.0/NEWS rename c++/carla-lilv/{sratom-0.2.0 => sratom-0.4.0}/README (100%) rename c++/carla-lilv/{sratom-0.2.0 => sratom-0.4.0}/doc/reference.doxygen.in (73%) rename c++/carla-lilv/{sord-0.8.0 => sratom-0.4.0}/doc/style.css (95%) rename c++/carla-lilv/{sratom-0.2.0 => sratom-0.4.0}/sratom.pc.in (100%) rename c++/carla-lilv/{sratom-0.2.0 => sratom-0.4.0}/sratom/sratom.h (81%) rename c++/carla-lilv/{sratom-0.2.0 => sratom-0.4.0}/src/sratom.c (82%) rename c++/carla-lilv/{sratom-0.2.0 => sratom-0.4.0}/tests/sratom_test.c (85%) create mode 100755 c++/carla-lilv/sratom-0.4.0/waf rename c++/carla-lilv/{sratom-0.2.0 => sratom-0.4.0}/wscript (63%) diff --git a/c++/carla-includes/lilv b/c++/carla-includes/lilv index d69cd8c..e081c0d 120000 --- a/c++/carla-includes/lilv +++ b/c++/carla-includes/lilv @@ -1 +1 @@ -../carla-lilv/lilv-0.14.2/lilv \ No newline at end of file +../carla-lilv/lilv-0.14.4/lilv \ No newline at end of file diff --git a/c++/carla-includes/serd b/c++/carla-includes/serd index f4b02ac..5f016fc 120000 --- a/c++/carla-includes/serd +++ b/c++/carla-includes/serd @@ -1 +1 @@ -../carla-lilv/serd-0.14.0/serd \ No newline at end of file +../carla-lilv/serd-0.18.0/serd \ No newline at end of file diff --git a/c++/carla-includes/sord b/c++/carla-includes/sord index 295fc07..ba14c42 120000 --- a/c++/carla-includes/sord +++ b/c++/carla-includes/sord @@ -1 +1 @@ -../carla-lilv/sord-0.8.0/sord \ No newline at end of file +../carla-lilv/sord-0.10.0/sord \ No newline at end of file diff --git a/c++/carla-includes/sratom b/c++/carla-includes/sratom index 71dc1f2..0f15801 120000 --- a/c++/carla-includes/sratom +++ b/c++/carla-includes/sratom @@ -1 +1 @@ -../carla-lilv/sratom-0.2.0/sratom \ No newline at end of file +../carla-lilv/sratom-0.4.0/sratom \ No newline at end of file diff --git a/c++/carla-lilv/Makefile b/c++/carla-lilv/Makefile index cd9100c..366133b 100644 --- a/c++/carla-lilv/Makefile +++ b/c++/carla-lilv/Makefile @@ -7,10 +7,10 @@ CC ?= gcc AR ?= ar -SERD_VERSION = 0.14.0 -SORD_VERSION = 0.8.0 -SRATOM_VERSION = 0.2.0 -LILV_VERSION = 0.14.2 +SERD_VERSION = 0.18.0 +SORD_VERSION = 0.10.0 +SRATOM_VERSION = 0.4.0 +LILV_VERSION = 0.14.4 BUILD_FLAGS = -O2 -ffast-math -fomit-frame-pointer -fvisibility=hidden -fPIC -mtune=generic -msse -mfpmath=sse -std=c99 -Wall $(CFLAGS) BUILD_FLAGS += -Iconfig -I../carla-includes @@ -32,16 +32,16 @@ carla_lilv.a: $(OBJS) $(AR) rs $@ $^ serd.o: serd.c - $(CC) $< $(BUILD_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Iserd-$(SERD_VERSION) -c -o $@ sord.o: sord.c - $(CC) $< $(BUILD_FLAGS) -Isord-$(SORD_VERSION)/src -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Isord-$(SORD_VERSION) -Isord-$(SORD_VERSION)/src -c -o $@ sratom.o: sratom.c - $(CC) $< $(BUILD_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Isratom-$(SRATOM_VERSION) -c -o $@ lilv.o: lilv.c - $(CC) $< $(BUILD_FLAGS) -Ililv-$(LILV_VERSION)/src -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Ililv-$(LILV_VERSION) -Ililv-$(LILV_VERSION)/src -c -o $@ # -------------------------------------------------------------- @@ -51,16 +51,16 @@ carla_lilv_posix32.a: $(OBJS_posix32) $(AR) rs $@ $^ serd_posix32.o: serd.c - $(CC) $< $(BUILD_FLAGS) $(32BIT_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Iserd-$(SERD_VERSION) $(32BIT_FLAGS) -c -o $@ sord_posix32.o: sord.c - $(CC) $< $(BUILD_FLAGS) -Isord-$(SORD_VERSION)/src $(32BIT_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Isord-$(SORD_VERSION) -Isord-$(SORD_VERSION)/src $(32BIT_FLAGS) -c -o $@ sratom_posix32.o: sratom.c - $(CC) $< $(BUILD_FLAGS) $(32BIT_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Isratom-$(SRATOM_VERSION) $(32BIT_FLAGS) -c -o $@ lilv_posix32.o: lilv.c - $(CC) $< $(BUILD_FLAGS) -Ililv-$(LILV_VERSION)/src $(32BIT_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Ililv-$(LILV_VERSION) -Ililv-$(LILV_VERSION)/src $(32BIT_FLAGS) -c -o $@ # -------------------------------------------------------------- @@ -70,16 +70,16 @@ carla_lilv_posix64.a: $(OBJS_posix64) $(AR) rs $@ $^ serd_posix64.o: serd.c - $(CC) $< $(BUILD_FLAGS) $(64BIT_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Iserd-$(SERD_VERSION) $(64BIT_FLAGS) -c -o $@ sord_posix64.o: sord.c - $(CC) $< $(BUILD_FLAGS) -Isord-$(SORD_VERSION)/src $(64BIT_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Isord-$(SORD_VERSION) -Isord-$(SORD_VERSION)/src $(64BIT_FLAGS) -c -o $@ sratom_posix64.o: sratom.c - $(CC) $< $(BUILD_FLAGS) $(64BIT_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Isratom-$(SRATOM_VERSION) $(64BIT_FLAGS) -c -o $@ lilv_posix64.o: lilv.c - $(CC) $< $(BUILD_FLAGS) -Ililv-$(LILV_VERSION)/src $(64BIT_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Ililv-$(LILV_VERSION) -Ililv-$(LILV_VERSION)/src $(64BIT_FLAGS) -c -o $@ # -------------------------------------------------------------- @@ -89,16 +89,16 @@ carla_lilv_win32.a: $(OBJS_win32) $(AR) rs $@ $^ serd_win32.o: serd.c - $(CC) $< $(BUILD_FLAGS) $(32BIT_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Iserd-$(SERD_VERSION) $(32BIT_FLAGS) -c -o $@ sord_win32.o: sord.c - $(CC) $< $(BUILD_FLAGS) -Isord-$(SORD_VERSION)/src $(32BIT_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Isord-$(SORD_VERSION) -Isord-$(SORD_VERSION)/src $(32BIT_FLAGS) -c -o $@ sratom_win32.o: sratom.c - $(CC) $< $(BUILD_FLAGS) $(32BIT_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Isratom-$(SRATOM_VERSION) $(32BIT_FLAGS) -c -o $@ lilv_win32.o: lilv.c - $(CC) $< $(BUILD_FLAGS) -Ililv-$(LILV_VERSION)/src $(32BIT_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Ililv-$(LILV_VERSION) -Ililv-$(LILV_VERSION)/src $(32BIT_FLAGS) -c -o $@ # -------------------------------------------------------------- @@ -108,16 +108,16 @@ carla_lilv_win64.a: $(OBJS_win64) $(AR) rs $@ $^ serd_win64.o: serd.c - $(CC) $< $(BUILD_FLAGS) $(64BIT_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Iserd-$(SERD_VERSION) $(64BIT_FLAGS) -c -o $@ sord_win64.o: sord.c - $(CC) $< $(BUILD_FLAGS) -Isord-$(SORD_VERSION)/src $(64BIT_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Isord-$(SORD_VERSION) -Isord-$(SORD_VERSION)/src $(64BIT_FLAGS) -c -o $@ sratom_win64.o: sratom.c - $(CC) $< $(BUILD_FLAGS) $(64BIT_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Isratom-$(SRATOM_VERSION) $(64BIT_FLAGS) -c -o $@ lilv_win64.o: lilv.c - $(CC) $< $(BUILD_FLAGS) -Ililv-$(LILV_VERSION)/src $(64BIT_FLAGS) -c -o $@ + $(CC) $< $(BUILD_FLAGS) -Ililv-$(LILV_VERSION) -Ililv-$(LILV_VERSION)/src $(64BIT_FLAGS) -c -o $@ # -------------------------------------------------------------- diff --git a/c++/carla-lilv/config/lilv_config.h b/c++/carla-lilv/config/lilv_config.h index 4d9b06f..d1a072d 100644 --- a/c++/carla-lilv/config/lilv_config.h +++ b/c++/carla-lilv/config/lilv_config.h @@ -2,27 +2,34 @@ #ifndef _LILV_CONFIG_H_ #define _LILV_CONFIG_H_ -#define LILV_VERSION "0.14.2" +#define LILV_VERSION "0.14.4" #define LILV_NEW_LV2 1 -#define HAVE_LV2 1 -#define HAVE_SERD 1 -#define HAVE_SORD 1 +#define HAVE_LV2 1 +#define HAVE_SERD 1 +#define HAVE_SORD 1 #define HAVE_SRATOM 1 + #define HAVE_FILENO 1 +#define HAVE_CLOCK_GETTIME 1 -#ifndef _WIN32 -#define HAVE_FLOCK 1 +#ifdef __WIN32__ + #define LILV_PATH_SEP ";" + #define LILV_DIR_SEP "\\" +#else + #define LILV_PATH_SEP ":" + #define LILV_DIR_SEP "/" + #define HAVE_FLOCK 1 #endif -#ifdef _WIN32 -#define LILV_PATH_SEP ";" -#define LILV_DIR_SEP "\\" -#define LILV_DEFAULT_LV2_PATH "%APPDATA%\\LV2;%COMMONPROGRAMFILES%\\LV2" +#if defined(__APPLE__) + #define LILV_DEFAULT_LV2_PATH "~/.lv2:/usr/local/lib/lv2:/usr/lib/lv2:/Library/Audio/Plug-Ins/LV2" +#elif defined(__HAIKU__) + #define LILV_DEFAULT_LV2_PATH "~/.lv2:/boot/common/add-ons/lv2" +#elif defined(__WIN32__) + #define LILV_DEFAULT_LV2_PATH "%APPDATA%\\LV2;%COMMONPROGRAMFILES%\\LV2" #else -#define LILV_PATH_SEP ":" -#define LILV_DIR_SEP "/" -#define LILV_DEFAULT_LV2_PATH "~/.lv2:/usr/lib/lv2:/usr/local/lib/lv2" + #define LILV_DEFAULT_LV2_PATH "~/.lv2:/usr/lib/lv2:/usr/local/lib/lv2" #endif #endif /* _LILV_CONFIG_H_ */ diff --git a/c++/carla-lilv/config/serd_config.h b/c++/carla-lilv/config/serd_config.h index 5385944..83ea343 100644 --- a/c++/carla-lilv/config/serd_config.h +++ b/c++/carla-lilv/config/serd_config.h @@ -2,18 +2,20 @@ #ifndef _SERD_CONFIG_H_ #define _SERD_CONFIG_H_ -#define SERD_VERSION "0.14.0" +#define SERD_VERSION "0.18.0" -#define HAVE_FMAX 1 -#define HAVE_FILENO 1 - -#if defined(_WIN32) -// nothing -#elif defined(__APPLE__) || defined(__HAIKU__) -# define HAVE_POSIX_MEMALIGN 1 +#if defined(__APPLE__) || defined(__HAIKU__) + #define HAVE_FMAX 1 + #define HAVE_FILENO 1 + #define HAVE_POSIX_MEMALIGN 1 +#elif defined(__WIN32__) + #define HAVE_FMAX 1 + #define HAVE_FILENO 1 #else -# define HAVE_POSIX_MEMALIGN 1 -# define HAVE_POSIX_FADVISE 1 + #define HAVE_FMAX 1 + #define HAVE_FILENO 1 + #define HAVE_POSIX_MEMALIGN 1 + #define HAVE_POSIX_FADVISE 1 #endif #endif /* _SERD_CONFIG_H_ */ diff --git a/c++/carla-lilv/config/sord_config.h b/c++/carla-lilv/config/sord_config.h index 92bcc96..b14d278 100644 --- a/c++/carla-lilv/config/sord_config.h +++ b/c++/carla-lilv/config/sord_config.h @@ -2,7 +2,7 @@ #ifndef _SORD_CONFIG_H_ #define _SORD_CONFIG_H_ -#define SORD_VERSION "0.8.0" +#define SORD_VERSION "0.10.0" #define HAVE_SERD 1 #define HAVE_PCRE 1 diff --git a/c++/carla-lilv/config/sratom_config.h b/c++/carla-lilv/config/sratom_config.h index 26d7f25..5c040ea 100644 --- a/c++/carla-lilv/config/sratom_config.h +++ b/c++/carla-lilv/config/sratom_config.h @@ -2,9 +2,9 @@ #ifndef _SRATOM_CONFIG_H_ #define _SRATOM_CONFIG_H_ -#define SRATOM_VERSION "0.2.0" +#define SRATOM_VERSION "0.4.0" -#define HAVE_LV2 1 +#define HAVE_LV2 1 #define HAVE_SERD 1 #define HAVE_SORD 1 diff --git a/c++/carla-lilv/custom-patches/lilv_ui-features+lilvmm.patch b/c++/carla-lilv/custom-patches/lilv_ui-features+lilvmm.patch new file mode 100644 index 0000000..9ec36a5 --- /dev/null +++ b/c++/carla-lilv/custom-patches/lilv_ui-features+lilvmm.patch @@ -0,0 +1,137 @@ +diff -U 3 -H -d -r -N -- lilv-0.14.4.old/lilv/lilv.h lilv-0.14.4/lilv/lilv.h +--- lilv-0.14.4.old/lilv/lilv.h 2012-09-07 19:00:48.464571333 +0100 ++++ lilv-0.14.4/lilv/lilv.h 2012-09-07 18:54:00.626548936 +0100 +@@ -1693,6 +1693,25 @@ + lilv_ui_get_binary_uri(const LilvUI* ui); + + /** ++ Custom calls ++*/ ++LILV_API ++LilvNodes* ++lilv_ui_get_supported_features(const LilvUI* ui); ++ ++LILV_API ++LilvNodes* ++lilv_ui_get_required_features(const LilvUI* ui); ++ ++LILV_API ++LilvNodes* ++lilv_ui_get_optional_features(const LilvUI* ui); ++ ++LILV_API ++LilvNodes* ++lilv_ui_get_extension_data(const LilvUI* ui); ++ ++/** + @} + @} + */ +diff -U 3 -H -d -r -N -- lilv-0.14.4.old/lilv/lilvmm.hpp lilv-0.14.4/lilv/lilvmm.hpp +--- lilv-0.14.4.old/lilv/lilvmm.hpp 2012-07-18 02:42:43.000000000 +0100 ++++ lilv-0.14.4/lilv/lilvmm.hpp 2012-09-07 18:53:14.134318379 +0100 +@@ -136,6 +136,7 @@ + struct Nodes { + LILV_WRAP_COLL(Nodes, Node, nodes); + LILV_WRAP1(bool, nodes, contains, const Node, node); ++ LILV_WRAP0(Node, nodes, get_first); + }; + + struct Port { +@@ -167,6 +168,26 @@ + const LilvPort* me; + }; + ++struct UI { ++ inline UI(const LilvUI* c_obj) : me(c_obj) {} ++ LILV_WRAP_CONVERSION(const LilvUI); ++ ++ LILV_WRAP0(Node, ui, get_uri); ++ LILV_WRAP1(bool, ui, is_a, LilvNode*, ui_class); ++ LILV_WRAP0(Node, ui, get_bundle_uri); ++ LILV_WRAP0(Node, ui, get_binary_uri); ++ LILV_WRAP0(Nodes, ui, get_supported_features); ++ LILV_WRAP0(Nodes, ui, get_required_features); ++ LILV_WRAP0(Nodes, ui, get_optional_features); ++ LILV_WRAP0(Nodes, ui, get_extension_data); ++ ++ const LilvUI* me; ++}; ++ ++struct UIs { ++ LILV_WRAP_COLL(UIs, UI, uis); ++}; ++ + struct Plugin { + inline Plugin(const LilvPlugin* c_obj) : me(c_obj) {} + LILV_WRAP_CONVERSION(const LilvPlugin); +@@ -190,6 +211,8 @@ + LILV_WRAP0(Node, plugin, get_author_email); + LILV_WRAP0(Node, plugin, get_author_homepage); + LILV_WRAP0(bool, plugin, is_replaced); ++ LILV_WRAP0(Nodes, plugin, get_extension_data); ++ LILV_WRAP0(UIs, plugin, get_uis); + + inline Port get_port_by_index(unsigned index) { + return Port(me, lilv_plugin_get_port_by_index(me, index)); +diff -U 3 -H -d -r -N -- lilv-0.14.4.old/src/ui.c lilv-0.14.4/src/ui.c +--- lilv-0.14.4.old/src/ui.c 2012-09-07 19:00:48.464571333 +0100 ++++ lilv-0.14.4/src/ui.c 2012-09-07 18:59:51.652289664 +0100 +@@ -128,3 +128,57 @@ + assert(ui->binary_uri); + return ui->binary_uri; + } ++ ++static LilvNodes* ++lilv_ui_get_value_internal(const LilvUI* ui, ++ const SordNode* predicate) ++{ ++ return lilv_world_query_values_internal( ++ ui->world, ui->uri->node, predicate, NULL); ++} ++ ++LILV_API ++LilvNodes* ++lilv_ui_get_supported_features(const LilvUI* ui) ++{ ++ LilvNodes* optional = lilv_ui_get_optional_features(ui); ++ LilvNodes* required = lilv_ui_get_required_features(ui); ++ LilvNodes* result = lilv_nodes_new(); ++ ++ LILV_FOREACH(nodes, i, optional) ++ zix_tree_insert((ZixTree*)result, ++ lilv_node_duplicate(lilv_nodes_get(optional, i)), ++ NULL); ++ LILV_FOREACH(nodes, i, required) ++ zix_tree_insert((ZixTree*)result, ++ lilv_node_duplicate(lilv_nodes_get(required, i)), ++ NULL); ++ ++ lilv_nodes_free(optional); ++ lilv_nodes_free(required); ++ ++ return result; ++} ++ ++LILV_API ++LilvNodes* ++lilv_ui_get_required_features(const LilvUI* ui) ++{ ++ return lilv_ui_get_value_internal( ++ ui, ui->world->uris.lv2_requiredFeature); ++} ++ ++LILV_API ++LilvNodes* ++lilv_ui_get_optional_features(const LilvUI* ui) ++{ ++ return lilv_ui_get_value_internal( ++ ui, ui->world->uris.lv2_optionalFeature); ++} ++ ++LILV_API ++LilvNodes* ++lilv_ui_get_extension_data(const LilvUI* ui) ++{ ++ return lilv_ui_get_value_internal(ui, ui->world->uris.lv2_extensionData); ++} diff --git a/c++/carla-lilv/custom-patches/lilv_ui-features.patch b/c++/carla-lilv/custom-patches/lilv_ui-features.patch deleted file mode 100644 index ce1dfce..0000000 --- a/c++/carla-lilv/custom-patches/lilv_ui-features.patch +++ /dev/null @@ -1,90 +0,0 @@ -diff -U 3 -H -d -r -N -- lilv-0.14.2.old/lilv/lilv.h lilv-0.14.2/lilv/lilv.h ---- lilv-0.14.2.old/lilv/lilv.h 2012-05-31 00:01:08.000000000 +0100 -+++ lilv-0.14.2/lilv/lilv.h 2012-04-29 20:48:18.000000000 +0100 -@@ -1693,6 +1693,25 @@ - lilv_ui_get_binary_uri(const LilvUI* ui); - - /** -+ Custom calls -+*/ -+LILV_API -+LilvNodes* -+lilv_ui_get_supported_features(const LilvUI* ui); -+ -+LILV_API -+LilvNodes* -+lilv_ui_get_required_features(const LilvUI* ui); -+ -+LILV_API -+LilvNodes* -+lilv_ui_get_optional_features(const LilvUI* ui); -+ -+LILV_API -+LilvNodes* -+lilv_ui_get_extension_data(const LilvUI* ui); -+ -+/** - @} - @} - */ -diff -U 3 -H -d -r -N -- lilv-0.14.2.old/src/ui.c lilv-0.14.2/src/ui.c ---- lilv-0.14.2.old/src/ui.c 2012-03-27 04:41:41.000000000 +0100 -+++ lilv-0.14.2/src/ui.c 2012-04-29 20:58:07.000000000 +0100 -@@ -128,3 +128,57 @@ - assert(ui->binary_uri); - return ui->binary_uri; - } -+ -+static LilvNodes* -+lilv_ui_get_value_internal(const LilvUI* ui, -+ const SordNode* predicate) -+{ -+ return lilv_world_query_values_internal( -+ ui->world, ui->uri->val.uri_val, predicate, NULL); -+} -+ -+LILV_API -+LilvNodes* -+lilv_ui_get_supported_features(const LilvUI* ui) -+{ -+ LilvNodes* optional = lilv_ui_get_optional_features(ui); -+ LilvNodes* required = lilv_ui_get_required_features(ui); -+ LilvNodes* result = lilv_nodes_new(); -+ -+ LILV_FOREACH(nodes, i, optional) -+ zix_tree_insert((ZixTree*)result, -+ lilv_node_duplicate(lilv_nodes_get(optional, i)), -+ NULL); -+ LILV_FOREACH(nodes, i, required) -+ zix_tree_insert((ZixTree*)result, -+ lilv_node_duplicate(lilv_nodes_get(required, i)), -+ NULL); -+ -+ lilv_nodes_free(optional); -+ lilv_nodes_free(required); -+ -+ return result; -+} -+ -+LILV_API -+LilvNodes* -+lilv_ui_get_required_features(const LilvUI* ui) -+{ -+ return lilv_ui_get_value_internal( -+ ui, ui->world->uris.lv2_requiredFeature); -+} -+ -+LILV_API -+LilvNodes* -+lilv_ui_get_optional_features(const LilvUI* ui) -+{ -+ return lilv_ui_get_value_internal( -+ ui, ui->world->uris.lv2_optionalFeature); -+} -+ -+LILV_API -+LilvNodes* -+lilv_ui_get_extension_data(const LilvUI* ui) -+{ -+ return lilv_ui_get_value_internal(ui, ui->world->uris.lv2_extensionData); -+} diff --git a/c++/carla-lilv/custom-patches/serd_static-fix.patch b/c++/carla-lilv/custom-patches/serd_static-fix.patch new file mode 100644 index 0000000..bcf7639 --- /dev/null +++ b/c++/carla-lilv/custom-patches/serd_static-fix.patch @@ -0,0 +1,39 @@ +diff -U 3 -H -d -r -N -- serd-0.18.0/src/writer.c serd-0.18.0.orig/src/writer.c +--- serd-0.18.0/src/writer.c 2012-09-07 18:12:02.886064145 +0100 ++++ serd-0.18.0.orig/src/writer.c 2012-09-07 18:11:16.000000000 +0100 +@@ -103,7 +103,7 @@ + } TextContext; + + static void +-error2(SerdWriter* writer, SerdStatus st, const char* fmt, ...) ++error(SerdWriter* writer, SerdStatus st, const char* fmt, ...) + { + va_list args; + va_start(args, fmt); +@@ -219,7 +219,7 @@ + size = 4; + c = in & 0x07; + } else { +- error2(writer, SERD_ERR_BAD_ARG, "invalid UTF-8: %X\n", in); ++ error(writer, SERD_ERR_BAD_ARG, "invalid UTF-8: %X\n", in); + const uint8_t replacement_char[] = { 0xEF, 0xBF, 0xBD }; + len += sink(replacement_char, sizeof(replacement_char), writer); + return len; +@@ -364,7 +364,7 @@ + switch (writer->syntax) { + case SERD_NTRIPLES: + if (serd_env_expand(writer->env, node, &uri_prefix, &uri_suffix)) { +- error2(writer, SERD_ERR_BAD_CURIE, ++ error(writer, SERD_ERR_BAD_CURIE, + "undefined namespace prefix `%s'\n", node->buf); + return false; + } +@@ -603,7 +603,7 @@ + return SERD_SUCCESS; + } + if (serd_stack_is_empty(&writer->anon_stack)) { +- error2(writer, SERD_ERR_UNKNOWN, ++ error(writer, SERD_ERR_UNKNOWN, + "unexpected end of anonymous node\n"); + return SERD_ERR_UNKNOWN; + } diff --git a/c++/carla-lilv/custom-patches/sord_zix-tree-size.patch b/c++/carla-lilv/custom-patches/sord_zix-tree-size.patch deleted file mode 100644 index 8534919..0000000 --- a/c++/carla-lilv/custom-patches/sord_zix-tree-size.patch +++ /dev/null @@ -1,75 +0,0 @@ -diff -U 3 -H -d -r -N -- sord-0.8.0.old/src/zix/tree.c sord-0.8.0/src/zix/tree.c ---- sord-0.8.0.old/src/zix/tree.c 2012-04-17 18:01:39.000000000 +0100 -+++ sord-0.8.0/src/zix/tree.c 2012-05-31 00:09:18.000000000 +0100 -@@ -29,6 +29,7 @@ - ZixTreeNode* root; - ZixComparator cmp; - void* cmp_data; -+ size_t size; - bool allow_duplicates; - }; - -@@ -51,6 +52,7 @@ - t->root = NULL; - t->cmp = cmp; - t->cmp_data = cmp_data; -+ t->size = 0; - t->allow_duplicates = allow_duplicates; - return t; - } -@@ -74,6 +76,12 @@ - free(t); - } - -+size_t -+zix_tree_size(ZixTree* t) -+{ -+ return t->size; -+} -+ - static void - rotate(ZixTreeNode* p, ZixTreeNode* q) - { -@@ -343,6 +351,8 @@ - } - } - -+ ++t->size; -+ - return ZIX_STATUS_SUCCESS; - } - -@@ -358,6 +368,8 @@ - if ((n == t->root) && !n->left && !n->right) { - t->root = NULL; - free(n); -+ --t->size; -+ assert(t->size == 0); - return ZIX_STATUS_SUCCESS; - } - -@@ -481,6 +493,8 @@ - - free(n); - -+ --t->size; -+ - return ZIX_STATUS_SUCCESS; - } - -diff -U 3 -H -d -r -N -- sord-0.8.0.old/src/zix/tree.h sord-0.8.0/src/zix/tree.h ---- sord-0.8.0.old/src/zix/tree.h 2012-04-17 18:01:39.000000000 +0100 -+++ sord-0.8.0/src/zix/tree.h 2012-05-31 00:09:25.000000000 +0100 -@@ -53,6 +53,12 @@ - zix_tree_free(ZixTree* t); - - /** -+ Return the number of elements in @a t. -+*/ -+size_t -+zix_tree_size(ZixTree* t); -+ -+/** - Insert the element @a e into @a t and point @a ti at the new element. - */ - ZixStatus diff --git a/c++/carla-lilv/lilv-0.14.2/INSTALL b/c++/carla-lilv/lilv-0.14.2/INSTALL deleted file mode 100644 index f6e4dd4..0000000 --- a/c++/carla-lilv/lilv-0.14.2/INSTALL +++ /dev/null @@ -1,35 +0,0 @@ -This software requires only Python to build. - -Like an auto* project, building has three phases: - - -* Configure: ./waf configure [OPTIONS] - - Example: - ./waf configure --prefix=/some/where --debug --strict - - If --debug is not given, the flags from the environment variables - CFLAGS and CXXFLAGS will be used. - - The default prefix is /usr/local - - -* Build: ./waf [OPTIONS] - - Example: - ./waf -j4 - - -* Install: ./waf install [OPTIONS] - - The environment variable DESTDIR can be used to add any prefix to - the install paths (useful for packaging). Example: - - DESTDIR=/home/drobilla/packages ./waf install - - -*** IMPORTANT: You must use absolute paths everywhere - - -Run './waf --help' for detailed option information. - diff --git a/c++/carla-lilv/lilv-0.14.2/waf b/c++/carla-lilv/lilv-0.14.2/waf deleted file mode 100755 index 907b984751184c38575e52a780dacee1f8d8668e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91475 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 diff --git a/c++/carla-lilv/lilv-0.14.2/AUTHORS b/c++/carla-lilv/lilv-0.14.4/AUTHORS similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/AUTHORS rename to c++/carla-lilv/lilv-0.14.4/AUTHORS diff --git a/c++/carla-lilv/lilv-0.14.2/COPYING b/c++/carla-lilv/lilv-0.14.4/COPYING similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/COPYING rename to c++/carla-lilv/lilv-0.14.4/COPYING diff --git a/c++/carla-lilv/lilv-0.14.4/INSTALL b/c++/carla-lilv/lilv-0.14.4/INSTALL new file mode 100644 index 0000000..623cddd --- /dev/null +++ b/c++/carla-lilv/lilv-0.14.4/INSTALL @@ -0,0 +1,59 @@ +Installation Instructions +========================= + +Basic Installation +------------------ + +Building this software requires only Python. To install with default options: + + ./waf configure + ./waf + ./waf install + +You may need to become root for the install stage, for example: + + sudo ./waf install + +Configuration Options +--------------------- + +All supported options can be viewed using the command: + + ./waf --help + +Most options only need to be passed during the configure stage, for example: + + ./waf configure --prefix=/usr + ./waf + ./waf install + +Compiler Configuration +---------------------- + +Several standard environment variables can be used to control how compilers are +invoked: + + * CC: Path to C compiler + * CFLAGS: C compiler options + * CXX: Path to C++ compiler + * CXXFLAGS: C++ compiler options + * CPPFLAGS: C preprocessor options + * LINKFLAGS: Linker options + +Installation Directories +------------------------ + +The --prefix option (or the PREFIX environment variable) can be used to change +the prefix which all files are installed under. There are also several options +allowing for more fine-tuned control, see the --help output for details. + +Packaging +--------- + +Everything can be installed to a specific root directory by passing a --destdir +option to the install stage (or setting the DESTDIR environment variable), +which adds a prefix to all install paths. For example: + + ./waf configure --prefix=/usr + ./waf + ./waf install --destdir=/tmp/package diff --git a/c++/carla-lilv/lilv-0.14.2/NEWS b/c++/carla-lilv/lilv-0.14.4/NEWS similarity index 75% rename from c++/carla-lilv/lilv-0.14.2/NEWS rename to c++/carla-lilv/lilv-0.14.4/NEWS index 475f472..6a2f53e 100644 --- a/c++/carla-lilv/lilv-0.14.2/NEWS +++ b/c++/carla-lilv/lilv-0.14.4/NEWS @@ -1,3 +1,23 @@ +lilv (0.14.4) stable; + + * Deprecate old flawed Lilv::Instance constructors + * Fix documentation for ui_type parameter of lilv_ui_is_supported() + * Fix crash when lv2info is run with an invalid URI argument + * Gracefully handle failure to save plugin state and print error message + * Reduce memory usage (per node) + * Simpler node implementation always backed by a SordNode + * Make all 'zix' symbols private to avoid symbol clashes in static builds + * Add lv2bench utility + * Fix various hyper-strict warnings + * Do not require a C++ compiler to build + * Add option to build utilities as static binaries + * Upgrade to waf 1.7.2 + * lilvmm.hpp: Make Lilv::Instance handle features and failed instantiations + * lilvmm.hpp: Add Lilv::Instance::get_handle() + * lilvmm.hpp: Add Lilv::Instance::get_extension_data() + + -- David Robillard Thu, 23 Aug 2012 01:38:29 -0400 + lilv (0.14.2) stable; * Fix dynmanifest support diff --git a/c++/carla-lilv/lilv-0.14.2/PACKAGING b/c++/carla-lilv/lilv-0.14.4/PACKAGING similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/PACKAGING rename to c++/carla-lilv/lilv-0.14.4/PACKAGING diff --git a/c++/carla-lilv/lilv-0.14.2/README b/c++/carla-lilv/lilv-0.14.4/README similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/README rename to c++/carla-lilv/lilv-0.14.4/README diff --git a/c++/carla-lilv/lilv-0.14.2/bindings/lilv.i b/c++/carla-lilv/lilv-0.14.4/bindings/lilv.i similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/bindings/lilv.i rename to c++/carla-lilv/lilv-0.14.4/bindings/lilv.i diff --git a/c++/carla-lilv/lilv-0.14.2/bindings/python/lv2_apply.py b/c++/carla-lilv/lilv-0.14.4/bindings/python/lv2_apply.py similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/bindings/python/lv2_apply.py rename to c++/carla-lilv/lilv-0.14.4/bindings/python/lv2_apply.py diff --git a/c++/carla-lilv/lilv-0.14.2/bindings/python/lv2_list.py b/c++/carla-lilv/lilv-0.14.4/bindings/python/lv2_list.py similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/bindings/python/lv2_list.py rename to c++/carla-lilv/lilv-0.14.4/bindings/python/lv2_list.py diff --git a/c++/carla-lilv/lilv-0.14.2/doc/lv2info.1 b/c++/carla-lilv/lilv-0.14.4/doc/lv2info.1 similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/doc/lv2info.1 rename to c++/carla-lilv/lilv-0.14.4/doc/lv2info.1 diff --git a/c++/carla-lilv/lilv-0.14.2/doc/lv2ls.1 b/c++/carla-lilv/lilv-0.14.4/doc/lv2ls.1 similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/doc/lv2ls.1 rename to c++/carla-lilv/lilv-0.14.4/doc/lv2ls.1 diff --git a/c++/carla-lilv/lilv-0.14.2/doc/reference.doxygen.in b/c++/carla-lilv/lilv-0.14.4/doc/reference.doxygen.in similarity index 73% rename from c++/carla-lilv/lilv-0.14.2/doc/reference.doxygen.in rename to c++/carla-lilv/lilv-0.14.4/doc/reference.doxygen.in index ce4f291..4e0c97e 100644 --- a/c++/carla-lilv/lilv-0.14.2/doc/reference.doxygen.in +++ b/c++/carla-lilv/lilv-0.14.4/doc/reference.doxygen.in @@ -1,14 +1,14 @@ -# Doxyfile 1.6.1 +# Doxyfile 1.8.1.1 # This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project +# doxygen (www.doxygen.org) for a project. # -# All text after a hash (#) is considered a comment and will be ignored +# All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") +# Values that contain spaces should be placed between quotes (" "). #--------------------------------------------------------------------------- # Project related configuration options @@ -22,8 +22,9 @@ DOXYFILE_ENCODING = UTF-8 -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. PROJECT_NAME = Lilv @@ -33,6 +34,19 @@ PROJECT_NAME = Lilv PROJECT_NUMBER = @LILV_VERSION@ +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location @@ -57,7 +71,7 @@ CREATE_SUBDIRS = NO # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English @@ -126,7 +140,7 @@ STRIP_FROM_PATH = STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems +# (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO @@ -181,6 +195,13 @@ TAB_SIZE = 4 ALIASES = +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list @@ -207,22 +228,32 @@ OPTIMIZE_FOR_FORTRAN = NO OPTIMIZE_OUTPUT_VHDL = NO -# Doxygen selects the parser to use depending on the extension of the files it parses. -# With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this tag. -# The format is ext=language, where ext is a file extension, and language is one of -# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, -# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat -# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), -# use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration +# func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO @@ -240,7 +271,7 @@ SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) -# will make doxygen to replace the get and set methods by a property in the +# will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. @@ -262,6 +293,22 @@ DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = YES + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = YES + # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct @@ -278,16 +325,27 @@ TYPEDEF_HIDES_STRUCT = YES # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penality. +# causing a significant performance penalty. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will rougly double the +# a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols +# corresponding to a cache size of 2^16 = 65536 symbols. SYMBOL_CACHE_SIZE = 0 +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- @@ -304,6 +362,10 @@ EXTRACT_ALL = YES EXTRACT_PRIVATE = NO +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. @@ -326,7 +388,7 @@ EXTRACT_LOCAL_METHODS = NO # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default -# anonymous namespace are hidden. +# anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = NO @@ -386,6 +448,12 @@ HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. @@ -405,7 +473,13 @@ SORT_MEMBER_DOCS = NO SORT_BRIEF_DOCS = NO -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO @@ -425,6 +499,15 @@ SORT_GROUP_NAMES = NO SORT_BY_SCOPE_NAME = YES +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. @@ -455,10 +538,10 @@ GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in +# the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the +# The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. @@ -470,12 +553,6 @@ MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. @@ -499,15 +576,25 @@ SHOW_NAMESPACES = NO FILE_VERSION_FILTER = -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by -# doxygen. The layout file controls the global structure of the generated output files -# in an output format independent way. The create the layout file that represents -# doxygen's defaults, run doxygen with the -l option. You can optionally specify a -# file name after the option, if omitted DoxygenLayout.xml will be used as the name -# of the layout file. +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = @LILV_SRCDIR@/doc/layout.xml +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. + +CITE_BIB_FILES = + #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- @@ -527,7 +614,7 @@ WARNINGS = YES # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. -WARN_IF_UNDOCUMENTED = NO +WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some @@ -536,13 +623,13 @@ WARN_IF_UNDOCUMENTED = NO WARN_IF_DOC_ERROR = YES -# This WARN_NO_PARAMDOC option can be abled to get warnings for +# The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. -WARN_NO_PARAMDOC = NO +WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text @@ -582,8 +669,9 @@ INPUT_ENCODING = UTF-8 # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = @@ -593,14 +681,16 @@ FILE_PATTERNS = RECURSIVE = NO -# The EXCLUDE tag can be used to specify files and/or directories that should +# The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. EXCLUDE = -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO @@ -664,8 +754,8 @@ INPUT_FILTER = # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = @@ -675,6 +765,14 @@ FILTER_PATTERNS = FILTER_SOURCE_FILES = NO +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- @@ -693,7 +791,7 @@ INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. +# fragments. Normal C, C++ and Fortran comments will always remain visible. STRIP_CODE_COMMENTS = YES @@ -729,7 +827,7 @@ USE_HTAGS = NO # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. -VERBATIM_HEADERS = YES +VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index @@ -777,7 +875,14 @@ HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a -# standard header. +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! HTML_HEADER = @@ -792,24 +897,67 @@ HTML_FOOTER = # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! +# style sheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = @LILV_SRCDIR@/doc/style.css + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 160 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. -HTML_STYLESHEET = doc/style.css +HTML_COLORSTYLE_GAMMA = 80 -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. -HTML_ALIGN_MEMBERS = YES +HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). +# page has loaded. HTML_DYNAMIC_SECTIONS = NO +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of +# entries shown in the various tree structured indices initially; the user +# can expand and collapse entries dynamically later on. Doxygen will expand +# the tree to such a level that at most the specified number of entries are +# visible (unless a fully collapsed tree already exceeds this amount). +# So setting the number of entries 1 will produce a full collapsed tree by +# default. 0 is a special value representing an infinite number of entries +# and will result in a full expanded tree by default. + +HTML_INDEX_NUM_ENTRIES = 100 + # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). @@ -818,7 +966,8 @@ HTML_DYNAMIC_SECTIONS = NO # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. GENERATE_DOCSET = NO @@ -836,6 +985,16 @@ DOCSET_FEEDNAME = "Doxygen generated docs" DOCSET_BUNDLE_ID = org.doxygen.Project +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) @@ -880,10 +1039,10 @@ BINARY_TOC = NO TOC_EXPAND = NO -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER -# are set, an additional index file will be generated that can be used as input for -# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated -# HTML documentation. +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO @@ -905,20 +1064,24 @@ QHP_NAMESPACE = QHP_VIRTUAL_FOLDER = doc -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. -# For more information please see +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see -# Qt Help Project / Custom Filters. +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's # filter section matches. -# Qt Help Project / Filter Attributes. +# +# Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = @@ -929,16 +1092,30 @@ QHP_SECT_FILTER_ATTRS = QHG_LOCATION = -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. -DISABLE_INDEX = NO +GENERATE_ECLIPSEHELP = NO -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. -ENUM_VALUES_PER_LINE = 4 +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = YES # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. @@ -947,13 +1124,17 @@ ENUM_VALUES_PER_LINE = 4 # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = NO -# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list. +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. -USE_INLINE_TREES = NO +ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree @@ -961,6 +1142,11 @@ USE_INLINE_TREES = NO TREEVIEW_WIDTH = 250 +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need @@ -969,13 +1155,60 @@ TREEVIEW_WIDTH = 250 FORMULA_FONTSIZE = 10 -# When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) -# there is already a search function so this one should typically -# be disabled. +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. +# However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = NO +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- @@ -993,6 +1226,9 @@ LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. LATEX_CMD_NAME = latex @@ -1009,7 +1245,7 @@ MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and +# by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide @@ -1026,6 +1262,13 @@ EXTRA_PACKAGES = LATEX_HEADER = +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references @@ -1052,10 +1295,19 @@ LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO -# If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- @@ -1087,7 +1339,7 @@ COMPACT_RTF = NO RTF_HYPERLINKS = NO -# Load stylesheet definitions from file. Syntax is similar to doxygen's +# Load style sheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. @@ -1232,7 +1484,7 @@ MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. +# pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES @@ -1262,15 +1514,15 @@ PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES @@ -1278,22 +1530,18 @@ SKIP_FUNCTION_MACROS = YES # Configuration::additions related to external references #--------------------------------------------------------------------------- -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. TAGFILES = @@ -1326,9 +1574,8 @@ PERL_PATH = /usr/bin/perl # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = NO @@ -1354,14 +1601,20 @@ HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO -# By default doxygen will write a font called FreeSans.ttf to the output -# directory and reference it in all dot files that doxygen generates. This -# font does not include all possible unicode characters however, so when you need -# these (or just want a differently looking font) you can specify the font name -# using DOT_FONTNAME. You need need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -# containing the font. +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. DOT_FONTNAME = FreeSans @@ -1370,17 +1623,16 @@ DOT_FONTNAME = FreeSans DOT_FONTSIZE = 10 -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot -# can find it using this tag. +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. +# CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = NO @@ -1402,6 +1654,15 @@ GROUP_GRAPHS = YES UML_LOOK = NO +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. @@ -1438,23 +1699,34 @@ CALL_GRAPH = NO CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. +# will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = NO -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. -DIRECTORY_GRAPH = YES +DIRECTORY_GRAPH = NO # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. @@ -1466,6 +1738,12 @@ DOT_PATH = DOTFILE_DIRS = +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is diff --git a/c++/carla-lilv/serd-0.14.0/doc/style.css b/c++/carla-lilv/lilv-0.14.4/doc/style.css similarity index 97% rename from c++/carla-lilv/serd-0.14.0/doc/style.css rename to c++/carla-lilv/lilv-0.14.4/doc/style.css index c20312f..4c62b46 100644 --- a/c++/carla-lilv/serd-0.14.0/doc/style.css +++ b/c++/carla-lilv/lilv-0.14.4/doc/style.css @@ -1,5 +1,5 @@ body { - font-size: 100%; + font-size: medium; font-family: sans-serif; } @@ -9,7 +9,7 @@ body { padding: 0; border-bottom: 1px solid #DDD; margin-bottom: 1ex; - font-size: 180%; + font-size: xx-large; font-weight: bold; } @@ -113,33 +113,24 @@ div.navtab { /* @group Link Styling */ a { - color: #3D578C; + color: #3D8C57; text-decoration: none; } .contents a:visited { - color: #4665A2; + color: #50755E; } a:hover { text-decoration: underline; } -a.qindex { -} - a.qindexHL { background-color: #9CAFD4; color: #FFF; border: 1px double #869DCA; } -a.el { -} - -a.elRef { -} - a.code { color: #4665A2; } @@ -245,7 +236,7 @@ div.center img { address.footer { text-align: right; - padding-right: 12px; + padding: 0 0.25em 0.25em 0; } img.footer { @@ -324,7 +315,7 @@ hr.footer { /* @group Member Descriptions */ table.memberdecls { border-spacing: 0; - font-size: 94%; + font-size: small; } .mdescLeft,.mdescRight,.memItemLeft,.memItemRight,.memTemplItemLeft,.memTemplItemRight,.memTemplParams { @@ -338,7 +329,7 @@ table.memberdecls { } .memItemLeft,.memItemRight,.memTemplParams { - border-top: 1px solid #EEE; + border-top: 1px solid #DDD; } .memItemLeft,.memTemplItemLeft { @@ -372,6 +363,7 @@ table.memberdecls { .memitem { padding: 0; margin: 1ex 0 2ex 0; + border: 1px solid #CCC; } .memname { @@ -380,9 +372,8 @@ table.memberdecls { } .memproto { - border-top: 1px solid #DDD; + border-bottom: 1px solid #DDD; padding: 0.5ex; - color: #253555; font-weight: bold; background-color: #F3F3F3; } diff --git a/c++/carla-lilv/lilv-0.14.2/lilv.pc.in b/c++/carla-lilv/lilv-0.14.4/lilv.pc.in similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/lilv.pc.in rename to c++/carla-lilv/lilv-0.14.4/lilv.pc.in diff --git a/c++/carla-lilv/lilv-0.14.2/lilv.ttl b/c++/carla-lilv/lilv-0.14.4/lilv.ttl similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/lilv.ttl rename to c++/carla-lilv/lilv-0.14.4/lilv.ttl diff --git a/c++/carla-lilv/lilv-0.14.2/lilv/lilv.h b/c++/carla-lilv/lilv-0.14.4/lilv/lilv.h similarity index 99% rename from c++/carla-lilv/lilv-0.14.2/lilv/lilv.h rename to c++/carla-lilv/lilv-0.14.4/lilv/lilv.h index 96746a7..2d09f85 100644 --- a/c++/carla-lilv/lilv-0.14.2/lilv/lilv.h +++ b/c++/carla-lilv/lilv-0.14.4/lilv/lilv.h @@ -1664,7 +1664,7 @@ typedef unsigned (*LilvUISupportedFunc)(const char* container_type_uri, @param supported_func User provided supported predicate. @param container_type The widget type to host the UI within. @param ui_type (Output) If non-NULL, set to the native type of the UI - which the caller must free with lilv_node_free. + which is owned by @c ui and must not be freed by the caller. @return The embedding quality level returned by @c supported_func. */ LILV_API diff --git a/c++/carla-lilv/lilv-0.14.2/lilv/lilvmm.hpp b/c++/carla-lilv/lilv-0.14.4/lilv/lilvmm.hpp similarity index 87% rename from c++/carla-lilv/lilv-0.14.2/lilv/lilvmm.hpp rename to c++/carla-lilv/lilv-0.14.4/lilv/lilvmm.hpp index 3a0d078..749a0c9 100644 --- a/c++/carla-lilv/lilv-0.14.2/lilv/lilvmm.hpp +++ b/c++/carla-lilv/lilv-0.14.4/lilv/lilvmm.hpp @@ -19,6 +19,12 @@ #include "lilv/lilv.h" +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) +# define LILV_DEPRECATED __attribute__((__deprecated__)) +#else +# define LILV_DEPRECATED +#endif + namespace Lilv { static inline const char* @@ -130,7 +136,7 @@ struct ScalePoints { struct Nodes { LILV_WRAP_COLL(Nodes, Node, nodes); LILV_WRAP1(bool, nodes, contains, const Node, node); - LILV_WRAP0(Node, nodes, get_first); + LILV_WRAP0(Node, nodes, get_first); }; struct Port { @@ -166,10 +172,10 @@ struct UI { inline UI(const LilvUI* c_obj) : me(c_obj) {} LILV_WRAP_CONVERSION(const LilvUI); - LILV_WRAP0(Node, ui, get_uri); - LILV_WRAP1(bool, ui, is_a, LilvNode*, ui_class); - LILV_WRAP0(Node, ui, get_bundle_uri); - LILV_WRAP0(Node, ui, get_binary_uri); + LILV_WRAP0(Node, ui, get_uri); + LILV_WRAP1(bool, ui, is_a, LilvNode*, ui_class); + LILV_WRAP0(Node, ui, get_bundle_uri); + LILV_WRAP0(Node, ui, get_binary_uri); LILV_WRAP0(Nodes, ui, get_supported_features); LILV_WRAP0(Nodes, ui, get_required_features); LILV_WRAP0(Nodes, ui, get_optional_features); @@ -205,9 +211,8 @@ struct Plugin { LILV_WRAP0(Node, plugin, get_author_email); LILV_WRAP0(Node, plugin, get_author_homepage); LILV_WRAP0(bool, plugin, is_replaced); - LILV_WRAP0(Nodes, plugin, get_extension_data); - LILV_WRAP1(Nodes, plugin, get_related, Node, pred); - LILV_WRAP0(UIs, plugin, get_uis); + LILV_WRAP0(Nodes, plugin, get_extension_data); + LILV_WRAP0(UIs, plugin, get_uis); inline Port get_port_by_index(unsigned index) { return Port(me, lilv_plugin_get_port_by_index(me, index)); @@ -239,11 +244,28 @@ struct Plugins { }; struct Instance { + inline Instance(LilvInstance* instance) : me(instance) {} + + LILV_DEPRECATED inline Instance(Plugin plugin, double sample_rate) { - // TODO: features me = lilv_plugin_instantiate(plugin, sample_rate, NULL); } + LILV_DEPRECATED inline Instance(Plugin plugin, + double sample_rate, + LV2_Feature* const* features) { + me = lilv_plugin_instantiate(plugin, sample_rate, features); + } + + static inline Instance* create(Plugin plugin, + double sample_rate, + LV2_Feature* const* features) { + LilvInstance* me = lilv_plugin_instantiate( + plugin, sample_rate, features); + + return me ? new Instance(me) : NULL; + } + LILV_WRAP_CONVERSION(LilvInstance); LILV_WRAP2_VOID(instance, connect_port, @@ -254,12 +276,18 @@ struct Instance { LILV_WRAP1_VOID(instance, run, unsigned, sample_count); LILV_WRAP0_VOID(instance, deactivate); - // TODO: get_extension_data + inline const void* get_extension_data(const char* uri) { + return lilv_instance_get_extension_data(me, uri); + } inline const LV2_Descriptor* get_descriptor() { return lilv_instance_get_descriptor(me); } + inline LV2_Handle get_handle() { + return lilv_instance_get_handle(me); + } + LilvInstance* me; }; @@ -291,7 +319,6 @@ struct World { LILV_WRAP2_VOID(world, set_option, const char*, uri, LilvNode*, value); LILV_WRAP0_VOID(world, load_all); LILV_WRAP1_VOID(world, load_bundle, LilvNode*, bundle_uri); - LILV_WRAP1_VOID(world, load_resource, LilvNode*, resource); LILV_WRAP0(const LilvPluginClass*, world, get_plugin_class); LILV_WRAP0(const LilvPluginClasses*, world, get_plugin_classes); LILV_WRAP0(const Plugins, world, get_all_plugins); diff --git a/c++/carla-lilv/lilv-0.14.2/src/collections.c b/c++/carla-lilv/lilv-0.14.4/src/collections.c similarity index 92% rename from c++/carla-lilv/lilv-0.14.2/src/collections.c rename to c++/carla-lilv/lilv-0.14.4/src/collections.c index ebb5633..f7a035a 100644 --- a/c++/carla-lilv/lilv-0.14.2/src/collections.c +++ b/c++/carla-lilv/lilv-0.14.4/src/collections.c @@ -25,8 +25,8 @@ lilv_ptr_cmp(const void* a, const void* b, void* user_data) int lilv_resource_node_cmp(const void* a, const void* b, void* user_data) { - const SordNode* an = ((LilvNode*)a)->val.uri_val; - const SordNode* bn = ((LilvNode*)b)->val.uri_val; + const SordNode* an = ((const LilvNode*)a)->node; + const SordNode* bn = ((const LilvNode*)b)->node; return (intptr_t)an - (intptr_t)bn; } @@ -48,7 +48,7 @@ lilv_collection_free(LilvCollection* coll) unsigned lilv_collection_size(const LilvCollection* coll) { - return (coll ? zix_tree_size((ZixTree*)coll) : 0); + return (coll ? zix_tree_size((const ZixTree*)coll) : 0); } LilvIter* @@ -104,14 +104,15 @@ const LilvPluginClass* lilv_plugin_classes_get_by_uri(const LilvPluginClasses* coll, const LilvNode* uri) { - return (LilvPluginClass*)lilv_collection_get_by_uri((ZixTree*)coll, uri); + return (LilvPluginClass*)lilv_collection_get_by_uri( + (const ZixTree*)coll, uri); } LILV_API const LilvUI* lilv_uis_get_by_uri(const LilvUIs* coll, const LilvNode* uri) { - return (LilvUI*)lilv_collection_get_by_uri((ZixTree*)coll, uri); + return (LilvUI*)lilv_collection_get_by_uri((const ZixTree*)coll, uri); } /* Plugins */ @@ -126,7 +127,7 @@ LILV_API const LilvPlugin* lilv_plugins_get_by_uri(const LilvPlugins* list, const LilvNode* uri) { - return (LilvPlugin*)lilv_collection_get_by_uri((ZixTree*)list, uri); + return (LilvPlugin*)lilv_collection_get_by_uri((const ZixTree*)list, uri); } /* Nodes */ diff --git a/c++/carla-lilv/lilv-0.14.2/src/instance.c b/c++/carla-lilv/lilv-0.14.4/src/instance.c similarity index 98% rename from c++/carla-lilv/lilv-0.14.2/src/instance.c rename to c++/carla-lilv/lilv-0.14.4/src/instance.c index 0d4457d..5fa47fa 100644 --- a/c++/carla-lilv/lilv-0.14.2/src/instance.c +++ b/c++/carla-lilv/lilv-0.14.4/src/instance.c @@ -83,7 +83,7 @@ lilv_plugin_instantiate(const LilvPlugin* plugin, result = (LilvInstance*)malloc(sizeof(LilvInstance)); result->lv2_descriptor = ld; result->lv2_handle = ld->instantiate( - ld, sample_rate, (char*)bundle_path, + ld, sample_rate, bundle_path, (features) ? features : local_features); result->pimpl = lib; serd_node_free(&abs_uri_node); diff --git a/c++/carla-lilv/lilv-0.14.2/src/lib.c b/c++/carla-lilv/lilv-0.14.4/src/lib.c similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/src/lib.c rename to c++/carla-lilv/lilv-0.14.4/src/lib.c diff --git a/c++/carla-lilv/lilv-0.14.2/src/lilv_internal.h b/c++/carla-lilv/lilv-0.14.4/src/lilv_internal.h similarity index 97% rename from c++/carla-lilv/lilv-0.14.2/src/lilv_internal.h rename to c++/carla-lilv/lilv-0.14.4/src/lilv_internal.h index 867b571..f23b7a2 100644 --- a/c++/carla-lilv/lilv-0.14.2/src/lilv_internal.h +++ b/c++/carla-lilv/lilv-0.14.4/src/lilv_internal.h @@ -35,6 +35,7 @@ extern "C" { # define __func__ __FUNCTION__ # define INFINITY DBL_MAX + DBL_MAX # define NAN INFINITY - INFINITY +# define snprintf _snprintf # endif static inline char* dlerror(void) { return "Unknown error"; } #else @@ -50,7 +51,7 @@ static inline char* dlerror(void) { return "Unknown error"; } #include "lilv/lilv.h" #ifdef LILV_DYN_MANIFEST -# include "lv2/dynmanifest.h" +# include "lv2/lv2plug.in/ns/ext/dynmanifest/dynmanifest.h" #endif /* @@ -200,19 +201,14 @@ typedef enum { } LilvNodeType; struct LilvNodeImpl { - LilvWorld* world; - char* str_val; ///< always present + LilvWorld* world; + SordNode* node; + LilvNodeType type; union { - int int_val; - float float_val; - bool bool_val; - SordNode* uri_val; - struct { - void* buf; - size_t size; - } blob_val; + int int_val; + float float_val; + bool bool_val; } val; - LilvNodeType type; }; struct LilvScalePointImpl { diff --git a/c++/carla-lilv/lilv-0.14.2/src/node.c b/c++/carla-lilv/lilv-0.14.4/src/node.c similarity index 75% rename from c++/carla-lilv/lilv-0.14.2/src/node.c rename to c++/carla-lilv/lilv-0.14.4/src/node.c index de35175..495bb49 100644 --- a/c++/carla-lilv/lilv-0.14.2/src/node.c +++ b/c++/carla-lilv/lilv-0.14.4/src/node.c @@ -23,25 +23,24 @@ static void lilv_node_set_numerics_from_string(LilvNode* val, size_t len) { - char* endptr; + const char* str = (const char*)sord_node_get_string(val->node); + char* endptr; switch (val->type) { case LILV_VALUE_URI: case LILV_VALUE_BLANK: case LILV_VALUE_STRING: + case LILV_VALUE_BLOB: break; case LILV_VALUE_INT: - val->val.int_val = strtol(val->str_val, &endptr, 10); + val->val.int_val = strtol(str, &endptr, 10); break; case LILV_VALUE_FLOAT: - val->val.float_val = serd_strtod(val->str_val, &endptr); + val->val.float_val = serd_strtod(str, &endptr); break; case LILV_VALUE_BOOL: - val->val.bool_val = (!strcmp(val->str_val, "true")); + val->val.bool_val = !strcmp(str, "true"); break; - case LILV_VALUE_BLOB: - val->val.blob_val.buf = serd_base64_decode( - (const uint8_t*)val->str_val, len, &val->val.blob_val.size); } } @@ -57,20 +56,32 @@ lilv_node_new(LilvWorld* world, LilvNodeType type, const char* str) val->world = world; val->type = type; + const uint8_t* ustr = (const uint8_t*)str; switch (type) { case LILV_VALUE_URI: - val->val.uri_val = sord_new_uri(world->world, (const uint8_t*)str); - val->str_val = (char*)sord_node_get_string(val->val.uri_val); + val->node = sord_new_uri(world->world, ustr); break; case LILV_VALUE_BLANK: - val->val.uri_val = sord_new_blank(world->world, (const uint8_t*)str); - val->str_val = (char*)sord_node_get_string(val->val.uri_val); + val->node = sord_new_blank(world->world, ustr); + break; case LILV_VALUE_STRING: + val->node = sord_new_literal(world->world, NULL, ustr, NULL); + break; case LILV_VALUE_INT: + val->node = sord_new_literal( + world->world, world->uris.xsd_integer, ustr, NULL); + break; case LILV_VALUE_FLOAT: + val->node = sord_new_literal( + world->world, world->uris.xsd_decimal, ustr, NULL); + break; case LILV_VALUE_BOOL: + val->node = sord_new_literal( + world->world, world->uris.xsd_boolean, ustr, NULL); + break; case LILV_VALUE_BLOB: - val->str_val = lilv_strdup(str); + val->node = sord_new_literal( + world->world, world->uris.xsd_base64Binary, ustr, NULL); break; } @@ -88,18 +99,16 @@ lilv_node_new_from_node(LilvWorld* world, const SordNode* node) switch (sord_node_get_type(node)) { case SORD_URI: - result = (LilvNode*)malloc(sizeof(LilvNode)); - result->world = (LilvWorld*)world; - result->type = LILV_VALUE_URI; - result->val.uri_val = sord_node_copy(node); - result->str_val = (char*)sord_node_get_string(result->val.uri_val); + result = (LilvNode*)malloc(sizeof(LilvNode)); + result->world = (LilvWorld*)world; + result->type = LILV_VALUE_URI; + result->node = sord_node_copy(node); break; case SORD_BLANK: - result = (LilvNode*)malloc(sizeof(LilvNode)); - result->world = (LilvWorld*)world; - result->type = LILV_VALUE_BLANK; - result->val.uri_val = sord_node_copy(node); - result->str_val = (char*)sord_node_get_string(result->val.uri_val); + result = (LilvNode*)malloc(sizeof(LilvNode)); + result->world = (LilvWorld*)world; + result->type = LILV_VALUE_BLANK; + result->node = sord_node_copy(node); break; case SORD_LITERAL: datatype_uri = sord_node_get_datatype(node); @@ -179,24 +188,15 @@ LILV_API LilvNode* lilv_node_duplicate(const LilvNode* val) { - if (val == NULL) + if (!val) { return NULL; + } LilvNode* result = (LilvNode*)malloc(sizeof(LilvNode)); result->world = val->world; - result->type = val->type; - - switch (val->type) { - case LILV_VALUE_URI: - case LILV_VALUE_BLANK: - result->val.uri_val = sord_node_copy(val->val.uri_val); - result->str_val = (char*)sord_node_get_string(result->val.uri_val); - break; - default: - result->str_val = lilv_strdup(val->str_val); - result->val = val->val; - } - + result->node = sord_node_copy(val->node); + result->val = val->val; + result->type = val->type; return result; } @@ -205,14 +205,7 @@ void lilv_node_free(LilvNode* val) { if (val) { - switch (val->type) { - case LILV_VALUE_URI: - case LILV_VALUE_BLANK: - sord_node_free(val->world->world, val->val.uri_val); - break; - default: - free(val->str_val); - } + sord_node_free(val->world->world, val->node); free(val); } } @@ -230,20 +223,16 @@ lilv_node_equals(const LilvNode* value, const LilvNode* other) switch (value->type) { case LILV_VALUE_URI: - return sord_node_equals(value->val.uri_val, other->val.uri_val); case LILV_VALUE_BLANK: case LILV_VALUE_STRING: - return !strcmp(value->str_val, other->str_val); + case LILV_VALUE_BLOB: + return sord_node_equals(value->node, other->node); case LILV_VALUE_INT: return (value->val.int_val == other->val.int_val); case LILV_VALUE_FLOAT: return (value->val.float_val == other->val.float_val); case LILV_VALUE_BOOL: return (value->val.bool_val == other->val.bool_val); - case LILV_VALUE_BLOB: - return (value->val.blob_val.size == other->val.blob_val.size) - && !memcmp(value->val.blob_val.buf, other->val.blob_val.buf, - value->val.blob_val.size); } return false; /* shouldn't get here */ @@ -253,32 +242,33 @@ LILV_API char* lilv_node_get_turtle_token(const LilvNode* value) { - size_t len = 0; - char* result = NULL; - SerdNode node; + const char* str = (const char*)sord_node_get_string(value->node); + size_t len = 0; + char* result = NULL; + SerdNode node; switch (value->type) { case LILV_VALUE_URI: - len = strlen(value->str_val) + 3; + len = strlen(str) + 3; result = (char*)calloc(len, 1); - snprintf(result, len, "<%s>", value->str_val); + snprintf(result, len, "<%s>", str); break; case LILV_VALUE_BLANK: - len = strlen(value->str_val) + 3; + len = strlen(str) + 3; result = (char*)calloc(len, 1); - snprintf(result, len, "_:%s", value->str_val); + snprintf(result, len, "_:%s", str); break; case LILV_VALUE_STRING: case LILV_VALUE_BOOL: case LILV_VALUE_BLOB: - result = lilv_strdup(value->str_val); + result = lilv_strdup(str); break; case LILV_VALUE_INT: node = serd_node_new_integer(value->val.int_val); result = (char*)node.buf; break; case LILV_VALUE_FLOAT: - node = serd_node_new_decimal(value->val.float_val, 8); + node = serd_node_new_decimal(value->val.float_val, 8); result = (char*)node.buf; break; } @@ -298,14 +288,14 @@ const char* lilv_node_as_uri(const LilvNode* value) { assert(lilv_node_is_uri(value)); - return value->str_val; + return (const char*)sord_node_get_string(value->node); } const SordNode* lilv_node_as_node(const LilvNode* value) { assert(lilv_node_is_uri(value)); - return value->val.uri_val; + return value->node; } LILV_API @@ -320,7 +310,7 @@ const char* lilv_node_as_blank(const LilvNode* value) { assert(lilv_node_is_blank(value)); - return value->str_val; + return (const char*)sord_node_get_string(value->node); } LILV_API @@ -351,7 +341,7 @@ LILV_API const char* lilv_node_as_string(const LilvNode* value) { - return value ? value->str_val : NULL; + return value ? (const char*)sord_node_get_string(value->node) : NULL; } LILV_API diff --git a/c++/carla-lilv/lilv-0.14.2/src/plugin.c b/c++/carla-lilv/lilv-0.14.4/src/plugin.c similarity index 94% rename from c++/carla-lilv/lilv-0.14.2/src/plugin.c rename to c++/carla-lilv/lilv-0.14.4/src/plugin.c index f8bb980..d8b8cc6 100644 --- a/c++/carla-lilv/lilv-0.14.2/src/plugin.c +++ b/c++/carla-lilv/lilv-0.14.4/src/plugin.c @@ -14,9 +14,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#define __STDC_LIMIT_MACROS + #include #include #include +#include #include #include #include @@ -132,7 +135,7 @@ lilv_plugin_get_unique(const LilvPlugin* p, static void lilv_plugin_load(LilvPlugin* p) { - SordNode* bundle_uri_node = p->bundle_uri->val.uri_val; + SordNode* bundle_uri_node = p->bundle_uri->node; const SerdNode* bundle_uri_snode = sord_node_to_serd_node(bundle_uri_node); SerdEnv* env = serd_env_new(bundle_uri_snode); @@ -142,7 +145,7 @@ lilv_plugin_load(LilvPlugin* p) // Parse all the plugin's data files into RDF model LILV_FOREACH(nodes, i, p->data_uris) { const LilvNode* data_uri_val = lilv_nodes_get(p->data_uris, i); - const SordNode* data_uri_node = data_uri_val->val.uri_val; + const SordNode* data_uri_node = data_uri_val->node; const char* data_uri_str = lilv_node_as_uri(data_uri_val); serd_env_set_base_uri(env, sord_node_to_serd_node(data_uri_node)); @@ -161,7 +164,7 @@ lilv_plugin_load(LilvPlugin* p) GetDataFunc get_data_func = (GetDataFunc)lilv_dlfunc( p->dynmanifest->lib, "lv2_dyn_manifest_get_data"); if (get_data_func) { - const SordNode* bundle = p->dynmanifest->bundle->val.uri_val; + const SordNode* bundle = p->dynmanifest->bundle->node; serd_env_set_base_uri(env, sord_node_to_serd_node(bundle)); FILE* fd = tmpfile(); get_data_func(p->dynmanifest->handle, fd, @@ -209,7 +212,7 @@ lilv_plugin_load_ports_if_necessary(const LilvPlugin* const_p) SordIter* ports = lilv_world_query_internal( p->world, - p->plugin_uri->val.uri_val, + p->plugin_uri->node, p->world->uris.lv2_port, NULL); @@ -221,7 +224,8 @@ lilv_plugin_load_ports_if_necessary(const LilvPlugin* const_p) p, port, p->world->uris.lv2_symbol); bool error = false; - if (!lilv_node_is_string(symbol) || !is_symbol(symbol->str_val)) { + if (!lilv_node_is_string(symbol) || + !is_symbol((const char*)sord_node_get_string(symbol->node))) { LILV_ERRORF("Plugin <%s> port symbol `%s' is invalid\n", lilv_node_as_uri(p->plugin_uri), lilv_node_as_string(symbol)); @@ -329,7 +333,7 @@ lilv_plugin_get_library_uri(const LilvPlugin* const_p) // lv2:binary ?binary SordIter* results = lilv_world_query_internal( p->world, - p->plugin_uri->val.uri_val, + p->plugin_uri->node, p->world->uris.lv2_binary, NULL); FOREACH_MATCH(results) { @@ -365,7 +369,7 @@ lilv_plugin_get_class(const LilvPlugin* const_p) // a ?class SordIter* results = lilv_world_query_internal( p->world, - p->plugin_uri->val.uri_val, + p->plugin_uri->node, p->world->uris.rdf_a, NULL); FOREACH_MATCH(results) { @@ -402,7 +406,7 @@ lilv_plugin_get_value_internal(const LilvPlugin* p, { lilv_plugin_load_if_necessary(p); return lilv_world_query_values_internal( - p->world, p->plugin_uri->val.uri_val, predicate, NULL); + p->world, p->plugin_uri->node, predicate, NULL); } LILV_API @@ -564,7 +568,7 @@ lilv_plugin_has_latency(const LilvPlugin* p) lilv_plugin_load_if_necessary(p); SordIter* ports = lilv_world_query_internal( p->world, - p->plugin_uri->val.uri_val, + p->plugin_uri->node, p->world->uris.lv2_port, NULL); @@ -599,7 +603,7 @@ lilv_plugin_get_port_by_property(const LilvPlugin* plugin, plugin->world, port->node, plugin->world->uris.lv2_portProperty, - port_property->val.uri_val); + port_property->node); const bool found = !sord_iter_end(iter); sord_iter_free(iter); @@ -626,7 +630,7 @@ lilv_plugin_get_port_by_designation(const LilvPlugin* plugin, world, port->node, world->uris.lv2_designation, - designation->val.uri_val); + designation->node); const bool found = !sord_iter_end(iter) && lilv_port_is_a(plugin, port, port_class); @@ -710,15 +714,16 @@ lilv_plugin_has_extension_data(const LilvPlugin* p, const LilvNode* uri) { if (!lilv_node_is_uri(uri)) { - LILV_ERRORF("Extension data `%s' is not a URI\n", uri->str_val); + LILV_ERRORF("Extension data `%s' is not a URI\n", + sord_node_get_string(uri->node)); return false; } SordIter* iter = lilv_world_query_internal( p->world, - p->plugin_uri->val.uri_val, + p->plugin_uri->node, p->world->uris.lv2_extensionData, - uri->val.uri_val); + uri->node); if (iter) { sord_iter_free(iter); @@ -773,7 +778,7 @@ lilv_plugin_get_project(const LilvPlugin* p) SordIter* projects = lilv_world_query_internal( p->world, - p->plugin_uri->val.uri_val, + p->plugin_uri->node, lv2_project, NULL); @@ -799,7 +804,7 @@ lilv_plugin_get_author(const LilvPlugin* p) SordIter* maintainers = lilv_world_query_internal( p->world, - p->plugin_uri->val.uri_val, + p->plugin_uri->node, doap_maintainer, NULL); @@ -813,7 +818,7 @@ lilv_plugin_get_author(const LilvPlugin* p) maintainers = lilv_world_query_internal( p->world, - project->val.uri_val, + project->node, doap_maintainer, NULL); } @@ -888,7 +893,7 @@ lilv_plugin_get_uis(const LilvPlugin* p) LilvUIs* result = lilv_uis_new(); SordIter* uis = lilv_world_query_internal( p->world, - p->plugin_uri->val.uri_val, + p->plugin_uri->node, ui_ui_node, NULL); @@ -937,7 +942,7 @@ lilv_plugin_get_related(const LilvPlugin* plugin, const LilvNode* type) world, NULL, world->uris.lv2_appliesTo, - lilv_plugin_get_uri(plugin)->val.uri_val); + lilv_plugin_get_uri(plugin)->node); if (!type) { return related; @@ -947,10 +952,10 @@ lilv_plugin_get_related(const LilvPlugin* plugin, const LilvNode* type) LILV_FOREACH(nodes, i, related) { LilvNode* node = (LilvNode*)lilv_collection_get((ZixTree*)related, i); SordIter* titer = lilv_world_query_internal( - world, node->val.uri_val, world->uris.rdf_a, type->val.uri_val); + world, node->node, world->uris.rdf_a, type->node); if (!sord_iter_end(titer)) { zix_tree_insert((ZixTree*)matches, - lilv_node_new_from_node(world, node->val.uri_val), + lilv_node_new_from_node(world, node->node), NULL); } sord_iter_free(titer); @@ -998,7 +1003,7 @@ lilv_plugin_write_description(LilvWorld* world, { const LilvNode* subject = lilv_plugin_get_uri(plugin); const uint32_t num_ports = lilv_plugin_get_num_ports(plugin); - const SerdNode* base = sord_node_to_serd_node(base_uri->val.uri_val); + const SerdNode* base = sord_node_to_serd_node(base_uri->node); SerdEnv* env = new_lv2_env(base); SerdWriter* writer = serd_writer_new( @@ -1013,16 +1018,16 @@ lilv_plugin_write_description(LilvWorld* world, maybe_write_prefixes(writer, env, plugin_file); // Write plugin description - SordIter* iter = lilv_world_query_internal( - world, subject->val.uri_val, NULL, NULL); - sord_write_iter(iter, writer); + SordIter* plug_iter = lilv_world_query_internal( + world, subject->node, NULL, NULL); + sord_write_iter(plug_iter, writer); // Write port descriptions for (uint32_t i = 0; i < num_ports; ++i) { const LilvPort* port = plugin->ports[i]; - SordIter* iter = lilv_world_query_internal( + SordIter* port_iter = lilv_world_query_internal( world, port->node, NULL, NULL); - sord_write_iter(iter, writer); + sord_write_iter(port_iter, writer); } serd_writer_free(writer); @@ -1038,7 +1043,7 @@ lilv_plugin_write_manifest_entry(LilvWorld* world, const char* plugin_file_path) { const LilvNode* subject = lilv_plugin_get_uri(plugin); - const SerdNode* base = sord_node_to_serd_node(base_uri->val.uri_val); + const SerdNode* base = sord_node_to_serd_node(base_uri->node); SerdEnv* env = new_lv2_env(base); SerdWriter* writer = serd_writer_new( @@ -1055,7 +1060,7 @@ lilv_plugin_write_manifest_entry(LilvWorld* world, // Write manifest entry serd_writer_write_statement( writer, 0, NULL, - sord_node_to_serd_node(subject->val.uri_val), + sord_node_to_serd_node(subject->node), sord_node_to_serd_node(plugin->world->uris.rdf_a), sord_node_to_serd_node(plugin->world->uris.lv2_Plugin), 0, 0); @@ -1063,7 +1068,7 @@ lilv_plugin_write_manifest_entry(LilvWorld* world, SERD_URI, (const uint8_t*)plugin_file_path); serd_writer_write_statement( writer, 0, NULL, - sord_node_to_serd_node(subject->val.uri_val), + sord_node_to_serd_node(subject->node), sord_node_to_serd_node(plugin->world->uris.rdfs_seeAlso), &file_node, 0, 0); diff --git a/c++/carla-lilv/lilv-0.14.2/src/pluginclass.c b/c++/carla-lilv/lilv-0.14.4/src/pluginclass.c similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/src/pluginclass.c rename to c++/carla-lilv/lilv-0.14.4/src/pluginclass.c diff --git a/c++/carla-lilv/lilv-0.14.2/src/port.c b/c++/carla-lilv/lilv-0.14.4/src/port.c similarity index 98% rename from c++/carla-lilv/lilv-0.14.2/src/port.c rename to c++/carla-lilv/lilv-0.14.4/src/port.c index 2f721da..3bf25e1 100644 --- a/c++/carla-lilv/lilv-0.14.2/src/port.c +++ b/c++/carla-lilv/lilv-0.14.4/src/port.c @@ -121,7 +121,8 @@ lilv_port_get_value(const LilvPlugin* p, const LilvNode* predicate) { if (!lilv_node_is_uri(predicate)) { - LILV_ERRORF("Predicate `%s' is not a URI\n", predicate->str_val); + LILV_ERRORF("Predicate `%s' is not a URI\n", + sord_node_get_string(predicate->node)); return NULL; } diff --git a/c++/carla-lilv/lilv-0.14.2/src/query.c b/c++/carla-lilv/lilv-0.14.4/src/query.c similarity index 99% rename from c++/carla-lilv/lilv-0.14.2/src/query.c rename to c++/carla-lilv/lilv-0.14.4/src/query.c index 7f2a7de..09fa6f2 100644 --- a/c++/carla-lilv/lilv-0.14.2/src/query.c +++ b/c++/carla-lilv/lilv-0.14.4/src/query.c @@ -46,7 +46,7 @@ lilv_lang_matches(const char* a, const char* b) return LILV_LANG_MATCH_NONE; } -LilvNodes* +static LilvNodes* lilv_nodes_from_stream_objects_i18n(LilvWorld* world, SordIter* stream, SordQuadIndex field) diff --git a/c++/carla-lilv/lilv-0.14.2/src/scalepoint.c b/c++/carla-lilv/lilv-0.14.4/src/scalepoint.c similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/src/scalepoint.c rename to c++/carla-lilv/lilv-0.14.4/src/scalepoint.c diff --git a/c++/carla-lilv/lilv-0.14.2/src/state.c b/c++/carla-lilv/lilv-0.14.4/src/state.c similarity index 96% rename from c++/carla-lilv/lilv-0.14.2/src/state.c rename to c++/carla-lilv/lilv-0.14.4/src/state.c index 4fcab72..7992ad6 100644 --- a/c++/carla-lilv/lilv-0.14.2/src/state.c +++ b/c++/carla-lilv/lilv-0.14.4/src/state.c @@ -200,16 +200,16 @@ make_path(LV2_State_Make_Path_Handle handle, const char* path) static char* abstract_path(LV2_State_Map_Path_Handle handle, - const char* absolute_path) + const char* abs_path) { LilvState* state = (LilvState*)handle; char* path = NULL; - char* real_path = lilv_realpath(absolute_path); + char* real_path = lilv_realpath(abs_path); const PathMap key = { (char*)real_path, NULL }; ZixTreeIter* iter = NULL; - if (absolute_path[0] == '\0') { - return lilv_strdup(absolute_path); + if (abs_path[0] == '\0') { + return lilv_strdup(abs_path); } else if (!zix_tree_find(state->abs2rel, &key, &iter)) { // Already mapped path in a previous call PathMap* pm = (PathMap*)zix_tree_get(iter); @@ -259,26 +259,26 @@ abstract_path(LV2_State_Map_Path_Handle handle, static char* absolute_path(LV2_State_Map_Path_Handle handle, - const char* abstract_path) + const char* state_path) { LilvState* state = (LilvState*)handle; char* path = NULL; - if (lilv_path_is_absolute(abstract_path)) { + if (lilv_path_is_absolute(state_path)) { // Absolute path, return identical path - path = lilv_strdup(abstract_path); + path = lilv_strdup(state_path); } else if (state->dir) { // Relative path inside state directory - path = lilv_path_join(state->dir, abstract_path); + path = lilv_path_join(state->dir, state_path); } else { // State has not been saved, unmap - path = lilv_strdup(lilv_state_rel2abs(state, abstract_path)); + path = lilv_strdup(lilv_state_rel2abs(state, state_path)); } return path; } /** Return a new features array which is @c feature added to @c features. */ -const LV2_Feature** +static const LV2_Feature** add_features(const LV2_Feature *const * features, const LV2_Feature* map, const LV2_Feature* make) { @@ -306,6 +306,19 @@ absolute_dir(const char* path) return base; } +static const char* +state_strerror(LV2_State_Status st) +{ + switch (st) { + case LV2_STATE_SUCCESS: return "Completed successfully"; + case LV2_STATE_ERR_BAD_TYPE: return "Unsupported type"; + case LV2_STATE_ERR_BAD_FLAGS: return "Unsupported flags"; + case LV2_STATE_ERR_NO_FEATURE: return "Missing features"; + case LV2_STATE_ERR_NO_PROPERTY: return "Missing property"; + default: return "Unknown error"; + } +} + LILV_API LilvState* lilv_state_new_from_instance(const LilvPlugin* plugin, @@ -365,11 +378,18 @@ lilv_state_new_from_instance(const LilvPlugin* plugin, : NULL; if (iface) { - iface->save(instance->lv2_handle, store_callback, - state, flags, features); + LV2_State_Status st = iface->save( + instance->lv2_handle, store_callback, state, flags, features); + if (st) { + LILV_ERRORF("Error saving plugin state: %s\n", state_strerror(st)); + free(state->props); + state->props = NULL; + state->num_props = 0; + } else { + qsort(state->props, state->num_props, sizeof(Property), property_cmp); + } } - qsort(state->props, state->num_props, sizeof(Property), property_cmp); qsort(state->values, state->num_values, sizeof(PortValue), value_cmp); free(sfeatures); @@ -557,7 +577,7 @@ lilv_state_new_from_world(LilvWorld* world, } LilvState* state = new_state_from_model( - world, map, world->model, node->val.uri_val, NULL); + world, map, world->model, node->node, NULL); return state; } @@ -585,7 +605,7 @@ lilv_state_new_from_file(LilvWorld* world, serd_reader_read_file(reader, node.buf); SordNode* subject_node = (subject) - ? subject->val.uri_val + ? subject->node : sord_node_from_serd_node(world->world, env, &node, NULL, NULL); char* dirname = lilv_dirname(path); @@ -760,7 +780,7 @@ lilv_state_write(LilvWorld* world, SERD_CURIE, USTR("lv2:appliesTo")); const SerdNode* plugin_uri = sord_node_to_serd_node( - state->plugin_uri->val.uri_val); + state->plugin_uri->node); SerdNode subject = serd_node_from_string(SERD_URI, USTR(uri ? uri : "")); diff --git a/c++/carla-lilv/lilv-0.14.2/src/ui.c b/c++/carla-lilv/lilv-0.14.4/src/ui.c similarity index 98% rename from c++/carla-lilv/lilv-0.14.2/src/ui.c rename to c++/carla-lilv/lilv-0.14.4/src/ui.c index 6e08dee..f33c4da 100644 --- a/c++/carla-lilv/lilv-0.14.2/src/ui.c +++ b/c++/carla-lilv/lilv-0.14.4/src/ui.c @@ -134,7 +134,7 @@ lilv_ui_get_value_internal(const LilvUI* ui, const SordNode* predicate) { return lilv_world_query_values_internal( - ui->world, ui->uri->val.uri_val, predicate, NULL); + ui->world, ui->uri->node, predicate, NULL); } LILV_API diff --git a/c++/carla-lilv/lilv-0.14.2/src/util.c b/c++/carla-lilv/lilv-0.14.4/src/util.c similarity index 97% rename from c++/carla-lilv/lilv-0.14.2/src/util.c rename to c++/carla-lilv/lilv-0.14.4/src/util.c index b0df5e0..6286446 100644 --- a/c++/carla-lilv/lilv-0.14.2/src/util.c +++ b/c++/carla-lilv/lilv-0.14.4/src/util.c @@ -49,6 +49,10 @@ # include #endif +#ifndef PAGE_SIZE +# define PAGE_SIZE 4096 +#endif + char* lilv_strjoin(const char* first, ...) { @@ -65,7 +69,12 @@ lilv_strjoin(const char* first, ...) break; const size_t this_len = strlen(s); - result = (char*)realloc(result, len + this_len + 1); + if (!(result = (char*)realloc(result, len + this_len + 1))) { + free(result); + LILV_ERROR("realloc() failed\n"); + return NULL; + } + memcpy(result + len, s, this_len); len += this_len; } @@ -133,7 +142,7 @@ lilv_get_lang(void) } /** Append suffix to dst, update dst_len, and return the realloc'd result. */ -char* +static char* strappend(char* dst, size_t* dst_len, const char* suffix, size_t suffix_len) { dst = (char*)realloc(dst, *dst_len + suffix_len + 1); @@ -143,7 +152,7 @@ strappend(char* dst, size_t* dst_len, const char* suffix, size_t suffix_len) } /** Append the value of the environment variable var to dst. */ -char* +static char* append_var(char* dst, size_t* dst_len, const char* var) { // Get value from environment @@ -269,10 +278,9 @@ lilv_copy_file(const char* src, const char* dst) return 2; } - static const size_t page_size = 4096; - char* page = (char*)malloc(page_size); - size_t n_read = 0; - while ((n_read = fread(page, 1, page_size, in)) > 0) { + char* page = (char*)malloc(PAGE_SIZE); + size_t n_read = 0; + while ((n_read = fread(page, 1, PAGE_SIZE, in)) > 0) { if (fwrite(page, 1, n_read, out) != n_read) { LILV_ERRORF("write to %s failed (%s)\n", dst, strerror(errno)); break; @@ -418,11 +426,7 @@ lilv_symlink(const char* oldpath, const char* newpath) int ret = 0; if (strcmp(oldpath, newpath)) { #ifdef _WIN32 -#ifndef __MINGW32__ ret = !CreateSymbolicLink(newpath, oldpath, 0); -#else - ret = 0; -#endif #else ret = symlink(oldpath, newpath); #endif diff --git a/c++/carla-lilv/lilv-0.14.2/src/world.c b/c++/carla-lilv/lilv-0.14.4/src/world.c similarity index 96% rename from c++/carla-lilv/lilv-0.14.2/src/world.c rename to c++/carla-lilv/lilv-0.14.4/src/world.c index ffbbccf..6d73cdd 100644 --- a/c++/carla-lilv/lilv-0.14.2/src/world.c +++ b/c++/carla-lilv/lilv-0.14.4/src/world.c @@ -182,11 +182,13 @@ lilv_world_find_nodes(LilvWorld* world, const LilvNode* object) { if (subject && !lilv_node_is_uri(subject) && !lilv_node_is_blank(subject)) { - LILV_ERRORF("Subject `%s' is not a resource\n", subject->str_val); + LILV_ERRORF("Subject `%s' is not a resource\n", + sord_node_get_string(subject->node)); return NULL; } if (!lilv_node_is_uri(predicate)) { - LILV_ERRORF("Predicate `%s' is not a URI\n", predicate->str_val); + LILV_ERRORF("Predicate `%s' is not a URI\n", + sord_node_get_string(predicate->node)); return NULL; } if (!subject && !object) { @@ -195,15 +197,15 @@ lilv_world_find_nodes(LilvWorld* world, } SordNode* const subject_node = subject - ? sord_node_copy(subject->val.uri_val) + ? sord_node_copy(subject->node) : NULL; SordNode* const object_node = object - ? sord_node_copy(object->val.uri_val) + ? sord_node_copy(object->node) : NULL; LilvNodes* ret = lilv_world_query_values_internal( - world, subject_node, predicate->val.uri_val, object_node); + world, subject_node, predicate->node, object_node); sord_node_free(world->world, subject_node); sord_node_free(world->world, object_node); @@ -267,6 +269,10 @@ struct LilvHeader* lilv_collection_get_by_uri(const ZixTree* const_seq, const LilvNode* uri) { + if (!lilv_node_is_uri(uri)) { + return NULL; + } + ZixTree* seq = (ZixTree*)const_seq; struct LilvHeader key = { NULL, (LilvNode*)uri }; @@ -494,11 +500,12 @@ void lilv_world_load_bundle(LilvWorld* world, LilvNode* bundle_uri) { if (!lilv_node_is_uri(bundle_uri)) { - LILV_ERRORF("Bundle URI `%s' is not a URI\n", bundle_uri->str_val); + LILV_ERRORF("Bundle URI `%s' is not a URI\n", + sord_node_get_string(bundle_uri->node)); return; } - SordNode* bundle_node = bundle_uri->val.uri_val; + SordNode* bundle_node = bundle_uri->node; SerdNode manifest_uri = lilv_new_uri_relative_to_base( (const uint8_t*)"manifest.ttl", @@ -629,7 +636,7 @@ lilv_world_load_specifications(LilvWorld* world) LILV_FOREACH(nodes, f, spec->data_uris) { LilvNode* file = (LilvNode*)lilv_collection_get(spec->data_uris, f); - const SerdNode* node = sord_node_to_serd_node(file->val.uri_val); + const SerdNode* node = sord_node_to_serd_node(file->node); SerdEnv* env = serd_env_new(node); SerdReader* reader = sord_new_reader(world->model, env, SERD_TURTLE, NULL); @@ -698,12 +705,10 @@ lilv_world_load_plugin_classes(LilvWorld* world) const uint8_t* label = sord_node_get_string(label_node); sord_iter_free(labels); - LilvPluginClasses* classes = world->plugin_classes; - LilvPluginClass* pclass = lilv_plugin_class_new( + LilvPluginClass* pclass = lilv_plugin_class_new( world, parent_node, class_node, (const char*)label); - if (pclass) { - zix_tree_insert((ZixTree*)classes, pclass, NULL); + zix_tree_insert((ZixTree*)world->plugin_classes, pclass, NULL); } } sord_iter_free(classes); @@ -751,13 +756,14 @@ lilv_world_load_resource(LilvWorld* world, const LilvNode* resource) { if (!lilv_node_is_uri(resource) && !lilv_node_is_blank(resource)) { - LILV_ERRORF("Node `%s' is not a resource\n", resource->str_val); + LILV_ERRORF("Node `%s' is not a resource\n", + sord_node_get_string(resource->node)); return -1; } int n_read = 0; SordIter* files = sord_search(world->model, - resource->val.uri_val, + resource->node, world->uris.rdfs_seeAlso, NULL, NULL); FOREACH_MATCH(files) { diff --git a/c++/carla-lilv/lilv-0.14.2/src/zix/common.h b/c++/carla-lilv/lilv-0.14.4/src/zix/common.h similarity index 90% rename from c++/carla-lilv/lilv-0.14.2/src/zix/common.h rename to c++/carla-lilv/lilv-0.14.4/src/zix/common.h index ab7e431..f126cd1 100644 --- a/c++/carla-lilv/lilv-0.14.2/src/zix/common.h +++ b/c++/carla-lilv/lilv-0.14.4/src/zix/common.h @@ -36,8 +36,13 @@ # else # define ZIX_API ZIX_LIB_IMPORT # endif +# define ZIX_PRIVATE static +#elif defined(ZIX_INLINE) +# define ZIX_API static inline +# define ZIX_PRIVATE static inline #else # define ZIX_API +# define ZIX_PRIVATE static #endif /** @endcond */ @@ -53,6 +58,8 @@ typedef enum { ZIX_STATUS_NO_MEM, ZIX_STATUS_NOT_FOUND, ZIX_STATUS_EXISTS, + ZIX_STATUS_BAD_ARG, + ZIX_STATUS_BAD_PERMS, } ZixStatus; /** diff --git a/c++/carla-lilv/lilv-0.14.2/src/zix/tree.c b/c++/carla-lilv/lilv-0.14.4/src/zix/tree.c similarity index 93% rename from c++/carla-lilv/lilv-0.14.2/src/zix/tree.c rename to c++/carla-lilv/lilv-0.14.4/src/zix/tree.c index c8a5bb4..844adb9 100644 --- a/c++/carla-lilv/lilv-0.14.2/src/zix/tree.c +++ b/c++/carla-lilv/lilv-0.14.4/src/zix/tree.c @@ -66,8 +66,7 @@ struct ZixTreeNodeImpl { # define DEBUG_PRINTF(fmt, ...) #endif -ZIX_API -ZixTree* +ZIX_API ZixTree* zix_tree_new(bool allow_duplicates, ZixComparator cmp, void* cmp_data, @@ -83,7 +82,7 @@ zix_tree_new(bool allow_duplicates, return t; } -static void +ZIX_PRIVATE void zix_tree_free_rec(ZixTree* t, ZixTreeNode* n) { if (n) { @@ -96,8 +95,7 @@ zix_tree_free_rec(ZixTree* t, ZixTreeNode* n) } } -ZIX_API -void +ZIX_API void zix_tree_free(ZixTree* t) { if (t) { @@ -106,13 +104,13 @@ zix_tree_free(ZixTree* t) } } -size_t -zix_tree_size(ZixTree* t) +ZIX_API size_t +zix_tree_size(const ZixTree* t) { return t->size; } -static void +ZIX_PRIVATE void rotate(ZixTreeNode* p, ZixTreeNode* q) { assert(q->parent == p); @@ -156,7 +154,7 @@ rotate(ZixTreeNode* p, ZixTreeNode* q) * / \ / \ * B C A B */ -static ZixTreeNode* +ZIX_PRIVATE ZixTreeNode* rotate_left(ZixTreeNode* p, int* height_change) { ZixTreeNode* const q = p->right; @@ -189,7 +187,7 @@ rotate_left(ZixTreeNode* p, int* height_change) * A B B C * */ -static ZixTreeNode* +ZIX_PRIVATE ZixTreeNode* rotate_right(ZixTreeNode* p, int* height_change) { ZixTreeNode* const q = p->left; @@ -224,7 +222,7 @@ rotate_right(ZixTreeNode* p, int* height_change) * B C * */ -static ZixTreeNode* +ZIX_PRIVATE ZixTreeNode* rotate_left_right(ZixTreeNode* p, int* height_change) { ZixTreeNode* const q = p->left; @@ -268,7 +266,7 @@ rotate_left_right(ZixTreeNode* p, int* height_change) * B C * */ -static ZixTreeNode* +ZIX_PRIVATE ZixTreeNode* rotate_right_left(ZixTreeNode* p, int* height_change) { ZixTreeNode* const q = p->right; @@ -301,7 +299,7 @@ rotate_right_left(ZixTreeNode* p, int* height_change) return r; } -static ZixTreeNode* +ZIX_PRIVATE ZixTreeNode* zix_tree_rebalance(ZixTree* t, ZixTreeNode* node, int* height_change) { #ifdef ZIX_TREE_HYPER_VERIFY @@ -338,8 +336,7 @@ zix_tree_rebalance(ZixTree* t, ZixTreeNode* node, int* height_change) return replacement; } -ZIX_API -ZixStatus +ZIX_API ZixStatus zix_tree_insert(ZixTree* t, void* e, ZixTreeIter** ti) { DEBUG_PRINTF("**** INSERT %ld\n", (intptr_t)e); @@ -438,8 +435,7 @@ zix_tree_insert(ZixTree* t, void* e, ZixTreeIter** ti) return ZIX_STATUS_SUCCESS; } -ZIX_API -ZixStatus +ZIX_API ZixStatus zix_tree_remove(ZixTree* t, ZixTreeIter* ti) { ZixTreeNode* const n = ti; @@ -596,8 +592,7 @@ zix_tree_remove(ZixTree* t, ZixTreeIter* ti) return ZIX_STATUS_SUCCESS; } -ZIX_API -ZixStatus +ZIX_API ZixStatus zix_tree_find(const ZixTree* t, const void* e, ZixTreeIter** ti) { ZixTreeNode* n = t->root; @@ -616,15 +611,13 @@ zix_tree_find(const ZixTree* t, const void* e, ZixTreeIter** ti) return (n) ? ZIX_STATUS_SUCCESS : ZIX_STATUS_NOT_FOUND; } -ZIX_API -void* +ZIX_API void* zix_tree_get(ZixTreeIter* ti) { return ti ? ti->data : NULL; } -ZIX_API -ZixTreeIter* +ZIX_API ZixTreeIter* zix_tree_begin(ZixTree* t) { if (!t->root) { @@ -638,22 +631,45 @@ zix_tree_begin(ZixTree* t) return n; } -ZIX_API -ZixTreeIter* +ZIX_API ZixTreeIter* zix_tree_end(ZixTree* t) { return NULL; } -ZIX_API -bool +ZIX_API ZixTreeIter* +zix_tree_rbegin(ZixTree* t) +{ + if (!t->root) { + return NULL; + } + + ZixTreeNode* n = t->root; + while (n->right) { + n = n->right; + } + return n; +} + +ZIX_API ZixTreeIter* +zix_tree_rend(ZixTree* t) +{ + return NULL; +} + +ZIX_API bool zix_tree_iter_is_end(ZixTreeIter* i) { return !i; } -ZIX_API -ZixTreeIter* +ZIX_API bool +zix_tree_iter_is_rend(ZixTreeIter* i) +{ + return !i; +} + +ZIX_API ZixTreeIter* zix_tree_iter_next(ZixTreeIter* i) { if (!i) { @@ -675,3 +691,26 @@ zix_tree_iter_next(ZixTreeIter* i) return i; } + +ZIX_API ZixTreeIter* +zix_tree_iter_prev(ZixTreeIter* i) +{ + if (!i) { + return NULL; + } + + if (i->left) { + i = i->left; + while (i->right) { + i = i->right; + } + } else { + while (i->parent && i->parent->left == i) { // i is a left child + i = i->parent; + } + + i = i->parent; + } + + return i; +} diff --git a/c++/carla-lilv/lilv-0.14.2/src/zix/tree.h b/c++/carla-lilv/lilv-0.14.4/src/zix/tree.h similarity index 90% rename from c++/carla-lilv/lilv-0.14.2/src/zix/tree.h rename to c++/carla-lilv/lilv-0.14.4/src/zix/tree.h index 5a74fd7..f89d9e5 100644 --- a/c++/carla-lilv/lilv-0.14.2/src/zix/tree.h +++ b/c++/carla-lilv/lilv-0.14.4/src/zix/tree.h @@ -45,7 +45,7 @@ typedef struct ZixTreeNodeImpl ZixTreeIter; /** Create a new (empty) tree. */ -ZixTree* +ZIX_API ZixTree* zix_tree_new(bool allow_duplicates, ZixComparator cmp, void* cmp_data, @@ -54,86 +54,86 @@ zix_tree_new(bool allow_duplicates, /** Free @a t. */ -void +ZIX_API void zix_tree_free(ZixTree* t); /** Return the number of elements in @a t. */ -size_t -zix_tree_size(ZixTree* t); +ZIX_API size_t +zix_tree_size(const ZixTree* t); /** Insert the element @a e into @a t and point @a ti at the new element. */ -ZixStatus +ZIX_API ZixStatus zix_tree_insert(ZixTree* t, void* e, ZixTreeIter** ti); /** Remove the item pointed at by @a ti from @a t. */ -ZixStatus +ZIX_API ZixStatus zix_tree_remove(ZixTree* t, ZixTreeIter* ti); /** Set @a ti to an element equal to @a e in @a t. If no such item exists, @a ti is set to NULL. */ -ZixStatus +ZIX_API ZixStatus zix_tree_find(const ZixTree* t, const void* e, ZixTreeIter** ti); /** Return the data associated with the given tree item. */ -void* +ZIX_API void* zix_tree_get(ZixTreeIter* ti); /** Return an iterator to the first (smallest) element in @a t. */ -ZixTreeIter* +ZIX_API ZixTreeIter* zix_tree_begin(ZixTree* t); /** Return an iterator the the element one past the last element in @a t. */ -ZixTreeIter* +ZIX_API ZixTreeIter* zix_tree_end(ZixTree* t); /** Return true iff @a i is an iterator to the end of its tree. */ -bool +ZIX_API bool zix_tree_iter_is_end(ZixTreeIter* i); /** Return an iterator to the last (largest) element in @a t. */ -ZixTreeIter* +ZIX_API ZixTreeIter* zix_tree_rbegin(ZixTree* t); /** Return an iterator the the element one before the first element in @a t. */ -ZixTreeIter* +ZIX_API ZixTreeIter* zix_tree_rend(ZixTree* t); /** Return true iff @a i is an iterator to the reverse end of its tree. */ -bool +ZIX_API bool zix_tree_iter_is_rend(ZixTreeIter* i); /** Return an iterator that points to the element one past @a i. */ -ZixTreeIter* +ZIX_API ZixTreeIter* zix_tree_iter_next(ZixTreeIter* i); /** Return an iterator that points to the element one before @a i. */ -ZixTreeIter* +ZIX_API ZixTreeIter* zix_tree_iter_prev(ZixTreeIter* i); /** diff --git a/c++/carla-lilv/lilv-0.14.2/test/lilv_test.c b/c++/carla-lilv/lilv-0.14.4/test/lilv_test.c similarity index 98% rename from c++/carla-lilv/lilv-0.14.2/test/lilv_test.c rename to c++/carla-lilv/lilv-0.14.4/test/lilv_test.c index ea22771..f08656f 100644 --- a/c++/carla-lilv/lilv-0.14.2/test/lilv_test.c +++ b/c++/carla-lilv/lilv-0.14.4/test/lilv_test.c @@ -64,7 +64,7 @@ static LilvWorld* world; int test_count = 0; int error_count = 0; -void +static void delete_bundle(void) { unlink(content_name); @@ -72,7 +72,7 @@ delete_bundle(void) remove(bundle_dir_name); } -void +static void init_tests(void) { strncpy(bundle_dir_name, getenv("HOME"), 900); @@ -86,8 +86,8 @@ init_tests(void) delete_bundle(); } -void -fatal_error(const char *err, const char *arg) +static void +fatal_error(const char* err, const char* arg) { /* TODO: possibly change to vfprintf later */ fprintf(stderr, err, arg); @@ -96,8 +96,8 @@ fatal_error(const char *err, const char *arg) exit(1); } -void -write_file(const char *name, const char *content) +static void +write_file(const char* name, const char* content) { FILE* f = fopen(name, "w"); size_t len = strlen(content); @@ -106,14 +106,14 @@ write_file(const char *name, const char *content) fclose(f); } -int +static int init_world(void) { world = lilv_world_new(); return world != NULL; } -int +static int load_all_bundles(void) { if (!init_world()) @@ -122,8 +122,8 @@ load_all_bundles(void) return 1; } -void -create_bundle(char *manifest, char *content) +static void +create_bundle(const char* manifest, const char* content) { if (mkdir(bundle_dir_name, 0700) && errno != EEXIST) fatal_error("Cannot create directory %s\n", bundle_dir_name); @@ -131,14 +131,14 @@ create_bundle(char *manifest, char *content) write_file(content_name, content); } -int -start_bundle(char *manifest, char *content) +static int +start_bundle(const char* manifest, const char* content) { create_bundle(manifest, content); return load_all_bundles(); } -void +static void unload_bundle(void) { if (world) @@ -146,7 +146,7 @@ unload_bundle(void) world = NULL; } -void +static void cleanup(void) { delete_bundle(); @@ -166,7 +166,7 @@ cleanup(void) typedef int (*TestFunc)(void); struct TestCase { - const char *title; + const char* title; TestFunc func; }; @@ -184,13 +184,13 @@ struct TestCase { #define PLUGIN_NAME(name) "doap:name \"" name "\"" #define LICENSE_GPL "doap:license " -static char *uris_plugin = "http://example.org/plug"; +static const char* uris_plugin = "http://example.org/plug"; static LilvNode* plugin_uri_value; static LilvNode* plugin2_uri_value; /*****************************************************************************/ -void +static void init_uris(void) { plugin_uri_value = lilv_new_uri(world, uris_plugin); @@ -199,7 +199,7 @@ init_uris(void) TEST_ASSERT(plugin2_uri_value); } -void +static void cleanup_uris(void) { lilv_node_free(plugin2_uri_value); @@ -210,7 +210,7 @@ cleanup_uris(void) /*****************************************************************************/ -int +static int test_utils(void) { TEST_ASSERT(!strcmp(lilv_uri_to_path("file:///tmp/blah"), "/tmp/blah")); @@ -221,7 +221,7 @@ test_utils(void) /*****************************************************************************/ -int +static int test_value(void) { if (!start_bundle(MANIFEST_PREFIXES @@ -349,7 +349,7 @@ discovery_verify_plugin(const LilvPlugin* plugin) } } -int +static int test_discovery(void) { if (!start_bundle(MANIFEST_PREFIXES @@ -392,7 +392,7 @@ test_discovery(void) /*****************************************************************************/ -int +static int test_lv2_path(void) { #ifndef _WIN32 @@ -400,7 +400,7 @@ test_lv2_path(void) setenv("LV2_PATH", "~/.lv2:/usr/local/lib/lv2:/usr/lib/lv2", 1); - LilvWorld* world = lilv_world_new(); + world = lilv_world_new(); lilv_world_load_all(world); const LilvPlugins* plugins = lilv_world_get_all_plugins(world); @@ -414,6 +414,7 @@ test_lv2_path(void) plugins = lilv_world_get_all_plugins(world); TEST_ASSERT(lilv_plugins_size(plugins) == n_plugins); lilv_world_free(world); + world = NULL; if (orig_lv2_path) { setenv("LV2_PATH", orig_lv2_path, 1); @@ -427,7 +428,7 @@ test_lv2_path(void) /*****************************************************************************/ -int +static int test_verify(void) { if (!start_bundle(MANIFEST_PREFIXES @@ -451,7 +452,7 @@ test_verify(void) /*****************************************************************************/ -int +static int test_no_verify(void) { if (!start_bundle(MANIFEST_PREFIXES @@ -471,7 +472,7 @@ test_no_verify(void) /*****************************************************************************/ -int +static int test_classes(void) { if (!start_bundle(MANIFEST_PREFIXES @@ -515,7 +516,7 @@ test_classes(void) /*****************************************************************************/ -int +static int test_plugin(void) { if (!start_bundle(MANIFEST_PREFIXES @@ -730,7 +731,7 @@ test_plugin(void) /*****************************************************************************/ -int +static int test_port(void) { if (!start_bundle(MANIFEST_PREFIXES @@ -965,7 +966,7 @@ ui_supported(const char* container_type_uri, return !strcmp(container_type_uri, ui_type_uri); } -int +static int test_ui(void) { if (!start_bundle(MANIFEST_PREFIXES @@ -1075,7 +1076,7 @@ uint32_t atom_Float = 0; float in = 1.0; float out = 42.0; -const void* +static const void* get_port_value(const char* port_symbol, void* user_data, uint32_t* size, @@ -1097,7 +1098,7 @@ get_port_value(const char* port_symbol, } } -void +static void set_port_value(const char* port_symbol, void* user_data, const void* value, @@ -1117,7 +1118,7 @@ set_port_value(const char* port_symbol, char** uris = NULL; size_t n_uris = 0; -LV2_URID +static LV2_URID map_uri(LV2_URID_Map_Handle handle, const char* uri) { @@ -1133,7 +1134,7 @@ map_uri(LV2_URID_Map_Handle handle, return n_uris; } -const char* +static const char* unmap_uri(LV2_URID_Map_Handle handle, LV2_URID urid) { @@ -1145,19 +1146,20 @@ unmap_uri(LV2_URID_Map_Handle handle, static char* temp_dir = NULL; -char* +static char* lilv_make_path(LV2_State_Make_Path_Handle handle, const char* path) { return lilv_path_join(temp_dir, path); } -int +static int test_state(void) { + init_world(); + uint8_t* abs_bundle = (uint8_t*)lilv_path_absolute(LILV_TEST_BUNDLE); SerdNode bundle = serd_node_new_file_uri(abs_bundle, 0, 0, true); - LilvWorld* world = lilv_world_new(); LilvNode* bundle_uri = lilv_new_uri(world, (const char*)bundle.buf); LilvNode* plugin_uri = lilv_new_uri(world, "http://example.org/lilv-test-plugin"); @@ -1414,7 +1416,6 @@ test_state(void) lilv_node_free(plugin_uri); lilv_node_free(bundle_uri); - lilv_world_free(world); free(link_dir); free(copy_dir); free(temp_dir); @@ -1425,7 +1426,7 @@ test_state(void) /*****************************************************************************/ -int +static int test_bad_port_symbol(void) { if (!start_bundle(MANIFEST_PREFIXES @@ -1456,7 +1457,7 @@ test_bad_port_symbol(void) /*****************************************************************************/ -int +static int test_bad_port_index(void) { if (!start_bundle(MANIFEST_PREFIXES @@ -1487,7 +1488,7 @@ test_bad_port_index(void) /*****************************************************************************/ -int +static int test_string(void) { char* s = NULL; @@ -1547,7 +1548,7 @@ static struct TestCase tests[] = { { NULL, NULL } }; -void +static void run_tests(void) { int i; @@ -1565,7 +1566,7 @@ run_tests(void) } int -main(int argc, char *argv[]) +main(int argc, char* argv[]) { if (argc != 1) { printf("Syntax: %s\n", argv[0]); diff --git a/c++/carla-lilv/lilv-0.14.2/test/manifest.ttl.in b/c++/carla-lilv/lilv-0.14.4/test/manifest.ttl.in similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/test/manifest.ttl.in rename to c++/carla-lilv/lilv-0.14.4/test/manifest.ttl.in diff --git a/c++/carla-lilv/lilv-0.14.2/test/test_plugin.c b/c++/carla-lilv/lilv-0.14.4/test/test_plugin.c similarity index 99% rename from c++/carla-lilv/lilv-0.14.2/test/test_plugin.c rename to c++/carla-lilv/lilv-0.14.4/test/test_plugin.c index cddb0c44..9f78f4e 100644 --- a/c++/carla-lilv/lilv-0.14.2/test/test_plugin.c +++ b/c++/carla-lilv/lilv-0.14.4/test/test_plugin.c @@ -351,7 +351,7 @@ restore(LV2_Handle instance, return LV2_STATE_SUCCESS; } -const void* +static const void* extension_data(const char* uri) { static const LV2_State_Interface state = { save, restore }; diff --git a/c++/carla-lilv/lilv-0.14.2/test/test_plugin.ttl.in b/c++/carla-lilv/lilv-0.14.4/test/test_plugin.ttl.in similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/test/test_plugin.ttl.in rename to c++/carla-lilv/lilv-0.14.4/test/test_plugin.ttl.in diff --git a/c++/carla-lilv/lilv-0.14.4/utils/bench.h b/c++/carla-lilv/lilv-0.14.4/utils/bench.h new file mode 100644 index 0000000..948622c --- /dev/null +++ b/c++/carla-lilv/lilv-0.14.4/utils/bench.h @@ -0,0 +1,52 @@ +/* + Copyright 2011-2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file bench.h A simple real-time benchmarking API. +*/ + +#ifndef BENCH_H +#define BENCH_H + +#define _POSIX_C_SOURCE 199309L + +#include +#include + +static inline double +bench_elapsed_s(const struct timespec* start, const struct timespec* end) +{ + return ((end->tv_sec - start->tv_sec) + + ((end->tv_nsec - start->tv_nsec) * 0.000000001)); +} + +static inline struct timespec +bench_start() +{ + struct timespec start_t; + clock_gettime(CLOCK_REALTIME, &start_t); + return start_t; +} + +static inline double +bench_end(const struct timespec* start_t) +{ + struct timespec end_t; + clock_gettime(CLOCK_REALTIME, &end_t); + return bench_elapsed_s(start_t, &end_t); +} + +#endif /* BENCH_H */ diff --git a/c++/carla-lilv/lilv-0.14.2/utils/lilv-bench.c b/c++/carla-lilv/lilv-0.14.4/utils/lilv-bench.c similarity index 71% rename from c++/carla-lilv/lilv-0.14.2/utils/lilv-bench.c rename to c++/carla-lilv/lilv-0.14.4/utils/lilv-bench.c index 44c0a79..432e5fd 100644 --- a/c++/carla-lilv/lilv-0.14.2/utils/lilv-bench.c +++ b/c++/carla-lilv/lilv-0.14.4/utils/lilv-bench.c @@ -20,23 +20,6 @@ #include "lilv_config.h" -void -print_version(void) -{ - printf("lilv_bench (lilv) " LILV_VERSION "\n"); - printf("Copyright 2011-2011 David Robillard \n"); - printf("License: \n"); - printf("This is free software: you are free to change and redistribute it.\n"); - printf("There is NO WARRANTY, to the extent permitted by law.\n"); -} - -void -print_usage(void) -{ - printf("Usage: lilv_bench\n"); - printf("Load all discovered LV2 plugins.\n"); -} - int main(int argc, char** argv) { diff --git a/c++/carla-lilv/lilv-0.14.2/utils/lilv.bash_completion b/c++/carla-lilv/lilv-0.14.4/utils/lilv.bash_completion similarity index 100% rename from c++/carla-lilv/lilv-0.14.2/utils/lilv.bash_completion rename to c++/carla-lilv/lilv-0.14.4/utils/lilv.bash_completion diff --git a/c++/carla-lilv/lilv-0.14.4/utils/lv2bench.c b/c++/carla-lilv/lilv-0.14.4/utils/lv2bench.c new file mode 100644 index 0000000..30a4aaf --- /dev/null +++ b/c++/carla-lilv/lilv-0.14.4/utils/lv2bench.c @@ -0,0 +1,226 @@ +/* + Copyright 2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#define _POSIX_C_SOURCE 199309L + +#include +#include +#include + +#include "lilv/lilv.h" +#include "lv2/lv2plug.in/ns/ext/atom/atom.h" + +#include "lilv_config.h" +#include "bench.h" +#include "uri_table.h" + +static LilvNode* atom_AtomPort = NULL; +static LilvNode* atom_Sequence = NULL; +static LilvNode* lv2_AudioPort = NULL; +static LilvNode* lv2_CVPort = NULL; +static LilvNode* lv2_ControlPort = NULL; +static LilvNode* lv2_InputPort = NULL; +static LilvNode* lv2_OutputPort = NULL; +static LilvNode* urid_map = NULL; + +static bool full_output = false; + +static void +print_version(void) +{ + printf( + "lv2bench (lilv) " LILV_VERSION "\n" + "Copyright 2012 David Robillard \n" + "License: \n" + "This is free software: you are free to change and redistribute it.\n" + "There is NO WARRANTY, to the extent permitted by law.\n"); +} + +static void +print_usage(void) +{ + printf("lv2bench - Benchmark all installed and supported LV2 plugins.\n"); + printf("Usage: lv2bench [OPTIONS]\n"); + printf("\n"); + printf(" -b BLOCK_SIZE Specify block size, in audio frames.\n"); + printf(" -f, --full Full plottable output.\n"); + printf(" -h, --help Display this help and exit.\n"); + printf(" -n FRAMES Total number of audio frames to process\n"); + printf(" --version Display version information and exit\n"); +} + +static double +bench(const LilvPlugin* p, uint32_t sample_count, uint32_t block_size) +{ + URITable uri_table; + uri_table_init(&uri_table); + + LV2_URID_Map map = { &uri_table, uri_table_map }; + LV2_Feature map_feature = { LV2_URID_MAP_URI, &map }; + LV2_URID_Unmap unmap = { &uri_table, uri_table_unmap }; + LV2_Feature unmap_feature = { LV2_URID_UNMAP_URI, &unmap }; + const LV2_Feature* features[] = { &map_feature, &unmap_feature, NULL }; + + float* const buf = (float*)calloc(block_size * 2, sizeof(float)); + float* const in = buf; + float* const out = buf + block_size; + if (!buf) { + fprintf(stderr, "Out of memory\n"); + return 0.0; + } + + LV2_Atom_Sequence seq = { + { sizeof(LV2_Atom_Sequence_Body), + uri_table_map(&uri_table, LV2_ATOM__Sequence) }, + { 0, 0 } }; + + const char* uri = lilv_node_as_string(lilv_plugin_get_uri(p)); + LilvNodes* required = lilv_plugin_get_required_features(p); + LILV_FOREACH(nodes, i, required) { + const LilvNode* feature = lilv_nodes_get(required, i); + if (!lilv_node_equals(feature, urid_map)) { + fprintf(stderr, "<%s> requires feature <%s>, skipping\n", + uri, lilv_node_as_uri(feature)); + free(buf); + return 0.0; + } + } + + LilvInstance* instance = lilv_plugin_instantiate(p, 48000.0, features); + if (!instance) { + fprintf(stderr, "Failed to instantiate <%s>\n", + lilv_node_as_uri(lilv_plugin_get_uri(p))); + free(buf); + return 0.0; + } + + float* controls = (float*)calloc( + lilv_plugin_get_num_ports(p), sizeof(float)); + lilv_plugin_get_port_ranges_float(p, NULL, NULL, controls); + + const uint32_t n_ports = lilv_plugin_get_num_ports(p); + for (uint32_t index = 0; index < n_ports; ++index) { + const LilvPort* port = lilv_plugin_get_port_by_index(p, index); + if (lilv_port_is_a(p, port, lv2_ControlPort)) { + lilv_instance_connect_port(instance, index, &controls[index]); + } else if (lilv_port_is_a(p, port, lv2_AudioPort) || + lilv_port_is_a(p, port, lv2_CVPort)) { + if (lilv_port_is_a(p, port, lv2_InputPort)) { + lilv_instance_connect_port(instance, index, in); + } else if (lilv_port_is_a(p, port, lv2_OutputPort)) { + lilv_instance_connect_port(instance, index, out); + } else { + fprintf(stderr, "<%s> port %d neither input nor output, skipping\n", + uri, index); + lilv_instance_free(instance); + free(buf); + free(controls); + return 0.0; + } + } else if (lilv_port_is_a(p, port, atom_AtomPort)) { + lilv_instance_connect_port(instance, index, &seq); + } else { + fprintf(stderr, "<%s> port %d has unknown type, skipping\n", + uri, index); + lilv_instance_free(instance); + free(buf); + free(controls); + return 0.0; + } + } + + lilv_instance_activate(instance); + + struct timespec ts = bench_start(); + for (uint32_t i = 0; i < (sample_count / block_size); ++i) { + lilv_instance_run(instance, block_size); + } + const double elapsed = bench_end(&ts); + + lilv_instance_deactivate(instance); + lilv_instance_free(instance); + + uri_table_destroy(&uri_table); + + if (full_output) { + printf("%d %d ", block_size, sample_count); + } + printf("%lf %s\n", elapsed, uri); + + free(buf); + free(controls); + return elapsed; +} + +int +main(int argc, char** argv) +{ + uint32_t block_size = 512; + uint32_t sample_count = (1 << 19); + + for (int i = 1; i < argc; ++i) { + if (!strcmp(argv[i], "--version")) { + print_version(); + return 0; + } else if (!strcmp(argv[i], "--help")) { + print_usage(); + return 0; + } else if (!strcmp(argv[i], "-f")) { + full_output = true; + } else if (!strcmp(argv[i], "-n") && (i + 1 < argc)) { + sample_count = atoi(argv[++i]); + } else if (!strcmp(argv[i], "-b") && (i + 1 < argc)) { + block_size = atoi(argv[++i]); + } else { + print_usage(); + return 1; + } + } + + LilvWorld* world = lilv_world_new(); + lilv_world_load_all(world); + + atom_AtomPort = lilv_new_uri(world, LV2_ATOM__AtomPort); + atom_Sequence = lilv_new_uri(world, LV2_ATOM__Sequence); + lv2_AudioPort = lilv_new_uri(world, LV2_CORE__AudioPort); + lv2_CVPort = lilv_new_uri(world, LV2_CORE__CVPort); + lv2_ControlPort = lilv_new_uri(world, LV2_CORE__ControlPort); + lv2_InputPort = lilv_new_uri(world, LV2_CORE__InputPort); + lv2_OutputPort = lilv_new_uri(world, LV2_CORE__OutputPort); + urid_map = lilv_new_uri(world, LV2_URID__map); + + if (full_output) { + printf("# Block Samples Time Plugin\n"); + } + + const LilvPlugins* plugins = lilv_world_get_all_plugins(world); + LILV_FOREACH(plugins, i, plugins) { + bench(lilv_plugins_get(plugins, i), sample_count, block_size); + } + + lilv_node_free(urid_map); + lilv_node_free(lv2_OutputPort); + lilv_node_free(lv2_InputPort); + lilv_node_free(lv2_ControlPort); + lilv_node_free(lv2_CVPort); + lilv_node_free(lv2_AudioPort); + lilv_node_free(atom_Sequence); + lilv_node_free(atom_AtomPort); + + lilv_world_free(world); + + return 0; +} diff --git a/c++/carla-lilv/lilv-0.14.2/utils/lv2info.c b/c++/carla-lilv/lilv-0.14.4/utils/lv2info.c similarity index 96% rename from c++/carla-lilv/lilv-0.14.2/utils/lv2info.c rename to c++/carla-lilv/lilv-0.14.4/utils/lv2info.c index 101f9dc..3dc7a09 100644 --- a/c++/carla-lilv/lilv-0.14.2/utils/lv2info.c +++ b/c++/carla-lilv/lilv-0.14.4/utils/lv2info.c @@ -41,7 +41,7 @@ LilvNode* preset_class = NULL; LilvNode* designation_pred = NULL; LilvNode* supports_event_pred = NULL; -void +static void print_port(const LilvPlugin* p, uint32_t index, float* mins, @@ -87,10 +87,10 @@ print_port(const LilvPlugin* p, if (points) printf("\n\t\tScale Points:\n"); LILV_FOREACH(scale_points, i, points) { - const LilvScalePoint* p = lilv_scale_points_get(points, i); + const LilvScalePoint* point = lilv_scale_points_get(points, i); printf("\t\t\t%s = \"%s\"\n", - lilv_node_as_string(lilv_scale_point_get_value(p)), - lilv_node_as_string(lilv_scale_point_get_label(p))); + lilv_node_as_string(lilv_scale_point_get_value(point)), + lilv_node_as_string(lilv_scale_point_get_label(point))); } lilv_scale_points_free(points); @@ -140,7 +140,7 @@ print_port(const LilvPlugin* p, lilv_nodes_free(properties); } -void +static void print_plugin(LilvWorld* world, const LilvPlugin* p) { @@ -204,9 +204,9 @@ print_plugin(LilvWorld* world, const char* binary = lilv_node_as_uri(lilv_ui_get_binary_uri(ui)); const LilvNodes* types = lilv_ui_get_classes(ui); - LILV_FOREACH(nodes, i, types) { + LILV_FOREACH(nodes, t, types) { printf("\t\t\tClass: %s\n", - lilv_node_as_uri(lilv_nodes_get(types, i))); + lilv_node_as_uri(lilv_nodes_get(types, t))); } if (binary) @@ -318,7 +318,7 @@ print_plugin(LilvWorld* world, free(defaults); } -void +static void print_version(void) { printf( @@ -329,7 +329,7 @@ print_version(void) "There is NO WARRANTY, to the extent permitted by law.\n"); } -void +static void print_usage(void) { printf( @@ -379,6 +379,13 @@ main(int argc, char** argv) LilvWorld* world = lilv_world_new(); lilv_world_load_all(world); + LilvNode* uri = lilv_new_uri(world, plugin_uri); + if (!uri) { + fprintf(stderr, "Invalid plugin URI\n"); + lilv_world_free(world); + return 1; + } + applies_to_pred = lilv_new_uri(world, LV2_CORE__appliesTo); control_class = lilv_new_uri(world, LILV_URI_CONTROL_PORT); event_class = lilv_new_uri(world, LILV_URI_EVENT_PORT); @@ -389,7 +396,6 @@ main(int argc, char** argv) supports_event_pred = lilv_new_uri(world, LV2_EVENT__supportsEvent); const LilvPlugins* plugins = lilv_world_get_all_plugins(world); - LilvNode* uri = lilv_new_uri(world, plugin_uri); const LilvPlugin* p = lilv_plugins_get_by_uri(plugins, uri); if (p && plugin_file) { diff --git a/c++/carla-lilv/lilv-0.14.2/utils/lv2ls.c b/c++/carla-lilv/lilv-0.14.4/utils/lv2ls.c similarity index 98% rename from c++/carla-lilv/lilv-0.14.2/utils/lv2ls.c rename to c++/carla-lilv/lilv-0.14.4/utils/lv2ls.c index f77cc28..6f898d5 100644 --- a/c++/carla-lilv/lilv-0.14.2/utils/lv2ls.c +++ b/c++/carla-lilv/lilv-0.14.4/utils/lv2ls.c @@ -21,7 +21,7 @@ #include "lilv_config.h" -void +static void list_plugins(const LilvPlugins* list, bool show_names) { LILV_FOREACH(plugins, i, list) { @@ -36,7 +36,7 @@ list_plugins(const LilvPlugins* list, bool show_names) } } -void +static void print_version(void) { printf( @@ -47,7 +47,7 @@ print_version(void) "There is NO WARRANTY, to the extent permitted by law.\n"); } -void +static void print_usage(void) { printf("Usage: lv2ls [OPTION]...\n"); diff --git a/c++/carla-lilv/lilv-0.14.4/utils/uri_table.h b/c++/carla-lilv/lilv-0.14.4/utils/uri_table.h new file mode 100644 index 0000000..6a27c61 --- /dev/null +++ b/c++/carla-lilv/lilv-0.14.4/utils/uri_table.h @@ -0,0 +1,73 @@ +/* + Copyright 2011-2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file uri_table.h A toy URI map/unmap implementation. + + This file contains function definitions and must only be included once. +*/ + +#ifndef URI_TABLE_H +#define URI_TABLE_H + +typedef struct { + char** uris; + size_t n_uris; +} URITable; + +static void +uri_table_init(URITable* table) +{ + table->uris = NULL; + table->n_uris = 0; +} + +static void +uri_table_destroy(URITable* table) +{ + free(table->uris); +} + +static LV2_URID +uri_table_map(LV2_URID_Map_Handle handle, + const char* uri) +{ + URITable* table = (URITable*)handle; + for (size_t i = 0; i < table->n_uris; ++i) { + if (!strcmp(table->uris[i], uri)) { + return i + 1; + } + } + + const size_t len = strlen(uri); + table->uris = (char**)realloc(table->uris, ++table->n_uris * sizeof(char*)); + table->uris[table->n_uris - 1] = malloc(len + 1); + memcpy(table->uris[table->n_uris - 1], uri, len + 1); + return table->n_uris; +} + +static const char* +uri_table_unmap(LV2_URID_Map_Handle handle, + LV2_URID urid) +{ + URITable* table = (URITable*)handle; + if (urid > 0 && urid <= table->n_uris) { + return table->uris[urid - 1]; + } + return NULL; +} + +#endif /* URI_TABLE_H */ diff --git a/c++/carla-lilv/lilv-0.14.4/waf b/c++/carla-lilv/lilv-0.14.4/waf new file mode 100755 index 0000000000000000000000000000000000000000..3088b02b08b876672d8dfb2aecec7139056451ff GIT binary patch literal 72589 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 literal 0 HcmV?d00001 diff --git a/c++/carla-lilv/lilv-0.14.2/wscript b/c++/carla-lilv/lilv-0.14.4/wscript similarity index 66% rename from c++/carla-lilv/lilv-0.14.2/wscript rename to c++/carla-lilv/lilv-0.14.4/wscript index ad1fa1b..46f298b 100644 --- a/c++/carla-lilv/lilv-0.14.2/wscript +++ b/c++/carla-lilv/lilv-0.14.4/wscript @@ -5,10 +5,9 @@ import subprocess from waflib.extras import autowaf as autowaf import waflib.Options as Options -import waflib.Logs as Logs # Version of this package (even if built as a child) -LILV_VERSION = '0.14.2' +LILV_VERSION = '0.14.4' LILV_MAJOR_VERSION = '0' # Library version (UNIX style major, minor, micro) @@ -31,50 +30,54 @@ def options(opt): opt.load('compiler_cxx') opt.load('python') autowaf.set_options(opt) - opt.add_option('--no-utils', action='store_true', default=False, dest='no_utils', - help="Do not build command line utilities") - opt.add_option('--bindings', action='store_true', default=False, dest='bindings', - help="Build python bindings") - opt.add_option('--dyn-manifest', action='store_true', default=False, - dest='dyn_manifest', - help="Build support for dynamic manifests") - opt.add_option('--test', action='store_true', default=False, dest='build_tests', - help="Build unit tests") - opt.add_option('--no-bash-completion', action='store_true', default=False, + opt.add_option('--no-utils', action='store_true', dest='no_utils', + help='Do not build command line utilities') + opt.add_option('--bindings', action='store_true', dest='bindings', + help='Build python bindings') + opt.add_option('--dyn-manifest', action='store_true', dest='dyn_manifest', + help='Build support for dynamic manifests') + opt.add_option('--test', action='store_true', dest='build_tests', + help='Build unit tests') + opt.add_option('--no-bash-completion', action='store_true', dest='no_bash_completion', - help="Don't install bash completion script in CONFIGDIR") + help='Do not install bash completion script in CONFIGDIR') + opt.add_option('--static', action='store_true', dest='static', + help='Build static library') + opt.add_option('--no-shared', action='store_true', dest='no_shared', + help='Do not build shared library') + opt.add_option('--static-progs', action='store_true', dest='static_progs', + help='Build programs as static binaries') opt.add_option('--default-lv2-path', type='string', default='', dest='default_lv2_path', - help="Default LV2 path to use if $LV2_PATH is unset (globs and ~ supported)") - opt.add_option('--static', action='store_true', default=False, dest='static', - help="Build static library") + help='Default LV2 path to use if LV2_PATH is unset') def configure(conf): conf.load('compiler_c') - conf.load('compiler_cxx') - conf.load('python') if Options.options.bindings: try: - conf.load('swig python') + conf.load('swig') + conf.load('python') + conf.load('compiler_cxx') conf.check_python_headers() autowaf.define(conf, 'LILV_PYTHON', 1); except: pass - conf.line_just = 51 autowaf.configure(conf) + autowaf.set_c99_mode(conf) autowaf.display_header('Lilv Configuration') - if conf.env['MSVC_COMPILER']: - conf.env.append_unique('CFLAGS', ['-TP', '-MD']) - else: - conf.env.append_unique('CFLAGS', '-std=c99') + conf.env.BASH_COMPLETION = not Options.options.no_bash_completion + conf.env.BUILD_TESTS = Options.options.build_tests + conf.env.BUILD_UTILS = not Options.options.no_utils + conf.env.BUILD_SHARED = not Options.options.no_shared + conf.env.STATIC_PROGS = Options.options.static_progs + conf.env.BUILD_STATIC = (Options.options.static or + Options.options.static_progs) - conf.env['BUILD_TESTS'] = Options.options.build_tests - conf.env['BUILD_UTILS'] = not Options.options.no_utils - conf.env['BUILD_STATIC'] = Options.options.static - conf.env['BASH_COMPLETION'] = not Options.options.no_bash_completion + if not conf.env.BUILD_SHARED and not conf.env.BUILD_STATIC: + conf.fatal('Neither a shared nor a static build requested') autowaf.check_pkg(conf, 'lv2', uselib_store='LV2', atleast_version='1.0.0', mandatory=True) @@ -92,7 +95,7 @@ def configure(conf): defines += ['_DARWIN_C_SOURCE'] # Check for gcov library (for test coverage) - if conf.env['BUILD_TESTS']: + if conf.env.BUILD_TESTS: conf.check_cc(lib='gcov', define_name='HAVE_GCOV', mandatory=False) @@ -109,6 +112,14 @@ def configure(conf): define_name='HAVE_FILENO', mandatory=False) + conf.check_cc(function_name='clock_gettime', + header_name=['sys/time.h','time.h'], + defines=['_POSIX_C_SOURCE=199309L'], + define_name='HAVE_CLOCK_GETTIME', + uselib_store='CLOCK_GETTIME', + lib=['rt'], + mandatory=False) + autowaf.define(conf, 'LILV_VERSION', LILV_VERSION) if Options.options.dyn_manifest: autowaf.define(conf, 'LILV_DYN_MANIFEST', 1) @@ -138,30 +149,47 @@ def configure(conf): lv2_path = lilv_path_sep.join(['%APPDATA%\\\\LV2', '%COMMONPROGRAMFILES%\\\\LV2']) else: - libdirname = os.path.basename(conf.env['LIBDIR']) + libdirname = os.path.basename(conf.env.LIBDIR) lv2_path = lilv_path_sep.join(['~/.lv2', '/usr/%s/lv2' % libdirname, '/usr/local/%s/lv2' % libdirname]) autowaf.define(conf, 'LILV_DEFAULT_LV2_PATH', lv2_path) - conf.env['LIB_LILV'] = ['lilv-%s' % LILV_MAJOR_VERSION] + conf.env.LIB_LILV = ['lilv-%s' % LILV_MAJOR_VERSION] conf.write_config_header('lilv_config.h', remove=False) - autowaf.display_msg(conf, "Default LV2_PATH", - conf.env['LILV_DEFAULT_LV2_PATH']) - autowaf.display_msg(conf, "Utilities", - bool(conf.env['BUILD_UTILS'])) - autowaf.display_msg(conf, "Unit tests", - bool(conf.env['BUILD_TESTS'])) - autowaf.display_msg(conf, "Dynamic manifest support", - bool(conf.env['LILV_DYN_MANIFEST'])) - autowaf.display_msg(conf, "Python bindings", + autowaf.display_msg(conf, 'Default LV2_PATH', + conf.env.LILV_DEFAULT_LV2_PATH) + autowaf.display_msg(conf, 'Utilities', + bool(conf.env.BUILD_UTILS)) + autowaf.display_msg(conf, 'Unit tests', + bool(conf.env.BUILD_TESTS)) + autowaf.display_msg(conf, 'Dynamic manifest support', + bool(conf.env.LILV_DYN_MANIFEST)) + autowaf.display_msg(conf, 'Python bindings', conf.is_defined('LILV_PYTHON')) conf.undefine('LILV_DEFAULT_LV2_PATH') # Cmd line errors with VC++ print('') +def build_util(bld, name, defines): + obj = bld(features = 'c cprogram', + source = name + '.c', + includes = ['.', './src', './utils'], + use = 'liblilv', + target = name, + defines = defines, + install_path = '${BINDIR}') + if not bld.env.BUILD_SHARED or bld.env.STATIC_PROGS: + obj.use = 'liblilv_static' + if bld.env.STATIC_PROGS: + if not bld.env.MSVC_COMPILER: + obj.lib = ['m'] + obj.env.SHLIB_MARKER = obj.env.STLIB_MARKER + obj.linkflags = ['-static', '-Wl,--start-group'] + return obj + def build(bld): # C/C++ Headers includedir = '${INCLUDEDIR}/lilv-%s/lilv' % LILV_MAJOR_VERSION @@ -195,29 +223,29 @@ def build(bld): defines = [] if sys.platform == 'win32': lib = [] - if bld.env['MSVC_COMPILER']: + if bld.env.MSVC_COMPILER: libflags = [] defines = ['snprintf=_snprintf'] elif sys.platform.find('bsd') > 0: lib = [] # Shared Library - obj = bld(features = 'c cshlib', - export_includes = ['.'], - source = lib_source, - includes = ['.', './src'], - name = 'liblilv', - target = 'lilv-%s' % LILV_MAJOR_VERSION, - vnum = LILV_LIB_VERSION, - install_path = '${LIBDIR}', - defines = defines, - cflags = libflags + [ '-DLILV_SHARED', - '-DLILV_INTERNAL' ], - lib = lib) - autowaf.use_lib(bld, obj, 'SORD SRATOM LV2') + if bld.env.BUILD_SHARED: + obj = bld(features = 'c cshlib', + export_includes = ['.'], + source = lib_source, + includes = ['.', './src'], + name = 'liblilv', + target = 'lilv-%s' % LILV_MAJOR_VERSION, + vnum = LILV_LIB_VERSION, + install_path = '${LIBDIR}', + defines = ['LILV_SHARED', 'LILV_INTERNAL'], + cflags = libflags, + lib = lib) + autowaf.use_lib(bld, obj, 'SORD SRATOM LV2') # Static library - if bld.env['BUILD_STATIC']: + if bld.env.BUILD_STATIC: obj = bld(features = 'c cstlib', export_includes = ['.'], source = lib_source, @@ -226,11 +254,10 @@ def build(bld): target = 'lilv-%s' % LILV_MAJOR_VERSION, vnum = LILV_LIB_VERSION, install_path = '${LIBDIR}', - defines = defines, - cflags = [ '-DLILV_INTERNAL' ]) + defines = defines + ['LILV_INTERNAL']) autowaf.use_lib(bld, obj, 'SORD SRATOM LV2') - if bld.env['BUILD_TESTS']: + if bld.env.BUILD_TESTS: test_libs = lib test_cflags = [''] if bld.is_defined('HAVE_GCOV'): @@ -239,10 +266,10 @@ def build(bld): # Test plugin library penv = bld.env.derive() - shlib_pattern = penv['cshlib_PATTERN'] + shlib_pattern = penv.cshlib_PATTERN if shlib_pattern.startswith('lib'): shlib_pattern = shlib_pattern[3:] - penv['cshlib_PATTERN'] = shlib_pattern + penv.cshlib_PATTERN = shlib_pattern shlib_ext = shlib_pattern[shlib_pattern.rfind('.'):] obj = bld(features = 'c cshlib', @@ -271,8 +298,8 @@ def build(bld): name = 'liblilv_profiled', target = 'lilv_profiled', install_path = None, - defines = defines, - cflags = test_cflags + ['-DLILV_INTERNAL'], + defines = defines + ['LILV_INTERNAL'], + cflags = test_cflags, lib = test_libs) autowaf.use_lib(bld, obj, 'SORD SRATOM LV2') @@ -292,20 +319,20 @@ def build(bld): autowaf.use_lib(bld, obj, 'SORD SRATOM LV2') # Utilities - if bld.env['BUILD_UTILS']: + if bld.env.BUILD_UTILS: utils = ''' + utils/lilv-bench utils/lv2info utils/lv2ls - utils/lilv-bench ''' for i in utils.split(): - obj = bld(features = 'c cprogram', - source = i + '.c', - includes = ['.', './src', './utils'], - use = 'liblilv', - target = i, - defines = defines, - install_path = '${BINDIR}') + build_util(bld, i, defines) + + # lv2bench (less portable than other utilities) + if bld.is_defined('HAVE_CLOCK_GETTIME'): + obj = build_util(bld, 'utils/lv2bench', defines) + if not bld.env.MSVC_COMPILER: + obj.lib = ['rt'] # Documentation autowaf.build_dox(bld, 'LILV', LILV_VERSION, top, out) @@ -314,7 +341,7 @@ def build(bld): bld.install_files('${MANDIR}/man1', bld.path.ant_glob('doc/*.1')) # Bash completion - if bld.env['BASH_COMPLETION']: + if bld.env.BASH_COMPLETION: bld.install_as( '${SYSCONFDIR}/bash_completion.d/lilv', 'utils/lilv.bash_completion') @@ -331,33 +358,15 @@ def build(bld): bld.install_files('${PYTHONDIR}', 'bindings/lilv.py') bld.add_post_fun(autowaf.run_ldconfig) - if bld.env['DOCS']: + if bld.env.DOCS: bld.add_post_fun(fix_docs) -def build_dir(ctx, subdir): - if autowaf.is_child(): - return os.path.join('build', APPNAME, subdir) - else: - return os.path.join('build', subdir) - def fix_docs(ctx): - try: - top = os.getcwd() - os.chdir(build_dir(ctx, 'doc/html')) - os.system("sed -i 's/LILV_API //' group__lilv.html") - os.system("sed -i 's/LILV_DEPRECATED //' group__lilv.html") - os.system("sed -i 's/href=\"doc\/style.css\"/href=\"style.css\"/' group__lilv.html") - os.remove('index.html') - os.symlink('group__lilv.html', 'index.html') - os.chdir(top) - os.chdir(build_dir(ctx, 'doc/man/man3')) - os.system("sed -i 's/LILV_API //' lilv.3") - os.chdir(top) - except: - Logs.error("Failed to fix up %s documentation" % APPNAME) + if ctx.cmd == 'build': + autowaf.make_simple_dox(APPNAME) def upload_docs(ctx): - os.system("rsync -ravz --delete -e ssh build/doc/html/ drobilla@drobilla.net:~/drobilla.net/docs/lilv/") + os.system('rsync -ravz --delete -e ssh build/doc/html/ drobilla@drobilla.net:~/drobilla.net/docs/lilv/') def test(ctx): autowaf.pre_test(ctx, APPNAME) diff --git a/c++/carla-lilv/lilv.c b/c++/carla-lilv/lilv.c index 19abf0c..b2a8196 100644 --- a/c++/carla-lilv/lilv.c +++ b/c++/carla-lilv/lilv.c @@ -15,16 +15,17 @@ * For a full copy of the GNU General Public License see the COPYING file */ -#include "lilv-0.14.2/src/collections.c" -#include "lilv-0.14.2/src/instance.c" -#include "lilv-0.14.2/src/lib.c" -#include "lilv-0.14.2/src/node.c" -#include "lilv-0.14.2/src/plugin.c" -#include "lilv-0.14.2/src/pluginclass.c" -#include "lilv-0.14.2/src/port.c" -#include "lilv-0.14.2/src/query.c" -#include "lilv-0.14.2/src/scalepoint.c" -#include "lilv-0.14.2/src/state.c" -#include "lilv-0.14.2/src/ui.c" -#include "lilv-0.14.2/src/util.c" -#include "lilv-0.14.2/src/world.c" +#include "src/collections.c" +#include "src/instance.c" +#include "src/lib.c" +#include "src/node.c" +#include "src/plugin.c" +#include "src/pluginclass.c" +#include "src/port.c" +#include "src/query.c" +#include "src/scalepoint.c" +#include "src/state.c" +#include "src/ui.c" +#include "src/util.c" +#include "src/world.c" +#include "src/zix/tree.c" diff --git a/c++/carla-lilv/serd-0.14.0/INSTALL b/c++/carla-lilv/serd-0.14.0/INSTALL deleted file mode 100644 index f6e4dd4..0000000 --- a/c++/carla-lilv/serd-0.14.0/INSTALL +++ /dev/null @@ -1,35 +0,0 @@ -This software requires only Python to build. - -Like an auto* project, building has three phases: - - -* Configure: ./waf configure [OPTIONS] - - Example: - ./waf configure --prefix=/some/where --debug --strict - - If --debug is not given, the flags from the environment variables - CFLAGS and CXXFLAGS will be used. - - The default prefix is /usr/local - - -* Build: ./waf [OPTIONS] - - Example: - ./waf -j4 - - -* Install: ./waf install [OPTIONS] - - The environment variable DESTDIR can be used to add any prefix to - the install paths (useful for packaging). Example: - - DESTDIR=/home/drobilla/packages ./waf install - - -*** IMPORTANT: You must use absolute paths everywhere - - -Run './waf --help' for detailed option information. - diff --git a/c++/carla-lilv/serd-0.14.0/doc/layout.xml b/c++/carla-lilv/serd-0.14.0/doc/layout.xml deleted file mode 100644 index 83a1153..0000000 --- a/c++/carla-lilv/serd-0.14.0/doc/layout.xml +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/c++/carla-lilv/serd-0.14.0/waf b/c++/carla-lilv/serd-0.14.0/waf deleted file mode 100755 index 32ae2297eeea7b068ea20d473d75935e11b55a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92192 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⪙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 diff --git a/c++/carla-lilv/serd-0.14.0/AUTHORS b/c++/carla-lilv/serd-0.18.0/AUTHORS similarity index 100% rename from c++/carla-lilv/serd-0.14.0/AUTHORS rename to c++/carla-lilv/serd-0.18.0/AUTHORS diff --git a/c++/carla-lilv/serd-0.14.0/COPYING b/c++/carla-lilv/serd-0.18.0/COPYING similarity index 100% rename from c++/carla-lilv/serd-0.14.0/COPYING rename to c++/carla-lilv/serd-0.18.0/COPYING diff --git a/c++/carla-lilv/serd-0.18.0/INSTALL b/c++/carla-lilv/serd-0.18.0/INSTALL new file mode 100644 index 0000000..623cddd --- /dev/null +++ b/c++/carla-lilv/serd-0.18.0/INSTALL @@ -0,0 +1,59 @@ +Installation Instructions +========================= + +Basic Installation +------------------ + +Building this software requires only Python. To install with default options: + + ./waf configure + ./waf + ./waf install + +You may need to become root for the install stage, for example: + + sudo ./waf install + +Configuration Options +--------------------- + +All supported options can be viewed using the command: + + ./waf --help + +Most options only need to be passed during the configure stage, for example: + + ./waf configure --prefix=/usr + ./waf + ./waf install + +Compiler Configuration +---------------------- + +Several standard environment variables can be used to control how compilers are +invoked: + + * CC: Path to C compiler + * CFLAGS: C compiler options + * CXX: Path to C++ compiler + * CXXFLAGS: C++ compiler options + * CPPFLAGS: C preprocessor options + * LINKFLAGS: Linker options + +Installation Directories +------------------------ + +The --prefix option (or the PREFIX environment variable) can be used to change +the prefix which all files are installed under. There are also several options +allowing for more fine-tuned control, see the --help output for details. + +Packaging +--------- + +Everything can be installed to a specific root directory by passing a --destdir +option to the install stage (or setting the DESTDIR environment variable), +which adds a prefix to all install paths. For example: + + ./waf configure --prefix=/usr + ./waf + ./waf install --destdir=/tmp/package diff --git a/c++/carla-lilv/serd-0.14.0/NEWS b/c++/carla-lilv/serd-0.18.0/NEWS similarity index 80% rename from c++/carla-lilv/serd-0.14.0/NEWS rename to c++/carla-lilv/serd-0.18.0/NEWS index a97bfab..d16d511 100644 --- a/c++/carla-lilv/serd-0.14.0/NEWS +++ b/c++/carla-lilv/serd-0.18.0/NEWS @@ -1,3 +1,21 @@ +serd (0.18.0) stable; + + * Support digits at start of local names as per new Turtle grammar + * Add incremental read interface suitable for reading from infinite streams + * Add -e option to serdi to use incremental reading + * Add error callback to reader and writer for custom error reporting + * Add -q option to serdi to suppress all non-data output, e.g. errors + * Reset indent when finishing a write + * Report write size correctly when invalid UTF-8 is encountered and a + replacement character is written + * Strip down API documentation to a single clean page + * Fix various hyper-strict warnings + * Do not require a C++ compiler to build + * Add option to build utilities as static binaries + * Upgrade to waf 1.7.2 + + -- David Robillard Thu, 23 Aug 2012 00:18:34 -0400 + serd (0.14.0) stable; * Use path variables in pkgconfig files diff --git a/c++/carla-lilv/serd-0.14.0/PACKAGING b/c++/carla-lilv/serd-0.18.0/PACKAGING similarity index 100% rename from c++/carla-lilv/serd-0.14.0/PACKAGING rename to c++/carla-lilv/serd-0.18.0/PACKAGING diff --git a/c++/carla-lilv/serd-0.14.0/README b/c++/carla-lilv/serd-0.18.0/README similarity index 100% rename from c++/carla-lilv/serd-0.14.0/README rename to c++/carla-lilv/serd-0.18.0/README diff --git a/c++/carla-lilv/serd-0.14.0/doc/reference.doxygen.in b/c++/carla-lilv/serd-0.18.0/doc/reference.doxygen.in similarity index 73% rename from c++/carla-lilv/serd-0.14.0/doc/reference.doxygen.in rename to c++/carla-lilv/serd-0.18.0/doc/reference.doxygen.in index 1f260f0..8ff954a 100644 --- a/c++/carla-lilv/serd-0.14.0/doc/reference.doxygen.in +++ b/c++/carla-lilv/serd-0.18.0/doc/reference.doxygen.in @@ -1,14 +1,14 @@ -# Doxyfile 1.6.1 +# Doxyfile 1.8.1.1 # This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project +# doxygen (www.doxygen.org) for a project. # -# All text after a hash (#) is considered a comment and will be ignored +# All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") +# Values that contain spaces should be placed between quotes (" "). #--------------------------------------------------------------------------- # Project related configuration options @@ -22,8 +22,9 @@ DOXYFILE_ENCODING = UTF-8 -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. PROJECT_NAME = Serd @@ -33,6 +34,19 @@ PROJECT_NAME = Serd PROJECT_NUMBER = @SERD_VERSION@ +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location @@ -57,7 +71,7 @@ CREATE_SUBDIRS = NO # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English @@ -126,7 +140,7 @@ STRIP_FROM_PATH = STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems +# (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO @@ -181,6 +195,13 @@ TAB_SIZE = 4 ALIASES = +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list @@ -207,22 +228,32 @@ OPTIMIZE_FOR_FORTRAN = NO OPTIMIZE_OUTPUT_VHDL = NO -# Doxygen selects the parser to use depending on the extension of the files it parses. -# With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this tag. -# The format is ext=language, where ext is a file extension, and language is one of -# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, -# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat -# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), -# use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration +# func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO @@ -240,7 +271,7 @@ SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) -# will make doxygen to replace the get and set methods by a property in the +# will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. @@ -262,6 +293,22 @@ DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = YES + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = YES + # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct @@ -278,16 +325,27 @@ TYPEDEF_HIDES_STRUCT = YES # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penality. +# causing a significant performance penalty. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will rougly double the +# a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols +# corresponding to a cache size of 2^16 = 65536 symbols. SYMBOL_CACHE_SIZE = 0 +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- @@ -304,6 +362,10 @@ EXTRACT_ALL = YES EXTRACT_PRIVATE = NO +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. @@ -326,7 +388,7 @@ EXTRACT_LOCAL_METHODS = NO # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default -# anonymous namespace are hidden. +# anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = NO @@ -386,6 +448,12 @@ HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. @@ -405,7 +473,13 @@ SORT_MEMBER_DOCS = NO SORT_BRIEF_DOCS = NO -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO @@ -425,6 +499,15 @@ SORT_GROUP_NAMES = NO SORT_BY_SCOPE_NAME = YES +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. @@ -455,10 +538,10 @@ GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in +# the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the +# The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. @@ -470,12 +553,6 @@ MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. @@ -499,15 +576,25 @@ SHOW_NAMESPACES = NO FILE_VERSION_FILTER = -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by -# doxygen. The layout file controls the global structure of the generated output files -# in an output format independent way. The create the layout file that represents -# doxygen's defaults, run doxygen with the -l option. You can optionally specify a -# file name after the option, if omitted DoxygenLayout.xml will be used as the name -# of the layout file. +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = @SERD_SRCDIR@/doc/layout.xml +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. + +CITE_BIB_FILES = + #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- @@ -536,13 +623,13 @@ WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES -# This WARN_NO_PARAMDOC option can be abled to get warnings for +# The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. -WARN_NO_PARAMDOC = NO +WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text @@ -582,8 +669,9 @@ INPUT_ENCODING = UTF-8 # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = @@ -593,14 +681,16 @@ FILE_PATTERNS = RECURSIVE = NO -# The EXCLUDE tag can be used to specify files and/or directories that should +# The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. EXCLUDE = -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO @@ -664,8 +754,8 @@ INPUT_FILTER = # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = @@ -675,6 +765,14 @@ FILTER_PATTERNS = FILTER_SOURCE_FILES = NO +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- @@ -693,7 +791,7 @@ INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. +# fragments. Normal C, C++ and Fortran comments will always remain visible. STRIP_CODE_COMMENTS = YES @@ -729,7 +827,7 @@ USE_HTAGS = NO # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. -VERBATIM_HEADERS = YES +VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index @@ -777,7 +875,14 @@ HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a -# standard header. +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! HTML_HEADER = @@ -792,24 +897,67 @@ HTML_FOOTER = # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! +# style sheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = @SERD_SRCDIR@/doc/style.css + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 160 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. -HTML_STYLESHEET = doc/style.css +HTML_COLORSTYLE_GAMMA = 80 -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. -HTML_ALIGN_MEMBERS = YES +HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). +# page has loaded. HTML_DYNAMIC_SECTIONS = NO +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of +# entries shown in the various tree structured indices initially; the user +# can expand and collapse entries dynamically later on. Doxygen will expand +# the tree to such a level that at most the specified number of entries are +# visible (unless a fully collapsed tree already exceeds this amount). +# So setting the number of entries 1 will produce a full collapsed tree by +# default. 0 is a special value representing an infinite number of entries +# and will result in a full expanded tree by default. + +HTML_INDEX_NUM_ENTRIES = 100 + # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). @@ -818,7 +966,8 @@ HTML_DYNAMIC_SECTIONS = NO # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. GENERATE_DOCSET = NO @@ -836,6 +985,16 @@ DOCSET_FEEDNAME = "Doxygen generated docs" DOCSET_BUNDLE_ID = org.doxygen.Project +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) @@ -880,10 +1039,10 @@ BINARY_TOC = NO TOC_EXPAND = NO -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER -# are set, an additional index file will be generated that can be used as input for -# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated -# HTML documentation. +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO @@ -905,20 +1064,24 @@ QHP_NAMESPACE = QHP_VIRTUAL_FOLDER = doc -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. -# For more information please see +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see -# Qt Help Project / Custom Filters. +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's # filter section matches. -# Qt Help Project / Filter Attributes. +# +# Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = @@ -929,16 +1092,30 @@ QHP_SECT_FILTER_ATTRS = QHG_LOCATION = -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. -DISABLE_INDEX = NO +GENERATE_ECLIPSEHELP = NO -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. -ENUM_VALUES_PER_LINE = 4 +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = YES # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. @@ -947,13 +1124,17 @@ ENUM_VALUES_PER_LINE = 4 # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = NO -# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list. +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. -USE_INLINE_TREES = NO +ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree @@ -961,6 +1142,11 @@ USE_INLINE_TREES = NO TREEVIEW_WIDTH = 250 +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need @@ -969,13 +1155,60 @@ TREEVIEW_WIDTH = 250 FORMULA_FONTSIZE = 10 -# When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) -# there is already a search function so this one should typically -# be disabled. +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. +# However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = NO +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- @@ -993,6 +1226,9 @@ LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. LATEX_CMD_NAME = latex @@ -1009,7 +1245,7 @@ MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and +# by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide @@ -1026,6 +1262,13 @@ EXTRA_PACKAGES = LATEX_HEADER = +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references @@ -1052,10 +1295,19 @@ LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO -# If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- @@ -1087,7 +1339,7 @@ COMPACT_RTF = NO RTF_HYPERLINKS = NO -# Load stylesheet definitions from file. Syntax is similar to doxygen's +# Load style sheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. @@ -1232,7 +1484,7 @@ MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. +# pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES @@ -1262,15 +1514,15 @@ PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES @@ -1278,22 +1530,18 @@ SKIP_FUNCTION_MACROS = YES # Configuration::additions related to external references #--------------------------------------------------------------------------- -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. TAGFILES = @@ -1326,9 +1574,8 @@ PERL_PATH = /usr/bin/perl # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = NO @@ -1354,14 +1601,20 @@ HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO -# By default doxygen will write a font called FreeSans.ttf to the output -# directory and reference it in all dot files that doxygen generates. This -# font does not include all possible unicode characters however, so when you need -# these (or just want a differently looking font) you can specify the font name -# using DOT_FONTNAME. You need need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -# containing the font. +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. DOT_FONTNAME = FreeSans @@ -1370,17 +1623,16 @@ DOT_FONTNAME = FreeSans DOT_FONTSIZE = 10 -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot -# can find it using this tag. +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. +# CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = NO @@ -1402,6 +1654,15 @@ GROUP_GRAPHS = YES UML_LOOK = NO +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. @@ -1438,23 +1699,34 @@ CALL_GRAPH = NO CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. +# will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = NO -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. -DIRECTORY_GRAPH = YES +DIRECTORY_GRAPH = NO # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. @@ -1466,6 +1738,12 @@ DOT_PATH = DOTFILE_DIRS = +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is diff --git a/c++/carla-lilv/serd-0.14.0/doc/serdi.1 b/c++/carla-lilv/serd-0.18.0/doc/serdi.1 similarity index 73% rename from c++/carla-lilv/serd-0.14.0/doc/serdi.1 rename to c++/carla-lilv/serd-0.18.0/doc/serdi.1 index 23d77ac..45001c9 100644 --- a/c++/carla-lilv/serd-0.14.0/doc/serdi.1 +++ b/c++/carla-lilv/serd-0.18.0/doc/serdi.1 @@ -1,4 +1,4 @@ -.TH SERDI 1 "17 Jan 2012" +.TH SERDI 1 "08 May 2012" .SH NAME .B serdi \- Read and write RDF syntax @@ -16,6 +16,14 @@ Fast bulk output for large serialisations. \fB\-c PREFIX\fR Chop PREFIX from matching blank node IDs. +.TP +\fB\-e\fR +Eat input one character at a time, rather than a page at a time which is the +default. This is useful when reading from a pipe since output will be +generated immediately as input arrives, rather than waiting until an entire +page of input has arrived. With this option serdi uses one page less memory, +but will likely be significantly slower. + .TP \fB\-f\fR Keep full URIs in input (don't qualify). diff --git a/c++/carla-lilv/lilv-0.14.2/doc/style.css b/c++/carla-lilv/serd-0.18.0/doc/style.css similarity index 95% rename from c++/carla-lilv/lilv-0.14.2/doc/style.css rename to c++/carla-lilv/serd-0.18.0/doc/style.css index 5cdf97b..4c62b46 100644 --- a/c++/carla-lilv/lilv-0.14.2/doc/style.css +++ b/c++/carla-lilv/serd-0.18.0/doc/style.css @@ -1,24 +1,24 @@ body { - font-size: 100%; + font-size: medium; font-family: sans-serif; } #top { background-color: #F3F3F3; margin: 0; - padding: 0; + padding: 0; border-bottom: 1px solid #DDD; - margin-bottom: 1ex; - font-size: 180%; - font-weight: bold; + margin-bottom: 1ex; + font-size: xx-large; + font-weight: bold; } div.header { - display: none; + display: none; } .tabs { - display: none; + display: none; } h1 h2 h3 h4 h5 h6 { @@ -113,33 +113,24 @@ div.navtab { /* @group Link Styling */ a { - color: #3D578C; + color: #3D8C57; text-decoration: none; } .contents a:visited { - color: #4665A2; + color: #50755E; } a:hover { text-decoration: underline; } -a.qindex { -} - a.qindexHL { background-color: #9CAFD4; color: #FFF; border: 1px double #869DCA; } -a.el { -} - -a.elRef { -} - a.code { color: #4665A2; } @@ -245,7 +236,7 @@ div.center img { address.footer { text-align: right; - padding-right: 12px; + padding: 0 0.25em 0.25em 0; } img.footer { @@ -324,7 +315,7 @@ hr.footer { /* @group Member Descriptions */ table.memberdecls { border-spacing: 0; - font-size: 94%; + font-size: small; } .mdescLeft,.mdescRight,.memItemLeft,.memItemRight,.memTemplItemLeft,.memTemplItemRight,.memTemplParams { @@ -338,7 +329,7 @@ table.memberdecls { } .memItemLeft,.memItemRight,.memTemplParams { - border-top: 1px solid #EEE; + border-top: 1px solid #DDD; } .memItemLeft,.memTemplItemLeft { @@ -372,6 +363,7 @@ table.memberdecls { .memitem { padding: 0; margin: 1ex 0 2ex 0; + border: 1px solid #CCC; } .memname { @@ -380,9 +372,8 @@ table.memberdecls { } .memproto { - border-top: 1px solid #DDD; + border-bottom: 1px solid #DDD; padding: 0.5ex; - color: #253555; font-weight: bold; background-color: #F3F3F3; } @@ -567,6 +558,6 @@ div.header { div.headertitle { padding: 5px 5px 5px 10px; - font-size: 180%; - font-weight: bold; + font-size: 180%; + font-weight: bold; } diff --git a/c++/carla-lilv/serd-0.14.0/serd.pc.in b/c++/carla-lilv/serd-0.18.0/serd.pc.in similarity index 100% rename from c++/carla-lilv/serd-0.14.0/serd.pc.in rename to c++/carla-lilv/serd-0.18.0/serd.pc.in diff --git a/c++/carla-lilv/serd-0.14.0/serd/serd.h b/c++/carla-lilv/serd-0.18.0/serd/serd.h similarity index 89% rename from c++/carla-lilv/serd-0.14.0/serd/serd.h rename to c++/carla-lilv/serd-0.18.0/serd/serd.h index 807664d..1cd54df 100644 --- a/c++/carla-lilv/serd-0.14.0/serd/serd.h +++ b/c++/carla-lilv/serd-0.18.0/serd/serd.h @@ -21,6 +21,7 @@ #ifndef SERD_SERD_H #define SERD_SERD_H +#include #include #include #include @@ -89,7 +90,10 @@ typedef enum { SERD_ERR_UNKNOWN, /**< Unknown error */ SERD_ERR_BAD_SYNTAX, /**< Invalid syntax */ SERD_ERR_BAD_ARG, /**< Invalid argument */ - SERD_ERR_NOT_FOUND /**< Not found */ + SERD_ERR_NOT_FOUND, /**< Not found */ + SERD_ERR_ID_CLASH, /**< Encountered clashing blank node IDs */ + SERD_ERR_BAD_CURIE, /**< Invalid CURIE (e.g. prefix does not exist) */ + SERD_ERR_INTERNAL /**< Unexpected internal error (should not happen) */ } SerdStatus; /** @@ -215,6 +219,18 @@ typedef struct { size_t len; /**< Length of chunk in bytes */ } SerdChunk; +/** + An error description. +*/ +typedef struct { + SerdStatus status; /**< Error code */ + const uint8_t* filename; /**< File where error was encountered, or NULL */ + unsigned line; /**< Line where error was encountered, or 0 */ + unsigned col; /**< Column where error was encountered */ + const char* fmt; /**< Message format string (printf style) */ + va_list* args; /**< Arguments for fmt */ +} SerdError; + /** A parsed URI. @@ -512,6 +528,15 @@ serd_node_free(SerdNode* node); @{ */ +/** + Sink (callback) for errors. + + @param handle Handle for user data. + @param error Error description. +*/ +typedef SerdStatus (*SerdErrorSink)(void* handle, + const SerdError* error); + /** Sink (callback) for base URI changes. @@ -663,6 +688,18 @@ serd_reader_new(SerdSyntax syntax, SerdStatementSink statement_sink, SerdEndSink end_sink); +/** + Set a function to be called when errors occur during reading. + + The @p error_sink will be called with @p handle as its first argument. If + no error function is set, errors are printed to stderr in GCC style. +*/ +SERD_API +void +serd_reader_set_error_sink(SerdReader* reader, + SerdErrorSink error_sink, + void* handle); + /** Return the @c handle passed to @ref serd_reader_new. */ @@ -704,6 +741,40 @@ SerdStatus serd_reader_read_file(SerdReader* reader, const uint8_t* uri); +/** + Start an incremental read from a file handle. + + Iff @p bulk is true, @p file will be read a page at a time. This is more + efficient, but uses a page of memory and means that an entire page of input + must be ready before any callbacks will fire. To react as soon as input + arrives, set @p bulk to false. +*/ +SERD_API +SerdStatus +serd_reader_start_stream(SerdReader* me, + FILE* file, + const uint8_t* name, + bool bulk); + +/** + Read a single "chunk" of data during an incremental read. + + This function will read a single top level description, and return. This + may be a directive, statement, or several statements; essentially it reads + until a '.' is encountered. This is particularly useful for reading + directly from a pipe or socket. +*/ +SERD_API +SerdStatus +serd_reader_read_chunk(SerdReader* me); + +/** + Finish an incremental read from a file handle. +*/ +SERD_API +SerdStatus +serd_reader_end_stream(SerdReader* me); + /** Read @c file. */ @@ -791,6 +862,18 @@ SERD_API uint8_t* serd_chunk_sink_finish(SerdChunk* stream); +/** + Set a function to be called when errors occur during writing. + + The @p error_sink will be called with @p handle as its first argument. If + no error function is set, errors are printed to stderr. +*/ +SERD_API +void +serd_writer_set_error_sink(SerdWriter* writer, + SerdErrorSink error_sink, + void* handle); + /** Set a prefix to be removed from matching blank node identifiers. */ diff --git a/c++/carla-lilv/serd-0.14.0/src/env.c b/c++/carla-lilv/serd-0.18.0/src/env.c similarity index 96% rename from c++/carla-lilv/serd-0.14.0/src/env.c rename to c++/carla-lilv/serd-0.18.0/src/env.c index ecefb00..c37b6b6 100644 --- a/c++/carla-lilv/serd-0.14.0/src/env.c +++ b/c++/carla-lilv/serd-0.18.0/src/env.c @@ -217,7 +217,7 @@ serd_env_expand(const SerdEnv* env, const uint8_t* const colon = (const uint8_t*)memchr( qname->buf, ':', qname->n_bytes + 1); if (!colon) { - return SERD_ERR_BAD_ARG; // Illegal qname + return SERD_ERR_BAD_ARG; // Invalid qname } const size_t name_len = colon - qname->buf; @@ -245,10 +245,9 @@ serd_env_expand_node(const SerdEnv* env, return SERD_NODE_NULL; } const size_t len = prefix.len + suffix.len; // FIXME: UTF-8? - SerdNode ret = { NULL, len, len, 0, SERD_URI }; - ret.buf = (uint8_t*)malloc(ret.n_bytes + 1); - snprintf((char*)ret.buf, ret.n_bytes + 1, - "%s%s", prefix.buf, suffix.buf); + uint8_t* buf = (uint8_t*)malloc(len + 1); + SerdNode ret = { buf, len, len, 0, SERD_URI }; + snprintf((char*)buf, ret.n_bytes + 1, "%s%s", prefix.buf, suffix.buf); return ret; } case SERD_URI: { diff --git a/c++/carla-lilv/serd-0.14.0/src/node.c b/c++/carla-lilv/serd-0.18.0/src/node.c similarity index 96% rename from c++/carla-lilv/serd-0.14.0/src/node.c rename to c++/carla-lilv/serd-0.18.0/src/node.c index 575b2ff..7f6e986 100644 --- a/c++/carla-lilv/serd-0.14.0/src/node.c +++ b/c++/carla-lilv/serd-0.18.0/src/node.c @@ -165,9 +165,9 @@ serd_node_new_file_uri(const uint8_t* path, } else if (!escape || is_uri_path_char(path[i])) { serd_chunk_sink(path + i, 1, &chunk); } else { - char escape[4] = { '%', 0, 0, 0 }; - snprintf(escape + 1, sizeof(escape) - 1, "%X", path[i]); - serd_chunk_sink(escape, 3, &chunk); + char escape_str[4] = { '%', 0, 0, 0 }; + snprintf(escape_str + 1, sizeof(escape_str) - 1, "%X", path[i]); + serd_chunk_sink(escape_str, 3, &chunk); } } serd_chunk_sink_finish(&chunk); @@ -310,19 +310,19 @@ SerdNode serd_node_new_blob(const void* buf, size_t size, bool wrap_lines) { const size_t len = ((size + 2) / 3) * 4 + (wrap_lines ? (size / 57) : 0); - SerdNode node = { (uint8_t*)calloc(1, len + 2), - len, len, 0, SERD_LITERAL }; + uint8_t* str = (uint8_t*)calloc(1, len + 2); + SerdNode node = { str, len, len, 0, SERD_LITERAL }; for (size_t i = 0, j = 0; i < size; i += 3, j += 4) { uint8_t in[4] = { 0, 0, 0, 0 }; size_t n_in = MIN(3, size - i); memcpy(in, (const uint8_t*)buf + i, n_in); if (wrap_lines && i > 0 && (i % 57) == 0) { - ((uint8_t*)node.buf)[j++] = '\n'; + str[j++] = '\n'; node.flags |= SERD_HAS_NEWLINE; } - encode_chunk((uint8_t*)node.buf + j, in, n_in); + encode_chunk(str + j, in, n_in); } return node; } diff --git a/c++/carla-lilv/serd-0.14.0/src/reader.c b/c++/carla-lilv/serd-0.18.0/src/reader.c similarity index 90% rename from c++/carla-lilv/serd-0.14.0/src/reader.c rename to c++/carla-lilv/serd-0.18.0/src/reader.c index 70dc7fe..d17b80a 100644 --- a/c++/carla-lilv/serd-0.14.0/src/reader.c +++ b/c++/carla-lilv/serd-0.18.0/src/reader.c @@ -64,6 +64,8 @@ struct SerdReaderImpl { SerdPrefixSink prefix_sink; SerdStatementSink statement_sink; SerdEndSink end_sink; + SerdErrorSink error_sink; + void* error_handle; Ref rdf_first; Ref rdf_rest; Ref rdf_nil; @@ -78,7 +80,9 @@ struct SerdReaderImpl { unsigned next_id; uint8_t* read_buf; int32_t read_head; ///< Offset into read_buf + uint8_t read_byte; ///< 1-byte 'buffer' used when not paging bool from_file; ///< True iff reading from @ref fd + bool paging; ///< True iff reading a page at a time bool eof; bool seen_genid; #ifdef SERD_STACK_CHECK @@ -88,13 +92,14 @@ struct SerdReaderImpl { }; static int -error(SerdReader* reader, const char* fmt, ...) +error(SerdReader* reader, SerdStatus st, const char* fmt, ...) { va_list args; va_start(args, fmt); - fprintf(stderr, "error: %s:%u:%u: ", - reader->cur.filename, reader->cur.line, reader->cur.col); - vfprintf(stderr, fmt, args); + const SerdError e = { + st, reader->cur.filename, reader->cur.line, reader->cur.col, fmt, &args + }; + serd_error(reader->error_sink, reader->error_handle, &e); va_end(args); return 0; } @@ -124,14 +129,19 @@ static inline uint8_t eat_byte_safe(SerdReader* reader, const uint8_t byte) { assert(peek_byte(reader) == byte); - ++reader->read_head; switch (byte) { case '\0': reader->eof = true; break; case '\n': ++reader->cur.line; reader->cur.col = 0; break; default: ++reader->cur.col; } - if (reader->from_file && (reader->read_head == SERD_PAGE_SIZE)) { + if (reader->from_file && !reader->paging) { + const int c = fgetc(reader->fd); + reader->read_byte = (c == EOF) ? 0 : (uint8_t)c; + if (c == EOF) { + reader->eof = true; + } + } else if (++reader->read_head == SERD_PAGE_SIZE && reader->paging) { page(reader); } return byte; @@ -142,7 +152,8 @@ eat_byte_check(SerdReader* reader, const uint8_t byte) { const uint8_t c = peek_byte(reader); if (c != byte) { - return error(reader, "expected `%c', not `%c'\n", byte, c); + return error(reader, SERD_ERR_BAD_SYNTAX, + "expected `%c', not `%c'\n", byte, c); } return eat_byte_safe(reader, byte); } @@ -264,7 +275,8 @@ read_hex(SerdReader* reader) if (in_range(c, 0x30, 0x39) || in_range(c, 0x41, 0x46)) { return eat_byte_safe(reader, c); } else { - return error(reader, "illegal hexadecimal digit `%c'\n", c); + return error(reader, SERD_ERR_BAD_SYNTAX, + "invalid hexadecimal digit `%c'\n", c); } } @@ -291,7 +303,8 @@ read_hex_escape(SerdReader* reader, unsigned length, Ref dest) } else if (c < 0x00110000) { size = 4; } else { - error(reader, "unicode character 0x%X out of range\n", c); + error(reader, SERD_ERR_BAD_SYNTAX, + "unicode character 0x%X out of range\n", c); push_replacement(reader, dest); return true; } @@ -391,20 +404,20 @@ read_ucharacter_escape(SerdReader* reader, Ref dest) static inline SerdStatus bad_char(SerdReader* reader, Ref dest, const char* fmt, uint8_t c) { - error(reader, fmt, c); + error(reader, SERD_ERR_BAD_SYNTAX, fmt, c); push_replacement(reader, dest); // Skip bytes until the next start byte - for (uint8_t c = peek_byte(reader); (c & 0x80);) { - eat_byte_safe(reader, c); - c = peek_byte(reader); + for (uint8_t b = peek_byte(reader); (b & 0x80);) { + eat_byte_safe(reader, b); + b = peek_byte(reader); } return SERD_SUCCESS; } static SerdStatus -read_utf8_character(SerdReader* reader, Ref dest, const uint8_t c) +read_utf8_character(SerdReader* reader, Ref dest, uint8_t c) { unsigned size = 1; if ((c & 0xE0) == 0xC0) { // Starts with `110' @@ -447,7 +460,7 @@ read_character(SerdReader* reader, Ref dest) const uint8_t c = peek_byte(reader); assert(c != '\\'); // Only called from methods that handle escapes first if (c == '\0') { - error(reader, "unexpected end of file\n", c); + error(reader, SERD_ERR_BAD_SYNTAX, "unexpected end of input\n", c); return SERD_ERR_BAD_SYNTAX; } else if (c < 0x20) { return bad_char(reader, dest, @@ -486,7 +499,8 @@ read_lcharacter(SerdReader* reader, Ref dest, SerdNodeFlags* flags) if (read_scharacter_escape(reader, dest, flags)) { return SERD_SUCCESS; } else { - error(reader, "illegal escape `\\%c'\n", peek_byte(reader)); + error(reader, SERD_ERR_BAD_SYNTAX, + "invalid escape `\\%c'\n", peek_byte(reader)); return SERD_ERR_BAD_SYNTAX; } case 0xA: case 0xD: @@ -510,7 +524,8 @@ read_scharacter(SerdReader* reader, Ref dest, SerdNodeFlags* flags) if (read_scharacter_escape(reader, dest, flags)) { return SERD_SUCCESS; } else { - error(reader, "illegal escape `\\%c'\n", peek_byte(reader)); + error(reader, SERD_ERR_BAD_SYNTAX, + "invalid escape `\\%c'\n", peek_byte(reader)); return SERD_ERR_BAD_SYNTAX; } case '\"': @@ -532,7 +547,8 @@ read_ucharacter(SerdReader* reader, Ref dest) if (read_ucharacter_escape(reader, dest)) { return SERD_SUCCESS; } else { - error(reader, "illegal escape `\\%c'\n", peek_byte(reader)); + error(reader, SERD_ERR_BAD_SYNTAX, + "invalid escape `\\%c'\n", peek_byte(reader)); return SERD_FAILURE; } case '>': @@ -548,7 +564,7 @@ read_comment(SerdReader* reader) { eat_byte_safe(reader, '#'); uint8_t c; - while (((c = peek_byte(reader)) != 0xA) && (c != 0xD)) { + while (((c = peek_byte(reader)) != 0xA) && (c != 0xD) && c) { eat_byte_safe(reader, c); } } @@ -669,7 +685,7 @@ static inline uchar read_nameStartChar(SerdReader* reader) { const uint8_t c = peek_byte(reader); - if (c == '_' || is_alpha(c)) { // TODO: not strictly correct + if (c == '_' || is_alpha(c) || is_digit(c)) { // TODO: Not correct return eat_byte_safe(reader, c); } return 0; @@ -700,7 +716,7 @@ read_prefixName(SerdReader* reader, Ref dest) { uint8_t c = peek_byte(reader); if (c == '_') { - error(reader, "unexpected `_'\n"); + error(reader, SERD_ERR_BAD_SYNTAX, "unexpected `_'\n"); return pop_node(reader, dest); } TRY_RET(c = read_nameStartChar(reader)); @@ -734,7 +750,7 @@ read_language(SerdReader* reader) { uint8_t c = peek_byte(reader); if (!in_range(c, 'a', 'z')) { - return error(reader, "unexpected `%c'\n", c); + return error(reader, SERD_ERR_BAD_SYNTAX, "unexpected `%c'\n", c); } Ref ref = push_node(reader, SERD_LITERAL, "", 0); push_byte(reader, ref, eat_byte_safe(reader, c)); @@ -788,7 +804,7 @@ read_0_9(SerdReader* reader, Ref str, bool at_least_one) uint8_t c; if (at_least_one) { if (!is_digit((c = peek_byte(reader)))) { - return error(reader, "expected digit\n"); + return error(reader, SERD_ERR_BAD_SYNTAX, "expected digit\n"); } push_byte(reader, str, eat_byte_safe(reader, c)); } @@ -901,7 +917,7 @@ except: } inline static bool -is_token_end(const uint8_t c) +is_token_end(uint8_t c) { switch (c) { case 0x9: case 0xA: case 0xD: case 0x20: case '\0': @@ -950,7 +966,8 @@ read_nodeID(SerdReader* reader) reader->bprefix ? (char*)reader->bprefix : "", reader->bprefix_len); if (!read_name(reader, ref)) { - return error(reader, "illegal character at start of name\n"); + return error(reader, SERD_ERR_BAD_SYNTAX, + "invalid character at start of name\n"); } if (reader->syntax == SERD_TURTLE) { const char* const buf = (const char*)deref(reader, ref)->buf; @@ -958,8 +975,8 @@ read_nodeID(SerdReader* reader) memcpy((char*)buf, "docid", 5); // Prevent clash reader->seen_genid = true; } else if (reader->seen_genid && !strncmp(buf, "docid", 5)) { - error(reader, "found both `genid' and `docid' blank IDs\n"); - error(reader, "resolve this with a blank ID prefix\n"); + error(reader, SERD_ERR_ID_CLASH, + "found both `genid' and `docid' IDs, prefix required\n"); return pop_node(reader, ref); } } @@ -1032,7 +1049,7 @@ read_blank(SerdReader* reader, ReadContext ctx, bool subject, Ref* dest) case '(': return read_collection(reader, ctx, dest); default: - return error(reader, "illegal blank node\n"); + return error(reader, SERD_ERR_BAD_SYNTAX, "invalid blank node\n"); } } @@ -1304,7 +1321,7 @@ read_directive(SerdReader* reader) switch (peek_byte(reader)) { case 'b': return read_base(reader); case 'p': return read_prefixID(reader); - default: return error(reader, "illegal directive\n"); + default: return error(reader, SERD_ERR_BAD_SYNTAX, "invalid directive\n"); } } @@ -1359,6 +1376,8 @@ serd_reader_new(SerdSyntax syntax, me->prefix_sink = prefix_sink; me->statement_sink = statement_sink; me->end_sink = end_sink; + me->error_sink = NULL; + me->error_handle = NULL; me->default_graph = SERD_NODE_NULL; me->fd = 0; me->stack = serd_stack_new(SERD_PAGE_SIZE); @@ -1383,6 +1402,16 @@ serd_reader_new(SerdSyntax syntax, return me; } +SERD_API +void +serd_reader_set_error_sink(SerdReader* reader, + SerdErrorSink error_sink, + void* error_handle) +{ + reader->error_sink = error_sink; + reader->error_handle = error_handle; +} + SERD_API void serd_reader_free(SerdReader* reader) @@ -1458,14 +1487,17 @@ static void skip_bom(SerdReader* me) { const uint8_t* const b = me->read_buf; - if (b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF) { + if (me->paging && b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF) { me->read_head += 3; } } SERD_API SerdStatus -serd_reader_read_file_handle(SerdReader* me, FILE* file, const uint8_t* name) +serd_reader_start_stream(SerdReader* me, + FILE* file, + const uint8_t* name, + bool bulk) { const Cursor cur = { name, 1, 1 }; me->fd = file; @@ -1473,19 +1505,62 @@ serd_reader_read_file_handle(SerdReader* me, FILE* file, const uint8_t* name) me->cur = cur; me->from_file = true; me->eof = false; - me->read_buf = (uint8_t*)serd_bufalloc(SERD_PAGE_SIZE); + me->paging = bulk; + + if (bulk) { + me->read_buf = (uint8_t*)serd_bufalloc(SERD_PAGE_SIZE); + memset(me->read_buf, '\0', SERD_PAGE_SIZE); + SerdStatus st = page(me); + if (st) { + serd_reader_end_stream(me); + return st; + } + skip_bom(me); + } else { + me->read_buf = &me->read_byte; + me->read_byte = 0; // Don't read to avoid potentially blocking + } - memset(me->read_buf, '\0', SERD_PAGE_SIZE); + return SERD_SUCCESS; +} - SerdStatus st = page(me); - if (!st) { - skip_bom(me); - st = read_turtleDoc(me) ? SERD_SUCCESS : SERD_ERR_UNKNOWN; +SERD_API +SerdStatus +serd_reader_read_chunk(SerdReader* me) +{ + if (!me->read_byte) { + // Read initial byte + const int c = fgetc(me->fd); + me->read_byte = (c == EOF) ? 0 : (uint8_t)c; + if (c == EOF) { + me->eof = true; + return SERD_FAILURE; + } } + return read_statement(me) ? SERD_SUCCESS : SERD_FAILURE; +} - free(me->read_buf); +SERD_API +SerdStatus +serd_reader_end_stream(SerdReader* me) +{ + if (me->paging) { + free(me->read_buf); + } me->fd = 0; me->read_buf = NULL; + return SERD_SUCCESS; +} + +SERD_API +SerdStatus +serd_reader_read_file_handle(SerdReader* me, FILE* file, const uint8_t* name) +{ + SerdStatus st = serd_reader_start_stream(me, file, name, true); + if (!st) { + st = read_turtleDoc(me) ? SERD_SUCCESS : SERD_ERR_UNKNOWN; + serd_reader_end_stream(me); + } return st; } @@ -1499,6 +1574,7 @@ serd_reader_read_string(SerdReader* me, const uint8_t* utf8) me->read_head = 0; me->cur = cur; me->from_file = false; + me->paging = false; me->eof = false; skip_bom(me); diff --git a/c++/carla-lilv/serd-0.14.0/src/serd_internal.h b/c++/carla-lilv/serd-0.18.0/src/serd_internal.h similarity index 95% rename from c++/carla-lilv/serd-0.14.0/src/serd_internal.h rename to c++/carla-lilv/serd-0.18.0/src/serd_internal.h index ee55de2..67e47e9 100644 --- a/c++/carla-lilv/serd-0.14.0/src/serd_internal.h +++ b/c++/carla-lilv/serd-0.18.0/src/serd_internal.h @@ -181,7 +181,7 @@ serd_bulk_sink_write(const void* buf, size_t len, SerdBulkSink* bsink) // Write as much as possible into the remaining buffer space memcpy(bsink->buf + bsink->size, buf, n); bsink->size += n; - buf = (uint8_t*)buf + n; + buf = (const uint8_t*)buf + n; len -= n; // Flush page if buffer is full @@ -290,4 +290,17 @@ uri_is_under(const SerdURI* uri, const SerdURI* root) return true; } +/* Error reporting */ + +static inline void +serd_error(SerdErrorSink error_sink, void* handle, const SerdError* e) +{ + if (error_sink) { + error_sink(handle, e); + } else { + fprintf(stderr, "error: %s:%u:%u: ", e->filename, e->line, e->col); + vfprintf(stderr, e->fmt, *e->args); + } +} + #endif // SERD_INTERNAL_H diff --git a/c++/carla-lilv/serd-0.14.0/src/serdi.c b/c++/carla-lilv/serd-0.18.0/src/serdi.c similarity index 87% rename from c++/carla-lilv/serd-0.14.0/src/serdi.c rename to c++/carla-lilv/serd-0.18.0/src/serdi.c index 74a8499..290ee1d 100644 --- a/c++/carla-lilv/serd-0.14.0/src/serdi.c +++ b/c++/carla-lilv/serd-0.18.0/src/serdi.c @@ -27,7 +27,7 @@ typedef struct { } State; static int -print_version() +print_version(void) { printf("serdi " SERD_VERSION " \n"); printf("Copyright 2011-2012 David Robillard .\n" @@ -46,11 +46,13 @@ print_usage(const char* name, bool error) fprintf(os, "Use - for INPUT to read from standard input.\n\n"); fprintf(os, " -b Fast bulk output for large serialisations.\n"); fprintf(os, " -c PREFIX Chop PREFIX from matching blank node IDs.\n"); + fprintf(os, " -e Eat input one character at a time.\n"); fprintf(os, " -f Keep full URIs in input (don't qualify).\n"); fprintf(os, " -h Display this help and exit.\n"); fprintf(os, " -i SYNTAX Input syntax (`turtle' or `ntriples').\n"); fprintf(os, " -o SYNTAX Output syntax (`turtle' or `ntriples').\n"); fprintf(os, " -p PREFIX Add PREFIX to blank node IDs.\n"); + fprintf(os, " -q Suppress all output except data.\n"); fprintf(os, " -r ROOT_URI Keep relative URIs within ROOT_URI.\n"); fprintf(os, " -s INPUT Parse INPUT as string (terminates options).\n"); fprintf(os, " -v Display version information and exit.\n"); @@ -78,6 +80,12 @@ bad_arg(const char* name, char opt) return 1; } +static SerdStatus +quiet_error_sink(void* handle, const SerdError* e) +{ + return SERD_SUCCESS; +} + int main(int argc, char** argv) { @@ -89,8 +97,10 @@ main(int argc, char** argv) SerdSyntax input_syntax = SERD_TURTLE; SerdSyntax output_syntax = SERD_NTRIPLES; bool from_file = true; + bool bulk_read = true; bool bulk_write = false; bool full_uris = false; + bool quiet = false; const uint8_t* in_name = NULL; const uint8_t* add_prefix = NULL; const uint8_t* chop_prefix = NULL; @@ -103,10 +113,14 @@ main(int argc, char** argv) break; } else if (argv[a][1] == 'b') { bulk_write = true; + } else if (argv[a][1] == 'e') { + bulk_read = false; } else if (argv[a][1] == 'f') { full_uris = true; } else if (argv[a][1] == 'h') { return print_usage(argv[0], false); + } else if (argv[a][1] == 'q') { + quiet = true; } else if (argv[a][1] == 'v') { return print_version(); } else if (argv[a][1] == 's') { @@ -201,14 +215,28 @@ main(int argc, char** argv) (SerdStatementSink)serd_writer_write_statement, (SerdEndSink)serd_writer_end_anon); + if (quiet) { + serd_reader_set_error_sink(reader, quiet_error_sink, NULL); + serd_writer_set_error_sink(writer, quiet_error_sink, NULL); + } + SerdNode root = serd_node_from_string(SERD_URI, root_uri); serd_writer_set_root_uri(writer, &root); serd_writer_chop_blank_prefix(writer, chop_prefix); serd_reader_add_blank_prefix(reader, add_prefix); - const SerdStatus status = (from_file) - ? serd_reader_read_file_handle(reader, in_fd, in_name) - : serd_reader_read_string(reader, input); + SerdStatus status = SERD_SUCCESS; + if (!from_file) { + status = serd_reader_read_string(reader, input); + } else if (bulk_read) { + status = serd_reader_read_file_handle(reader, in_fd, in_name); + } else { + status = serd_reader_start_stream(reader, in_fd, in_name, false); + while (!status) { + status = serd_reader_read_chunk(reader); + } + serd_reader_end_stream(reader); + } serd_reader_free(reader); diff --git a/c++/carla-lilv/serd-0.14.0/src/string.c b/c++/carla-lilv/serd-0.18.0/src/string.c similarity index 94% rename from c++/carla-lilv/serd-0.14.0/src/string.c rename to c++/carla-lilv/serd-0.18.0/src/string.c index 24ab979..a1a1dff 100644 --- a/c++/carla-lilv/serd-0.14.0/src/string.c +++ b/c++/carla-lilv/serd-0.18.0/src/string.c @@ -29,8 +29,11 @@ serd_strerror(SerdStatus st) case SERD_ERR_BAD_SYNTAX: return (const uint8_t*)"Invalid syntax"; case SERD_ERR_BAD_ARG: return (const uint8_t*)"Invalid argument"; case SERD_ERR_NOT_FOUND: return (const uint8_t*)"Not found"; + case SERD_ERR_ID_CLASH: return (const uint8_t*)"Blank node ID clash"; + case SERD_ERR_BAD_CURIE: return (const uint8_t*)"Invalid CURIE"; + case SERD_ERR_INTERNAL: return (const uint8_t*)"Internal error"; } - return (const uint8_t*)"Unknown error code"; // never reached + return (const uint8_t*)"Unknown error"; // never reached } SERD_API diff --git a/c++/carla-lilv/serd-0.14.0/src/uri.c b/c++/carla-lilv/serd-0.18.0/src/uri.c similarity index 98% rename from c++/carla-lilv/serd-0.14.0/src/uri.c rename to c++/carla-lilv/serd-0.18.0/src/uri.c index f7d17e5..1812bb9 100644 --- a/c++/carla-lilv/serd-0.14.0/src/uri.c +++ b/c++/carla-lilv/serd-0.18.0/src/uri.c @@ -446,15 +446,15 @@ write_rel_path(SerdSink sink, // Find the number of up references ("..") required size_t up = 0; - for (size_t i = last_shared_sep + 1; i < base_len; ++i) { - if (uri_path_at(base, i) == '/') { + for (size_t s = last_shared_sep + 1; s < base_len; ++s) { + if (uri_path_at(base, s) == '/') { ++up; } } // Write up references size_t len = 0; - for (size_t i = 0; i < up; ++i) { + for (size_t u = 0; u < up; ++u) { len += sink("../", 3, stream); } diff --git a/c++/carla-lilv/serd-0.14.0/src/writer.c b/c++/carla-lilv/serd-0.18.0/src/writer.c similarity index 91% rename from c++/carla-lilv/serd-0.14.0/src/writer.c rename to c++/carla-lilv/serd-0.18.0/src/writer.c index b6dcecc..6546572 100644 --- a/c++/carla-lilv/serd-0.14.0/src/writer.c +++ b/c++/carla-lilv/serd-0.18.0/src/writer.c @@ -74,24 +74,26 @@ static const SepRule rules[] = { }; struct SerdWriterImpl { - SerdSyntax syntax; - SerdStyle style; - SerdEnv* env; - SerdNode root_node; - SerdURI root_uri; - SerdURI base_uri; - SerdStack anon_stack; - SerdBulkSink bulk_sink; - SerdSink sink; - void* stream; - WriteContext context; - SerdNode list_subj; - unsigned list_depth; - uint8_t* bprefix; - size_t bprefix_len; - unsigned indent; - Sep last_sep; - bool empty; + SerdSyntax syntax; + SerdStyle style; + SerdEnv* env; + SerdNode root_node; + SerdURI root_uri; + SerdURI base_uri; + SerdStack anon_stack; + SerdBulkSink bulk_sink; + SerdSink sink; + void* stream; + SerdErrorSink error_sink; + void* error_handle; + WriteContext context; + SerdNode list_subj; + unsigned list_depth; + uint8_t* bprefix; + size_t bprefix_len; + unsigned indent; + Sep last_sep; + bool empty; }; typedef enum { @@ -100,6 +102,16 @@ typedef enum { WRITE_LONG_STRING } TextContext; +static void +error2(SerdWriter* writer, SerdStatus st, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const SerdError e = { st, NULL, 0, 0, fmt, &args }; + serd_error(writer->error_sink, writer->error_handle, &e); + va_end(args); +} + static inline WriteContext* anon_stack_top(SerdWriter* writer) { @@ -207,10 +219,10 @@ write_text(SerdWriter* writer, TextContext ctx, size = 4; c = in & 0x07; } else { - fprintf(stderr, "Invalid UTF-8: %X\n", in); + error2(writer, SERD_ERR_BAD_ARG, "invalid UTF-8: %X\n", in); const uint8_t replacement_char[] = { 0xEF, 0xBF, 0xBD }; len += sink(replacement_char, sizeof(replacement_char), writer); - return 0; + return len; } if (ctx != WRITE_URI && !(writer->style & SERD_STYLE_ASCII)) { @@ -352,7 +364,8 @@ write_node(SerdWriter* writer, switch (writer->syntax) { case SERD_NTRIPLES: if (serd_env_expand(writer->env, node, &uri_prefix, &uri_suffix)) { - fprintf(stderr, "Undefined namespace prefix `%s'\n", node->buf); + error2(writer, SERD_ERR_BAD_CURIE, + "undefined namespace prefix `%s'\n", node->buf); return false; } sink("<", 1, writer); @@ -590,7 +603,8 @@ serd_writer_end_anon(SerdWriter* writer, return SERD_SUCCESS; } if (serd_stack_is_empty(&writer->anon_stack)) { - fprintf(stderr, "Unexpected end of anonymous node\n"); + error2(writer, SERD_ERR_UNKNOWN, + "unexpected end of anonymous node\n"); return SERD_ERR_UNKNOWN; } assert(writer->indent > 0); @@ -617,6 +631,7 @@ serd_writer_finish(SerdWriter* writer) if (writer->style & SERD_STYLE_BULK) { serd_bulk_sink_flush(&writer->bulk_sink); } + writer->indent = 0; return reset_context(writer, true); } @@ -626,34 +641,46 @@ serd_writer_new(SerdSyntax syntax, SerdStyle style, SerdEnv* env, const SerdURI* base_uri, - SerdSink sink, + SerdSink ssink, void* stream) { const WriteContext context = WRITE_CONTEXT_NULL; SerdWriter* writer = (SerdWriter*)malloc(sizeof(SerdWriter)); - writer->syntax = syntax; - writer->style = style; - writer->env = env; - writer->root_node = SERD_NODE_NULL; - writer->root_uri = SERD_URI_NULL; - writer->base_uri = base_uri ? *base_uri : SERD_URI_NULL; - writer->anon_stack = serd_stack_new(sizeof(WriteContext)); - writer->sink = sink; - writer->stream = stream; - writer->context = context; - writer->list_subj = SERD_NODE_NULL; - writer->list_depth = 0; - writer->bprefix = NULL; - writer->bprefix_len = 0; - writer->indent = 0; - writer->last_sep = SEP_NONE; - writer->empty = true; + writer->syntax = syntax; + writer->style = style; + writer->env = env; + writer->root_node = SERD_NODE_NULL; + writer->root_uri = SERD_URI_NULL; + writer->base_uri = base_uri ? *base_uri : SERD_URI_NULL; + writer->anon_stack = serd_stack_new(sizeof(WriteContext)); + writer->sink = ssink; + writer->stream = stream; + writer->error_sink = NULL; + writer->error_handle = NULL; + writer->context = context; + writer->list_subj = SERD_NODE_NULL; + writer->list_depth = 0; + writer->bprefix = NULL; + writer->bprefix_len = 0; + writer->indent = 0; + writer->last_sep = SEP_NONE; + writer->empty = true; if (style & SERD_STYLE_BULK) { - writer->bulk_sink = serd_bulk_sink_new(sink, stream, SERD_PAGE_SIZE); + writer->bulk_sink = serd_bulk_sink_new(ssink, stream, SERD_PAGE_SIZE); } return writer; } +SERD_API +void +serd_writer_set_error_sink(SerdWriter* writer, + SerdErrorSink error_sink, + void* error_handle) +{ + writer->error_sink = error_sink; + writer->error_handle = error_handle; +} + SERD_API void serd_writer_chop_blank_prefix(SerdWriter* writer, diff --git a/c++/carla-lilv/serd-0.14.0/tests/README.txt b/c++/carla-lilv/serd-0.18.0/tests/README.txt similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/README.txt rename to c++/carla-lilv/serd-0.18.0/tests/README.txt diff --git a/c++/carla-lilv/serd-0.14.0/tests/UTF-8.ttl b/c++/carla-lilv/serd-0.18.0/tests/UTF-8.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/UTF-8.ttl rename to c++/carla-lilv/serd-0.18.0/tests/UTF-8.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-00.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-00.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-00.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-00.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-01.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-01.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-01.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-01.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-02.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-02.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-02.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-02.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-03.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-03.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-03.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-03.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-04.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-04.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-04.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-04.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-05.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-05.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-05.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-05.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-06.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-06.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-06.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-06.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-07.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-07.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-07.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-07.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-08.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-08.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-08.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-08.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-09.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-09.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-09.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-09.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-10.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-10.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-10.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-10.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-11.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-11.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-11.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-11.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-12.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-12.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-12.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-12.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-13.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-13.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-13.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-13.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-14.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-14.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-14.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-14.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-base.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-base.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-base.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-base.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-blank.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-blank.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-blank.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-blank.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-datatype.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-datatype.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-datatype.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-datatype.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-blank.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-blank.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-blank.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-blank.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-escape.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-escape.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-escape.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-escape.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-lang-suffix.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-lang-suffix.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-lang-suffix.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-lang-suffix.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-lang.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-lang.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-lang.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-lang.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-list.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-list.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-list.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-list.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-object-list.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-object-list.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-object-list.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-object-list.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-object-list2.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-object-list2.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-object-list2.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-object-list2.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-predicate-list.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-predicate-list.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-predicate-list.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-predicate-list.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-string.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-string.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-string.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-string.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-triple-quote.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-triple-quote.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-triple-quote.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-triple-quote.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-uri.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-uri.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-eof-in-uri.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-eof-in-uri.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-escape.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-escape.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-escape.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-escape.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-hex-digit.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-hex-digit.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-hex-digit.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-hex-digit.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-id-clash.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-id-clash.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-id-clash.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-id-clash.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-lang.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-lang.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-lang.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-lang.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-list.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-list.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-list.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-list.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-list2.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-list2.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-list2.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-list2.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-namespace.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-namespace.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-namespace.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-namespace.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-ns.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-ns.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-ns.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-ns.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-num.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-num.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-num.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-num.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-object.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-object.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-object.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-object.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-object2.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-object2.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-object2.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-object2.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-prefix.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-prefix.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-prefix.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-prefix.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-string.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-string.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-string.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-string.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-uri-escape.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-uri-escape.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-uri-escape.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-uri-escape.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/bad-verb.ttl b/c++/carla-lilv/serd-0.18.0/tests/bad-verb.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/bad-verb.ttl rename to c++/carla-lilv/serd-0.18.0/tests/bad-verb.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/base.out b/c++/carla-lilv/serd-0.18.0/tests/base.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/base.out rename to c++/carla-lilv/serd-0.18.0/tests/base.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/base.ttl b/c++/carla-lilv/serd-0.18.0/tests/base.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/base.ttl rename to c++/carla-lilv/serd-0.18.0/tests/base.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/manifest-bad.ttl b/c++/carla-lilv/serd-0.18.0/tests/manifest-bad.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/manifest-bad.ttl rename to c++/carla-lilv/serd-0.18.0/tests/manifest-bad.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/manifest.ttl b/c++/carla-lilv/serd-0.18.0/tests/manifest.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/manifest.ttl rename to c++/carla-lilv/serd-0.18.0/tests/manifest.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/rdf-schema.out b/c++/carla-lilv/serd-0.18.0/tests/rdf-schema.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/rdf-schema.out rename to c++/carla-lilv/serd-0.18.0/tests/rdf-schema.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/rdf-schema.ttl b/c++/carla-lilv/serd-0.18.0/tests/rdf-schema.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/rdf-schema.ttl rename to c++/carla-lilv/serd-0.18.0/tests/rdf-schema.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/rdfq-results.out b/c++/carla-lilv/serd-0.18.0/tests/rdfq-results.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/rdfq-results.out rename to c++/carla-lilv/serd-0.18.0/tests/rdfq-results.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/rdfq-results.ttl b/c++/carla-lilv/serd-0.18.0/tests/rdfq-results.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/rdfq-results.ttl rename to c++/carla-lilv/serd-0.18.0/tests/rdfq-results.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/rdfs-namespace.out b/c++/carla-lilv/serd-0.18.0/tests/rdfs-namespace.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/rdfs-namespace.out rename to c++/carla-lilv/serd-0.18.0/tests/rdfs-namespace.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/rdfs-namespace.ttl b/c++/carla-lilv/serd-0.18.0/tests/rdfs-namespace.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/rdfs-namespace.ttl rename to c++/carla-lilv/serd-0.18.0/tests/rdfs-namespace.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/serd_test.c b/c++/carla-lilv/serd-0.18.0/tests/serd_test.c similarity index 99% rename from c++/carla-lilv/serd-0.14.0/tests/serd_test.c rename to c++/carla-lilv/serd-0.18.0/tests/serd_test.c index 2b6bc09..7ce2aa5 100644 --- a/c++/carla-lilv/serd-0.14.0/tests/serd_test.c +++ b/c++/carla-lilv/serd-0.18.0/tests/serd_test.c @@ -81,7 +81,7 @@ test_sink(void* handle, } int -main() +main(void) { #define MAX 1000000 #define NUM_TESTS 1000 @@ -215,7 +215,7 @@ main() if (strcmp((const char*)(msg = serd_strerror(SERD_SUCCESS)), "Success")) { return failure("Bad message `%s' for SERD_SUCCESS\n", msg); } - for (int i = SERD_FAILURE; i <= SERD_ERR_NOT_FOUND; ++i) { + for (int i = SERD_FAILURE; i <= SERD_ERR_INTERNAL; ++i) { msg = serd_strerror((SerdStatus)i); if (!strcmp((const char*)msg, "Success")) { return failure("Bad message `%s' for (SerdStatus)%d\n", msg, i); diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-00.out b/c++/carla-lilv/serd-0.18.0/tests/test-00.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-00.out rename to c++/carla-lilv/serd-0.18.0/tests/test-00.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-00.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-00.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-00.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-00.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-01.out b/c++/carla-lilv/serd-0.18.0/tests/test-01.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-01.out rename to c++/carla-lilv/serd-0.18.0/tests/test-01.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-01.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-01.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-01.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-01.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-02.out b/c++/carla-lilv/serd-0.18.0/tests/test-02.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-02.out rename to c++/carla-lilv/serd-0.18.0/tests/test-02.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-02.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-02.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-02.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-02.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-03.out b/c++/carla-lilv/serd-0.18.0/tests/test-03.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-03.out rename to c++/carla-lilv/serd-0.18.0/tests/test-03.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-03.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-03.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-03.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-03.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-04.out b/c++/carla-lilv/serd-0.18.0/tests/test-04.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-04.out rename to c++/carla-lilv/serd-0.18.0/tests/test-04.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-04.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-04.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-04.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-04.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-05.out b/c++/carla-lilv/serd-0.18.0/tests/test-05.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-05.out rename to c++/carla-lilv/serd-0.18.0/tests/test-05.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-05.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-05.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-05.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-05.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-06.out b/c++/carla-lilv/serd-0.18.0/tests/test-06.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-06.out rename to c++/carla-lilv/serd-0.18.0/tests/test-06.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-06.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-06.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-06.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-06.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-07.out b/c++/carla-lilv/serd-0.18.0/tests/test-07.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-07.out rename to c++/carla-lilv/serd-0.18.0/tests/test-07.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-07.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-07.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-07.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-07.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-08.out b/c++/carla-lilv/serd-0.18.0/tests/test-08.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-08.out rename to c++/carla-lilv/serd-0.18.0/tests/test-08.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-08.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-08.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-08.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-08.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-09.out b/c++/carla-lilv/serd-0.18.0/tests/test-09.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-09.out rename to c++/carla-lilv/serd-0.18.0/tests/test-09.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-09.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-09.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-09.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-09.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-10.out b/c++/carla-lilv/serd-0.18.0/tests/test-10.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-10.out rename to c++/carla-lilv/serd-0.18.0/tests/test-10.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-10.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-10.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-10.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-10.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-11.out b/c++/carla-lilv/serd-0.18.0/tests/test-11.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-11.out rename to c++/carla-lilv/serd-0.18.0/tests/test-11.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-11.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-11.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-11.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-11.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-12.out b/c++/carla-lilv/serd-0.18.0/tests/test-12.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-12.out rename to c++/carla-lilv/serd-0.18.0/tests/test-12.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-12.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-12.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-12.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-12.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-13.out b/c++/carla-lilv/serd-0.18.0/tests/test-13.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-13.out rename to c++/carla-lilv/serd-0.18.0/tests/test-13.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-13.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-13.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-13.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-13.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-14.out b/c++/carla-lilv/serd-0.18.0/tests/test-14.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-14.out rename to c++/carla-lilv/serd-0.18.0/tests/test-14.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-14.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-14.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-14.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-14.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-15.out b/c++/carla-lilv/serd-0.18.0/tests/test-15.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-15.out rename to c++/carla-lilv/serd-0.18.0/tests/test-15.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-15.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-15.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-15.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-15.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-16.out b/c++/carla-lilv/serd-0.18.0/tests/test-16.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-16.out rename to c++/carla-lilv/serd-0.18.0/tests/test-16.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-16.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-16.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-16.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-16.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-17.out b/c++/carla-lilv/serd-0.18.0/tests/test-17.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-17.out rename to c++/carla-lilv/serd-0.18.0/tests/test-17.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-17.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-17.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-17.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-17.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-18.out b/c++/carla-lilv/serd-0.18.0/tests/test-18.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-18.out rename to c++/carla-lilv/serd-0.18.0/tests/test-18.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-18.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-18.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-18.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-18.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-19.out b/c++/carla-lilv/serd-0.18.0/tests/test-19.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-19.out rename to c++/carla-lilv/serd-0.18.0/tests/test-19.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-19.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-19.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-19.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-19.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-20.out b/c++/carla-lilv/serd-0.18.0/tests/test-20.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-20.out rename to c++/carla-lilv/serd-0.18.0/tests/test-20.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-20.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-20.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-20.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-20.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-21.out b/c++/carla-lilv/serd-0.18.0/tests/test-21.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-21.out rename to c++/carla-lilv/serd-0.18.0/tests/test-21.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-21.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-21.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-21.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-21.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-22.out b/c++/carla-lilv/serd-0.18.0/tests/test-22.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-22.out rename to c++/carla-lilv/serd-0.18.0/tests/test-22.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-22.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-22.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-22.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-22.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-23.out b/c++/carla-lilv/serd-0.18.0/tests/test-23.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-23.out rename to c++/carla-lilv/serd-0.18.0/tests/test-23.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-23.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-23.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-23.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-23.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-24.out b/c++/carla-lilv/serd-0.18.0/tests/test-24.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-24.out rename to c++/carla-lilv/serd-0.18.0/tests/test-24.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-24.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-24.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-24.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-24.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-25.out b/c++/carla-lilv/serd-0.18.0/tests/test-25.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-25.out rename to c++/carla-lilv/serd-0.18.0/tests/test-25.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-25.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-25.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-25.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-25.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-26.out b/c++/carla-lilv/serd-0.18.0/tests/test-26.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-26.out rename to c++/carla-lilv/serd-0.18.0/tests/test-26.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-26.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-26.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-26.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-26.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-27.out b/c++/carla-lilv/serd-0.18.0/tests/test-27.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-27.out rename to c++/carla-lilv/serd-0.18.0/tests/test-27.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-27.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-27.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-27.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-27.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-29.out b/c++/carla-lilv/serd-0.18.0/tests/test-29.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-29.out rename to c++/carla-lilv/serd-0.18.0/tests/test-29.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-29.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-29.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-29.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-29.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-30.out b/c++/carla-lilv/serd-0.18.0/tests/test-30.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-30.out rename to c++/carla-lilv/serd-0.18.0/tests/test-30.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-30.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-30.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-30.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-30.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-backspace.out b/c++/carla-lilv/serd-0.18.0/tests/test-backspace.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-backspace.out rename to c++/carla-lilv/serd-0.18.0/tests/test-backspace.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-backspace.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-backspace.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-backspace.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-backspace.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-bad-utf8.out b/c++/carla-lilv/serd-0.18.0/tests/test-bad-utf8.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-bad-utf8.out rename to c++/carla-lilv/serd-0.18.0/tests/test-bad-utf8.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-bad-utf8.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-bad-utf8.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-bad-utf8.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-bad-utf8.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-base-query.out b/c++/carla-lilv/serd-0.18.0/tests/test-base-query.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-base-query.out rename to c++/carla-lilv/serd-0.18.0/tests/test-base-query.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-base-query.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-base-query.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-base-query.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-base-query.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-blank-cont.out b/c++/carla-lilv/serd-0.18.0/tests/test-blank-cont.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-blank-cont.out rename to c++/carla-lilv/serd-0.18.0/tests/test-blank-cont.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-blank-cont.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-blank-cont.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-blank-cont.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-blank-cont.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-blank-in-list.out b/c++/carla-lilv/serd-0.18.0/tests/test-blank-in-list.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-blank-in-list.out rename to c++/carla-lilv/serd-0.18.0/tests/test-blank-in-list.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-blank-in-list.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-blank-in-list.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-blank-in-list.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-blank-in-list.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-bom.out b/c++/carla-lilv/serd-0.18.0/tests/test-bom.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-bom.out rename to c++/carla-lilv/serd-0.18.0/tests/test-bom.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-bom.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-bom.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-bom.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-bom.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-cr.out b/c++/carla-lilv/serd-0.18.0/tests/test-cr.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-cr.out rename to c++/carla-lilv/serd-0.18.0/tests/test-cr.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-cr.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-cr.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-cr.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-cr.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-delete.out b/c++/carla-lilv/serd-0.18.0/tests/test-delete.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-delete.out rename to c++/carla-lilv/serd-0.18.0/tests/test-delete.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-delete.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-delete.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-delete.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-delete.ttl diff --git a/c++/carla-lilv/serd-0.18.0/tests/test-digit-start-pname.out b/c++/carla-lilv/serd-0.18.0/tests/test-digit-start-pname.out new file mode 100644 index 0000000..66eab7d --- /dev/null +++ b/c++/carla-lilv/serd-0.18.0/tests/test-digit-start-pname.out @@ -0,0 +1 @@ + . diff --git a/c++/carla-lilv/serd-0.18.0/tests/test-digit-start-pname.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-digit-start-pname.ttl new file mode 100644 index 0000000..6ca8ade --- /dev/null +++ b/c++/carla-lilv/serd-0.18.0/tests/test-digit-start-pname.ttl @@ -0,0 +1,3 @@ +@prefix eg: . + +eg:1thing a eg:Thing . \ No newline at end of file diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-eof-at-page-end.out b/c++/carla-lilv/serd-0.18.0/tests/test-eof-at-page-end.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-eof-at-page-end.out rename to c++/carla-lilv/serd-0.18.0/tests/test-eof-at-page-end.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-eof-at-page-end.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-eof-at-page-end.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-eof-at-page-end.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-eof-at-page-end.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-escapes.out b/c++/carla-lilv/serd-0.18.0/tests/test-escapes.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-escapes.out rename to c++/carla-lilv/serd-0.18.0/tests/test-escapes.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-escapes.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-escapes.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-escapes.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-escapes.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-id.out b/c++/carla-lilv/serd-0.18.0/tests/test-id.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-id.out rename to c++/carla-lilv/serd-0.18.0/tests/test-id.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-id.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-id.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-id.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-id.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-lang.out b/c++/carla-lilv/serd-0.18.0/tests/test-lang.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-lang.out rename to c++/carla-lilv/serd-0.18.0/tests/test-lang.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-lang.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-lang.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-lang.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-lang.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-list-in-blank.out b/c++/carla-lilv/serd-0.18.0/tests/test-list-in-blank.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-list-in-blank.out rename to c++/carla-lilv/serd-0.18.0/tests/test-list-in-blank.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-list-in-blank.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-list-in-blank.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-list-in-blank.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-list-in-blank.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-list-subject.out b/c++/carla-lilv/serd-0.18.0/tests/test-list-subject.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-list-subject.out rename to c++/carla-lilv/serd-0.18.0/tests/test-list-subject.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-list-subject.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-list-subject.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-list-subject.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-list-subject.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-list.out b/c++/carla-lilv/serd-0.18.0/tests/test-list.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-list.out rename to c++/carla-lilv/serd-0.18.0/tests/test-list.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-list.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-list.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-list.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-list.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-long-string.out b/c++/carla-lilv/serd-0.18.0/tests/test-long-string.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-long-string.out rename to c++/carla-lilv/serd-0.18.0/tests/test-long-string.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-long-string.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-long-string.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-long-string.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-long-string.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-no-spaces.out b/c++/carla-lilv/serd-0.18.0/tests/test-no-spaces.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-no-spaces.out rename to c++/carla-lilv/serd-0.18.0/tests/test-no-spaces.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-no-spaces.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-no-spaces.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-no-spaces.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-no-spaces.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-num.out b/c++/carla-lilv/serd-0.18.0/tests/test-num.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-num.out rename to c++/carla-lilv/serd-0.18.0/tests/test-num.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-num.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-num.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-num.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-num.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-out-of-range-unicode.out b/c++/carla-lilv/serd-0.18.0/tests/test-out-of-range-unicode.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-out-of-range-unicode.out rename to c++/carla-lilv/serd-0.18.0/tests/test-out-of-range-unicode.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-out-of-range-unicode.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-out-of-range-unicode.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-out-of-range-unicode.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-out-of-range-unicode.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-prefix.out b/c++/carla-lilv/serd-0.18.0/tests/test-prefix.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-prefix.out rename to c++/carla-lilv/serd-0.18.0/tests/test-prefix.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-prefix.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-prefix.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-prefix.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-prefix.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-pretty.out b/c++/carla-lilv/serd-0.18.0/tests/test-pretty.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-pretty.out rename to c++/carla-lilv/serd-0.18.0/tests/test-pretty.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-pretty.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-pretty.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-pretty.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-pretty.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-rel.out b/c++/carla-lilv/serd-0.18.0/tests/test-rel.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-rel.out rename to c++/carla-lilv/serd-0.18.0/tests/test-rel.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-rel.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-rel.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-rel.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-rel.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-semi-dot.out b/c++/carla-lilv/serd-0.18.0/tests/test-semi-dot.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-semi-dot.out rename to c++/carla-lilv/serd-0.18.0/tests/test-semi-dot.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-semi-dot.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-semi-dot.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-semi-dot.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-semi-dot.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-uri.out b/c++/carla-lilv/serd-0.18.0/tests/test-uri.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-uri.out rename to c++/carla-lilv/serd-0.18.0/tests/test-uri.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-uri.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-uri.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-uri.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-uri.ttl diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-utf8-uri.out b/c++/carla-lilv/serd-0.18.0/tests/test-utf8-uri.out similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-utf8-uri.out rename to c++/carla-lilv/serd-0.18.0/tests/test-utf8-uri.out diff --git a/c++/carla-lilv/serd-0.14.0/tests/test-utf8-uri.ttl b/c++/carla-lilv/serd-0.18.0/tests/test-utf8-uri.ttl similarity index 100% rename from c++/carla-lilv/serd-0.14.0/tests/test-utf8-uri.ttl rename to c++/carla-lilv/serd-0.18.0/tests/test-utf8-uri.ttl diff --git a/c++/carla-lilv/serd-0.18.0/waf b/c++/carla-lilv/serd-0.18.0/waf new file mode 100755 index 0000000000000000000000000000000000000000..3088b02b08b876672d8dfb2aecec7139056451ff GIT binary patch literal 72589 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 literal 0 HcmV?d00001 diff --git a/c++/carla-lilv/serd-0.14.0/wscript b/c++/carla-lilv/serd-0.18.0/wscript similarity index 63% rename from c++/carla-lilv/serd-0.14.0/wscript rename to c++/carla-lilv/serd-0.18.0/wscript index d09612f..206a8d9 100644 --- a/c++/carla-lilv/serd-0.14.0/wscript +++ b/c++/carla-lilv/serd-0.18.0/wscript @@ -3,13 +3,12 @@ import glob import os import shutil import subprocess -import sys from waflib.extras import autowaf as autowaf import waflib.Logs as Logs, waflib.Options as Options # Version of this package (even if built as a child) -SERD_VERSION = '0.14.0' +SERD_VERSION = '0.18.0' SERD_MAJOR_VERSION = '0' # Library version (UNIX style major, minor, micro) @@ -30,39 +29,45 @@ out = 'build' def options(opt): opt.load('compiler_c') autowaf.set_options(opt) - opt.add_option('--no-utils', action='store_true', default=False, dest='no_utils', - help="Do not build command line utilities") - opt.add_option('--test', action='store_true', default=False, dest='build_tests', - help="Build unit tests") - opt.add_option('--stack-check', action='store_true', default=False, dest='stack_check', - help="Include runtime stack sanity checks") - opt.add_option('--static', action='store_true', default=False, dest='static', - help="Build static library") - opt.add_option('--largefile', action='store_true', default=False, dest='largefile', - help="Build with large file support on 32-bit systems") + opt.add_option('--no-utils', action='store_true', dest='no_utils', + help='Do not build command line utilities') + opt.add_option('--test', action='store_true', dest='build_tests', + help='Build unit tests') + opt.add_option('--stack-check', action='store_true', dest='stack_check', + help='Include runtime stack sanity checks') + opt.add_option('--static', action='store_true', dest='static', + help='Build static library') + opt.add_option('--no-shared', action='store_true', dest='no_shared', + help='Do not build shared library') + opt.add_option('--static-progs', action='store_true', dest='static_progs', + help='Build programs as static binaries') + opt.add_option('--largefile', action='store_true', dest='largefile', + help='Build with large file support on 32-bit systems') def configure(conf): conf.load('compiler_c') autowaf.configure(conf) + autowaf.set_c99_mode(conf) autowaf.display_header('Serd Configuration') - if conf.env['MSVC_COMPILER']: - conf.env.append_unique('CFLAGS', ['-TP', '-MD']) - else: - conf.env.append_unique('CFLAGS', '-std=c99') + conf.env.BUILD_TESTS = Options.options.build_tests + conf.env.BUILD_UTILS = not Options.options.no_utils + conf.env.BUILD_SHARED = not Options.options.no_shared + conf.env.STATIC_PROGS = Options.options.static_progs + conf.env.BUILD_STATIC = (Options.options.static or + Options.options.static_progs) - conf.env['BUILD_TESTS'] = Options.options.build_tests - conf.env['BUILD_UTILS'] = not Options.options.no_utils - conf.env['BUILD_STATIC'] = Options.options.static + if not conf.env.BUILD_SHARED and not conf.env.BUILD_STATIC: + conf.fatal('Neither a shared nor a static build requested') if Options.options.stack_check: autowaf.define(conf, 'SERD_STACK_CHECK', SERD_VERSION) if Options.options.largefile: - conf.env.append_unique('CFLAGS', '-D_FILE_OFFSET_BITS=64') + conf.env.append_unique('DEFINES', ['_FILE_OFFSET_BITS=64']) # Check for gcov library (for test coverage) - if conf.env['BUILD_TESTS']: + if conf.env.BUILD_TESTS: conf.check_cc(lib='gcov', define_name='HAVE_GCOV', mandatory=False) @@ -78,33 +83,33 @@ def configure(conf): conf.check(function_name='posix_memalign', header_name='stdlib.h', define_name='HAVE_POSIX_MEMALIGN', - cflags='-D_POSIX_C_SOURCE=201112L', + defines=['_POSIX_C_SOURCE=201112L'], mandatory=False) # Check for posix_fadvise conf.check(function_name='posix_fadvise', header_name='fcntl.h', define_name='HAVE_POSIX_FADVISE', - cflags='-D_POSIX_C_SOURCE=201112L', + defines=['_POSIX_C_SOURCE=201112L'], mandatory=False) # Check for fileno conf.check(function_name='fileno', header_name='stdio.h', define_name='HAVE_FILENO', - cflags='-D_POSIX_C_SOURCE=201112L', + defines=['_POSIX_C_SOURCE=201112L'], mandatory=False) autowaf.define(conf, 'SERD_VERSION', SERD_VERSION) conf.write_config_header('serd_config.h', remove=False) - conf.env['INCLUDES_SERD'] = ['%s/serd-%s' % (conf.env['INCLUDEDIR'], - SERD_MAJOR_VERSION)] - conf.env['LIBPATH_SERD'] = [conf.env['LIBDIR']] - conf.env['LIB_SERD'] = ['serd-%s' % SERD_MAJOR_VERSION]; + conf.env.INCLUDES_SERD = ['%s/serd-%s' % (conf.env.INCLUDEDIR, + SERD_MAJOR_VERSION)] + conf.env.LIBPATH_SERD = [conf.env.LIBDIR] + conf.env.LIB_SERD = ['serd-%s' % SERD_MAJOR_VERSION]; - autowaf.display_msg(conf, "Utilities", str(conf.env['BUILD_UTILS'])) - autowaf.display_msg(conf, "Unit tests", str(conf.env['BUILD_TESTS'])) + autowaf.display_msg(conf, 'Utilities', str(conf.env.BUILD_UTILS)) + autowaf.display_msg(conf, 'Unit tests', str(conf.env.BUILD_TESTS)) print('') lib_source = [ @@ -125,90 +130,95 @@ def build(bld): autowaf.build_pc(bld, 'SERD', SERD_VERSION, SERD_MAJOR_VERSION, [], {'SERD_MAJOR_VERSION' : SERD_MAJOR_VERSION}) - libflags = [ '-fvisibility=hidden' ] - libs = [ 'm' ] + libflags = ['-fvisibility=hidden'] + libs = ['m'] defines = [] - if bld.env['MSVC_COMPILER']: + if bld.env.MSVC_COMPILER: libflags = [] libs = [] defines = ['snprintf=_snprintf'] # Shared Library - obj = bld(features = 'c cshlib', - export_includes = ['.'], - source = lib_source, - includes = ['.', './src'], - lib = libs, - name = 'libserd', - target = 'serd-%s' % SERD_MAJOR_VERSION, - vnum = SERD_LIB_VERSION, - install_path = '${LIBDIR}', - defines = defines, - cflags = libflags + [ '-DSERD_SHARED', - '-DSERD_INTERNAL' ]) + if bld.env.BUILD_SHARED: + bld(features = 'c cshlib', + export_includes = ['.'], + source = lib_source, + includes = ['.', './src'], + lib = libs, + name = 'libserd', + target = 'serd-%s' % SERD_MAJOR_VERSION, + vnum = SERD_LIB_VERSION, + install_path = '${LIBDIR}', + defines = defines + ['SERD_SHARED', 'SERD_INTERNAL'], + cflags = libflags) # Static library - if bld.env['BUILD_STATIC']: - obj = bld(features = 'c cstlib', - export_includes = ['.'], - source = lib_source, - includes = ['.', './src'], - lib = libs, - name = 'libserd_static', - target = 'serd-%s' % SERD_MAJOR_VERSION, - vnum = SERD_LIB_VERSION, - install_path = '${LIBDIR}', - defines = defines, - cflags = ['-DSERD_INTERNAL']) - - if bld.env['BUILD_TESTS']: + if bld.env.BUILD_STATIC: + bld(features = 'c cstlib', + export_includes = ['.'], + source = lib_source, + includes = ['.', './src'], + lib = libs, + name = 'libserd_static', + target = 'serd-%s' % SERD_MAJOR_VERSION, + vnum = SERD_LIB_VERSION, + install_path = '${LIBDIR}', + defines = defines + ['SERD_INTERNAL']) + + if bld.env.BUILD_TESTS: test_libs = libs test_cflags = [''] if bld.is_defined('HAVE_GCOV'): test_libs += ['gcov'] test_cflags += ['-fprofile-arcs', '-ftest-coverage'] - # Static library (for unit test code coverage) - obj = bld(features = 'c cstlib', - source = lib_source, - includes = ['.', './src'], - lib = test_libs, - name = 'libserd_profiled', - target = 'serd_profiled', - install_path = '', - defines = defines, - cflags = test_cflags + ['-DSERD_INTERNAL']) - - # Unit test serdi - obj = bld(features = 'c cprogram', - source = 'src/serdi.c', - includes = ['.', './src'], - use = 'libserd_profiled', - lib = test_libs, - target = 'serdi_static', - install_path = '', - defines = defines, - cflags = test_cflags) + # Profiled static library for test coverage + bld(features = 'c cstlib', + source = lib_source, + includes = ['.', './src'], + lib = test_libs, + name = 'libserd_profiled', + target = 'serd_profiled', + install_path = '', + defines = defines + ['SERD_INTERNAL'], + cflags = test_cflags) + + # Static profiled serdi for tests + bld(features = 'c cprogram', + source = 'src/serdi.c', + includes = ['.', './src'], + use = 'libserd_profiled', + lib = test_libs, + target = 'serdi_static', + install_path = '', + defines = defines, + cflags = test_cflags) # Unit test program - obj = bld(features = 'c cprogram', - source = 'tests/serd_test.c', - includes = ['.', './src'], - use = 'libserd_profiled', - lib = test_libs, - target = 'serd_test', - install_path = '', - defines = defines, - cflags = test_cflags) + bld(features = 'c cprogram', + source = 'tests/serd_test.c', + includes = ['.', './src'], + use = 'libserd_profiled', + lib = test_libs, + target = 'serd_test', + install_path = '', + defines = defines, + cflags = test_cflags) # Utilities - if bld.env['BUILD_UTILS']: + if bld.env.BUILD_UTILS: obj = bld(features = 'c cprogram', source = 'src/serdi.c', + target = 'serdi', includes = ['.', './src'], use = 'libserd', - target = 'serdi', + lib = libs, install_path = '${BINDIR}') + if not bld.env.BUILD_SHARED or bld.env.STATIC_PROGS: + obj.use = 'libserd_static' + if bld.env.STATIC_PROGS: + obj.env.SHLIB_MARKER = obj.env.STLIB_MARKER + obj.linkflags = ['-static'] # Documentation autowaf.build_dox(bld, 'SERD', SERD_VERSION, top, out) @@ -217,7 +227,7 @@ def build(bld): bld.install_files('${MANDIR}/man1', 'doc/serdi.1') bld.add_post_fun(autowaf.run_ldconfig) - if bld.env['DOCS']: + if bld.env.DOCS: bld.add_post_fun(fix_docs) def lint(ctx): @@ -250,32 +260,14 @@ def amalgamate(ctx): amalgamation.close() for i in ['c', 'h']: - Logs.info("Wrote build/serd.%s" % i) - -def build_dir(ctx, subdir): - if autowaf.is_child(): - return os.path.join('build', APPNAME, subdir) - else: - return os.path.join('build', subdir) + Logs.info('Wrote build/serd.%s' % i) def fix_docs(ctx): - try: - top = os.getcwd() - os.chdir(build_dir(ctx, 'doc/html')) - os.system("sed -i 's/SERD_API //' group__serd.html") - os.system("sed -i 's/SERD_DEPRECATED //' group__serd.html") - os.system("sed -i 's/href=\"doc\/style.css\"/href=\"style.css\"/' group__serd.html") - os.remove('index.html') - os.symlink('group__serd.html', 'index.html') - os.chdir(top) - os.chdir(build_dir(ctx, 'doc/man/man3')) - os.system("sed -i 's/SERD_API //' serd.3") - os.chdir(top) - except: - Logs.error("Failed to fix up %s documentation" % APPNAME) + if ctx.cmd == 'build': + autowaf.make_simple_dox(APPNAME) def upload_docs(ctx): - os.system("rsync -ravz --delete -e ssh build/doc/html/ drobilla@drobilla.net:~/drobilla.net/docs/serd/") + os.system('rsync -ravz --delete -e ssh build/doc/html/ drobilla@drobilla.net:~/drobilla.net/docs/serd/') def file_equals(patha, pathb, subst_from='', subst_to=''): fa = open(patha, 'rU') @@ -288,7 +280,7 @@ def file_equals(patha, pathb, subst_from='', subst_to=''): return True def test(ctx): - blddir = build_dir(ctx, 'tests') + blddir = autowaf.build_dir(APPNAME, 'tests') try: os.makedirs(blddir) except: @@ -334,6 +326,7 @@ def test(ctx): 0, name='serdi-cmd-good') autowaf.run_tests(ctx, APPNAME, [ + 'serdi_static -q file://%s/tests/bad-id-clash.ttl > %s' % (srcdir, nul), 'serdi_static > %s' % nul, 'serdi_static ftp://example.org/unsupported.ttl > %s' % nul, 'serdi_static -i > %s' % nul, @@ -380,8 +373,6 @@ def test(ctx): num = 0 for test in thru_tests: num += 1 - bulk = (num % 2 == 0) - full = (num % 5 == 0) flags = '' if (num % 2 == 0): flags += '-b' @@ -389,6 +380,8 @@ def test(ctx): flags += ' -f' if (num % 3 == 0): flags += ' -r http://www.w3.org/' + if (num % 7 == 0): + flags += ' -e' base_uri = 'http://www.w3.org/2001/sw/DataAccess/df1/' + test.replace('\\', '/') out_filename = test + '.thru' commands += [ diff --git a/c++/carla-lilv/serd.c b/c++/carla-lilv/serd.c index 16805ec..0399493 100644 --- a/c++/carla-lilv/serd.c +++ b/c++/carla-lilv/serd.c @@ -15,9 +15,9 @@ * For a full copy of the GNU General Public License see the COPYING file */ -#include "serd-0.14.0/src/env.c" -#include "serd-0.14.0/src/node.c" -#include "serd-0.14.0/src/reader.c" -#include "serd-0.14.0/src/string.c" -#include "serd-0.14.0/src/uri.c" -#include "serd-0.14.0/src/writer.c" +#include "src/env.c" +#include "src/node.c" +#include "src/reader.c" +#include "src/string.c" +#include "src/uri.c" +#include "src/writer.c" diff --git a/c++/carla-lilv/sord-0.8.0/AUTHORS b/c++/carla-lilv/sord-0.10.0/AUTHORS similarity index 100% rename from c++/carla-lilv/sord-0.8.0/AUTHORS rename to c++/carla-lilv/sord-0.10.0/AUTHORS diff --git a/c++/carla-lilv/sord-0.8.0/COPYING b/c++/carla-lilv/sord-0.10.0/COPYING similarity index 100% rename from c++/carla-lilv/sord-0.8.0/COPYING rename to c++/carla-lilv/sord-0.10.0/COPYING diff --git a/c++/carla-lilv/sord-0.10.0/INSTALL b/c++/carla-lilv/sord-0.10.0/INSTALL new file mode 100644 index 0000000..623cddd --- /dev/null +++ b/c++/carla-lilv/sord-0.10.0/INSTALL @@ -0,0 +1,59 @@ +Installation Instructions +========================= + +Basic Installation +------------------ + +Building this software requires only Python. To install with default options: + + ./waf configure + ./waf + ./waf install + +You may need to become root for the install stage, for example: + + sudo ./waf install + +Configuration Options +--------------------- + +All supported options can be viewed using the command: + + ./waf --help + +Most options only need to be passed during the configure stage, for example: + + ./waf configure --prefix=/usr + ./waf + ./waf install + +Compiler Configuration +---------------------- + +Several standard environment variables can be used to control how compilers are +invoked: + + * CC: Path to C compiler + * CFLAGS: C compiler options + * CXX: Path to C++ compiler + * CXXFLAGS: C++ compiler options + * CPPFLAGS: C preprocessor options + * LINKFLAGS: Linker options + +Installation Directories +------------------------ + +The --prefix option (or the PREFIX environment variable) can be used to change +the prefix which all files are installed under. There are also several options +allowing for more fine-tuned control, see the --help output for details. + +Packaging +--------- + +Everything can be installed to a specific root directory by passing a --destdir +option to the install stage (or setting the DESTDIR environment variable), +which adds a prefix to all install paths. For example: + + ./waf configure --prefix=/usr + ./waf + ./waf install --destdir=/tmp/package diff --git a/c++/carla-lilv/sord-0.8.0/NEWS b/c++/carla-lilv/sord-0.10.0/NEWS similarity index 63% rename from c++/carla-lilv/sord-0.8.0/NEWS rename to c++/carla-lilv/sord-0.10.0/NEWS index 9612eb2..4c7f6a8 100644 --- a/c++/carla-lilv/sord-0.8.0/NEWS +++ b/c++/carla-lilv/sord-0.10.0/NEWS @@ -1,3 +1,21 @@ +sord (0.10.0) stable; + + * Add error callback to world for custom error reporting + * Performance and space (per node) improvements + * SSE4.2 accelerated hashing for node interning, where available + * Make all 'zix' symbols private to avoid symbol clashes in static builds + * Remove problematic "Loaded n statements" output from serdi + * Strip down API documentation to a single clean page + * Fix various hyper-strict warnings + * Do not require a C++ compiler to build + * Add option to build utilities as static binaries + * Upgrade to waf 1.7.2 + * sordmm.hpp: Add indices and graphs parameters to Model constructor + * sordmm.hpp: Remove overzealous URI scheme assertion + * sordmm.hpp: Correctly handle Sord::Node self-assignment + + -- David Robillard Thu, 23 Aug 2012 00:19:51 -0400 + sord (0.8.0) stable; * Use path variables in pkgconfig files diff --git a/c++/carla-lilv/sord-0.8.0/PACKAGING b/c++/carla-lilv/sord-0.10.0/PACKAGING similarity index 100% rename from c++/carla-lilv/sord-0.8.0/PACKAGING rename to c++/carla-lilv/sord-0.10.0/PACKAGING diff --git a/c++/carla-lilv/sord-0.8.0/README b/c++/carla-lilv/sord-0.10.0/README similarity index 100% rename from c++/carla-lilv/sord-0.8.0/README rename to c++/carla-lilv/sord-0.10.0/README diff --git a/c++/carla-lilv/sord-0.8.0/doc/reference.doxygen.in b/c++/carla-lilv/sord-0.10.0/doc/reference.doxygen.in similarity index 73% rename from c++/carla-lilv/sord-0.8.0/doc/reference.doxygen.in rename to c++/carla-lilv/sord-0.10.0/doc/reference.doxygen.in index da82e88..64577d0 100644 --- a/c++/carla-lilv/sord-0.8.0/doc/reference.doxygen.in +++ b/c++/carla-lilv/sord-0.10.0/doc/reference.doxygen.in @@ -1,14 +1,14 @@ -# Doxyfile 1.6.1 +# Doxyfile 1.8.1.1 # This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project +# doxygen (www.doxygen.org) for a project. # -# All text after a hash (#) is considered a comment and will be ignored +# All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") +# Values that contain spaces should be placed between quotes (" "). #--------------------------------------------------------------------------- # Project related configuration options @@ -22,8 +22,9 @@ DOXYFILE_ENCODING = UTF-8 -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. PROJECT_NAME = Sord @@ -33,6 +34,19 @@ PROJECT_NAME = Sord PROJECT_NUMBER = @SORD_VERSION@ +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location @@ -57,7 +71,7 @@ CREATE_SUBDIRS = NO # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English @@ -126,7 +140,7 @@ STRIP_FROM_PATH = STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems +# (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO @@ -181,6 +195,13 @@ TAB_SIZE = 4 ALIASES = +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list @@ -207,22 +228,32 @@ OPTIMIZE_FOR_FORTRAN = NO OPTIMIZE_OUTPUT_VHDL = NO -# Doxygen selects the parser to use depending on the extension of the files it parses. -# With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this tag. -# The format is ext=language, where ext is a file extension, and language is one of -# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, -# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat -# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), -# use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration +# func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO @@ -240,7 +271,7 @@ SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) -# will make doxygen to replace the get and set methods by a property in the +# will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. @@ -262,6 +293,22 @@ DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = YES + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = YES + # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct @@ -278,16 +325,27 @@ TYPEDEF_HIDES_STRUCT = YES # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penality. +# causing a significant performance penalty. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will rougly double the +# a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols +# corresponding to a cache size of 2^16 = 65536 symbols. SYMBOL_CACHE_SIZE = 0 +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- @@ -304,6 +362,10 @@ EXTRACT_ALL = YES EXTRACT_PRIVATE = NO +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. @@ -326,7 +388,7 @@ EXTRACT_LOCAL_METHODS = NO # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default -# anonymous namespace are hidden. +# anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = NO @@ -386,6 +448,12 @@ HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. @@ -405,7 +473,13 @@ SORT_MEMBER_DOCS = NO SORT_BRIEF_DOCS = NO -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO @@ -425,6 +499,15 @@ SORT_GROUP_NAMES = NO SORT_BY_SCOPE_NAME = YES +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. @@ -455,10 +538,10 @@ GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in +# the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the +# The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. @@ -470,12 +553,6 @@ MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. @@ -499,15 +576,25 @@ SHOW_NAMESPACES = NO FILE_VERSION_FILTER = -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by -# doxygen. The layout file controls the global structure of the generated output files -# in an output format independent way. The create the layout file that represents -# doxygen's defaults, run doxygen with the -l option. You can optionally specify a -# file name after the option, if omitted DoxygenLayout.xml will be used as the name -# of the layout file. +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = @SORD_SRCDIR@/doc/layout.xml +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. + +CITE_BIB_FILES = + #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- @@ -536,13 +623,13 @@ WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES -# This WARN_NO_PARAMDOC option can be abled to get warnings for +# The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. -WARN_NO_PARAMDOC = NO +WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text @@ -582,8 +669,9 @@ INPUT_ENCODING = UTF-8 # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = @@ -593,14 +681,16 @@ FILE_PATTERNS = RECURSIVE = NO -# The EXCLUDE tag can be used to specify files and/or directories that should +# The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. EXCLUDE = -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO @@ -664,8 +754,8 @@ INPUT_FILTER = # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = @@ -675,6 +765,14 @@ FILTER_PATTERNS = FILTER_SOURCE_FILES = NO +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- @@ -693,7 +791,7 @@ INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. +# fragments. Normal C, C++ and Fortran comments will always remain visible. STRIP_CODE_COMMENTS = YES @@ -729,7 +827,7 @@ USE_HTAGS = NO # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. -VERBATIM_HEADERS = YES +VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index @@ -777,7 +875,14 @@ HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a -# standard header. +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! HTML_HEADER = @@ -792,24 +897,67 @@ HTML_FOOTER = # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! +# style sheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = @SORD_SRCDIR@/doc/style.css + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 160 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. -HTML_STYLESHEET = doc/style.css +HTML_COLORSTYLE_GAMMA = 80 -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. -HTML_ALIGN_MEMBERS = YES +HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). +# page has loaded. HTML_DYNAMIC_SECTIONS = NO +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of +# entries shown in the various tree structured indices initially; the user +# can expand and collapse entries dynamically later on. Doxygen will expand +# the tree to such a level that at most the specified number of entries are +# visible (unless a fully collapsed tree already exceeds this amount). +# So setting the number of entries 1 will produce a full collapsed tree by +# default. 0 is a special value representing an infinite number of entries +# and will result in a full expanded tree by default. + +HTML_INDEX_NUM_ENTRIES = 100 + # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). @@ -818,7 +966,8 @@ HTML_DYNAMIC_SECTIONS = NO # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. GENERATE_DOCSET = NO @@ -836,6 +985,16 @@ DOCSET_FEEDNAME = "Doxygen generated docs" DOCSET_BUNDLE_ID = org.doxygen.Project +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) @@ -880,10 +1039,10 @@ BINARY_TOC = NO TOC_EXPAND = NO -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER -# are set, an additional index file will be generated that can be used as input for -# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated -# HTML documentation. +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO @@ -905,20 +1064,24 @@ QHP_NAMESPACE = QHP_VIRTUAL_FOLDER = doc -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. -# For more information please see +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see -# Qt Help Project / Custom Filters. +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's # filter section matches. -# Qt Help Project / Filter Attributes. +# +# Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = @@ -929,16 +1092,30 @@ QHP_SECT_FILTER_ATTRS = QHG_LOCATION = -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. -DISABLE_INDEX = NO +GENERATE_ECLIPSEHELP = NO -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. -ENUM_VALUES_PER_LINE = 4 +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = YES # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. @@ -947,13 +1124,17 @@ ENUM_VALUES_PER_LINE = 4 # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = NO -# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list. +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. -USE_INLINE_TREES = NO +ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree @@ -961,6 +1142,11 @@ USE_INLINE_TREES = NO TREEVIEW_WIDTH = 250 +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need @@ -969,13 +1155,60 @@ TREEVIEW_WIDTH = 250 FORMULA_FONTSIZE = 10 -# When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) -# there is already a search function so this one should typically -# be disabled. +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. +# However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = NO +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- @@ -993,6 +1226,9 @@ LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. LATEX_CMD_NAME = latex @@ -1009,7 +1245,7 @@ MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and +# by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide @@ -1026,6 +1262,13 @@ EXTRA_PACKAGES = LATEX_HEADER = +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references @@ -1052,10 +1295,19 @@ LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO -# If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- @@ -1087,7 +1339,7 @@ COMPACT_RTF = NO RTF_HYPERLINKS = NO -# Load stylesheet definitions from file. Syntax is similar to doxygen's +# Load style sheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. @@ -1232,7 +1484,7 @@ MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. +# pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES @@ -1262,15 +1514,15 @@ PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES @@ -1278,22 +1530,18 @@ SKIP_FUNCTION_MACROS = YES # Configuration::additions related to external references #--------------------------------------------------------------------------- -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. TAGFILES = @@ -1326,9 +1574,8 @@ PERL_PATH = /usr/bin/perl # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = NO @@ -1354,14 +1601,20 @@ HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO -# By default doxygen will write a font called FreeSans.ttf to the output -# directory and reference it in all dot files that doxygen generates. This -# font does not include all possible unicode characters however, so when you need -# these (or just want a differently looking font) you can specify the font name -# using DOT_FONTNAME. You need need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -# containing the font. +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. DOT_FONTNAME = FreeSans @@ -1370,17 +1623,16 @@ DOT_FONTNAME = FreeSans DOT_FONTSIZE = 10 -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot -# can find it using this tag. +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. +# CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = NO @@ -1402,6 +1654,15 @@ GROUP_GRAPHS = YES UML_LOOK = NO +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. @@ -1438,23 +1699,34 @@ CALL_GRAPH = NO CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. +# will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = NO -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. -DIRECTORY_GRAPH = YES +DIRECTORY_GRAPH = NO # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. @@ -1466,6 +1738,12 @@ DOT_PATH = DOTFILE_DIRS = +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is diff --git a/c++/carla-lilv/sord-0.8.0/doc/sord_validate.1 b/c++/carla-lilv/sord-0.10.0/doc/sord_validate.1 similarity index 100% rename from c++/carla-lilv/sord-0.8.0/doc/sord_validate.1 rename to c++/carla-lilv/sord-0.10.0/doc/sord_validate.1 diff --git a/c++/carla-lilv/sord-0.8.0/doc/sordi.1 b/c++/carla-lilv/sord-0.10.0/doc/sordi.1 similarity index 100% rename from c++/carla-lilv/sord-0.8.0/doc/sordi.1 rename to c++/carla-lilv/sord-0.10.0/doc/sordi.1 diff --git a/c++/carla-lilv/sratom-0.2.0/doc/style.css b/c++/carla-lilv/sord-0.10.0/doc/style.css similarity index 95% rename from c++/carla-lilv/sratom-0.2.0/doc/style.css rename to c++/carla-lilv/sord-0.10.0/doc/style.css index 5cdf97b..4c62b46 100644 --- a/c++/carla-lilv/sratom-0.2.0/doc/style.css +++ b/c++/carla-lilv/sord-0.10.0/doc/style.css @@ -1,24 +1,24 @@ body { - font-size: 100%; + font-size: medium; font-family: sans-serif; } #top { background-color: #F3F3F3; margin: 0; - padding: 0; + padding: 0; border-bottom: 1px solid #DDD; - margin-bottom: 1ex; - font-size: 180%; - font-weight: bold; + margin-bottom: 1ex; + font-size: xx-large; + font-weight: bold; } div.header { - display: none; + display: none; } .tabs { - display: none; + display: none; } h1 h2 h3 h4 h5 h6 { @@ -113,33 +113,24 @@ div.navtab { /* @group Link Styling */ a { - color: #3D578C; + color: #3D8C57; text-decoration: none; } .contents a:visited { - color: #4665A2; + color: #50755E; } a:hover { text-decoration: underline; } -a.qindex { -} - a.qindexHL { background-color: #9CAFD4; color: #FFF; border: 1px double #869DCA; } -a.el { -} - -a.elRef { -} - a.code { color: #4665A2; } @@ -245,7 +236,7 @@ div.center img { address.footer { text-align: right; - padding-right: 12px; + padding: 0 0.25em 0.25em 0; } img.footer { @@ -324,7 +315,7 @@ hr.footer { /* @group Member Descriptions */ table.memberdecls { border-spacing: 0; - font-size: 94%; + font-size: small; } .mdescLeft,.mdescRight,.memItemLeft,.memItemRight,.memTemplItemLeft,.memTemplItemRight,.memTemplParams { @@ -338,7 +329,7 @@ table.memberdecls { } .memItemLeft,.memItemRight,.memTemplParams { - border-top: 1px solid #EEE; + border-top: 1px solid #DDD; } .memItemLeft,.memTemplItemLeft { @@ -372,6 +363,7 @@ table.memberdecls { .memitem { padding: 0; margin: 1ex 0 2ex 0; + border: 1px solid #CCC; } .memname { @@ -380,9 +372,8 @@ table.memberdecls { } .memproto { - border-top: 1px solid #DDD; + border-bottom: 1px solid #DDD; padding: 0.5ex; - color: #253555; font-weight: bold; background-color: #F3F3F3; } @@ -567,6 +558,6 @@ div.header { div.headertitle { padding: 5px 5px 5px 10px; - font-size: 180%; - font-weight: bold; + font-size: 180%; + font-weight: bold; } diff --git a/c++/carla-lilv/sord-0.10.0/sord-0.10.0.tar.bz2.sig b/c++/carla-lilv/sord-0.10.0/sord-0.10.0.tar.bz2.sig new file mode 100644 index 0000000000000000000000000000000000000000..4869c52b1998803264b6fff5a6ddfe53dc179a22 GIT binary patch literal 543 zcmV+)0^t3L0vrSY0SEvF1p-htu#f->2@p1Ncq*IoX!G9u5CGt|omZpyr!o#U^p zq-6I!VxGEKAS@5dH|5zhy#53&+*mZL@?DW6KjJ_B@m=G>puB`}Wr3f~ znC+{R$cpFO9g6-+EOXeTT93S8t81;uysik%$kbyE>)u?8MPibqI>qPOm!Tc_obj(), _c_obj); + Node& operator=(const Node& other) { + if (&other != this) { + if (_c_obj) { + sord_node_free(_world->c_obj(), _c_obj); + } + _world = other._world; + _c_obj = other._c_obj ? sord_node_copy(other._c_obj) : NULL; } - _world = other._world; - _c_obj = other._c_obj ? sord_node_copy(other._c_obj) : NULL; return *this; } @@ -246,10 +248,6 @@ Node::Node(World& world, Type type, const std::string& s) { switch (type) { case URI: - assert(s.find(":") == std::string::npos - || s.substr(0, 5) == "http:" - || s.substr(0, 5) == "file:" - || s.substr(0, 4) == "urn:"); _c_obj = sord_new_uri( world.world(), (const unsigned char*)s.c_str()); break; @@ -389,7 +387,11 @@ struct Iter : public Wrapper { */ class Model : public Noncopyable, public Wrapper { public: - inline Model(World& world, const std::string& base_uri="."); + inline Model(World& world, + const std::string& base_uri, + unsigned indices = (SORD_SPO | SORD_OPS), + bool graphs = true); + inline ~Model(); inline const Node& base_uri() const { return _base; } @@ -441,13 +443,15 @@ private: /** Create an empty in-memory RDF model. */ inline -Model::Model(World& world, const std::string& base_uri) +Model::Model(World& world, + const std::string& base_uri, + unsigned indices, + bool graphs) : _world(world) , _base(world, Node::URI, base_uri) , _writer(NULL) { - // FIXME: parameters - _c_obj = sord_new(_world.world(), SORD_SPO|SORD_OPS, true); + _c_obj = sord_new(_world.world(), indices, graphs); } inline void diff --git a/c++/carla-lilv/sord-0.8.0/src/sord.c b/c++/carla-lilv/sord-0.10.0/src/sord.c similarity index 78% rename from c++/carla-lilv/sord-0.8.0/src/sord.c rename to c++/carla-lilv/sord-0.10.0/src/sord.c index 087a0c0..9510d50 100644 --- a/c++/carla-lilv/sord-0.8.0/src/sord.c +++ b/c++/carla-lilv/sord-0.10.0/src/sord.c @@ -22,8 +22,10 @@ #include #include -#include "zix/hash.h" -#include "zix/tree.h" +#define ZIX_INLINE +#include "zix/digest.c" +#include "zix/hash.c" +#include "zix/tree.c" #include "sord_config.h" #include "sord_internal.h" @@ -102,10 +104,9 @@ static const int orderings[NUM_ORDERS][TUP_LEN] = { /** World */ struct SordWorldImpl { - ZixHash* names; ///< URI or blank node identifier string => ID - ZixHash* langs; ///< Language tag => Interned language tag - ZixHash* literals; ///< Literal => ID - size_t n_nodes; ///< Number of nodes + ZixHash* nodes; + SerdErrorSink error_sink; + void* error_handle; }; /** Store */ @@ -141,64 +142,87 @@ struct SordIterImpl { bool skip_graphs; ///< Iteration should ignore graphs }; -static unsigned -sord_literal_hash(const void* n) +static uint32_t +sord_node_hash(const void* n) { - SordNode* node = (SordNode*)n; - return zix_string_hash(node->node.buf) - + (node->lang ? zix_string_hash(node->lang) : 0); + const SordNode* node = (const SordNode*)n; + uint32_t hash = zix_digest_start(); + hash = zix_digest_add(hash, node->node.buf, node->node.n_bytes); + hash = zix_digest_add(hash, &node->node.type, sizeof(node->node.type)); + if (node->node.type == SERD_LITERAL) { + hash = zix_digest_add(hash, &node->meta.lit, sizeof(node->meta.lit)); + } + return hash; } static bool -sord_literal_equal(const void* a, const void* b) +sord_node_hash_equal(const void* a, const void* b) { - SordNode* a_node = (SordNode*)a; - SordNode* b_node = (SordNode*)b; + const SordNode* a_node = (const SordNode*)a; + const SordNode* b_node = (const SordNode*)b; return (a_node == b_node) - || (zix_string_equal(sord_node_get_string(a_node), - sord_node_get_string(b_node)) - && (a_node->lang == b_node->lang) - && (a_node->datatype == b_node->datatype)); + || ((a_node->node.type == b_node->node.type) && + (a_node->node.type != SERD_LITERAL || + (a_node->meta.lit.datatype == b_node->meta.lit.datatype && + !strncmp(a_node->meta.lit.lang, + b_node->meta.lit.lang, + sizeof(a_node->meta.lit.lang)))) && + (serd_node_equals(&a_node->node, &b_node->node))); +} + +static void +error(SordWorld* world, SerdStatus st, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const SerdError e = { st, NULL, 0, 0, fmt, &args }; + if (world->error_sink) { + world->error_sink(world->error_handle, &e); + } else { + fprintf(stderr, "error: "); + vfprintf(stderr, fmt, args); + } + va_end(args); } SordWorld* sord_world_new(void) { SordWorld* world = (SordWorld*)malloc(sizeof(SordWorld)); - world->names = zix_hash_new(zix_string_hash, zix_string_equal); - world->langs = zix_hash_new(zix_string_hash, zix_string_equal); - world->literals = zix_hash_new(sord_literal_hash, sord_literal_equal); - world->n_nodes = 0; + world->error_sink = NULL; + world->error_handle = NULL; + + world->nodes = zix_hash_new( + sord_node_hash, sord_node_hash_equal, sizeof(SordNode)); + return world; } static void -free_node_entry(const void* key, void* value, void* user_data) +free_node_entry(const void* value, void* user_data) { - SordNode* node = (SordNode*)value; + const SordNode* node = (const SordNode*)value; if (node->node.type == SERD_LITERAL) { - sord_node_free((SordWorld*)user_data, node->datatype); + sord_node_free((SordWorld*)user_data, node->meta.lit.datatype); } free((uint8_t*)node->node.buf); - free(node); } -static void -free_lang_entry(const void* key, void* value, void* user_data) +void +sord_world_free(SordWorld* world) { - free(value); + zix_hash_foreach(world->nodes, free_node_entry, world); + zix_hash_free(world->nodes); + free(world); } void -sord_world_free(SordWorld* world) +sord_world_set_error_sink(SordWorld* world, + SerdErrorSink error_sink, + void* handle) { - zix_hash_foreach(world->literals, free_node_entry, world); - zix_hash_foreach(world->names, free_node_entry, world); - zix_hash_foreach(world->langs, free_lang_entry, world); - zix_hash_free(world->names); - zix_hash_free(world->langs); - zix_hash_free(world->literals); - free(world); + world->error_sink = error_sink; + world->error_handle = handle; } /** Compare nodes, considering NULL a wildcard match. */ @@ -221,19 +245,15 @@ sord_node_compare(const SordNode* a, const SordNode* b) (const char*)sord_node_get_string(b)); if (cmp == 0) { // Note: Can't use sord_node_compare here since it does wildcards - if (!a->datatype || !b->datatype) { - cmp = a->datatype - b->datatype; + if (!a->meta.lit.datatype || !b->meta.lit.datatype) { + cmp = a->meta.lit.datatype - b->meta.lit.datatype; } else { - cmp = strcmp((const char*)a->datatype->node.buf, - (const char*)b->datatype->node.buf); + cmp = strcmp((const char*)a->meta.lit.datatype->node.buf, + (const char*)b->meta.lit.datatype->node.buf); } } if (cmp == 0) { - if (!a->lang || !b->lang) { - cmp = a->lang - b->lang; - } else { - cmp = strcmp(a->lang, b->lang); - } + cmp = strcmp(a->meta.lit.lang, b->meta.lit.lang); } default: break; @@ -277,9 +297,9 @@ sord_quad_match(const SordQuad x, const SordQuad y) static int sord_quad_compare(const void* x_ptr, const void* y_ptr, void* user_data) { - const int* const ordering = (const int*)user_data; - SordNode** const x = (SordNode**)x_ptr; - SordNode** const y = (SordNode**)y_ptr; + const int* const ordering = (const int*)user_data; + const SordNode*const*const x = (const SordNode*const*)x_ptr; + const SordNode*const*const y = (const SordNode*const*)y_ptr; for (int i = 0; i < TUP_LEN; ++i) { const int idx = ordering[i]; @@ -612,10 +632,10 @@ sord_new(SordWorld* world, unsigned indices, bool graphs) if (indices & (1 << i)) { sord->indices[i] = zix_tree_new( - false, sord_quad_compare, (void*)ordering); + false, sord_quad_compare, (void*)ordering, NULL); if (graphs) { sord->indices[i + (NUM_ORDERS / 2)] = zix_tree_new( - false, sord_quad_compare, (void*)g_ordering); + false, sord_quad_compare, (void*)g_ordering, NULL); } else { sord->indices[i + (NUM_ORDERS / 2)] = NULL; } @@ -627,11 +647,11 @@ sord_new(SordWorld* world, unsigned indices, bool graphs) if (!sord->indices[DEFAULT_ORDER]) { sord->indices[DEFAULT_ORDER] = zix_tree_new( - false, sord_quad_compare, (void*)orderings[DEFAULT_ORDER]); + false, sord_quad_compare, (void*)orderings[DEFAULT_ORDER], NULL); } if (graphs && !sord->indices[DEFAULT_GRAPH_ORDER]) { sord->indices[DEFAULT_GRAPH_ORDER] = zix_tree_new( - false, sord_quad_compare, (void*)orderings[DEFAULT_GRAPH_ORDER]); + false, sord_quad_compare, (void*)orderings[DEFAULT_GRAPH_ORDER], NULL); } return sord; @@ -641,20 +661,17 @@ static void sord_node_free_internal(SordWorld* world, SordNode* node) { assert(node->refs == 0); - if (node->node.type == SERD_LITERAL) { - if (zix_hash_remove(world->literals, node)) { - fprintf(stderr, "Failed to remove literal from hash.\n"); - return; - } - sord_node_free(world, node->datatype); - } else { - if (zix_hash_remove(world->names, node->node.buf)) { - fprintf(stderr, "Failed to remove resource from hash.\n"); - return; - } + + // Cache pointer to buffer to free after node removal and destruction + const uint8_t* const buf = node->node.buf; + + // Remove node from hash (which frees the node) + if (zix_hash_remove(world->nodes, node)) { + error(world, SERD_ERR_INTERNAL, "failed to remove node from hash\n"); } - free((uint8_t*)node->node.buf); - free(node); + + // Free buffer + free((uint8_t*)buf); } static void @@ -663,8 +680,8 @@ sord_add_quad_ref(SordModel* sord, const SordNode* node, SordQuadIndex i) if (node) { assert(node->refs > 0); ++((SordNode*)node)->refs; - if (i == SORD_OBJECT) { - ++((SordNode*)node)->refs_as_obj; + if (node->node.type != SERD_LITERAL && i == SORD_OBJECT) { + ++((SordNode*)node)->meta.res.refs_as_obj; } } } @@ -677,9 +694,9 @@ sord_drop_quad_ref(SordModel* sord, const SordNode* node, SordQuadIndex i) } assert(node->refs > 0); - if (i == SORD_OBJECT) { - assert(node->refs_as_obj > 0); - --((SordNode*)node)->refs_as_obj; + if (node->node.type != SERD_LITERAL && i == SORD_OBJECT) { + assert(node->meta.res.refs_as_obj > 0); + --((SordNode*)node)->meta.res.refs_as_obj; } if (--((SordNode*)node)->refs == 0) { sord_node_free_internal(sord_get_world(sord), (SordNode*)node); @@ -697,23 +714,23 @@ sord_free(SordModel* sord) SordIter* i = sord_begin(sord); for (; !sord_iter_end(i); sord_iter_next(i)) { sord_iter_get(i, tup); - for (int i = 0; i < TUP_LEN; ++i) { - sord_drop_quad_ref(sord, (SordNode*)tup[i], (SordQuadIndex)i); + for (int t = 0; t < TUP_LEN; ++t) { + sord_drop_quad_ref(sord, tup[t], (SordQuadIndex)t); } } sord_iter_free(i); // Free quads - for (ZixTreeIter* i = zix_tree_begin(sord->indices[DEFAULT_ORDER]); - !zix_tree_iter_is_end(i); - i = zix_tree_iter_next(i)) { - free(zix_tree_get(i)); + for (ZixTreeIter* t = zix_tree_begin(sord->indices[DEFAULT_ORDER]); + !zix_tree_iter_is_end(t); + t = zix_tree_iter_next(t)) { + free(zix_tree_get(t)); } // Free indices - for (unsigned i = 0; i < NUM_ORDERS; ++i) - if (sord->indices[i]) - zix_tree_free(sord->indices[i]); + for (unsigned o = 0; o < NUM_ORDERS; ++o) + if (sord->indices[o]) + zix_tree_free(sord->indices[o]); free(sord); } @@ -733,7 +750,7 @@ sord_num_quads(const SordModel* sord) size_t sord_num_nodes(const SordWorld* world) { - return world->n_nodes; + return zix_hash_size(world->nodes); } SordIter* @@ -752,7 +769,7 @@ static inline ZixTreeIter* index_search(ZixTree* db, const SordQuad search_key) { ZixTreeIter* iter = NULL; - zix_tree_find(db, (void*)search_key, &iter); + zix_tree_find(db, (const void*)search_key, &iter); return iter; } @@ -760,7 +777,7 @@ static inline ZixTreeIter* index_lower_bound(ZixTree* db, const SordQuad search_key) { ZixTreeIter* iter = NULL; - zix_tree_find(db, (void*)search_key, &iter); + zix_tree_find(db, (const void*)search_key, &iter); if (!iter) { return NULL; } @@ -863,75 +880,14 @@ sord_contains(SordModel* sord, const SordQuad pat) return ret; } -static SordNode* -sord_lookup_name(SordWorld* world, const uint8_t* str) -{ - return (SordNode*)zix_hash_find(world->names, str); -} - -char* -sord_strndup(const char* str, size_t len) +static uint8_t* +sord_strndup(const uint8_t* str, size_t len) { - char* dup = (char*)malloc(len + 1); + uint8_t* dup = (uint8_t*)malloc(len + 1); memcpy(dup, str, len + 1); return dup; } -static SordNode* -sord_new_node(SerdType type, const uint8_t* data, - size_t n_bytes, size_t n_chars, SerdNodeFlags flags, - SordNode* datatype, const char* lang, bool copy) -{ - SordNode* node = (SordNode*)malloc(sizeof(SordNode)); - node->lang = lang; - node->datatype = datatype; - node->refs = 1; - node->refs_as_obj = 0; - node->node.buf = (uint8_t*)data; - node->node.n_bytes = n_bytes; - node->node.n_chars = n_chars; - node->node.flags = flags; - node->node.type = type; - - if (copy) { - node->node.buf = (uint8_t*)sord_strndup((const char*)data, n_bytes); - } - return node; -} - -const char* -sord_intern_lang(SordWorld* world, const char* lang) -{ - if (lang) { - char* ilang = (char*)zix_hash_find(world->langs, lang); - if (!ilang) { - ilang = sord_strndup(lang, strlen(lang)); - zix_hash_insert(world->langs, ilang, ilang); - } - lang = ilang; - } - return lang; -} - -static SordNode* -sord_lookup_literal(SordWorld* world, SordNode* type, - const uint8_t* str, size_t n_bytes, size_t n_chars, - const char* lang) -{ - struct SordNodeImpl key; - key.lang = lang; - key.datatype = type; - key.refs = 1; - key.refs_as_obj = 1; - key.node.buf = (uint8_t*)str; - key.node.n_bytes = n_bytes; - key.node.n_chars = n_chars; - key.node.flags = 0; - key.node.type = SERD_LITERAL; - - return (SordNode*)zix_hash_find(world->literals, &key); -} - SordNodeType sord_node_get_type(const SordNode* node) { @@ -943,34 +899,37 @@ sord_node_get_type(const SordNode* node) case SERD_URI: return SORD_URI; default: - fprintf(stderr, "sord: error: Illegal node type.\n"); + fprintf(stderr, "error: invalid node type\n"); return (SordNodeType)0; } } const uint8_t* -sord_node_get_string(const SordNode* ref) +sord_node_get_string(const SordNode* node) { - return ref->node.buf; + return node->node.buf; } const uint8_t* -sord_node_get_string_counted(const SordNode* ref, size_t* len) +sord_node_get_string_counted(const SordNode* node, size_t* len) { - *len = ref->node.n_chars; - return ref->node.buf; + *len = node->node.n_chars; + return node->node.buf; } const char* -sord_node_get_language(const SordNode* ref) +sord_node_get_language(const SordNode* node) { - return ref->lang; + if (node->node.type != SERD_LITERAL || !node->meta.lit.lang[0]) { + return NULL; + } + return node->meta.lit.lang; } SordNode* -sord_node_get_datatype(const SordNode* ref) +sord_node_get_datatype(const SordNode* node) { - return ref->datatype; + return (node->node.type == SERD_LITERAL) ? node->meta.lit.datatype : NULL; } SerdNodeFlags @@ -982,13 +941,39 @@ sord_node_get_flags(const SordNode* node) bool sord_node_is_inline_object(const SordNode* node) { - return (node->node.type == SERD_BLANK) && (node->refs_as_obj == 1); + return (node->node.type == SERD_BLANK) && (node->meta.res.refs_as_obj == 1); } -static void -sord_add_node(SordWorld* world, SordNode* node) +static SordNode* +sord_insert_node(SordWorld* world, const SordNode* key, bool copy) { - ++world->n_nodes; + SordNode* node = NULL; + ZixStatus st = zix_hash_insert(world->nodes, key, (const void**)&node); + switch (st) { + case ZIX_STATUS_EXISTS: + ++node->refs; + break; + case ZIX_STATUS_SUCCESS: + assert(node->refs == 1); + if (copy) { + node->node.buf = sord_strndup(node->node.buf, node->node.n_bytes); + } + if (node->node.type == SERD_LITERAL) { + node->meta.lit.datatype = sord_node_copy(node->meta.lit.datatype); + } + return node; + default: + assert(!node); + error(world, SERD_ERR_INTERNAL, + "error inserting node `%s'\n", key->node.buf); + } + + if (!copy) { + // Free the buffer we would have copied if a new node was created + free((uint8_t*)key->node.buf); + } + + return node; } static SordNode* @@ -996,24 +981,16 @@ sord_new_uri_counted(SordWorld* world, const uint8_t* str, size_t n_bytes, size_t n_chars, bool copy) { if (!serd_uri_string_has_scheme(str)) { - fprintf(stderr, "Attempt to map invalid URI `%s'.\n", str); + error(world, SERD_ERR_BAD_ARG, + "attempt to map invalid URI `%s'\n", str); return NULL; // Can't intern relative URIs } - SordNode* node = sord_lookup_name(world, str); - if (node) { - if (!copy) { - free((uint8_t*)str); - } - ++node->refs; - return node; - } + const SordNode key = { + { str, n_bytes, n_chars, 0, SERD_URI }, 1, { { 0 } } + }; - node = sord_new_node(SERD_URI, str, n_bytes, n_chars, 0, 0, 0, copy); - assert(!zix_hash_find(world->names, node->node.buf)); - zix_hash_insert(world->names, (char*)node->node.buf, node); - sord_add_node(world, node); - return node; + return sord_insert_node(world, &key, copy); } SordNode* @@ -1046,16 +1023,11 @@ static SordNode* sord_new_blank_counted(SordWorld* world, const uint8_t* str, size_t n_bytes, size_t n_chars) { - SordNode* node = sord_lookup_name(world, str); - if (node) { - ++node->refs; - return node; - } + const SordNode key = { + { str, n_bytes, n_chars, 0, SERD_BLANK }, 1, { { 0 } } + }; - node = sord_new_node(SERD_BLANK, str, n_bytes, n_chars, 0, 0, 0, true); - zix_hash_insert(world->names, (char*)node->node.buf, node); - sord_add_node(world, node); - return node; + return sord_insert_node(world, &key, true); } SordNode* @@ -1074,21 +1046,16 @@ sord_new_literal_counted(SordWorld* world, SerdNodeFlags flags, const char* lang) { - lang = sord_intern_lang(world, lang); - SordNode* node = sord_lookup_literal( - world, datatype, str, n_bytes, n_chars, lang); - if (node) { - ++node->refs; - return node; + SordNode key = { + { str, n_bytes, n_chars, flags, SERD_LITERAL }, 1, { { 0 } } + }; + key.meta.lit.datatype = datatype; + memset(key.meta.lit.lang, 0, sizeof(key.meta.lit.lang)); + if (lang) { + strncpy(key.meta.lit.lang, lang, sizeof(key.meta.lit.lang)); } - node = sord_new_node(SERD_LITERAL, - str, n_bytes, n_chars, flags, - sord_node_copy(datatype), lang, true); - zix_hash_insert(world->literals, node, node); // FIXME: correct? - sord_add_node(world, node); - assert(node->refs == 1); - return node; + return sord_insert_node(world, &key, true); } SordNode* @@ -1142,11 +1109,11 @@ sord_node_from_serd_node(SordWorld* world, SerdURI abs_uri; SerdNode abs_uri_node = serd_node_new_uri_from_node( sn, &base_uri, &abs_uri); - SordNode* ret = sord_new_uri_counted(world, - abs_uri_node.buf, - abs_uri_node.n_bytes, - abs_uri_node.n_chars, - true); + ret = sord_new_uri_counted(world, + abs_uri_node.buf, + abs_uri_node.n_bytes, + abs_uri_node.n_chars, + true); serd_node_free(&abs_uri_node); return ret; } @@ -1154,7 +1121,8 @@ sord_node_from_serd_node(SordWorld* world, SerdChunk uri_prefix; SerdChunk uri_suffix; if (serd_env_expand(env, sn, &uri_prefix, &uri_suffix)) { - fprintf(stderr, "Failed to expand qname `%s'\n", sn->buf); + error(world, SERD_ERR_BAD_CURIE, + "failed to expand CURIE `%s'\n", sn->buf); return NULL; } const size_t uri_len = uri_prefix.len + uri_suffix.len; @@ -1162,7 +1130,7 @@ sord_node_from_serd_node(SordWorld* world, memcpy(buf, uri_prefix.buf, uri_prefix.len); memcpy(buf + uri_prefix.len, uri_suffix.buf, uri_suffix.len); buf[uri_len] = '\0'; - SordNode* ret = sord_new_uri_counted( + ret = sord_new_uri_counted( world, buf, uri_prefix.len + uri_suffix.len, uri_prefix.len + uri_suffix.len, false); // FIXME: UTF-8 return ret; @@ -1213,7 +1181,8 @@ sord_add(SordModel* sord, const SordQuad tup) { SORD_WRITE_LOG("Add " TUP_FMT "\n", TUP_FMT_ARGS(tup)); if (!tup[0] || !tup[1] || !tup[2]) { - fprintf(stderr, "Attempt to add quad with NULL field.\n"); + error(sord->world, SERD_ERR_BAD_ARG, + "attempt to add quad with NULL field\n"); return false; } diff --git a/c++/carla-lilv/sord-0.8.0/src/sord_internal.h b/c++/carla-lilv/sord-0.10.0/src/sord_internal.h similarity index 67% rename from c++/carla-lilv/sord-0.8.0/src/sord_internal.h rename to c++/carla-lilv/sord-0.10.0/src/sord_internal.h index bb1643a..16d6ef2 100644 --- a/c++/carla-lilv/sord-0.8.0/src/sord_internal.h +++ b/c++/carla-lilv/sord-0.10.0/src/sord_internal.h @@ -22,16 +22,25 @@ #include "sord/sord.h" +/** Resource node metadata */ +typedef struct { + size_t refs_as_obj; ///< References as a quad object +} SordResourceMetadata; + +/** Literal node metadata */ +typedef struct { + SordNode* datatype; ///< Optional literal data type URI + char lang[16]; ///< Optional language tag +} SordLiteralMetadata; + /** Node */ struct SordNodeImpl { - const char* lang; ///< Literal language (interned string) - SordNode* datatype; ///< Literal data type (ID of a URI node, or 0) - size_t refs; ///< Reference count (# of containing quads) - size_t refs_as_obj; ///< References as a quad object - SerdNode node; ///< Serd node + SerdNode node; ///< Serd node + size_t refs; ///< Reference count (# of containing quads) + union { + SordResourceMetadata res; + SordLiteralMetadata lit; + } meta; }; -const char* -sord_intern_lang(SordWorld* world, const char* lang); - #endif /* SORD_SORD_INTERNAL_H */ diff --git a/c++/carla-lilv/sord-0.8.0/src/sord_test.c b/c++/carla-lilv/sord-0.10.0/src/sord_test.c similarity index 99% rename from c++/carla-lilv/sord-0.8.0/src/sord_test.c rename to c++/carla-lilv/sord-0.10.0/src/sord_test.c index b871181..a7a74e5 100644 --- a/c++/carla-lilv/sord-0.8.0/src/sord_test.c +++ b/c++/carla-lilv/sord-0.10.0/src/sord_test.c @@ -38,13 +38,13 @@ uri(SordWorld* world, int num) if (num == 0) return 0; - char uri[] = "eg:000"; - char* uri_num = uri + 3; // First `0' + char str[] = "eg:000"; + char* uri_num = str + 3; // First `0' snprintf(uri_num, DIGITS + 1, "%0*d", DIGITS, num); - return sord_new_uri(world, (const uint8_t*)uri); + return sord_new_uri(world, (const uint8_t*)str); } -int +static int test_fail(const char* fmt, ...) { va_list args; @@ -55,7 +55,7 @@ test_fail(const char* fmt, ...) return 1; } -int +static int generate(SordWorld* world, SordModel* sord, size_t n_quads, @@ -175,7 +175,7 @@ generate(SordWorld* world, ((t)[1] ? sord_node_get_string((t)[1]) : USTR("*")), \ ((t)[2] ? sord_node_get_string((t)[2]) : USTR("*")) -int +static int test_read(SordWorld* world, SordModel* sord, SordNode* g, const size_t n_quads) { diff --git a/c++/carla-lilv/sord-0.8.0/src/sord_validate.c b/c++/carla-lilv/sord-0.10.0/src/sord_validate.c similarity index 97% rename from c++/carla-lilv/sord-0.8.0/src/sord_validate.c rename to c++/carla-lilv/sord-0.10.0/src/sord_validate.c index 8ced620..9f8c176 100644 --- a/c++/carla-lilv/sord-0.8.0/src/sord_validate.c +++ b/c++/carla-lilv/sord-0.10.0/src/sord_validate.c @@ -66,8 +66,8 @@ typedef struct { int n_errors = 0; bool one_line_errors = false; -int -print_version() +static int +print_version(void) { printf("sord_validate " SORD_VERSION " \n"); @@ -78,7 +78,7 @@ print_version() return 0; } -int +static int print_usage(const char* name, bool error) { FILE* const os = error ? stderr : stdout; @@ -94,7 +94,7 @@ print_usage(const char* name, bool error) return error ? 1 : 0; } -uint8_t* +static uint8_t* absolute_path(const uint8_t* path) { #ifdef _WIN32 @@ -106,7 +106,7 @@ absolute_path(const uint8_t* path) #endif } -void +static void error(const char* msg, const SordQuad quad) { const char* sep = one_line_errors ? "\t" : "\n "; @@ -118,7 +118,7 @@ error(const char* msg, const SordQuad quad) sep, (const char*)sord_node_get_string(quad[SORD_OBJECT])); } -bool +static bool is_subclass_of(SordModel* model, const URIs* uris, const SordNode* klass, @@ -147,16 +147,16 @@ is_subclass_of(SordModel* model, return false; } -bool +static bool regexp_match(const char* pat, const char* str) { #ifdef HAVE_PCRE - const char* error; + const char* err; int erroffset; - pcre* re = pcre_compile(pat, PCRE_ANCHORED, &error, &erroffset, NULL); + pcre* re = pcre_compile(pat, PCRE_ANCHORED, &err, &erroffset, NULL); if (!re) { fprintf(stderr, "Error in regexp \"%s\" at offset %d (%s)\n", - pat, erroffset, error); + pat, erroffset, err); return false; } @@ -169,7 +169,7 @@ regexp_match(const char* pat, const char* str) return true; } -bool +static bool literal_is_valid(SordModel* model, const URIs* uris, const SordNode* literal, @@ -197,7 +197,7 @@ literal_is_valid(SordModel* model, return false; } -bool +static bool check_type(SordModel* model, URIs* uris, const SordNode* node, @@ -251,6 +251,8 @@ main(int argc, char** argv) for (; a < argc && argv[a][0] == '-'; ++a) { if (argv[a][1] == 'l') { one_line_errors = true; + } else if (argv[a][1] == 'v') { + return print_version(); } else { fprintf(stderr, "%s: Unknown option `%s'\n", argv[0], argv[a]); return print_usage(argv[0], true); diff --git a/c++/carla-lilv/sord-0.8.0/src/sordi.c b/c++/carla-lilv/sord-0.10.0/src/sordi.c similarity index 97% rename from c++/carla-lilv/sord-0.8.0/src/sordi.c rename to c++/carla-lilv/sord-0.10.0/src/sordi.c index 9e4ed3a..004c6cf 100644 --- a/c++/carla-lilv/sord-0.8.0/src/sordi.c +++ b/c++/carla-lilv/sord-0.10.0/src/sordi.c @@ -36,8 +36,8 @@ typedef struct { SordModel* sord; } State; -int -print_version() +static int +print_version(void) { printf("sordi " SORD_VERSION " \n"); printf("Copyright 2011-2012 David Robillard .\n" @@ -47,7 +47,7 @@ print_version() return 0; } -int +static int print_usage(const char* name, bool error) { FILE* const os = error ? stderr : stdout; @@ -62,7 +62,7 @@ print_usage(const char* name, bool error) return error ? 1 : 0; } -bool +static bool set_syntax(SerdSyntax* syntax, const char* name) { if (!strcmp(name, "turtle")) { @@ -76,7 +76,7 @@ set_syntax(SerdSyntax* syntax, const char* name) return true; } -uint8_t* +static uint8_t* absolute_path(const uint8_t* path) { #ifdef _WIN32 @@ -179,9 +179,6 @@ main(int argc, char** argv) serd_reader_free(reader); - fprintf(stderr, "Loaded %lu statements\n", - (unsigned long)sord_num_quads(sord)); - SerdEnv* write_env = serd_env_new(&base_uri_node); int output_style = SERD_STYLE_RESOLVED; diff --git a/c++/carla-lilv/sord-0.8.0/src/sordmm_test.cpp b/c++/carla-lilv/sord-0.10.0/src/sordmm_test.cpp similarity index 94% rename from c++/carla-lilv/sord-0.8.0/src/sordmm_test.cpp rename to c++/carla-lilv/sord-0.10.0/src/sordmm_test.cpp index bb53f52..d0a5a3a 100644 --- a/c++/carla-lilv/sord-0.8.0/src/sordmm_test.cpp +++ b/c++/carla-lilv/sord-0.10.0/src/sordmm_test.cpp @@ -20,6 +20,6 @@ int main(int argc, char** argv) { Sord::World world; - Sord::Model model(world); + Sord::Model model(world, "http://example.org/"); return 0; } diff --git a/c++/carla-lilv/sord-0.8.0/src/syntax.c b/c++/carla-lilv/sord-0.10.0/src/syntax.c similarity index 100% rename from c++/carla-lilv/sord-0.8.0/src/syntax.c rename to c++/carla-lilv/sord-0.10.0/src/syntax.c diff --git a/c++/carla-lilv/sord-0.8.0/src/zix/common.h b/c++/carla-lilv/sord-0.10.0/src/zix/common.h similarity index 86% rename from c++/carla-lilv/sord-0.8.0/src/zix/common.h rename to c++/carla-lilv/sord-0.10.0/src/zix/common.h index e7d35e1..f126cd1 100644 --- a/c++/carla-lilv/sord-0.8.0/src/zix/common.h +++ b/c++/carla-lilv/sord-0.10.0/src/zix/common.h @@ -36,8 +36,13 @@ # else # define ZIX_API ZIX_LIB_IMPORT # endif +# define ZIX_PRIVATE static +#elif defined(ZIX_INLINE) +# define ZIX_API static inline +# define ZIX_PRIVATE static inline #else # define ZIX_API +# define ZIX_PRIVATE static #endif /** @endcond */ @@ -53,6 +58,8 @@ typedef enum { ZIX_STATUS_NO_MEM, ZIX_STATUS_NOT_FOUND, ZIX_STATUS_EXISTS, + ZIX_STATUS_BAD_ARG, + ZIX_STATUS_BAD_PERMS, } ZixStatus; /** @@ -65,6 +72,11 @@ typedef int (*ZixComparator)(const void* a, const void* b, void* user_data); */ typedef bool (*ZixEqualFunc)(const void* a, const void* b); +/** + Function to destroy an element. +*/ +typedef void (*ZixDestroyFunc)(void* ptr); + /** @} */ diff --git a/c++/carla-lilv/sord-0.10.0/src/zix/digest.c b/c++/carla-lilv/sord-0.10.0/src/zix/digest.c new file mode 100644 index 0000000..04f48f0 --- /dev/null +++ b/c++/carla-lilv/sord-0.10.0/src/zix/digest.c @@ -0,0 +1,57 @@ +/* + Copyright 2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "zix/digest.h" + +#ifdef __SSE4_2__ +# include +#endif + +ZIX_API uint32_t +zix_digest_start(void) +{ +#ifdef __SSE4_2__ + return 1; // CRC32 initial value +#else + return 5381; // DJB hash initial value +#endif +} + +ZIX_API uint32_t +zix_digest_add(uint32_t hash, const void* const buf, const size_t len) +{ + const uint8_t* str = (const uint8_t*)buf; +#ifdef __SSE4_2__ + // SSE 4.2 CRC32 + for (size_t i = 0; i < (len / sizeof(uint32_t)); ++i) { + hash = _mm_crc32_u32(hash, *(uint32_t*)str); + str += sizeof(uint32_t); + } + if (len & sizeof(uint16_t)) { + hash = _mm_crc32_u16(hash, *(uint16_t*)str); + str += sizeof(uint16_t); + } + if (len & sizeof(uint8_t)) { + hash = _mm_crc32_u8(hash, *(uint8_t*)str); + } +#else + // Classic DJB hash + for (size_t i = 0; i < len; ++i) { + hash = (hash << 5) + hash + str[i]; + } +#endif + return hash; +} diff --git a/c++/carla-lilv/sord-0.10.0/src/zix/digest.h b/c++/carla-lilv/sord-0.10.0/src/zix/digest.h new file mode 100644 index 0000000..34ab376 --- /dev/null +++ b/c++/carla-lilv/sord-0.10.0/src/zix/digest.h @@ -0,0 +1,39 @@ +/* + Copyright 2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef ZIX_DIGEST_H +#define ZIX_DIGEST_H + +#include +#include + +#include "zix/common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +ZIX_API uint32_t +zix_digest_start(void); + +ZIX_API uint32_t +zix_digest_add(uint32_t hash, const void* buf, const size_t len); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ZIX_DIGEST_H */ diff --git a/c++/carla-lilv/sord-0.10.0/src/zix/hash.c b/c++/carla-lilv/sord-0.10.0/src/zix/hash.c new file mode 100644 index 0000000..b24ee78 --- /dev/null +++ b/c++/carla-lilv/sord-0.10.0/src/zix/hash.c @@ -0,0 +1,228 @@ +/* + Copyright 2011 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include +#include +#include +#include + +#include "zix/hash.h" + +/** + Primes, each slightly less than twice its predecessor, and as far away + from powers of two as possible. +*/ +static const unsigned sizes[] = { + 53, 97, 193, 389, 769, 1543, 3079, 6151, 12289, 24593, 49157, 98317, + 196613, 393241, 786433, 1572869, 3145739, 6291469, 12582917, 25165843, + 50331653, 100663319, 201326611, 402653189, 805306457, 1610612741, 0 +}; + +typedef struct ZixHashEntry { + struct ZixHashEntry* next; ///< Next entry in bucket + uint32_t hash; ///< Non-modulo hash value + // Value follows here (access with zix_hash_value) +} ZixHashEntry; + +struct ZixHashImpl { + ZixHashFunc hash_func; + ZixEqualFunc equal_func; + ZixHashEntry** buckets; + const unsigned* n_buckets; + size_t value_size; + unsigned count; +}; + +static inline const void* +zix_hash_value(const ZixHashEntry* entry) +{ + return entry + 1; +} + +ZIX_API ZixHash* +zix_hash_new(ZixHashFunc hash_func, + ZixEqualFunc equal_func, + size_t value_size) +{ + ZixHash* hash = (ZixHash*)malloc(sizeof(ZixHash)); + hash->hash_func = hash_func; + hash->equal_func = equal_func; + hash->n_buckets = &sizes[0]; + hash->value_size = value_size; + hash->count = 0; + hash->buckets = (ZixHashEntry**)calloc(*hash->n_buckets, + sizeof(ZixHashEntry*)); + return hash; +} + +ZIX_API void +zix_hash_free(ZixHash* hash) +{ + for (unsigned b = 0; b < *hash->n_buckets; ++b) { + ZixHashEntry* bucket = hash->buckets[b]; + for (ZixHashEntry* e = bucket; e;) { + ZixHashEntry* next = e->next; + free(e); + e = next; + } + } + + free(hash->buckets); + free(hash); +} + +ZIX_API size_t +zix_hash_size(const ZixHash* hash) +{ + return hash->count; +} + +static inline void +insert_entry(ZixHashEntry** bucket, ZixHashEntry* entry) +{ + entry->next = *bucket; + *bucket = entry; +} + +static inline ZixStatus +rehash(ZixHash* hash, unsigned new_n_buckets) +{ + ZixHashEntry** new_buckets = (ZixHashEntry**)calloc( + new_n_buckets, sizeof(ZixHashEntry*)); + if (!new_buckets) { + return ZIX_STATUS_NO_MEM; + } + + const unsigned old_n_buckets = *hash->n_buckets; + for (unsigned b = 0; b < old_n_buckets; ++b) { + for (ZixHashEntry* e = hash->buckets[b]; e;) { + ZixHashEntry* const next = e->next; + const unsigned h = e->hash % new_n_buckets; + insert_entry(&new_buckets[h], e); + e = next; + } + } + + free(hash->buckets); + hash->buckets = new_buckets; + + return ZIX_STATUS_SUCCESS; +} + +static inline ZixHashEntry* +find_entry(const ZixHash* hash, + const void* key, + const unsigned h, + const unsigned h_nomod) +{ + for (ZixHashEntry* e = hash->buckets[h]; e; e = e->next) { + if (e->hash == h_nomod && hash->equal_func(zix_hash_value(e), key)) { + return e; + } + } + return NULL; +} + +ZIX_API const void* +zix_hash_find(const ZixHash* hash, const void* value) +{ + const unsigned h_nomod = hash->hash_func(value); + const unsigned h = h_nomod % *hash->n_buckets; + ZixHashEntry* const entry = find_entry(hash, value, h, h_nomod); + return entry ? zix_hash_value(entry) : 0; +} + +ZIX_API ZixStatus +zix_hash_insert(ZixHash* hash, const void* value, const void** inserted) +{ + unsigned h_nomod = hash->hash_func(value); + unsigned h = h_nomod % *hash->n_buckets; + + ZixHashEntry* elem = find_entry(hash, value, h, h_nomod); + if (elem) { + assert(elem->hash == h_nomod); + if (inserted) { + *inserted = zix_hash_value(elem); + } + return ZIX_STATUS_EXISTS; + } + + elem = (ZixHashEntry*)malloc(sizeof(ZixHashEntry) + hash->value_size); + if (!elem) { + return ZIX_STATUS_NO_MEM; + } + elem->next = NULL; + elem->hash = h_nomod; + memcpy(elem + 1, value, hash->value_size); + + const unsigned next_n_buckets = *(hash->n_buckets + 1); + if (next_n_buckets != 0 && (hash->count + 1) >= next_n_buckets) { + if (!rehash(hash, next_n_buckets)) { + h = h_nomod % *(++hash->n_buckets); + } + } + + insert_entry(&hash->buckets[h], elem); + ++hash->count; + if (inserted) { + *inserted = zix_hash_value(elem); + } + return ZIX_STATUS_SUCCESS; +} + +ZIX_API ZixStatus +zix_hash_remove(ZixHash* hash, const void* value) +{ + const unsigned h_nomod = hash->hash_func(value); + const unsigned h = h_nomod % *hash->n_buckets; + + ZixHashEntry** next_ptr = &hash->buckets[h]; + for (ZixHashEntry* e = hash->buckets[h]; e; e = e->next) { + if (h_nomod == e->hash && + hash->equal_func(zix_hash_value(e), value)) { + *next_ptr = e->next; + free(e); + return ZIX_STATUS_SUCCESS; + } + next_ptr = &e->next; + } + + if (hash->n_buckets != sizes) { + const unsigned prev_n_buckets = *(hash->n_buckets - 1); + if (hash->count - 1 <= prev_n_buckets) { + if (!rehash(hash, prev_n_buckets)) { + --hash->n_buckets; + } + } + } + + --hash->count; + return ZIX_STATUS_NOT_FOUND; +} + +ZIX_API void +zix_hash_foreach(const ZixHash* hash, + ZixHashVisitFunc f, + void* user_data) +{ + for (unsigned b = 0; b < *hash->n_buckets; ++b) { + ZixHashEntry* bucket = hash->buckets[b]; + for (const ZixHashEntry* e = bucket; e; e = e->next) { + f(zix_hash_value(e), user_data); + } + } +} + diff --git a/c++/carla-lilv/sord-0.10.0/src/zix/hash.h b/c++/carla-lilv/sord-0.10.0/src/zix/hash.h new file mode 100644 index 0000000..c992117 --- /dev/null +++ b/c++/carla-lilv/sord-0.10.0/src/zix/hash.h @@ -0,0 +1,140 @@ +/* + Copyright 2011-2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef ZIX_HASH_H +#define ZIX_HASH_H + +#include +#include + +#include "zix/common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + @addtogroup zix + @{ + @name Hash + @{ +*/ + +typedef struct ZixHashImpl ZixHash; + +/** + Function for computing the hash of an element. +*/ +typedef uint32_t (*ZixHashFunc)(const void* value); + +/** + Function to visit a hash element. +*/ +typedef void (*ZixHashVisitFunc)(const void* value, + void* user_data); + +/** + Create a new hash table. + + To minimize space overhead, unlike many hash tables this stores a single + value, not a key and a value. Any size of value can be stored, but all the + values in the hash table must be the same size, and the values must be safe + to copy with memcpy. To get key:value behaviour, simply insert a struct + with a key and value into the hash. + + @param hash_func The hashing function. + @param equal_func A function to test value equality. + @param value_size The size of the values to be stored. +*/ +ZIX_API ZixHash* +zix_hash_new(ZixHashFunc hash_func, + ZixEqualFunc equal_func, + size_t value_size); + +/** + Free @p hash. +*/ +ZIX_API void +zix_hash_free(ZixHash* hash); + +/** + Return the number of elements in @p hash. +*/ +ZIX_API size_t +zix_hash_size(const ZixHash* hash); + +/** + Insert an item into @p hash. + + If no matching value is found, ZIX_STATUS_SUCCESS will be returned, and @p + inserted will be pointed to the copy of @p value made in the new hash node. + + If a matching value already exists, ZIX_STATUS_EXISTS will be returned, and + @p inserted will be pointed to the existing value. + + @param hash The hash table. + @param value The value to be inserted. + @param inserted The copy of @p value in the hash table. + @return ZIX_STATUS_SUCCESS, ZIX_STATUS_EXISTS, or ZIX_STATUS_NO_MEM. +*/ +ZIX_API ZixStatus +zix_hash_insert(ZixHash* hash, + const void* value, + const void** inserted); + +/** + Remove an item from @p hash. + + @param hash The hash table. + @param value The value to remove. + @return ZIX_STATUS_SUCCES or ZIX_STATUS_NOT_FOUND. +*/ +ZIX_API ZixStatus +zix_hash_remove(ZixHash* hash, + const void* value); + +/** + Search for an item in @p hash. + + @param hash The hash table. + @param value The value to search for. +*/ +ZIX_API const void* +zix_hash_find(const ZixHash* hash, + const void* value); + +/** + Call @p f on each value in @p hash. + + @param hash The hash table. + @param f The function to call on each value. + @param user_data The user_data parameter passed to @p f. +*/ +ZIX_API void +zix_hash_foreach(const ZixHash* hash, + ZixHashVisitFunc f, + void* user_data); + +/** + @} + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ZIX_HASH_H */ diff --git a/c++/carla-lilv/sord-0.8.0/src/zix/tree.c b/c++/carla-lilv/sord-0.10.0/src/zix/tree.c similarity index 74% rename from c++/carla-lilv/sord-0.8.0/src/zix/tree.c rename to c++/carla-lilv/sord-0.10.0/src/zix/tree.c index d430cb1..844adb9 100644 --- a/c++/carla-lilv/sord-0.8.0/src/zix/tree.c +++ b/c++/carla-lilv/sord-0.10.0/src/zix/tree.c @@ -26,11 +26,12 @@ typedef struct ZixTreeNodeImpl ZixTreeNode; struct ZixTreeImpl { - ZixTreeNode* root; - ZixComparator cmp; - void* cmp_data; - size_t size; - bool allow_duplicates; + ZixTreeNode* root; + ZixDestroyFunc destroy; + ZixComparator cmp; + void* cmp_data; + size_t size; + bool allow_duplicates; }; struct ZixTreeNodeImpl { @@ -44,45 +45,72 @@ struct ZixTreeNodeImpl { #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define MAX(a, b) (((a) > (b)) ? (a) : (b)) -ZIX_API -ZixTree* -zix_tree_new(bool allow_duplicates, ZixComparator cmp, void* cmp_data) +// Uncomment these for debugging features +// #define ZIX_TREE_DUMP 1 +// #define ZIX_TREE_VERIFY 1 +// #define ZIX_TREE_HYPER_VERIFY 1 + +#if defined(ZIX_TREE_VERIFY) || defined(ZIX_TREE_HYPER_VERIFY) +# include "tree_debug.h" +# define ASSERT_BALANCE(n) assert(verify_balance(n)) +#else +# define ASSERT_BALANCE(n) +#endif + +#ifdef ZIX_TREE_DUMP +# include "tree_debug.h" +# define DUMP(t) zix_tree_print(t->root, 0) +# define DEBUG_PRINTF(fmt, ...) printf(fmt, __VA_ARGS__) +#else +# define DUMP(t) +# define DEBUG_PRINTF(fmt, ...) +#endif + +ZIX_API ZixTree* +zix_tree_new(bool allow_duplicates, + ZixComparator cmp, + void* cmp_data, + ZixDestroyFunc destroy) { ZixTree* t = (ZixTree*)malloc(sizeof(ZixTree)); t->root = NULL; + t->destroy = destroy; t->cmp = cmp; t->cmp_data = cmp_data; - t->size = 0; + t->size = 0; t->allow_duplicates = allow_duplicates; return t; } -static void -zix_tree_free_rec(ZixTreeNode* n) +ZIX_PRIVATE void +zix_tree_free_rec(ZixTree* t, ZixTreeNode* n) { if (n) { - zix_tree_free_rec(n->left); - zix_tree_free_rec(n->right); + zix_tree_free_rec(t, n->left); + zix_tree_free_rec(t, n->right); + if (t->destroy) { + t->destroy(n->data); + } free(n); } } -ZIX_API -void +ZIX_API void zix_tree_free(ZixTree* t) { - zix_tree_free_rec(t->root); - - free(t); + if (t) { + zix_tree_free_rec(t, t->root); + free(t); + } } -size_t -zix_tree_size(ZixTree* t) +ZIX_API size_t +zix_tree_size(const ZixTree* t) { - return t->size; + return t->size; } -static void +ZIX_PRIVATE void rotate(ZixTreeNode* p, ZixTreeNode* q) { assert(q->parent == p); @@ -126,20 +154,26 @@ rotate(ZixTreeNode* p, ZixTreeNode* q) * / \ / \ * B C A B */ -static ZixTreeNode* +ZIX_PRIVATE ZixTreeNode* rotate_left(ZixTreeNode* p, int* height_change) { ZixTreeNode* const q = p->right; *height_change = (q->balance == 0) ? 0 : -1; + DEBUG_PRINTF("LL %ld\n", (intptr_t)p->data); + assert(p->balance == 2); assert(q->balance == 0 || q->balance == 1); rotate(p, q); + // p->balance -= 1 + MAX(0, q->balance); + // q->balance -= 1 - MIN(0, p->balance); --q->balance; p->balance = -(q->balance); + ASSERT_BALANCE(p); + ASSERT_BALANCE(q); return q; } @@ -153,20 +187,26 @@ rotate_left(ZixTreeNode* p, int* height_change) * A B B C * */ -static ZixTreeNode* +ZIX_PRIVATE ZixTreeNode* rotate_right(ZixTreeNode* p, int* height_change) { ZixTreeNode* const q = p->left; *height_change = (q->balance == 0) ? 0 : -1; + DEBUG_PRINTF("RR %ld\n", (intptr_t)p->data); + assert(p->balance == -2); assert(q->balance == 0 || q->balance == -1); rotate(p, q); + // p->balance += 1 - MIN(0, q->balance); + // q->balance += 1 + MAX(0, p->balance); ++q->balance; p->balance = -(q->balance); + ASSERT_BALANCE(p); + ASSERT_BALANCE(q); return q; } @@ -182,7 +222,7 @@ rotate_right(ZixTreeNode* p, int* height_change) * B C * */ -static ZixTreeNode* +ZIX_PRIVATE ZixTreeNode* rotate_left_right(ZixTreeNode* p, int* height_change) { ZixTreeNode* const q = p->left; @@ -192,15 +232,25 @@ rotate_left_right(ZixTreeNode* p, int* height_change) assert(q->balance == 1); assert(r->balance == -1 || r->balance == 0 || r->balance == 1); + DEBUG_PRINTF("LR %ld P: %2d Q: %2d R: %2d\n", + (intptr_t)p->data, p->balance, q->balance, r->balance); + rotate(q, r); rotate(p, r); q->balance -= 1 + MAX(0, r->balance); p->balance += 1 - MIN(MIN(0, r->balance) - 1, r->balance + q->balance); + // r->balance += MAX(0, p->balance) + MIN(0, q->balance); + + // p->balance = (p->left && p->right) ? -MIN(r->balance, 0) : 0; + // q->balance = - MAX(r->balance, 0); r->balance = 0; *height_change = -1; + ASSERT_BALANCE(p); + ASSERT_BALANCE(q); + ASSERT_BALANCE(r); return r; } @@ -216,7 +266,7 @@ rotate_left_right(ZixTreeNode* p, int* height_change) * B C * */ -static ZixTreeNode* +ZIX_PRIVATE ZixTreeNode* rotate_right_left(ZixTreeNode* p, int* height_change) { ZixTreeNode* const q = p->right; @@ -226,21 +276,36 @@ rotate_right_left(ZixTreeNode* p, int* height_change) assert(q->balance == -1); assert(r->balance == -1 || r->balance == 0 || r->balance == 1); + DEBUG_PRINTF("RL %ld P: %2d Q: %2d R: %2d\n", + (intptr_t)p->data, p->balance, q->balance, r->balance); + rotate(q, r); rotate(p, r); q->balance += 1 - MIN(0, r->balance); p->balance -= 1 + MAX(MAX(0, r->balance) + 1, r->balance + q->balance); + // r->balance += MAX(0, q->balance) + MIN(0, p->balance); + + // p->balance = (p->left && p->right) ? -MAX(r->balance, 0) : 0; + // q->balance = - MIN(r->balance, 0); r->balance = 0; + // assert(r->balance == 0); *height_change = -1; + ASSERT_BALANCE(p); + ASSERT_BALANCE(q); + ASSERT_BALANCE(r); return r; } -static ZixTreeNode* +ZIX_PRIVATE ZixTreeNode* zix_tree_rebalance(ZixTree* t, ZixTreeNode* node, int* height_change) { +#ifdef ZIX_TREE_HYPER_VERIFY + const size_t old_height = height(node); +#endif + DEBUG_PRINTF("REBALANCE %ld (%d)\n", (intptr_t)node->data, node->balance); *height_change = 0; const bool is_root = !node->parent; assert((is_root && t->root == node) || (!is_root && t->root != node)); @@ -264,14 +329,17 @@ zix_tree_rebalance(ZixTree* t, ZixTreeNode* node, int* height_change) assert(!replacement->parent); t->root = replacement; } - + DUMP(t); +#ifdef ZIX_TREE_HYPER_VERIFY + assert(old_height + *height_change == height(replacement)); +#endif return replacement; } -ZIX_API -ZixStatus +ZIX_API ZixStatus zix_tree_insert(ZixTree* t, void* e, ZixTreeIter** ti) { + DEBUG_PRINTF("**** INSERT %ld\n", (intptr_t)e); int cmp = 0; ZixTreeNode* n = t->root; ZixTreeNode* p = NULL; @@ -290,6 +358,7 @@ zix_tree_insert(ZixTree* t, void* e, ZixTreeIter** ti) if (ti) { *ti = n; } + DEBUG_PRINTF("%ld EXISTS!\n", (intptr_t)e); return ZIX_STATUS_EXISTS; } } @@ -327,6 +396,8 @@ zix_tree_insert(ZixTree* t, void* e, ZixTreeIter** ti) } } + DUMP(t); + // Rebalance if necessary (at most 1 rotation) assert(!p || p->balance == -1 || p->balance == 0 || p->balance == 1); if (p && p_height_increased) { @@ -351,13 +422,20 @@ zix_tree_insert(ZixTree* t, void* e, ZixTreeIter** ti) } } - ++t->size; + DUMP(t); + + ++t->size; + +#ifdef ZIX_TREE_VERIFY + if (!verify(t, t->root)) { + return ZIX_STATUS_ERROR; + } +#endif return ZIX_STATUS_SUCCESS; } -ZIX_API -ZixStatus +ZIX_API ZixStatus zix_tree_remove(ZixTree* t, ZixTreeIter* ti) { ZixTreeNode* const n = ti; @@ -365,11 +443,16 @@ zix_tree_remove(ZixTree* t, ZixTreeIter* ti) ZixTreeNode* to_balance = n->parent; // lowest node to balance int8_t d_balance = 0; // delta(balance) for n->parent + DEBUG_PRINTF("*** REMOVE %ld\n", (intptr_t)n->data); + if ((n == t->root) && !n->left && !n->right) { t->root = NULL; + if (t->destroy) { + t->destroy(n->data); + } free(n); - --t->size; - assert(t->size == 0); + --t->size; + assert(t->size == 0); return ZIX_STATUS_SUCCESS; } @@ -491,15 +574,25 @@ zix_tree_remove(ZixTree* t, ZixTreeIter* ti) } } + DUMP(t); + + if (t->destroy) { + t->destroy(n->data); + } free(n); - --t->size; + --t->size; + +#ifdef ZIX_TREE_VERIFY + if (!verify(t, t->root)) { + return ZIX_STATUS_ERROR; + } +#endif return ZIX_STATUS_SUCCESS; } -ZIX_API -ZixStatus +ZIX_API ZixStatus zix_tree_find(const ZixTree* t, const void* e, ZixTreeIter** ti) { ZixTreeNode* n = t->root; @@ -518,15 +611,13 @@ zix_tree_find(const ZixTree* t, const void* e, ZixTreeIter** ti) return (n) ? ZIX_STATUS_SUCCESS : ZIX_STATUS_NOT_FOUND; } -ZIX_API -void* +ZIX_API void* zix_tree_get(ZixTreeIter* ti) { - return ti->data; + return ti ? ti->data : NULL; } -ZIX_API -ZixTreeIter* +ZIX_API ZixTreeIter* zix_tree_begin(ZixTree* t) { if (!t->root) { @@ -540,22 +631,45 @@ zix_tree_begin(ZixTree* t) return n; } -ZIX_API -ZixTreeIter* +ZIX_API ZixTreeIter* zix_tree_end(ZixTree* t) { return NULL; } -ZIX_API -bool +ZIX_API ZixTreeIter* +zix_tree_rbegin(ZixTree* t) +{ + if (!t->root) { + return NULL; + } + + ZixTreeNode* n = t->root; + while (n->right) { + n = n->right; + } + return n; +} + +ZIX_API ZixTreeIter* +zix_tree_rend(ZixTree* t) +{ + return NULL; +} + +ZIX_API bool zix_tree_iter_is_end(ZixTreeIter* i) { return !i; } -ZIX_API -ZixTreeIter* +ZIX_API bool +zix_tree_iter_is_rend(ZixTreeIter* i) +{ + return !i; +} + +ZIX_API ZixTreeIter* zix_tree_iter_next(ZixTreeIter* i) { if (!i) { @@ -578,8 +692,7 @@ zix_tree_iter_next(ZixTreeIter* i) return i; } -ZIX_API -ZixTreeIter* +ZIX_API ZixTreeIter* zix_tree_iter_prev(ZixTreeIter* i) { if (!i) { diff --git a/c++/carla-lilv/sord-0.8.0/src/zix/tree.h b/c++/carla-lilv/sord-0.10.0/src/zix/tree.h similarity index 74% rename from c++/carla-lilv/sord-0.8.0/src/zix/tree.h rename to c++/carla-lilv/sord-0.10.0/src/zix/tree.h index 43e24f8..f89d9e5 100644 --- a/c++/carla-lilv/sord-0.8.0/src/zix/tree.h +++ b/c++/carla-lilv/sord-0.10.0/src/zix/tree.h @@ -17,6 +17,8 @@ #ifndef ZIX_TREE_H #define ZIX_TREE_H +#include + #include "zix/common.h" #ifdef __cplusplus @@ -43,74 +45,95 @@ typedef struct ZixTreeNodeImpl ZixTreeIter; /** Create a new (empty) tree. */ -ZixTree* -zix_tree_new(bool allow_duplicates, ZixComparator cmp, void* cmp_data); +ZIX_API ZixTree* +zix_tree_new(bool allow_duplicates, + ZixComparator cmp, + void* cmp_data, + ZixDestroyFunc destroy); /** Free @a t. */ -void +ZIX_API void zix_tree_free(ZixTree* t); /** Return the number of elements in @a t. */ -size_t -zix_tree_size(ZixTree* t); +ZIX_API size_t +zix_tree_size(const ZixTree* t); /** Insert the element @a e into @a t and point @a ti at the new element. */ -ZixStatus +ZIX_API ZixStatus zix_tree_insert(ZixTree* t, void* e, ZixTreeIter** ti); /** Remove the item pointed at by @a ti from @a t. */ -ZixStatus +ZIX_API ZixStatus zix_tree_remove(ZixTree* t, ZixTreeIter* ti); /** Set @a ti to an element equal to @a e in @a t. If no such item exists, @a ti is set to NULL. */ -ZixStatus +ZIX_API ZixStatus zix_tree_find(const ZixTree* t, const void* e, ZixTreeIter** ti); /** Return the data associated with the given tree item. */ -void* +ZIX_API void* zix_tree_get(ZixTreeIter* ti); /** Return an iterator to the first (smallest) element in @a t. */ -ZixTreeIter* +ZIX_API ZixTreeIter* zix_tree_begin(ZixTree* t); /** Return an iterator the the element one past the last element in @a t. */ -ZixTreeIter* +ZIX_API ZixTreeIter* zix_tree_end(ZixTree* t); /** Return true iff @a i is an iterator to the end of its tree. */ -bool +ZIX_API bool zix_tree_iter_is_end(ZixTreeIter* i); +/** + Return an iterator to the last (largest) element in @a t. +*/ +ZIX_API ZixTreeIter* +zix_tree_rbegin(ZixTree* t); + +/** + Return an iterator the the element one before the first element in @a t. +*/ +ZIX_API ZixTreeIter* +zix_tree_rend(ZixTree* t); + +/** + Return true iff @a i is an iterator to the reverse end of its tree. +*/ +ZIX_API bool +zix_tree_iter_is_rend(ZixTreeIter* i); + /** Return an iterator that points to the element one past @a i. */ -ZixTreeIter* +ZIX_API ZixTreeIter* zix_tree_iter_next(ZixTreeIter* i); /** Return an iterator that points to the element one before @a i. */ -ZixTreeIter* +ZIX_API ZixTreeIter* zix_tree_iter_prev(ZixTreeIter* i); /** diff --git a/c++/carla-lilv/sord-0.8.0/tests/README.txt b/c++/carla-lilv/sord-0.10.0/tests/README.txt similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/README.txt rename to c++/carla-lilv/sord-0.10.0/tests/README.txt diff --git a/c++/carla-lilv/sord-0.8.0/tests/UTF-8.ttl b/c++/carla-lilv/sord-0.10.0/tests/UTF-8.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/UTF-8.ttl rename to c++/carla-lilv/sord-0.10.0/tests/UTF-8.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/manifest.ttl b/c++/carla-lilv/sord-0.10.0/tests/manifest.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/manifest.ttl rename to c++/carla-lilv/sord-0.10.0/tests/manifest.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/rdf-schema.out b/c++/carla-lilv/sord-0.10.0/tests/rdf-schema.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/rdf-schema.out rename to c++/carla-lilv/sord-0.10.0/tests/rdf-schema.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/rdf-schema.ttl b/c++/carla-lilv/sord-0.10.0/tests/rdf-schema.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/rdf-schema.ttl rename to c++/carla-lilv/sord-0.10.0/tests/rdf-schema.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/rdfq-results.out b/c++/carla-lilv/sord-0.10.0/tests/rdfq-results.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/rdfq-results.out rename to c++/carla-lilv/sord-0.10.0/tests/rdfq-results.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/rdfq-results.ttl b/c++/carla-lilv/sord-0.10.0/tests/rdfq-results.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/rdfq-results.ttl rename to c++/carla-lilv/sord-0.10.0/tests/rdfq-results.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/rdfs-namespace.out b/c++/carla-lilv/sord-0.10.0/tests/rdfs-namespace.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/rdfs-namespace.out rename to c++/carla-lilv/sord-0.10.0/tests/rdfs-namespace.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/rdfs-namespace.ttl b/c++/carla-lilv/sord-0.10.0/tests/rdfs-namespace.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/rdfs-namespace.ttl rename to c++/carla-lilv/sord-0.10.0/tests/rdfs-namespace.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-00.out b/c++/carla-lilv/sord-0.10.0/tests/test-00.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-00.out rename to c++/carla-lilv/sord-0.10.0/tests/test-00.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-00.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-00.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-00.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-00.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-01.out b/c++/carla-lilv/sord-0.10.0/tests/test-01.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-01.out rename to c++/carla-lilv/sord-0.10.0/tests/test-01.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-01.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-01.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-01.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-01.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-02.out b/c++/carla-lilv/sord-0.10.0/tests/test-02.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-02.out rename to c++/carla-lilv/sord-0.10.0/tests/test-02.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-02.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-02.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-02.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-02.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-03.out b/c++/carla-lilv/sord-0.10.0/tests/test-03.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-03.out rename to c++/carla-lilv/sord-0.10.0/tests/test-03.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-03.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-03.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-03.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-03.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-04.out b/c++/carla-lilv/sord-0.10.0/tests/test-04.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-04.out rename to c++/carla-lilv/sord-0.10.0/tests/test-04.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-04.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-04.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-04.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-04.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-05.out b/c++/carla-lilv/sord-0.10.0/tests/test-05.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-05.out rename to c++/carla-lilv/sord-0.10.0/tests/test-05.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-05.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-05.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-05.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-05.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-06.out b/c++/carla-lilv/sord-0.10.0/tests/test-06.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-06.out rename to c++/carla-lilv/sord-0.10.0/tests/test-06.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-06.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-06.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-06.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-06.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-07.out b/c++/carla-lilv/sord-0.10.0/tests/test-07.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-07.out rename to c++/carla-lilv/sord-0.10.0/tests/test-07.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-07.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-07.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-07.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-07.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-08.out b/c++/carla-lilv/sord-0.10.0/tests/test-08.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-08.out rename to c++/carla-lilv/sord-0.10.0/tests/test-08.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-08.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-08.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-08.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-08.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-09.out b/c++/carla-lilv/sord-0.10.0/tests/test-09.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-09.out rename to c++/carla-lilv/sord-0.10.0/tests/test-09.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-09.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-09.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-09.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-09.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-10.out b/c++/carla-lilv/sord-0.10.0/tests/test-10.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-10.out rename to c++/carla-lilv/sord-0.10.0/tests/test-10.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-10.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-10.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-10.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-10.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-11.out b/c++/carla-lilv/sord-0.10.0/tests/test-11.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-11.out rename to c++/carla-lilv/sord-0.10.0/tests/test-11.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-11.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-11.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-11.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-11.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-12.out b/c++/carla-lilv/sord-0.10.0/tests/test-12.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-12.out rename to c++/carla-lilv/sord-0.10.0/tests/test-12.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-12.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-12.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-12.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-12.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-13.out b/c++/carla-lilv/sord-0.10.0/tests/test-13.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-13.out rename to c++/carla-lilv/sord-0.10.0/tests/test-13.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-13.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-13.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-13.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-13.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-14.out b/c++/carla-lilv/sord-0.10.0/tests/test-14.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-14.out rename to c++/carla-lilv/sord-0.10.0/tests/test-14.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-14.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-14.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-14.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-14.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-15.out b/c++/carla-lilv/sord-0.10.0/tests/test-15.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-15.out rename to c++/carla-lilv/sord-0.10.0/tests/test-15.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-15.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-15.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-15.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-15.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-16.out b/c++/carla-lilv/sord-0.10.0/tests/test-16.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-16.out rename to c++/carla-lilv/sord-0.10.0/tests/test-16.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-16.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-16.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-16.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-16.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-17.out b/c++/carla-lilv/sord-0.10.0/tests/test-17.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-17.out rename to c++/carla-lilv/sord-0.10.0/tests/test-17.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-17.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-17.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-17.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-17.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-18.out b/c++/carla-lilv/sord-0.10.0/tests/test-18.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-18.out rename to c++/carla-lilv/sord-0.10.0/tests/test-18.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-18.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-18.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-18.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-18.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-19.out b/c++/carla-lilv/sord-0.10.0/tests/test-19.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-19.out rename to c++/carla-lilv/sord-0.10.0/tests/test-19.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-19.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-19.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-19.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-19.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-20.out b/c++/carla-lilv/sord-0.10.0/tests/test-20.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-20.out rename to c++/carla-lilv/sord-0.10.0/tests/test-20.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-20.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-20.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-20.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-20.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-21.out b/c++/carla-lilv/sord-0.10.0/tests/test-21.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-21.out rename to c++/carla-lilv/sord-0.10.0/tests/test-21.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-21.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-21.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-21.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-21.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-22.out b/c++/carla-lilv/sord-0.10.0/tests/test-22.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-22.out rename to c++/carla-lilv/sord-0.10.0/tests/test-22.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-22.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-22.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-22.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-22.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-23.out b/c++/carla-lilv/sord-0.10.0/tests/test-23.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-23.out rename to c++/carla-lilv/sord-0.10.0/tests/test-23.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-23.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-23.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-23.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-23.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-24.out b/c++/carla-lilv/sord-0.10.0/tests/test-24.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-24.out rename to c++/carla-lilv/sord-0.10.0/tests/test-24.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-24.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-24.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-24.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-24.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-25.out b/c++/carla-lilv/sord-0.10.0/tests/test-25.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-25.out rename to c++/carla-lilv/sord-0.10.0/tests/test-25.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-25.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-25.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-25.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-25.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-26.out b/c++/carla-lilv/sord-0.10.0/tests/test-26.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-26.out rename to c++/carla-lilv/sord-0.10.0/tests/test-26.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-26.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-26.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-26.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-26.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-27.out b/c++/carla-lilv/sord-0.10.0/tests/test-27.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-27.out rename to c++/carla-lilv/sord-0.10.0/tests/test-27.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-27.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-27.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-27.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-27.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-29.out b/c++/carla-lilv/sord-0.10.0/tests/test-29.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-29.out rename to c++/carla-lilv/sord-0.10.0/tests/test-29.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-29.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-29.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-29.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-29.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-30.out b/c++/carla-lilv/sord-0.10.0/tests/test-30.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-30.out rename to c++/carla-lilv/sord-0.10.0/tests/test-30.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-30.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-30.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-30.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-30.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-id.out b/c++/carla-lilv/sord-0.10.0/tests/test-id.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-id.out rename to c++/carla-lilv/sord-0.10.0/tests/test-id.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-id.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-id.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-id.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-id.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-lang.out b/c++/carla-lilv/sord-0.10.0/tests/test-lang.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-lang.out rename to c++/carla-lilv/sord-0.10.0/tests/test-lang.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-lang.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-lang.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-lang.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-lang.ttl diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-num.out b/c++/carla-lilv/sord-0.10.0/tests/test-num.out similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-num.out rename to c++/carla-lilv/sord-0.10.0/tests/test-num.out diff --git a/c++/carla-lilv/sord-0.8.0/tests/test-num.ttl b/c++/carla-lilv/sord-0.10.0/tests/test-num.ttl similarity index 100% rename from c++/carla-lilv/sord-0.8.0/tests/test-num.ttl rename to c++/carla-lilv/sord-0.10.0/tests/test-num.ttl diff --git a/c++/carla-lilv/sord-0.10.0/waf b/c++/carla-lilv/sord-0.10.0/waf new file mode 100755 index 0000000000000000000000000000000000000000..3088b02b08b876672d8dfb2aecec7139056451ff GIT binary patch literal 72589 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 literal 0 HcmV?d00001 diff --git a/c++/carla-lilv/sord-0.8.0/wscript b/c++/carla-lilv/sord-0.10.0/wscript similarity index 66% rename from c++/carla-lilv/sord-0.8.0/wscript rename to c++/carla-lilv/sord-0.10.0/wscript index d57abc4..3287e93 100644 --- a/c++/carla-lilv/sord-0.8.0/wscript +++ b/c++/carla-lilv/sord-0.10.0/wscript @@ -2,13 +2,12 @@ import glob import os import subprocess -import sys from waflib.extras import autowaf as autowaf import waflib.Logs as Logs, waflib.Options as Options # Version of this package (even if built as a child) -SORD_VERSION = '0.8.0' +SORD_VERSION = '0.10.0' SORD_MAJOR_VERSION = '0' # Library version (UNIX style major, minor, micro) @@ -30,35 +29,45 @@ def options(opt): opt.load('compiler_c') opt.load('compiler_cxx') autowaf.set_options(opt) - opt.add_option('--test', action='store_true', default=False, dest='build_tests', - help="Build unit tests") + opt.add_option('--no-utils', action='store_true', dest='no_utils', + help='Do not build command line utilities') + opt.add_option('--test', action='store_true', dest='build_tests', + help='Build unit tests') + opt.add_option('--static', action='store_true', dest='static', + help='Build static library') + opt.add_option('--no-shared', action='store_true', dest='no_shared', + help='Do not build shared library') + opt.add_option('--static-progs', action='store_true', dest='static_progs', + help='Build programs as static binaries') opt.add_option('--dump', type='string', default='', dest='dump', - help="Dump debugging output (iter, search, write, all)") - opt.add_option('--static', action='store_true', default=False, dest='static', - help="Build static library") + help='Dump debugging output (iter, search, write, all)') def configure(conf): conf.load('compiler_c') - conf.load('compiler_cxx') + if Options.options.build_tests: + try: + conf.load('compiler_cxx') + except: + Logs.warn("No C++ compiler, sordmm.hpp compile test skipped") + pass + autowaf.configure(conf) + autowaf.set_c99_mode(conf) autowaf.display_header('Sord configuration') - if conf.env['MSVC_COMPILER']: - conf.env.append_unique('CFLAGS', ['-TP', '-MD']) - conf.env.append_unique('CXXFLAGS', ['-TP', '-MD']) - else: - conf.env.append_unique('CFLAGS', '-std=c99') - autowaf.check_pkg(conf, 'serd-0', uselib_store='SERD', - atleast_version='0.14.0', mandatory=True) + atleast_version='0.18.0', mandatory=True) autowaf.check_pkg(conf, 'libpcre', uselib_store='PCRE', mandatory=False) - conf.env['BUILD_TESTS'] = Options.options.build_tests - conf.env['BUILD_UTILS'] = True - conf.env['BUILD_STATIC'] = Options.options.static + conf.env.BUILD_TESTS = Options.options.build_tests + conf.env.BUILD_UTILS = not Options.options.no_utils + conf.env.BUILD_SHARED = not Options.options.no_shared + conf.env.STATIC_PROGS = Options.options.static_progs + conf.env.BUILD_STATIC = (Options.options.static or + Options.options.static_progs) # Check for gcov library (for test coverage) - if conf.env['BUILD_TESTS']: + if conf.env.BUILD_TESTS: conf.check_cc(lib='gcov', define_name='HAVE_GCOV', mandatory=False) @@ -77,23 +86,23 @@ def configure(conf): def fallback(var, val): conf.env[var] = val - Logs.warn("Warning: %s unset, using %s\n" % (var, val)) + Logs.warn('Warning: %s unset, using %s\n' % (var, val)) - conf.env['INCLUDES_SORD'] = ['${includedir}/sord-%s' % SORD_MAJOR_VERSION] - if not conf.env['INCLUDES_SERD']: + conf.env.INCLUDES_SORD = ['${includedir}/sord-%s' % SORD_MAJOR_VERSION] + if not conf.env.INCLUDES_SERD: fallback('INCLUDES_SERD', ['${includedir}/serd-0']) - conf.env['LIBPATH_SORD'] = [conf.env['LIBDIR']] - if not conf.env['LIBPATH_SERD']: - fallback('LIBPATH_SERD', conf.env['LIBPATH_SORD']) + conf.env.LIBPATH_SORD = [conf.env.LIBDIR] + if not conf.env.LIBPATH_SERD: + fallback('LIBPATH_SERD', conf.env.LIBPATH_SORD) - conf.env['LIB_SORD'] = ['sord-%s' % SORD_MAJOR_VERSION]; - if not conf.env['LIB_SERD']: + conf.env.LIB_SORD = ['sord-%s' % SORD_MAJOR_VERSION]; + if not conf.env.LIB_SERD: fallback('LIB_SERD', 'serd-0') - autowaf.display_msg(conf, "Utilities", bool(conf.env['BUILD_UTILS'])) - autowaf.display_msg(conf, "Unit tests", bool(conf.env['BUILD_TESTS'])) - autowaf.display_msg(conf, "Debug dumping", dump) + autowaf.display_msg(conf, 'Utilities', bool(conf.env.BUILD_UTILS)) + autowaf.display_msg(conf, 'Unit tests', bool(conf.env.BUILD_TESTS)) + autowaf.display_msg(conf, 'Debug dumping', dump) print('') def build(bld): @@ -106,33 +115,33 @@ def build(bld): autowaf.build_pc(bld, 'SORD', SORD_VERSION, SORD_MAJOR_VERSION, 'SERD', {'SORD_MAJOR_VERSION' : SORD_MAJOR_VERSION}) - source = 'src/sord.c src/syntax.c src/zix/hash.c src/zix/tree.c' + source = 'src/sord.c src/syntax.c' - libflags = [ '-fvisibility=hidden' ] - libs = [ 'm' ] + libflags = ['-fvisibility=hidden'] + libs = ['m'] defines = [] - if bld.env['MSVC_COMPILER']: + if bld.env.MSVC_COMPILER: libflags = [] libs = [] defines = ['snprintf=_snprintf'] # Shared Library - obj = bld(features = 'c cshlib', - source = source, - includes = ['.', './src'], - export_includes = ['.'], - name = 'libsord', - target = 'sord-%s' % SORD_MAJOR_VERSION, - vnum = SORD_LIB_VERSION, - install_path = '${LIBDIR}', - libs = libs, - defines = defines, - cflags = libflags + [ '-DSORD_SHARED', - '-DSORD_INTERNAL' ]) - autowaf.use_lib(bld, obj, 'SERD') - + if bld.env.BUILD_SHARED: + obj = bld(features = 'c cshlib', + source = source, + includes = ['.', './src'], + export_includes = ['.'], + name = 'libsord', + target = 'sord-%s' % SORD_MAJOR_VERSION, + vnum = SORD_LIB_VERSION, + install_path = '${LIBDIR}', + libs = libs, + defines = defines + ['SORD_SHARED', 'SORD_INTERNAL'], + cflags = libflags) + autowaf.use_lib(bld, obj, 'SERD') + # Static Library - if bld.env['BUILD_STATIC']: + if bld.env.BUILD_STATIC: obj = bld(features = 'c cstlib', source = source, includes = ['.', './src'], @@ -142,17 +151,17 @@ def build(bld): vnum = SORD_LIB_VERSION, install_path = '${LIBDIR}', libs = libs, - cflags = [ '-DSORD_INTERNAL' ]) + defines = ['SORD_INTERNAL']) autowaf.use_lib(bld, obj, 'SERD') - if bld.env['BUILD_TESTS']: + if bld.env.BUILD_TESTS: test_libs = libs test_cflags = [''] if bld.is_defined('HAVE_GCOV'): test_libs += ['gcov'] test_cflags += ['-fprofile-arcs', '-ftest-coverage'] - # Static profiled library (for unit test code coverage) + # Profiled static library for test coverage obj = bld(features = 'c cstlib', source = source, includes = ['.', './src'], @@ -176,7 +185,7 @@ def build(bld): cflags = test_cflags) autowaf.use_lib(bld, obj, 'SERD') - # Static profiled sordi build + # Static profiled sordi for tests obj = bld(features = 'c cprogram', source = 'src/sordi.c', includes = ['.', './src'], @@ -189,26 +198,33 @@ def build(bld): autowaf.use_lib(bld, obj, 'SERD') # C++ build test - obj = bld(features = 'cxx cxxprogram', - source = 'src/sordmm_test.cpp', - includes = ['.', './src'], - use = 'libsord_profiled', - lib = test_libs, - target = 'sordmm_test', - install_path = '', - defines = defines) - autowaf.use_lib(bld, obj, 'SERD') + if bld.env.COMPILER_CXX: + obj = bld(features = 'cxx cxxprogram', + source = 'src/sordmm_test.cpp', + includes = ['.', './src'], + use = 'libsord_profiled', + lib = test_libs, + target = 'sordmm_test', + install_path = '', + defines = defines) + autowaf.use_lib(bld, obj, 'SERD') - # Command line utilities - if bld.env['BUILD_UTILS']: + # Utilities + if bld.env.BUILD_UTILS: for i in ['sordi', 'sord_validate']: obj = bld(features = 'c cprogram', source = 'src/%s.c' % i, includes = ['.', './src'], use = 'libsord', + lib = libs, target = i, install_path = '${BINDIR}', defines = defines) + if not bld.env.BUILD_SHARED or bld.env.STATIC_PROGS: + obj.use = 'libsord_static' + if bld.env.STATIC_PROGS: + obj.env.SHLIB_MARKER = obj.env.STLIB_MARKER + obj.linkflags = ['-static', '-Wl,--start-group'] autowaf.use_lib(bld, obj, 'SERD PCRE') # Documentation @@ -218,39 +234,21 @@ def build(bld): bld.install_files('${MANDIR}/man1', 'doc/sordi.1') bld.add_post_fun(autowaf.run_ldconfig) - if bld.env['DOCS']: + if bld.env.DOCS: bld.add_post_fun(fix_docs) def lint(ctx): subprocess.call('cpplint.py --filter=+whitespace/comments,-whitespace/tab,-whitespace/braces,-whitespace/labels,-build/header_guard,-readability/casting,-readability/todo,-build/include src/*.* sord/* src/zix/*.*', shell=True) -def build_dir(ctx, subdir): - if autowaf.is_child(): - return os.path.join('build', APPNAME, subdir) - else: - return os.path.join('build', subdir) - def fix_docs(ctx): - try: - top = os.getcwd() - os.chdir(build_dir(ctx, 'doc/html')) - os.system("sed -i 's/SORD_API //' group__sord.html") - os.system("sed -i 's/SORD_DEPRECATED //' group__sord.html") - os.system("sed -i 's/href=\"doc\/style.css\"/href=\"style.css\"/' group__sord.html") - os.remove('index.html') - os.symlink('group__sord.html', 'index.html') - os.chdir(top) - os.chdir(build_dir(ctx, 'doc/man/man3')) - os.system("sed -i 's/SORD_API //' sord.3") - os.chdir(top) - except: - Logs.error("Failed to fix up %s documentation" % APPNAME) + if ctx.cmd == 'build': + autowaf.make_simple_dox(APPNAME) def upload_docs(ctx): - os.system("rsync -ravz --delete -e ssh build/doc/html/ drobilla@drobilla.net:~/drobilla.net/docs/sord/") + os.system('rsync -ravz --delete -e ssh build/doc/html/ drobilla@drobilla.net:~/drobilla.net/docs/sord/') def test(ctx): - blddir = build_dir(ctx, 'tests') + blddir = autowaf.build_dir(APPNAME, 'tests') try: os.makedirs(blddir) except: diff --git a/c++/carla-lilv/sord-0.8.0/INSTALL b/c++/carla-lilv/sord-0.8.0/INSTALL deleted file mode 100644 index f6e4dd4..0000000 --- a/c++/carla-lilv/sord-0.8.0/INSTALL +++ /dev/null @@ -1,35 +0,0 @@ -This software requires only Python to build. - -Like an auto* project, building has three phases: - - -* Configure: ./waf configure [OPTIONS] - - Example: - ./waf configure --prefix=/some/where --debug --strict - - If --debug is not given, the flags from the environment variables - CFLAGS and CXXFLAGS will be used. - - The default prefix is /usr/local - - -* Build: ./waf [OPTIONS] - - Example: - ./waf -j4 - - -* Install: ./waf install [OPTIONS] - - The environment variable DESTDIR can be used to add any prefix to - the install paths (useful for packaging). Example: - - DESTDIR=/home/drobilla/packages ./waf install - - -*** IMPORTANT: You must use absolute paths everywhere - - -Run './waf --help' for detailed option information. - diff --git a/c++/carla-lilv/sord-0.8.0/doc/layout.xml b/c++/carla-lilv/sord-0.8.0/doc/layout.xml deleted file mode 100644 index 83a1153..0000000 --- a/c++/carla-lilv/sord-0.8.0/doc/layout.xml +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/c++/carla-lilv/sord-0.8.0/src/zix/hash.c b/c++/carla-lilv/sord-0.8.0/src/zix/hash.c deleted file mode 100644 index f654e91..0000000 --- a/c++/carla-lilv/sord-0.8.0/src/zix/hash.c +++ /dev/null @@ -1,226 +0,0 @@ -/* - Copyright 2011 David Robillard - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -#include -#include -#include - -#include "zix/hash.h" - -/** - Primes, each slightly less than twice its predecessor, and as far away - from powers of two as possible. -*/ -static const unsigned sizes[] = { - 53, 97, 193, 389, 769, 1543, 3079, 6151, 12289, 24593, 49157, 98317, - 196613, 393241, 786433, 1572869, 3145739, 6291469, 12582917, 25165843, - 50331653, 100663319, 201326611, 402653189, 805306457, 1610612741, 0 -}; - -typedef struct _Entry { - const void* key; ///< Hash key - void* data; ///< Value - struct _Entry* next; ///< Next entry in bucket - unsigned hash; ///< Non-modulo hash value (for cheap rehash) -} Entry; - -struct ZixHashImpl { - ZixHashFunc hash_func; - ZixEqualFunc key_equal_func; - Entry** buckets; - const unsigned* n_buckets; - unsigned count; -}; - -ZixHash* -zix_hash_new(ZixHashFunc hash_func, - ZixEqualFunc key_equal_func) - -{ - ZixHash* hash = (ZixHash*)malloc(sizeof(ZixHash)); - hash->hash_func = hash_func; - hash->key_equal_func = key_equal_func; - hash->count = 0; - hash->n_buckets = &sizes[0]; - hash->buckets = (Entry**)malloc(*hash->n_buckets * sizeof(Entry*)); - memset(hash->buckets, 0, *hash->n_buckets * sizeof(Entry*)); - - return hash; -} - -void -zix_hash_free(ZixHash* hash) -{ - for (unsigned b = 0; b < *hash->n_buckets; ++b) { - Entry* bucket = hash->buckets[b]; - for (Entry* e = bucket; e;) { - Entry* next = e->next; - free(e); - e = next; - } - } - - free(hash->buckets); - free(hash); -} - -unsigned -zix_string_hash(const void* key) -{ - // Trusty old DJB hash - const char* str = (const char*)key; - unsigned h = 5381; - for (const char* s = str; *s != '\0'; ++s) { - h = (h << 5) + h + *s; // h = h * 33 + c - } - return h; -} - -bool -zix_string_equal(const void* a, const void* b) -{ - return !strcmp((const char*)a, (const char*)b); -} - -static void -insert_entry(Entry** bucket, - Entry* entry) -{ - entry->next = *bucket; - *bucket = entry; -} - -static ZixStatus -rehash(ZixHash* hash, unsigned new_n_buckets) -{ - Entry** new_buckets = (Entry**)malloc(new_n_buckets * sizeof(Entry*)); - if (!new_buckets) { - return ZIX_STATUS_NO_MEM; - } - - memset(new_buckets, 0, new_n_buckets * sizeof(Entry*)); - - for (unsigned b = 0; b < *hash->n_buckets; ++b) { - for (Entry* e = hash->buckets[b]; e;) { - Entry* const next = e->next; - const unsigned h = e->hash % new_n_buckets; - insert_entry(&new_buckets[h], e); - e = next; - } - } - - free(hash->buckets); - hash->buckets = new_buckets; - - return ZIX_STATUS_SUCCESS; -} - -static Entry* -find_entry(const ZixHash* hash, - const void* key, - unsigned h) -{ - for (Entry* e = hash->buckets[h]; e; e = e->next) { - if (hash->key_equal_func(e->key, key)) { - return e; - } - } - - return NULL; -} - -void* -zix_hash_find(const ZixHash* hash, const void* key) -{ - const unsigned h = hash->hash_func(key) % *hash->n_buckets; - Entry* const entry = find_entry(hash, key, h); - return entry ? entry->data : 0; -} - -ZixStatus -zix_hash_insert(ZixHash* hash, const void* key, void* data) -{ - unsigned h_nomod = hash->hash_func(key); - unsigned h = h_nomod % *hash->n_buckets; - - Entry* elem = find_entry(hash, key, h); - if (elem) { - assert(elem->hash == h_nomod); - return ZIX_STATUS_EXISTS; - } - - elem = (Entry*)malloc(sizeof(Entry)); - if (!elem) { - return ZIX_STATUS_NO_MEM; - } - elem->key = key; - elem->data = data; - elem->next = NULL; - elem->hash = h_nomod; - const unsigned next_n_buckets = *(hash->n_buckets + 1); - if (next_n_buckets != 0 && (hash->count + 1) >= next_n_buckets) { - if (!rehash(hash, next_n_buckets)) { - h = h_nomod % *(++hash->n_buckets); - } - } - - insert_entry(&hash->buckets[h], elem); - ++hash->count; - return ZIX_STATUS_SUCCESS; -} - -ZixStatus -zix_hash_remove(ZixHash* hash, const void* key) -{ - unsigned h = hash->hash_func(key) % *hash->n_buckets; - - Entry** next_ptr = &hash->buckets[h]; - for (Entry* e = hash->buckets[h]; e; e = e->next) { - if (hash->key_equal_func(e->key, key)) { - *next_ptr = e->next; - free(e); - return ZIX_STATUS_SUCCESS; - } - next_ptr = &e->next; - } - - if (hash->n_buckets != sizes) { - const unsigned prev_n_buckets = *(hash->n_buckets - 1); - if (hash->count - 1 <= prev_n_buckets) { - if (!rehash(hash, prev_n_buckets)) { - --hash->n_buckets; - } - } - } - - --hash->count; - return ZIX_STATUS_NOT_FOUND; -} - -ZIX_API -void -zix_hash_foreach(const ZixHash* hash, - void (*f)(const void* key, void* value, void* user_data), - void* user_data) -{ - for (unsigned b = 0; b < *hash->n_buckets; ++b) { - Entry* bucket = hash->buckets[b]; - for (Entry* e = bucket; e; e = e->next) { - f(e->key, e->data, user_data); - } - } -} - diff --git a/c++/carla-lilv/sord-0.8.0/src/zix/hash.h b/c++/carla-lilv/sord-0.8.0/src/zix/hash.h deleted file mode 100644 index 44521f1..0000000 --- a/c++/carla-lilv/sord-0.8.0/src/zix/hash.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - Copyright 2011 David Robillard - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -#ifndef ZIX_HASH_H -#define ZIX_HASH_H - -#include "zix/common.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct ZixHashImpl ZixHash; - -/** - Function for computing the hash of an element. -*/ -typedef unsigned (*ZixHashFunc)(const void* key); - -ZIX_API -ZixHash* -zix_hash_new(ZixHashFunc hash_func, - ZixEqualFunc key_equal_func); - -ZIX_API -void -zix_hash_free(ZixHash* hash); - -ZIX_API -unsigned -zix_string_hash(const void* key); - -ZIX_API -bool -zix_string_equal(const void* a, const void* b); - -ZIX_API -ZixStatus -zix_hash_insert(ZixHash* hash, - const void* key, - void* data); - -ZIX_API -ZixStatus -zix_hash_remove(ZixHash* hash, const void* key); - -ZIX_API -void* -zix_hash_find(const ZixHash* hash, - const void* key); - -ZIX_API -void -zix_hash_foreach(const ZixHash* hash, - void (*f)(const void* key, void* value, void* user_data), - void* user_data); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ZIX_HASH_H */ diff --git a/c++/carla-lilv/sord-0.8.0/waf b/c++/carla-lilv/sord-0.8.0/waf deleted file mode 100755 index 32ae2297eeea7b068ea20d473d75935e11b55a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92192 zcmcG#c|4SF+Xqbc^2rRN?1r(%*q7{v8A}GUCL~$Lk~RCjBuSR6W#3X{&6cu72xVWB z5Go;C_E7IN>i*sLb3f1fdH;HS;=1NMkMmf+=W!h8HCHe`NpDXNNoz+}Ns_A%)ZO39 z!OitF3`%mfakF)FwO5Af~Xqj+KW$)XvSr#Zw&W>*(bG zb@Mp6x_Nt@b^%1%Ioeo}8HhuzJV;P?l81|h9s@<7f-qcsW>k0e?sU6K7{P zUqDBwjhm~jBYBbMY4Rc$l9%%7)6x>q|EZEE)XnZ+x&X!jbl#p`P!E!q6`&)Tp_R3p z4+&uA?(gAf@8ESB3Wd75c{$pU#DQr?PpC6sADPF$#huvnKXn0|VB>7%=tA<4IDJ~? zf9n9q`VS}kO9#L@TW`Qe|39cfjsU=xY>lm(jkgQQ)$7E;WZfkJ=eq%u9#9u6FOr9& zm9yu+9eolVvO@nESHLJ)2>=HqsH>F=iR=wBg_Sn|8!{7rvd5s-By#A1P`Lp(vUT$S zU;xYlHoCZZ0Wm$X)ywllBS5GRKxqfe{c*CVo1K?0If`WQ04SiI?j##BDu8v4WUP3Q z@!#C&lm^gN8o{3 zekj5S3H+KuQCBcH6dn&X#+}wT#Gv(o1po&e!ib=c!iz)ojkM83q`r}^I8=*BfEpPS zplE$VeF8v6Fcv>y{CC;ue=ma?>p%@rIBh+E3qngDtxqsLk*A|iFe1y+0rWsXF$f$% zUz>J2tX!)13)erQ-D@~ZvO*&fPaB_ zLG^W@2;^me2cYr^@o6B!c>TX<0EX~HZN0zlmN?0tryX6~-8_Kw0;EMxf6vpW0n71# z8`SuvB@`s2rGfm40vMi**eb}76m9I}q?HtaWdp?<>eqj{&@N{ z0B9XGVP7jd;nTJxJE*mYpQ!R_1|V5_d$>aVPCEjb)ZbIWf#l~y@*ru-25A1MPFA)*pt5UME=1S5oC=U-e4`ryJ z=gEMSi!f9W>LMz7nt?2v5L86aRuoX#*TK=51eFFjFgQE9k^o9O z2@jH$E%^hWGXn!)Jvq&hKPyAY+6#MlyFvlsaA$Ji_>;}7$OXz4NUcD*AeR_&p#n&p z9Z%$wdHi9n1~^w3rlzKT)m50RH3Nf}pV$AE`7fcsRI zP3?r`iH2lqnGh7AM{UpzLDh1T-HWo+4!I zl9>WDe_bsO^&N_{lE)C-?y7y?`ALgx$sq zNJanCS^rS|zd+<9FhFnl2Oj?*!w-P1oDzU}0J8s`&Q$+1ot>l`a&82oVgA1%CTal{ zJIRJ*62Osv@o(qo=k6~9eExGI0bKq8#|c=xU4aDPBm%?$u;(A}oVffC`pLioM0&eA zlH1k4xOTC&@gxWD52BT!|8ujD+bA0^e|M56^sgE~gKX>U45;zvM#72Y;YxCrm65=c zymWwliSYWnfyPt9eL0FE8PQB zCxykz+LL_!yFLE*j{LVMJ3wbkU?+-@^WjOKsdnPvzd8IggS8dVQvSPS0e&J=iTt-D z^598Ig4vRMJWq}z0zhp7`XeC8tDP7GECJ3vjvhc82^2&T;Xl*lBtuSSWMKFzlg|j` zvgZpR1qP&pKUw}{k}LsWVCzZlRz=9r`ZM__llzjlFWGHmeaRmAFLr-+$-h?tf^K>P znZ@&Op@72Gp(MYPjqyh>HOW6U1pok0S^roK$PgCvgrEE)7f2C+R2=%ZeGrHKt8D

AF=sI7PC*RUJ6ZKc~FWq{oIQ4L3eA4%2cR;|lGEbzjrH;zl zy0NHgt$eboR z4K%LJTDm@N*nE3v>4Ej}ejOM%9&oGW?Zbh7(e?RpJtvkqk+|4cXElAh7?V%K zAEvffid}7^u zR-GQl$mdtDmK0}euLr5j+Dv%wwdC@Y2CKkoDwg&*XJ$6kTPB(g`(|zKKT)GBSj`Q7 zkyAh6-E!bL6RewU^0sjyXq{){=c3xoylcBlqc2ZmzxT)SN9LY!6DDRpu{)KXzUu4h zw>ceKd@HtRO5*1#Yg#tuBP}oQE}oaYaVWpL_jFEa7g{BV-q>p1)7cJeZR))UvI#H<1^o@Sl3f^*-?rNM_+neFaD+rf+ zOL0$+`LUmQmCdCmu6fvIeAAA{irSNfsyFx zpx_?66-J@f>~?J{t8{4fT1`^(^oqUXVrfOg&vkCO4b{VXTgT>)RLxVFUc5K_3??%k zGxHDc(oU_leY2mL^=tXD9#B{5dMb5hb$r~{&AVahUXguVJkup^iQV0PksWN~RF}PP z!>WCSPhfMx3T4Fv=ePZ9&DrDoy3>31GtFOvgBLvzlo(tJRly{8^W>+UiK=fRgZ@=z zS5;dA*VBV{jV8)-R3<8B!dMpJbt-s^6D z>ndv(^>D=1jAmcu;kB0~k5$$Kr?SObW;SbDhU(kv*7nPoT&Cp$YQ}ChuNCl$&8=}b zgv(H9(o@h=oU&zz)6s##;Le8F6gFf0D4Pz5_6C)30fXTwkY?B|TZY7^2~=2BgfSYa z`UpLk5s=|9IFvV{NlrY>3}9+{hUi48u(S-A(1j3&6zv^j(Vs}i>hPlC?Kn0NW7r@- z#;12z6DlMWrj6{=Ngl$F{>BT82I3(*s%nOKZDWjMPGLY8#YrkdCeqWh(`v$?r>GsH zlLbZuHO3UuWpauh;UUMO%g!QlgEADh+hKz)Abvf~FeqRC(`1H(bfMvZqLSQH)sFO3 zS^Q|g{Za5YL^vBDH!;E5L0xV3_p5JV`DY0Z8q0$>!1DYn8Wfmzy0o`;@vZqid3C1g zc0}w0r0H!|>LCT2Byd=IEhWo#_pOvRf;z9p!vVL(rI;1Td;QjxSNdzqEDg|4Am}nx zQJz(^toz2URw|vPZzQbUCx7J!-}=Qai5?1~?$bG@rr4yR*9?T-q|el^QsB;F1ND!< z;Mn@P+4jrl=KPZ5d0zA>wwHP@cx*OJC)xVO-IUXB^JEk84ONWit^N_l&P=R?G14&5 zrV>OzFt~|Fg+O@11th(ch?dBRDMjnOfU~vSf?y9Y41N(xIUHN!5XKBW+PJ96fkh@# zN!idm78SXYKtoWwM{%oz2*!-jU|Hk^Wf@2HDG5VpumB4ZB@ODt!i40}oiewjQu(k5 zeGC?hl%_Dy93l{~803&F4sR%z07{XTrUZ=%Lh4{bf;bc-h=`;?c0jQDD3}n99IGKn z6Tw`oFOR~!MntKfPG3s?o%OR7c43J3z0+CX$JCM}qj>5bSkO7L78HuFSHpEjW(g51)qo@rG z!3^kb9GC?TL18h25OgoA%m|*KjcmnA8{)ATyex_afd@+?JCKA#D3XZLMiH?PS%M)l z)er$@kV7%{;?W3cIRS0L5MGZkh@vrsgRv+YX(AGh2cwYk+H#RB+E{_!BnTM7NQ86{ zQU;}oU_&e=4IUv2$!CSg^x*oC1X(bVx)#?V1p-5=2w*S>NdpHH8Bs)J9U9ArV1-~% z2qYE@))yo~`lRIsWm)*JkVtuy9M(XexfcbNBMgtpA^WtcSqRnD1PG>&86htS8b!8_ z%78U7L^(78EQslmMSw9KU>aFUZ8$Y@h(?-)d3Y2LkuhMUVqwvyW+sZW$YD}C4G2Rl zQp0+;lQCFnX$)RpybX*1gAvlQ+9)J?6mol%D6WS^A`@At5rQ;eW~3}61xpxWMl#Ew z>zJ#s)SyHJ3*Zd_2+9x)5l1l~2pvFR5^3}yFd<3=3dt%c1xBV)QX?*nfei3ieK4LC zCZrANg-}y>G78jo^ire1;vg(SS{sFFqb3Sq5n4o6LuoLiO^zszMi_vwL@ZVd57z9| zBQhG&;92pIAr?jg9wmS@ltQzDh!AR=Oe=1%(-4jvMIk#u$RSP0a7rSpUMGqMDbPU} z#ZrM-2|d)>NG%Ww&muqxMlr}@S>;9z5qJ!NFhoRwMGd8~V8CnC6rd6?22;bRjl!jB zA_%F{)Px}|q#URf&4@(EpgVfOM5rN)=A|J%9F}o}89|iN7o=ObLj_61q{3LiSVn2) zd}NBDARi$dM9{?OL#VZgG*U^iSUzn+!Vnr{$c!Ys)kdf9aYqtvRGyT^biGtQU=s!peYUm6JTHr8U+@U zgU~>3Yl5mfH9?&M1Pl@j8rFxTbm}AY@vLA15ydKx#j$Eb^dVB=U~QNXV;c+vLM9AC zI(kzI6EU4MI75`6JSL$P#fnD{qNr197(r+Vm>CZuL`$;@3^Rinu@Eo~+5itWU`{3= zA%6_L&okAR>m<_c?6_W0F=@z zD{6qy#Elq&39$%J4Hj_M5CShXMuQ@X5%igXyunIy2Hl%rAV+;0(ow1pMWXm%LgLBH zouX(+!eFEz0@E?diZuXhV@0q6XzDgfG#my;%Hk=}kq|JeAPXPLz4%KsZQ8Dgn|litMG=M#*77TEmb>2tAxY9|Ne6(5aas z7s-e)lm{6i@if$6uoec*DoBI5ghyy%1|JJtiWJwv(crZaSX?bS_F1_IM*I>Dx*DDE zn!u-tm#1K5L^49!3=lNh%*>+@0YW&6nGmbj0i+IX=3zln8CqLd1NGtxeXbPY!}rNq=CRRQ^IifaFlpxEhe0i@iABq5{Daw z6e8tP8L-sDiMTdOLsq0ATpmFXxCEv^i^=~g_hwqTAI^FAg(vrKhwjSlZXCOOUxLmS z^tZ{bmCow#`d`yx=9W|7Cax%5rafVkDRo|Ewu8{`II5)&p}7!iXK{?~*+x^^?_usg zt1iQY@?+~T;9t>2-@ev889e@3{M&wqOX>F`1{lX!pu2FL>rux?QLg+9zhz!$~(Tb`|3A2oVGDuQV?^IL#f=2lg$4g9O5j?Ffv<8&B)2btLhl`#rrKh z`CSwBQ~o!Pk>JOhN-R*H-k+a5%Wnrimy<^#SSguJ=F&A0JyFW;Hra3LXdv7hb2Jd) z_8|7(8u4dIG7F}g#fI8WtkdNSzY0EXQf|~eqP|@~%@trctsKiZ!jYPBQ3ur1JG!`3 zbz~{S&C{WtkZr|gZ*I=X63-V`WCerU+>?Q+v$4DSDklkDaJb8S;nai3-NbqAj*9tP zO*NC1UP767wOb4cJ&^2;%s8y{M1bbuQ`45I_ucbz%{$|4<2T&jj*=W~*zv_I0qxOf z{)CTn(q$foUm^QFS6XlA$xd|;?|e9=2vfRSml?n*B}U)-T3G5$*}%0}5$n9KG!H^2 zHHI|?!tbiB8n(3|;%cRLJono3)->-MinRTbk^XfT9k{O$;K*KF^m9`u(W##EV=67J z#N&@=zqDpO2)jRXtswZ#4_G7eDSyTtdjK)s*IVqR)l@7%!wsh z+S2(RD;>dv+(P5Blc2}tuT*2=+;Mt3A9HY{T~K4u^LC07%(1yntG7RnkX)iJi(PM# zyX(Sq&Epr-6HO_*tc!Q+UL@Oa=DZRgfa4a=Up3gy0S$dNpTskt7YyV4Q1k17ShI4xQcc@W8z zHlXV45J7py>OlzZ#;7d`J)kD-{l+^^*SLtP%(aG&zJx2WRm$YuhrDD1RwIa(!QIj zYrS&|!aPHxGg=}>6!572a#iX+%iPm$$l#NYV{B1xnts^kyw`bXw4wg0`{(E`OemY< zm0Mw%wN& zW3>yG+{h{4+A>b0RSL}TK8c1}J~on9;#x&A#L#A;accalKG&m3YL}gn@UpE)c6LrT zr0#ikwBK05bHvIR^>-!f+1pLlg-+SiA^wJ|UVBCsN7;|BN_^AP`_>dXW@HH62VJZ# zdMFSTyD+yt>pId>X|(IzFY9J;;T8VcIP{m=enHLG;pJtF!JE$%k9+>6QKRGMlN(>X zhIpc5n}4t#ee}7go6*d*|HZz+$L`?sh$DgB`GtMvthQs!qr&{i@z6-lt8lj$`hwD@o-_v%&d_Pw0*vpKUHl4aRw zp!-PadGQS;mF3F;k9|wA$6OB1Z+uB|2O9&sit_JP^*_K?tGm7I-@RmvjZQ5Nu&d$R zi1aROYgR4KXwtJBl-BKta9*#x8FTIU(0OW5g>MV0yZ$pjM0IHR=ZgNjH_5N5qVIm) z%`_RGi=j&`wa$p+&G2%XdK6{Osd(Om5PY@fWA}ku^zO6WS!KiSapTB0a=+X*o()03 zEFKC|!B*;%*^k^TKIL9^(-FvL&QU1mdY>}*`ui={{vD(o6^C0FoG0r*D#C4CZ)j29 z`Cbx&Ux2zbvS_f<_wb;^>}tT>2v)o)kKqNm8L0$*fjzC%0!1s1gPIQS<5y|*J;$!k z%|#Bu!Ive!MvW2Xa?VNiQN>j3LtFynza6SA>-*i&<(!vTjaO^v&l}pB`SsrZ&f9Og z1Lp0<{N1`m>MHrhPe`)J5WH+7&q_*13`6Rr6!$uwn6`MK8%J*9 zOVu8zqZB^-Yg~-Kz!^bO(z}AXNhvu|i;!mX` z99)E-`1BHD07TiA2^m8K7_%gpTAMaZ7bftxmPX!bt^mzN9FQTIR1;;H#G>i zauYY`yAxK?vfb-;(LLDkQ))Oq+LKBG#~7^3X;`cH>dZn|UjJ2N%ZAke;;}`M^E}Qx zel%YOllJ2Z(!iH*)w@2KZWioDGJ3jIlQ!MO%6AmJA(s^JhR4oAfdx6V%)|&2^6%r} zma1f5;p(~wxyd24Hr^~|b+{m60(M;(nT}uAcz*NEXnzJJXNg1pmhiIlfV)S}tmRvQ zE{-ntA@fX#5knOBJ6%cGtEfpx^G9cxkmIFojN`W(dit55jpv_yR2fDTGq%lbyk2G^ z%g%ikdZvBx{zQG5S37T%_Q(?(n+wu(wk;n%1lhxc^pivf63o@JZo=RhKYF$3*#y?c z=ZC zebP-LKKmy&+W~zB)8ls~Frm2kS2=B%l%%_DD6T44ZAFiQKsp40A_&n|3kO6?o*84x z3)=HLrW+-=Nsh^&BtACYOPS!k*Tb+>R3grurB&ru5r30n%~Yn4u`gq+COaNd@s-7* z3p3T&b#^?lv5;W*`SGjQ(!9#nO*si>%A79~r>(CSDclwigs7(F``*o1@GrJB=Kgf! zYlY?wBIRx|KKyK6U;W2|_5p@!1EV_$@(BdU(8y&4+#D?l5z|FfDWsQ5Xn*LdNcljw zzUMr}ndDP!pqWlXS`;KwDV6rT2##6lWzH80Q;`R{YS9UjO8)bi-6_H`$q13f6`#`7 zADD|A1c5W7@k#nHc*%nTw@O%?XY?nRkf^JoFC!Kfwb&2vcX_9#8@jEz?M3_R%Juzm zs7$77?bs3_I>m{=hr>(;=^xpzSb+kK%(t><4LfG-&kDB-$qEPL)@NVeU768k=Zd*T z+xUHOLNsUK6t_I*&WmBv-M*>JyJZe8!R3J#Zg=ON;9s7Seh!OqG;=r7-OtU*VKU@M zb_t0UQg0%;H3kT)9d;2Q5is~|Eq^}?PunqWmI6!?u2I{<^Y*dbjt^;eb*QKAqEu#fhEdrR!7*q3^ryb-b6}cH*=QRk#mB$M2*#AFYqR>;1WCE+{VEOvn$p@Yb4TvQ)q6l{{jL{myoX(2+6bd&xF>21OLX5V2)2A8FS!7sqw6xk{7 zbWz-8gUSP~-Ia96SZbK5RW!Fxz$M-AYn_H9)9Y-CFriC}{OqOsFM`INd@ju^76QI5 zwQ7iPL#MfU{#4x>c|ccqKE+_BM341?;wVz23OJFAZ1BDNd2uHRV(u$pIds&T|4hUs z#g#{D&i3F9Y%HMdGl+^+pyBbi`JcbH4}}jWV1D25%{n>3;wt)QGq!jZ5eb8z($u-x_p0d|JEXG!mv&i;0R-S{vH-tZ$IF8sJ#Z2(*|sVd~0!y_#i>D-0At$nC#@%GLU&L6+se zfS$jAIji#&CtpjjJ|pkgbiY2eu3y834GehPB)7@gMepSvbp;{fHK~)#0ltyo_j&4h!)$w3$h7b~ zG2y!JL(k-vBA$BYr3Q%Hj={p!{XQV%cNt8`j`^@Ae%H*2 zo55k^`=!n%z2~}Z$LIEIhixVch2snByMnHSCZ78=KI!>E@VAlgTW&VEmcf}F>on^t znuWJC@3#IJj(kPpR5^N1=#j%w6s2RRYZDOsS4z*ypRtfg}a6?X{q|ZbbC8Lc-Y!z+x=rXW2IT1K%HEf zQRJ{Q;nr>`>Bt$sQS)T^+dY?+=&rl_y2O!U8ruW9azKimc{G z>2X*sEO5wX-8T1u33YybH!wLO-PyA^@e~B5_R>y}WbL=x?1$}wWK}KK_Zi2}H@o=1 zlLhvqi0zgPJBqX4Px(~jnvGYI&IM_c{u@U=ofh1tQMnWE5)XcNK0mq=s4V~9w`~;d ze?}*Yn!+Tir!-r{;^(z7)yvQb0WA!lU+?`m*Yn!Pv+A>`*O;F0YOl$r7C4ptLtGBP}3O7_m1Mh1W zCq;sH-YMpxH{bDIzb*+H#FsT;#gEJJ~=G@ffw28YGeQNODbl%IQ zUoC#&X-0CCAR1#DuP}P0gX>41iuD9IA-0IhTAw+KYsRo8M39?#Xv^$|>E~zZucRqx zyQicE(>@sdV9LFv&!sjtqybOkv?byfffqBZMRD+17(A=U=4VKv#{J%BRJr?=im}^xg~c~ zln4T5vjlp)oBv#buVGKlTWnaNm`}j>i(*KZ=fYqP8{%n@m2_H$+p>Rj)T9$fd&sr5 z*~t1x^9s{!@g$gO>N%DsDsc60;PvZ=*4ZUSOW~0-1}gzf{&B(3&18=$p&3I~w3FeZ zRXA{%xkFcJ%sM>H^Wyk-=GwfoH$L#|l51UcTZj#1T~z_ePWy3YM0hK9{(e$;2Xbl)t2c7P8JyomNEDOY zbu_n>%$fY=I@uK1Gw$YS3Q2xA?c7|d_zWrIM>_?uH!mqiUu!3M-58n*^#&ub#X&2lXFjNKaibpv9T$04MjPf>=g>N5Xk9 z#f9wrD8c-a9{MUFnf}OJHIudi?NzLR!aTU^yvmf)Qw8a%H(uB7_8SQ&T<-2vE0}NG zz3{brE<@zlS*^Kg6Wq3+t-wc*9y_nB=`JR4Q$uRC()yx_sgm_#@3LpMsY&PRomdNdP>Fl2 z*V??Z3WM`bALiU+ONHxS$6N}t1oehWnJz~IOphA)$&)z z3ooZ!+1>|+g?HFIig>ij; zqm`R+(Oo+8L)*u(io>>fTlrs2dOm9g(`EJD$>LLZ#dVn4p!b|k#-*as;QBcYf2JgJ zCH(esKu5M=shA4p;hPKUFM-!h?-i4N)yj6+4n#?sF1Q(~!i27QMCmFGuZ=Yn-+jcd z2NQDWxhGPeTyIF_JVk=+0LL-l*cfICld+Cs!0=G+?2W<%o zQ~EWwX8FxW0nalRk{l;=RQ2ii2D2HSLS;IGXSnw=6?>M(U(@^C9?hoRY*K*1j}(lKLt+HLB*zL#jmA^49}MRh8K?P-o2JJ7aB8PErMJt)(;ZDwk}6 z++J31XM`OmDp`FR@{4{(`&ypi-10a~XxjiG9=4(<)i>Ei;7>oBAjJ8$2W#Q?-g;Do zgnq!xy0g{${@(i_*hteuXM#4HLQ+s}J^K98{mR(zA49Jti^?+R`0q;?&kIf%1*<)8 zwsKx@qzQYx++3yi?tJYnorH!LmKS^43Xd7TZLQxm5RDb9lHdb{|f$H2Mur5d}Hozy|Gk`8krxm_O{Xxl^30Xa0WV5giz+hB_X9EHKGr_(Nmv@G7t?>pKYd2vVd-&_v8u|5YMb>hi-PYS z@S{;^>yHJ+aE$`@d@~>38pM~9J2qkt+u?kf9z!|9kEB9fX?bHje)~qn-@ONKf%Y;@ zA?6&Vd)QaZl|D$&xeI$ezKY>ro-5a+4TTBi(x|-ed`l_tP!cBeT5wWM=)7ZF9o_aw zr^@*+wd{}f9gRQVy1V|giYdJ-GRUy_4Nn6DD{&x8QwE|r&-rEH6AT`+b9e5>CrL7B5&gIxv;VBAy0dz}-i|OTqOweoo=tMPk%;h`dz)|8d zUVu#@%)!C5Cc|@k=F~)ue>Z*^WMa3b@o5 zQ(DylkV3mhoKWvq+Gx-3UnU##a@pR>q++R(nv_6QO|o~h)jX<3YnxYxmjb_kEzdJ* zK8W`=?$EMUYr58lj(Sz8dm%lX&Te-q#;PHYo1&6!vS2creKkYe?`dG;isx`kvmEVv zH~8zI=y1P9Z?4};$(#lWQLuzIfyH+gH=PA3{ljy(f8M{uYsc}Gr}LM|h2fTHFLD#wC%+r-bWYnMB0%?yJLE8U`%POl#~`UUueMH?L zv>9jy7a;|ZTyLrlem9;g=1bXz<~~5rZ|wQrSmppbT<H%?nS`2Ox6c5p||^4D%P*xJR2ubX|uu%F`rM_3PLFLAn|%>ddWgIquuT^v!;*u zOK-h{_8(j2WkhjrDr*Zh1WzA7_gze08;4K%aG@uCTUSz*FT78kwCVnyspo{iEUd!d zMhh=i=}9jj>hmHP5f87RhKh~vooemws}t~qsplH`bHE!(^wplF+xu^SPBUz`(s5C5 z;Z{&L1UBz}E;dMHWl1o_x@puNH$=VL8GEH}6nd0*AZK~-kTNeJqIDM$F{X4W&>!E^ ztD;}hBm435nZ=_XisKyB<~>GZ%P&mo2#Us^5ZGjIYbmI#`EBgE-CHmr39QY%f`ZJ* z4*vyNp4$15${&-=ze?(hWbL$H)g`2g#4ydV923vjpl*)X?W=i5+dH?UCP|Dd8HHpk zzc5ARak7r5%M4TIEmB_3*P~uv-SB(iP`Q)MWAqjBp6YOGz3aMzt_Dw5ZrxJP&EdV7uQq30`Oxad%AL9ioY zNb_?M3|@E~zh1=3khZ@Quc7n)?#e`$G3vYOuR90(JMQwK>i0(mDwo0<)+Jr}e>62; zGn-SBU0mS$=$z+!>h0^xnyQYT(H>gD=}CG&5|*fW1?hC<7wOI>@`<|_M)o*FE8b5{ zBL-i~T}YwP6K57P#a)u733_}dV~kBEtn$L`5xLPTh*xYgT!`F(XkDh#g0iU_|hB~twM<#1fTVtM(6DMgwz&7UDJF7#!jCR8`P zW_)n*{12&ItK;V1h13yEnBQ+1sM32@Nui++?V<`96#b8X!-I;!6p>9nw}EdTs6;7^ zB(u3Goats)ul!7|F884P~4wL2o35cyg)3eR0 ztGx1I>JPdUDKzCgI2qNpl>5LiR&&HTW;1wTll{nez(7Hps!718jJLu=Arx`<*SSw6 zmpF9pSrse4J%pcMP}TZpZYZ8B6&cwN;!3vci zmnF|wJ;{6X3mV)<@D*@QG|JdII?$2*e%RLfs^gOt2+5f4w6y_Ug^f2zklhGNGO4B?kLTbt>XJx7kyo;s+6=_rBgQN zwL>_WAigKb4@w5Nr5mp`!Vy(<#a*G(Z(9|(YPmGST$y*%BZaT; z`_mq7>z)gqO>`M)`L%d!hutZYvZv-sz31_5JOp(s9_$HLN!7{sm3pdqFHHb#yinnL zVfHnry<0`xRmu;CSu8Si54)cpK4prq{177iUE_&XZkPFwUaLbwk9B%z4Gb>j26>{m zcxQGfbFRJ=cJ9M_-!~gBc~wKp0)pQz=BGx%IMTU)zSth8ayW(w`Nda(X;od|`u+3~{Hlbiorn6oFO{bURD{?=CVZxE zIOQQ;i9HmEj-5z(Q5g3;w=l3i{CC@d|86oHuaWC5sG_Is)%8ygyMFf1ono%X@)uv| z!!Ugb#S4avl#jQNglu)<3qXmuJLWcnNS+Pd$8S@CbY!gp(w#bLak%t&Q|uhiP3tO# z^Z=KO4JQ6k_e;g4wzTdNFBNbwV2s>FR-tBB%2gxz6D|sI`LaNbR;{Nb4=!lEQg)H5 zPVa2b3g)d_U8xyye)((hiV{kten>e=LC7F|!s7jQ(9PDBAD{Iv;x_Kvy1?M6qE>c% zBHgm0T;OqQ78KF{3Ej`d+{B%qLB12cbDxjS8`tW$ciA3FV4sAS!GQlRW%KL~guq-a zGhk6*HD+WseztH3mUsK7r306&>qTGaNiahx^{gfwhNjdpDVK4W~mzHjYE!L(5d{or3Rq zE5&@qmLe=yhAbo8-l+%wM!Ii_)ZW(^+^#v$9F$1hC=Ix%QY;g27^pLQ%{`JBA9llr zZzuR-J8vn|L@@Q$3kA(fixm~di&HLjjyxsFl9I38hc16^;#5DwZT8Z8X~#dXR;Bj5 z)orQR^O|mbbSwG~?9d)jsZ-^YMkQ$ovPrQk$mx3QW)6#+Ig1?QW{N z*R>lRu1}lYzw9k~Zu4yMyM<4UElmwOdsDsZ@7jjuvjXlvsvp^WsJ<4swEpAE*ev%E zo!EgocUEu=@6`b5C8G*ww~g2i=RMTG*>^E$nez31;fcLQrZoN^uE%hzCm%jmxJS9f zeUXZD-BijtX#2%u)<895e4hJt%g>A&^9lc_IVS1-H=i|EIHS|;J@ziV@pO3DIr}~4 z1KfbC;@r96M;&S}CK@e2mGb(w7XnZE(dH!=R>Dg&MFQlRV!pIg)m?@Cq`8@Vbk-Z! zGI=1C+G0@kdC@_ULnrK`um>q zHD6$@_qPJB|86dqw7oVr`=eIfRTL97NT3dp{jU2>C|ctS?*OgWZfM5Ft3gFJMiAR2 z5ev$Vuv*JC#+mg&`u*GQGN;;Db~}%b3sm=mA@5cH9{|HZJiq?CemQ!3JsD^nC)~Zq zLH%y!7xTYOBHhHhP44?E5&> zb8y}4``yF!k2rAtkKVo!S_KOn<>i!S_IDcdL;EUKj|EtO1f(BX+Gd`)c(|M~rv*7yTD?3%1*rO{32a|BmzH$vrltbi)5&m%292h`mVaO4DjbxEH;EgdoZ0uZDU2q8T-NKduvtCa%D z5}=O>n62O8HgCK6PnynT6yy1~2y`!JR;^ztxUa3YyAW*gVOLMc66LLps9Y4qN z_(>v1M)`UjhksC?k3jegIWh82Rs+Gi-^DxxwUNGsKm>H|Dn!^MUhgodEa^^3X}D&R z9!8$K)!|6O#}jseFcmA{3&kI}QXzmcU-Cwg)>aZ$apal1H$nA}Mu+iwxEMPOH~r4l zK0KqqBPPv;zJiOT*8{)qP}@^$M&#biVf^1S868r>4x-M+7-!q)%PTaqs5uovJ4}f#$Un{wKyKZ!bExo{@Zbej7UMUeNvn^^;8}=GQFT zjP*5DV{nIeO8}1mop#R;SKa)omdrOK=?iRzHD2r=fR-71UoAgxT!nbz#~%`n)W_!j z9OJW2s{D5G%|D=uZxWF&5mXiwO>x@X?XfZoI#kg!T`(0sAhH)dWI0giZR6hOTk)H} zK+gV;Ra?YUPi8j^`k`(m1d0m`gKGsgv~-PxDWo4D_l92R-|)sPK!CeaD8~>fls}IS zztyU#<3BZ>JDyG7dhs~P>g%jm1JOlaSAQZS&HbM^+vw!#?D380 z>}V?&p23;@eh9X<9uuwI8x~$;v-W#@mq3Z`pG4Gc!$bWev!)L{N+>zDP7eDmy#pgA zo89A|?_o^*Lm_MYcOxbx`^r5o?d>F#K;`BY*j`mDiH%EV`O4YwAy8AwY(!OIwgZZ z##&|>RK&y_WVAN+Y&C|NWurzKGc91vAzN}XNgs!<8s5aK7gWOr(7%%>^kH3HSyI@{ zgo8SwA^KHl;gdtGUtdYw-m@ZWgovR3FY*7Q&qjC#&8R%4VB=P-Prv-zR-Ur{j~uY> zcRG?2#xg=S)EE!RZ+@9Fi_66k*;b@JgEVNP)`y*E_Rbn)Lbw=$u=1=3}=&!^)$E)x9 zFz^d)+q3cc$3KoKVjp$89gJ;93ohqq>!m6=x0|K%taxsX-izQaT_g6uD2Yxa?nOrs zd?KWP_m0j#xAFNbd^ugk-h#9sgTSw_ehdJ}&1v@Tc&@Xb-BsSl?e=ctcC(dF&P)`3 zE>PzMbDYk-%`n3t!?&OF{JP!P|HHrW`XqWo$b0#}j+=*Px3^&&Z$82Kcl!R>QQxk7 zwGT6gH}1EOo2!-C5=R~@2gd9mp0#bq1sPw}dS4Cx9TCj&o1T;lCplRi~QVB6E zwqRpboJdO%bfs056@wXI%EdsamKv?2P3XiYrkgrZ6%-Um=)@bTgTzKv2iz#D#Q+#! z%!MN@%&JRDhUpT5gne2t8zxFf%R|U2JgMBNaZWfJ+#@CH`&b4X3XJcnB&Epy62!!lH7 z>AknW7%q49w!m*JVIOnzY#2Y4v?I6OaIrsr!IOHn6(>mswqi*ol~t1N$0IH2$RMeR z8dAW~Vei)9?;#e0{9e7_apA~s0%I-Df)AAERnFAn@}bo6NP zhR!A^w-q`%MUr}G*LA!n*T+d9u{r5vvpjqFa?tDp@`BfGfZ57k1VJh^F(W2affU|^ zn$hU5qw=pj%I<75=>rHE=ptZ5|F1(h+Ra;XIPyXI_~U-2e#?Km;C9%UW~AE=IboxN zk&C8gg5HV(;hNMREAmui^mns%fg>$GdHs@exMhyxxY8$3>!6`R6mcx9s;gwhBP~K( z&}&O^&6=tzXXvnL6n39GM(pd)2iaY&>q?el^dWau^so-SXo65#%GOLQPwX_-bjQC= zxl|BRP^bs@ML2DV>T4UFph-K$vq}ND4jK`3>EqB@`qn2{m;_Z})QJ#Bx-210J9Xa| zK`jn2m67thykDuWiJH9rpC9V}s84%Q)&>3QG3Y<8khWHv8B=XggCrw}+={V(V^OR9 zxvbuRfFZ;A>}OvH>sy8OE4x1w?%j(~CP%2^s@#ZCrF&f;0|}&HQmIIa zsaDS8!!#P`(P&E06?kM5EYMW0?aoUaA*4gFn*xY+hGTHb6;O)B%MuS9hge0KST#YX z8-W=@u`$IXEp)Lv1}rG+4rrr86gg!}Pf~QHHjN$5aO%=IX5!&G;G!jU!m*|%$Z<|X zN&_J8w6kEGCTA#?g$wxq(EluxVa~Hj+gExCz1kxtrrTksG%#a~ZI8-K%B-;}5C_8` z%J9pDcO%aFvR zm>)43H{(wp@y?u}b0O#j7+*ilt~NDF@ne3RHpOcIqq|&e-2JA0tRgDhk7Qp0;|tN6 zR*-6;g`*XMD}zo%*#?m#XlAgVRF6&RDbfWx;97o;wBt!g^f%TE3Fmn2L_J}F>YA;-#3?{5S@_&iOv?2 z149U)G{*3;v%EU6>5z>gE;`=L8a1jn8m%F*>~5s}%GHIR>N<&;j+_oiY{|hPBQ1$> zok*=CCfh8LjI4Di-dp}3yE%A%Rs6jBHLo998OtiO4n7t2^!^!42j9mjrU9#a-CIHM zUsz!fP)<>WJH)=xbR&j~Ta%V5KWv5&6q;b%A`vQDi<+eeP60&wdAc^^R5^*5;jQ!Y)q_G2jJ%y2_MN4kz0ic2PDSeeX~mBzsjXN;^q`cp!$SU5C`*4v)tozpDPZBb zhL&TjhPL;Kgf!7h<2X%JMJ{*h>Sksz%P`b4PB)z6>kP1jjWw{`)Yg$BZbr>3O816b zX{O_mqOww!s{%o`IFn^tqB(lhx2Tk1f1*6f5p*0TAb#YLJeu!1*)UnR z2POQhi+;RkY?ZQV6BdRx2~NjC@f&eFCR>ftAynZD8H72geLFOno+sdKQj(KfH6{=# zQH{l2__#Xh!#ITAfPjHCa)HK@U703zF#k}1O;aXK9Gd4q=w>>}&pL0jjfuUQ^^I&* zSU(sgp$0JiH=yL%C1%^Zwe0$L61Hq4nu9$BPN!}w=>MOPU>y91-Y)RCM9cH zglmp>H_@>P_JPhA-XksA6e*2e4(-vknXV(Vl$$#SM-aX4;_Yh>5HZxxWDu5fR-X}20f*Ey{vc&KRgs;tvES5gI;HzvtZ z;FdZC2xicO8_N@$%-Hx7wbte^MO%bo`Z*@BTo@yl*B6cQ5v7FzyI#c@I*&6+h`_K! zM2|~ZHmlpMcIZHYu&bWWeCP-iAaR8_G7E3!WC6}lCPZ+nNy(UqLg%gW_Y}YM5dF5qxlyQ%@!BzZo#aW9V)S5jw3QZpCEDia`%{!uqiiN`nk6TqmG$W8 zglvY4a|3o$WYF@-Whxyb>`YRmlOD@FIZ2YE4>9KisT_J*6cHCbk#J8BC^;(**-wgQ zl?J{rO(5w0@rhvLTz(exZ4NPT$i~xpYp`DjOwWe{?1zqVGCR9*-6+Wc8sHy4KR7f+a(v&@}* z7Z1rr&5q@P$<{E1R@9<}__-F4b3<$+T?F>_oj<#^xBo9J*SB+2&eF(W3;*PbZH=pn6}YwP!y`pfG4lkPZX z2v0eii0yVX73eL`WVmlHWFT0odTZZf#{JkD`jO4AF-eDoSw+0&IDndy&+#0t6 z7%K({&IQM~tx0zPq9$)PZF#>vYt~=*xj9Wd!fkjiRTO--A6KV58ByCusyzr*N-Im7 zE``x&&*1l)7tcFy!{yPgW4SG>jR~nPuw43G0cR!nBQ3b_9GyJP({VQ_h(RFTI5+ps z=nKmg8ufD@pV2q0*=!5StN2gOhJDuIgtZ4xIY-Xoae-G9MWR#rdPH=QQG6 z(c84NxrA>O6HP%QCTUj^aj%39AL@R{tnH-X%(`hr&^4Jj2-m#o55CW#EiMFtW*m;R zghnYu#+SfG&HM48wrb2;hkcmYq=XJ@G!!6{5hEr+d290{CdR?0GR_dONqk(vY*~cM zt^&-IBAw;nc|A|{PIpJdZ#K?6e7z@{emNZK=B&Q5`~iq5;E7PB*vRLM@-CgY+}q^1 zm)O>;=_B>&5RSR|Jx?1IX2x+JID_Eju2H_`jYq_-cFW#a$hyt-y{FjO&f4c*JLoLg zpZ<6I*#CC6#}IJm_0K1Ox_fWl%jB5CHSv5g!qR#t(j{%Z7MWI|;|?sJst>A_;@cx8 zg1n>7a37A>yLzOUt;ihA>KkPYoQ=iOQ^00L&%@(7MswFvwxlx`4CQ?GNJb^;il=(W zB}Qv>$auBc0MTwM7B)V709TS+zb=M6BbPLhH<4^sMW1OBX;`&y>l{jfOjh=wx@YVT z@>zNC*E{lcdlRA8uAKT7>HNfLaF<(yzhPaec>WH-wR3h7J`V>w)}?~uPth!+37OHO z+Up$~J2g42nHVJhC3Vq46Gmd>=o>+6qtomdb;A`=XWl0JDgA#zFK35kj_DGS*FO#I$vcOW}`)*bUJYR zwyoCwALXX`W8=p7yqkHEAxuqnt{ZD&|JFuVky>n%^=!C&m1Soy=}k-1(K=c#lq2CC zfY>1LeI6!c*j|8&hStni&8F7cB{*xP5k+Gl;PjYS`+G$jo!ieH(Y3i12I>TX-8+eu zIqA+iY+##ek5kGH((7e6#Ymg<^`5g<9lJ4Gj;6m`J`CxfC14?P{RGI>@e=MhMw%%;FoVf)zF6F8eN z=bdp8K&dd{%`9=75h9fORTE2cAON)Dt|Kip-=~3BX!CA#!&W?Q1t##gWJbw(2S)K5 zXM4*Vo=io-7uM~8Mbz*^% zt<**wxhZ#hE2UR@#suTjJ_MU;ASE-0@KfI-`=IKKs(VaFCN(h=RBWIlCKhIrgFe*~ zwP?a_ZiWI6R5fX7kWI3_bn&|ew>a;mGph4k*2NG(E9?wZE#dJbgHdtOgTsT;?aRIZ zNOB-8MG%k|i37QGInmt?i*}ySl5^=zn`Hc31;iS$)6`7@lO z9pT*03BPJoFrOpx=7)=~SYe231aL7g3BPw9-Jn17Q z8gdn9BQ1@ftg>^11j8t1Uh_DrPUvL-A4PKo$tKc1`PZB4atC~3I_r3geXzH5txk3IOUdNa8O0!y%r7)7>~BPNU|WxJRv{6zX`w!vt{)L{;- z5aS+dN_tUJI}7Up@niLr#5Y{WuYcHg`t>iSL|0s>93E)`?8Kbck|?bvaWEm#Dv1-- z9H*ZJGMxVxUaOCLJ03Hz$Rj3`P5GFYO*83jAgWg==2Iw!RvqtJh1GZ-9M!ggqWkK7 z@&R%Xa&Im-tuff+(_WJ6J0-f2XyKlS-xntR{qZ1Wb0~ri>!X%MIG+&n@&|qFXg5u) zX4t`K`R5+Tvutykx<{JW!#$zSBzAPmd9vm!A#f~ByqKIk!c^4k{0Jd~x@qvs&*nUc zy~zH4zjALpb|6U|i0jVML0ivKcr!hro_jP((jN~tay5Z9lYpEvET3Gf?;toBUAc6#+NqD8jZM+Jkc@jBcZCkE<#p= zwK>%^qL53(e7+_-XC1scXBwRl@Tyc=9Sd)g?8HHOoISD|5u6e?#E#{^Jsh(hdeoh7 zL9y}ESa!T3d%jqP=a`(NoUSFMvi57$@wZsVan@!$xZa~nwVui4BzpR%Dxb$-#mhHj zfIzm9Q)C;l;rxAZ66H#md2}N!InVrs>=SlAXG!4Bwi3|m=u5U+7naFk9A#vyj7A7b z6kTs|sn(mEw5WPmYLzt@ZhJiEl*?4uE9G3^@k69J>)^_P?jhtk(6Z0eB_06m-51za zp*&uptEp^K>Go+5-eL&PQ#Z>aEm>S3Ze?MRSYB27BM^3Kq_MT4;6(ct%N4?_IPh?N zU*Gz&Tw$;-5$2{mXNth)NbkO@F~yQbTte8MSFXD-b)o3BtF^4qyjdw+t7ypYbcJ;* z{XM6=e zPQ2N6&LS4R$U)fJ9O+<-D7^@c>@>QXR#LsKFr8(rXISMmtsAm5+U>w(sZg>jQ-&2# zP75ktmYR-Lj(i51qk@&G?heNxNZTr(bKhnUeQ>sSl4@0P9tBbESe$Rl_~@8ci<29q zX!59*HtQ#Q|4-Z3Z?_lasO!Y8Ih(y(^P~E3<~7lyeA@=2-l_;-wazY!pwEKhWXq%2 zqB6b+O?AlCBK5&pp|RWMyLq2*IXxHc+|=M(i>?^QeznM=3I$Wy|7#NrZf*5~OH_bw_$#|O%M zyczT5`>EE&OQFp8?NFV{xRG10JHI=M7f;IWt!G$?kAf>fXv#=;#yP8njXNd&yZb|K2U2%R{e4bX^XHdf0DnPvL7`TV;z967pYZGyZ;GZQn8TfCl zyKPop+Z)|%lbfZZi0#gDiGlcAk@WnpoVfaV&SP&*J4x30>jhP7o?9$0Am%6W;~OX6 z!5nb7)Y&5~yt7#Ph{h0`x-M{Z*5lON%_@}_MbLfFw{Ty-7`6r}AssHk(bCw|=;rxK zr#kvPM69GO8Ae+p63Qg1%`Ii05}<++^L*(t&=D}5ySB9yx$5XwUq6BHv)T@Hwo^`BoOM#P_OEzdj=QxVLsy^5z;(f_-rWQaSh$z2R?%@jCV9 z_3O0DUY#q)<*1rP#vyrpakl!=r_wjaJ`T$W#B5pR+WPX6)axlVF4kF)z5`2SYB(b; z$XQ6<;?7)22GV%znY%A%@{0HCnc{UG@8{!u+%43hB1l@NuPBQ$qRlE*#D$URrQOoj zajICjDehZd<2X&hx}Goau4OVKZmR(~Ojscu3#jlp-?I9vR29~eXqanK9r-+8(z4R* zV_gL$t>d~D?$4g8q0KkB&jz|Y?ttQK;-OtV@(`c!fWW?_$#*r64wj1n7d8nAm=v=^ z6lu|C2QGN?SsQOrQihwZ`<3>-Fq{Urygx{LvOU#IM9!Dvp>U~fiz}D=5uYw|I_jX? zkeHu3@7`-TE&9A>lfOM@6P3q3{;j`k=Z!6%j7Xz5T$Q}l3GNu=(4mJ z*Fdb*E=c+{;a37i>|<1gN@XpbL>|&NYP{n-z66E(yTed25H-6sex>B?8?G`gFjZiM|Is zydpSg?TfJ{K0TewPfD6<=BvV+*S=ho^V>!>5XmI- zw@G3adxMzWj!^VUl!+B-rxKbMnON;`y0_3H4DUCL2`Dj%l3o#FU91 znce4lGIHf^w)i`%R=o8&l#QM)AXCnWzhA!Z7tnE?VK?elOYUssT~#dSXbUjnKsuDs zQgN}MS>P&^woghCJr-6czb4vpmO9i$&JQi~8^*fruhp$?d*65`Gp=5nb;rtY^(t#! zQyjr?cH!c=#%VZM;!SfImzf>qJpL)CS8Fn3nLrf zoLF#D{rVR^loE|^Px8)o6vA|#!EGZ|LnAGx0V6HdVY*7$?y6N?G`^)(Jacgy){OC@ z+)0nWhv`F?w}+Qc)%A4amGV%PCv$pllyzq&ra2=fduxp>g7Aj>p`&x=GO7hIBa+>T zgf6@-b=2)Vjbp7tRG*o3>qoj$ex=$`gke!>wj>4v!>Kn%Ap0I2qg@<6b-#XTy@iOp zq<4DaT@1_RZq++Mguw&B`sOuz1m%p!uZSmw~yk7DTOK*LQcGF(DYg&-V>3n>WyLE_fsEY zgJ^r7qulyZ(G@KHi;|u8YjymvlpoPn&6Q*~1&)^Ht--L+(9-2~H}cnnm9M{S*F0^3 zWVwEReKYgCYB2egtJ|Bx!7QmfE}W3LR=lK;dX6cJ#H=>;O6NaJUnkj3du)sn0akYB zw--BeM(V0C>M$9Q?0pRQsm8SdcJWz(g}SWM!;0PQWw%BnEeke!Y@IrltjwVYsEA2q zt0N}EiHAGmUIll9P_tc2%|QGG`iD-<4Ba}GDB5`^wA?Vipo*tz^;^ZoQ%~n5TeGUb z?mLhPEI~@edAuVgA~{qo@+cb!?gS1XZLoBiJ8+*ABf{I8>5CgDpk1)#eu8gat%E5VnWhl-=cg1f|8Q*JScmIIM${ zb}(U}grOU;b#5zF@2&M1fLFrNE+ARGWpowR(9b;Wlc7eJ8BWn~mkFUAG<2b{XN1>8#JpY2j-QE#WCw*lj?ZC+C6r+L#A`!?Z&SJ~eW%x^C9`*Sdl zmBr1Q^j`^mv$lZys>D+K(H|T{8!7PkqvN!jrk{0i@P!f7<}g)dRv}%Oh|m}F7TJ`# zP7$xhME`D^#@c|u6evVg>clrz?yLs@FG_*eMrHSuK~Wtg!0y)@09zh4;`n@Eeq{m4 z*g_<^IWV+7w3I^-If&JJo^LM~p&Bae&!SQh7lk7&jH{Scxv+M|wVwW{+I0yLa)YC)BDj!mRWRo?sm}s7YM&-+*APsov52yC55RIH>-X=4WIE6RBQ2A; zLJPMS;OR*p#_e?p@fmgGJX84FK|+>1B}4}qm%S6q#zO}tB`lqfaGb^nCT<`tT$NHZ zK67$nmDs$x=Mj$Rf@JGzjPHxLPFX!xOjVS6$WZQ6Y^hU{BLSg@5fgpp)V6G2GtIu? zT&X&iK#MSY-)tB7s|Y$5tV9*SQ0AwXJvuaW2KV(6i6D?5nM(ZTmxIR9m=ycMq}`N$2m6l&LezWetv%sOQq8X z6SQ@rVy&I{lN06hoYjqeGCr2V!n~w)@_Coe)JZQ;!-&5ZYITi^cf~`9bJk(&HdqI( z`e2=~#_F!cCL7lKCW!|&TR6zay-1#e7tZGSazLe8E3zG?ZDC7?Z@u7`2sQHl{ zJDp$MiF~_!sg)ej2uWeV`eo(&Rn2K{&A0AMWK5{|pBau94+3CD{r4h76KYz|6U#*_ z!$lA=&~0q9vCcZNIn>U)=^{bfs}4fqR6$CN6=)+Za5FDF4i$U|VR=l0EW9Pc+%j?P z>|v)L)e?D3bv9K28$M=jW4}1%S8etQmP4(S1ka>m7DDd+h^4w0vA~w5RRNPJS2U zZ0ggxYj3so@_wq(Xz9mlyB&>(j1nWej&#|03yG))L!)Es9}={^rT#8-QKvn(c}*fW zJmmUz&N0dlB;FCYrzQ#TX3dxok)%BztG7Xrlxp`yqlM#N1mK^LnJ?VasFaY(=@T(Fp0uF5l&4M!fgz>;sdZHBp5+f~)gRA-N zuU|d@C?h7>w0md<+Eq#O=~NK~JR-YI;JA%W%VS#_W&qda?`i|(9C&s2j$lDG#TE8j zFzW6VZ_tU-VhOZL&nl?j1CG~d@!J8Kd&bRv4`rHns$|N-(4!#2whybHcS~RgY1*%8 zpP6VsvPs6N!=qSU7icU`F{~VOZ%%}WFyvahPN*SOSQR5JY+3?jsOo5`wFp3XIiEqe zJy{=g9&1!Tigqm$aoR|Cf5j3*{b}O=Nc(>(Xs^W=lECo(dH1n9iEKk5B_iRqkz0D-*u19#GWeX0HJllebnA;qX@u|fxc-!g>hA@UzBUl4k>#1aXB(MH$9 zbr#z`>B=+=!1A&MLvbT5kMea}Y4OHjpn*$vhhznPJUn(d4`U}pwpT3Lh&~4x8j?ik z{KXE4k~1V|h)BO9B>H9ussbTo6_5a`4>N7%c+`BD9ScseFBA(Q1Ia}KK_~Ufmy(tw z0xT3LToh!Vn7V>P%X1Mw(0KGZ0p`GxP?SuRlm|f({KG7yRAsCyu!BPBiERPOs1%}+ zn)w7AdlR1Y-NqO8jCp`R9Tl`hB^2cH~TobWU@zwegU(yTCcLikou~NU4|>RG+jCG$(EWLr6`1 zbV90tgoGw1@IBfOCkI$fG85e^>r#W-IG{eK-|o=bMAGudA6I=p7?U%4E9zk0&wzl& z&gp8kMy##9ez6(AiV;KNE9)OWKbhmJ9$>p-r7qZ?qeE#92_Ufm>Xq^fXv3q1{5mj@ z$CG8xOUgIu7{}|(m*FEVAnLz~Mw~Q$_d?IipP?*Z!?W1X(GoLN;WPT8HYj;t7cDfMJrt~&FW&V3>A;zocB1VXzIpiren390u5A(Wu(pV?^L zQe<^4YEV1{1(aYWnm3K3hI@Uh^Y!@tM5~$LxRq!@s~=T~-s8X6myay{>*I2)LVs8A zSn3cz?l{^{qa#3?^{H{)#*l_`k0#}ZhTc*z0-`yJHQwN-ptvwy1ADGa6okz&`u9F4 zXcv^3M7dC+5aWx!CU_4F4!M+1s(GN9rip~8hV9g+;*Myw6OKrqU++-bEQmbxQl_xe z>9UEwA!s_HCfQHQUmhG!Y-i+hYosPK_sdjqBPM+a^y_Xl>}qI&_@2X51Hj;LTWe<{ zEeDvQ9;1wC16G2ULSj+l7rtkz0r7y>k8Pg0YUxxnAv17)f*{8&^VR^SEh=#D9c1q# zCRT)SzEhm z2lB@|9gv&9Y)(vkU-l_<1jZid5t60xyW&=dM26 z_O+a^S2bBN6{wTvy*!8dxZ8Bi`>&JG#vJMeIF1J+E%dP-Uxinsj9WgOI$+QrpJyW` z%?l-Bw24cRn{)z@KsTc9y~r3LAyj$04xi}No#ZE+?VXt_iTtCHA5;rKu9+W|{aM*E zn8wExJ}0(bBJOB}o^+-J4`CGgOd!GrIXczL>3n56Z`-!zJ{!2Wk!l84OjigP@*HiQ zbeTGkrQXilK+?3y3{ZF&>?RqwyXJcQPw<=TRO-9>e4z27&h8W&BPOSgdp)P8-E&WN zEz894?up|%F!V*lOmr9&=zVDG;shftR0%TJR!&goaqO5x^8x7jSmF@zO)M5EHIS9q z^23KSe5;fIHQ-39Wtz?VpOf3Br{3uvyY^lXcu%F}`l`VAUGRMp`lgUK2$YEKKWf=T zq{5U(7E^ktAyvU-EWR}5b`N+XCN&`tlR`7Li1UPtLNUF5w!s1!XBZG6BH_}8Z7Xbx z^)D_n>nzM`?yn(z)d-{mU!#MhhOq)blN+Lw$7tSlAo4iJXZ}(pNAmN{Y4U71jh)!n zrq1qa@^E-C12XI*po}CBE$z=y;Wi)yqb9EBLXY$1qTv8}lERh=Y+Fn~alAV4#DqEs zcxjF{hAK7DrtlU(4+0Zb)k~nP(}x|_B4~TXnO2&{H_GIY+^!g;sF>R>F|}&rhP)<- zFsCssSrc(C17-SRwrG&Cf`!h=iVx?-+%vp9;LMD6S8KzCs{yUmqGlDwLpPWV95`pg zX%;Y^VqYsXkz6b?uueNa7xtGaDwbkX2ZSRgH02|CsBX|ovKQ6g>d#JD>(x4)tZ1NU zs>tK(Cj6(F0QB!Geo`XRsg(s&1LUQ03#-9Q#l4i@B>vi$OyM@7HJydP*XlQqI?hvaS{n;(pX2PfyDm28H;-F|)DRh}W~Tl=13f zzG5rCZRTuWBPQooggf11~+rFYZ{?gH?93PI2Il9Xfs+%U%L?Y3fGhYzxNVpUnpg1|nFksm; z#O7snO%Jbgx%un?t+d1~`yLVAce^@BX*x=LK@5Jo=>qLd0$D}@F&X@bIw1Imj=~&y z6F^0zBk6Wpq1NDtO2J5vGoVm&gUg<#c}miWM9iR40lvDjPD{1u9mFu?8LVSu%@`}$ zDPtoGmGG19J89DpYvZ&oe*{wYdZ2E}km0_wpR?bfVCBe+8-9wH$v>h=&|UdJpNNox zVV_ISZETUXCL=Aj#i*BgIkVn$!mWU)z)g0ViZEsm--GSnqri7|t-OV$_%1N{X7Jbt zH#5g9*u!@sG0wHlk8$z0LSJOo6D{+AZt_Zd7#+GX)*AJicD;Fp=#WdAcj-4C;7entnK7|7#F56Yv2)w40LKqk}=up7F-0Klz@sP z%Gov?5Xd7YKnxom#hIAn1f5~Q7an+7Q{GZWv22JJJ2n#&<7=IcR6&Nh?h>Y4T7ujr zJv>7&Xm3E@j^!QGAk9QUP4GP(ryzBK(ZstX5f3~EB1^%lPPF8d0YKYZaJrQR85tHv z8=?sg+S%Yy1Wz_iEgFL(QJ!5qdcSwHv&%Xgt~1cs$mp%XXHF2xLON*o--c}TJ^r=Y zcl$Z{KWU!3zau83A7F`*?S7>X6DY zNg^Mo^m<{mHdLx=eFKl(W5c(aUuOeu>8_u$A7kiZY$ zKHs(7#vEA(%kfzCkKENy7x2+IfbSoR^f);>2b$hqqqtW;W1MCy zr!h;fMQS(((gsm>-94}}TY=wJdEmDzj++TKs(~aSuVuVgU%@ydCX)SzKD_@&3~!VE zE`^tu%NBt>@l)yYDE8u@c0!Z76cb{r!|v_BbjPG8m$LX+eISh<0~-*&iRev7?J3i7 z8(_-rB1j}Kkb#4NB~UnzX<2LmT4{E3^(TaSZmXf=o*UqXdK}&UL4!0n-%3dME*tK1 zsesgZOMXzncWF?uJb0AeYvV-ipw06mEnKb03m)HBWW>P(YVkj^k{r%u*i$}F!f^nR z6p zG54~sbii9!85dSc<`8RJA)|120g56d4&XGVkMEJ!?6KH(3{F!-!ox6W0*x;;R>Nzf z1T!fQ+hoGpmvC!hg|TRw7TgB)bH~+m&whvug2h_~NjQjYT^yL~Q05RipMQ)&P)UCr zBP}E^AD6N6Nj^w_A1=*Kzav~7GzQ52BP}Sz;VXobm(b>L5ziv^2ghV)o$62{CiAm$ zRF+f0^&vJqDifr-P}-eWBPKCVH_Bspd~5<6yR32t8OaU^oFOkYRm>82m@tP+h>YTe z7f*?IxPj+WL^7f~xjQ(KLjB18G}uAujkrdKs1r=SHIs~5x~vnIl7uP#U56^mViA@a zgWGPFp3PoXd?O~FBcqkInT+8DCRLK+WndYhJqYb4qmPy^5EQiWAAh0JuN-`p)?pXq zFE0Ha8QY?S+<^#3_+ikalSzsDC@DR1^qu(@j?`NNPc}zfv%6SC!FtG!iotQRb$1k4 z;~A-^>vlnOX?mLBvlRg&Ef@TSrRthd=A8f|%il5`&PBXnOS4<=7QC{-`7?8NHKU6H z`qB_**wA~768Ch0%}37$0*fOYswilxPMx{;cy%%(Ce9A$h-Wn5Z?i{Y>ZYdzqlW6xieU-1 zrR*an$0Q>r@NW>Xmm?-1xeFu@e`6xb40A!{hOyVT7l?TGnRK>4wdK0!s(J`oZ^csV zcw3d>C_pv~mKuhnOC*HM!o;voJG?Zf~uVm4ZEHS4bSEEIpp~ zO6JgTfe+oI*COn~FGxu|PSNv*?U3UFK_LWAs7Gj)Ae2QNqf#VFB`DIVGDL=LArl}>CDS7<>JaSHN>IgB2t^SQ(?RSbL&SDVli?#R zZ-qvz5@tjL*$asSDj&~ln;Sxy)nXJ%lC_NwP~X(cyc`Dzk}`wSd-adICsc&BPA2X|VzHYa$zVu4&yUA( znomGMP7uPCa8-p&cJYDLXoD*P0f-W0eO#wZIw2tpl!SBMvOCUQ9c+Gbh0r4={>VV* zzqoXFDnRun-eCqpnNpz=&}64hPdLD!r}`5l4uq7UpGLmIZLTZdL+jR#FROqZj=|bW zTSBPkuKKbT9?_4yqD``%!UKXjLB*pSB-@YCus4QS<$R7^wk+%(=VL31hB)(#2=gjN zh(a4gFa?-AV3H4f4jee`${jP`zPQ8L*mqb;*s!)Ip~jh*P)^)ZsB8NjAIkc=|gR)dZbRLTcBT*H|Ly~CHK4RH6lPMX%D^tiwGv* z?eD|5@Y&_`o&(sBHBz8GnDpA@;lE!i^TAsLW_1{GQ$^>j^_`AH2>XbugX~>Kqd`rf zM?(ck+^TW3QC`8fxdALg7Hiu(Ex?jw<2XgU(F_qIM9V_e8JLs?u*)n!x_P}!zzEss zDges}Ny({z(wC?v`h{YxdQebwis8_T4@*Uoclbs^_{w|j*$GJevmO|e-+ZP)fQ%Uv zl;TFq<;B$u!#;H8CrA-=7s+us$<#x1=sES1RJmg#CbKhJoqB1g_S8~maZ-7AlE$%Q z_4bsIkdq+mcHW`>FS2K;EdKOVo5gpAK$~tG&IY(BQnDq0k`9s*q$9(xDfk|4Xp`Os zlngDM#MB;7jNBzDE@3&`RM=|#I+OF6&NP}?82jEO4rS1jL+{dSBHVW`4^n#L%qfPm z?~XlNbAt>CgqYxSSO*%9Qv!p#uV%J=u*S~%BPIbLMH8j}Qr`S_LGa&uuduAk?dL>A zWtExVKBV2@E{IB4qM|4nbspVgQ(DI;riiDQbpV+NHWM@=5)!_BkH=$tM)+?uXJqXA z=)4gaNT0(+ySt~yI6<_{y2+`Ghj?=gBZWd4y2^YI{D?`72tu#dG2H?{!7xiBLNcc^ z1rDNTUno=~Es7J3iCcuzr%h3sTG+PA+*y}&Q=E_qBP~Bg3d-9%3&sCnH27< zDZZS(9m8Z;bi>!H9cboi2P(;Upj^l62vTKB} zB$6t7alG&m#$Z@O%fRJ^Sj8}c?XBpEeRVLzx?d=vGF=%7rQ18@A3Pd1rm(jT`Pg&U z+3PNW^x>9FR#sEo;nSh%_|+8NO_ zrc?%*tnAoWTk0}(L^Hl=b0@K!du*4JQkzcm<#qV-&D95+^*-KLIuSh~ZYc8A1IY#H ziO(tp8Bk^+uIAw^7m*JdhICe%*&`;zHVLVvJ7L^e*nEUDFnjOO47tzoFW)b zgKQfH#Jr2vQMN)x^`h)_X8r0eidgS(8fqZ)nnSV5P`sye@9n*B6b2(L%6bND^qN`3 z^*Uyy6?SaN?s~n1PvBe%%F=9X7{dVp!$0FN~Du1gcUV78^BsHSllX;J#$uK;?;# z%MXKCtEYaSvgGh49_Hg=_Bdt>z=2o=0URSO6g+*;vRsWqZf&9#&|sC-dN&BY#bL?# zKA)V>narq_@ocB$A;@m3GJ9Fv~ei2fInT3=H~*4XZvb~^Fn&llJ>lKBXW(+RIgE|zL?Qe|6- zhi!2t$|8UEBz%`bv>SI4Dz*R>QfI|=WMBbN^;x0KXWCJ3S5m0X0E>Cz)D z9KSjB_RD*D$Uj+)y*M1{1Q-1u)ERe84pw#0xiw4D-%KMW(jqbX!%8s&6wqdI9xj$c z{X+)_08`>HDPMRaElCIzDJ4Y<0l{fx9_;f_o?LQ@4iBm7Dnn$}C`_rYaKLZt{G|J9 zi<)cM*L#{FvIv6mPeyAJ$e;+9uEX{p@Oipx1>7+Z!Xqunb~d-F zj4%4ZwYhg>Z6-mK&(HWKBQ2;bmq^WjC(z!h|1-i&Bk{>g(neKw#IR3AZrPB1i>G(nu>*)Vy1`xR(oX)2@xw zAg6Eq08^;bE8?}f-~9ccA_L_IjAM_&u74WjV)4fpn;6-)6rf{-&8A_QC|6n3&=C|G zm%Hk5?u~TTyOdtg1uW3f{#I|P=jF?O&uAeb2XbC|#1%rO9iQ#ph46gnm_iXGB$4B2 z@XN^_qpKxNY=Mbc6ShJ&pQwx!=b~hpEjK;@7f%BP~O?osm8jx$r@01K_!(?jK|kvZtXw zH5b#(>F5(BIQ^T$KYmjxtBXHF={9G4{Uts{8Goi{-O9_z#OWP#f7AaM&b6$_Ft^*I z$={z4_@l znvd=~9EY8ctUABq@$6*s5l@G^cKwhW#cDhl=-^7-%Bq8ZCIf&8zo+Yeui~>(M4&p? zZ>;^R`-@ncBPOVn&oT_blV@i9e|xqWYn4*N0O_`x%g$8)V}xN`8>Yf3Ijif9qlt3M zZQM}R)1Fcu+O!D*3&jx;GV_6*nZfs7HF{i%=*}@eC}CQD@|b}kK(jwj?)vUtjBbr_ z5SaN+B1kF^mo=Fm} zW~ez41Y{#EG}T(gEUM};b3HMb2}EAuA_cSX^7v~%2o*!Pb^qtgq$Kz#rr0s4>&3zzJrovy{&G*{#ButRWFv%L*mFa`{8VUX1cDrxW8;w$NX7EtNiCDjv!o|$gSj@E0 zy`kWSms?Sn58>ODxBR;Dv3%O2;sFp2XQ&)@o9pa`-Eg(@(tMKW!eJx;6eHp72&oa@ z{WT(TJ69dnVV=zzGz5HbA4!FxsOlU3;sCQS6a)^#lV6tV^TT`rL0tPce#*)pKedOK z`C86S_s#3?`TnL4w{=cx>E?R9Yq))dfcZdzWBIyGXT?MK z=}mV%V;CLgCJEArel7bWTV4NU5&Qg#{tp)o~Jx*ubH_(6iZAG;U4%M>edb!r^T zR?h`PrFQ?`tw)1e*v4bayg-&+aBgaqZC~5OO}4X|0CqE)>MH^%rlkdm14V52t!L|% z#7)^yII>fisOF#=c-kXXCn-=_cMmi6P~sejuMI*uHU zCXpi}t$N3$x=LhGZsN=5Coxp3`?g)_W&gDA_xqI4e75!GdGk<{^2Wyb*}7-N5xw6y zejObJH#8vMoRccWi*d?+tKT=m&s3JM_gJbCBPO@WZ|JJiW%#*?Uwo+!%~6`Q%+*`j z^IY7fIv5EClj?J9bD`FEOUY;Kv~jWhOH<4E=N}l_AKyq?#-T=tOiQ=pFd3_OH17=7 zLP@hSYUFp(1)+OU#T`#8`gxJgaO)`of+&jm-`0c2m7n6Why-RMg8594k`nos=YwTQ zwL`aOfq7o8kfF`cK;wxD3ubrLk8w2Lb zQM5-#v)g^*xZJ^fKc^4R1GWXv92GtBzhu)REtw|P(4r$!IuRmH;^&dyn)A*%lZQ(; z6in|NV_jqPmaF=iQ=D5-Cmt!x-toLYJu6t-6NuE7>TmJ7CU(YWtrPcb-rE-)`H3b3 z7}C^ii%GbY>D+Lx7rl7S3@Pgot=xU}v#04EbkAe&hi`7s9D@?KnCO-&xVkMs2wTMR zbc?0FpyXSvq*ZJ!SX|t!G?fpnU!5$9>eWU158czmaf zx__k1VZHsTs-4j8h{6((M5!*LPX1OrJp8j6ca+1T+2#KA8dk*@{`bZzcIkgQe=BoFrDyUhoR;}teVh3WgSR;>9 zHv8|APuR0dUt%H*(cPf=j?CJvukD;n@V!wT+@v&c;qCQ(ba&?JIqRt zGA4)2JrW`uPWRNGGvslMUO;@ZI}0N%NpbL)7cNGFT!ThXV&x`8QE5p$2@kg4 zgEbzeUuo3LqEhp$T|%TmYkgBfKTaH!Tvt&T56RD{lJ-3GDiLhfwvcz74~11uKs>rD zwG`6E1@occdA_QfGp_qqpU8K-{m}C;o!uu-Wvw)m6dx2!m_wwivL2$M8^KTUq9J=+ zGB#GOC80*KGL7BDzE{<}_N${WYgM&)=-X@IXWO%!SJ!>{-SK?1I@j>jddu%NyUlgf zL2mSizAN4+ryLRaU!PAnDHz?)_N4nz+cmW?pOG`{-f%&$e-9Je?t#*s{_3c<2QP$~ z{QecCF5up1bC}in?2!+2)(oPhnPB2M1f=ebwN1&R5P3$-Y(d4YG;_S+ypK1E#G+`H zb;D!jvdtO`=j)qj2tE+-(dPbQ`y6XX|N{4BQ4i69?>)-WO?GX z`2D_koazP?JCN=p-8{L!8}x2yj$nYqOy}B*;dNZ554jvB7~)J|cKiE|X7R74Jta*D0Y!l70Ial8_g)Cf?dZ#Abo;8U0o z-Q5yfVg<>vHj>N5DqxK;1%IxQstLvj?Qk4E4ze#)@8m5vJlHvUsOL;~D|@F*i0tBO=}3u`?F1$us3l3BO@k>Ui9BkX%EqEcy`)(Zzw+buPf+u zmwc{Bs=;W?1VA7@2OR_T4=C^q^*8o3*RfzIdN~xL19FGXKP{_%Ice2w!0?bo=>8MP zUpL3-{nAV-Qs?cFK|NfKtcV!-B#F8|6~mkDE@u8N6yWNm9M#B6C*mLw?!hiWUy^F( z?U~2fu=UO>NS-zfZSz%&Kzm?+9gK^78B$&vA6~Ao^#_{wu0Fm}`4>>EZUek0kOzkj z)%XzhCLWB(7VN)v?Y__s~U41Sb8;f7SkoHwgm| z^r!iabI^$ba;X)Ff4zQQ?oAP$xm?v{XLLi{28gI`{s<8n81!YB-;IpT4*h?FJWGMI z^p_M%Ld$gp6e7^zpwS`eunb5Psxm>zz<9^XurbHZ86pYcEw|v{#l|KO{ejI_WO&Xn zt@o_lXnY?5`+Oe|>~Zbz3#RK6)`1&Z$+){Z9tF=xk@&be^$K?8rKXZ4w+uNnFv(z`Ze~sb4QXMm( zwcGqoRMsb2*YDk{LtX)83+*zg?O`9_=(N8*pQ3l2D-`G-g$zdG0Toe!p7(AN2e=bH?ee z$4_uRSf-$r5F`}o&B#iffOI#>^Hz_=A1rP);fOsCopkw{?VOu90Z1gEB;R^jBPQ~o zjdq_vRu0K@?hjxsAt^9`V9;VctW69anN)t!>(yv*F&6Jf4B_!FAEQy@o=p_}**Yvp zyA(Q8UN~}4kwJ>E4Eo*FM1e$xd4XtYX%lp&9{QWEK~HBAw8&q*onlv69nmYz9E7!Z zF1K$jOXpfJ3OV@b~bi0SpxEBB!3&l?TFbCnuaKMKU_LvpP0L! zC9_j}INEygG0~VX;Ks!m^{k@AsX7OLqMkOcnujgb*4xom$ArkSo)ByJPI?=Te7(~F z>89JUdIlQB&kr7IHtoD~biDl|CP!@>HI6kSEgXYQzOFqS+1DY$*fccJ`My#aN)-;e zP;7!a=x2vTSyF>XZxoUr4}epI?7${!qI$K??rHg=$Pxh~Ce#GPfX6U!-4?S_h?tPN z)j{Q`bn<&0t{CsIbxm|&utZ}&F8gbE<=M(E-0(MF$lq_tMdHCJy61rZ^78q8gUz#y z4*(*;;|xba_Ptz==85%wF;;ja)T}`yfJ7UW@4w=*B{mngSD(4RY7jxJx7zP>f3+&5 zIk-%dM;vm$M`hST5#MZ@$@+C3E^;%U(x>bC(_k?pkm-$Xcjnvodl^N~Ozj5e32nr# z4uLy$zvSHTXQ_K+*E>QgeJ7To+@!ygVwSdXHht5aL>8`yQ7)On5J&b_BQ2NNGi|{q zy&Z1gYC9jr<7WJCw#?q-8IU}kHlE;b5nQmmBSkVo_QV^4ccB||yedU&0E(OKE#g+mraI3BCwxaEE$Nq68={>B=T4`% zgiBs&YxnG(_CjPbJglFt-+BQ4`^B&ssdFalAB90l*QI7|~1{9Nldz{MOdup=g8 zO}0QS*P`rjw@CR$+~Oy#+toNn*Ur`E+7ibtq3}9R^>X9lkr;lb4E?=WAVVnZEY9Qi zXLZ^ro!9a--TA?Z@2K4CUoKI_tKXe(FHYvq<9TVM4iz!;Z|Q`Hk&LQY-piuJYibc1 zLsqbZgP}XtR@Tm>=PMTmO64;%G2V184m!jeIjz%dn5^wGT;LS7-p4`fPD#ZOX{{}o zuHpv+zWk7bQADD#Wg0}*Fe5EVNa7o%S0lLY=RAua(kxeVf%aNkkjW2x!}pbWDvaU7 znaW3B&i~JmsWtEJEdLe9I19QXEq_x0ks~eUYW;soY((At@7rwvJ02VFKuW!|qB1pq ze|n0sd&UvV_Akqkhe!E+@*g*IAATW823p&PBx{IyjTM3#l}O-XSdtRjD3=LvaVe5* zwj45;TRSFqA5XrwBT72`Hk~AemokoLv#GTlI!U%DNjU5z7R|B9lQ`7Wiik53NfXnh zwoHyqVIwWMjw3C3XLmX|hEV51uAe7?!#|a~I5EwYo%_X!sWi^&lN$*{HixKBKZdJi z_IyL9EMO+6tRz7pkSheyr2u?HP;!DhY!tv_F1Xempfl0bt=0N_eRbl7p*gjoyt{l( z55_i%s(9&mYKCwQBCw%T)#dU;P*_evoGK9<+I8F`CSrbjuSyY@O|J*jfE~hNN0&&; zL&mAZP6Er$GI7UkW4{ZwS?L<-vH3$R_lJ25?^YbSB{=X@K1M62y%yUlF}@=vG^L_o z-8ba-1*DG-===`%*(MTfs7IE_r+!sTKX-D@WCYSeXiZj+h=!M!z*4)jgqLG+S_PAe zb(mj#L{;EzaiM!SbP1%BF#f&Owjy&hAfQNiH84voP(;R=2{5{11EQp|bwbS=u_A%{ zhBJ3GATCfY0~ccVOR({EKHr~`0n*44uMp9zew0wG3U1EKs z&n7a5!7OE9escT*`et=L#eMs-gEqu6 zi@<`;d(D+j_=mu7<3e?fq!f5-+oMSvABRe4Ve;4X?c~}$#xw2Rh2`Gsmd7`A@hP2j z5__@%y++23SeM4ow%DY$f=1dTn#b&mYM_Gw7+9g7Y-$gK?q1fu`i6SWs3n^4UVhyw zxJL+0b+VB1y0xrHHrEuzQ0-M4ltN&cIHnsfe;7Lku)sKp&pms9;cgID@?7zG+N+0N zGq(^&!z*=>uxtXv*3=L03yz!$M^T3(EoctB9VbU(wohUhNtu*& zSVS6NoSp_w7$vtLoPoMfdq%iQH&h2G=6=Bi^F_x@`*;!w+R}=O?Nn8y16CaT+}k59 zim+WxIc04!L2h`C>A@OACa|vP_uuEV`kDJ<2XC*7d&OAF@}+Jr9IcksByj7lEa-Ci z*@q^iT@VMJ3s5Hd?q^ECz;f(j=`gRAqNfxjBQ4e=CUdw5vGpS+2qj?G#ybnRjx`AY z#3iC?8!k&)LDxeiNz7D&BZIkOqEV|&uV6SY0un6-u!}&O_HBda0qlfLlLb11$gRgf zo~KJAEoq+6*N>p|md^OR_Q?|7ch6rO$4QZ)34sV4Gnf+9V7TqV zxY{X4sA|^21j-QIb>;-Om~qG9y=~EVP?Ar^qra5F&0)jf1iFIb9uIDOuwRgh7#C%* zxpzvs^|~jimiQU`{0BHAE$**q>hWp5RmT@;8CRY~uWGyAbJXCWQfRa9%GZje(XoYa zi*Dah-v%bfyk#26-ys2_Tu3IPbWhPN=qC^+)h3~ei!0We;{Ge5)Wyiv2}P1&=(vl~ zZ3y~peVZ|kdL*5lh1hY1#{DozW22Io?b-V#IX2Rdg&R?GO#pAEU{nP}3FH;NdFCec zFu{~u+qEsaP*y2r9`G-gi!>zrebqJzkpYpRbp_FIn*%13K%OP82m8L{kI(eW%%c(<@Tj%Nl@P2$&)}Yrw)H+81 z2|ugVI@7t%a62^bU7jx)Uss}~o)G+xFKvB0KUdox{`bQz-@G=I zkn&5ct`uKyJIAJp_zVyy>o?u5_0ItSfCEsrv|;{Zp>e0b?FPWA_V_-Y9!B#cCfN~f zu5j-Vg%k4nik^Q15dQE`{p4&TCV~K5!{&+V&E!EbXZoHA z5)bedf1&?ev?hQ6KfY$KoOU7{f5vDeDCE3=j}!}(SQCKm4n#;62LFoC+@{!Z{tV~% z&n-MWD6g*~oA_yGl>ak@2Ox%L`WCT4`i4$J;syzkk2Y{&t7f1>GN@oCi8i+a0Pos2 zcHbi{&(m^fcy_`|ndtKFizC~1i8^K3K;HWmL@3~a>Hwo7Ez(w)i)IqnR8xTcyupES z1mzuQaw>H^=xI4r;BoPGo)hoSPoc-!{=?xhK_e!{h-CQ`HD{qe!x0Mr@`n3RU8wmB z)MciDp@y+ZGDCl~7HF^<@Z)GZzRhq5o@5)|ouD1PpRUGI?xwUO-q9=I#QQ03BIQ8F3dj_7X$1gFaML#Ie0~ z`4*Vv#xsT+7fp50qShA%+qfXp){Wg5R zcDeY1{vQMICF|wzC_{;YWU0**LZ2W&^Te5tN%1*2ELfOjOHuACJ^xyV?1UiI*RN;TpuMk;xsbv{IO(Q0BD8`x?y%V#t zARm|Wdb~rx^wLtib2%Pf@H~>M!ro{Xf#Ctq=S=#j@|&XiEM|@*%CW$@_hs$G1xLJ# z@T6L>{Uat<&i^7^!HgM%6eUI;rev&v6!*Hs84m&@vP0kyPYwV{qDY{MBF>Pq5|lb2d7lP#ON~l~jiC{N4yqAE5Cxc@#t?R46C{ z=oT~RSUUGG?lgolBgmk3!&{O-+TU~}+#@Z1uh-t`|Ecp)8LJ-O2_%L4#F(Blo4|;O zjb+rng;42IB_dkd5>jOu&PJ)@SKMUX7uv!d4Q^E)oAiyBt-2P>Q>&ZuWe>f*6d9htF zFkTWNh^9ryGwMfz1c^r6{_l7Dxgo3GAG4OELM2i{Qy`r?RNin+f0L1-r+`4M2q$Ua zagN~`1G3l)`f>}4bVSkT#H7Fx$Ua1;d3Q?4Xvc)2?A?R4+Nm-eig5_hOko569eF5L_4v$jsmHh+sKGTYjn5QC+y+6tN z`|_`>HaA1XQ>oa6|6ftub8u?cc=wqa7o$DJpAfa}gebd_n7HJ{hLCI)9K=31>gM3& zHwXAGYeSeTfcXMR_O#o#yPh&b_wEQ=~IQ5;rI*ekc2Wt9+D7vUJ*hgEyNzkgA8Hx1|NZj ziHi9<_%|5kj}i|`d;ZGv#;r;V}|bD{q%bXrgTu6V&UV8 z%=hCS9!Hj9W+#w;C{WQyiRya%z~~!J=^Y;4!QS+u0;-k?YHDl8^ZntgAjU`|Cd;It zB_N8FxX1T7{Bc3@oJ{`r?S8mEtaoesbiuFB%8@*~`{0rXKRW#c=_4&%gZc&dU`!uS zY*~y90#WAUl3@?Q!)G6N&^&6WJl4f z3nMLQ>7Z9Z2oX?vhmSu08CNE^{O%ymi?8z(tP%ncM`(5jxP$}{htj+nkCBzVPgMZ1 z#*qey044PhhTU@cCPO3zZV39vAp&)VC z@Hr;0_|SxIadG^wj$Xn%-rHG6m*1eV@d4Uu)wn(ba0eLdBPPm6oL*uAQecj-I8FQ2 zLSZsmG>-Zr5Jh@;IX2f1#v05Xr-al}7^`l>cDuQiusO$XM3PDU^Ll#697tzr^v3b@ z2SKyk(MW|AGZjQ1y!Qj$)zj-!)&62zfJ4AhJ;p^So4r;%6RYUR;m8a;sz-~`yJL8= zG6F<`=HSeEdOYV47HwXDD*HQ+>G`@Ec$y<76Z%R&2H0e0>z#c@K5}QT*=vhV2vlUsbb! zS~#j^aTb-bMGoJ%C&s{&S|TRWKF#8QR4Ujq9RbUSg!;72A|ovz7>CM7bju;F!;76`I&i+JzGD#4T3qd~wt9|JzX-ub4zIGBLph@D{1)b#b4;4r{L<;yRg92DVGJhYT>NZE*#V0Vew%byWv!0!UvF3z*jUPqz`l0rMK0t3V4_82UgK`@6 zYn);yN)Iuh_B*?b=udZ7?x!bP5YR{x3$%?@N-SqIdmS&-g|%83pL;JIjZERb(F*}p zB9OgF>^#1xllIUb-i>NG6C##T)`roshxy)WL8XI47$d^;5qda~^qYH})Jr2RR;zNX zU!wZ`~;l5e-jc;xI7>SqAWPq3uVZg;F90pO*o@Y_{Z$zy~JD&_@Lzxflq)&~K> zvn&jbc<&$~^a6)akJ|+~5YuB{n(g+@!kte7Q4vB^MJ6LAl9)-KuumiT0N~&k1V>`Q z*mlyNBkE`Izbz!^TI*|L55nb+2cwR@i@q8@4v&v1Ttb}#OBy$4HJn7?Syj1E=X|6VEL7tBPMyT*;x`zgJM+x{xHF22)U4RKV=#*ZGfO8 zqYD}uz6er3OsVUhVpN1jnOQo$>Y<_U6ZFXt4q^lyBPPH@R;91exOcpdW=E7GCdNSv z948j&eqHv!#W4;W2pbxxwM8iuA;ngjAe5(W@GNScu>9gvyNRNikojmE8Pyj`BP|Zn z5%3m*$r3-W_Mg|0IX)f(x)YlK@T!p=lF1lJ2)teeiiy)f%q&q=K?KQFL_)+t1yEgi z2d1zaF-((rMoLE*SuJdmf-eRNRp7?muAUryZUK2l&*)EUBsB znu<;41rZ2QO$iWSIGyYq0$H(xhCpFRLK+#35p(JH0g{>l)DKcwQ_39e@HdnNR-cmpb6Tr`z znBjk&+qC$AM)JvswPjAMilmYf1d?)9kFY+C$9zIabsot1c8p#0XY7y2CTo z_xazuF9_Hx19LwZ1PpXA7)&K& zY=k2wh!XzuS?JY8C#ir#1{)~s#4|}FGRGGY%Ww4o=M+SHMLYYDf#I?v#X9gYFSsKu zPXlLPkIIMK*lsT-1SH+BUkRyM$nzV9z(siXdph`}G!z(krK|41_yrL^+r#k){BpA# z>hS(pO+_{%EfCz;2yli^ssKf0;1h&wP(%o~gi| z@-NqXC&jBRmQ*H1B?D-M!bTDabswYWo5N;lik7jBQ!%Qw>@p|DkH!!dV4BI`J+53( zJB)n6Pd3-1W@}^S0tu1Eqe3MtMnDd#V1QzS@&}2v-kACu@78wo>qM4I$gPeUq z%|?Gs9Gbb!TEK)s=OZRcdmEPoAdiYYJimp4;K5MBs6fx4y@wnl(em3d>Zd^J8=na9 zi8kpWRE2>Xr|_^NCcz}s4&9O*WPB`A_FUm$vU0mbu3DzU!R>gJc*!J*)WZ@sZ27;Z z>hktUyX^CCeh%+Nz)9?vAiB^AMJTEf6O)%$*R#<9&8DstgU7Y5c7ER27mxHA;9$ON z55EXU;N7EDBPNRT_wrKl6Qo$nAGUNJgNhJ%a5Q0Q&2 z69K}^zA9nwR4S#rT+C@7p`p*|${@0Q@cCsf{X}OEx}EAaR{1jt7^qDp>fsY-q4s;7 zT3Npa4igZ}d;{3ut&XJ~9^Y_CE4ZB3=JRk%kp|FP8!}FMsx=1CJUEFa4px&c5k4UayHE!6K=HL{@8FHu5 zRUODhj|X7Yj7kvvO&A`=Hb;Nc7I7p=5k{S951h2=yLU0KAd^%;50E{4|EFj$SD+4M z$?}+bsz2045f&jgP$YPc_{aJ_WC(hQ6a91cIsHgDvgq&6VIQsh*nO^57wL*4>G*L> z-rW;n%s0Hizk6SK_Tf4BRWm^w!h7|uX#ANg$oifxSdIf>%(Bv(#}JX=(n_&wARHx~ zMo`|gvVJCYvr6&d%N|AiLSS{)xyeQ(jw3Bb%E_X;i&!l)DAJtJ`P>7Sm^WH}h07bp zlV_sP{O}f>$ntPI3~VmXV1iP8(f8aU+Q9BQ69L6FKx6cX$T=ds7_fo--k}4aHUV@6 z^@fq*UL%a@?DlQk=-yHqK(J^Usss;N-eb8W)_vM+&0a`gU=+T=hLefE90Pv~l(8cw zd=nD)BqO9jGFbl2C$OK09F9eyHG9*J?~VXBux#N_$Ot4U_J^xQD62UG{GLldj}@jr ztl%RpR7U?-+xWj5Sb*PAsbXj|}>4>J7WX#hspIsv@(fMAtSfNQZ zdE=dih!2?f#9 zrK7sbu=U=M`VPSIg^X9U z76$Mxpb&?pED=ooFQErcBt>gjrYW@~MWh%qpL?)MsW$xR^1q6ev@HdT+y@u9=ywBVFKUMvld$eyPax!Trx&D>>_U{n=Xe%=s9mp0Gkh~HBwK2%~ z9e`i$1Cnf5GQtK{j8jrz@;5X-?|mOOj@Orv^_EKaeCgDXuki$UeBaFhZ-)aF+ybU$mFY^ zn88hNH!GQpN@@`;IHF_&k|C1e39D|L6Qqvfox2@qbV`vZa6loWF;jwF5>Sm$?g60_ zBMCACd}}|rw!gk@73$_e7E+b|*-m1{8S4WnPQz2X6vblWgM^@HHJk&^wX%vicubW4 z7R^-9-2}!hJ^vsKU~z30&F5w)jxm9YaVjjqfZe3o*%JW8m?8kibGS<*CJa=|7N!#Z zo|(kySMG5%ms6Y$cr*~his0KW2xc)UG)YwaG|!_sgg(c-`E9?FgW&xb1BgSGBPP5f zE%?2u_Sio8?ERc;%;qdWC>fULMb8XN!2|ZA2RZVFBp53GfVcTR<^$+FD78{ApZP#7 zXG?1Y06%Z>#uV?2i&mg&A(r`1UR?WbxSE7H?zaxc|3CRs5`5PyK>`PVe<>vLIdTpi zKfE(U_v>+sXJIgXl~I8N5XX;m)CngT)tK_h zTWvw#;Dr>K0q9iQP$MQM1-T_7k$$2i4?$4kFYcScii@y8`aJ3a53o~%=s-Ii{SU~E z{5wx>PqbopgYzy#fgoRPaU{!vMH-1DF{GE5A9Nm@^nlJ>M^~fV=ZWRBlS%AMYN`|# z9n=OzOWu6h`p9D&D2#T1dqr>vP-P9oS@s`w3AFD zWe@T_bJL_=PJ)CQW0KoG!f^9Jqz`R=9AeTsIr7=;r)T$7H6ty*y-`UKy7tJ#-u~xj zQbd8~G8G#L*iuDpm5!mZxin#k4zF;K>p-0Fy6w-H1o?S}JD-69Kge*{dfqxjE3wD` z((vHJw1dT$nzy`Dx3!&v{Ka7Fkod#=5S9P0`LD(pW0~9Uq&C4m?}lp&!SL+r+F+0D z-_b=Hv?o9)f;K3)?$u&9Ekgi#JL?>*#F88@4tQW*1_%{k6w|yCnET^4Sy}#)t1||uh5OE)7X*3R;5^*;NLyD+{#*+{u(FSI+c2O)S zGt!C@WfC<=g3>_Dz0Mp{gglBFSj`dn>dFj){c2WG#I+M+h4!f|1b_dpP}`x}MwX^4Vb0 z=TDqFa*d34;bR-b=9m8m?3WDxIOpvRB;isFlwC&&s=3wM&1FV`j>w*TR*xWSV$e;WRVU*BshoLHf9W9qjevvh3m68a(gi z%@&X7%!f;$`KRyJ6CQ5Y13yCx*)ujm zHS+sk?x=p8a?c+g)bnS3#?ne7CboGFcgj^?W>9!SQzdXiC9ofrcrX*Z;v0s})($o; zFCzzF=pZ(!FG*3nZxf`-1|ph3-yA@CMLHcl)&Mz#M}h;H0|`Jm33c9WiM0jY9?9v# zoCX?J{n^r>)c43EtIh>DMB^Narx4LIEsi)+h?x+VuSLpj9AR2h*E5v>?$BR+O1pcV zi~+uQBJ4WA&(Y)S!s=_U$Ma{FD8?jd#vpx;C~1mlc3?Qd(4HK$oc~J|2UK}|oWuAk z7c7}0CO?ktFdrW83&iUp0z9i;g-l2rHw8g_*nEuN#5!r~%1N|3|?jIW-;rz)U2r)%Q%xIv>wAKCj%c|caEd(A*pKZQR!P_|Q3>;E^LHfU+5v*ZdllY|Xel(sv2k21odd0|Wxx zfuR~2L4k;Y#Xx4V zv9lv41Sue3m|(+07K0!VBxfh0G;kT=y!MhfikSd$zSP4aj1j!7Ux4xSkCAh5 z9Qiy5quIHB-#o3KP2gYwF1D}=ck%1fkX>Ca zq;d80KT3Ws=C>(l5thT?mq3O?h$umIBQ1}}$?7+>2HTYs+Zw8E6C9&hB!vE`+UE|c zFeZVOjKV3%$bt_f(W1_Nz+O8XIzM!MMgq%KAjM2jV1Fs4(K0awP?zNG{(a`b2*9%x zfud9lKj^L(_oxBi;@fO({_z&uU9`dN0puKmA|DS=?m;YE$Ac~{+R-|2E&Hf8@#O*# zgpkzJ^?4kN9wR2Cg5!eH)3Jh=*6QKN(9kq2sd*w5bSH;}7aHLrTRT2A*9!Egfd`O5UsteQI?#y%D^!JI=rB}Ai8tgtHAx`+2=uT_B zcHlHDNFS0a;jy*pjnMTSA_#ahDfgOFOU4d4F#$`WqJNY8Jv!n{$!~r=5R5YhWlT$f z2t4Gm+ETU*52Cigy00T+iOny}oRbiQOy5JGdb>;=hHg`gXLT}y-PzNLBnZiE<_J8D zn~RdDNL|ui&uwkT3Gs)zMesZ$CfB=bPRHv@vKioNs5tb%#%#Sgx0hcI%x?DASG#j~ z=J7?C+z%LO>s;N(DHDpzX05xub;@-;T;Zy=c4hvNyab3u!%AlsR*W1Q*oDZ%oH9C_ zwOQ`P*j0u^-7w5#LMZ4Y5Q?iw$U5W@LSWyhUqG4QhoHK>LJuPz_Yp(!%Tb%6PX8`* zE=G-PEYY4bYMTra#zFCrW(Cyp^7yzd=rDx3owHgd90o!_1Rr<#9gm zA*{g*fx($uas${+fYt0EKr{<4XQIv&lX_@yd9M}Ku^MnVDIoyv;51sQ)8mJc5mDru zz})&~n1hxXy0JB+JN;+H%*fhVJcHtv(&52{@@ zB2rM(QB|Y5!!W8n@pL=g#Rq82#vtgNuanrD$-K`-3Ht=MNof!t8+^@TCu zLP7--15r&<(-&Z4-;8FUEmC17beu;}gM;KF%iXrLvT|tLOv_-eKc+R9-7%Ks%$bp6 znUu>eS(%eAW@cts+ZmaXOu^=5${6!9nPtyfUNb)j)w5o`W^u?;2YeZxQ_=7vYE+Z~ z%1Ml3VeEt!Xw2w~kZWemH|;%~dQDkenxvw*G9ch~wgEC`^4GSL?#efOaLM<5_r)`N z@Y<|sX@hRUWF^Q{bn6=t0r#`ldZ}jrIr&U z6wX1VbUrjbDa@9~W?&#bT$?mO(B&u{hi`DR6nGT~Z*%>gzO{DUxHA|c0-~Uzvce)F zZtZaH^ZUFsT8n)q#1T>x8m28#7S)2EIlwH@4|Cbm%dt~oM(E^6T0+e{QFS__mF)~j z(!AB#|8x{2J*RJ6R8@BxC&c;=u|Djx0VTk!uqJ6FW60FZr%r|FVX+5v#acxf zdpEMLDN_Q};G8|^o7CVoDbir$aCdHlTMp22k;p+9(qMQ8f)fn6GMtii?X0k}S!8PT z8SLnE7|)XBrwsEWEshU|Qm|V)+uD)gWKJRC@$rh`=pp4at3@SS6)KkJ5`qw8ehkQI zyG%6xZ=SCZI|w@tgy|DT6M^4(hj(-US}J0=&NLj^Ecu#H46>2UZVi+*riW*TKuM-aP37}_^ zZ+8(%oF8sX4nc!dJp!GO$MH*&JrTw~HToDlqh4Kkh$AgfrFw6TP-|hEb7cJ4Rf!94 zhZjbjR3k0W-r6IR25&~2Y21b_Ji0g+kUovD z?7KLPCY*y%4&H1GTw+m@@eoQv@<~6K*mWZGz{6&Jlanru{*78{;=2hpRxE^PWH zQlD02-Yvs~zJhjL|Ribn3BoR z_6LBG9(cVO24FIIS?&nkqfyWlG~8tAxyUm&du<`>^pqXZR;kt{%L5oJar@cYojJ|0 zonW~bxE20PXOZ-ol4FEqdYS$QX;4=@eJYX8oXTvWaXOjU{ZE@Yg=yZS?=Il!{sk<5 zu%`Rw2=k_VXH*OP2>ql8%lsoP+%0;bNnIVUO5ct;Q9c}zjzS+RgFP#}-DCW`X*rr; z4rVd8r!!F_+$ zcLE7eD^{(4$v8?6m6%~-tQLs zBQ2`IU2C0Y>Mh|H$Lq~*1ad}(%jOnn!n3AjTB@@$4u_x1M*Uu|7s&*DQVgACSd)De z#%aa{7u`KJ#^~;l7(F^fO1hCw5eFj%0*;iHE@_Zf>F(}sX;2Ws_uZ#wpPmo@UDtWe z|D5~&-7!;E6l<8zV`X3&^|@gwUd*2=$g4LME_O4~ zi6+K(z0W_+I_nicMg=M>fid>*KVAR%oeB*n4|5flPN$HIX8HhJRM_$5S*!>xDanz4 zaIjw;143=>7iYg~(nDVvi}46j<{&eL2&-XoDG}?!rsPq0v#(EFIZXt3t=BnhJ_C3r zS+nwfwRwYyGY+7G6llP;pC`+#ree^($ZsxyEA}`)i+N z{m-2$8w?8SuBv6&Z2Y!rUn*Sr9P{6D7et+Cl*J5*w?NlSzmf3-qU3$?XmsSAm;r=E z0AYIM>EaU?g@I^%zB^*8pXMT-_j$O01VNABgkfPWJ+9>bmN``9gsub#pw7Pl{f{40 zn8;cxSGkhyd={@?mvJNn-|%@ueLrR&7MsWk-16(X4iatFmmvYLL|jFBkut(&4LUqE zhLEMFAAhVF10cf5l|j@8ZR_(|?xJwbMsbhgS_}P+fN~%s=>4c-hOM+c^**+g9Rofl zs!un!TACc?a$;n@Rii)cD^wlp@qU=)irhfhm{AP)sIm+!!K|w=+0I1uB7Yq@qj+Dk zCqE@8OR4X#r$;=s{t3F;7;NIN1sEIXo$c5F&k*pjc~H6RE1mlg3@{Xfq;#7J>9uDI!9@Ct$)``m?^|gvb(wJOk|RX~)b~oVEtL1n^pmrR zaILqtc|6d5WP%h*lNn6G9>V(=-o=8=rBvp(ZAwdnFx<~1`QdLOQa;o3#D0u%j(jEO zEbw}#!R^b;5PVtIDgO#6mFbYHp6L^c=|ucLFBKyBA%4;=oDSB;;8>1Si@~@V-(di93JvFMis37 z=~jbJNt;~edyUEB*O18K=Z^BJQ>ceOd0HU*6u$4WEj@I=n?U?%&sxu9E^uOR`PraT>18)5)06}H}dl4t2VkOWxzDNy>z^Ivk1d*i?1su>!iughr z>KkcF-_P8WTmHPIH2Qn(>eF@f{8(aGlvvY(b3}@SO|OHa)8LVKhCSO{*Y5W8xf8W; zp>smI2*lI5XJ7ioL1+!7)sBUd<5cMbDAlu_HFxc4S1T`t^F3 z|Cx``D@rvX5yan|#2odJn{koWW0O~nfCPJCXZi%C`UlClqDJu79!(*vdhy%cBeF{| zQo!7p8~bf$^0KnruLZH!v^&FM7X>dZIa_3-1jH4iPg-}vGs#{UhT71pXmAK2Ja|{S zILHD1@4aZ=V2@%q`jYCCmqlSd(155L9(5oGhbojAJ?Lbvk&>(+!oUeQC5bry^Fr3r zxa;{+js(Q)=)tbs5i zG&YsB^?M+c`BBV{!%MQ9p+jN1U!s>X4W9@8E}dS}@}t+6 z(hk>oZ{7Y01)jh0PP3+*%dig838?lC3zt>_SKzzl@c*ZLT$rp{NU$1P{K;m|a0Td2 z!fe3M-0{{O)xjV{t{5S6PtriM>$9dY_PdC!7Md-Q14tn?yUGqQFReQD)z+}xB)oMW zCM@v2g)>Ule$xTB6VYZPgfmqesvWt;M-5tqy&V4WXPd9IhTP4!k1!__Y}kR>y))IR zum(|viBVI>t@+|v4OhO|#nnRT9egfxl}&_|ygo}*9>3{n<}4lU32-OPb#s}pgU<0D zQqmAGAT|~ux~!mZ`7&tcnj@yE&hG%r|2_sGCtm78ksn^C+0Fj6`QL@}J=ax&C|~On zU;7mZvTT7{(bG#lOd(v>Gj#hDCZ`w7`h$8ICVuTF#Kpiti9l7Uul#=By{!cAh8Okg zkKlT-bbjXbKbXCeZ=bQF`wf^9(j@yr-~HEeL>^qJA%O}PJ7_tGYaqp64aiAI8U$Vg zm=m~!!WOEqHRV%Dl>Lz@uQZJ6CRmwokp(<@s-bNQp{9q2j@W2*cky68-I=O7I@1rA z@*)_7oP_?S`~=P?>=qTx@R;tj+R;e#DPs7*`>kxrNj=8Wc;Je+M(F*kPmTK>OmpCd zW)uV=kHmf3K-0-m+aa9q-6d~*s{jgFG5rq&DT{sMmn4_37YKqRwLVf!R-cbzl>t|H zvS7jtd@k3rtEblqt0!<1PIU`nEDu_5Ry%3ghK@DRc(P#*z@e0-^_}beVX)ikq4ftx zyiH#5jM%oC9#EU|DgVM!BPHKHqA|T`*k%OA9M`u0tL2EQM~+w$MMB>!{nkri>}(^S zTtT=KC~~D%`$CHe`GG@ZFSqmeq%@a*UHJ=4@~`%n?Nf@_BaOCA4zBmH$tC{3`X1x7 z&sH^a>{Df8{gz7Q^^%vxR^NE;=T{W~damw&P_MrrmX2chMq$le!FiH~1ILNDo8uke z8E6uoV~i)ZS7hwtKmv>7l$bGkq;b0`GIavr!K3_|N;qXp_b20&lk3$;s&6mqDp)W~ zG5V9AkJr=K-1D?qaziEc-tJqe8Q5kj2A&*nlx${HiiVHk5}d8hd@qc+*0tt(PC%L| z=JJZ7ecH)W$cxnJVnTdg3e8WqcKiGC?7CpCF}8sDU0C1S-Fhm*rWs8WRTJkp$tP!r zo>{b{3lp=H&_^Dr^0!4nhc~S)miKL>dQ7F0iUx>isC&K6Yo*exDbJ?`u^?KJEQj9? z`^@U%`(_J1)~o^}JmFE6fwx@oF-tHO3}bPG5QHgu4z`4#k08iKgtV2oa1c=jh~F`# zy_dwVLh9yI-_cE7>jD`2H&9CU?U5;^rv&*(iYhE~oh$66?z%&4x^GRNXCWZf>Ya-< zR>UrxS9}Ajw}geK<)8peaN0;5+xlKLI3bc;5$vom^#h5%y9KE4<>u@vq)C0ta^F6W z{H7sbRcb3*rJ-^u=2TUs_K{?(vgq`3G}J+JmHCKycRC44`VSE+Xec>sOTM%0;n~VW zdXaZ0!ra&q%Z2*SdFrGG2WoM4vAjW#W&@QFNxkj-()S4qx2$CSlRRZ8)Ep6<=dQVE zfa@c_j9tlKFv}pUWB`Y2E80rUlbb0;s5)W(yp;COM0~lTBveWcJGhDtr+sFrJ$?B% zhxonv4zyaJ5>Ij)m#hc)4o>v@krgmvKUEvq9Pjj36 z#VeDcogcYbu#cw}v$?OfTh4m+hKRV4Q|`3vngrq|u=KYccAA-h*FFjlJZT?jM~#$9 zBoXBMMa(pZt-_>asNt6XQnKNBt;j}-VC22Bs)I3n{Y|=|!N>ON4!nrzzEwHdq}JNP z+`X8dy2Y$=UC|$dFP+4-);vegJv#wwUN$2@CNEK*TE43IuURG*lR9PZUMIO7iSoeP zZVs>xej~&TF_f)Y?v@XDA|i)ei@qZ8=A;J6X;_-l%r)^Fx!dJm`&^~$%!qHB1)(9K zUw=D8R1FyvohTwuhEm-~W;+xD7Khylj^eh;XqX^SCIUxlRZBz-7%8qQ?0rqnUxyCw z=;D)c)rUR}gSnx;O1 zh}dw;lr}aTI%(?3^sd~Ks1)I6o148+j710>g=XD%$q`nSRUaeY=1yD)osQC3C$v zRx8@Tz|fHp`k%Jf@n`JmD}}8jfMw8CiYEK_cg`jOfkN1Ai)*gjmSXxj+7%vmdm71% zTB#DSe!FgS5I-3}jIA6M-%n!uby(Qw;vEjb1cpKoPj_+mCANg$1eeh=e=vs$liLGT zkHazlmcRbaX35ZAcQC^0knkZX!(?szQqhx!P|R3T&=3n2h2E4}iQncVItO%%^IU3Y z6eTtaHy*{jjHn68Y@%Y_wj%dfafOdp+mZl)4a>qYX-SpwTD`M}Vv3*WLYT^nGO~S^ z%sr$=3E1tdk0J`=;*_I75K$5%AsR8Ea>ZdJ-Y&&Zf>0&y;PvySo*w^}-o!aC+0y-i zSTb8f(J9Vezh|Q$F4q!u;#B;B&5N5M@RBaXN@jXF;)jn8WNbJl5;?^?aG@*Mf!gDqG~{&E_KMfmB{=o+3zLTwW6~fU>ge|sCnDOqFx}3 zVdm>J4;zby2!qCGJa6Tg>8yuwmkvLO0Z)_ISu3a#?*o-*tjc@$>kLwDcMUdZj z3XU~a=6)^c6<)V8M0?imo8;?*nNqayOMKBT3|AkhQwyab9@M^nBYL8eos>_)H)j+O zDKnDEKt*k0VCHV>NIw0td!r|vWATH=9B;)%#&3Dw(C2)j=Ls?4Bqi3+-Z&mGn*)RD z5=mQq+H=PQHM5Pqm+H5)*Orc5y1BA1b?`N@ly~CIN+e#wirKr>@m4y9$dx7Wk#L^n zt8O~P2|qfU`neg2dnzsnhgFRP$Y zGvPU4*s7`I6OORr)z%k~Au+k|U8#JGp1v)MNtoaXfiA-j0>#98yMT-^&ht4KUWRv^ z^wp-Zhr>L~Gg?tZNEa_bwpA^G3QN!~?^h37>&ZeLMqLZ};*&*)G@iO!ZS|KUiTmqR z@;Lm?j3sI{czzw3VY$wIZfV}rsK9uv(k_q@L#X=OeowgUPNXf%N*udno+0VaCf?F$crEr^)G}h-Z!Z{FC9!Zv%KA#sO*)!D7I&C4G9hV1tsE^QiDM( z0cBJ_gr7@h<1Wzr{Au&hsh&vzW21Zwpn#Idh!m{Qk*w4An^U^k>%OJQK4&iDqR_z{ z41xsiPULY3{2(Zc8C+wM!4j6|wW^^@U3%!EoQ#tmVgLK^h;TU*?S?dXWjG66Dw@@$%1&O*Txo=nm{9XH)p40Z4KGELQ9#CE>YejCuSXjL{lMV7FkWLF6=ja@|rM$aez22Y?H zEW16M$vRTYt}&rNgD)m0vvQO?PDZ-Nw*G8TgX_Z}`Y4u7jaCZZA}~N~63*wHsI(E>u`~>h~*~Orec*h99e$@^NW}T9O4C zgf>zp^Jz#Z!FNP7b`R&LAg}-9vBoM4#%OB@R-S#=h$kn=W2;v^6T&BBxWC3Lf0Es>2*13aUbVB9TQIIO%0QPIb!ra})p`6)(?7Yf4r-<^6b6 zbRvGcWsacFkGc8Z>umgkf$SbCFWrEYFz_pzHZ$TD8qB5Qyr+pxf!e(5mqp>`U}8dI zuA~r$mG@w@j&=ij4V*kq$+ zC3Fo*qddDY$Tp3F;vyDwr~b+%>=jvV|lwJ3jGB5tHn_Wz6qzkeaz6S`!k)zx`M;0k&d@= z-E{m>La>i5lI#E`tVyD&%%)3!YMEWe0Vqo2#w)>z2JvG95Nc`0P`2%1fqg z3@>#WWA5R~bf90}&2k*hcabhq1{Q7c)U)?=fCr46o=;TN z&A|nsFUxcbmH>wDt?E)2vF8-vabUVW9%vQB1w*%G2UMamHQ2KX;>-;pjG2*8gjQKL zCRC&dm||B|Tq$qmMf* zGq;~vB|Yfk&nFz0@0cBN65BdF>byy@;y13L1fQ1F~mCJ1Vl(U@K<} z5S^}+CdWgXPJcffc77OhZMPOc%1NOg!a)jJ1wlumyY~FQYc64~598Fa=X;3(Zn?Ki z5iKJtpWlC8h}RS{QAtQXjr5EyDjcLyTFYpd6tLqK>+$R}+Whim zS8{8vlB-d(oywxKG{aMmm zH^LXpLwLAH7{xvA*5_2!z|(DMfr&NzJq}mnSnDk%>Cx75*<3w-uZ=2iGJcD_p^nu# zL?dpydy&?|J4atzwO%S?iRdI;efv~9l6@}X&p~I)<+6XpR7q%;jR@yLeo@6p+kCed z`454eEQZl$n7#X@pdct?o1>G7XBSyauEn$3Jb^Vm8^2mOw~VKZXVHQWx&0(^1$HmV zO;mG@azEZvsj{(?VP$zz8uY(;@>;$coz6iJt^AVex^N*t-5SC$lg8MQ8e)u2%F7po zIJWuyy6q3G&A#)}$Rm)m8$to5(}C$Sqc7@)bMs`HX-Sjxd;qLQy^DX$6UkNCbftY_ zIJ^F6Cbxe;@ftD3)VQFVb6@9E`FXaE?_67C2Zb4WeE>mznu+R;1#l(=#YM-E1N+LG z_(MHw&5K9MU&>lKy|L}@+!%B_D_dS+eB*mAlCfbrmSOcTQR}W$cyE3rKmx9BK&oO` z9d0CXcQDInLi%ww8$LGcV;9NhDCXta+)%;CfHafzP^l(bTo!Ott}Lr*q0P1G{b(UE z+P^8%;AtdpzI&1>cGGOMFk@80to`Fa6hdpHF4H$rHJ|J!9A)n|C~7OcI+Pq|r$ZuY zpr;w*vT}eY%nr1gJJ1pVKs*ztJTc75p+|Pn9p16vyem#IGm6ZC9IxZvONg&(2jz z7FufLR`RY@_Ki>0e83`?#^9t(n3Z+ihvw-|cmCdIEz6n{YYg*V4Bd{SR*hP%!UPSo zjO4s|OPM3AsFgKen%TJbEqNEl9mrDCK-4eh>6t2p@uNw8OpkP$M3GCa zI#P4qn9B6(^TL*S-HUtD>{i;9sdud#mMI%zckZMZoAMm!%u9Uf-R%cdRX*p9j@_@7 zqdbCk38$#(ta*h}{325ByU!SSRZ(=;LAlRp?5i`^e2zn2fi!13l0m8OWw&ntdTZw4 zT#;+c0ZypcjAZcO{TrXT!iCVY)6a#AOrE2krY{@X-%ujS%=C=S+0z+aMMf@wl^$hW z?-+`Unf2$qJB4e;2^jqUF5YTlvNz(266_^hqHnZGpEL98us4qjd-o$kK>R*Dv`r*G z8JF$){YePpzjh@HTEmj6g^D(Kc~v~Z3sH$i8Gc<;>~Gw3Lfg4(@I$iK{g^W_Az(q? zt=BLmXPz}G>RSP2fmqE%+m!?HG7WNT(F(P)>#|d^ai7WkMGB8URGso|m%5cQw-A;A zK?-lLo;!769~br*7Eh6d)c}(A&T&qnLRXQw+S|uY*_$!YR)l5%K z4|7XAJjqB@axTsTl3Vw;)JXO$6qhpywVhU_Vf-zWaCKmWQ9ONSO{B2SOQC70=@Ekf zlRy(v-qnsQfD zqhDsl7E&UQ_n65C`z`&cq-@ZI*YFq_LLa{Uoqiy&{<~aq`%#gZv0DnIB0X;>Pz+ zTG;i@Ah!)_M5ED7oSkv`p>X()rRm9MQ8*j_R+)qz3$@DkCM^!@m3iHtf^m&IWerj zt<6%IDUOI4-pT30A4n{N5;at2=V5wT@Ps)1CnGbbh3O^&XF3o+N0DR&`zI2Jf5NB> zE?KU5WvOq}M{z-1OKZ-BW6Q!Z95Gix&I;c(?|6yBS2yj+@!)JzJ7#u|Lbc*{OW;d= zH*AZ(5}m*9=!h(QWi(^3nJs_nTRO$FkdW89o4P?DNFoVAErztJ;RkNYWh%@+6(KpX zE@>hsWq3*78k10zEv0W9;-yMY)f|Cq&+)4HBZr4q9;>x*Fl~?~e`*p^qek-YaErYr zyB7?jHY7E*f@9(mAS(phSDV;9+?^$EAV~JnN|c=^f1{Xd>QrxW41HfuVsY{A_(qXb zs^awOLh|`9+XS`D(8tla9hhgey-VE}ZBHXl^2HMOPi0>&hP(Ung<6<8)m>Q|-iErk zLP-~E)?$H|dF-=5T;&o*CD$Ac7G_A5H_NbEHR!wSN`_rT7Ux^2ZoTxT2( z@d`F5$V!)YHMZVa`!v_Ax5du1AzgFt-jx#r{7CjKl$a8QKM3Opt7IsG6SyEBd{U%q zGOndp{f53z_)k7AX4et4)$v#DyTb=H(d_WNsA))4%$ThCZJE%x73mzZ+u?j09=ueO zEIx{MK&Xt1mN~^UlR8zkZkL}ZM-0r*NDp8Gy)u+37#MP)-N&u#%YkHzEyNi((IRwN zR+Pu6pvCL7IvoQ4{a3fn>hLhbukZm@;K@Nv@cNF+NsVk!h9MsF+Nt0pF>Y)E{bM=f zS+4>CXsE2maY_X3*_*k(E<+0YpfnPp6PZ*2Oe3Kf#!w%tUQ=A_uUU|G9zeRg4Z9Kx z#XvmqB+_fjR7RY*QhLNKV(Ma1y0$$hX+5E9OGy72t0hcDMfqt%;S%$PiPf;$3YK&RlvO20^y;wdrUGab$>c zriNM;?O_mXE;b@!DYC%AZ)fa#DdcYi2@Owecy~9X%{ch0g4o@15_|0RmjiT`EoDhT z5TtRrs*ya&eVgti!^j($h;eXE|4RK_V5ScUGBDq67f;ah0|oUY5rAU6!BJ+aW-lh7 z(I5oj-6Q>v8@r5Tsv-qLNCe3NZ*X0xKGuLS@2~uqf1fn|b|AyIz|^-%cMr|w{oOto zk9B-00BdNlVn_btg&hM4j&A{PemdMnp-}%fDNAD6`%F@hek!c)6`uwmi&1)QR1gbu zm?uMAs-^n`jfGyx=J6y3d+CqzB4w+^ zGTz5ir$~C`I)=VI!d<{k!;Qr4YD_G;r_d`9v$c1AZ@BOwYgFOriXQNZ<}vpGw6YiT z<1qg|8IApR* zKe@cyJNV^4#Ey#!q`>#=FAvPQ_GI*d2NNTAO7xex>p_bY*VTMRL>N>Ee*wafuAo{u za@v9%U=6BnaUdhSXD)f>>WYntxk4yL#X{6Y8$W2CWC>2Wdk83#$%%?Fst@u>5|A7I z$A@)>n0-AB;%BYhFuqY&^f=#{E7*u9CI;~is?b0sC<#bA$$b`y)BvPraW)YNmckZT zB%6PK=v8PuPUblsF*{~)5M>K=)Wjhv{{@-V`f!##5c66b^vm0>;pz6jSd_W62d9UA zr?@L)N7Zf{-MWx5m>d^Xf{WL>`AHH7hLKx1K8=H% zU@*_rTPdW?Z1#z+c<#YU?Z>jo?#OIs}qPF1`H z3Aq_c21={s_5_S?-7|c;>BKSLKl26?TKv~P&~r*XdBA-CbUAw zz90yNj!?VTArn?pyo|vuI7m{nI`DnK7x2-XFw}COnMk=yfa zG zong0el1>xT_AmLFz8jnEk;Z6pw4++!oHTgCyr{|y3euD*oCyvjpVeXchbTU(Pm;I3 zH?b=T{u#(mg06ji$r04&4x0xvOU(?`=rEbV%>ndcljkSEMzs`bxQ*T*)i$|c{)Wq0vzV~8o-6oQ&47_Ck6+D z`z?R@m$x(5`M5wZ2=X>)tZSq@o`SU5hk+te{8bjM)DEuWhmIyn)k3>?`Ne zyb183*|u4c4B$uxTbyJ>hD{2bNCiNdVyKZEX^S@d^Q^%2zC!Advw$e0DmlK0T$vq; zQ-UY}e764gU*}KJADPJAkKP}DwzlASSOGxC04zdZ+kSd!PHGY?mv`zFHMVeGa!=}) zdpvPHO?e=QBq@E;aGlSrzV%#ntV)yQ045ms9n);IX%x`bE$mA}f#{VPTI>B6J-wihZ`!cs@1T2wcnOi0y z{;H??#zm+kjBZ;&7ON%R!YoGfvQ+?2x>|p+-p-)ZLJdPRphg(^{iTDEaAWTJF^`fK z{sWq?yr915&#_y1?YP2KA0q`UWhxnMTPiwvv`ww$|1Rz#zYn7-WYj}XgtSZS+t#@3 zenn{uU{?t{dJZkWmlZ!jyZpnGb2I3c&XsEaIrL(BQSP(j&$7#m2fFi5itO$bWe*K2 z9?;9R9;THoq8{uDUuyX)gtBdmgY@SUXuzXui)KJBK_~8&euuHIjT6(7y=5#|G)jPW z952a)iR>)xH?>{V1nxg8J3?np#c=#J>UIVk6jpxBaX|uFp|T zo`5g=#3dNf^SP{|OX=<^z!9-&4bYJ6+faW!8&>)qx*UU7anyuRoEP`8r5-iJH^96? zA2!3c)-8nNT2P~_0oJ5ZRW_ccMZtQ|*^w}mn{p(tDU1SJBt#c)RL2Cwuc|6SX{>0V zAxbSWugW)r*Gye8N+RaYTu_L179}FUVDxh1hzj;_>Eq3yRT?fd+3XmgQ#3cgwJ`bF zmy}R~g1QC_!⪙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 diff --git a/c++/carla-lilv/sord.c b/c++/carla-lilv/sord.c index cccb137..ee2f0d5 100644 --- a/c++/carla-lilv/sord.c +++ b/c++/carla-lilv/sord.c @@ -15,7 +15,5 @@ * For a full copy of the GNU General Public License see the COPYING file */ -#include "sord-0.8.0/src/sord.c" -#include "sord-0.8.0/src/syntax.c" -#include "sord-0.8.0/src/zix/hash.c" -#include "sord-0.8.0/src/zix/tree.c" +#include "src/sord.c" +#include "src/syntax.c" diff --git a/c++/carla-lilv/sratom-0.2.0/NEWS b/c++/carla-lilv/sratom-0.2.0/NEWS deleted file mode 100644 index f1372bb..0000000 --- a/c++/carla-lilv/sratom-0.2.0/NEWS +++ /dev/null @@ -1,6 +0,0 @@ -sratom (0.2.0) stable; - - * Initial release - - -- David Robillard Wed, 18 Apr 2012 15:14:11 -0400 - diff --git a/c++/carla-lilv/sratom-0.2.0/doc/layout.xml b/c++/carla-lilv/sratom-0.2.0/doc/layout.xml deleted file mode 100644 index 83a1153..0000000 --- a/c++/carla-lilv/sratom-0.2.0/doc/layout.xml +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/c++/carla-lilv/sratom-0.2.0/waf b/c++/carla-lilv/sratom-0.2.0/waf deleted file mode 100755 index 907b984751184c38575e52a780dacee1f8d8668e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91475 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 diff --git a/c++/carla-lilv/sratom-0.2.0/COPYING b/c++/carla-lilv/sratom-0.4.0/COPYING similarity index 100% rename from c++/carla-lilv/sratom-0.2.0/COPYING rename to c++/carla-lilv/sratom-0.4.0/COPYING diff --git a/c++/carla-lilv/sratom-0.4.0/NEWS b/c++/carla-lilv/sratom-0.4.0/NEWS new file mode 100644 index 0000000..59509da --- /dev/null +++ b/c++/carla-lilv/sratom-0.4.0/NEWS @@ -0,0 +1,16 @@ +sratom (0.4.0) stable; + + * Correctly read objects with several rdf:type properties + * Support writing Object Atoms as top level descriptions if subject and + predicate are not given. + * Fix various hyper-strict warnings + * Upgrade to waf 1.7.2 + + -- David Robillard Thu, 23 Aug 2012 01:11:07 -0400 + +sratom (0.2.0) stable; + + * Initial release + + -- David Robillard Wed, 18 Apr 2012 15:14:11 -0400 + diff --git a/c++/carla-lilv/sratom-0.2.0/README b/c++/carla-lilv/sratom-0.4.0/README similarity index 100% rename from c++/carla-lilv/sratom-0.2.0/README rename to c++/carla-lilv/sratom-0.4.0/README diff --git a/c++/carla-lilv/sratom-0.2.0/doc/reference.doxygen.in b/c++/carla-lilv/sratom-0.4.0/doc/reference.doxygen.in similarity index 73% rename from c++/carla-lilv/sratom-0.2.0/doc/reference.doxygen.in rename to c++/carla-lilv/sratom-0.4.0/doc/reference.doxygen.in index cf5d481..ace4c90 100644 --- a/c++/carla-lilv/sratom-0.2.0/doc/reference.doxygen.in +++ b/c++/carla-lilv/sratom-0.4.0/doc/reference.doxygen.in @@ -1,14 +1,14 @@ -# Doxyfile 1.6.1 +# Doxyfile 1.8.1.1 # This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project +# doxygen (www.doxygen.org) for a project. # -# All text after a hash (#) is considered a comment and will be ignored +# All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") +# Values that contain spaces should be placed between quotes (" "). #--------------------------------------------------------------------------- # Project related configuration options @@ -22,8 +22,9 @@ DOXYFILE_ENCODING = UTF-8 -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. PROJECT_NAME = Sratom @@ -33,6 +34,19 @@ PROJECT_NAME = Sratom PROJECT_NUMBER = @SRATOM_VERSION@ +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location @@ -57,7 +71,7 @@ CREATE_SUBDIRS = NO # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English @@ -126,7 +140,7 @@ STRIP_FROM_PATH = STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems +# (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO @@ -181,6 +195,13 @@ TAB_SIZE = 4 ALIASES = +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list @@ -207,22 +228,32 @@ OPTIMIZE_FOR_FORTRAN = NO OPTIMIZE_OUTPUT_VHDL = NO -# Doxygen selects the parser to use depending on the extension of the files it parses. -# With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this tag. -# The format is ext=language, where ext is a file extension, and language is one of -# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, -# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat -# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), -# use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration +# func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO @@ -240,7 +271,7 @@ SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) -# will make doxygen to replace the get and set methods by a property in the +# will make doxygen replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. @@ -262,6 +293,22 @@ DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = YES + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = YES + # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct @@ -278,16 +325,27 @@ TYPEDEF_HIDES_STRUCT = YES # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penality. +# causing a significant performance penalty. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will rougly double the +# a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols +# corresponding to a cache size of 2^16 = 65536 symbols. SYMBOL_CACHE_SIZE = 0 +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- @@ -304,6 +362,10 @@ EXTRACT_ALL = YES EXTRACT_PRIVATE = NO +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. @@ -326,7 +388,7 @@ EXTRACT_LOCAL_METHODS = NO # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default -# anonymous namespace are hidden. +# anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = NO @@ -386,6 +448,12 @@ HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. @@ -405,7 +473,13 @@ SORT_MEMBER_DOCS = NO SORT_BRIEF_DOCS = NO -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO @@ -425,6 +499,15 @@ SORT_GROUP_NAMES = NO SORT_BY_SCOPE_NAME = YES +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. @@ -455,10 +538,10 @@ GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in +# the initial value of a variable or macro consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the +# The appearance of the initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. @@ -470,12 +553,6 @@ MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. @@ -499,15 +576,25 @@ SHOW_NAMESPACES = NO FILE_VERSION_FILTER = -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by -# doxygen. The layout file controls the global structure of the generated output files -# in an output format independent way. The create the layout file that represents -# doxygen's defaults, run doxygen with the -l option. You can optionally specify a -# file name after the option, if omitted DoxygenLayout.xml will be used as the name -# of the layout file. +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = @SRATOM_SRCDIR@/doc/layout.xml +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. + +CITE_BIB_FILES = + #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- @@ -536,13 +623,13 @@ WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES -# This WARN_NO_PARAMDOC option can be abled to get warnings for +# The WARN_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. -WARN_NO_PARAMDOC = NO +WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text @@ -582,8 +669,9 @@ INPUT_ENCODING = UTF-8 # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = @@ -593,14 +681,16 @@ FILE_PATTERNS = RECURSIVE = NO -# The EXCLUDE tag can be used to specify files and/or directories that should +# The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. EXCLUDE = -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO @@ -664,8 +754,8 @@ INPUT_FILTER = # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = @@ -675,6 +765,14 @@ FILTER_PATTERNS = FILTER_SOURCE_FILES = NO +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- @@ -693,7 +791,7 @@ INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. +# fragments. Normal C, C++ and Fortran comments will always remain visible. STRIP_CODE_COMMENTS = YES @@ -729,7 +827,7 @@ USE_HTAGS = NO # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. -VERBATIM_HEADERS = YES +VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index @@ -777,7 +875,14 @@ HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a -# standard header. +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! HTML_HEADER = @@ -792,24 +897,67 @@ HTML_FOOTER = # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! +# style sheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = @SRATOM_SRCDIR@/doc/style.css + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 160 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. -HTML_STYLESHEET = doc/style.css +HTML_COLORSTYLE_GAMMA = 80 -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. -HTML_ALIGN_MEMBERS = YES +HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). +# page has loaded. HTML_DYNAMIC_SECTIONS = NO +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of +# entries shown in the various tree structured indices initially; the user +# can expand and collapse entries dynamically later on. Doxygen will expand +# the tree to such a level that at most the specified number of entries are +# visible (unless a fully collapsed tree already exceeds this amount). +# So setting the number of entries 1 will produce a full collapsed tree by +# default. 0 is a special value representing an infinite number of entries +# and will result in a full expanded tree by default. + +HTML_INDEX_NUM_ENTRIES = 100 + # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). @@ -818,7 +966,8 @@ HTML_DYNAMIC_SECTIONS = NO # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. GENERATE_DOCSET = NO @@ -836,6 +985,16 @@ DOCSET_FEEDNAME = "Doxygen generated docs" DOCSET_BUNDLE_ID = org.doxygen.Project +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) @@ -880,10 +1039,10 @@ BINARY_TOC = NO TOC_EXPAND = NO -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER -# are set, an additional index file will be generated that can be used as input for -# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated -# HTML documentation. +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO @@ -905,20 +1064,24 @@ QHP_NAMESPACE = QHP_VIRTUAL_FOLDER = doc -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. -# For more information please see +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see -# Qt Help Project / Custom Filters. +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's # filter section matches. -# Qt Help Project / Filter Attributes. +# +# Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = @@ -929,16 +1092,30 @@ QHP_SECT_FILTER_ATTRS = QHG_LOCATION = -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. -DISABLE_INDEX = NO +GENERATE_ECLIPSEHELP = NO -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. -ENUM_VALUES_PER_LINE = 4 +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = YES # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. @@ -947,13 +1124,17 @@ ENUM_VALUES_PER_LINE = 4 # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = NO -# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list. +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. -USE_INLINE_TREES = NO +ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree @@ -961,6 +1142,11 @@ USE_INLINE_TREES = NO TREEVIEW_WIDTH = 250 +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need @@ -969,13 +1155,60 @@ TREEVIEW_WIDTH = 250 FORMULA_FONTSIZE = 10 -# When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) -# there is already a search function so this one should typically -# be disabled. +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. +# However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = NO +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- @@ -993,6 +1226,9 @@ LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. LATEX_CMD_NAME = latex @@ -1009,7 +1245,7 @@ MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and +# by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide @@ -1026,6 +1262,13 @@ EXTRA_PACKAGES = LATEX_HEADER = +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references @@ -1052,10 +1295,19 @@ LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO -# If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- @@ -1087,7 +1339,7 @@ COMPACT_RTF = NO RTF_HYPERLINKS = NO -# Load stylesheet definitions from file. Syntax is similar to doxygen's +# Load style sheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. @@ -1232,7 +1484,7 @@ MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. +# pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES @@ -1262,15 +1514,15 @@ PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES @@ -1278,22 +1530,18 @@ SKIP_FUNCTION_MACROS = YES # Configuration::additions related to external references #--------------------------------------------------------------------------- -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. TAGFILES = @@ -1326,9 +1574,8 @@ PERL_PATH = /usr/bin/perl # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = NO @@ -1354,14 +1601,20 @@ HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO -# By default doxygen will write a font called FreeSans.ttf to the output -# directory and reference it in all dot files that doxygen generates. This -# font does not include all possible unicode characters however, so when you need -# these (or just want a differently looking font) you can specify the font name -# using DOT_FONTNAME. You need need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -# containing the font. +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. DOT_FONTNAME = FreeSans @@ -1370,17 +1623,16 @@ DOT_FONTNAME = FreeSans DOT_FONTSIZE = 10 -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot -# can find it using this tag. +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. +# CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = NO @@ -1402,6 +1654,15 @@ GROUP_GRAPHS = YES UML_LOOK = NO +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. @@ -1438,23 +1699,34 @@ CALL_GRAPH = NO CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. +# will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = NO -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. -DIRECTORY_GRAPH = YES +DIRECTORY_GRAPH = NO # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. @@ -1466,6 +1738,12 @@ DOT_PATH = DOTFILE_DIRS = +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is diff --git a/c++/carla-lilv/sord-0.8.0/doc/style.css b/c++/carla-lilv/sratom-0.4.0/doc/style.css similarity index 95% rename from c++/carla-lilv/sord-0.8.0/doc/style.css rename to c++/carla-lilv/sratom-0.4.0/doc/style.css index 5cdf97b..4c62b46 100644 --- a/c++/carla-lilv/sord-0.8.0/doc/style.css +++ b/c++/carla-lilv/sratom-0.4.0/doc/style.css @@ -1,24 +1,24 @@ body { - font-size: 100%; + font-size: medium; font-family: sans-serif; } #top { background-color: #F3F3F3; margin: 0; - padding: 0; + padding: 0; border-bottom: 1px solid #DDD; - margin-bottom: 1ex; - font-size: 180%; - font-weight: bold; + margin-bottom: 1ex; + font-size: xx-large; + font-weight: bold; } div.header { - display: none; + display: none; } .tabs { - display: none; + display: none; } h1 h2 h3 h4 h5 h6 { @@ -113,33 +113,24 @@ div.navtab { /* @group Link Styling */ a { - color: #3D578C; + color: #3D8C57; text-decoration: none; } .contents a:visited { - color: #4665A2; + color: #50755E; } a:hover { text-decoration: underline; } -a.qindex { -} - a.qindexHL { background-color: #9CAFD4; color: #FFF; border: 1px double #869DCA; } -a.el { -} - -a.elRef { -} - a.code { color: #4665A2; } @@ -245,7 +236,7 @@ div.center img { address.footer { text-align: right; - padding-right: 12px; + padding: 0 0.25em 0.25em 0; } img.footer { @@ -324,7 +315,7 @@ hr.footer { /* @group Member Descriptions */ table.memberdecls { border-spacing: 0; - font-size: 94%; + font-size: small; } .mdescLeft,.mdescRight,.memItemLeft,.memItemRight,.memTemplItemLeft,.memTemplItemRight,.memTemplParams { @@ -338,7 +329,7 @@ table.memberdecls { } .memItemLeft,.memItemRight,.memTemplParams { - border-top: 1px solid #EEE; + border-top: 1px solid #DDD; } .memItemLeft,.memTemplItemLeft { @@ -372,6 +363,7 @@ table.memberdecls { .memitem { padding: 0; margin: 1ex 0 2ex 0; + border: 1px solid #CCC; } .memname { @@ -380,9 +372,8 @@ table.memberdecls { } .memproto { - border-top: 1px solid #DDD; + border-bottom: 1px solid #DDD; padding: 0.5ex; - color: #253555; font-weight: bold; background-color: #F3F3F3; } @@ -567,6 +558,6 @@ div.header { div.headertitle { padding: 5px 5px 5px 10px; - font-size: 180%; - font-weight: bold; + font-size: 180%; + font-weight: bold; } diff --git a/c++/carla-lilv/sratom-0.2.0/sratom.pc.in b/c++/carla-lilv/sratom-0.4.0/sratom.pc.in similarity index 100% rename from c++/carla-lilv/sratom-0.2.0/sratom.pc.in rename to c++/carla-lilv/sratom-0.4.0/sratom.pc.in diff --git a/c++/carla-lilv/sratom-0.2.0/sratom/sratom.h b/c++/carla-lilv/sratom-0.4.0/sratom/sratom.h similarity index 81% rename from c++/carla-lilv/sratom-0.2.0/sratom/sratom.h rename to c++/carla-lilv/sratom-0.4.0/sratom/sratom.h index deda990..bf750dd 100644 --- a/c++/carla-lilv/sratom-0.2.0/sratom/sratom.h +++ b/c++/carla-lilv/sratom-0.4.0/sratom/sratom.h @@ -61,6 +61,31 @@ extern "C" { */ typedef struct SratomImpl Sratom; +/** + Mode for reading resources to LV2 Objects. + + This affects how resources (which are either blank nodes or have URIs) are + read by sratom_read(), since they may be read as simple references (a URI or + blank node ID) or a complete description (an atom "Object"). + + Currently, blank nodes are always read as Objects, but support for reading + blank node IDs may be added in the future. +*/ +typedef enum { + /** + Read blank nodes as Objects, and named resources as URIs. + */ + SRATOM_OBJECT_MODE_BLANK, + + /** + Read blank nodes and the main subject as Objects, and any other named + resources as URIs. The "main subject" is the subject parameter passed + to sratom_read(); if this is a resource it will be read as an Object, + but all other named resources encountered will be read as URIs. + */ + SRATOM_OBJECT_MODE_BLANK_SUBJECT, +} SratomObjectMode; + /** Create a new Atom serialiser. */ @@ -100,6 +125,14 @@ void sratom_set_pretty_numbers(Sratom* sratom, bool pretty_numbers); +/** + Configure how resources will be read to form LV2 Objects. +*/ +SRATOM_API +void +sratom_set_object_mode(Sratom* sratom, + SratomObjectMode object_mode); + /** Write an Atom to RDF. The serialised atom is written to the sink set by sratom_set_sink(). @@ -126,7 +159,7 @@ sratom_read(Sratom* sratom, LV2_Atom_Forge* forge, SordWorld* world, SordModel* model, - const SordNode* node); + const SordNode* subject); /** Serialise an Atom to a Turtle string. diff --git a/c++/carla-lilv/sratom-0.2.0/src/sratom.c b/c++/carla-lilv/sratom-0.4.0/src/sratom.c similarity index 82% rename from c++/carla-lilv/sratom-0.2.0/src/sratom.c rename to c++/carla-lilv/sratom-0.4.0/src/sratom.c index 9d68df7..ca8de27 100644 --- a/c++/carla-lilv/sratom-0.2.0/src/sratom.c +++ b/c++/carla-lilv/sratom-0.4.0/src/sratom.c @@ -32,7 +32,8 @@ #define USTR(str) ((const uint8_t*)(str)) typedef enum { - MODE_NORMAL, + MODE_SUBJECT, + MODE_BODY, MODE_SEQUENCE, } ReadMode; @@ -46,6 +47,7 @@ struct SratomImpl { SerdStatementSink write_statement; SerdEndSink end_anon; void* handle; + SratomObjectMode object_mode; bool pretty_numbers; struct { SordNode* atom_childType; @@ -76,6 +78,7 @@ sratom_new(LV2_URID_Map* map) sratom->midi_MidiEvent = map->map(map->handle, LV2_MIDI__MidiEvent); sratom->next_id = 0; sratom->base_uri = SERD_NODE_NULL; + sratom->object_mode = SRATOM_OBJECT_MODE_BLANK; sratom->pretty_numbers = false; memset(&sratom->nodes, 0, sizeof(sratom->nodes)); lv2_atom_forge_init(&sratom->forge, map); @@ -115,6 +118,14 @@ sratom_set_pretty_numbers(Sratom* sratom, sratom->pretty_numbers = pretty_numbers; } +SRATOM_API +void +sratom_set_object_mode(Sratom* sratom, + SratomObjectMode object_mode) +{ + sratom->object_mode = object_mode; +} + static void gensym(SerdNode* out, char c, unsigned num) { @@ -131,7 +142,7 @@ list_append(Sratom* sratom, SerdNode* node, uint32_t size, uint32_t type, - void* body) + const void* body) { // Generate a list node gensym(node, 'l', sratom->next_id); @@ -163,18 +174,21 @@ list_end(SerdStatementSink sink, static void start_object(Sratom* sratom, - uint32_t flags, + uint32_t* flags, const SerdNode* subject, const SerdNode* predicate, const SerdNode* node, const char* type) { - sratom->write_statement(sratom->handle, flags|SERD_ANON_O_BEGIN, NULL, - subject, predicate, node, NULL, NULL); + if (subject && predicate) { + sratom->write_statement(sratom->handle, *flags|SERD_ANON_O_BEGIN, NULL, + subject, predicate, node, NULL, NULL); + *flags |= SERD_ANON_CONT; + } if (type) { SerdNode p = serd_node_from_string(SERD_URI, NS_RDF "type"); SerdNode o = serd_node_from_string(SERD_URI, USTR(type)); - sratom->write_statement(sratom->handle, SERD_ANON_CONT, NULL, + sratom->write_statement(sratom->handle, *flags, NULL, node, &p, &o, NULL, NULL); } } @@ -215,7 +229,7 @@ sratom_write(Sratom* sratom, datatype = serd_node_from_string(SERD_URI, NS_XSD "base64Binary"); object = serd_node_new_blob(body, size, true); } else if (type_urid == sratom->forge.Literal) { - LV2_Atom_Literal_Body* lit = (LV2_Atom_Literal_Body*)body; + const LV2_Atom_Literal_Body* lit = (const LV2_Atom_Literal_Body*)body; const uint8_t* str = USTR(lit + 1); object = serd_node_from_string(SERD_LITERAL, str); if (lit->datatype) { @@ -229,12 +243,12 @@ sratom_write(Sratom* sratom, language = serd_node_from_string( SERD_LITERAL, USTR(lang + prefix_len)); } else { - fprintf(stderr, "Unknown language URI <%s>\n", lang); + fprintf(stderr, "Unknown language URID %d\n", lit->lang); } } } else if (type_urid == sratom->forge.URID) { - const uint32_t id = *(const uint32_t*)body; - const uint8_t* str = USTR(unmap->unmap(unmap->handle, id)); + const uint32_t urid = *(const uint32_t*)body; + const uint8_t* str = USTR(unmap->unmap(unmap->handle, urid)); object = serd_node_from_string(SERD_URI, str); } else if (type_urid == sratom->forge.Path) { const uint8_t* str = USTR(body); @@ -264,22 +278,22 @@ sratom_write(Sratom* sratom, object = serd_node_from_string(SERD_URI, str); } else if (type_urid == sratom->forge.Int) { new_node = true; - object = serd_node_new_integer(*(int32_t*)body); + object = serd_node_new_integer(*(const int32_t*)body); datatype = serd_node_from_string(SERD_URI, (sratom->pretty_numbers) ? NS_XSD "integer" : NS_XSD "int"); } else if (type_urid == sratom->forge.Long) { new_node = true; - object = serd_node_new_integer(*(int64_t*)body); + object = serd_node_new_integer(*(const int64_t*)body); datatype = serd_node_from_string(SERD_URI, (sratom->pretty_numbers) ? NS_XSD "integer" : NS_XSD "long"); } else if (type_urid == sratom->forge.Float) { new_node = true; - object = serd_node_new_decimal(*(float*)body, 8); + object = serd_node_new_decimal(*(const float*)body, 8); datatype = serd_node_from_string(SERD_URI, (sratom->pretty_numbers) ? NS_XSD "decimal" : NS_XSD "float"); } else if (type_urid == sratom->forge.Double) { new_node = true; - object = serd_node_new_decimal(*(double*)body, 16); + object = serd_node_new_decimal(*(const double*)body, 16); datatype = serd_node_from_string(SERD_URI, (sratom->pretty_numbers) ? NS_XSD "decimal" : NS_XSD "double"); } else if (type_urid == sratom->forge.Bool) { @@ -293,20 +307,20 @@ sratom_write(Sratom* sratom, uint8_t* str = (uint8_t*)calloc(size * 2 + 1, 1); for (uint32_t i = 0; i < size; ++i) { snprintf((char*)str + (2 * i), size * 2 + 1, "%02X", - (unsigned)(uint8_t)*((uint8_t*)body + i)); + (unsigned)(uint8_t)*((const uint8_t*)body + i)); } object = serd_node_from_string(SERD_LITERAL, USTR(str)); } else if (type_urid == sratom->atom_Event) { const LV2_Atom_Event* ev = (const LV2_Atom_Event*)body; gensym(&id, 'e', sratom->next_id++); - start_object(sratom, flags, subject, predicate, &id, NULL); + start_object(sratom, &flags, subject, predicate, &id, NULL); // TODO: beat time SerdNode time = serd_node_new_integer(ev->time.frames); SerdNode p = serd_node_from_string(SERD_URI, USTR(LV2_ATOM__frameTime)); datatype = serd_node_from_string(SERD_URI, NS_XSD "decimal"); sratom->write_statement(sratom->handle, SERD_ANON_CONT, NULL, - &id, &p, &time, &datatype, &language); + &id, &p, &time, &datatype, &language); serd_node_free(&time); p = serd_node_from_string(SERD_URI, NS_RDF "value"); @@ -317,7 +331,7 @@ sratom_write(Sratom* sratom, } } else if (type_urid == sratom->forge.Tuple) { gensym(&id, 't', sratom->next_id++); - start_object(sratom, flags, subject, predicate, &id, type); + start_object(sratom, &flags, subject, predicate, &id, type); SerdNode p = serd_node_from_string(SERD_URI, NS_RDF "value"); flags |= SERD_LIST_O_BEGIN; LV2_ATOM_TUPLE_BODY_FOREACH(body, size, i) { @@ -331,15 +345,15 @@ sratom_write(Sratom* sratom, } else if (type_urid == sratom->forge.Vector) { const LV2_Atom_Vector_Body* vec = (const LV2_Atom_Vector_Body*)body; gensym(&id, 'v', sratom->next_id++); - start_object(sratom, flags, subject, predicate, &id, type); + start_object(sratom, &flags, subject, predicate, &id, type); SerdNode p = serd_node_from_string(SERD_URI, (const uint8_t*)LV2_ATOM__childType); SerdNode child_type = serd_node_from_string( SERD_URI, (const uint8_t*)unmap->unmap(unmap->handle, vec->child_type)); sratom->write_statement(sratom->handle, flags, NULL, &id, &p, &child_type, NULL, NULL); p = serd_node_from_string(SERD_URI, NS_RDF "value"); flags |= SERD_LIST_O_BEGIN; - for (char* i = (char*)(vec + 1); - i < (char*)vec + size; + for (const char* i = (const char*)(vec + 1); + i < (const char*)vec + size; i += vec->child_size) { list_append(sratom, unmap, &flags, &id, &p, &node, vec->child_size, vec->child_type, i); @@ -348,26 +362,34 @@ sratom_write(Sratom* sratom, if (sratom->end_anon) { sratom->end_anon(sratom->handle, &id); } - } else if (type_urid == sratom->forge.Blank) { + } else if (type_urid == sratom->forge.Blank || + type_urid == sratom->forge.Resource) { const LV2_Atom_Object_Body* obj = (const LV2_Atom_Object_Body*)body; const char* otype = unmap->unmap(unmap->handle, obj->otype); - gensym(&id, 'b', sratom->next_id++); - start_object(sratom, flags, subject, predicate, &id, otype); + if (type_urid == sratom->forge.Blank) { + gensym(&id, 'b', sratom->next_id++); + start_object(sratom, &flags, subject, predicate, &id, otype); + } else { + id = serd_node_from_string( + SERD_URI, (const uint8_t*)unmap->unmap(unmap->handle, obj->id)); + flags = 0; + start_object(sratom, &flags, NULL, NULL, &id, otype); + } LV2_ATOM_OBJECT_BODY_FOREACH(obj, size, prop) { const char* const key = unmap->unmap(unmap->handle, prop->key); SerdNode pred = serd_node_from_string(SERD_URI, USTR(key)); - sratom_write(sratom, unmap, flags|SERD_ANON_CONT, &id, &pred, + sratom_write(sratom, unmap, flags, &id, &pred, prop->value.type, prop->value.size, LV2_ATOM_BODY(&prop->value)); } - if (sratom->end_anon) { + if (sratom->end_anon && (flags & SERD_ANON_CONT)) { sratom->end_anon(sratom->handle, &id); } } else if (type_urid == sratom->forge.Sequence) { const LV2_Atom_Sequence_Body* seq = (const LV2_Atom_Sequence_Body*)body; gensym(&id, 'v', sratom->next_id++); - start_object(sratom, flags, subject, predicate, &id, type); + start_object(sratom, &flags, subject, predicate, &id, type); SerdNode p = serd_node_from_string(SERD_URI, NS_RDF "value"); flags |= SERD_LIST_O_BEGIN; LV2_ATOM_SEQUENCE_BODY_FOREACH(seq, size, ev) { @@ -377,17 +399,17 @@ sratom_write(Sratom* sratom, ev); } list_end(sratom->write_statement, sratom->handle, &flags, &id, &p); - if (sratom->end_anon) { + if (sratom->end_anon && subject && predicate) { sratom->end_anon(sratom->handle, &id); } } else { gensym(&id, 'b', sratom->next_id++); - start_object(sratom, flags, subject, predicate, &id, type); + start_object(sratom, &flags, subject, predicate, &id, type); SerdNode p = serd_node_from_string(SERD_URI, NS_RDF "value"); SerdNode o = serd_node_new_blob(body, size, true); datatype = serd_node_from_string(SERD_URI, NS_XSD "base64Binary"); sratom->write_statement(sratom->handle, flags, NULL, &id, &p, &o, &datatype, NULL); - if (sratom->end_anon) { + if (sratom->end_anon && subject && predicate) { sratom->end_anon(sratom->handle, &id); } serd_node_free(&o); @@ -395,7 +417,7 @@ sratom_write(Sratom* sratom, if (object.buf) { sratom->write_statement(sratom->handle, flags, NULL, - subject, predicate, &object, &datatype, &language); + subject, predicate, &object, &datatype, &language); } if (new_node) { @@ -488,6 +510,34 @@ read_list_value(Sratom* sratom, } } +static void +read_resource(Sratom* sratom, + LV2_Atom_Forge* forge, + SordWorld* world, + SordModel* model, + const SordNode* node, + LV2_URID otype) +{ + LV2_URID_Map* map = sratom->map; + SordQuad q = { node, NULL, NULL, NULL }; + SordIter* i = sord_find(model, q); + SordQuad match; + for (; !sord_iter_end(i); sord_iter_next(i)) { + sord_iter_get(i, match); + const SordNode* p = match[SORD_PREDICATE]; + const SordNode* o = match[SORD_OBJECT]; + const char* p_uri = (const char*)sord_node_get_string(p); + uint32_t p_urid = map->map(map->handle, p_uri); + if (!(sord_node_equals(p, sratom->nodes.rdf_type) && + sord_node_get_type(o) == SORD_URI && + map->map(map->handle, (const char*)sord_node_get_string(o)) == otype)) { + lv2_atom_forge_property_head(forge, p_urid, 0); + read_node(sratom, forge, world, model, o, MODE_BODY); + } + } + sord_iter_free(i); +} + static uint32_t atom_size(Sratom* sratom, uint32_t type_urid) { @@ -525,19 +575,19 @@ read_node(Sratom* sratom, const char* language = sord_node_get_language(node); if (datatype) { const char* type_uri = (const char*)sord_node_get_string(datatype); - if (!strcmp(type_uri, (char*)NS_XSD "int") || - !strcmp(type_uri, (char*)NS_XSD "integer")) { + if (!strcmp(type_uri, (const char*)NS_XSD "int") || + !strcmp(type_uri, (const char*)NS_XSD "integer")) { lv2_atom_forge_int(forge, strtol(str, &endptr, 10)); - } else if (!strcmp(type_uri, (char*)NS_XSD "long")) { + } else if (!strcmp(type_uri, (const char*)NS_XSD "long")) { lv2_atom_forge_long(forge, strtol(str, &endptr, 10)); - } else if (!strcmp(type_uri, (char*)NS_XSD "float") || - !strcmp(type_uri, (char*)NS_XSD "decimal")) { + } else if (!strcmp(type_uri, (const char*)NS_XSD "float") || + !strcmp(type_uri, (const char*)NS_XSD "decimal")) { lv2_atom_forge_float(forge, serd_strtod(str, &endptr)); - } else if (!strcmp(type_uri, (char*)NS_XSD "double")) { + } else if (!strcmp(type_uri, (const char*)NS_XSD "double")) { lv2_atom_forge_double(forge, serd_strtod(str, &endptr)); - } else if (!strcmp(type_uri, (char*)NS_XSD "boolean")) { + } else if (!strcmp(type_uri, (const char*)NS_XSD "boolean")) { lv2_atom_forge_bool(forge, !strcmp(str, "true")); - } else if (!strcmp(type_uri, (char*)NS_XSD "base64Binary")) { + } else if (!strcmp(type_uri, (const char*)NS_XSD "base64Binary")) { size_t size = 0; void* body = serd_base64_decode(USTR(str), len, &size); lv2_atom_forge_atom(forge, size, forge->Chunk); @@ -573,7 +623,9 @@ read_node(Sratom* sratom, } else { lv2_atom_forge_string(forge, str, len); } - } else if (sord_node_get_type(node) == SORD_URI) { + } else if (sord_node_get_type(node) == SORD_URI && + !(sratom->object_mode == SRATOM_OBJECT_MODE_BLANK_SUBJECT + && mode == MODE_SUBJECT)) { if (!strcmp(str, (const char*)NS_RDF "nil")) { lv2_atom_forge_atom(forge, 0, 0); } else if (!strncmp(str, "file://", 7)) { @@ -602,10 +654,10 @@ read_node(Sratom* sratom, ? (const char*)sord_node_get_string(frame_time) : ""; lv2_atom_forge_frame_time(forge, serd_strtod(frame_time_str, NULL)); - read_node(sratom, forge, world, model, value, MODE_NORMAL); + read_node(sratom, forge, world, model, value, MODE_BODY); } else if (type_urid == sratom->forge.Tuple) { lv2_atom_forge_tuple(forge, &frame); - read_list_value(sratom, forge, world, model, value, MODE_NORMAL); + read_list_value(sratom, forge, world, model, value, MODE_BODY); } else if (type_urid == sratom->forge.Sequence) { lv2_atom_forge_sequence_head(forge, &frame, 0); read_list_value(sratom, forge, world, model, value, MODE_SEQUENCE); @@ -617,7 +669,7 @@ read_node(Sratom* sratom, uint32_t child_size = atom_size(sratom, child_type); if (child_size > 0) { lv2_atom_forge_vector_head(forge, &frame, child_size, child_type); - read_list_value(sratom, forge, world, model, value, MODE_NORMAL); + read_list_value(sratom, forge, world, model, value, MODE_BODY); } } else if (value && sord_node_equals(sord_node_get_datatype(value), sratom->nodes.xsd_base64Binary)) { @@ -628,25 +680,13 @@ read_node(Sratom* sratom, lv2_atom_forge_atom(forge, size, type_urid); lv2_atom_forge_write(forge, body, size); free(body); + } else if (sord_node_get_type(node) == SORD_URI) { + lv2_atom_forge_resource( + forge, &frame, map->map(map->handle, str), type_urid); + read_resource(sratom, forge, world, model, node, type_urid); } else { lv2_atom_forge_blank(forge, &frame, sratom->next_id++, type_urid); - SordQuad match; - - SordQuad q2 = { node, 0, 0, 0 }; - SordIter* i = sord_find(model, q2); - for (;!sord_iter_end(i); sord_iter_next(i)) { - sord_iter_get(i, match); - const SordNode* p = match[SORD_PREDICATE]; - const char* p_uri = (const char*)sord_node_get_string(p); - uint32_t p_urid = map->map(map->handle, p_uri); - if (!sord_node_equals(p, sratom->nodes.rdf_type)) { - // TODO: This will lose multiple rdf:type properties - lv2_atom_forge_property_head(forge, p_urid, 0); - read_node(sratom, forge, world, model, - match[SORD_OBJECT], MODE_NORMAL); - } - } - sord_iter_free(i); + read_resource(sratom, forge, world, model, node, type_urid); } if (frame.ref) { lv2_atom_forge_pop(forge, &frame); @@ -671,7 +711,7 @@ sratom_read(Sratom* sratom, sratom->nodes.xsd_base64Binary = sord_new_uri(world, NS_XSD "base64Binary"); sratom->next_id = 1; - read_node(sratom, forge, world, model, node, MODE_NORMAL); + read_node(sratom, forge, world, model, node, MODE_SUBJECT); sord_node_free(world, sratom->nodes.xsd_base64Binary); sord_node_free(world, sratom->nodes.rdf_value); @@ -720,19 +760,23 @@ sratom_from_turtle(Sratom* sratom, if (!serd_reader_read_string(reader, (const uint8_t*)str)) { SordNode* s = sord_node_from_serd_node(world, env, subject, 0, 0); - SordNode* p = sord_node_from_serd_node(world, env, predicate, 0, 0); - SordQuad q = { s, p, 0, 0 }; - SordIter* i = sord_find(model, q); - if (!sord_iter_end(i)) { - SordQuad result; - sord_iter_get(i, result); - lv2_atom_forge_set_sink( - &sratom->forge, sratom_forge_sink, sratom_forge_deref, &out); - sratom_read(sratom, &sratom->forge, world, model, result[SORD_OBJECT]); + lv2_atom_forge_set_sink( + &sratom->forge, sratom_forge_sink, sratom_forge_deref, &out); + if (subject && predicate) { + SordNode* p = sord_node_from_serd_node(world, env, predicate, 0, 0); + SordQuad q = { s, p, 0, 0 }; + SordIter* i = sord_find(model, q); + if (!sord_iter_end(i)) { + SordQuad result; + sord_iter_get(i, result); + sratom_read(sratom, &sratom->forge, world, model, result[SORD_OBJECT]); + } else { + fprintf(stderr, "Failed to find node\n"); + } + sord_iter_free(i); } else { - fprintf(stderr, "Failed to find node\n"); + sratom_read(sratom, &sratom->forge, world, model, s); } - sord_iter_free(i); } else { fprintf(stderr, "Failed to read Turtle\n"); } diff --git a/c++/carla-lilv/sratom-0.2.0/tests/sratom_test.c b/c++/carla-lilv/sratom-0.4.0/tests/sratom_test.c similarity index 85% rename from c++/carla-lilv/sratom-0.2.0/tests/sratom_test.c rename to c++/carla-lilv/sratom-0.4.0/tests/sratom_test.c index fe5d573..f76c246 100644 --- a/c++/carla-lilv/sratom-0.2.0/tests/sratom_test.c +++ b/c++/carla-lilv/sratom-0.4.0/tests/sratom_test.c @@ -14,6 +14,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include #include #include #include @@ -30,7 +31,7 @@ static char** uris = NULL; static size_t n_uris = 0; -char* +static char* copy_string(const char* str) { const size_t len = strlen(str); @@ -39,7 +40,7 @@ copy_string(const char* str) return dup; } -LV2_URID +static LV2_URID urid_map(LV2_URID_Map_Handle handle, const char* uri) { for (size_t i = 0; i < n_uris; ++i) { @@ -53,7 +54,7 @@ urid_map(LV2_URID_Map_Handle handle, const char* uri) return n_uris; } -const char* +static const char* urid_unmap(LV2_URID_Unmap_Handle handle, LV2_URID urid) { @@ -63,7 +64,7 @@ urid_unmap(LV2_URID_Unmap_Handle handle, return NULL; } -int +static int test_fail(const char* fmt, ...) { va_list args; @@ -74,8 +75,8 @@ test_fail(const char* fmt, ...) return 1; } -int -main() +static int +test(bool top_level) { LV2_URID_Map map = { NULL, urid_map }; LV2_URID_Unmap unmap = { NULL, urid_unmap }; @@ -83,6 +84,9 @@ main() lv2_atom_forge_init(&forge, &map); Sratom* sratom = sratom_new(&map); + sratom_set_object_mode( + sratom, + top_level ? SRATOM_OBJECT_MODE_BLANK_SUBJECT : SRATOM_OBJECT_MODE_BLANK); LV2_URID eg_Object = urid_map(NULL, "http://example.org/Object"); LV2_URID eg_one = urid_map(NULL, "http://example.org/a-one"); @@ -107,9 +111,15 @@ main() uint8_t buf[1024]; lv2_atom_forge_set_buffer(&forge, buf, sizeof(buf)); + const char* obj_uri = "http://example.org/obj"; + LV2_URID obj_id = urid_map(NULL, obj_uri); LV2_Atom_Forge_Frame obj_frame; - LV2_Atom* obj = (LV2_Atom*)lv2_atom_forge_deref( - &forge, lv2_atom_forge_blank(&forge, &obj_frame, 1, eg_Object)); + if (top_level) { + lv2_atom_forge_resource(&forge, &obj_frame, obj_id, eg_Object); + } else { + lv2_atom_forge_blank(&forge, &obj_frame, 1, eg_Object); + } + LV2_Atom* obj = lv2_atom_forge_deref(&forge, obj_frame.ref); // eg_one = (Int32)1 lv2_atom_forge_property_head(&forge, eg_one, 0); @@ -182,7 +192,7 @@ main() // eg_blank = [ a ] lv2_atom_forge_property_head(&forge, eg_blank, 0); LV2_Atom_Forge_Frame blank_frame; - lv2_atom_forge_blank(&forge, &blank_frame, 2, eg_Object); + lv2_atom_forge_blank(&forge, &blank_frame, top_level ? 1 : 2, eg_Object); lv2_atom_forge_pop(&forge, &blank_frame); // eg_tuple = "foo",true @@ -221,20 +231,31 @@ main() const char* base_uri = "file:///tmp/base/"; - SerdNode s = serd_node_from_string(SERD_URI, USTR("http://example.org/obj")); - SerdNode p = serd_node_from_string(SERD_URI, USTR(NS_RDF "value")); - char* outstr = sratom_to_turtle( - sratom, &unmap, base_uri, &s, &p, + SerdNode s = serd_node_from_string(SERD_URI, USTR("http://example.org/obj")); + SerdNode p = serd_node_from_string(SERD_URI, USTR(NS_RDF "value")); + + SerdNode* subj = top_level ? NULL : &s; + SerdNode* pred = top_level ? NULL : &p; + + char* outstr = sratom_to_turtle( + sratom, &unmap, base_uri, subj, pred, obj->type, obj->size, LV2_ATOM_BODY(obj)); + printf("# Atom => Turtle\n\n%s", outstr); - LV2_Atom* parsed = sratom_from_turtle(sratom, base_uri, &s, &p, outstr); + LV2_Atom* parsed = NULL; + if (top_level) { + SerdNode o= serd_node_from_string(SERD_URI, (const uint8_t*)obj_uri); + parsed = sratom_from_turtle(sratom, base_uri, &o, NULL, outstr); + } else { + parsed = sratom_from_turtle(sratom, base_uri, subj, pred, outstr); + } if (!lv2_atom_equals(obj, parsed)) { return test_fail("Parsed atom does not match original\n"); } char* instr = sratom_to_turtle( - sratom, &unmap, base_uri, &s, &p, + sratom, &unmap, base_uri, subj, pred, parsed->type, parsed->size, LV2_ATOM_BODY(parsed)); printf("# Turtle => Atom\n\n%s", instr); @@ -251,7 +272,21 @@ main() for (uint32_t i = 0; i < n_uris; ++i) { free(uris[i]); } + free(uris); + uris = NULL; + n_uris = 0; + + return 0; +} +int +main(void) +{ + if (test(false)) { + return 1; + } else if (test(true)) { + return 1; + } return 0; } diff --git a/c++/carla-lilv/sratom-0.4.0/waf b/c++/carla-lilv/sratom-0.4.0/waf new file mode 100755 index 0000000000000000000000000000000000000000..3088b02b08b876672d8dfb2aecec7139056451ff GIT binary patch literal 72589 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 literal 0 HcmV?d00001 diff --git a/c++/carla-lilv/sratom-0.2.0/wscript b/c++/carla-lilv/sratom-0.4.0/wscript similarity index 63% rename from c++/carla-lilv/sratom-0.2.0/wscript rename to c++/carla-lilv/sratom-0.4.0/wscript index 6984bae..8b55a3c 100644 --- a/c++/carla-lilv/sratom-0.2.0/wscript +++ b/c++/carla-lilv/sratom-0.4.0/wscript @@ -1,15 +1,12 @@ #!/usr/bin/env python -import glob import os -import shutil import subprocess -import sys from waflib.extras import autowaf as autowaf -import waflib.Logs as Logs, waflib.Options as Options +import waflib.Options as Options # Version of this package (even if built as a child) -SRATOM_VERSION = '0.2.0' +SRATOM_VERSION = '0.4.0' SRATOM_MAJOR_VERSION = '0' # Library version (UNIX style major, minor, micro) @@ -30,27 +27,28 @@ out = 'build' def options(opt): opt.load('compiler_c') autowaf.set_options(opt) - opt.add_option('--test', action='store_true', default=False, dest='build_tests', + opt.add_option('--test', action='store_true', dest='build_tests', help="Build unit tests") - opt.add_option('--static', action='store_true', default=False, dest='static', + opt.add_option('--static', action='store_true', dest='static', help="Build static library") + opt.add_option('--no-shared', action='store_true', dest='no_shared', + help='Do not build shared library') def configure(conf): conf.load('compiler_c') - conf.line_just = 41 autowaf.configure(conf) + autowaf.set_c99_mode(conf) autowaf.display_header('Sratom Configuration') - if conf.env['MSVC_COMPILER']: - conf.env.append_unique('CFLAGS', ['-TP', '-MD']) - else: - conf.env.append_unique('CFLAGS', '-std=c99') + conf.env.BUILD_TESTS = Options.options.build_tests + conf.env.BUILD_SHARED = not Options.options.no_shared + conf.env.BUILD_STATIC = Options.options.static - conf.env['BUILD_TESTS'] = Options.options.build_tests - conf.env['BUILD_STATIC'] = Options.options.static + if not conf.env.BUILD_SHARED and not conf.env.BUILD_STATIC: + conf.fatal('Neither a shared nor a static build requested') # Check for gcov library (for test coverage) - if conf.env['BUILD_TESTS']: + if conf.env.BUILD_TESTS: conf.check_cc(lib='gcov', define_name='HAVE_GCOV', mandatory=False) @@ -64,7 +62,7 @@ def configure(conf): autowaf.define(conf, 'SRATOM_VERSION', SRATOM_VERSION) conf.write_config_header('sratom_config.h', remove=False) - autowaf.display_msg(conf, "Unit tests", str(conf.env['BUILD_TESTS'])) + autowaf.display_msg(conf, "Unit tests", str(conf.env.BUILD_TESTS)) print('') lib_source = [ 'src/sratom.c' ] @@ -79,31 +77,31 @@ def build(bld): ['SERD', 'SORD', 'LV2'], {'SRATOM_MAJOR_VERSION' : SRATOM_MAJOR_VERSION}) - libflags = [ '-fvisibility=hidden' ] - libs = [ 'm' ] + libflags = ['-fvisibility=hidden'] + libs = ['m'] defines = [] - if bld.env['MSVC_COMPILER']: + if bld.env.MSVC_COMPILER: libflags = [] libs = [] defines = ['snprintf=_snprintf'] # Shared Library - obj = bld(features = 'c cshlib', - export_includes = ['.'], - source = lib_source, - includes = ['.', './src'], - lib = libs, - name = 'libsratom', - target = 'sratom-%s' % SRATOM_MAJOR_VERSION, - vnum = SRATOM_LIB_VERSION, - install_path = '${LIBDIR}', - defines = defines, - cflags = libflags + [ '-DSRATOM_SHARED', - '-DSRATOM_INTERNAL' ]) - autowaf.use_lib(bld, obj, 'SERD SORD LV2') + if bld.env.BUILD_SHARED: + obj = bld(features = 'c cshlib', + export_includes = ['.'], + source = lib_source, + includes = ['.', './src'], + lib = libs, + name = 'libsratom', + target = 'sratom-%s' % SRATOM_MAJOR_VERSION, + vnum = SRATOM_LIB_VERSION, + install_path = '${LIBDIR}', + defines = defines + ['SRATOM_SHARED', 'SRATOM_INTERNAL'], + cflags = libflags) + autowaf.use_lib(bld, obj, 'SERD SORD LV2') # Static library - if bld.env['BUILD_STATIC']: + if bld.env.BUILD_STATIC: obj = bld(features = 'c cstlib', export_includes = ['.'], source = lib_source, @@ -113,11 +111,10 @@ def build(bld): target = 'sratom-%s' % SRATOM_MAJOR_VERSION, vnum = SRATOM_LIB_VERSION, install_path = '${LIBDIR}', - defines = defines, - cflags = ['-DSRATOM_INTERNAL']) + defines = defines + ['SRATOM_INTERNAL']) autowaf.use_lib(bld, obj, 'SERD SORD LV2') - if bld.env['BUILD_TESTS']: + if bld.env.BUILD_TESTS: test_libs = libs test_cflags = [''] if bld.is_defined('HAVE_GCOV'): @@ -132,8 +129,8 @@ def build(bld): name = 'libsratom_profiled', target = 'sratom_profiled', install_path = '', - defines = defines, - cflags = test_cflags + ['-DSRATOM_INTERNAL']) + defines = defines + ['SRATOM_INTERNAL'], + cflags = test_cflags) autowaf.use_lib(bld, obj, 'SERD SORD LV2') # Unit test program @@ -151,7 +148,7 @@ def build(bld): autowaf.build_dox(bld, 'SRATOM', SRATOM_VERSION, top, out) bld.add_post_fun(autowaf.run_ldconfig) - if bld.env['DOCS']: + if bld.env.DOCS: bld.add_post_fun(fix_docs) def test(ctx): @@ -163,27 +160,9 @@ def test(ctx): def lint(ctx): subprocess.call('cpplint.py --filter=+whitespace/comments,-whitespace/tab,-whitespace/braces,-whitespace/labels,-build/header_guard,-readability/casting,-readability/todo,-build/include src/* sratom/*', shell=True) -def build_dir(ctx, subdir): - if autowaf.is_child(): - return os.path.join('build', APPNAME, subdir) - else: - return os.path.join('build', subdir) - def fix_docs(ctx): - try: - top = os.getcwd() - os.chdir(build_dir(ctx, 'doc/html')) - os.system("sed -i 's/SRATOM_API //' group__sratom.html") - os.system("sed -i 's/SRATOM_DEPRECATED //' group__sratom.html") - os.system("sed -i 's/href=\"doc\/style.css\"/href=\"style.css\"/' group__sratom.html") - os.remove('index.html') - os.symlink('group__sratom.html', 'index.html') - os.chdir(top) - os.chdir(build_dir(ctx, 'doc/man/man3')) - os.system("sed -i 's/SRATOM_API //' sratom.3") - os.chdir(top) - except: - Logs.error("Failed to fix up %s documentation" % APPNAME) + if ctx.cmd == 'build': + autowaf.make_simple_dox(APPNAME) def upload_docs(ctx): os.system("rsync -ravz --delete -e ssh build/doc/html/ drobilla@drobilla.net:~/drobilla.net/docs/sratom/") diff --git a/c++/carla-lilv/sratom.c b/c++/carla-lilv/sratom.c index 4deb154..235b1e1 100644 --- a/c++/carla-lilv/sratom.c +++ b/c++/carla-lilv/sratom.c @@ -15,4 +15,4 @@ * For a full copy of the GNU General Public License see the COPYING file */ -#include "sratom-0.2.0/src/sratom.c" +#include "src/sratom.c"