|
1 | | -/* auto-generated on 2024-05-30 22:24:57 -0400. Do not edit! */ |
| 1 | +/* auto-generated on 2024-07-06 17:38:56 -0400. Do not edit! */ |
2 | 2 | /* begin file src/ada.cpp */ |
3 | 3 | #include "ada.h" |
4 | 4 | /* begin file src/checkers.cpp */ |
| 5 | + |
5 | 6 | #include <algorithm> |
6 | 7 |
|
7 | 8 | namespace ada::checkers { |
@@ -9794,6 +9795,10 @@ ADA_POP_DISABLE_WARNINGS |
9794 | 9795 |
|
9795 | 9796 | namespace ada::unicode { |
9796 | 9797 |
|
| 9798 | +constexpr bool is_tabs_or_newline(char c) noexcept { |
| 9799 | + return c == '\r' || c == '\n' || c == '\t'; |
| 9800 | +} |
| 9801 | + |
9797 | 9802 | constexpr uint64_t broadcast(uint8_t v) noexcept { |
9798 | 9803 | return 0x101010101010101ull * v; |
9799 | 9804 | } |
@@ -9828,13 +9833,8 @@ ada_really_inline bool has_tabs_or_newline( |
9828 | 9833 | std::string_view user_input) noexcept { |
9829 | 9834 | // first check for short strings in which case we do it naively. |
9830 | 9835 | if (user_input.size() < 16) { // slow path |
9831 | | - for (size_t i = 0; i < user_input.size(); i++) { |
9832 | | - if (user_input[i] == '\r' || user_input[i] == '\n' || |
9833 | | - user_input[i] == '\t') { |
9834 | | - return true; |
9835 | | - } |
9836 | | - } |
9837 | | - return false; |
| 9836 | + return std::any_of(user_input.begin(), user_input.end(), |
| 9837 | + is_tabs_or_newline); |
9838 | 9838 | } |
9839 | 9839 | // fast path for long strings (expected to be common) |
9840 | 9840 | size_t i = 0; |
@@ -9872,13 +9872,8 @@ ada_really_inline bool has_tabs_or_newline( |
9872 | 9872 | std::string_view user_input) noexcept { |
9873 | 9873 | // first check for short strings in which case we do it naively. |
9874 | 9874 | if (user_input.size() < 16) { // slow path |
9875 | | - for (size_t i = 0; i < user_input.size(); i++) { |
9876 | | - if (user_input[i] == '\r' || user_input[i] == '\n' || |
9877 | | - user_input[i] == '\t') { |
9878 | | - return true; |
9879 | | - } |
9880 | | - } |
9881 | | - return false; |
| 9875 | + return std::any_of(user_input.begin(), user_input.end(), |
| 9876 | + is_tabs_or_newline); |
9882 | 9877 | } |
9883 | 9878 | // fast path for long strings (expected to be common) |
9884 | 9879 | size_t i = 0; |
@@ -10263,10 +10258,6 @@ std::string percent_encode(const std::string_view input, |
10263 | 10258 | return out; |
10264 | 10259 | } |
10265 | 10260 |
|
10266 | | -std::string to_unicode(std::string_view input) { |
10267 | | - return ada::idna::to_unicode(input); |
10268 | | -} |
10269 | | - |
10270 | 10261 | } // namespace ada::unicode |
10271 | 10262 | /* end file src/unicode.cpp */ |
10272 | 10263 | /* begin file src/serializers.cpp */ |
@@ -10359,7 +10350,8 @@ namespace ada { |
10359 | 10350 | template <class result_type> |
10360 | 10351 | ada_warn_unused tl::expected<result_type, ada::errors> parse( |
10361 | 10352 | std::string_view input, const result_type* base_url) { |
10362 | | - result_type u = ada::parser::parse_url<result_type>(input, base_url); |
| 10353 | + result_type u = |
| 10354 | + ada::parser::parse_url_impl<result_type, true>(input, base_url); |
10363 | 10355 | if (!u.is_valid) { |
10364 | 10356 | return tl::unexpected(errors::generic_error); |
10365 | 10357 | } |
@@ -10395,16 +10387,22 @@ std::string href_from_file(std::string_view input) { |
10395 | 10387 | } |
10396 | 10388 |
|
10397 | 10389 | bool can_parse(std::string_view input, const std::string_view* base_input) { |
10398 | | - ada::result<ada::url_aggregator> base; |
| 10390 | + ada::url_aggregator base_aggregator; |
10399 | 10391 | ada::url_aggregator* base_pointer = nullptr; |
| 10392 | + |
10400 | 10393 | if (base_input != nullptr) { |
10401 | | - base = ada::parse<url_aggregator>(*base_input); |
10402 | | - if (!base) { |
| 10394 | + base_aggregator = ada::parser::parse_url_impl<ada::url_aggregator, false>( |
| 10395 | + *base_input, nullptr); |
| 10396 | + if (!base_aggregator.is_valid) { |
10403 | 10397 | return false; |
10404 | 10398 | } |
10405 | | - base_pointer = &base.value(); |
| 10399 | + base_pointer = &base_aggregator; |
10406 | 10400 | } |
10407 | | - return ada::parse<url_aggregator>(input, base_pointer).has_value(); |
| 10401 | + |
| 10402 | + ada::url_aggregator result = |
| 10403 | + ada::parser::parse_url_impl<ada::url_aggregator, false>(input, |
| 10404 | + base_pointer); |
| 10405 | + return result.is_valid; |
10408 | 10406 | } |
10409 | 10407 |
|
10410 | 10408 | ada_warn_unused std::string to_string(ada::encoding_type type) { |
@@ -12139,11 +12137,12 @@ bool url::set_href(const std::string_view input) { |
12139 | 12137 |
|
12140 | 12138 | #include <limits> |
12141 | 12139 |
|
| 12140 | + |
12142 | 12141 | namespace ada::parser { |
12143 | 12142 |
|
12144 | | -template <class result_type> |
12145 | | -result_type parse_url(std::string_view user_input, |
12146 | | - const result_type* base_url) { |
| 12143 | +template <class result_type, bool store_values> |
| 12144 | +result_type parse_url_impl(std::string_view user_input, |
| 12145 | + const result_type* base_url) { |
12147 | 12146 | // We can specialize the implementation per type. |
12148 | 12147 | // Important: result_type_is_ada_url is evaluated at *compile time*. This |
12149 | 12148 | // means that doing if constexpr(result_type_is_ada_url) { something } else { |
@@ -12178,7 +12177,7 @@ result_type parse_url(std::string_view user_input, |
12178 | 12177 | if (!url.is_valid) { |
12179 | 12178 | return url; |
12180 | 12179 | } |
12181 | | - if constexpr (result_type_is_ada_url_aggregator) { |
| 12180 | + if constexpr (result_type_is_ada_url_aggregator && store_values) { |
12182 | 12181 | // Most of the time, we just need user_input.size(). |
12183 | 12182 | // In some instances, we may need a bit more. |
12184 | 12183 | /////////////////////////// |
@@ -12195,9 +12194,6 @@ result_type parse_url(std::string_view user_input, |
12195 | 12194 | helpers::leading_zeroes(uint32_t(1 | user_input.size()))) + |
12196 | 12195 | 1; |
12197 | 12196 | url.reserve(reserve_capacity); |
12198 | | - // |
12199 | | - // |
12200 | | - // |
12201 | 12197 | } |
12202 | 12198 | std::string tmp_buffer; |
12203 | 12199 | std::string_view internal_input; |
@@ -12420,32 +12416,36 @@ result_type parse_url(std::string_view user_input, |
12420 | 12416 | password_token_seen = |
12421 | 12417 | password_token_location != std::string_view::npos; |
12422 | 12418 |
|
12423 | | - if (!password_token_seen) { |
12424 | | - if constexpr (result_type_is_ada_url) { |
12425 | | - url.username += unicode::percent_encode( |
12426 | | - authority_view, character_sets::USERINFO_PERCENT_ENCODE); |
12427 | | - } else { |
12428 | | - url.append_base_username(unicode::percent_encode( |
12429 | | - authority_view, character_sets::USERINFO_PERCENT_ENCODE)); |
12430 | | - } |
12431 | | - } else { |
12432 | | - if constexpr (result_type_is_ada_url) { |
12433 | | - url.username += unicode::percent_encode( |
12434 | | - authority_view.substr(0, password_token_location), |
12435 | | - character_sets::USERINFO_PERCENT_ENCODE); |
12436 | | - url.password += unicode::percent_encode( |
12437 | | - authority_view.substr(password_token_location + 1), |
12438 | | - character_sets::USERINFO_PERCENT_ENCODE); |
| 12419 | + if constexpr (store_values) { |
| 12420 | + if (!password_token_seen) { |
| 12421 | + if constexpr (result_type_is_ada_url) { |
| 12422 | + url.username += unicode::percent_encode( |
| 12423 | + authority_view, |
| 12424 | + character_sets::USERINFO_PERCENT_ENCODE); |
| 12425 | + } else { |
| 12426 | + url.append_base_username(unicode::percent_encode( |
| 12427 | + authority_view, |
| 12428 | + character_sets::USERINFO_PERCENT_ENCODE)); |
| 12429 | + } |
12439 | 12430 | } else { |
12440 | | - url.append_base_username(unicode::percent_encode( |
12441 | | - authority_view.substr(0, password_token_location), |
12442 | | - character_sets::USERINFO_PERCENT_ENCODE)); |
12443 | | - url.append_base_password(unicode::percent_encode( |
12444 | | - authority_view.substr(password_token_location + 1), |
12445 | | - character_sets::USERINFO_PERCENT_ENCODE)); |
| 12431 | + if constexpr (result_type_is_ada_url) { |
| 12432 | + url.username += unicode::percent_encode( |
| 12433 | + authority_view.substr(0, password_token_location), |
| 12434 | + character_sets::USERINFO_PERCENT_ENCODE); |
| 12435 | + url.password += unicode::percent_encode( |
| 12436 | + authority_view.substr(password_token_location + 1), |
| 12437 | + character_sets::USERINFO_PERCENT_ENCODE); |
| 12438 | + } else { |
| 12439 | + url.append_base_username(unicode::percent_encode( |
| 12440 | + authority_view.substr(0, password_token_location), |
| 12441 | + character_sets::USERINFO_PERCENT_ENCODE)); |
| 12442 | + url.append_base_password(unicode::percent_encode( |
| 12443 | + authority_view.substr(password_token_location + 1), |
| 12444 | + character_sets::USERINFO_PERCENT_ENCODE)); |
| 12445 | + } |
12446 | 12446 | } |
12447 | 12447 | } |
12448 | | - } else { |
| 12448 | + } else if constexpr (store_values) { |
12449 | 12449 | if constexpr (result_type_is_ada_url) { |
12450 | 12450 | url.password += unicode::percent_encode( |
12451 | 12451 | authority_view, character_sets::USERINFO_PERCENT_ENCODE); |
@@ -12472,8 +12472,10 @@ result_type parse_url(std::string_view user_input, |
12472 | 12472 | break; |
12473 | 12473 | } |
12474 | 12474 | if (end_of_authority == input_size) { |
12475 | | - if (fragment.has_value()) { |
12476 | | - url.update_unencoded_base_hash(*fragment); |
| 12475 | + if constexpr (store_values) { |
| 12476 | + if (fragment.has_value()) { |
| 12477 | + url.update_unencoded_base_hash(*fragment); |
| 12478 | + } |
12477 | 12479 | } |
12478 | 12480 | return url; |
12479 | 12481 | } |
@@ -12670,19 +12672,22 @@ result_type parse_url(std::string_view user_input, |
12670 | 12672 | } |
12671 | 12673 | case ada::state::QUERY: { |
12672 | 12674 | ada_log("QUERY ", helpers::substring(url_data, input_position)); |
12673 | | - // Let queryPercentEncodeSet be the special-query percent-encode set if |
12674 | | - // url is special; otherwise the query percent-encode set. |
12675 | | - const uint8_t* query_percent_encode_set = |
12676 | | - url.is_special() ? ada::character_sets::SPECIAL_QUERY_PERCENT_ENCODE |
12677 | | - : ada::character_sets::QUERY_PERCENT_ENCODE; |
12678 | | - |
12679 | | - // Percent-encode after encoding, with encoding, buffer, and |
12680 | | - // queryPercentEncodeSet, and append the result to url's query. |
12681 | | - url.update_base_search(helpers::substring(url_data, input_position), |
12682 | | - query_percent_encode_set); |
12683 | | - ada_log("QUERY update_base_search completed "); |
12684 | | - if (fragment.has_value()) { |
12685 | | - url.update_unencoded_base_hash(*fragment); |
| 12675 | + if constexpr (store_values) { |
| 12676 | + // Let queryPercentEncodeSet be the special-query percent-encode set |
| 12677 | + // if url is special; otherwise the query percent-encode set. |
| 12678 | + const uint8_t* query_percent_encode_set = |
| 12679 | + url.is_special() |
| 12680 | + ? ada::character_sets::SPECIAL_QUERY_PERCENT_ENCODE |
| 12681 | + : ada::character_sets::QUERY_PERCENT_ENCODE; |
| 12682 | + |
| 12683 | + // Percent-encode after encoding, with encoding, buffer, and |
| 12684 | + // queryPercentEncodeSet, and append the result to url's query. |
| 12685 | + url.update_base_search(helpers::substring(url_data, input_position), |
| 12686 | + query_percent_encode_set); |
| 12687 | + ada_log("QUERY update_base_search completed "); |
| 12688 | + if (fragment.has_value()) { |
| 12689 | + url.update_unencoded_base_hash(*fragment); |
| 12690 | + } |
12686 | 12691 | } |
12687 | 12692 | return url; |
12688 | 12693 | } |
@@ -12785,9 +12790,11 @@ result_type parse_url(std::string_view user_input, |
12785 | 12790 | // Optimization: Avoiding going into PATH state improves the |
12786 | 12791 | // performance of urls ending with /. |
12787 | 12792 | if (input_position == input_size) { |
12788 | | - url.update_base_pathname("/"); |
12789 | | - if (fragment.has_value()) { |
12790 | | - url.update_unencoded_base_hash(*fragment); |
| 12793 | + if constexpr (store_values) { |
| 12794 | + url.update_base_pathname("/"); |
| 12795 | + if (fragment.has_value()) { |
| 12796 | + url.update_unencoded_base_hash(*fragment); |
| 12797 | + } |
12791 | 12798 | } |
12792 | 12799 | return url; |
12793 | 12800 | } |
@@ -12833,11 +12840,13 @@ result_type parse_url(std::string_view user_input, |
12833 | 12840 | } else { |
12834 | 12841 | input_position = input_size + 1; |
12835 | 12842 | } |
12836 | | - if constexpr (result_type_is_ada_url) { |
12837 | | - helpers::parse_prepared_path(view, url.type, url.path); |
12838 | | - } else { |
12839 | | - url.consume_prepared_path(view); |
12840 | | - ADA_ASSERT_TRUE(url.validate()); |
| 12843 | + if constexpr (store_values) { |
| 12844 | + if constexpr (result_type_is_ada_url) { |
| 12845 | + helpers::parse_prepared_path(view, url.type, url.path); |
| 12846 | + } else { |
| 12847 | + url.consume_prepared_path(view); |
| 12848 | + ADA_ASSERT_TRUE(url.validate()); |
| 12849 | + } |
12841 | 12850 | } |
12842 | 12851 | break; |
12843 | 12852 | } |
@@ -13031,17 +13040,29 @@ result_type parse_url(std::string_view user_input, |
13031 | 13040 | ada::unreachable(); |
13032 | 13041 | } |
13033 | 13042 | } |
13034 | | - if (fragment.has_value()) { |
13035 | | - url.update_unencoded_base_hash(*fragment); |
| 13043 | + if constexpr (store_values) { |
| 13044 | + if (fragment.has_value()) { |
| 13045 | + url.update_unencoded_base_hash(*fragment); |
| 13046 | + } |
13036 | 13047 | } |
13037 | 13048 | return url; |
13038 | 13049 | } |
13039 | 13050 |
|
| 13051 | +template url parse_url_impl(std::string_view user_input, |
| 13052 | + const url* base_url = nullptr); |
| 13053 | +template url_aggregator parse_url_impl( |
| 13054 | + std::string_view user_input, const url_aggregator* base_url = nullptr); |
| 13055 | + |
| 13056 | +template <class result_type> |
| 13057 | +result_type parse_url(std::string_view user_input, |
| 13058 | + const result_type* base_url) { |
| 13059 | + return parse_url_impl<result_type, true>(user_input, base_url); |
| 13060 | +} |
| 13061 | + |
13040 | 13062 | template url parse_url<url>(std::string_view user_input, |
13041 | 13063 | const url* base_url = nullptr); |
13042 | 13064 | template url_aggregator parse_url<url_aggregator>( |
13043 | 13065 | std::string_view user_input, const url_aggregator* base_url = nullptr); |
13044 | | - |
13045 | 13066 | } // namespace ada::parser |
13046 | 13067 | /* end file src/parser.cpp */ |
13047 | 13068 | /* begin file src/url_components.cpp */ |
@@ -15397,6 +15418,15 @@ void ada_search_params_sort(ada_url_search_params result) { |
15397 | 15418 | } |
15398 | 15419 | } |
15399 | 15420 |
|
| 15421 | +void ada_search_params_reset(ada_url_search_params result, const char* input, |
| 15422 | + size_t length) { |
| 15423 | + ada::result<ada::url_search_params>& r = |
| 15424 | + *(ada::result<ada::url_search_params>*)result; |
| 15425 | + if (r) { |
| 15426 | + r->reset(std::string_view(input, length)); |
| 15427 | + } |
| 15428 | +} |
| 15429 | + |
15400 | 15430 | void ada_search_params_append(ada_url_search_params result, const char* key, |
15401 | 15431 | size_t key_length, const char* value, |
15402 | 15432 | size_t value_length) { |
|