From 1063c9adbafc25f5a14bae15c3babdb039de86c6 Mon Sep 17 00:00:00 2001 From: Sam V Date: Tue, 20 Sep 2022 18:06:05 +0200 Subject: [PATCH 01/18] Make JSON_VALIDATOR_BUILD_EXAMPLES and JSON_VALIDATOR_BUILD_TESTS overridable by user Resolves pboettch/json-schema-validator#195 --- CMakeLists.txt | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ca2542..d0f0ec4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,5 @@ cmake_minimum_required(VERSION 3.2) -option(JSON_VALIDATOR_BUILD_TESTS "Build tests" ON) -option(JSON_VALIDATOR_BUILD_EXAMPLES "Build examples" ON) option(JSON_VALIDATOR_INSTALL "Install target" ON) option(JSON_VALIDATOR_HUNTER "Enable Hunter package manager support" OFF) @@ -48,16 +46,11 @@ set_target_properties(nlohmann_json_schema_validator # disable tests and examples if project is not super project if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) # I am top-level project. - set(JSON_VALIDATOR_IS_TOP_LEVEL TRUE) + set(JSON_VALIDATOR_IS_TOP_LEVEL ON) endif() -if(JSON_VALIDATOR_IS_TOP_LEVEL) - set(JSON_VALIDATOR_BUILD_TESTS ON) - set(JSON_VALIDATOR_BUILD_EXAMPLES ON) -else() - set(JSON_VALIDATOR_BUILD_TESTS OFF) - set(JSON_VALIDATOR_BUILD_EXAMPLES OFF) -endif() +option(JSON_VALIDATOR_BUILD_TESTS "Build tests" ${JSON_VALIDATOR_IS_TOP_LEVEL}) +option(JSON_VALIDATOR_BUILD_EXAMPLES "Build examples" ${JSON_VALIDATOR_IS_TOP_LEVEL}) if(NOT TARGET nlohmann_json::nlohmann_json) find_package(nlohmann_json REQUIRED) From e39c1aef5bf10c6dfd3eb144677401fd39b5465a Mon Sep 17 00:00:00 2001 From: sebasfalcone Date: Wed, 21 Sep 2022 17:07:47 -0300 Subject: [PATCH 02/18] CL: - Added tests for URI format - Added URI format validationCL: --- src/string-format-check.cpp | 118 ++++++++++++++++++++++++++++-- test/string-format-check-test.cpp | 16 ++++ 2 files changed, 129 insertions(+), 5 deletions(-) diff --git a/src/string-format-check.cpp b/src/string-format-check.cpp index 98954d9..1a623fc 100644 --- a/src/string-format-check.cpp +++ b/src/string-format-check.cpp @@ -84,10 +84,10 @@ void rfc3339_time_check(const std::string &value) } /** - * @todo Could be made more exact by querying a leap second database and choosing the - * correct maximum in {58,59,60}. This current solution might match some invalid dates - * but it won't lead to false negatives. This only works if we know the full date, however - */ + * @todo Could be made more exact by querying a leap second database and choosing the + * correct maximum in {58,59,60}. This current solution might match some invalid dates + * but it won't lead to false negatives. This only works if we know the full date, however + */ auto day_minutes = hour * 60 + minute - (offsetHour * 60 + offsetMinute); if (day_minutes < 0) @@ -126,7 +126,7 @@ void rfc3339_time_check(const std::string &value) * @endverbatim * NOTE: Per [ABNF] and ISO8601, the "T" and "Z" characters in this * syntax may alternatively be lower case "t" or "z" respectively. -*/ + */ void rfc3339_date_time_check(const std::string &value) { const static std::regex dateTimeRegex{R"(^([0-9]{4}\-[0-9]{2}\-[0-9]{2})[Tt]([0-9]{2}\:[0-9]{2}\:[0-9]{2}(?:\.[0-9]+)?(?:[Zz]|(?:\+|\-)[0-9]{2}\:[0-9]{2}))$)"}; @@ -265,6 +265,112 @@ const std::string dotAtom{"(?:" + atext + R"(+(?:\.)" + atext + "+)*)"}; const std::string stackoverflowMagicPart{R"((?:[[:alnum:]](?:[[:alnum:]-]*[[:alnum:]])?\.)+)" R"([[:alnum:]](?:[[:alnum:]-]*[[:alnum:]])?)"}; const std::string email{"(?:" + dotAtom + "|" + quotedString + ")@(?:" + stackoverflowMagicPart + "|" + domainLiteral + ")"}; + +/** + * @see + * + * @verbatim + * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] + * + * hier-part = "//" authority path-abempty + * / path-absolute + * / path-rootless + * / path-empty + * + * URI-reference = URI / relative-ref + * + * absolute-URI = scheme ":" hier-part [ "?" query ] + * + * relative-ref = relative-part [ "?" query ] [ "#" fragment ] + * + * relative-part = "//" authority path-abempty + * / path-absolute + * / path-noscheme + * / path-empty + * + * scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) + * + * authority = [ userinfo "@" ] host [ ":" port ] + * userinfo = *( unreserved / pct-encoded / sub-delims / ":" ) + * host = IP-literal / IPv4address / reg-name + * port = *DIGIT + * + * IP-literal = "[" ( IPv6address / IPvFuture ) "]" + * + * IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" ) + * + * IPv6address = 6( h16 ":" ) ls32 + * / "::" 5( h16 ":" ) ls32 + * / [ h16 ] "::" 4( h16 ":" ) ls32 + * / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + * / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + * / [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + * / [ *4( h16 ":" ) h16 ] "::" ls32 + * / [ *5( h16 ":" ) h16 ] "::" h16 + * / [ *6( h16 ":" ) h16 ] "::" + * + * h16 = 1*4HEXDIG + * ls32 = ( h16 ":" h16 ) / IPv4address + * IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet + * dec-octet = DIGIT ; 0-9 + * / %x31-39 DIGIT ; 10-99 + * / "1" 2DIGIT ; 100-199 + * / "2" %x30-34 DIGIT ; 200-249 + * / "25" %x30-35 ; 250-255 + * + * reg-name = *( unreserved / pct-encoded / sub-delims ) + * + * path = path-abempty ; begins with "/" or is empty + * / path-absolute ; begins with "/" but not "//" + * / path-noscheme ; begins with a non-colon segment + * / path-rootless ; begins with a segment + * / path-empty ; zero characters + * + * path-abempty = *( "/" segment ) + * path-absolute = "/" [ segment-nz *( "/" segment ) ] + * path-noscheme = segment-nz-nc *( "/" segment ) + * path-rootless = segment-nz *( "/" segment ) + * path-empty = 0 + * + * segment = *pchar + * segment-nz = 1*pchar + * segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" ) + * ; non-zero-length segment without any colon ":" + * + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * + * query = *( pchar / "/" / "?" ) + * + * fragment = *( pchar / "/" / "?" ) + * + * pct-encoded = "%" HEXDIG HEXDIG + * + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * reserved = gen-delims / sub-delims + * gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + * + * @endverbatim + * @see adapted from: https://github.com/jhermsmeier/uri.regex/blob/master/uri.regex + * + */ +const std::string scheme{R"(([A-Za-z][A-Za-z0-9+\-.]*):)"}; +const std::string hierPart{R"((?:(\/\/)(?:((?:[A-Za-z0-9\-._~!$&'()*+,;=:]|%[0-9A-Fa-f]{2})*)@)?((?:\[(?:(?:(?:(?:[0-9A-Fa-f]{1,4}:){6}|::(?:[0-9A-Fa-f]{1,4}:){5}|(?:[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}|(?:(?:[0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}|(?:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}|(?:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}:|(?:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?::)(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(?:(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}|(?:(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?::)|[Vv][0-9A-Fa-f]+\.[A-Za-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|(?:[A-Za-z0-9\-._~!$&'()*+,;=]|%[0-9A-Fa-f]{2})*))(?::([0-9]*))?((?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)|\/((?:(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+(?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)?)|((?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+(?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)|))"}; +const std::string query{R"((?:\?((?:[A-Za-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9A-Fa-f]{2})*))?)"}; +const std::string fragment{ + R"((?:\#((?:[A-Za-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9A-Fa-f]{2})*))?)"}; + +void rfc3986_uri_check(const std::string &value) +{ + const std::string uriFormat{scheme + hierPart + query + fragment}; + static const std::regex uriRegex{uriFormat}; + + if (!std::regex_match(value, uriRegex)) { + throw std::invalid_argument(value + " is not a URI string according to RFC 3986."); + } +} + } // namespace namespace nlohmann @@ -286,6 +392,8 @@ void default_string_format_check(const std::string &format, const std::string &v rfc3339_date_check(value); } else if (format == "time") { rfc3339_time_check(value); + } else if (format == "uri") { + rfc3986_uri_check(value); } else if (format == "email") { static const std::regex emailRegex{email}; if (!std::regex_match(value, emailRegex)) { diff --git a/test/string-format-check-test.cpp b/test/string-format-check-test.cpp index 2a5fb88..4a207b1 100644 --- a/test/string-format-check-test.cpp +++ b/test/string-format-check-test.cpp @@ -82,5 +82,21 @@ int main() numberOfErrors += testStringFormat("ipv4", ipv4Checks); + const std::vector> uriChecks{ + {"http://www.google.com/search?q=regular%20expression", true}, + {"http://www.google.com/", true}, + {"http://www.google.com/search?q=regular%20expression", true}, + {"www.google.com", false}, + {"http://www.google.comj", true}, + {"ldap://[2001:db8::7]/c=GB?objectClass?one", true}, + {"mailto:John.Doe@example.com", true}, + {"news:comp.infosystems.www.servers.unix", true}, + {"https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top", true}, + {"tel:+1-816-555-1212", true}, + {"telnet://192.0.2.16:80/", true}, + {"urn:oasis:names:specification:docbook:dtd:xml:4.1.2", true}}; + + numberOfErrors += testStringFormat("uri", uriChecks); + return numberOfErrors; } From e1e6581b0548a9b99c54256463a9182a9d4d159c Mon Sep 17 00:00:00 2001 From: sebasfalcone Date: Thu, 22 Sep 2022 11:34:15 -0300 Subject: [PATCH 03/18] CL: encapsulation --- src/string-format-check.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/string-format-check.cpp b/src/string-format-check.cpp index 1a623fc..65825a7 100644 --- a/src/string-format-check.cpp +++ b/src/string-format-check.cpp @@ -355,16 +355,16 @@ const std::string email{"(?:" + dotAtom + "|" + quotedString + ")@(?:" + stackov * @see adapted from: https://github.com/jhermsmeier/uri.regex/blob/master/uri.regex * */ -const std::string scheme{R"(([A-Za-z][A-Za-z0-9+\-.]*):)"}; -const std::string hierPart{R"((?:(\/\/)(?:((?:[A-Za-z0-9\-._~!$&'()*+,;=:]|%[0-9A-Fa-f]{2})*)@)?((?:\[(?:(?:(?:(?:[0-9A-Fa-f]{1,4}:){6}|::(?:[0-9A-Fa-f]{1,4}:){5}|(?:[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}|(?:(?:[0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}|(?:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}|(?:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}:|(?:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?::)(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(?:(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}|(?:(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?::)|[Vv][0-9A-Fa-f]+\.[A-Za-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|(?:[A-Za-z0-9\-._~!$&'()*+,;=]|%[0-9A-Fa-f]{2})*))(?::([0-9]*))?((?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)|\/((?:(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+(?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)?)|((?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+(?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)|))"}; -const std::string query{R"((?:\?((?:[A-Za-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9A-Fa-f]{2})*))?)"}; -const std::string fragment{ - R"((?:\#((?:[A-Za-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9A-Fa-f]{2})*))?)"}; - void rfc3986_uri_check(const std::string &value) { - const std::string uriFormat{scheme + hierPart + query + fragment}; - static const std::regex uriRegex{uriFormat}; + const static std::string scheme{R"(([A-Za-z][A-Za-z0-9+\-.]*):)"}; + const static std::string hierPart{R"((?:(\/\/)(?:((?:[A-Za-z0-9\-._~!$&'()*+,;=:]|%[0-9A-Fa-f]{2})*)@)?((?:\[(?:(?:(?:(?:[0-9A-Fa-f]{1,4}:){6}|::(?:[0-9A-Fa-f]{1,4}:){5}|(?:[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}|(?:(?:[0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}|(?:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}|(?:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}:|(?:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?::)(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(?:(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}|(?:(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?::)|[Vv][0-9A-Fa-f]+\.[A-Za-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|(?:[A-Za-z0-9\-._~!$&'()*+,;=]|%[0-9A-Fa-f]{2})*))(?::([0-9]*))?((?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)|\/((?:(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+(?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)?)|((?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+(?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)|))"}; + const static std::string query{R"((?:\?((?:[A-Za-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9A-Fa-f]{2})*))?)"}; + const static std::string fragment{ + R"((?:\#((?:[A-Za-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9A-Fa-f]{2})*))?)"}; + const static std::string uriFormat{scheme + hierPart + query + fragment}; + + const static std::regex uriRegex{uriFormat}; if (!std::regex_match(value, uriRegex)) { throw std::invalid_argument(value + " is not a URI string according to RFC 3986."); From f24f8f420397fa6bf0d39a1cca6a2d15a6b34caf Mon Sep 17 00:00:00 2001 From: sebasfalcone Date: Thu, 22 Sep 2022 13:35:45 -0300 Subject: [PATCH 04/18] CL: removed uri from WILL_FAIL list --- test/JSON-Schema-Test-Suite/CMakeLists.txt | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/test/JSON-Schema-Test-Suite/CMakeLists.txt b/test/JSON-Schema-Test-Suite/CMakeLists.txt index 237254e..b26f189 100644 --- a/test/JSON-Schema-Test-Suite/CMakeLists.txt +++ b/test/JSON-Schema-Test-Suite/CMakeLists.txt @@ -5,9 +5,9 @@ set(DRAFT "draft7") # find schema-test-suite find_path(JSON_SCHEMA_TEST_SUITE_PATH NAMES - tests/${DRAFT}) + tests/${DRAFT}) -if (NOT JSON_SCHEMA_TEST_SUITE_PATH) +if(NOT JSON_SCHEMA_TEST_SUITE_PATH) message(STATUS "Set JSON_SCHEMA_TEST_SUITE_PATH to a path in which JSON-Schema-Test-Suite is located (github.com/json-schema-org/JSON-Schema-Test-Suite). Using internal test-suite which might be out of date.") set(JSON_SCHEMA_TEST_SUITE_PATH ${CMAKE_CURRENT_SOURCE_DIR}) endif() @@ -18,7 +18,7 @@ if(JSON_SCHEMA_TEST_SUITE_PATH) target_link_libraries(json-schema-test nlohmann_json_schema_validator) target_compile_definitions(json-schema-test PRIVATE - JSON_SCHEMA_TEST_SUITE_PATH="${JSON_SCHEMA_TEST_SUITE_PATH}") + JSON_SCHEMA_TEST_SUITE_PATH="${JSON_SCHEMA_TEST_SUITE_PATH}") option(JSON_SCHEMA_ENABLE_OPTIONAL_TESTS "Enable optional tests of the JSONSchema Test Suite" ON) @@ -28,23 +28,23 @@ if(JSON_SCHEMA_TEST_SUITE_PATH) foreach(TEST_FILE ${TEST_FILES}) get_filename_component(TEST_NAME ${TEST_FILE} NAME_WE) add_test(NAME "${JSON_SCHEMA_TEST_PREFIX}::${TEST_NAME}" - COMMAND ${PIPE_IN_TEST_SCRIPT} $ ${TEST_FILE}) + COMMAND ${PIPE_IN_TEST_SCRIPT} $ ${TEST_FILE}) endforeach() - if (JSON_SCHEMA_ENABLE_OPTIONAL_TESTS) + if(JSON_SCHEMA_ENABLE_OPTIONAL_TESTS) file(GLOB OPT_TEST_FILES ${JSON_SCHEMA_TEST_SUITE_PATH}/tests/${DRAFT}/optional/*.json) file(GLOB FORMAT_TEST_FILES ${JSON_SCHEMA_TEST_SUITE_PATH}/tests/${DRAFT}/optional/format/*.json) foreach(TEST_FILE ${OPT_TEST_FILES}) get_filename_component(TEST_NAME ${TEST_FILE} NAME_WE) add_test(NAME "${JSON_SCHEMA_TEST_PREFIX}::Optional::${TEST_NAME}" - COMMAND ${PIPE_IN_TEST_SCRIPT} $ ${TEST_FILE}) + COMMAND ${PIPE_IN_TEST_SCRIPT} $ ${TEST_FILE}) endforeach() foreach(TEST_FILE ${FORMAT_TEST_FILES}) get_filename_component(TEST_NAME ${TEST_FILE} NAME_WE) add_test(NAME "${JSON_SCHEMA_TEST_PREFIX}::Optional::Format::${TEST_NAME}" - COMMAND ${PIPE_IN_TEST_SCRIPT} $ ${TEST_FILE}) + COMMAND ${PIPE_IN_TEST_SCRIPT} $ ${TEST_FILE}) endforeach() # some optional tests will fail @@ -62,11 +62,10 @@ if(JSON_SCHEMA_TEST_SUITE_PATH) JSON-Suite::Optional::Format::relative-json-pointer JSON-Suite::Optional::Format::uri-reference JSON-Suite::Optional::Format::uri-template - JSON-Suite::Optional::Format::uri JSON-Suite::Optional::unicode PROPERTIES - WILL_FAIL ON) + WILL_FAIL ON) endif() else() endif() From 2a2d2d25d1d6f0711b6aa59876f3e91b2d63321d Mon Sep 17 00:00:00 2001 From: sebasfalcone Date: Thu, 22 Sep 2022 14:52:47 -0300 Subject: [PATCH 05/18] CL: Splited regex string to improve readability --- src/string-format-check.cpp | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/string-format-check.cpp b/src/string-format-check.cpp index 65825a7..cd908f0 100644 --- a/src/string-format-check.cpp +++ b/src/string-format-check.cpp @@ -358,7 +358,37 @@ const std::string email{"(?:" + dotAtom + "|" + quotedString + ")@(?:" + stackov void rfc3986_uri_check(const std::string &value) { const static std::string scheme{R"(([A-Za-z][A-Za-z0-9+\-.]*):)"}; - const static std::string hierPart{R"((?:(\/\/)(?:((?:[A-Za-z0-9\-._~!$&'()*+,;=:]|%[0-9A-Fa-f]{2})*)@)?((?:\[(?:(?:(?:(?:[0-9A-Fa-f]{1,4}:){6}|::(?:[0-9A-Fa-f]{1,4}:){5}|(?:[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}|(?:(?:[0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}|(?:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}|(?:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}:|(?:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?::)(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(?:(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}|(?:(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?::)|[Vv][0-9A-Fa-f]+\.[A-Za-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|(?:[A-Za-z0-9\-._~!$&'()*+,;=]|%[0-9A-Fa-f]{2})*))(?::([0-9]*))?((?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)|\/((?:(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+(?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)?)|((?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+(?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)|))"}; + const static std::string hierPart{ + R"((?:(\/\/)(?:((?:[A-Za-z0-9\-._~!$&'()*+,;=:]|)" + R"(%[0-9A-Fa-f]{2})*)@)?((?:\[(?:(?:(?:(?:[0-9A-Fa-f]{1,4}:){6}|)" + R"(::(?:[0-9A-Fa-f]{1,4}:){5}|)" + R"((?:[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}|)" + R"((?:(?:[0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}|)" + R"((?:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}|)" + R"((?:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}:|)" + R"((?:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?::)(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|)" + R"((?:(?:25[0-5]|2[0-4][0-9]|)" + R"([01]?[0-9][0-9]?)\.){3}(?:25[0-5]|)" + R"(2[0-4][0-9]|)" + R"([01]?[0-9][0-9]?))|)" + R"((?:(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}|)" + R"((?:(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?::)|)" + R"([Vv][0-9A-Fa-f]+\.[A-Za-z0-9\-._~!$&'()*+,;=:]+)\]|)" + R"((?:(?:25[0-5]|)" + R"(2[0-4][0-9]|)" + R"([01]?[0-9][0-9]?)\.){3}(?:25[0-5]|)" + R"(2[0-4][0-9]|)" + R"([01]?[0-9][0-9]?)|)" + R"((?:[A-Za-z0-9\-._~!$&'()*+,;=]|)" + R"(%[0-9A-Fa-f]{2})*))(?::([0-9]*))?((?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|)" + R"(%[0-9A-Fa-f]{2})*)*)|)" + R"(\/((?:(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|)" + R"(%[0-9A-Fa-f]{2})+(?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|)" + R"(%[0-9A-Fa-f]{2})*)*)?)|)" + R"(((?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|)" + R"(%[0-9A-Fa-f]{2})+(?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|)" + R"(%[0-9A-Fa-f]{2})*)*)|))"}; + const static std::string query{R"((?:\?((?:[A-Za-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9A-Fa-f]{2})*))?)"}; const static std::string fragment{ R"((?:\#((?:[A-Za-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9A-Fa-f]{2})*))?)"}; From 56bb4a4af43ee12b81fcf079acd19fda725e732f Mon Sep 17 00:00:00 2001 From: sebasfalcone Date: Fri, 23 Sep 2022 10:16:06 -0300 Subject: [PATCH 06/18] CL: Restored CMakeLists to original state --- test/JSON-Schema-Test-Suite/CMakeLists.txt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/JSON-Schema-Test-Suite/CMakeLists.txt b/test/JSON-Schema-Test-Suite/CMakeLists.txt index b26f189..1a240c6 100644 --- a/test/JSON-Schema-Test-Suite/CMakeLists.txt +++ b/test/JSON-Schema-Test-Suite/CMakeLists.txt @@ -5,9 +5,9 @@ set(DRAFT "draft7") # find schema-test-suite find_path(JSON_SCHEMA_TEST_SUITE_PATH NAMES - tests/${DRAFT}) + tests/${DRAFT}) -if(NOT JSON_SCHEMA_TEST_SUITE_PATH) +if (NOT JSON_SCHEMA_TEST_SUITE_PATH) message(STATUS "Set JSON_SCHEMA_TEST_SUITE_PATH to a path in which JSON-Schema-Test-Suite is located (github.com/json-schema-org/JSON-Schema-Test-Suite). Using internal test-suite which might be out of date.") set(JSON_SCHEMA_TEST_SUITE_PATH ${CMAKE_CURRENT_SOURCE_DIR}) endif() @@ -18,7 +18,7 @@ if(JSON_SCHEMA_TEST_SUITE_PATH) target_link_libraries(json-schema-test nlohmann_json_schema_validator) target_compile_definitions(json-schema-test PRIVATE - JSON_SCHEMA_TEST_SUITE_PATH="${JSON_SCHEMA_TEST_SUITE_PATH}") + JSON_SCHEMA_TEST_SUITE_PATH="${JSON_SCHEMA_TEST_SUITE_PATH}") option(JSON_SCHEMA_ENABLE_OPTIONAL_TESTS "Enable optional tests of the JSONSchema Test Suite" ON) @@ -28,23 +28,23 @@ if(JSON_SCHEMA_TEST_SUITE_PATH) foreach(TEST_FILE ${TEST_FILES}) get_filename_component(TEST_NAME ${TEST_FILE} NAME_WE) add_test(NAME "${JSON_SCHEMA_TEST_PREFIX}::${TEST_NAME}" - COMMAND ${PIPE_IN_TEST_SCRIPT} $ ${TEST_FILE}) + COMMAND ${PIPE_IN_TEST_SCRIPT} $ ${TEST_FILE}) endforeach() - if(JSON_SCHEMA_ENABLE_OPTIONAL_TESTS) + if (JSON_SCHEMA_ENABLE_OPTIONAL_TESTS) file(GLOB OPT_TEST_FILES ${JSON_SCHEMA_TEST_SUITE_PATH}/tests/${DRAFT}/optional/*.json) file(GLOB FORMAT_TEST_FILES ${JSON_SCHEMA_TEST_SUITE_PATH}/tests/${DRAFT}/optional/format/*.json) foreach(TEST_FILE ${OPT_TEST_FILES}) get_filename_component(TEST_NAME ${TEST_FILE} NAME_WE) add_test(NAME "${JSON_SCHEMA_TEST_PREFIX}::Optional::${TEST_NAME}" - COMMAND ${PIPE_IN_TEST_SCRIPT} $ ${TEST_FILE}) + COMMAND ${PIPE_IN_TEST_SCRIPT} $ ${TEST_FILE}) endforeach() foreach(TEST_FILE ${FORMAT_TEST_FILES}) get_filename_component(TEST_NAME ${TEST_FILE} NAME_WE) add_test(NAME "${JSON_SCHEMA_TEST_PREFIX}::Optional::Format::${TEST_NAME}" - COMMAND ${PIPE_IN_TEST_SCRIPT} $ ${TEST_FILE}) + COMMAND ${PIPE_IN_TEST_SCRIPT} $ ${TEST_FILE}) endforeach() # some optional tests will fail @@ -65,7 +65,7 @@ if(JSON_SCHEMA_TEST_SUITE_PATH) JSON-Suite::Optional::unicode PROPERTIES - WILL_FAIL ON) + WILL_FAIL ON) endif() else() endif() From fd622c040b507dd2e161b74a45c3ecd999a5b8b1 Mon Sep 17 00:00:00 2001 From: Gene Hightower Date: Fri, 21 Oct 2022 10:39:12 -0700 Subject: [PATCH 07/18] Use Ragel generated RFC-5321/RFC-6531 parsrr Mailbox address parser from --- CMakeLists.txt | 3 +- src/smtp-address-validator.cpp | 830 +++++++++++++++++++++ src/smtp-address-validator.hpp | 34 + src/string-format-check.cpp | 108 +-- test/JSON-Schema-Test-Suite/CMakeLists.txt | 1 - 5 files changed, 886 insertions(+), 90 deletions(-) create mode 100644 src/smtp-address-validator.cpp create mode 100644 src/smtp-address-validator.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index d0f0ec4..9379b1b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,6 +23,7 @@ endif() # the library add_library(nlohmann_json_schema_validator + src/smtp-address-validator.cpp src/json-schema-draft7.json.cpp src/json-uri.cpp src/json-validator.cpp @@ -153,4 +154,4 @@ if(JSON_VALIDATOR_INSTALL) DESTINATION ${INSTALL_CMAKE_DIR} ) -endif() \ No newline at end of file +endif() diff --git a/src/smtp-address-validator.cpp b/src/smtp-address-validator.cpp new file mode 100644 index 0000000..a63ead0 --- /dev/null +++ b/src/smtp-address-validator.cpp @@ -0,0 +1,830 @@ +/* + +Snarfed from + +: + +Copyright (c) 2021 Gene Hightower + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +#line 1 "smtp-address-validator.rl" +#include "smtp-address-validator.hpp" + +#line 110 "smtp-address-validator.rl" + +#line 7 "smtp-address-validator.cpp" +static const signed char _address_actions[] = { + 0, 1, 0, 1, 1, 0}; + +static const short _address_key_offsets[] = { + 0, 0, 24, 26, 50, 52, 54, 56, + 58, 60, 62, 86, 103, 105, 107, 109, + 111, 113, 115, 117, 134, 150, 161, 168, + 176, 180, 181, 190, 195, 196, 201, 202, + 207, 210, 213, 219, 222, 225, 228, 234, + 237, 240, 243, 249, 252, 261, 270, 282, + 293, 302, 311, 320, 328, 345, 353, 360, + 367, 368, 375, 382, 389, 396, 397, 404, + 411, 418, 425, 426, 433, 440, 447, 454, + 455, 462, 469, 476, 483, 484, 491, 498, + 505, 512, 513, 523, 531, 538, 545, 546, + 552, 559, 566, 573, 581, 589, 597, 608, + 618, 626, 634, 641, 649, 657, 665, 667, + 673, 681, 689, 697, 699, 705, 713, 721, + 729, 731, 737, 745, 753, 761, 763, 769, + 777, 785, 793, 795, 802, 812, 821, 829, + 837, 839, 848, 857, 865, 873, 875, 884, + 893, 901, 909, 911, 920, 929, 937, 945, + 947, 956, 965, 974, 983, 992, 1004, 1015, + 1024, 1033, 1042, 1051, 1060, 1072, 1083, 1092, + 1101, 1109, 1118, 1127, 1136, 1148, 1159, 1168, + 1177, 1185, 1194, 1203, 1212, 1224, 1235, 1244, + 1253, 1261, 1270, 1279, 1288, 1300, 1311, 1320, + 1329, 1337, 1339, 1353, 1355, 1357, 1359, 1361, + 1363, 1365, 1367, 1368, 1370, 1388, 0 +}; + +static const char _address_trans_keys[] = { + -32, -19, -16, -12, 34, 45, 61, 63, + -62, -33, -31, -17, -15, -13, 33, 39, + 42, 43, 47, 57, 65, 90, 94, 126, + -128, -65, -32, -19, -16, -12, 33, 46, + 61, 64, -62, -33, -31, -17, -15, -13, + 35, 39, 42, 43, 45, 57, 63, 90, + 94, 126, -96, -65, -128, -65, -128, -97, + -112, -65, -128, -65, -128, -113, -32, -19, + -16, -12, 33, 45, 61, 63, -62, -33, + -31, -17, -15, -13, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, -32, -19, + -16, -12, 91, -62, -33, -31, -17, -15, + -13, 48, 57, 65, 90, 97, 122, -128, + -65, -96, -65, -128, -65, -128, -97, -112, + -65, -128, -65, -128, -113, -32, -19, -16, + -12, 45, -62, -33, -31, -17, -15, -13, + 48, 57, 65, 90, 97, 122, -32, -19, + -16, -12, -62, -33, -31, -17, -15, -13, + 48, 57, 65, 90, 97, 122, 45, 48, + 49, 50, 73, 51, 57, 65, 90, 97, + 122, 45, 48, 57, 65, 90, 97, 122, + 45, 58, 48, 57, 65, 90, 97, 122, + 33, 90, 94, 126, 93, 45, 46, 58, + 48, 57, 65, 90, 97, 122, 48, 49, + 50, 51, 57, 46, 48, 49, 50, 51, + 57, 46, 48, 49, 50, 51, 57, 93, + 48, 57, 93, 48, 57, 53, 93, 48, + 52, 54, 57, 93, 48, 53, 46, 48, + 57, 46, 48, 57, 46, 53, 48, 52, + 54, 57, 46, 48, 53, 46, 48, 57, + 46, 48, 57, 46, 53, 48, 52, 54, + 57, 46, 48, 53, 45, 46, 58, 48, + 57, 65, 90, 97, 122, 45, 46, 58, + 48, 57, 65, 90, 97, 122, 45, 46, + 53, 58, 48, 52, 54, 57, 65, 90, + 97, 122, 45, 46, 58, 48, 53, 54, + 57, 65, 90, 97, 122, 45, 58, 80, + 48, 57, 65, 90, 97, 122, 45, 58, + 118, 48, 57, 65, 90, 97, 122, 45, + 54, 58, 48, 57, 65, 90, 97, 122, + 45, 58, 48, 57, 65, 90, 97, 122, + 58, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 48, 57, 65, 70, 97, 102, + 58, 48, 57, 65, 70, 97, 102, 58, + 58, 48, 57, 65, 70, 97, 102, 58, + 48, 57, 65, 70, 97, 102, 58, 48, + 57, 65, 70, 97, 102, 58, 48, 57, + 65, 70, 97, 102, 58, 58, 48, 57, + 65, 70, 97, 102, 58, 48, 57, 65, + 70, 97, 102, 58, 48, 57, 65, 70, + 97, 102, 58, 48, 57, 65, 70, 97, + 102, 58, 58, 48, 57, 65, 70, 97, + 102, 58, 48, 57, 65, 70, 97, 102, + 58, 48, 57, 65, 70, 97, 102, 58, + 48, 57, 65, 70, 97, 102, 58, 58, + 48, 57, 65, 70, 97, 102, 58, 48, + 57, 65, 70, 97, 102, 58, 48, 57, + 65, 70, 97, 102, 58, 48, 57, 65, + 70, 97, 102, 58, 58, 48, 57, 65, + 70, 97, 102, 58, 48, 57, 65, 70, + 97, 102, 58, 48, 57, 65, 70, 97, + 102, 58, 48, 57, 65, 70, 97, 102, + 58, 48, 49, 50, 58, 51, 57, 65, + 70, 97, 102, 46, 58, 48, 57, 65, + 70, 97, 102, 58, 48, 57, 65, 70, + 97, 102, 58, 48, 57, 65, 70, 97, + 102, 58, 48, 57, 65, 70, 97, 102, + 93, 48, 57, 65, 70, 97, 102, 93, + 48, 57, 65, 70, 97, 102, 93, 48, + 57, 65, 70, 97, 102, 46, 58, 48, + 57, 65, 70, 97, 102, 46, 58, 48, + 57, 65, 70, 97, 102, 46, 58, 48, + 57, 65, 70, 97, 102, 46, 53, 58, + 48, 52, 54, 57, 65, 70, 97, 102, + 46, 58, 48, 53, 54, 57, 65, 70, + 97, 102, 46, 58, 48, 57, 65, 70, + 97, 102, 46, 58, 48, 57, 65, 70, + 97, 102, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 58, 48, 57, 65, 70, + 97, 102, 48, 49, 50, 93, 51, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 49, 50, 51, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 49, 50, 51, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 49, 50, 51, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 49, 50, 51, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 57, 65, 70, 97, 102, 46, 58, 93, + 48, 57, 65, 70, 97, 102, 46, 58, + 93, 48, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 53, 58, 93, 48, 52, 54, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 53, 54, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 57, 65, 70, 97, + 102, 46, 58, 93, 48, 57, 65, 70, + 97, 102, 46, 58, 93, 48, 57, 65, + 70, 97, 102, 46, 58, 93, 48, 57, + 65, 70, 97, 102, 46, 53, 58, 93, + 48, 52, 54, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 53, 54, 57, 65, + 70, 97, 102, 46, 58, 93, 48, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 46, 58, 93, + 48, 57, 65, 70, 97, 102, 46, 58, + 93, 48, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 53, 58, 93, 48, 52, 54, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 53, 54, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 46, 58, 93, 48, 57, 65, 70, + 97, 102, 46, 58, 93, 48, 57, 65, + 70, 97, 102, 46, 58, 93, 48, 57, + 65, 70, 97, 102, 46, 53, 58, 93, + 48, 52, 54, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 53, 54, 57, 65, + 70, 97, 102, 46, 58, 93, 48, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 46, 58, 93, + 48, 57, 65, 70, 97, 102, 46, 58, + 93, 48, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 53, 58, 93, 48, 52, 54, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 53, 54, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, -32, -19, -16, -12, 34, + 92, -62, -33, -31, -17, -15, -13, 32, + 126, -128, -65, -96, -65, -128, -65, -128, + -97, -112, -65, -128, -65, -128, -113, 64, + 32, 126, -32, -19, -16, -12, 45, 46, + -62, -33, -31, -17, -15, -13, 48, 57, + 65, 90, 97, 122, 0 +}; + +static const signed char _address_single_lengths[] = { + 0, 8, 0, 8, 0, 0, 0, 0, + 0, 0, 8, 5, 0, 0, 0, 0, + 0, 0, 0, 5, 4, 5, 1, 2, + 0, 1, 3, 3, 1, 3, 1, 3, + 1, 1, 2, 1, 1, 1, 2, 1, + 1, 1, 2, 1, 3, 3, 4, 3, + 3, 3, 3, 2, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 4, 2, 1, 1, 1, 0, + 1, 1, 1, 2, 2, 2, 3, 2, + 2, 2, 1, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 0, 2, 2, 2, + 2, 0, 2, 2, 2, 2, 0, 2, + 2, 2, 2, 1, 4, 3, 2, 2, + 2, 3, 3, 2, 2, 2, 3, 3, + 2, 2, 2, 3, 3, 2, 2, 2, + 3, 3, 3, 3, 3, 4, 3, 3, + 3, 3, 3, 3, 4, 3, 3, 3, + 2, 3, 3, 3, 4, 3, 3, 3, + 2, 3, 3, 3, 4, 3, 3, 3, + 2, 3, 3, 3, 4, 3, 3, 3, + 2, 2, 6, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 6, 0, 0 +}; + +static const signed char _address_range_lengths[] = { + 0, 8, 1, 8, 1, 1, 1, 1, + 1, 1, 8, 6, 1, 1, 1, 1, + 1, 1, 1, 6, 6, 3, 3, 3, + 2, 0, 3, 1, 0, 1, 0, 1, + 1, 1, 2, 1, 1, 1, 2, 1, + 1, 1, 2, 1, 3, 3, 4, 4, + 3, 3, 3, 3, 8, 3, 3, 3, + 0, 3, 3, 3, 3, 0, 3, 3, + 3, 3, 0, 3, 3, 3, 3, 0, + 3, 3, 3, 3, 0, 3, 3, 3, + 3, 0, 3, 3, 3, 3, 0, 3, + 3, 3, 3, 3, 3, 3, 4, 4, + 3, 3, 3, 3, 3, 3, 0, 3, + 3, 3, 3, 0, 3, 3, 3, 3, + 0, 3, 3, 3, 3, 0, 3, 3, + 3, 3, 0, 3, 3, 3, 3, 3, + 0, 3, 3, 3, 3, 0, 3, 3, + 3, 3, 0, 3, 3, 3, 3, 0, + 3, 3, 3, 3, 3, 4, 4, 3, + 3, 3, 3, 3, 4, 4, 3, 3, + 3, 3, 3, 3, 4, 4, 3, 3, + 3, 3, 3, 3, 4, 4, 3, 3, + 3, 3, 3, 3, 4, 4, 3, 3, + 3, 0, 4, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 6, 0, 0 +}; + +static const short _address_index_offsets[] = { + 0, 0, 17, 19, 36, 38, 40, 42, + 44, 46, 48, 65, 77, 79, 81, 83, + 85, 87, 89, 91, 103, 114, 123, 128, + 134, 137, 139, 146, 151, 153, 158, 160, + 165, 168, 171, 176, 179, 182, 185, 190, + 193, 196, 199, 204, 207, 214, 221, 230, + 238, 245, 252, 259, 265, 275, 281, 286, + 291, 293, 298, 303, 308, 313, 315, 320, + 325, 330, 335, 337, 342, 347, 352, 357, + 359, 364, 369, 374, 379, 381, 386, 391, + 396, 401, 403, 411, 417, 422, 427, 429, + 433, 438, 443, 448, 454, 460, 466, 474, + 481, 487, 493, 498, 504, 510, 516, 519, + 523, 529, 535, 541, 544, 548, 554, 560, + 566, 569, 573, 579, 585, 591, 594, 598, + 604, 610, 616, 619, 624, 632, 639, 645, + 651, 654, 661, 668, 674, 680, 683, 690, + 697, 703, 709, 712, 719, 726, 732, 738, + 741, 748, 755, 762, 769, 776, 785, 793, + 800, 807, 814, 821, 828, 837, 845, 852, + 859, 865, 872, 879, 886, 895, 903, 910, + 917, 923, 930, 937, 944, 953, 961, 968, + 975, 981, 988, 995, 1002, 1011, 1019, 1026, + 1033, 1039, 1042, 1053, 1055, 1057, 1059, 1061, + 1063, 1065, 1067, 1069, 1071, 1084, 0 +}; + +static const short _address_cond_targs[] = { + 4, 6, 7, 9, 186, 3, 3, 3, + 2, 5, 8, 3, 3, 3, 3, 3, + 0, 3, 0, 4, 6, 7, 9, 3, + 10, 3, 11, 2, 5, 8, 3, 3, + 3, 3, 3, 0, 2, 0, 2, 0, + 2, 0, 5, 0, 5, 0, 5, 0, + 4, 6, 7, 9, 3, 3, 3, 3, + 2, 5, 8, 3, 3, 3, 3, 3, + 0, 13, 15, 16, 18, 21, 12, 14, + 17, 196, 196, 196, 0, 196, 0, 12, + 0, 12, 0, 12, 0, 14, 0, 14, + 0, 14, 0, 13, 15, 16, 18, 19, + 12, 14, 17, 196, 196, 196, 0, 13, + 15, 16, 18, 12, 14, 17, 196, 196, + 196, 0, 22, 26, 44, 46, 48, 45, + 23, 23, 0, 22, 23, 23, 23, 0, + 22, 24, 23, 23, 23, 0, 25, 25, + 0, 197, 0, 22, 27, 24, 23, 23, + 23, 0, 28, 40, 42, 41, 0, 29, + 0, 30, 36, 38, 37, 0, 31, 0, + 25, 32, 34, 33, 0, 197, 33, 0, + 197, 25, 0, 35, 197, 33, 25, 0, + 197, 25, 0, 31, 37, 0, 31, 30, + 0, 31, 39, 37, 30, 0, 31, 30, + 0, 29, 41, 0, 29, 28, 0, 29, + 43, 41, 28, 0, 29, 28, 0, 22, + 27, 24, 45, 23, 23, 0, 22, 27, + 24, 26, 23, 23, 0, 22, 27, 47, + 24, 45, 26, 23, 23, 0, 22, 27, + 24, 26, 23, 23, 23, 0, 22, 24, + 49, 23, 23, 23, 0, 22, 24, 50, + 23, 23, 23, 0, 22, 51, 24, 23, + 23, 23, 0, 22, 52, 23, 23, 23, + 0, 185, 25, 53, 25, 53, 25, 25, + 53, 25, 0, 57, 197, 54, 54, 54, + 0, 57, 55, 55, 55, 0, 57, 56, + 56, 56, 0, 57, 0, 124, 58, 58, + 58, 0, 62, 59, 59, 59, 0, 62, + 60, 60, 60, 0, 62, 61, 61, 61, + 0, 62, 0, 124, 63, 63, 63, 0, + 67, 64, 64, 64, 0, 67, 65, 65, + 65, 0, 67, 66, 66, 66, 0, 67, + 0, 124, 68, 68, 68, 0, 72, 69, + 69, 69, 0, 72, 70, 70, 70, 0, + 72, 71, 71, 71, 0, 72, 0, 124, + 73, 73, 73, 0, 77, 74, 74, 74, + 0, 77, 75, 75, 75, 0, 77, 76, + 76, 76, 0, 77, 0, 98, 78, 78, + 78, 0, 82, 79, 79, 79, 0, 82, + 80, 80, 80, 0, 82, 81, 81, 81, + 0, 82, 0, 83, 91, 94, 98, 97, + 123, 123, 0, 27, 87, 84, 84, 84, + 0, 87, 85, 85, 85, 0, 87, 86, + 86, 86, 0, 87, 0, 88, 88, 88, + 0, 197, 89, 89, 89, 0, 197, 90, + 90, 90, 0, 197, 25, 25, 25, 0, + 27, 87, 92, 84, 84, 0, 27, 87, + 93, 85, 85, 0, 27, 87, 86, 86, + 86, 0, 27, 95, 87, 92, 96, 84, + 84, 0, 27, 87, 93, 85, 85, 85, + 0, 27, 87, 85, 85, 85, 0, 27, + 87, 96, 84, 84, 0, 197, 99, 99, + 99, 0, 103, 197, 100, 100, 100, 0, + 103, 197, 101, 101, 101, 0, 103, 197, + 102, 102, 102, 0, 103, 197, 0, 104, + 104, 104, 0, 108, 197, 105, 105, 105, + 0, 108, 197, 106, 106, 106, 0, 108, + 197, 107, 107, 107, 0, 108, 197, 0, + 109, 109, 109, 0, 113, 197, 110, 110, + 110, 0, 113, 197, 111, 111, 111, 0, + 113, 197, 112, 112, 112, 0, 113, 197, + 0, 114, 114, 114, 0, 118, 197, 115, + 115, 115, 0, 118, 197, 116, 116, 116, + 0, 118, 197, 117, 117, 117, 0, 118, + 197, 0, 119, 119, 119, 0, 87, 197, + 120, 120, 120, 0, 87, 197, 121, 121, + 121, 0, 87, 197, 122, 122, 122, 0, + 87, 197, 0, 87, 84, 84, 84, 0, + 125, 177, 180, 197, 183, 184, 184, 0, + 27, 129, 197, 126, 126, 126, 0, 129, + 197, 127, 127, 127, 0, 129, 197, 128, + 128, 128, 0, 129, 197, 0, 130, 169, + 172, 175, 176, 176, 0, 27, 134, 197, + 131, 131, 131, 0, 134, 197, 132, 132, + 132, 0, 134, 197, 133, 133, 133, 0, + 134, 197, 0, 135, 161, 164, 167, 168, + 168, 0, 27, 139, 197, 136, 136, 136, + 0, 139, 197, 137, 137, 137, 0, 139, + 197, 138, 138, 138, 0, 139, 197, 0, + 140, 153, 156, 159, 160, 160, 0, 27, + 144, 197, 141, 141, 141, 0, 144, 197, + 142, 142, 142, 0, 144, 197, 143, 143, + 143, 0, 144, 197, 0, 145, 146, 149, + 152, 119, 119, 0, 27, 87, 197, 120, + 120, 120, 0, 27, 87, 197, 147, 120, + 120, 0, 27, 87, 197, 148, 121, 121, + 0, 27, 87, 197, 122, 122, 122, 0, + 27, 150, 87, 197, 147, 151, 120, 120, + 0, 27, 87, 197, 148, 121, 121, 121, + 0, 27, 87, 197, 121, 121, 121, 0, + 27, 87, 197, 151, 120, 120, 0, 27, + 144, 197, 154, 141, 141, 0, 27, 144, + 197, 155, 142, 142, 0, 27, 144, 197, + 143, 143, 143, 0, 27, 157, 144, 197, + 154, 158, 141, 141, 0, 27, 144, 197, + 155, 142, 142, 142, 0, 27, 144, 197, + 142, 142, 142, 0, 27, 144, 197, 158, + 141, 141, 0, 144, 197, 141, 141, 141, + 0, 27, 139, 197, 162, 136, 136, 0, + 27, 139, 197, 163, 137, 137, 0, 27, + 139, 197, 138, 138, 138, 0, 27, 165, + 139, 197, 162, 166, 136, 136, 0, 27, + 139, 197, 163, 137, 137, 137, 0, 27, + 139, 197, 137, 137, 137, 0, 27, 139, + 197, 166, 136, 136, 0, 139, 197, 136, + 136, 136, 0, 27, 134, 197, 170, 131, + 131, 0, 27, 134, 197, 171, 132, 132, + 0, 27, 134, 197, 133, 133, 133, 0, + 27, 173, 134, 197, 170, 174, 131, 131, + 0, 27, 134, 197, 171, 132, 132, 132, + 0, 27, 134, 197, 132, 132, 132, 0, + 27, 134, 197, 174, 131, 131, 0, 134, + 197, 131, 131, 131, 0, 27, 129, 197, + 178, 126, 126, 0, 27, 129, 197, 179, + 127, 127, 0, 27, 129, 197, 128, 128, + 128, 0, 27, 181, 129, 197, 178, 182, + 126, 126, 0, 27, 129, 197, 179, 127, + 127, 127, 0, 27, 129, 197, 127, 127, + 127, 0, 27, 129, 197, 182, 126, 126, + 0, 129, 197, 126, 126, 126, 0, 124, + 197, 0, 188, 190, 191, 193, 194, 195, + 187, 189, 192, 186, 0, 186, 0, 187, + 0, 187, 0, 187, 0, 189, 0, 189, + 0, 189, 0, 11, 0, 186, 0, 13, + 15, 16, 18, 19, 20, 12, 14, 17, + 196, 196, 196, 0, 0, 0, 1, 2, + 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 0 +}; + +static const signed char _address_cond_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 3, 0, 3, + 0, 3, 0, 3, 0, 3, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 3, 1, 3, 0, + 3, 0, 3, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 3, 0, + 0, 0, 0, 0, 0, 0, 1, 1, + 1, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 3, 0, 0, + 3, 1, 3, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 3, 0, + 3, 0, 0, 0, 0, 3, 0, 3, + 0, 0, 0, 0, 3, 1, 0, 3, + 1, 0, 3, 0, 1, 0, 0, 3, + 1, 0, 3, 0, 0, 3, 0, 0, + 3, 0, 0, 0, 0, 3, 0, 0, + 3, 0, 0, 3, 0, 0, 3, 0, + 0, 0, 0, 3, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 3, 0, 3, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 3, 0, 0, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 3, 0, + 3, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 3, 0, 3, 0, + 0, 0, 0, 3, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 3, 0, 3, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 3, 0, 0, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 3, 0, 3, 0, 0, 0, + 3, 1, 0, 0, 0, 3, 1, 0, + 0, 0, 3, 1, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 3, 1, 0, 0, + 0, 3, 0, 1, 0, 0, 0, 3, + 0, 1, 0, 0, 0, 3, 0, 1, + 0, 0, 0, 3, 0, 1, 3, 0, + 0, 0, 3, 0, 1, 0, 0, 0, + 3, 0, 1, 0, 0, 0, 3, 0, + 1, 0, 0, 0, 3, 0, 1, 3, + 0, 0, 0, 3, 0, 1, 0, 0, + 0, 3, 0, 1, 0, 0, 0, 3, + 0, 1, 0, 0, 0, 3, 0, 1, + 3, 0, 0, 0, 3, 0, 1, 0, + 0, 0, 3, 0, 1, 0, 0, 0, + 3, 0, 1, 0, 0, 0, 3, 0, + 1, 3, 0, 0, 0, 3, 0, 1, + 0, 0, 0, 3, 0, 1, 0, 0, + 0, 3, 0, 1, 0, 0, 0, 3, + 0, 1, 3, 0, 0, 0, 0, 3, + 0, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 1, 0, 0, 0, 3, 0, + 1, 0, 0, 0, 3, 0, 1, 0, + 0, 0, 3, 0, 1, 3, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 1, + 0, 0, 0, 3, 0, 1, 0, 0, + 0, 3, 0, 1, 0, 0, 0, 3, + 0, 1, 3, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 1, 0, 0, 0, + 3, 0, 1, 0, 0, 0, 3, 0, + 1, 0, 0, 0, 3, 0, 1, 3, + 0, 0, 0, 0, 0, 0, 3, 0, + 0, 1, 0, 0, 0, 3, 0, 1, + 0, 0, 0, 3, 0, 1, 0, 0, + 0, 3, 0, 1, 3, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 1, 0, 0, + 0, 3, 0, 0, 1, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 0, 1, 0, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 1, 0, 0, 0, 3, 0, + 0, 1, 0, 0, 0, 3, 0, 0, + 1, 0, 0, 0, 3, 0, 0, 1, + 0, 0, 0, 3, 0, 0, 0, 1, + 0, 0, 0, 0, 3, 0, 0, 1, + 0, 0, 0, 0, 3, 0, 0, 1, + 0, 0, 0, 3, 0, 0, 1, 0, + 0, 0, 3, 0, 1, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 1, 0, 0, 0, 3, 0, + 0, 1, 0, 0, 0, 3, 0, 0, + 0, 1, 0, 0, 0, 0, 3, 0, + 0, 1, 0, 0, 0, 0, 3, 0, + 0, 1, 0, 0, 0, 3, 0, 0, + 1, 0, 0, 0, 3, 0, 1, 0, + 0, 0, 3, 0, 0, 1, 0, 0, + 0, 3, 0, 0, 1, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 0, 1, 0, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 1, 0, 0, 0, 3, 0, + 1, 0, 0, 0, 3, 0, 0, 1, + 0, 0, 0, 3, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 1, 0, 0, + 0, 3, 0, 0, 0, 1, 0, 0, + 0, 0, 3, 0, 0, 1, 0, 0, + 0, 0, 3, 0, 0, 1, 0, 0, + 0, 3, 0, 0, 1, 0, 0, 0, + 3, 0, 1, 0, 0, 0, 3, 0, + 1, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 3, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 3, 3, 0, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 0, 0 +}; + +static const short _address_eof_trans[] = { + 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, + 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, + 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, + 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, + 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, + 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, + 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, + 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, + 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, + 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, + 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, + 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, + 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, + 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, + 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, + 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, + 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, + 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, + 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, + 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, + 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, + 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, + 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, + 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, + 1278, 1279, 1280, 1281, 1282, 1283, 0 +}; + +static const int address_start = 1; +static const int address_first_final = 196; +static const int address_error = 0; + +static const int address_en_main = 1; + + +#line 112 "smtp-address-validator.rl" + + +bool is_address(const char* p, const char* pe) +{ + int cs = 0; + + const char* eof = pe; + + bool result = false; + + +#line 675 "smtp-address-validator.cpp" + { + cs = (int)address_start; + } + +#line 124 "smtp-address-validator.rl" + + +#line 680 "smtp-address-validator.cpp" + { + int _klen; + unsigned int _trans = 0; + const char * _keys; + const signed char * _acts; + unsigned int _nacts; + _resume: {} + if ( p == pe && p != eof ) + goto _out; + if ( p == eof ) { + if ( _address_eof_trans[cs] > 0 ) { + _trans = (unsigned int)_address_eof_trans[cs] - 1; + } + } + else { + _keys = ( _address_trans_keys + (_address_key_offsets[cs])); + _trans = (unsigned int)_address_index_offsets[cs]; + + _klen = (int)_address_single_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_upper = _keys + _klen - 1; + const char *_mid; + while ( 1 ) { + if ( _upper < _lower ) { + _keys += _klen; + _trans += (unsigned int)_klen; + break; + } + + _mid = _lower + ((_upper-_lower) >> 1); + if ( ( (*( p))) < (*( _mid)) ) + _upper = _mid - 1; + else if ( ( (*( p))) > (*( _mid)) ) + _lower = _mid + 1; + else { + _trans += (unsigned int)(_mid - _keys); + goto _match; + } + } + } + + _klen = (int)_address_range_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_upper = _keys + (_klen<<1) - 2; + const char *_mid; + while ( 1 ) { + if ( _upper < _lower ) { + _trans += (unsigned int)_klen; + break; + } + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( ( (*( p))) < (*( _mid)) ) + _upper = _mid - 2; + else if ( ( (*( p))) > (*( _mid + 1)) ) + _lower = _mid + 2; + else { + _trans += (unsigned int)((_mid - _keys)>>1); + break; + } + } + } + + _match: {} + } + cs = (int)_address_cond_targs[_trans]; + + if ( _address_cond_actions[_trans] != 0 ) { + + _acts = ( _address_actions + (_address_cond_actions[_trans])); + _nacts = (unsigned int)(*( _acts)); + _acts += 1; + while ( _nacts > 0 ) { + switch ( (*( _acts)) ) + { + case 0: { + { +#line 108 "smtp-address-validator.rl" + result = true; } + +#line 762 "smtp-address-validator.cpp" + + break; + } + case 1: { + { +#line 108 "smtp-address-validator.rl" + result = false; } + +#line 770 "smtp-address-validator.cpp" + + break; + } + } + _nacts -= 1; + _acts += 1; + } + + } + + if ( p == eof ) { + if ( cs >= 196 ) + goto _out; + } + else { + if ( cs != 0 ) { + p += 1; + goto _resume; + } + } + _out: {} + } + +#line 125 "smtp-address-validator.rl" + + + return result; +} diff --git a/src/smtp-address-validator.hpp b/src/smtp-address-validator.hpp new file mode 100644 index 0000000..5552c3e --- /dev/null +++ b/src/smtp-address-validator.hpp @@ -0,0 +1,34 @@ +#ifndef SMTP_ADDRESS_PARSER_HPP_INCLUDED +#define SMTP_ADDRESS_PARSER_HPP_INCLUDED + +/* + +Snarfed from + +: + +Copyright (c) 2021 Gene Hightower + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +bool is_address(const char* p, const char* pe); + +#endif // SMTP_ADDRESS_PARSER_HPP_INCLUDED diff --git a/src/string-format-check.cpp b/src/string-format-check.cpp index cd908f0..ce69396 100644 --- a/src/string-format-check.cpp +++ b/src/string-format-check.cpp @@ -1,5 +1,7 @@ #include +#include + #include #include #include @@ -180,91 +182,15 @@ const std::string uuid{R"([0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a- // from http://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address const std::string hostname{R"(^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$)"}; -/** - * @see https://tools.ietf.org/html/rfc5322#section-4.1 - * - * @verbatim - * atom = [CFWS] 1*atext [CFWS] - * word = atom / quoted-string - * phrase = 1*word / obs-phrase - * obs-FWS = 1*WSP *(CRLF 1*WSP) - * FWS = ([*WSP CRLF] 1*WSP) / obs-FWS - * ; Folding white space - * ctext = %d33-39 / ; Printable US-ASCII - * %d42-91 / ; characters not including - * %d93-126 / ; "(", ")", or "\" - * obs-ctext - * ccontent = ctext / quoted-pair / comment - * comment = "(" *([FWS] ccontent) [FWS] ")" - * CFWS = (1*([FWS] comment) [FWS]) / FWS - * obs-local-part = word *("." word) - * obs-domain = atom *("." atom) - * obs-dtext = obs-NO-WS-CTL / quoted-pair - * quoted-pair = ("\" (VCHAR / WSP)) / obs-qp - * obs-NO-WS-CTL = %d1-8 / ; US-ASCII control - * %d11 / ; characters that do not - * %d12 / ; include the carriage - * %d14-31 / ; return, line feed, and - * %d127 ; white space characters - * obs-ctext = obs-NO-WS-CTL - * obs-qtext = obs-NO-WS-CTL - * obs-utext = %d0 / obs-NO-WS-CTL / VCHAR - * obs-qp = "\" (%d0 / obs-NO-WS-CTL / LF / CR) - * obs-body = *((*LF *CR *((%d0 / text) *LF *CR)) / CRLF) - * obs-unstruct = *((*LF *CR *(obs-utext *LF *CR)) / FWS) - * obs-phrase = word *(word / "." / CFWS) - * obs-phrase-list = [phrase / CFWS] *("," [phrase / CFWS]) - * qtext = %d33 / ; Printable US-ASCII - * %d35-91 / ; characters not including - * %d93-126 / ; "\" or the quote character - * obs-qtext - * qcontent = qtext / quoted-pair - * quoted-string = [CFWS] - * DQUOTE *([FWS] qcontent) [FWS] DQUOTE - * [CFWS] - * atext = ALPHA / DIGIT / ; Printable US-ASCII - * "!" / "#" / ; characters not including - * "$" / "%" / ; specials. Used for atoms. - * "&" / "'" / - * "*" / "+" / - * "-" / "/" / - * "=" / "?" / - * "^" / "_" / - * "`" / "{" / - * "|" / "}" / - * "~" - * dot-atom-text = 1*atext *("." 1*atext) - * dot-atom = [CFWS] dot-atom-text [CFWS] - * addr-spec = local-part "@" domain - * local-part = dot-atom / quoted-string / obs-local-part - * domain = dot-atom / domain-literal / obs-domain - * domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS] - * dtext = %d33-90 / ; Printable US-ASCII - * %d94-126 / ; characters not including - * obs-dtext ; "[", "]", or "\" - * @endverbatim - * @todo Currently don't have a working tool for this larger ABNF to generate a regex. - * Other options: - * - https://github.com/ldthomas/apg-6.3 - * - https://github.com/akr/abnf - * - * The problematic thing are the allowed whitespaces (even newlines) in the email. - * Ignoring those and starting with - * @see https://stackoverflow.com/questions/13992403/regex-validation-of-email-addresses-according-to-rfc5321-rfc5322 - * and trying to divide up the complicated regex into understandable ABNF definitions from rfc5322 yields: - */ -const std::string obsnowsctl{R"([\x01-\x08\x0b\x0c\x0e-\x1f\x7f])"}; -const std::string obsqp{R"(\\[\x01-\x09\x0b\x0c\x0e-\x7f])"}; -const std::string qtext{R"((?:[\x21\x23-\x5b\x5d-\x7e]|)" + obsnowsctl + ")"}; -const std::string dtext{R"([\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f])"}; -const std::string quotedString{R"("(?:)" + qtext + "|" + obsqp + R"()*")"}; -const std::string atext{R"([A-Za-z0-9!#$%&'*+/=?^_`{|}~-])"}; -const std::string domainLiteral{R"(\[(?:(?:)" + decOctet + R"()\.){3}(?:)" + decOctet + R"(|[A-Za-z0-9-]*[A-Za-z0-9]:(?:)" + dtext + "|" + obsqp + R"()+)\])"}; - -const std::string dotAtom{"(?:" + atext + R"(+(?:\.)" + atext + "+)*)"}; -const std::string stackoverflowMagicPart{R"((?:[[:alnum:]](?:[[:alnum:]-]*[[:alnum:]])?\.)+)" - R"([[:alnum:]](?:[[:alnum:]-]*[[:alnum:]])?)"}; -const std::string email{"(?:" + dotAtom + "|" + quotedString + ")@(?:" + stackoverflowMagicPart + "|" + domainLiteral + ")"}; +bool is_ascii(std::string const& value) +{ + for (auto ch : value) { + if (ch & 0x80) { + return false; + } + } + return true; +} /** * @see @@ -425,9 +351,15 @@ void default_string_format_check(const std::string &format, const std::string &v } else if (format == "uri") { rfc3986_uri_check(value); } else if (format == "email") { - static const std::regex emailRegex{email}; - if (!std::regex_match(value, emailRegex)) { - throw std::invalid_argument(value + " is not a valid email according to RFC 5322."); + if (!is_ascii(value)) { + throw std::invalid_argument(value + " contains non-ASCII values, not RFC 5321 compliant."); + } + if (!is_address(&*value.begin(), &*value.end())) { + throw std::invalid_argument(value + " is not a valid email according to RFC 5321."); + } + } else if (format == "idn-email") { + if (!is_address(&*value.begin(), &*value.end())) { + throw std::invalid_argument(value + " is not a valid idn-email according to RFC 6531."); } } else if (format == "hostname") { static const std::regex hostRegex{hostname}; diff --git a/test/JSON-Schema-Test-Suite/CMakeLists.txt b/test/JSON-Schema-Test-Suite/CMakeLists.txt index 1a240c6..3d93b55 100644 --- a/test/JSON-Schema-Test-Suite/CMakeLists.txt +++ b/test/JSON-Schema-Test-Suite/CMakeLists.txt @@ -54,7 +54,6 @@ if(JSON_SCHEMA_TEST_SUITE_PATH) JSON-Suite::Optional::float-overflow JSON-Suite::Optional::ecmascript-regex - JSON-Suite::Optional::Format::idn-email JSON-Suite::Optional::Format::idn-hostname JSON-Suite::Optional::Format::iri-reference JSON-Suite::Optional::Format::iri From 96a42559387e5cb3f30ef755d7bef22f2e2ce8f3 Mon Sep 17 00:00:00 2001 From: Patrick Boettcher Date: Sat, 26 Nov 2022 17:56:17 +0100 Subject: [PATCH 08/18] bump to 2.2.0 (some minor changes/addtions to API) --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9379b1b..afe6627 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,7 @@ endif() project(nlohmann_json_schema_validator LANGUAGES CXX) -set(PROJECT_VERSION 2.1.1) +set(PROJECT_VERSION 2.2.0) if(JSON_VALIDATOR_HUNTER) hunter_add_package(nlohmann_json) From 6b17782d6a5d1dee5d2c4fc5d25ffb1123913431 Mon Sep 17 00:00:00 2001 From: Patrick Boettcher Date: Sat, 26 Nov 2022 18:05:52 +0100 Subject: [PATCH 09/18] update to SOVERSION to 2 (as it should have been done 3 years ago) fix #186 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index afe6627..f636734 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,7 @@ target_compile_features(nlohmann_json_schema_validator set_target_properties(nlohmann_json_schema_validator PROPERTIES VERSION ${PROJECT_VERSION} - SOVERSION 1) + SOVERSION 2) # disable tests and examples if project is not super project if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) From f156a7fc7b95ef64a598f74cb829a89c3449c157 Mon Sep 17 00:00:00 2001 From: Christophe Blaess Date: Mon, 28 Nov 2022 07:17:57 +0100 Subject: [PATCH 10/18] Remove obsolete sentence in `README.md`. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b9dd8d9..1e930bf 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ This is a C++ library for validating JSON documents based on a [draft-7 of JSON Schema Validation](http://json-schema.org/schema). First a disclaimer: *It is work in progress and -contributions or hints or discussions are welcome.* Even though a 2.0.0 release is imminent. +contributions or hints or discussions are welcome.* Niels Lohmann et al develop a great JSON parser for C++ called [JSON for Modern C++](https://github.com/nlohmann/json). This validator is based on this From dfcb0152e952932f7c263b346411c5dfabbd57e1 Mon Sep 17 00:00:00 2001 From: Gareth Sylvester-Bradley <31761158+garethsb@users.noreply.github.com> Date: Mon, 28 Nov 2022 09:49:56 +0000 Subject: [PATCH 11/18] Local include for smtp-address-validator.hpp --- src/string-format-check.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/string-format-check.cpp b/src/string-format-check.cpp index ce69396..bd8952f 100644 --- a/src/string-format-check.cpp +++ b/src/string-format-check.cpp @@ -1,6 +1,6 @@ #include -#include +#include "smtp-address-validator.hpp" #include #include From 491ac44026e08f31790f5cacffa62e168bb35e32 Mon Sep 17 00:00:00 2001 From: Robert Joslyn Date: Wed, 30 Nov 2022 13:07:29 -0800 Subject: [PATCH 12/18] Fix assumed signed char The code assumes that char is signed, but whether char is signed or unsigned is implementation defined. On some architectures like PowerPC, GCC treats char as unsigned resulting in compile errors: smtp-address-validator.cpp:213:1: error: narrowing conversion of '-32' from 'int' to 'char' [-Wnarrowing] Fix this by specifying signed char. --- src/smtp-address-validator.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/smtp-address-validator.cpp b/src/smtp-address-validator.cpp index a63ead0..3903b51 100644 --- a/src/smtp-address-validator.cpp +++ b/src/smtp-address-validator.cpp @@ -63,7 +63,7 @@ static const short _address_key_offsets[] = { 1363, 1365, 1367, 1368, 1370, 1388, 0 }; -static const char _address_trans_keys[] = { +static const signed char _address_trans_keys[] = { -32, -19, -16, -12, 34, 45, 61, 63, -62, -33, -31, -17, -15, -13, 33, 39, 42, 43, 47, 57, 65, 90, 94, 126, @@ -711,7 +711,7 @@ bool is_address(const char* p, const char* pe) { int _klen; unsigned int _trans = 0; - const char * _keys; + const signed char * _keys; const signed char * _acts; unsigned int _nacts; _resume: {} @@ -728,9 +728,9 @@ bool is_address(const char* p, const char* pe) _klen = (int)_address_single_lengths[cs]; if ( _klen > 0 ) { - const char *_lower = _keys; - const char *_upper = _keys + _klen - 1; - const char *_mid; + const signed char *_lower = _keys; + const signed char *_upper = _keys + _klen - 1; + const signed char *_mid; while ( 1 ) { if ( _upper < _lower ) { _keys += _klen; @@ -752,9 +752,9 @@ bool is_address(const char* p, const char* pe) _klen = (int)_address_range_lengths[cs]; if ( _klen > 0 ) { - const char *_lower = _keys; - const char *_upper = _keys + (_klen<<1) - 2; - const char *_mid; + const signed char *_lower = _keys; + const signed char *_upper = _keys + (_klen<<1) - 2; + const signed char *_mid; while ( 1 ) { if ( _upper < _lower ) { _trans += (unsigned int)_klen; From 59c9d6200bf3cd54b4fc717ec1660c91eddb4d1a Mon Sep 17 00:00:00 2001 From: Sven Fink Date: Fri, 13 Jan 2023 09:15:42 +0100 Subject: [PATCH 13/18] For root value, use empty pointer --- src/json-validator.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/json-validator.cpp b/src/json-validator.cpp index 7f34553..3c73d98 100644 --- a/src/json-validator.cpp +++ b/src/json-validator.cpp @@ -553,6 +553,9 @@ class type_schema : public schema else_->validate(ptr, instance, patch, e); } } + if (instance.is_null()) { + patch.add(nlohmann::json::json_pointer{}, default_value_); + } } protected: @@ -1134,6 +1137,11 @@ public: propertyNames_ = schema::make(attr.value(), root, {"propertyNames"}, uris); sch.erase(attr); } + + attr = sch.find("default"); + if (attr != sch.end()) { + set_default_value(*attr); + } } }; From cae6fad80001510077a7f40e68477a31ec443add Mon Sep 17 00:00:00 2001 From: Sven Fink Date: Fri, 13 Jan 2023 09:16:17 +0100 Subject: [PATCH 14/18] Add test for issue 243 --- test/CMakeLists.txt | 4 +++ test/issue-243-root-default-values.cpp | 48 ++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 test/issue-243-root-default-values.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index fd1c309..9fa9c5b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -73,3 +73,7 @@ add_test(NAME issue-149-entry-selection COMMAND issue-149-entry-selection) add_executable(issue-189-default-values issue-189-default-values.cpp) target_link_libraries(issue-189-default-values nlohmann_json_schema_validator) add_test(NAME issue-189-default-values COMMAND issue-189-default-values) + +add_executable(issue-243-root-default-values issue-243-root-default-values.cpp) +target_link_libraries(issue-243-root-default-values nlohmann_json_schema_validator) +add_test(NAME issue-243-root-default-values COMMAND issue-243-root-default-values) diff --git a/test/issue-243-root-default-values.cpp b/test/issue-243-root-default-values.cpp new file mode 100644 index 0000000..34f0582 --- /dev/null +++ b/test/issue-243-root-default-values.cpp @@ -0,0 +1,48 @@ +#include +#include + +using nlohmann::json; +using nlohmann::json_uri; +using nlohmann::json_schema::json_validator; + +static const json root_default = R"( +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "width": { + "type": "integer" + } + }, + "default": { + "width": 42 + } +})"_json; + +int main(void) +{ + json_validator validator{}; + + validator.set_root_schema(root_default); + + { + json nul_json; + if (!nul_json.is_null()) { + return 1; + } + + const auto default_patch = validator.validate(nul_json); + + if (default_patch.is_null()) { + std::cerr << "Patch is null but should contain operation to add defaults to root" << std::endl; + return 1; + } + + const auto actual = nul_json.patch(default_patch); + const auto expected = R"({"width": 42})"_json; + if (actual != expected) { + std::cerr << "Patch of defaults is wrong for root schema: '" << actual.dump() << "' instead of expected '" << expected.dump() << "'" << std::endl; + } + } + + return 0; +} From 9360910c3d318bed0de074002132a4f93577f737 Mon Sep 17 00:00:00 2001 From: Cristian Le Date: Wed, 10 May 2023 19:49:27 +0200 Subject: [PATCH 15/18] Reconfigure CI (#259) * Add basic presets * Add basic pre-commit * Reconfigure github action - Enforce pre-commits - Move conan to CD workflow * Add simple instructions for pre-commit * Simplify action CIs * Add coverage CI Temporarily disabled until setup internally Signed-off-by: Cristian Le --- .github/workflows/github-actions.yml | 83 --------- .github/workflows/release.yaml | 31 ++++ .github/workflows/test.yaml | 109 ++++++++++++ .gitignore | 5 +- .pre-commit-config.yaml | 32 ++++ CMakePresets.json | 7 + README.md | 20 ++- cmake/CMakePresets-CI.json | 253 +++++++++++++++++++++++++++ cmake/CMakePresets-defaults.json | 50 ++++++ 9 files changed, 498 insertions(+), 92 deletions(-) delete mode 100644 .github/workflows/github-actions.yml create mode 100644 .github/workflows/release.yaml create mode 100644 .github/workflows/test.yaml create mode 100644 .pre-commit-config.yaml create mode 100644 CMakePresets.json create mode 100644 cmake/CMakePresets-CI.json create mode 100644 cmake/CMakePresets-defaults.json diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml deleted file mode 100644 index d5d5c42..0000000 --- a/.github/workflows/github-actions.yml +++ /dev/null @@ -1,83 +0,0 @@ -name: Ubuntu - -on: - push: - branches: - - develop - - master - - release/* - - main - pull_request: - -jobs: - build_and_test: - runs-on: ubuntu-latest - container: ghcr.io/nlohmann/json-ci:v2.4.0 - steps: - - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." - - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub." - - run: echo "🔎 Branch name is ${{ github.ref }} and repository is ${{ github.repository }}." - - name: Clone nlohmann json - uses: actions/checkout@master - with: - repository: nlohmann/json - path: nlohmann-json - ref: v3.11.2 - - name: Build and install nlohmann json - run: | - cd nlohmann-json - cmake -S . -B build - cmake --build build --target install -j$(nproc) - cd .. - - name: Clone json-schema-validator - uses: actions/checkout@v2 - - name: cmake - run: cmake -S . -B build - - name: build - run: cmake --build build --target all -j$(nproc) - - name: test - run: cd build && ctest - build_and_test_min_version: - runs-on: ubuntu-latest - container: ghcr.io/nlohmann/json-ci:v2.4.0 - steps: - - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." - - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub." - - run: echo "🔎 Branch name is ${{ github.ref }} and repository is ${{ github.repository }}." - - name: Clone nlohmann json - uses: actions/checkout@master - with: - repository: nlohmann/json - path: nlohmann-json - ref: v3.8.0 - - name: Build and install nlohmann json - run: | - cd nlohmann-json - cmake -S . -B build - cmake --build build --target install -j$(nproc) - cd .. - - name: Clone json-schema-validator - uses: actions/checkout@v2 - - name: cmake - run: cmake -S . -B build - - name: build - run: cmake --build build --target all -j$(nproc) - - name: test - run: cd build && ctest - build_conan: - runs-on: ubuntu-latest - container: ghcr.io/nlohmann/json-ci:v2.4.0 - steps: - - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." - - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub." - - run: echo "🔎 Branch name is ${{ github.ref }} and repository is ${{ github.repository }}." - - name: Clone json-schema-validator - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - with: - python-version: '3.10' - - run: python -m pip install --upgrade conan - - run: conan config init - - run: conan profile update settings.compiler.libcxx=libstdc++11 default - - name: conan create package - run: conan create . diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..8897a61 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,31 @@ +name: release +run-name: Release + +on: + push: + tags: + - "v[0-9]+.[0-9]+.[0-9]+" + - "v[0-9]+.[0-9]+.[0-9]+-rc[0-9]+" + +jobs: + tests: + uses: ./.github/workflows/test.yaml + secrets: inherit + + build_conan: + runs-on: ubuntu-latest + container: ghcr.io/nlohmann/json-ci:v2.4.0 + steps: + - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." + - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub." + - run: echo "🔎 Branch name is ${{ github.ref }} and repository is ${{ github.repository }}." + - name: Clone json-schema-validator + uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: '3.10' + - run: python -m pip install --upgrade conan + - run: conan config init + - run: conan profile update settings.compiler.libcxx=libstdc++11 default + - name: conan create package + run: conan create . diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 0000000..0093b92 --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,109 @@ +name: test +run-name: Tests + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + # Make it able to be used in other workflows + workflow_call: + +defaults: + run: + shell: bash + +jobs: + pre-commit: + name: Check pre-commit + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + - uses: pre-commit/action@v3.0.0 + + test: + name: Run ctests + needs: [ pre-commit ] + continue-on-error: ${{ matrix.experimental }} + strategy: + fail-fast: false + matrix: + toolchain: [ gcc, llvm, intel ] + json_version: [ v3.11.2, v3.8.0 ] + experimental: [ false ] + include: + - toolchain: llvm + compiler_version: 15 + - toolchain: gcc + compiler_version: latest + env: + NLOHMANN_JSON_VERSION: ${{ matrix.json_version }} + runs-on: ubuntu-latest + container: ghcr.io/nlohmann/json-ci:v2.4.0 + steps: + - name: Activate Intel compilers + # Not elegant, it will propagate all environment variable. + # Intel does not provide a way to output the environment variables to a file + # Note: PATH needs to be exported to GITHUB_PATH otherwise it can be overwritten + run: | + source /opt/intel/oneapi/setvars.sh + printenv >> $GITHUB_ENV + echo $PATH >> $GITHUB_PATH + if: matrix.toolchain == 'intel' + - name: Setup gcc toolchain + run: | + update-alternatives --install /usr/bin/g++ g++ $(which g++-${{ matrix.compiler_version }}) 999 + if: matrix.compiler_version && matrix.toolchain == 'gcc' + - name: Setup llvm toolchain + run: | + update-alternatives --install /usr/bin/clang++ clang++ $(which clang++-${{ matrix.compiler_version }}) 999 + if: matrix.compiler_version && matrix.toolchain == 'llvm' + - name: Clone nlohmann json version ${{ matrix.json_version }} + uses: actions/checkout@v3 + with: + repository: nlohmann/json + path: nlohmann-json + ref: ${{ matrix.json_version }} + # TODO: Move to FetchContent managed + - name: Build and install nlohmann json + run: | + cd nlohmann-json + cmake -S . -B build + cmake --build build --target install -j$(nproc) + cd .. + - name: Clone json-schema-validator + uses: actions/checkout@v3 + # container version is < 3.25 which does not have workflows + - name: Get latest cmake version + uses: lukka/get-cmake@latest + - name: Run CMake ${{ matrix.toolchain }}-ci workflow with nlohmann/json version ${{ matrix.json_version }} + uses: lukka/run-cmake@v10.5 + with: + workflowPreset: "${{ matrix.toolchain }}-ci" + coverage: + name: Run coverage tests + needs: [ test ] + runs-on: ubuntu-latest + container: ghcr.io/nlohmann/json-ci:v2.4.0 + # TODO: Temporarily disabled because not implemented + if: ${{ false && (github.event_name == 'push' || github.event_name == 'pull_request') }} + steps: + - uses: actions/checkout@v3 + - name: Get latest cmake version + uses: lukka/get-cmake@latest + - name: Get test coverage + uses: lukka/run-cmake@v10.5 + with: + workflowPreset: ci-coverage + - name: Get lcov data + uses: danielealbano/lcov-action@v3 + with: + # Note lcov-action prepends and appends wild-cards *. Account for those + # https://github.com/danielealbano/lcov-action/issues/11 + remove_patterns: /test/,/cmake-build*/ + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v3 + with: + files: coverage.info + verbose: true diff --git a/.gitignore b/.gitignore index 6b334d3..aceaf81 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ build*/ *.sw? - +cmake-build-* +venv +env +compile_commands.json diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..2eaa1a1 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,32 @@ +repos: + - repo: https://github.com/Takishima/cmake-pre-commit-hooks + rev: v1.8.1 + hooks: + - id: clang-format + args: + - '-i' + - id: clang-tidy + args: + # TODO: Remove when upstream issue is fixed + # https://gitlab.kitware.com/cmake/cmake/-/issues/24827 + # https://github.com/Takishima/cmake-pre-commit-hooks/issues/63 + - '-Bcmake-build-pre-commit' + - '--preset' + - 'pre-commit' + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - repo: https://github.com/executablebooks/mdformat + rev: 0.7.16 + hooks: + - id: mdformat + additional_dependencies: + - mdformat-gfm + - mdformat-tables + - repo: https://github.com/python-jsonschema/check-jsonschema + rev: 0.23.0 + hooks: + - id: check-github-workflows diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..51696d4 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,7 @@ +{ + "version": 6, + "include": [ + "cmake/CMakePresets-defaults.json", + "cmake/CMakePresets-CI.json" + ] +} diff --git a/README.md b/README.md index 1e930bf..e9b80ed 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ - [![Build Status](https://travis-ci.org/pboettch/json-schema-validator.svg?branch=master)](https://travis-ci.org/pboettch/json-schema-validator) # JSON schema validator for JSON for Modern C++ @@ -23,7 +22,7 @@ is rather simple. Although significant changes have been done for the 2nd version (a complete rewrite) the API is compatible with the 1.0.0 release. Except for -the namespace which is now `nlohmann::json_schema. +the namespace which is now `nlohmann::json_schema`. Version **2** supports JSON schema draft 7, whereas 1 was supporting draft 4 only. Please update your schemas. @@ -101,6 +100,7 @@ By default a static library is built. Shared libraries can be generated by using the `BUILD_SHARED_LIBS`-cmake variable: In your initial call to cmake simply add: + ```bash cmake [..] -DBUILD_SHARED_LIBS=ON [..] ``` @@ -151,6 +151,7 @@ and ```CMake target_link_libraries( [..] nlohmann_json_schema_validator) ``` + to build and link. ## Code @@ -298,9 +299,10 @@ json_validator validator(loader, // or nullptr for no loader Supported formats: `date-time, date, time, email, hostname, ipv4, ipv6, uuid, regex` -More formats can be added in `src/string-format-check.cpp`. Please contribute implementions for missing json schema draft formats. +More formats can be added in `src/string-format-check.cpp`. Please contribute implementions for missing json schema draft formats. ## Default value processing + As a result of the validation, the library returns a json patch including the default values of the specified schema. ```C++ @@ -348,15 +350,17 @@ int main() return EXIT_SUCCESS; } ``` + The example above will output the specified default values `{"height":10,"width":20}` to stdout. + > Note that the default value specified in a `$ref` may be overridden by the current instance location. Also note that this behavior will break draft-7, but it is compliant to newer drafts (e.g. `2019-09` or `2020-12`). # Contributing -Before opening a pull request, please apply the coding style given in the -`.clang-format` by running clang-format from the git top-level for all touched -files: +This project uses [`pre-commit`](https://pre-commit.com/) to enforce style-checks. Please install and run it before +creating commits and making pull requests. -```shell -git diff master --name-only | grep '\.[ch]pp$' | xargs -P 3 -I{} clang-format -i {} +```console +$ pip install pre-commit +$ pre-commit install ``` diff --git a/cmake/CMakePresets-CI.json b/cmake/CMakePresets-CI.json new file mode 100644 index 0000000..4dae53c --- /dev/null +++ b/cmake/CMakePresets-CI.json @@ -0,0 +1,253 @@ +{ + "version": 6, + "include": [ + "CMakePresets-defaults.json" + ], + "configurePresets": [ + { + "name": "ci-base", + "hidden": true, + "generator": "Ninja", + "inherits": [ + "default" + ], + "cacheVariables": { + "JSON_VALIDATOR_BUILD_TESTS": { + "type": "BOOL", + "value": true + } + }, + "errors": { + "deprecated": true + } + }, + { + "name": "gcc-ci", + "displayName": "Configure preset for GCC toolchain", + "inherits": [ + "ci-base" + ], + "binaryDir": "cmake-build-release-gcc", + "cacheVariables": { + "CMAKE_CXX_COMPILER": { + "type": "FILEPATH", + "value": "g++" + }, + "CMAKE_LINKER": { + "type": "FILEPATH", + "value": "ld" + } + } + }, + { + "name": "intel-ci", + "displayName": "Configure preset for Intel toolchain", + "inherits": [ + "ci-base" + ], + "binaryDir": "cmake-build-release-intel", + "cacheVariables": { + "CMAKE_CXX_COMPILER": { + "type": "FILEPATH", + "value": "icpx" + } + } + }, + { + "name": "llvm-ci", + "displayName": "Configure preset for LLVM toolchain", + "inherits": [ + "ci-base" + ], + "binaryDir": "cmake-build-release-llvm", + "cacheVariables": { + "CMAKE_CXX_COMPILER": { + "type": "FILEPATH", + "value": "clang++" + }, + "CMAKE_LINKER": { + "type": "FILEPATH", + "value": "lld" + } + } + }, + { + "name": "ci-coverage", + "displayName": "Configure preset for test coverage", + "inherits": [ + "gcc-ci" + ], + "binaryDir": "cmake-build-coverage", + "errors": { + "deprecated": false + } + }, + { + "name": "pre-commit", + "displayName": "Configure preset for pre-commit checks", + "inherits": [ + "default" + ], + "binaryDir": "cmake-build-pre-commit" + } + ], + "buildPresets": [ + { + "name": "ci-base", + "hidden": true, + "inherits": [ + "default" + ], + "cleanFirst": true + }, + { + "name": "ci-coverage", + "displayName": "Build preset for test coverage", + "inherits": [ + "ci-base" + ], + "configurePreset": "ci-coverage" + }, + { + "name": "gcc-ci", + "displayName": "Build preset for GCC toolchain", + "inherits": [ + "ci-base" + ], + "configurePreset": "gcc-ci" + }, + { + "name": "intel-ci", + "displayName": "Build preset for Intel toolchain", + "inherits": [ + "ci-base" + ], + "configurePreset": "intel-ci" + }, + { + "name": "llvm-ci", + "displayName": "Build preset for LLVM toolchain", + "inherits": [ + "ci-base" + ], + "configurePreset": "llvm-ci" + } + ], + "testPresets": [ + { + "name": "ci-base", + "hidden": true, + "inherits": [ + "default" + ], + "output": { + "outputOnFailure": true + } + }, + { + "name": "ci-coverage", + "inherits": [ + "default" + ], + "configurePreset": "ci-coverage" + }, + { + "name": "gcc-ci", + "displayName": "Test preset for GCC toolchain", + "inherits": [ + "ci-base" + ], + "configurePreset": "gcc-ci" + }, + { + "name": "intel-ci", + "displayName": "Test preset for Intel toolchain", + "inherits": [ + "ci-base" + ], + "configurePreset": "intel-ci" + }, + { + "name": "llvm-ci", + "displayName": "Test preset for LLVM toolchain", + "inherits": [ + "ci-base" + ], + "configurePreset": "llvm-ci" + } + ], + "workflowPresets": [ + { + "name": "gcc-ci", + "displayName": "CI test for GCC toolchain", + "steps": [ + { + "type": "configure", + "name": "gcc-ci" + }, + { + "type": "build", + "name": "gcc-ci" + }, + { + "type": "test", + "name": "gcc-ci" + } + ] + }, + { + "name": "intel-ci", + "displayName": "CI test for Intel toolchain", + "steps": [ + { + "type": "configure", + "name": "intel-ci" + }, + { + "type": "build", + "name": "intel-ci" + }, + { + "type": "test", + "name": "intel-ci" + } + ] + }, + { + "name": "llvm-ci", + "displayName": "CI test for LLVM toolchain", + "steps": [ + { + "type": "configure", + "name": "llvm-ci" + }, + { + "type": "build", + "name": "llvm-ci" + }, + { + "type": "test", + "name": "llvm-ci" + } + ] + }, + { + "name": "ci-coverage", + "displayName": "Coverage tests", + "steps": [ + { + "type": "configure", + "name": "ci-coverage" + }, + { + "type": "build", + "name": "ci-coverage" + }, + { + "type": "test", + "name": "ci-coverage" + } + ] + } + ] +} diff --git a/cmake/CMakePresets-defaults.json b/cmake/CMakePresets-defaults.json new file mode 100644 index 0000000..bfc642c --- /dev/null +++ b/cmake/CMakePresets-defaults.json @@ -0,0 +1,50 @@ +{ + "version": 6, + "configurePresets": [ + { + "name": "default", + "displayName": "Default configuration preset", + "binaryDir": "cmake-build-release", + "cacheVariables": { + "CMAKE_BUILD_TYPE": { + "type": "STRING", + "value": "Release" + } + } + } + ], + "buildPresets": [ + { + "name": "default", + "displayName": "Default build preset", + "configurePreset": "default" + } + ], + "testPresets": [ + { + "name": "default", + "displayName": "Default test preset", + "configurePreset": "default" + } + ], + "workflowPresets": [ + { + "name": "default", + "displayName": "Default workflow", + "steps": [ + { + "type": "configure", + "name": "default" + }, + { + "type": "build", + "name": "default" + }, + { + "type": "test", + "name": "default" + } + ] + } + ] +} From 0d60d48a586965b56d1f5c89a1e7a5cedbbdb8f2 Mon Sep 17 00:00:00 2001 From: Cristian Le Date: Thu, 11 May 2023 12:07:56 +0200 Subject: [PATCH 16/18] Modernize cmake script (#262) * Remove travis file * Apply pre-commit fixes * Modernize cmake file - Added JSON_VALIDATOR_SHARED_LIBS to properly handle shared-library - Bumped minimum cmake to 3.11 to use no-source add_library - Bumped minimum cmake to 3.14 to properly support FetchContent (FetchContent_MakeAvailable) - Converted Hunter package manager to FetchContent (It is plenty mature these days) - Added namespace to exported target - Made the cmake file compatible with FetchContent * Use simplified FetchContent CI * Add simple status messages * Handle nlohmann dependency Not an ideal approach, but required in order for the exported target to have appropriate linkage. Maybe this can be designed to become a PRIVATE link library, but then how does it ensure the target is installed? * Remove CMake-install test This will be moved to packaging integration tests * Enable code coverage * Reconfigure ci presets Signed-off-by: Cristian Le --- .clang-format | 13 +- .github/workflows/test.yaml | 19 +- .travis.yml | 78 - CMakeLists.txt | 311 ++-- cmake/CMakePresets-CI.json | 38 +- cmake/HunterGate.cmake | 539 ------- ...hmann_json_schema_validatorConfig.cmake.in | 0 example/CMakeLists.txt | 14 + {app => example}/format.cpp | 0 {app => example}/json-schema-validate.cpp | 0 {app => example}/readme.cpp | 0 src/CMakeLists.txt | 74 + src/smtp-address-validator.cpp | 1400 ++++++++--------- src/smtp-address-validator.hpp | 2 +- src/string-format-check.cpp | 2 +- .../tests/draft7/not.json | 2 +- .../tests/draft7/optional/format/uuid.json | 2 +- .../tests/draft7/ref.json | 4 +- test/binary-validation.cpp | 2 +- test/cmake-install/CMakeLists.txt | 15 - test/cmake-install/project/CMakeLists.txt | 34 - test/cmake-install/test.sh.in | 55 - test/errors.cpp | 2 +- test/id-ref.cpp | 2 +- test/issue-25-default-values.cpp | 6 +- test/issue-27/CMakeLists.txt | 2 - test/issue-70-root-schema-constructor.cpp | 2 +- test/issue-9/bar.json | 2 +- test/issue-9/foo/baz/qux/qux.json | 2 +- test/json-patch.cpp | 18 +- 30 files changed, 1030 insertions(+), 1610 deletions(-) delete mode 100644 .travis.yml delete mode 100644 cmake/HunterGate.cmake rename nlohmann_json_schema_validatorConfig.cmake.in => cmake/nlohmann_json_schema_validatorConfig.cmake.in (100%) create mode 100644 example/CMakeLists.txt rename {app => example}/format.cpp (100%) rename {app => example}/json-schema-validate.cpp (100%) rename {app => example}/readme.cpp (100%) create mode 100644 src/CMakeLists.txt delete mode 100644 test/cmake-install/CMakeLists.txt delete mode 100644 test/cmake-install/project/CMakeLists.txt delete mode 100755 test/cmake-install/test.sh.in diff --git a/.clang-format b/.clang-format index 715ac57..93126fb 100644 --- a/.clang-format +++ b/.clang-format @@ -1,17 +1,14 @@ ---- -BasedOnStyle: LLVM -AccessModifierOffset: -2 +BasedOnStyle: LLVM #AlignConsecutiveAssignments: true #AlignConsecutiveDeclarations: true AllowShortFunctionsOnASingleLine: Inline BreakBeforeBraces: Linux -ColumnLimit: 0 +ColumnLimit: 0 ConstructorInitializerAllOnOneLineOrOnePerLine: true -IndentWidth: 4 +IndentWidth: 4 IndentPPDirectives: AfterHash ObjCBlockIndentWidth: 0 SpaceAfterCStyleCast: true -TabWidth: 4 +TabWidth: 4 AccessModifierOffset: -4 -UseTab: ForIndentation -... +UseTab: ForIndentation diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 0093b92..6f0bf3c 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -59,21 +59,7 @@ jobs: run: | update-alternatives --install /usr/bin/clang++ clang++ $(which clang++-${{ matrix.compiler_version }}) 999 if: matrix.compiler_version && matrix.toolchain == 'llvm' - - name: Clone nlohmann json version ${{ matrix.json_version }} - uses: actions/checkout@v3 - with: - repository: nlohmann/json - path: nlohmann-json - ref: ${{ matrix.json_version }} - # TODO: Move to FetchContent managed - - name: Build and install nlohmann json - run: | - cd nlohmann-json - cmake -S . -B build - cmake --build build --target install -j$(nproc) - cd .. - - name: Clone json-schema-validator - uses: actions/checkout@v3 + - uses: actions/checkout@v3 # container version is < 3.25 which does not have workflows - name: Get latest cmake version uses: lukka/get-cmake@latest @@ -86,8 +72,7 @@ jobs: needs: [ test ] runs-on: ubuntu-latest container: ghcr.io/nlohmann/json-ci:v2.4.0 - # TODO: Temporarily disabled because not implemented - if: ${{ false && (github.event_name == 'push' || github.event_name == 'pull_request') }} + if: ${{ github.event_name == 'push' || github.event_name == 'pull_request' }} steps: - uses: actions/checkout@v3 - name: Get latest cmake version diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 520d9a0..0000000 --- a/.travis.yml +++ /dev/null @@ -1,78 +0,0 @@ -######################### -# project configuration # -######################### - -# C++ project -language: cpp - -dist: trusty -sudo: required -group: edge - -matrix: - include: - - os: linux - compiler: gcc - env: COMPILER=g++-4.9 - addons: - apt: - sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-4.9', 'ninja-build'] - - - os: linux - compiler: gcc - env: COMPILER=g++-5 - addons: - apt: - sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-5', 'ninja-build'] - - - os: linux - compiler: gcc - env: COMPILER=g++-6 - addons: - apt: - sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-6', 'ninja-build'] - - - os: linux - compiler: gcc - env: COMPILER=g++-7 - addons: - apt: - sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-7', 'ninja-build'] - -script: - # get CMake and Ninja (only for systems with brew - macOS) - - | - if [[ (-x $(which brew)) ]]; then - brew update - brew install cmake ninja - brew upgrade cmake - fi - # make sure CXX is correctly set - - if [[ "${COMPILER}" != "" ]]; then export CXX=${COMPILER}; fi - - # show OS/compiler version - - uname -a - - cmake --version - - $CXX --version - - # put json.hpp to nlohmann - - mkdir -p nlohmann && wget https://github.com/nlohmann/json/releases/download/v3.8.0/json.hpp -O nlohmann/json.hpp - - # compile and execute unit tests - - mkdir -p build && cd build - - cmake .. -Dnlohmann_json_DIR=.. ${CMAKE_OPTIONS} -GNinja && cmake --build . --config Release - - ctest -C Release -V -j - - cd .. - - # Remove previous build and tests - - rm -r build - - # Compile and execute with Hunter package manager instead of using local json.hpp - - mkdir -p build && cd build - - cmake .. -DHUNTER_ENABLED=ON ${CMAKE_OPTIONS} -GNinja && cmake --build . --config Release - - ctest -C Release -V -j - - cd .. \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index f636734..cfce8e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,157 +1,214 @@ -cmake_minimum_required(VERSION 3.2) +cmake_minimum_required(VERSION 3.14) +# CMake version compatibility +# TODO: Remove when bumping cmake >= 3.25 +if (POLICY CMP0140) + # Enables: return(PROPAGATE) + cmake_policy(SET CMP0140 NEW) +endif () -option(JSON_VALIDATOR_INSTALL "Install target" ON) -option(JSON_VALIDATOR_HUNTER "Enable Hunter package manager support" OFF) +#[==============================================================================================[ +# Basic project definition # +]==============================================================================================] -if(JSON_VALIDATOR_HUNTER) - include("cmake/HunterGate.cmake") - HunterGate( - URL "https://github.com/cpp-pm/hunter/archive/v0.23.262.tar.gz" - SHA1 "eb51e633e08cdbe2153caf255e9c23968fecb29d" - ) -endif() - -# the project +# TODO: Version 3, rename the project and namespace to something more compact project(nlohmann_json_schema_validator + VERSION 2.2.0 + DESCRIPTION "Json validator for nlohmann::json library" + HOMEPAGE_URL "https://github.com/pboettch/json-schema-validator" LANGUAGES CXX) +# TODO: Remove when bumping cmake >= 3.21 +if (NOT DEFINED nlohmann_json_schema_validator_IS_TOP_LEVEL) + if (CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) + set(PROJECT_IS_TOP_LEVEL ON) + else () + set(PROJECT_IS_TOP_LEVEL OFF) + endif () +endif () -set(PROJECT_VERSION 2.2.0) +#[==============================================================================================[ +# Options # +]==============================================================================================] -if(JSON_VALIDATOR_HUNTER) - hunter_add_package(nlohmann_json) -endif() +option(JSON_VALIDATOR_INSTALL "JsonValidator: Install targets" ${PROJECT_IS_TOP_LEVEL}) +option(JSON_VALIDATOR_BUILD_TESTS "JsonValidator: Build tests" ${PROJECT_IS_TOP_LEVEL}) +option(JSON_VALIDATOR_BUILD_EXAMPLES "JsonValidator: Build examples" ${PROJECT_IS_TOP_LEVEL}) +option(JSON_VALIDATOR_SHARED_LIBS "JsonValidator: Build as shared library" ${PROJECT_IS_TOP_LEVEL}) +option(JSON_VALIDATOR_TEST_COVERAGE "JsonValidator: Build with test coverage" OFF) +mark_as_advanced(JSON_VALIDATOR_TEST_COVERAGE) +# Get a default JSON_FETCH_VERSION from environment variables to workaround the CI +if (DEFINED ENV{NLOHMANN_JSON_VERSION}) + set(JSON_FETCH_VERSION_DEFAULT $ENV{NLOHMANN_JSON_VERSION}) +else () + set(JSON_FETCH_VERSION_DEFAULT v3.11.2) +endif () +set(JSON_FETCH_VERSION ${JSON_FETCH_VERSION_DEFAULT} CACHE STRING "Fetch nlohmann::json version") -# the library -add_library(nlohmann_json_schema_validator - src/smtp-address-validator.cpp - src/json-schema-draft7.json.cpp - src/json-uri.cpp - src/json-validator.cpp - src/json-patch.cpp - src/string-format-check.cpp) +#[==============================================================================================[ +# Project configuration # +]==============================================================================================] -target_include_directories(nlohmann_json_schema_validator - PUBLIC - $ - $) +# Include cmake modules +include(FetchContent) +if (JSON_VALIDATOR_INSTALL) + include(GNUInstallDirs) + include(CMakePackageConfigHelpers) +endif () -target_compile_features(nlohmann_json_schema_validator - PUBLIC - cxx_range_for) # for C++11 - flags +# Default to release build +if (NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) +endif () -set_target_properties(nlohmann_json_schema_validator - PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 2) +# Enable cmake's BUILD_SHARED_LIBS +set(BUILD_SHARED_LIBS ${nlohmann_json_schema_validator_SHARED_LIBS}) -# disable tests and examples if project is not super project -if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) - # I am top-level project. - set(JSON_VALIDATOR_IS_TOP_LEVEL ON) -endif() +if (JSON_VALIDATOR_TEST_COVERAGE) + if (CMAKE_CXX_COMPILER_ID STREQUAL Clang) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-instr-generate -fcoverage-mapping") + elseif (CMAKE_CXX_COMPILER_ID STREQUAL GNU) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage") + else () + message(WARNING + "JsonValidator: Other toolchain coverage flags unknown.\n" + "Using --coverage as default") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage") + endif () +endif () -option(JSON_VALIDATOR_BUILD_TESTS "Build tests" ${JSON_VALIDATOR_IS_TOP_LEVEL}) -option(JSON_VALIDATOR_BUILD_EXAMPLES "Build examples" ${JSON_VALIDATOR_IS_TOP_LEVEL}) +#[==============================================================================================[ +# External packages # +]==============================================================================================] -if(NOT TARGET nlohmann_json::nlohmann_json) - find_package(nlohmann_json REQUIRED) -endif() +set(fetch_packages "") +# Fetch/Find nlohmann_json +# TODO: Remove when bumping cmake >= 3.24 +if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.24) + FetchContent_Declare(nlohmann_json + GIT_REPOSITORY https://github.com/nlohmann/json + GIT_TAG ${JSON_FETCH_VERSION} + FIND_PACKAGE_ARGS + ) + list(APPEND fetch_packages nlohmann_json) +else () + # Try to get system installed version + find_package(nlohmann_json QUIET) + if (NOT nlohmann_json_FOUND) + # If failed fetch the desired version + FetchContent_Declare(nlohmann_json + GIT_REPOSITORY https://github.com/nlohmann/json + GIT_TAG ${JSON_FETCH_VERSION} + ) + list(APPEND fetch_packages nlohmann_json) + endif () +endif () -target_link_libraries( - nlohmann_json_schema_validator - PUBLIC nlohmann_json::nlohmann_json) +# Handle configure flags +if (JSON_VALIDATOR_INSTALL) + # TODO: This is not ideal, this package should not be installing nlohmann::json + # Currently required in order to satisfy cmake exporter + set(JSON_Install ON CACHE BOOL "") +endif () -if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR - "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") - target_compile_options(nlohmann_json_schema_validator - PRIVATE - -Wall -Wextra -Wshadow) -endif() +# Get all dependencies +FetchContent_MakeAvailable(${fetch_packages}) +if (JSON_VALIDATOR_INSTALL AND NOT nlohmann_json_FOUND AND JSON_Install) + # TODO: This is not ideal + message(WARNING + "JsonValidator: No nlohmann::json found on the system and nlohmann_json_schema_validator will be installed\n" + "This will also install nlohmann::json in its typical installation path\n" + "This is not ideal because it might overwrite system installed") +endif () -if(BUILD_SHARED_LIBS) - target_compile_definitions(nlohmann_json_schema_validator - PRIVATE - -DJSON_SCHEMA_VALIDATOR_EXPORTS) -endif() +#[==============================================================================================[ +# Main definition # +]==============================================================================================] -# regex with boost if gcc < 4.9 - default is std::regex -if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9.0") - find_package(Boost COMPONENTS regex) - if(NOT Boost_FOUND) - message(STATUS "GCC less then 4.9 and boost-regex NOT found - no regex used") - target_compile_definitions(nlohmann_json_schema_validator PRIVATE -DJSON_SCHEMA_NO_REGEX) - else() - message(STATUS "GCC less then 4.9 and boost-regex FOUND - using boost::regex") - target_compile_definitions(nlohmann_json_schema_validator PRIVATE -DJSON_SCHEMA_BOOST_REGEX) - target_include_directories(nlohmann_json_schema_validator PRIVATE ${Boost_INCLUDE_DIRS}) - target_link_libraries(nlohmann_json_schema_validator PRIVATE ${Boost_LIBRARIES}) - endif() - endif() -endif() +message(STATUS "JsonValidator: Configured for ${CMAKE_BUILD_TYPE}") +if (DEFINED nlohmann_json_VERSION) + message(STATUS "JsonValidator: Using nlohmann/json version: ${nlohmann_json_VERSION}") +else () + message(STATUS "JsonValidator: nlohmann_json_VERSION is not set. Possible value: ${JSON_FETCH_VERSION}") +endif () -if(JSON_VALIDATOR_INSTALL) - install(TARGETS nlohmann_json_schema_validator - EXPORT ${PROJECT_NAME}Targets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin) +## Main targets +add_library(nlohmann_json_schema_validator) +add_library(nlohmann_json_schema_validator::validator ALIAS nlohmann_json_schema_validator) +set_target_properties(nlohmann_json_schema_validator PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + EXPORT_NAME validator + OUTPUT_NAME nlohmann_json_validator + ) - install(FILES src/nlohmann/json-schema.hpp - DESTINATION include/nlohmann) -endif() +# Main definitions in here +add_subdirectory(src) -if (JSON_VALIDATOR_BUILD_EXAMPLES) - # simple nlohmann_json_schema_validator-executable - add_executable(json-schema-validate app/json-schema-validate.cpp) - target_link_libraries(json-schema-validate nlohmann_json_schema_validator) - - add_executable(readme-json-schema app/readme.cpp) - target_link_libraries(readme-json-schema nlohmann_json_schema_validator) - - add_executable(format-json-schema app/format.cpp) - target_link_libraries(format-json-schema nlohmann_json_schema_validator) - - install(TARGETS json-schema-validate readme-json-schema - DESTINATION bin) -endif() +# Enable examples +# Enable testings if (JSON_VALIDATOR_BUILD_TESTS) - # test-zone enable_testing() add_subdirectory(test) -endif() +endif () -# Set Up the Project Targets and Config Files for CMake +if (JSON_VALIDATOR_BUILD_EXAMPLES) + add_subdirectory(example) +endif () -if(JSON_VALIDATOR_INSTALL) - # Set the install path to the cmake config files (Relative, so install works correctly under Hunter as well) - set(INSTALL_CMAKE_DIR "lib/cmake/${PROJECT_NAME}") - set(INSTALL_CMAKEDIR_ROOT share/cmake) - # Install Targets - install(EXPORT ${PROJECT_NAME}Targets - FILE ${PROJECT_NAME}Targets.cmake - DESTINATION "${INSTALL_CMAKE_DIR}") +#[==============================================================================================[ +# Install or Export # +]==============================================================================================] - include(CMakePackageConfigHelpers) - write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake - VERSION ${PROJECT_VERSION} - COMPATIBILITY SameMajorVersion - ) +if (JSON_VALIDATOR_INSTALL) + # Note other install targets found in subdirectories + # Here mostly the cmake boilerplate are set + write_basic_package_version_file(nlohmann_json_schema_validatorConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion + ) + configure_package_config_file(cmake/nlohmann_json_schema_validatorConfig.cmake.in + nlohmann_json_schema_validatorConfig.cmake + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/nlohmann_json_schema_validator + ) - configure_package_config_file( - ${PROJECT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake - INSTALL_DESTINATION ${INSTALL_CMAKEDIR_ROOT}/${PROJECT_NAME} - ) + # Install Targets files + export(EXPORT nlohmann_json_schema_validatorTargets + NAMESPACE nlohmann_json_schema_validator:: + FILE nlohmann_json_schema_validatorTargets.cmake + ) + install(EXPORT nlohmann_json_schema_validatorTargets + FILE nlohmann_json_schema_validatorTargets.cmake + NAMESPACE nlohmann_json_schema_validator:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/nlohmann_json_schema_validator + COMPONENT nlohmann_json_schema_validator_Development + ) + # Install cmake export files + install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/nlohmann_json_schema_validatorConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/nlohmann_json_schema_validatorConfigVersion.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/nlohmann_json_schema_validator + COMPONENT nlohmann_json_schema_validator_Development + ) +endif () - install( - FILES - ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake - ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake - DESTINATION - ${INSTALL_CMAKE_DIR} - ) -endif() +# Handle the project being included externally (e.g. FetchContent) +if (NOT PROJECT_IS_TOP_LEVEL) + # Export variables set in nlohmann_json_schema_validatorConfig.cmake + # TODO: Remove when bumping cmake >= 3.25 + if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.25) + return(PROPAGATE + nlohmann_json_schema_validator_VERSION + nlohmann_json_schema_validator_VERSION_MAJOR + nlohmann_json_schema_validator_VERSION_MINOR + nlohmann_json_schema_validator_VERSION_PATCH + nlohmann_json_schema_validator_VERSION_TWEAK + ) + else () + set(nlohmann_json_schema_validator_VERSION ${nlohmann_json_schema_validator_VERSION} PARENT_SCOPE) + set(nlohmann_json_schema_validator_VERSION_MAJOR ${nlohmann_json_schema_validator_VERSION_MAJOR} PARENT_SCOPE) + set(nlohmann_json_schema_validator_VERSION_MINOR ${nlohmann_json_schema_validator_VERSION_MINOR} PARENT_SCOPE) + set(nlohmann_json_schema_validator_VERSION_PATCH ${nlohmann_json_schema_validator_VERSION_PATCH} PARENT_SCOPE) + set(nlohmann_json_schema_validator_VERSION_TWEAK ${nlohmann_json_schema_validator_VERSION_TWEAK} PARENT_SCOPE) + endif () +endif () diff --git a/cmake/CMakePresets-CI.json b/cmake/CMakePresets-CI.json index 4dae53c..8173d22 100644 --- a/cmake/CMakePresets-CI.json +++ b/cmake/CMakePresets-CI.json @@ -12,9 +12,21 @@ "default" ], "cacheVariables": { + "CMAKE_BUILD_TYPE": { + "type": "STRING", + "value": "Debug" + }, "JSON_VALIDATOR_BUILD_TESTS": { "type": "BOOL", "value": true + }, + "JSON_VALIDATOR_INSTALL": { + "type": "BOOL", + "value": false + }, + "JSON_BuildTests": { + "type": "BOOL", + "value": false } }, "errors": { @@ -27,7 +39,7 @@ "inherits": [ "ci-base" ], - "binaryDir": "cmake-build-release-gcc", + "binaryDir": "cmake-build-ci-gcc", "cacheVariables": { "CMAKE_CXX_COMPILER": { "type": "FILEPATH", @@ -45,7 +57,7 @@ "inherits": [ "ci-base" ], - "binaryDir": "cmake-build-release-intel", + "binaryDir": "cmake-build-ci-intel", "cacheVariables": { "CMAKE_CXX_COMPILER": { "type": "FILEPATH", @@ -59,7 +71,7 @@ "inherits": [ "ci-base" ], - "binaryDir": "cmake-build-release-llvm", + "binaryDir": "cmake-build-ci-llvm", "cacheVariables": { "CMAKE_CXX_COMPILER": { "type": "FILEPATH", @@ -77,9 +89,15 @@ "inherits": [ "gcc-ci" ], - "binaryDir": "cmake-build-coverage", + "binaryDir": "cmake-build-ci-coverage", "errors": { "deprecated": false + }, + "cacheVariables": { + "JSON_VALIDATOR_TEST_COVERAGE": { + "type": "BOOL", + "value": true + } } }, { @@ -88,7 +106,17 @@ "inherits": [ "default" ], - "binaryDir": "cmake-build-pre-commit" + "binaryDir": "cmake-build-pre-commit", + "cacheVariables": { + "JSON_VALIDATOR_TEST_COVERAGE": { + "type": "BOOL", + "value": true + }, + "JSON_VALIDATOR_INSTALL": { + "type": "BOOL", + "value": false + } + } } ], "buildPresets": [ diff --git a/cmake/HunterGate.cmake b/cmake/HunterGate.cmake deleted file mode 100644 index 6d9cc24..0000000 --- a/cmake/HunterGate.cmake +++ /dev/null @@ -1,539 +0,0 @@ -# Copyright (c) 2013-2019, Ruslan Baratov -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# This is a gate file to Hunter package manager. -# Include this file using `include` command and add package you need, example: -# -# cmake_minimum_required(VERSION 3.2) -# -# include("cmake/HunterGate.cmake") -# HunterGate( -# URL "https://github.com/path/to/hunter/archive.tar.gz" -# SHA1 "798501e983f14b28b10cda16afa4de69eee1da1d" -# ) -# -# project(MyProject) -# -# hunter_add_package(Foo) -# hunter_add_package(Boo COMPONENTS Bar Baz) -# -# Projects: -# * https://github.com/hunter-packages/gate/ -# * https://github.com/ruslo/hunter - -option(HUNTER_ENABLED "Enable Hunter package manager support" ON) - -if(HUNTER_ENABLED) - if(CMAKE_VERSION VERSION_LESS "3.2") - message( - FATAL_ERROR - "At least CMake version 3.2 required for Hunter dependency management." - " Update CMake or set HUNTER_ENABLED to OFF." - ) - endif() -endif() - -include(CMakeParseArguments) # cmake_parse_arguments - -option(HUNTER_STATUS_PRINT "Print working status" ON) -option(HUNTER_STATUS_DEBUG "Print a lot info" OFF) -option(HUNTER_TLS_VERIFY "Enable/disable TLS certificate checking on downloads" ON) - -set(HUNTER_ERROR_PAGE "https://docs.hunter.sh/en/latest/reference/errors") - -function(hunter_gate_status_print) - if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG) - foreach(print_message ${ARGV}) - message(STATUS "[hunter] ${print_message}") - endforeach() - endif() -endfunction() - -function(hunter_gate_status_debug) - if(HUNTER_STATUS_DEBUG) - foreach(print_message ${ARGV}) - string(TIMESTAMP timestamp) - message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}") - endforeach() - endif() -endfunction() - -function(hunter_gate_error_page error_page) - message("------------------------------ ERROR ------------------------------") - message(" ${HUNTER_ERROR_PAGE}/${error_page}.html") - message("-------------------------------------------------------------------") - message("") - message(FATAL_ERROR "") -endfunction() - -function(hunter_gate_internal_error) - message("") - foreach(print_message ${ARGV}) - message("[hunter ** INTERNAL **] ${print_message}") - endforeach() - message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") - message("") - hunter_gate_error_page("error.internal") -endfunction() - -function(hunter_gate_fatal_error) - cmake_parse_arguments(hunter "" "ERROR_PAGE" "" "${ARGV}") - if("${hunter_ERROR_PAGE}" STREQUAL "") - hunter_gate_internal_error("Expected ERROR_PAGE") - endif() - message("") - foreach(x ${hunter_UNPARSED_ARGUMENTS}) - message("[hunter ** FATAL ERROR **] ${x}") - endforeach() - message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") - message("") - hunter_gate_error_page("${hunter_ERROR_PAGE}") -endfunction() - -function(hunter_gate_user_error) - hunter_gate_fatal_error(${ARGV} ERROR_PAGE "error.incorrect.input.data") -endfunction() - -function(hunter_gate_self root version sha1 result) - string(COMPARE EQUAL "${root}" "" is_bad) - if(is_bad) - hunter_gate_internal_error("root is empty") - endif() - - string(COMPARE EQUAL "${version}" "" is_bad) - if(is_bad) - hunter_gate_internal_error("version is empty") - endif() - - string(COMPARE EQUAL "${sha1}" "" is_bad) - if(is_bad) - hunter_gate_internal_error("sha1 is empty") - endif() - - string(SUBSTRING "${sha1}" 0 7 archive_id) - - if(EXISTS "${root}/cmake/Hunter") - set(hunter_self "${root}") - else() - set( - hunter_self - "${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked" - ) - endif() - - set("${result}" "${hunter_self}" PARENT_SCOPE) -endfunction() - -# Set HUNTER_GATE_ROOT cmake variable to suitable value. -function(hunter_gate_detect_root) - # Check CMake variable - string(COMPARE NOTEQUAL "${HUNTER_ROOT}" "" not_empty) - if(not_empty) - set(HUNTER_GATE_ROOT "${HUNTER_ROOT}" PARENT_SCOPE) - hunter_gate_status_debug("HUNTER_ROOT detected by cmake variable") - return() - endif() - - # Check environment variable - string(COMPARE NOTEQUAL "$ENV{HUNTER_ROOT}" "" not_empty) - if(not_empty) - set(HUNTER_GATE_ROOT "$ENV{HUNTER_ROOT}" PARENT_SCOPE) - hunter_gate_status_debug("HUNTER_ROOT detected by environment variable") - return() - endif() - - # Check HOME environment variable - string(COMPARE NOTEQUAL "$ENV{HOME}" "" result) - if(result) - set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE) - hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable") - return() - endif() - - # Check SYSTEMDRIVE and USERPROFILE environment variable (windows only) - if(WIN32) - string(COMPARE NOTEQUAL "$ENV{SYSTEMDRIVE}" "" result) - if(result) - set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE) - hunter_gate_status_debug( - "HUNTER_ROOT set using SYSTEMDRIVE environment variable" - ) - return() - endif() - - string(COMPARE NOTEQUAL "$ENV{USERPROFILE}" "" result) - if(result) - set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE) - hunter_gate_status_debug( - "HUNTER_ROOT set using USERPROFILE environment variable" - ) - return() - endif() - endif() - - hunter_gate_fatal_error( - "Can't detect HUNTER_ROOT" - ERROR_PAGE "error.detect.hunter.root" - ) -endfunction() - -function(hunter_gate_download dir) - string( - COMPARE - NOTEQUAL - "$ENV{HUNTER_DISABLE_AUTOINSTALL}" - "" - disable_autoinstall - ) - if(disable_autoinstall AND NOT HUNTER_RUN_INSTALL) - hunter_gate_fatal_error( - "Hunter not found in '${dir}'" - "Set HUNTER_RUN_INSTALL=ON to auto-install it from '${HUNTER_GATE_URL}'" - "Settings:" - " HUNTER_ROOT: ${HUNTER_GATE_ROOT}" - " HUNTER_SHA1: ${HUNTER_GATE_SHA1}" - ERROR_PAGE "error.run.install" - ) - endif() - string(COMPARE EQUAL "${dir}" "" is_bad) - if(is_bad) - hunter_gate_internal_error("Empty 'dir' argument") - endif() - - string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" is_bad) - if(is_bad) - hunter_gate_internal_error("HUNTER_GATE_SHA1 empty") - endif() - - string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" is_bad) - if(is_bad) - hunter_gate_internal_error("HUNTER_GATE_URL empty") - endif() - - set(done_location "${dir}/DONE") - set(sha1_location "${dir}/SHA1") - - set(build_dir "${dir}/Build") - set(cmakelists "${dir}/CMakeLists.txt") - - hunter_gate_status_debug("Locking directory: ${dir}") - file(LOCK "${dir}" DIRECTORY GUARD FUNCTION) - hunter_gate_status_debug("Lock done") - - if(EXISTS "${done_location}") - # while waiting for lock other instance can do all the job - hunter_gate_status_debug("File '${done_location}' found, skip install") - return() - endif() - - file(REMOVE_RECURSE "${build_dir}") - file(REMOVE_RECURSE "${cmakelists}") - - file(MAKE_DIRECTORY "${build_dir}") # check directory permissions - - # Disabling languages speeds up a little bit, reduces noise in the output - # and avoids path too long windows error - file( - WRITE - "${cmakelists}" - "cmake_minimum_required(VERSION 3.2)\n" - "project(HunterDownload LANGUAGES NONE)\n" - "include(ExternalProject)\n" - "ExternalProject_Add(\n" - " Hunter\n" - " URL\n" - " \"${HUNTER_GATE_URL}\"\n" - " URL_HASH\n" - " SHA1=${HUNTER_GATE_SHA1}\n" - " DOWNLOAD_DIR\n" - " \"${dir}\"\n" - " TLS_VERIFY\n" - " ${HUNTER_TLS_VERIFY}\n" - " SOURCE_DIR\n" - " \"${dir}/Unpacked\"\n" - " CONFIGURE_COMMAND\n" - " \"\"\n" - " BUILD_COMMAND\n" - " \"\"\n" - " INSTALL_COMMAND\n" - " \"\"\n" - ")\n" - ) - - if(HUNTER_STATUS_DEBUG) - set(logging_params "") - else() - set(logging_params OUTPUT_QUIET) - endif() - - hunter_gate_status_debug("Run generate") - - # Need to add toolchain file too. - # Otherwise on Visual Studio + MDD this will fail with error: - # "Could not find an appropriate version of the Windows 10 SDK installed on this machine" - if(EXISTS "${CMAKE_TOOLCHAIN_FILE}") - get_filename_component(absolute_CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}" ABSOLUTE) - set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${absolute_CMAKE_TOOLCHAIN_FILE}") - else() - # 'toolchain_arg' can't be empty - set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=") - endif() - - string(COMPARE EQUAL "${CMAKE_MAKE_PROGRAM}" "" no_make) - if(no_make) - set(make_arg "") - else() - # Test case: remove Ninja from PATH but set it via CMAKE_MAKE_PROGRAM - set(make_arg "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}") - endif() - - execute_process( - COMMAND - "${CMAKE_COMMAND}" - "-H${dir}" - "-B${build_dir}" - "-G${CMAKE_GENERATOR}" - "${toolchain_arg}" - ${make_arg} - WORKING_DIRECTORY "${dir}" - RESULT_VARIABLE download_result - ${logging_params} - ) - - if(NOT download_result EQUAL 0) - hunter_gate_internal_error( - "Configure project failed." - "To reproduce the error run: ${CMAKE_COMMAND} -H${dir} -B${build_dir} -G${CMAKE_GENERATOR} ${toolchain_arg} ${make_arg}" - "In directory ${dir}" - ) - endif() - - hunter_gate_status_print( - "Initializing Hunter workspace (${HUNTER_GATE_SHA1})" - " ${HUNTER_GATE_URL}" - " -> ${dir}" - ) - execute_process( - COMMAND "${CMAKE_COMMAND}" --build "${build_dir}" - WORKING_DIRECTORY "${dir}" - RESULT_VARIABLE download_result - ${logging_params} - ) - - if(NOT download_result EQUAL 0) - hunter_gate_internal_error("Build project failed") - endif() - - file(REMOVE_RECURSE "${build_dir}") - file(REMOVE_RECURSE "${cmakelists}") - - file(WRITE "${sha1_location}" "${HUNTER_GATE_SHA1}") - file(WRITE "${done_location}" "DONE") - - hunter_gate_status_debug("Finished") -endfunction() - -# Must be a macro so master file 'cmake/Hunter' can -# apply all variables easily just by 'include' command -# (otherwise PARENT_SCOPE magic needed) -macro(HunterGate) - if(HUNTER_GATE_DONE) - # variable HUNTER_GATE_DONE set explicitly for external project - # (see `hunter_download`) - set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) - endif() - - # First HunterGate command will init Hunter, others will be ignored - get_property(_hunter_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET) - - if(NOT HUNTER_ENABLED) - # Empty function to avoid error "unknown function" - function(hunter_add_package) - endfunction() - - set( - _hunter_gate_disabled_mode_dir - "${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/disabled-mode" - ) - if(EXISTS "${_hunter_gate_disabled_mode_dir}") - hunter_gate_status_debug( - "Adding \"disabled-mode\" modules: ${_hunter_gate_disabled_mode_dir}" - ) - list(APPEND CMAKE_PREFIX_PATH "${_hunter_gate_disabled_mode_dir}") - endif() - elseif(_hunter_gate_done) - hunter_gate_status_debug("Secondary HunterGate (use old settings)") - hunter_gate_self( - "${HUNTER_CACHED_ROOT}" - "${HUNTER_VERSION}" - "${HUNTER_SHA1}" - _hunter_self - ) - include("${_hunter_self}/cmake/Hunter") - else() - set(HUNTER_GATE_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}") - - string(COMPARE NOTEQUAL "${PROJECT_NAME}" "" _have_project_name) - if(_have_project_name) - hunter_gate_fatal_error( - "Please set HunterGate *before* 'project' command. " - "Detected project: ${PROJECT_NAME}" - ERROR_PAGE "error.huntergate.before.project" - ) - endif() - - cmake_parse_arguments( - HUNTER_GATE "LOCAL" "URL;SHA1;GLOBAL;FILEPATH" "" ${ARGV} - ) - - string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" _empty_sha1) - string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" _empty_url) - string( - COMPARE - NOTEQUAL - "${HUNTER_GATE_UNPARSED_ARGUMENTS}" - "" - _have_unparsed - ) - string(COMPARE NOTEQUAL "${HUNTER_GATE_GLOBAL}" "" _have_global) - string(COMPARE NOTEQUAL "${HUNTER_GATE_FILEPATH}" "" _have_filepath) - - if(_have_unparsed) - hunter_gate_user_error( - "HunterGate unparsed arguments: ${HUNTER_GATE_UNPARSED_ARGUMENTS}" - ) - endif() - if(_empty_sha1) - hunter_gate_user_error("SHA1 suboption of HunterGate is mandatory") - endif() - if(_empty_url) - hunter_gate_user_error("URL suboption of HunterGate is mandatory") - endif() - if(_have_global) - if(HUNTER_GATE_LOCAL) - hunter_gate_user_error("Unexpected LOCAL (already has GLOBAL)") - endif() - if(_have_filepath) - hunter_gate_user_error("Unexpected FILEPATH (already has GLOBAL)") - endif() - endif() - if(HUNTER_GATE_LOCAL) - if(_have_global) - hunter_gate_user_error("Unexpected GLOBAL (already has LOCAL)") - endif() - if(_have_filepath) - hunter_gate_user_error("Unexpected FILEPATH (already has LOCAL)") - endif() - endif() - if(_have_filepath) - if(_have_global) - hunter_gate_user_error("Unexpected GLOBAL (already has FILEPATH)") - endif() - if(HUNTER_GATE_LOCAL) - hunter_gate_user_error("Unexpected LOCAL (already has FILEPATH)") - endif() - endif() - - hunter_gate_detect_root() # set HUNTER_GATE_ROOT - - # Beautify path, fix probable problems with windows path slashes - get_filename_component( - HUNTER_GATE_ROOT "${HUNTER_GATE_ROOT}" ABSOLUTE - ) - hunter_gate_status_debug("HUNTER_ROOT: ${HUNTER_GATE_ROOT}") - if(NOT HUNTER_ALLOW_SPACES_IN_PATH) - string(FIND "${HUNTER_GATE_ROOT}" " " _contain_spaces) - if(NOT _contain_spaces EQUAL -1) - hunter_gate_fatal_error( - "HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces." - "Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error" - "(Use at your own risk!)" - ERROR_PAGE "error.spaces.in.hunter.root" - ) - endif() - endif() - - string( - REGEX - MATCH - "[0-9]+\\.[0-9]+\\.[0-9]+[-_a-z0-9]*" - HUNTER_GATE_VERSION - "${HUNTER_GATE_URL}" - ) - string(COMPARE EQUAL "${HUNTER_GATE_VERSION}" "" _is_empty) - if(_is_empty) - set(HUNTER_GATE_VERSION "unknown") - endif() - - hunter_gate_self( - "${HUNTER_GATE_ROOT}" - "${HUNTER_GATE_VERSION}" - "${HUNTER_GATE_SHA1}" - _hunter_self - ) - - set(_master_location "${_hunter_self}/cmake/Hunter") - if(EXISTS "${HUNTER_GATE_ROOT}/cmake/Hunter") - # Hunter downloaded manually (e.g. by 'git clone') - set(_unused "xxxxxxxxxx") - set(HUNTER_GATE_SHA1 "${_unused}") - set(HUNTER_GATE_VERSION "${_unused}") - else() - get_filename_component(_archive_id_location "${_hunter_self}/.." ABSOLUTE) - set(_done_location "${_archive_id_location}/DONE") - set(_sha1_location "${_archive_id_location}/SHA1") - - # Check Hunter already downloaded by HunterGate - if(NOT EXISTS "${_done_location}") - hunter_gate_download("${_archive_id_location}") - endif() - - if(NOT EXISTS "${_done_location}") - hunter_gate_internal_error("hunter_gate_download failed") - endif() - - if(NOT EXISTS "${_sha1_location}") - hunter_gate_internal_error("${_sha1_location} not found") - endif() - file(READ "${_sha1_location}" _sha1_value) - string(COMPARE EQUAL "${_sha1_value}" "${HUNTER_GATE_SHA1}" _is_equal) - if(NOT _is_equal) - hunter_gate_internal_error( - "Short SHA1 collision:" - " ${_sha1_value} (from ${_sha1_location})" - " ${HUNTER_GATE_SHA1} (HunterGate)" - ) - endif() - if(NOT EXISTS "${_master_location}") - hunter_gate_user_error( - "Master file not found:" - " ${_master_location}" - "try to update Hunter/HunterGate" - ) - endif() - endif() - include("${_master_location}") - set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) - endif() -endmacro() diff --git a/nlohmann_json_schema_validatorConfig.cmake.in b/cmake/nlohmann_json_schema_validatorConfig.cmake.in similarity index 100% rename from nlohmann_json_schema_validatorConfig.cmake.in rename to cmake/nlohmann_json_schema_validatorConfig.cmake.in diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt new file mode 100644 index 0000000..039c40e --- /dev/null +++ b/example/CMakeLists.txt @@ -0,0 +1,14 @@ +# simple nlohmann_json_schema_validator-executable +add_executable(json-schema-validate json-schema-validate.cpp) +target_link_libraries(json-schema-validate nlohmann_json_schema_validator) + +add_executable(readme-json-schema readme.cpp) +target_link_libraries(readme-json-schema nlohmann_json_schema_validator) + +add_executable(format-json-schema format.cpp) +target_link_libraries(format-json-schema nlohmann_json_schema_validator) + +if (JSON_VALIDATOR_INSTALL) + install(TARGETS json-schema-validate readme-json-schema format-json-schema + DESTINATION ${CMAKE_INSTALL_BINDIR}) +endif () diff --git a/app/format.cpp b/example/format.cpp similarity index 100% rename from app/format.cpp rename to example/format.cpp diff --git a/app/json-schema-validate.cpp b/example/json-schema-validate.cpp similarity index 100% rename from app/json-schema-validate.cpp rename to example/json-schema-validate.cpp diff --git a/app/readme.cpp b/example/readme.cpp similarity index 100% rename from app/readme.cpp rename to example/readme.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..f895d66 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,74 @@ +target_sources(nlohmann_json_schema_validator PRIVATE + smtp-address-validator.cpp + json-schema-draft7.json.cpp + json-uri.cpp + json-validator.cpp + json-patch.cpp + string-format-check.cpp + ) +target_include_directories(nlohmann_json_schema_validator PUBLIC + $ + $ + ) + +set_target_properties(nlohmann_json_schema_validator PROPERTIES + PUBLIC_HEADER nlohmann/json-schema.hpp) + +# TODO: Why would this need to be if guarded? +if (JSON_VALIDATOR_SHARED_LIBS) + target_compile_definitions(nlohmann_json_schema_validator PRIVATE + -DJSON_SCHEMA_VALIDATOR_EXPORTS) +endif () + +# TODO: Consider setting minimum cxx standard instead +target_compile_features(nlohmann_json_schema_validator PUBLIC + cxx_range_for) # for C++11 - flags + +# TODO: This should be handled by the CI/presets, not the cmake +if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR + "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + target_compile_options(nlohmann_json_schema_validator + PRIVATE + -Wall -Wextra -Wshadow) +endif () + +# TODO: gcc support for <4.9 should be removed +# regex with boost if gcc < 4.9 - default is std::regex +if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9.0") + find_package(Boost COMPONENTS regex) + if (NOT Boost_FOUND) + message(STATUS "GCC less then 4.9 and boost-regex NOT found - no regex used") + target_compile_definitions(nlohmann_json_schema_validator PRIVATE -DJSON_SCHEMA_NO_REGEX) + else () + message(STATUS "GCC less then 4.9 and boost-regex FOUND - using boost::regex") + target_compile_definitions(nlohmann_json_schema_validator PRIVATE -DJSON_SCHEMA_BOOST_REGEX) + target_include_directories(nlohmann_json_schema_validator PRIVATE ${Boost_INCLUDE_DIRS}) + target_link_libraries(nlohmann_json_schema_validator PRIVATE ${Boost_LIBRARIES}) + endif () + endif () +endif () + +target_link_libraries(nlohmann_json_schema_validator PUBLIC + nlohmann_json::nlohmann_json) + +if (JSON_VALIDATOR_INSTALL) + # Normal installation target to system. When using scikit-build check python subdirectory + if (WIN32) + # TODO: Probably wrong, please fix + install(TARGETS nlohmann_json_schema_validator + EXPORT nlohmann_json_schema_validatorTargets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT nlohmann_json_schema_validator_Runtime + NAMELINK_COMPONENT nlohmann_json_schema_validator_Development + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT nlohmann_json_schema_validator_Development + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/nlohmann COMPONENT nlohmann_json_schema_validator_Development + RUNTIME DESTINATION ${CMAKE_INSTALL_RUNTIMEDIR} COMPONENT nlohmann_json_schema_validator_Runtime) + else () + install(TARGETS nlohmann_json_schema_validator + EXPORT nlohmann_json_schema_validatorTargets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT nlohmann_json_schema_validator_Runtime + NAMELINK_COMPONENT nlohmann_json_schema_validator_Development + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT nlohmann_json_schema_validator_Development + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/nlohmann COMPONENT nlohmann_json_schema_validator_Development) + endif () +endif () diff --git a/src/smtp-address-validator.cpp b/src/smtp-address-validator.cpp index 3903b51..805f300 100644 --- a/src/smtp-address-validator.cpp +++ b/src/smtp-address-validator.cpp @@ -36,649 +36,641 @@ static const signed char _address_actions[] = { 0, 1, 0, 1, 1, 0}; static const short _address_key_offsets[] = { - 0, 0, 24, 26, 50, 52, 54, 56, - 58, 60, 62, 86, 103, 105, 107, 109, - 111, 113, 115, 117, 134, 150, 161, 168, - 176, 180, 181, 190, 195, 196, 201, 202, - 207, 210, 213, 219, 222, 225, 228, 234, - 237, 240, 243, 249, 252, 261, 270, 282, - 293, 302, 311, 320, 328, 345, 353, 360, - 367, 368, 375, 382, 389, 396, 397, 404, - 411, 418, 425, 426, 433, 440, 447, 454, - 455, 462, 469, 476, 483, 484, 491, 498, - 505, 512, 513, 523, 531, 538, 545, 546, - 552, 559, 566, 573, 581, 589, 597, 608, - 618, 626, 634, 641, 649, 657, 665, 667, - 673, 681, 689, 697, 699, 705, 713, 721, - 729, 731, 737, 745, 753, 761, 763, 769, - 777, 785, 793, 795, 802, 812, 821, 829, - 837, 839, 848, 857, 865, 873, 875, 884, - 893, 901, 909, 911, 920, 929, 937, 945, - 947, 956, 965, 974, 983, 992, 1004, 1015, - 1024, 1033, 1042, 1051, 1060, 1072, 1083, 1092, - 1101, 1109, 1118, 1127, 1136, 1148, 1159, 1168, - 1177, 1185, 1194, 1203, 1212, 1224, 1235, 1244, - 1253, 1261, 1270, 1279, 1288, 1300, 1311, 1320, - 1329, 1337, 1339, 1353, 1355, 1357, 1359, 1361, - 1363, 1365, 1367, 1368, 1370, 1388, 0 -}; + 0, 0, 24, 26, 50, 52, 54, 56, + 58, 60, 62, 86, 103, 105, 107, 109, + 111, 113, 115, 117, 134, 150, 161, 168, + 176, 180, 181, 190, 195, 196, 201, 202, + 207, 210, 213, 219, 222, 225, 228, 234, + 237, 240, 243, 249, 252, 261, 270, 282, + 293, 302, 311, 320, 328, 345, 353, 360, + 367, 368, 375, 382, 389, 396, 397, 404, + 411, 418, 425, 426, 433, 440, 447, 454, + 455, 462, 469, 476, 483, 484, 491, 498, + 505, 512, 513, 523, 531, 538, 545, 546, + 552, 559, 566, 573, 581, 589, 597, 608, + 618, 626, 634, 641, 649, 657, 665, 667, + 673, 681, 689, 697, 699, 705, 713, 721, + 729, 731, 737, 745, 753, 761, 763, 769, + 777, 785, 793, 795, 802, 812, 821, 829, + 837, 839, 848, 857, 865, 873, 875, 884, + 893, 901, 909, 911, 920, 929, 937, 945, + 947, 956, 965, 974, 983, 992, 1004, 1015, + 1024, 1033, 1042, 1051, 1060, 1072, 1083, 1092, + 1101, 1109, 1118, 1127, 1136, 1148, 1159, 1168, + 1177, 1185, 1194, 1203, 1212, 1224, 1235, 1244, + 1253, 1261, 1270, 1279, 1288, 1300, 1311, 1320, + 1329, 1337, 1339, 1353, 1355, 1357, 1359, 1361, + 1363, 1365, 1367, 1368, 1370, 1388, 0}; static const signed char _address_trans_keys[] = { - -32, -19, -16, -12, 34, 45, 61, 63, - -62, -33, -31, -17, -15, -13, 33, 39, - 42, 43, 47, 57, 65, 90, 94, 126, - -128, -65, -32, -19, -16, -12, 33, 46, - 61, 64, -62, -33, -31, -17, -15, -13, - 35, 39, 42, 43, 45, 57, 63, 90, - 94, 126, -96, -65, -128, -65, -128, -97, - -112, -65, -128, -65, -128, -113, -32, -19, - -16, -12, 33, 45, 61, 63, -62, -33, - -31, -17, -15, -13, 35, 39, 42, 43, - 47, 57, 65, 90, 94, 126, -32, -19, - -16, -12, 91, -62, -33, -31, -17, -15, - -13, 48, 57, 65, 90, 97, 122, -128, - -65, -96, -65, -128, -65, -128, -97, -112, - -65, -128, -65, -128, -113, -32, -19, -16, - -12, 45, -62, -33, -31, -17, -15, -13, - 48, 57, 65, 90, 97, 122, -32, -19, - -16, -12, -62, -33, -31, -17, -15, -13, - 48, 57, 65, 90, 97, 122, 45, 48, - 49, 50, 73, 51, 57, 65, 90, 97, - 122, 45, 48, 57, 65, 90, 97, 122, - 45, 58, 48, 57, 65, 90, 97, 122, - 33, 90, 94, 126, 93, 45, 46, 58, - 48, 57, 65, 90, 97, 122, 48, 49, - 50, 51, 57, 46, 48, 49, 50, 51, - 57, 46, 48, 49, 50, 51, 57, 93, - 48, 57, 93, 48, 57, 53, 93, 48, - 52, 54, 57, 93, 48, 53, 46, 48, - 57, 46, 48, 57, 46, 53, 48, 52, - 54, 57, 46, 48, 53, 46, 48, 57, - 46, 48, 57, 46, 53, 48, 52, 54, - 57, 46, 48, 53, 45, 46, 58, 48, - 57, 65, 90, 97, 122, 45, 46, 58, - 48, 57, 65, 90, 97, 122, 45, 46, - 53, 58, 48, 52, 54, 57, 65, 90, - 97, 122, 45, 46, 58, 48, 53, 54, - 57, 65, 90, 97, 122, 45, 58, 80, - 48, 57, 65, 90, 97, 122, 45, 58, - 118, 48, 57, 65, 90, 97, 122, 45, - 54, 58, 48, 57, 65, 90, 97, 122, - 45, 58, 48, 57, 65, 90, 97, 122, - 58, 33, 47, 48, 57, 59, 64, 65, - 70, 71, 90, 94, 96, 97, 102, 103, - 126, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 48, 57, 65, 70, 97, 102, - 58, 48, 57, 65, 70, 97, 102, 58, - 58, 48, 57, 65, 70, 97, 102, 58, - 48, 57, 65, 70, 97, 102, 58, 48, - 57, 65, 70, 97, 102, 58, 48, 57, - 65, 70, 97, 102, 58, 58, 48, 57, - 65, 70, 97, 102, 58, 48, 57, 65, - 70, 97, 102, 58, 48, 57, 65, 70, - 97, 102, 58, 48, 57, 65, 70, 97, - 102, 58, 58, 48, 57, 65, 70, 97, - 102, 58, 48, 57, 65, 70, 97, 102, - 58, 48, 57, 65, 70, 97, 102, 58, - 48, 57, 65, 70, 97, 102, 58, 58, - 48, 57, 65, 70, 97, 102, 58, 48, - 57, 65, 70, 97, 102, 58, 48, 57, - 65, 70, 97, 102, 58, 48, 57, 65, - 70, 97, 102, 58, 58, 48, 57, 65, - 70, 97, 102, 58, 48, 57, 65, 70, - 97, 102, 58, 48, 57, 65, 70, 97, - 102, 58, 48, 57, 65, 70, 97, 102, - 58, 48, 49, 50, 58, 51, 57, 65, - 70, 97, 102, 46, 58, 48, 57, 65, - 70, 97, 102, 58, 48, 57, 65, 70, - 97, 102, 58, 48, 57, 65, 70, 97, - 102, 58, 48, 57, 65, 70, 97, 102, - 93, 48, 57, 65, 70, 97, 102, 93, - 48, 57, 65, 70, 97, 102, 93, 48, - 57, 65, 70, 97, 102, 46, 58, 48, - 57, 65, 70, 97, 102, 46, 58, 48, - 57, 65, 70, 97, 102, 46, 58, 48, - 57, 65, 70, 97, 102, 46, 53, 58, - 48, 52, 54, 57, 65, 70, 97, 102, - 46, 58, 48, 53, 54, 57, 65, 70, - 97, 102, 46, 58, 48, 57, 65, 70, - 97, 102, 46, 58, 48, 57, 65, 70, - 97, 102, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 58, 48, 57, 65, 70, - 97, 102, 48, 49, 50, 93, 51, 57, - 65, 70, 97, 102, 46, 58, 93, 48, - 57, 65, 70, 97, 102, 58, 93, 48, - 57, 65, 70, 97, 102, 58, 93, 48, - 57, 65, 70, 97, 102, 58, 93, 48, - 49, 50, 51, 57, 65, 70, 97, 102, - 46, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 49, 50, 51, 57, - 65, 70, 97, 102, 46, 58, 93, 48, - 57, 65, 70, 97, 102, 58, 93, 48, - 57, 65, 70, 97, 102, 58, 93, 48, - 57, 65, 70, 97, 102, 58, 93, 48, - 49, 50, 51, 57, 65, 70, 97, 102, - 46, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 49, 50, 51, 57, - 65, 70, 97, 102, 46, 58, 93, 48, - 57, 65, 70, 97, 102, 46, 58, 93, - 48, 57, 65, 70, 97, 102, 46, 58, - 93, 48, 57, 65, 70, 97, 102, 46, - 58, 93, 48, 57, 65, 70, 97, 102, - 46, 53, 58, 93, 48, 52, 54, 57, - 65, 70, 97, 102, 46, 58, 93, 48, - 53, 54, 57, 65, 70, 97, 102, 46, - 58, 93, 48, 57, 65, 70, 97, 102, - 46, 58, 93, 48, 57, 65, 70, 97, - 102, 46, 58, 93, 48, 57, 65, 70, - 97, 102, 46, 58, 93, 48, 57, 65, - 70, 97, 102, 46, 58, 93, 48, 57, - 65, 70, 97, 102, 46, 53, 58, 93, - 48, 52, 54, 57, 65, 70, 97, 102, - 46, 58, 93, 48, 53, 54, 57, 65, - 70, 97, 102, 46, 58, 93, 48, 57, - 65, 70, 97, 102, 46, 58, 93, 48, - 57, 65, 70, 97, 102, 58, 93, 48, - 57, 65, 70, 97, 102, 46, 58, 93, - 48, 57, 65, 70, 97, 102, 46, 58, - 93, 48, 57, 65, 70, 97, 102, 46, - 58, 93, 48, 57, 65, 70, 97, 102, - 46, 53, 58, 93, 48, 52, 54, 57, - 65, 70, 97, 102, 46, 58, 93, 48, - 53, 54, 57, 65, 70, 97, 102, 46, - 58, 93, 48, 57, 65, 70, 97, 102, - 46, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 46, 58, 93, 48, 57, 65, 70, - 97, 102, 46, 58, 93, 48, 57, 65, - 70, 97, 102, 46, 58, 93, 48, 57, - 65, 70, 97, 102, 46, 53, 58, 93, - 48, 52, 54, 57, 65, 70, 97, 102, - 46, 58, 93, 48, 53, 54, 57, 65, - 70, 97, 102, 46, 58, 93, 48, 57, - 65, 70, 97, 102, 46, 58, 93, 48, - 57, 65, 70, 97, 102, 58, 93, 48, - 57, 65, 70, 97, 102, 46, 58, 93, - 48, 57, 65, 70, 97, 102, 46, 58, - 93, 48, 57, 65, 70, 97, 102, 46, - 58, 93, 48, 57, 65, 70, 97, 102, - 46, 53, 58, 93, 48, 52, 54, 57, - 65, 70, 97, 102, 46, 58, 93, 48, - 53, 54, 57, 65, 70, 97, 102, 46, - 58, 93, 48, 57, 65, 70, 97, 102, - 46, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, 48, 57, 65, 70, 97, - 102, 58, 93, -32, -19, -16, -12, 34, - 92, -62, -33, -31, -17, -15, -13, 32, - 126, -128, -65, -96, -65, -128, -65, -128, - -97, -112, -65, -128, -65, -128, -113, 64, - 32, 126, -32, -19, -16, -12, 45, 46, - -62, -33, -31, -17, -15, -13, 48, 57, - 65, 90, 97, 122, 0 -}; + -32, -19, -16, -12, 34, 45, 61, 63, + -62, -33, -31, -17, -15, -13, 33, 39, + 42, 43, 47, 57, 65, 90, 94, 126, + -128, -65, -32, -19, -16, -12, 33, 46, + 61, 64, -62, -33, -31, -17, -15, -13, + 35, 39, 42, 43, 45, 57, 63, 90, + 94, 126, -96, -65, -128, -65, -128, -97, + -112, -65, -128, -65, -128, -113, -32, -19, + -16, -12, 33, 45, 61, 63, -62, -33, + -31, -17, -15, -13, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, -32, -19, + -16, -12, 91, -62, -33, -31, -17, -15, + -13, 48, 57, 65, 90, 97, 122, -128, + -65, -96, -65, -128, -65, -128, -97, -112, + -65, -128, -65, -128, -113, -32, -19, -16, + -12, 45, -62, -33, -31, -17, -15, -13, + 48, 57, 65, 90, 97, 122, -32, -19, + -16, -12, -62, -33, -31, -17, -15, -13, + 48, 57, 65, 90, 97, 122, 45, 48, + 49, 50, 73, 51, 57, 65, 90, 97, + 122, 45, 48, 57, 65, 90, 97, 122, + 45, 58, 48, 57, 65, 90, 97, 122, + 33, 90, 94, 126, 93, 45, 46, 58, + 48, 57, 65, 90, 97, 122, 48, 49, + 50, 51, 57, 46, 48, 49, 50, 51, + 57, 46, 48, 49, 50, 51, 57, 93, + 48, 57, 93, 48, 57, 53, 93, 48, + 52, 54, 57, 93, 48, 53, 46, 48, + 57, 46, 48, 57, 46, 53, 48, 52, + 54, 57, 46, 48, 53, 46, 48, 57, + 46, 48, 57, 46, 53, 48, 52, 54, + 57, 46, 48, 53, 45, 46, 58, 48, + 57, 65, 90, 97, 122, 45, 46, 58, + 48, 57, 65, 90, 97, 122, 45, 46, + 53, 58, 48, 52, 54, 57, 65, 90, + 97, 122, 45, 46, 58, 48, 53, 54, + 57, 65, 90, 97, 122, 45, 58, 80, + 48, 57, 65, 90, 97, 122, 45, 58, + 118, 48, 57, 65, 90, 97, 122, 45, + 54, 58, 48, 57, 65, 90, 97, 122, + 45, 58, 48, 57, 65, 90, 97, 122, + 58, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 48, 57, 65, 70, 97, 102, + 58, 48, 57, 65, 70, 97, 102, 58, + 58, 48, 57, 65, 70, 97, 102, 58, + 48, 57, 65, 70, 97, 102, 58, 48, + 57, 65, 70, 97, 102, 58, 48, 57, + 65, 70, 97, 102, 58, 58, 48, 57, + 65, 70, 97, 102, 58, 48, 57, 65, + 70, 97, 102, 58, 48, 57, 65, 70, + 97, 102, 58, 48, 57, 65, 70, 97, + 102, 58, 58, 48, 57, 65, 70, 97, + 102, 58, 48, 57, 65, 70, 97, 102, + 58, 48, 57, 65, 70, 97, 102, 58, + 48, 57, 65, 70, 97, 102, 58, 58, + 48, 57, 65, 70, 97, 102, 58, 48, + 57, 65, 70, 97, 102, 58, 48, 57, + 65, 70, 97, 102, 58, 48, 57, 65, + 70, 97, 102, 58, 58, 48, 57, 65, + 70, 97, 102, 58, 48, 57, 65, 70, + 97, 102, 58, 48, 57, 65, 70, 97, + 102, 58, 48, 57, 65, 70, 97, 102, + 58, 48, 49, 50, 58, 51, 57, 65, + 70, 97, 102, 46, 58, 48, 57, 65, + 70, 97, 102, 58, 48, 57, 65, 70, + 97, 102, 58, 48, 57, 65, 70, 97, + 102, 58, 48, 57, 65, 70, 97, 102, + 93, 48, 57, 65, 70, 97, 102, 93, + 48, 57, 65, 70, 97, 102, 93, 48, + 57, 65, 70, 97, 102, 46, 58, 48, + 57, 65, 70, 97, 102, 46, 58, 48, + 57, 65, 70, 97, 102, 46, 58, 48, + 57, 65, 70, 97, 102, 46, 53, 58, + 48, 52, 54, 57, 65, 70, 97, 102, + 46, 58, 48, 53, 54, 57, 65, 70, + 97, 102, 46, 58, 48, 57, 65, 70, + 97, 102, 46, 58, 48, 57, 65, 70, + 97, 102, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 58, 48, 57, 65, 70, + 97, 102, 48, 49, 50, 93, 51, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 49, 50, 51, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 49, 50, 51, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 49, 50, 51, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 49, 50, 51, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 57, 65, 70, 97, 102, 46, 58, 93, + 48, 57, 65, 70, 97, 102, 46, 58, + 93, 48, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 53, 58, 93, 48, 52, 54, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 53, 54, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 57, 65, 70, 97, + 102, 46, 58, 93, 48, 57, 65, 70, + 97, 102, 46, 58, 93, 48, 57, 65, + 70, 97, 102, 46, 58, 93, 48, 57, + 65, 70, 97, 102, 46, 53, 58, 93, + 48, 52, 54, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 53, 54, 57, 65, + 70, 97, 102, 46, 58, 93, 48, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 46, 58, 93, + 48, 57, 65, 70, 97, 102, 46, 58, + 93, 48, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 53, 58, 93, 48, 52, 54, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 53, 54, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 46, 58, 93, 48, 57, 65, 70, + 97, 102, 46, 58, 93, 48, 57, 65, + 70, 97, 102, 46, 58, 93, 48, 57, + 65, 70, 97, 102, 46, 53, 58, 93, + 48, 52, 54, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 53, 54, 57, 65, + 70, 97, 102, 46, 58, 93, 48, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 46, 58, 93, + 48, 57, 65, 70, 97, 102, 46, 58, + 93, 48, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 53, 58, 93, 48, 52, 54, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 53, 54, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, -32, -19, -16, -12, 34, + 92, -62, -33, -31, -17, -15, -13, 32, + 126, -128, -65, -96, -65, -128, -65, -128, + -97, -112, -65, -128, -65, -128, -113, 64, + 32, 126, -32, -19, -16, -12, 45, 46, + -62, -33, -31, -17, -15, -13, 48, 57, + 65, 90, 97, 122, 0}; static const signed char _address_single_lengths[] = { - 0, 8, 0, 8, 0, 0, 0, 0, - 0, 0, 8, 5, 0, 0, 0, 0, - 0, 0, 0, 5, 4, 5, 1, 2, - 0, 1, 3, 3, 1, 3, 1, 3, - 1, 1, 2, 1, 1, 1, 2, 1, - 1, 1, 2, 1, 3, 3, 4, 3, - 3, 3, 3, 2, 1, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 4, 2, 1, 1, 1, 0, - 1, 1, 1, 2, 2, 2, 3, 2, - 2, 2, 1, 2, 2, 2, 2, 0, - 2, 2, 2, 2, 0, 2, 2, 2, - 2, 0, 2, 2, 2, 2, 0, 2, - 2, 2, 2, 1, 4, 3, 2, 2, - 2, 3, 3, 2, 2, 2, 3, 3, - 2, 2, 2, 3, 3, 2, 2, 2, - 3, 3, 3, 3, 3, 4, 3, 3, - 3, 3, 3, 3, 4, 3, 3, 3, - 2, 3, 3, 3, 4, 3, 3, 3, - 2, 3, 3, 3, 4, 3, 3, 3, - 2, 3, 3, 3, 4, 3, 3, 3, - 2, 2, 6, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 6, 0, 0 -}; + 0, 8, 0, 8, 0, 0, 0, 0, + 0, 0, 8, 5, 0, 0, 0, 0, + 0, 0, 0, 5, 4, 5, 1, 2, + 0, 1, 3, 3, 1, 3, 1, 3, + 1, 1, 2, 1, 1, 1, 2, 1, + 1, 1, 2, 1, 3, 3, 4, 3, + 3, 3, 3, 2, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 4, 2, 1, 1, 1, 0, + 1, 1, 1, 2, 2, 2, 3, 2, + 2, 2, 1, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 0, 2, 2, 2, + 2, 0, 2, 2, 2, 2, 0, 2, + 2, 2, 2, 1, 4, 3, 2, 2, + 2, 3, 3, 2, 2, 2, 3, 3, + 2, 2, 2, 3, 3, 2, 2, 2, + 3, 3, 3, 3, 3, 4, 3, 3, + 3, 3, 3, 3, 4, 3, 3, 3, + 2, 3, 3, 3, 4, 3, 3, 3, + 2, 3, 3, 3, 4, 3, 3, 3, + 2, 3, 3, 3, 4, 3, 3, 3, + 2, 2, 6, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 6, 0, 0}; static const signed char _address_range_lengths[] = { - 0, 8, 1, 8, 1, 1, 1, 1, - 1, 1, 8, 6, 1, 1, 1, 1, - 1, 1, 1, 6, 6, 3, 3, 3, - 2, 0, 3, 1, 0, 1, 0, 1, - 1, 1, 2, 1, 1, 1, 2, 1, - 1, 1, 2, 1, 3, 3, 4, 4, - 3, 3, 3, 3, 8, 3, 3, 3, - 0, 3, 3, 3, 3, 0, 3, 3, - 3, 3, 0, 3, 3, 3, 3, 0, - 3, 3, 3, 3, 0, 3, 3, 3, - 3, 0, 3, 3, 3, 3, 0, 3, - 3, 3, 3, 3, 3, 3, 4, 4, - 3, 3, 3, 3, 3, 3, 0, 3, - 3, 3, 3, 0, 3, 3, 3, 3, - 0, 3, 3, 3, 3, 0, 3, 3, - 3, 3, 0, 3, 3, 3, 3, 3, - 0, 3, 3, 3, 3, 0, 3, 3, - 3, 3, 0, 3, 3, 3, 3, 0, - 3, 3, 3, 3, 3, 4, 4, 3, - 3, 3, 3, 3, 4, 4, 3, 3, - 3, 3, 3, 3, 4, 4, 3, 3, - 3, 3, 3, 3, 4, 4, 3, 3, - 3, 3, 3, 3, 4, 4, 3, 3, - 3, 0, 4, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 6, 0, 0 -}; + 0, 8, 1, 8, 1, 1, 1, 1, + 1, 1, 8, 6, 1, 1, 1, 1, + 1, 1, 1, 6, 6, 3, 3, 3, + 2, 0, 3, 1, 0, 1, 0, 1, + 1, 1, 2, 1, 1, 1, 2, 1, + 1, 1, 2, 1, 3, 3, 4, 4, + 3, 3, 3, 3, 8, 3, 3, 3, + 0, 3, 3, 3, 3, 0, 3, 3, + 3, 3, 0, 3, 3, 3, 3, 0, + 3, 3, 3, 3, 0, 3, 3, 3, + 3, 0, 3, 3, 3, 3, 0, 3, + 3, 3, 3, 3, 3, 3, 4, 4, + 3, 3, 3, 3, 3, 3, 0, 3, + 3, 3, 3, 0, 3, 3, 3, 3, + 0, 3, 3, 3, 3, 0, 3, 3, + 3, 3, 0, 3, 3, 3, 3, 3, + 0, 3, 3, 3, 3, 0, 3, 3, + 3, 3, 0, 3, 3, 3, 3, 0, + 3, 3, 3, 3, 3, 4, 4, 3, + 3, 3, 3, 3, 4, 4, 3, 3, + 3, 3, 3, 3, 4, 4, 3, 3, + 3, 3, 3, 3, 4, 4, 3, 3, + 3, 3, 3, 3, 4, 4, 3, 3, + 3, 0, 4, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 6, 0, 0}; static const short _address_index_offsets[] = { - 0, 0, 17, 19, 36, 38, 40, 42, - 44, 46, 48, 65, 77, 79, 81, 83, - 85, 87, 89, 91, 103, 114, 123, 128, - 134, 137, 139, 146, 151, 153, 158, 160, - 165, 168, 171, 176, 179, 182, 185, 190, - 193, 196, 199, 204, 207, 214, 221, 230, - 238, 245, 252, 259, 265, 275, 281, 286, - 291, 293, 298, 303, 308, 313, 315, 320, - 325, 330, 335, 337, 342, 347, 352, 357, - 359, 364, 369, 374, 379, 381, 386, 391, - 396, 401, 403, 411, 417, 422, 427, 429, - 433, 438, 443, 448, 454, 460, 466, 474, - 481, 487, 493, 498, 504, 510, 516, 519, - 523, 529, 535, 541, 544, 548, 554, 560, - 566, 569, 573, 579, 585, 591, 594, 598, - 604, 610, 616, 619, 624, 632, 639, 645, - 651, 654, 661, 668, 674, 680, 683, 690, - 697, 703, 709, 712, 719, 726, 732, 738, - 741, 748, 755, 762, 769, 776, 785, 793, - 800, 807, 814, 821, 828, 837, 845, 852, - 859, 865, 872, 879, 886, 895, 903, 910, - 917, 923, 930, 937, 944, 953, 961, 968, - 975, 981, 988, 995, 1002, 1011, 1019, 1026, - 1033, 1039, 1042, 1053, 1055, 1057, 1059, 1061, - 1063, 1065, 1067, 1069, 1071, 1084, 0 -}; + 0, 0, 17, 19, 36, 38, 40, 42, + 44, 46, 48, 65, 77, 79, 81, 83, + 85, 87, 89, 91, 103, 114, 123, 128, + 134, 137, 139, 146, 151, 153, 158, 160, + 165, 168, 171, 176, 179, 182, 185, 190, + 193, 196, 199, 204, 207, 214, 221, 230, + 238, 245, 252, 259, 265, 275, 281, 286, + 291, 293, 298, 303, 308, 313, 315, 320, + 325, 330, 335, 337, 342, 347, 352, 357, + 359, 364, 369, 374, 379, 381, 386, 391, + 396, 401, 403, 411, 417, 422, 427, 429, + 433, 438, 443, 448, 454, 460, 466, 474, + 481, 487, 493, 498, 504, 510, 516, 519, + 523, 529, 535, 541, 544, 548, 554, 560, + 566, 569, 573, 579, 585, 591, 594, 598, + 604, 610, 616, 619, 624, 632, 639, 645, + 651, 654, 661, 668, 674, 680, 683, 690, + 697, 703, 709, 712, 719, 726, 732, 738, + 741, 748, 755, 762, 769, 776, 785, 793, + 800, 807, 814, 821, 828, 837, 845, 852, + 859, 865, 872, 879, 886, 895, 903, 910, + 917, 923, 930, 937, 944, 953, 961, 968, + 975, 981, 988, 995, 1002, 1011, 1019, 1026, + 1033, 1039, 1042, 1053, 1055, 1057, 1059, 1061, + 1063, 1065, 1067, 1069, 1071, 1084, 0}; static const short _address_cond_targs[] = { - 4, 6, 7, 9, 186, 3, 3, 3, - 2, 5, 8, 3, 3, 3, 3, 3, - 0, 3, 0, 4, 6, 7, 9, 3, - 10, 3, 11, 2, 5, 8, 3, 3, - 3, 3, 3, 0, 2, 0, 2, 0, - 2, 0, 5, 0, 5, 0, 5, 0, - 4, 6, 7, 9, 3, 3, 3, 3, - 2, 5, 8, 3, 3, 3, 3, 3, - 0, 13, 15, 16, 18, 21, 12, 14, - 17, 196, 196, 196, 0, 196, 0, 12, - 0, 12, 0, 12, 0, 14, 0, 14, - 0, 14, 0, 13, 15, 16, 18, 19, - 12, 14, 17, 196, 196, 196, 0, 13, - 15, 16, 18, 12, 14, 17, 196, 196, - 196, 0, 22, 26, 44, 46, 48, 45, - 23, 23, 0, 22, 23, 23, 23, 0, - 22, 24, 23, 23, 23, 0, 25, 25, - 0, 197, 0, 22, 27, 24, 23, 23, - 23, 0, 28, 40, 42, 41, 0, 29, - 0, 30, 36, 38, 37, 0, 31, 0, - 25, 32, 34, 33, 0, 197, 33, 0, - 197, 25, 0, 35, 197, 33, 25, 0, - 197, 25, 0, 31, 37, 0, 31, 30, - 0, 31, 39, 37, 30, 0, 31, 30, - 0, 29, 41, 0, 29, 28, 0, 29, - 43, 41, 28, 0, 29, 28, 0, 22, - 27, 24, 45, 23, 23, 0, 22, 27, - 24, 26, 23, 23, 0, 22, 27, 47, - 24, 45, 26, 23, 23, 0, 22, 27, - 24, 26, 23, 23, 23, 0, 22, 24, - 49, 23, 23, 23, 0, 22, 24, 50, - 23, 23, 23, 0, 22, 51, 24, 23, - 23, 23, 0, 22, 52, 23, 23, 23, - 0, 185, 25, 53, 25, 53, 25, 25, - 53, 25, 0, 57, 197, 54, 54, 54, - 0, 57, 55, 55, 55, 0, 57, 56, - 56, 56, 0, 57, 0, 124, 58, 58, - 58, 0, 62, 59, 59, 59, 0, 62, - 60, 60, 60, 0, 62, 61, 61, 61, - 0, 62, 0, 124, 63, 63, 63, 0, - 67, 64, 64, 64, 0, 67, 65, 65, - 65, 0, 67, 66, 66, 66, 0, 67, - 0, 124, 68, 68, 68, 0, 72, 69, - 69, 69, 0, 72, 70, 70, 70, 0, - 72, 71, 71, 71, 0, 72, 0, 124, - 73, 73, 73, 0, 77, 74, 74, 74, - 0, 77, 75, 75, 75, 0, 77, 76, - 76, 76, 0, 77, 0, 98, 78, 78, - 78, 0, 82, 79, 79, 79, 0, 82, - 80, 80, 80, 0, 82, 81, 81, 81, - 0, 82, 0, 83, 91, 94, 98, 97, - 123, 123, 0, 27, 87, 84, 84, 84, - 0, 87, 85, 85, 85, 0, 87, 86, - 86, 86, 0, 87, 0, 88, 88, 88, - 0, 197, 89, 89, 89, 0, 197, 90, - 90, 90, 0, 197, 25, 25, 25, 0, - 27, 87, 92, 84, 84, 0, 27, 87, - 93, 85, 85, 0, 27, 87, 86, 86, - 86, 0, 27, 95, 87, 92, 96, 84, - 84, 0, 27, 87, 93, 85, 85, 85, - 0, 27, 87, 85, 85, 85, 0, 27, - 87, 96, 84, 84, 0, 197, 99, 99, - 99, 0, 103, 197, 100, 100, 100, 0, - 103, 197, 101, 101, 101, 0, 103, 197, - 102, 102, 102, 0, 103, 197, 0, 104, - 104, 104, 0, 108, 197, 105, 105, 105, - 0, 108, 197, 106, 106, 106, 0, 108, - 197, 107, 107, 107, 0, 108, 197, 0, - 109, 109, 109, 0, 113, 197, 110, 110, - 110, 0, 113, 197, 111, 111, 111, 0, - 113, 197, 112, 112, 112, 0, 113, 197, - 0, 114, 114, 114, 0, 118, 197, 115, - 115, 115, 0, 118, 197, 116, 116, 116, - 0, 118, 197, 117, 117, 117, 0, 118, - 197, 0, 119, 119, 119, 0, 87, 197, - 120, 120, 120, 0, 87, 197, 121, 121, - 121, 0, 87, 197, 122, 122, 122, 0, - 87, 197, 0, 87, 84, 84, 84, 0, - 125, 177, 180, 197, 183, 184, 184, 0, - 27, 129, 197, 126, 126, 126, 0, 129, - 197, 127, 127, 127, 0, 129, 197, 128, - 128, 128, 0, 129, 197, 0, 130, 169, - 172, 175, 176, 176, 0, 27, 134, 197, - 131, 131, 131, 0, 134, 197, 132, 132, - 132, 0, 134, 197, 133, 133, 133, 0, - 134, 197, 0, 135, 161, 164, 167, 168, - 168, 0, 27, 139, 197, 136, 136, 136, - 0, 139, 197, 137, 137, 137, 0, 139, - 197, 138, 138, 138, 0, 139, 197, 0, - 140, 153, 156, 159, 160, 160, 0, 27, - 144, 197, 141, 141, 141, 0, 144, 197, - 142, 142, 142, 0, 144, 197, 143, 143, - 143, 0, 144, 197, 0, 145, 146, 149, - 152, 119, 119, 0, 27, 87, 197, 120, - 120, 120, 0, 27, 87, 197, 147, 120, - 120, 0, 27, 87, 197, 148, 121, 121, - 0, 27, 87, 197, 122, 122, 122, 0, - 27, 150, 87, 197, 147, 151, 120, 120, - 0, 27, 87, 197, 148, 121, 121, 121, - 0, 27, 87, 197, 121, 121, 121, 0, - 27, 87, 197, 151, 120, 120, 0, 27, - 144, 197, 154, 141, 141, 0, 27, 144, - 197, 155, 142, 142, 0, 27, 144, 197, - 143, 143, 143, 0, 27, 157, 144, 197, - 154, 158, 141, 141, 0, 27, 144, 197, - 155, 142, 142, 142, 0, 27, 144, 197, - 142, 142, 142, 0, 27, 144, 197, 158, - 141, 141, 0, 144, 197, 141, 141, 141, - 0, 27, 139, 197, 162, 136, 136, 0, - 27, 139, 197, 163, 137, 137, 0, 27, - 139, 197, 138, 138, 138, 0, 27, 165, - 139, 197, 162, 166, 136, 136, 0, 27, - 139, 197, 163, 137, 137, 137, 0, 27, - 139, 197, 137, 137, 137, 0, 27, 139, - 197, 166, 136, 136, 0, 139, 197, 136, - 136, 136, 0, 27, 134, 197, 170, 131, - 131, 0, 27, 134, 197, 171, 132, 132, - 0, 27, 134, 197, 133, 133, 133, 0, - 27, 173, 134, 197, 170, 174, 131, 131, - 0, 27, 134, 197, 171, 132, 132, 132, - 0, 27, 134, 197, 132, 132, 132, 0, - 27, 134, 197, 174, 131, 131, 0, 134, - 197, 131, 131, 131, 0, 27, 129, 197, - 178, 126, 126, 0, 27, 129, 197, 179, - 127, 127, 0, 27, 129, 197, 128, 128, - 128, 0, 27, 181, 129, 197, 178, 182, - 126, 126, 0, 27, 129, 197, 179, 127, - 127, 127, 0, 27, 129, 197, 127, 127, - 127, 0, 27, 129, 197, 182, 126, 126, - 0, 129, 197, 126, 126, 126, 0, 124, - 197, 0, 188, 190, 191, 193, 194, 195, - 187, 189, 192, 186, 0, 186, 0, 187, - 0, 187, 0, 187, 0, 189, 0, 189, - 0, 189, 0, 11, 0, 186, 0, 13, - 15, 16, 18, 19, 20, 12, 14, 17, - 196, 196, 196, 0, 0, 0, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 0 -}; + 4, 6, 7, 9, 186, 3, 3, 3, + 2, 5, 8, 3, 3, 3, 3, 3, + 0, 3, 0, 4, 6, 7, 9, 3, + 10, 3, 11, 2, 5, 8, 3, 3, + 3, 3, 3, 0, 2, 0, 2, 0, + 2, 0, 5, 0, 5, 0, 5, 0, + 4, 6, 7, 9, 3, 3, 3, 3, + 2, 5, 8, 3, 3, 3, 3, 3, + 0, 13, 15, 16, 18, 21, 12, 14, + 17, 196, 196, 196, 0, 196, 0, 12, + 0, 12, 0, 12, 0, 14, 0, 14, + 0, 14, 0, 13, 15, 16, 18, 19, + 12, 14, 17, 196, 196, 196, 0, 13, + 15, 16, 18, 12, 14, 17, 196, 196, + 196, 0, 22, 26, 44, 46, 48, 45, + 23, 23, 0, 22, 23, 23, 23, 0, + 22, 24, 23, 23, 23, 0, 25, 25, + 0, 197, 0, 22, 27, 24, 23, 23, + 23, 0, 28, 40, 42, 41, 0, 29, + 0, 30, 36, 38, 37, 0, 31, 0, + 25, 32, 34, 33, 0, 197, 33, 0, + 197, 25, 0, 35, 197, 33, 25, 0, + 197, 25, 0, 31, 37, 0, 31, 30, + 0, 31, 39, 37, 30, 0, 31, 30, + 0, 29, 41, 0, 29, 28, 0, 29, + 43, 41, 28, 0, 29, 28, 0, 22, + 27, 24, 45, 23, 23, 0, 22, 27, + 24, 26, 23, 23, 0, 22, 27, 47, + 24, 45, 26, 23, 23, 0, 22, 27, + 24, 26, 23, 23, 23, 0, 22, 24, + 49, 23, 23, 23, 0, 22, 24, 50, + 23, 23, 23, 0, 22, 51, 24, 23, + 23, 23, 0, 22, 52, 23, 23, 23, + 0, 185, 25, 53, 25, 53, 25, 25, + 53, 25, 0, 57, 197, 54, 54, 54, + 0, 57, 55, 55, 55, 0, 57, 56, + 56, 56, 0, 57, 0, 124, 58, 58, + 58, 0, 62, 59, 59, 59, 0, 62, + 60, 60, 60, 0, 62, 61, 61, 61, + 0, 62, 0, 124, 63, 63, 63, 0, + 67, 64, 64, 64, 0, 67, 65, 65, + 65, 0, 67, 66, 66, 66, 0, 67, + 0, 124, 68, 68, 68, 0, 72, 69, + 69, 69, 0, 72, 70, 70, 70, 0, + 72, 71, 71, 71, 0, 72, 0, 124, + 73, 73, 73, 0, 77, 74, 74, 74, + 0, 77, 75, 75, 75, 0, 77, 76, + 76, 76, 0, 77, 0, 98, 78, 78, + 78, 0, 82, 79, 79, 79, 0, 82, + 80, 80, 80, 0, 82, 81, 81, 81, + 0, 82, 0, 83, 91, 94, 98, 97, + 123, 123, 0, 27, 87, 84, 84, 84, + 0, 87, 85, 85, 85, 0, 87, 86, + 86, 86, 0, 87, 0, 88, 88, 88, + 0, 197, 89, 89, 89, 0, 197, 90, + 90, 90, 0, 197, 25, 25, 25, 0, + 27, 87, 92, 84, 84, 0, 27, 87, + 93, 85, 85, 0, 27, 87, 86, 86, + 86, 0, 27, 95, 87, 92, 96, 84, + 84, 0, 27, 87, 93, 85, 85, 85, + 0, 27, 87, 85, 85, 85, 0, 27, + 87, 96, 84, 84, 0, 197, 99, 99, + 99, 0, 103, 197, 100, 100, 100, 0, + 103, 197, 101, 101, 101, 0, 103, 197, + 102, 102, 102, 0, 103, 197, 0, 104, + 104, 104, 0, 108, 197, 105, 105, 105, + 0, 108, 197, 106, 106, 106, 0, 108, + 197, 107, 107, 107, 0, 108, 197, 0, + 109, 109, 109, 0, 113, 197, 110, 110, + 110, 0, 113, 197, 111, 111, 111, 0, + 113, 197, 112, 112, 112, 0, 113, 197, + 0, 114, 114, 114, 0, 118, 197, 115, + 115, 115, 0, 118, 197, 116, 116, 116, + 0, 118, 197, 117, 117, 117, 0, 118, + 197, 0, 119, 119, 119, 0, 87, 197, + 120, 120, 120, 0, 87, 197, 121, 121, + 121, 0, 87, 197, 122, 122, 122, 0, + 87, 197, 0, 87, 84, 84, 84, 0, + 125, 177, 180, 197, 183, 184, 184, 0, + 27, 129, 197, 126, 126, 126, 0, 129, + 197, 127, 127, 127, 0, 129, 197, 128, + 128, 128, 0, 129, 197, 0, 130, 169, + 172, 175, 176, 176, 0, 27, 134, 197, + 131, 131, 131, 0, 134, 197, 132, 132, + 132, 0, 134, 197, 133, 133, 133, 0, + 134, 197, 0, 135, 161, 164, 167, 168, + 168, 0, 27, 139, 197, 136, 136, 136, + 0, 139, 197, 137, 137, 137, 0, 139, + 197, 138, 138, 138, 0, 139, 197, 0, + 140, 153, 156, 159, 160, 160, 0, 27, + 144, 197, 141, 141, 141, 0, 144, 197, + 142, 142, 142, 0, 144, 197, 143, 143, + 143, 0, 144, 197, 0, 145, 146, 149, + 152, 119, 119, 0, 27, 87, 197, 120, + 120, 120, 0, 27, 87, 197, 147, 120, + 120, 0, 27, 87, 197, 148, 121, 121, + 0, 27, 87, 197, 122, 122, 122, 0, + 27, 150, 87, 197, 147, 151, 120, 120, + 0, 27, 87, 197, 148, 121, 121, 121, + 0, 27, 87, 197, 121, 121, 121, 0, + 27, 87, 197, 151, 120, 120, 0, 27, + 144, 197, 154, 141, 141, 0, 27, 144, + 197, 155, 142, 142, 0, 27, 144, 197, + 143, 143, 143, 0, 27, 157, 144, 197, + 154, 158, 141, 141, 0, 27, 144, 197, + 155, 142, 142, 142, 0, 27, 144, 197, + 142, 142, 142, 0, 27, 144, 197, 158, + 141, 141, 0, 144, 197, 141, 141, 141, + 0, 27, 139, 197, 162, 136, 136, 0, + 27, 139, 197, 163, 137, 137, 0, 27, + 139, 197, 138, 138, 138, 0, 27, 165, + 139, 197, 162, 166, 136, 136, 0, 27, + 139, 197, 163, 137, 137, 137, 0, 27, + 139, 197, 137, 137, 137, 0, 27, 139, + 197, 166, 136, 136, 0, 139, 197, 136, + 136, 136, 0, 27, 134, 197, 170, 131, + 131, 0, 27, 134, 197, 171, 132, 132, + 0, 27, 134, 197, 133, 133, 133, 0, + 27, 173, 134, 197, 170, 174, 131, 131, + 0, 27, 134, 197, 171, 132, 132, 132, + 0, 27, 134, 197, 132, 132, 132, 0, + 27, 134, 197, 174, 131, 131, 0, 134, + 197, 131, 131, 131, 0, 27, 129, 197, + 178, 126, 126, 0, 27, 129, 197, 179, + 127, 127, 0, 27, 129, 197, 128, 128, + 128, 0, 27, 181, 129, 197, 178, 182, + 126, 126, 0, 27, 129, 197, 179, 127, + 127, 127, 0, 27, 129, 197, 127, 127, + 127, 0, 27, 129, 197, 182, 126, 126, + 0, 129, 197, 126, 126, 126, 0, 124, + 197, 0, 188, 190, 191, 193, 194, 195, + 187, 189, 192, 186, 0, 186, 0, 187, + 0, 187, 0, 187, 0, 189, 0, 189, + 0, 189, 0, 11, 0, 186, 0, 13, + 15, 16, 18, 19, 20, 12, 14, 17, + 196, 196, 196, 0, 0, 0, 1, 2, + 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 0}; static const signed char _address_cond_actions[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 3, 0, 3, - 0, 3, 0, 3, 0, 3, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 3, 1, 3, 0, - 3, 0, 3, 0, 3, 0, 3, 0, - 3, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 1, 1, 3, 0, - 0, 0, 0, 0, 0, 0, 1, 1, - 1, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 3, 0, 0, - 3, 1, 3, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 3, 0, - 3, 0, 0, 0, 0, 3, 0, 3, - 0, 0, 0, 0, 3, 1, 0, 3, - 1, 0, 3, 0, 1, 0, 0, 3, - 1, 0, 3, 0, 0, 3, 0, 0, - 3, 0, 0, 0, 0, 3, 0, 0, - 3, 0, 0, 3, 0, 0, 3, 0, - 0, 0, 0, 3, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 1, 0, 0, 0, - 3, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 3, 0, 3, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 3, 0, - 0, 0, 0, 3, 0, 0, 0, 0, - 3, 0, 3, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 3, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 3, 0, - 3, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 3, 0, 3, 0, - 0, 0, 0, 3, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 3, 0, 3, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 3, 0, - 0, 0, 0, 3, 0, 0, 0, 0, - 3, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 3, 0, 3, 0, 0, 0, - 3, 1, 0, 0, 0, 3, 1, 0, - 0, 0, 3, 1, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 3, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 3, 1, 0, 0, - 0, 3, 0, 1, 0, 0, 0, 3, - 0, 1, 0, 0, 0, 3, 0, 1, - 0, 0, 0, 3, 0, 1, 3, 0, - 0, 0, 3, 0, 1, 0, 0, 0, - 3, 0, 1, 0, 0, 0, 3, 0, - 1, 0, 0, 0, 3, 0, 1, 3, - 0, 0, 0, 3, 0, 1, 0, 0, - 0, 3, 0, 1, 0, 0, 0, 3, - 0, 1, 0, 0, 0, 3, 0, 1, - 3, 0, 0, 0, 3, 0, 1, 0, - 0, 0, 3, 0, 1, 0, 0, 0, - 3, 0, 1, 0, 0, 0, 3, 0, - 1, 3, 0, 0, 0, 3, 0, 1, - 0, 0, 0, 3, 0, 1, 0, 0, - 0, 3, 0, 1, 0, 0, 0, 3, - 0, 1, 3, 0, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, 0, 3, - 0, 0, 1, 0, 0, 0, 3, 0, - 1, 0, 0, 0, 3, 0, 1, 0, - 0, 0, 3, 0, 1, 3, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 1, - 0, 0, 0, 3, 0, 1, 0, 0, - 0, 3, 0, 1, 0, 0, 0, 3, - 0, 1, 3, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 1, 0, 0, 0, - 3, 0, 1, 0, 0, 0, 3, 0, - 1, 0, 0, 0, 3, 0, 1, 3, - 0, 0, 0, 0, 0, 0, 3, 0, - 0, 1, 0, 0, 0, 3, 0, 1, - 0, 0, 0, 3, 0, 1, 0, 0, - 0, 3, 0, 1, 3, 0, 0, 0, - 0, 0, 0, 3, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 1, 0, 0, 0, - 3, 0, 0, 1, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, 0, 0, - 3, 0, 0, 1, 0, 0, 0, 0, - 3, 0, 0, 1, 0, 0, 0, 3, - 0, 0, 1, 0, 0, 0, 3, 0, - 0, 1, 0, 0, 0, 3, 0, 0, - 1, 0, 0, 0, 3, 0, 0, 1, - 0, 0, 0, 3, 0, 0, 0, 1, - 0, 0, 0, 0, 3, 0, 0, 1, - 0, 0, 0, 0, 3, 0, 0, 1, - 0, 0, 0, 3, 0, 0, 1, 0, - 0, 0, 3, 0, 1, 0, 0, 0, - 3, 0, 0, 1, 0, 0, 0, 3, - 0, 0, 1, 0, 0, 0, 3, 0, - 0, 1, 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 0, 3, 0, - 0, 1, 0, 0, 0, 0, 3, 0, - 0, 1, 0, 0, 0, 3, 0, 0, - 1, 0, 0, 0, 3, 0, 1, 0, - 0, 0, 3, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 1, 0, 0, 0, - 3, 0, 0, 1, 0, 0, 0, 3, - 0, 0, 0, 1, 0, 0, 0, 0, - 3, 0, 0, 1, 0, 0, 0, 0, - 3, 0, 0, 1, 0, 0, 0, 3, - 0, 0, 1, 0, 0, 0, 3, 0, - 1, 0, 0, 0, 3, 0, 0, 1, - 0, 0, 0, 3, 0, 0, 1, 0, - 0, 0, 3, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 0, 1, 0, 0, - 0, 0, 3, 0, 0, 1, 0, 0, - 0, 0, 3, 0, 0, 1, 0, 0, - 0, 3, 0, 0, 1, 0, 0, 0, - 3, 0, 1, 0, 0, 0, 3, 0, - 1, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 3, 0, - 3, 0, 3, 0, 3, 0, 3, 0, - 3, 0, 3, 0, 3, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 3, 3, 0, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 0, 0, 0 -}; + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 3, 0, 3, + 0, 3, 0, 3, 0, 3, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 3, 1, 3, 0, + 3, 0, 3, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 3, 0, + 0, 0, 0, 0, 0, 0, 1, 1, + 1, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 3, 0, 0, + 3, 1, 3, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 3, 0, + 3, 0, 0, 0, 0, 3, 0, 3, + 0, 0, 0, 0, 3, 1, 0, 3, + 1, 0, 3, 0, 1, 0, 0, 3, + 1, 0, 3, 0, 0, 3, 0, 0, + 3, 0, 0, 0, 0, 3, 0, 0, + 3, 0, 0, 3, 0, 0, 3, 0, + 0, 0, 0, 3, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 3, 0, 3, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 3, 0, 0, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 3, 0, + 3, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 3, 0, 3, 0, + 0, 0, 0, 3, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 3, 0, 3, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 3, 0, 0, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 3, 0, 3, 0, 0, 0, + 3, 1, 0, 0, 0, 3, 1, 0, + 0, 0, 3, 1, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 3, 1, 0, 0, + 0, 3, 0, 1, 0, 0, 0, 3, + 0, 1, 0, 0, 0, 3, 0, 1, + 0, 0, 0, 3, 0, 1, 3, 0, + 0, 0, 3, 0, 1, 0, 0, 0, + 3, 0, 1, 0, 0, 0, 3, 0, + 1, 0, 0, 0, 3, 0, 1, 3, + 0, 0, 0, 3, 0, 1, 0, 0, + 0, 3, 0, 1, 0, 0, 0, 3, + 0, 1, 0, 0, 0, 3, 0, 1, + 3, 0, 0, 0, 3, 0, 1, 0, + 0, 0, 3, 0, 1, 0, 0, 0, + 3, 0, 1, 0, 0, 0, 3, 0, + 1, 3, 0, 0, 0, 3, 0, 1, + 0, 0, 0, 3, 0, 1, 0, 0, + 0, 3, 0, 1, 0, 0, 0, 3, + 0, 1, 3, 0, 0, 0, 0, 3, + 0, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 1, 0, 0, 0, 3, 0, + 1, 0, 0, 0, 3, 0, 1, 0, + 0, 0, 3, 0, 1, 3, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 1, + 0, 0, 0, 3, 0, 1, 0, 0, + 0, 3, 0, 1, 0, 0, 0, 3, + 0, 1, 3, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 1, 0, 0, 0, + 3, 0, 1, 0, 0, 0, 3, 0, + 1, 0, 0, 0, 3, 0, 1, 3, + 0, 0, 0, 0, 0, 0, 3, 0, + 0, 1, 0, 0, 0, 3, 0, 1, + 0, 0, 0, 3, 0, 1, 0, 0, + 0, 3, 0, 1, 3, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 1, 0, 0, + 0, 3, 0, 0, 1, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 0, 1, 0, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 1, 0, 0, 0, 3, 0, + 0, 1, 0, 0, 0, 3, 0, 0, + 1, 0, 0, 0, 3, 0, 0, 1, + 0, 0, 0, 3, 0, 0, 0, 1, + 0, 0, 0, 0, 3, 0, 0, 1, + 0, 0, 0, 0, 3, 0, 0, 1, + 0, 0, 0, 3, 0, 0, 1, 0, + 0, 0, 3, 0, 1, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 1, 0, 0, 0, 3, 0, + 0, 1, 0, 0, 0, 3, 0, 0, + 0, 1, 0, 0, 0, 0, 3, 0, + 0, 1, 0, 0, 0, 0, 3, 0, + 0, 1, 0, 0, 0, 3, 0, 0, + 1, 0, 0, 0, 3, 0, 1, 0, + 0, 0, 3, 0, 0, 1, 0, 0, + 0, 3, 0, 0, 1, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 0, 1, 0, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 1, 0, 0, 0, 3, 0, + 1, 0, 0, 0, 3, 0, 0, 1, + 0, 0, 0, 3, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 1, 0, 0, + 0, 3, 0, 0, 0, 1, 0, 0, + 0, 0, 3, 0, 0, 1, 0, 0, + 0, 0, 3, 0, 0, 1, 0, 0, + 0, 3, 0, 0, 1, 0, 0, 0, + 3, 0, 1, 0, 0, 0, 3, 0, + 1, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 3, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 3, 3, 0, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 0, 0}; static const short _address_eof_trans[] = { - 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, - 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, - 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, - 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, - 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, - 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, - 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, - 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, - 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, - 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, - 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, - 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, - 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, - 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, - 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, - 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, - 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, - 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, - 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, - 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, - 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, - 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, - 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, - 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, - 1278, 1279, 1280, 1281, 1282, 1283, 0 -}; + 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, + 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, + 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, + 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, + 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, + 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, + 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, + 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, + 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, + 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, + 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, + 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, + 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, + 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, + 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, + 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, + 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, + 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, + 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, + 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, + 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, + 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, + 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, + 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, + 1278, 1279, 1280, 1281, 1282, 1283, 0}; static const int address_start = 1; static const int address_first_final = 196; @@ -686,145 +678,141 @@ static const int address_error = 0; static const int address_en_main = 1; - #line 112 "smtp-address-validator.rl" - -bool is_address(const char* p, const char* pe) +bool is_address(const char *p, const char *pe) { int cs = 0; - - const char* eof = pe; - + + const char *eof = pe; + bool result = false; - #line 675 "smtp-address-validator.cpp" { - cs = (int)address_start; + cs = (int) address_start; } - -#line 124 "smtp-address-validator.rl" +#line 124 "smtp-address-validator.rl" #line 680 "smtp-address-validator.cpp" { int _klen; unsigned int _trans = 0; - const signed char * _keys; - const signed char * _acts; + const signed char *_keys; + const signed char *_acts; unsigned int _nacts; - _resume: {} - if ( p == pe && p != eof ) + _resume : { + } + if (p == pe && p != eof) goto _out; - if ( p == eof ) { - if ( _address_eof_trans[cs] > 0 ) { - _trans = (unsigned int)_address_eof_trans[cs] - 1; + if (p == eof) { + if (_address_eof_trans[cs] > 0) { + _trans = (unsigned int) _address_eof_trans[cs] - 1; } - } - else { - _keys = ( _address_trans_keys + (_address_key_offsets[cs])); - _trans = (unsigned int)_address_index_offsets[cs]; - - _klen = (int)_address_single_lengths[cs]; - if ( _klen > 0 ) { + } else { + _keys = (_address_trans_keys + (_address_key_offsets[cs])); + _trans = (unsigned int) _address_index_offsets[cs]; + + _klen = (int) _address_single_lengths[cs]; + if (_klen > 0) { const signed char *_lower = _keys; const signed char *_upper = _keys + _klen - 1; const signed char *_mid; - while ( 1 ) { - if ( _upper < _lower ) { + while (1) { + if (_upper < _lower) { _keys += _klen; - _trans += (unsigned int)_klen; + _trans += (unsigned int) _klen; break; } - - _mid = _lower + ((_upper-_lower) >> 1); - if ( ( (*( p))) < (*( _mid)) ) + + _mid = _lower + ((_upper - _lower) >> 1); + if (((*(p))) < (*(_mid))) _upper = _mid - 1; - else if ( ( (*( p))) > (*( _mid)) ) + else if (((*(p))) > (*(_mid))) _lower = _mid + 1; else { - _trans += (unsigned int)(_mid - _keys); + _trans += (unsigned int) (_mid - _keys); goto _match; } } } - - _klen = (int)_address_range_lengths[cs]; - if ( _klen > 0 ) { + + _klen = (int) _address_range_lengths[cs]; + if (_klen > 0) { const signed char *_lower = _keys; - const signed char *_upper = _keys + (_klen<<1) - 2; + const signed char *_upper = _keys + (_klen << 1) - 2; const signed char *_mid; - while ( 1 ) { - if ( _upper < _lower ) { - _trans += (unsigned int)_klen; + while (1) { + if (_upper < _lower) { + _trans += (unsigned int) _klen; break; } - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( ( (*( p))) < (*( _mid)) ) + + _mid = _lower + (((_upper - _lower) >> 1) & ~1); + if (((*(p))) < (*(_mid))) _upper = _mid - 2; - else if ( ( (*( p))) > (*( _mid + 1)) ) + else if (((*(p))) > (*(_mid + 1))) _lower = _mid + 2; else { - _trans += (unsigned int)((_mid - _keys)>>1); + _trans += (unsigned int) ((_mid - _keys) >> 1); break; } } } - - _match: {} + + _match : { } - cs = (int)_address_cond_targs[_trans]; - - if ( _address_cond_actions[_trans] != 0 ) { - - _acts = ( _address_actions + (_address_cond_actions[_trans])); - _nacts = (unsigned int)(*( _acts)); + } + cs = (int) _address_cond_targs[_trans]; + + if (_address_cond_actions[_trans] != 0) { + + _acts = (_address_actions + (_address_cond_actions[_trans])); + _nacts = (unsigned int) (*(_acts)); _acts += 1; - while ( _nacts > 0 ) { - switch ( (*( _acts)) ) - { - case 0: { - { + while (_nacts > 0) { + switch ((*(_acts))) { + case 0: { + { #line 108 "smtp-address-validator.rl" - result = true; } - + result = true; + } + #line 762 "smtp-address-validator.cpp" - break; - } - case 1: { - { + break; + } + case 1: { + { #line 108 "smtp-address-validator.rl" - result = false; } - + result = false; + } + #line 770 "smtp-address-validator.cpp" - break; - } + break; + } } _nacts -= 1; _acts += 1; } - } - - if ( p == eof ) { - if ( cs >= 196 ) + + if (p == eof) { + if (cs >= 196) goto _out; - } - else { - if ( cs != 0 ) { + } else { + if (cs != 0) { p += 1; goto _resume; } } - _out: {} + _out : { } - + } + #line 125 "smtp-address-validator.rl" - return result; } diff --git a/src/smtp-address-validator.hpp b/src/smtp-address-validator.hpp index 5552c3e..8d3c12b 100644 --- a/src/smtp-address-validator.hpp +++ b/src/smtp-address-validator.hpp @@ -29,6 +29,6 @@ SOFTWARE. */ -bool is_address(const char* p, const char* pe); +bool is_address(const char *p, const char *pe); #endif // SMTP_ADDRESS_PARSER_HPP_INCLUDED diff --git a/src/string-format-check.cpp b/src/string-format-check.cpp index bd8952f..0e9be67 100644 --- a/src/string-format-check.cpp +++ b/src/string-format-check.cpp @@ -182,7 +182,7 @@ const std::string uuid{R"([0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a- // from http://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address const std::string hostname{R"(^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$)"}; -bool is_ascii(std::string const& value) +bool is_ascii(std::string const &value) { for (auto ch : value) { if (ch & 0x80) { diff --git a/test/JSON-Schema-Test-Suite/tests/draft7/not.json b/test/JSON-Schema-Test-Suite/tests/draft7/not.json index 98de0ed..a48a798 100644 --- a/test/JSON-Schema-Test-Suite/tests/draft7/not.json +++ b/test/JSON-Schema-Test-Suite/tests/draft7/not.json @@ -74,7 +74,7 @@ "description": "forbidden property", "schema": { "properties": { - "foo": { + "foo": { "not": {} } } diff --git a/test/JSON-Schema-Test-Suite/tests/draft7/optional/format/uuid.json b/test/JSON-Schema-Test-Suite/tests/draft7/optional/format/uuid.json index 31e525c..e54cbc0 100644 --- a/test/JSON-Schema-Test-Suite/tests/draft7/optional/format/uuid.json +++ b/test/JSON-Schema-Test-Suite/tests/draft7/optional/format/uuid.json @@ -82,4 +82,4 @@ } ] } -] \ No newline at end of file +] diff --git a/test/JSON-Schema-Test-Suite/tests/draft7/ref.json b/test/JSON-Schema-Test-Suite/tests/draft7/ref.json index ff98d79..900ebb0 100644 --- a/test/JSON-Schema-Test-Suite/tests/draft7/ref.json +++ b/test/JSON-Schema-Test-Suite/tests/draft7/ref.json @@ -334,7 +334,7 @@ "tests": [ { "description": "valid tree", - "data": { + "data": { "meta": "root", "nodes": [ { @@ -363,7 +363,7 @@ }, { "description": "invalid tree", - "data": { + "data": { "meta": "root", "nodes": [ { diff --git a/test/binary-validation.cpp b/test/binary-validation.cpp index 4a9c7ea..23831fc 100644 --- a/test/binary-validation.cpp +++ b/test/binary-validation.cpp @@ -149,7 +149,7 @@ int main() // TODO when we set `string` in array and set `contentEncoding` = "binary" - what it means? We expected string or binary? // Or we expect only binary? Now if you set `contentEncoding` = "binary", then it means that you expect only binary data, // not string - //val.validate({{"something", "string"}}, err); -> produce error about type + // val.validate({{"something", "string"}}, err); -> produce error about type EXPECT_EQ(err.failed_pointers.size(), 0); err.reset(); diff --git a/test/cmake-install/CMakeLists.txt b/test/cmake-install/CMakeLists.txt deleted file mode 100644 index 603348f..0000000 --- a/test/cmake-install/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -# Configure install script -configure_file(test.sh.in - ${CMAKE_CURRENT_BINARY_DIR}/test.sh @ONLY) - -get_filename_component(TEST_NAME - ${CMAKE_CURRENT_SOURCE_DIR} - NAME) - - -# this build test only works, if nlohmann-json was found via a cmake-package -if(TARGET nlohmann_json::nlohmann_json) - add_test(NAME Build::${TEST_NAME} - COMMAND ${CMAKE_CURRENT_BINARY_DIR}/test.sh - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) -endif() diff --git a/test/cmake-install/project/CMakeLists.txt b/test/cmake-install/project/CMakeLists.txt deleted file mode 100644 index b5d5553..0000000 --- a/test/cmake-install/project/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -# This is a simple project that tests using cmake to load the installed libraries -cmake_minimum_required(VERSION 3.2) - -project(cmake_install_test LANGUAGES CXX) - -set(PROJECT_VERSION 1.0.0) - -# Find the nlohmann_json and the validator package -set(CMAKE_FIND_DEBUG_MODE ON) -find_package(nlohmann_json REQUIRED) -find_package(nlohmann_json_schema_validator REQUIRED) - -# Add simple json-schema-validator-executable -add_executable(json-schema-validate ${CMAKE_CURRENT_SOURCE_DIR}/../../../app/json-schema-validate.cpp) -target_link_libraries(json-schema-validate nlohmann_json_schema_validator) - -enable_testing() - -# Add built-in tests function needed for issues -set(PIPE_IN_TEST_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/../../test-pipe-in.sh) -function(add_test_simple_schema name schema instance) - add_test( - NAME ${name} - COMMAND ${PIPE_IN_TEST_SCRIPT} - $ - ${schema} - ${instance} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) -endfunction() - -# Run tests for issues 9, 12, 27, 48, 54 -foreach(NUMBER "9" "12" "27" "48" "54") - add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../../issue-${NUMBER}" "${CMAKE_CURRENT_BINARY_DIR}/issue-${NUMBER}" EXCLUDE_FROM_ALL) -endforeach() diff --git a/test/cmake-install/test.sh.in b/test/cmake-install/test.sh.in deleted file mode 100755 index 466bcbf..0000000 --- a/test/cmake-install/test.sh.in +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash - -## Configure, build, install, and test json-schema-validator with CMAKE -## This script is instantiated via configure_file() to run cmake the same the original build has been invoked. - -set -xe - -EXTRA_ARGS=$@ -SRC_DIR=@PROJECT_SOURCE_DIR@ -BUILD_DIR=@CMAKE_CURRENT_BINARY_DIR@/build-dir -INSTALL_DIR=@CMAKE_CURRENT_BINARY_DIR@/install-dir -NLOHMANN_JSON_DIR=@nlohmann_json_DIR@ -TEST_SRC_DIR=@CMAKE_CURRENT_SOURCE_DIR@/project - -cmake --version - -# Clear out build directory -rm -rf ${BUILD_DIR} -# Create build-dir -mkdir -p ${BUILD_DIR} -cd ${BUILD_DIR} - -# configure json-schema-validator -printf "\n-----------------------------------------------------------\n" -printf "Configuring, building, and installing json-schema-validator" -printf "\n-----------------------------------------------------------\n" -cmake \ - -DCMAKE_INSTALL_PREFIX:PATH=${INSTALL_DIR} \ - -Dnlohmann_json_DIR:PATH=${NLOHMANN_JSON_DIR} \ - ${EXTRA_ARGS} \ - ${SRC_DIR} - -CPU_COUNT=$(nproc) - -# Build and install json-schema-validator -cmake --build . -- -j${CPU_COUNT} -cmake --build . --target install -- -j${CPU_COUNT} - -# Make sure build directory is empty -rm -rf ./* - -# configure test project -printf "\n-----------------------------------------------------------\n" -printf "Configuring, building, and running test project" -printf "\n-----------------------------------------------------------\n" -cmake \ - -Dnlohmann_json_DIR:PATH=${NLOHMANN_JSON_DIR} \ - -Dnlohmann_json_schema_validator_DIR:PATH=${INSTALL_DIR}/lib/cmake/nlohmann_json_schema_validator \ - -DVALIDATOR_INSTALL_DIR:PATH=${INSTALL_DIR} \ - ${EXTRA_ARGS} \ - ${TEST_SRC_DIR} - -# Build test project and test -cmake --build . -ctest --output-on-failure diff --git a/test/errors.cpp b/test/errors.cpp index 91c025c..3f95d15 100644 --- a/test/errors.cpp +++ b/test/errors.cpp @@ -119,7 +119,7 @@ int main(void) {"age", 42}, {"name", "John"}, {"phones", {0}}, - {"post-code", 12345}, + {"post-code", 12345}, }, err); // name must be a string EXPECT_EQ(err.failed_pointers.size(), 1); diff --git a/test/id-ref.cpp b/test/id-ref.cpp index de54a98..5009b3d 100644 --- a/test/id-ref.cpp +++ b/test/id-ref.cpp @@ -64,7 +64,7 @@ auto schema_draft = R"( urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f# http://example.com/root.json#/definitions/C - */ + */ auto schema = R"( { diff --git a/test/issue-25-default-values.cpp b/test/issue-25-default-values.cpp index 354acf3..39a53df 100644 --- a/test/issue-25-default-values.cpp +++ b/test/issue-25-default-values.cpp @@ -102,7 +102,7 @@ int main(void) const auto &readPath = single_op["path"].get(); if (readPath != "/address/street") { std::cerr << "Patch with defaults contains wrong path. It is " << readPath << " and should be " - << "/address/street" << std::endl; + << "/address/street" << std::endl; return 1; } @@ -156,7 +156,7 @@ int main(void) const auto &readPath = single_op["path"].get(); if (readPath != "/address") { std::cerr << "Patch with defaults contains wrong path. It is " << readPath << " and should be " - << "/address" << std::endl; + << "/address" << std::endl; return 1; } @@ -165,7 +165,7 @@ int main(void) return 1; } - if ( !single_op["value"].is_object() || !single_op["value"].empty()) { + if (!single_op["value"].is_object() || !single_op["value"].empty()) { std::cerr << "Patch with defaults contains wrong value" << std::endl; return 1; } diff --git a/test/issue-27/CMakeLists.txt b/test/issue-27/CMakeLists.txt index 949479e..79e3001 100644 --- a/test/issue-27/CMakeLists.txt +++ b/test/issue-27/CMakeLists.txt @@ -4,5 +4,3 @@ add_test_simple_schema(Issue::27 set_tests_properties(Issue::27 PROPERTIES WILL_FAIL 1) - - diff --git a/test/issue-70-root-schema-constructor.cpp b/test/issue-70-root-schema-constructor.cpp index 7dad6a1..f19db3c 100644 --- a/test/issue-70-root-schema-constructor.cpp +++ b/test/issue-70-root-schema-constructor.cpp @@ -112,7 +112,7 @@ int main(void) {"age", 42}, {"name", "John"}, {"phones", {0}}, - {"post-code", 12345}, + {"post-code", 12345}, }, err); // name must be a string EXPECT_EQ(err.failed_pointers.size(), 1); diff --git a/test/issue-9/bar.json b/test/issue-9/bar.json index a9b8dbc..6f09818 100644 --- a/test/issue-9/bar.json +++ b/test/issue-9/bar.json @@ -10,4 +10,4 @@ "type": "string" } } -} \ No newline at end of file +} diff --git a/test/issue-9/foo/baz/qux/qux.json b/test/issue-9/foo/baz/qux/qux.json index 707d062..ebdc4c7 100644 --- a/test/issue-9/foo/baz/qux/qux.json +++ b/test/issue-9/foo/baz/qux/qux.json @@ -10,4 +10,4 @@ "type": "string" } } -} \ No newline at end of file +} diff --git a/test/json-patch.cpp b/test/json-patch.cpp index 6e9da4d..cf5a5a4 100644 --- a/test/json-patch.cpp +++ b/test/json-patch.cpp @@ -20,29 +20,29 @@ using nlohmann::json_patch; code; \ std::cerr << "UNEXPECTED SUCCESS.\n"; \ return 1; \ - } catch (const std::exception &e) { \ + } catch (const std::exception &e) { \ std::cerr << "EXPECTED FAIL: " << e.what() << "\n"; \ } \ } while (0) int main(void) { - OK( json_patch p1( R"([{"op":"add","path":"/0/renderable/bg","value":"Black"}])"_json)); - OK( json_patch p1( R"([{"op":"replace","path":"/0/renderable/bg","value":"Black"}])"_json)); - OK( json_patch p1( R"([{"op":"remove","path":"/0/renderable/bg"}])"_json)); + OK(json_patch p1(R"([{"op":"add","path":"/0/renderable/bg","value":"Black"}])"_json)); + OK(json_patch p1(R"([{"op":"replace","path":"/0/renderable/bg","value":"Black"}])"_json)); + OK(json_patch p1(R"([{"op":"remove","path":"/0/renderable/bg"}])"_json)); // value not needed - KO( json_patch p1( R"([{"op":"remove","path":"/0/renderable/bg", "value":"Black"}])"_json)); + KO(json_patch p1(R"([{"op":"remove","path":"/0/renderable/bg", "value":"Black"}])"_json)); // value missing - KO( json_patch p1( R"([{"op":"add","path":"/0/renderable/bg"}])"_json)); + KO(json_patch p1(R"([{"op":"add","path":"/0/renderable/bg"}])"_json)); // value missing - KO( json_patch p1( R"([{"op":"replace","path":"/0/renderable/bg"}])"_json)); + KO(json_patch p1(R"([{"op":"replace","path":"/0/renderable/bg"}])"_json)); // wrong op - KO( json_patch p1( R"([{"op":"ad","path":"/0/renderable/bg","value":"Black"}])"_json)); + KO(json_patch p1(R"([{"op":"ad","path":"/0/renderable/bg","value":"Black"}])"_json)); // invalid json-pointer - KO( json_patch p1( R"([{"op":"add","path":"0/renderable/bg","value":"Black"}])"_json)); + KO(json_patch p1(R"([{"op":"add","path":"0/renderable/bg","value":"Black"}])"_json)); return 0; } From 1242ae1a4ac1e4ba527290275ea35d63abc0928e Mon Sep 17 00:00:00 2001 From: Cristian Le Date: Tue, 16 May 2023 13:44:17 +0200 Subject: [PATCH 17/18] Revert library name change (#271) Signed-off-by: Cristian Le --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cfce8e6..2b81049 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -137,7 +137,8 @@ set_target_properties(nlohmann_json_schema_validator PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR} EXPORT_NAME validator - OUTPUT_NAME nlohmann_json_validator + # TODO: Version 3, simplify the library name +# OUTPUT_NAME nlohmann_json_validator ) # Main definitions in here From bfdda20f5b230c86f26bd49d74332f70ab7855b3 Mon Sep 17 00:00:00 2001 From: Volker Christian Date: Mon, 19 Jun 2023 16:47:34 +0200 Subject: [PATCH 18/18] Fix bug: attr.value() of an array attribute returns an iterator of basic_json objects not an iterator of std::string (#276) --- src/json-validator.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/json-validator.cpp b/src/json-validator.cpp index 3c73d98..36df670 100644 --- a/src/json-validator.cpp +++ b/src/json-validator.cpp @@ -604,10 +604,12 @@ public: } break; case json::value_t::array: // "type": ["type1", "type2"] - for (auto &schema_type : attr.value()) + for (auto &array_value : attr.value()) { + auto schema_type = array_value.get(); for (auto &t : schema_types) if (t.first == schema_type) type_[static_cast(t.second)] = type_schema::make(sch, t.second, root, uris, known_keywords); + } break; default: