| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // | ||
| 2 | // Copyright (c) 2021 Vinnie Falco (vinnie dot falco at gmail dot com) | ||
| 3 | // | ||
| 4 | // Distributed under the Boost Software License, Version 1.0. (See accompanying | ||
| 5 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | ||
| 6 | // | ||
| 7 | // Official repository: https://github.com/boostorg/url | ||
| 8 | // | ||
| 9 | |||
| 10 | #ifndef BOOST_URL_GRAMMAR_HEXDIG_CHARS_HPP | ||
| 11 | #define BOOST_URL_GRAMMAR_HEXDIG_CHARS_HPP | ||
| 12 | |||
| 13 | #include <boost/url/detail/config.hpp> | ||
| 14 | #include <boost/url/grammar/detail/charset.hpp> | ||
| 15 | |||
| 16 | namespace boost { | ||
| 17 | namespace urls { | ||
| 18 | namespace grammar { | ||
| 19 | namespace implementation_defined { | ||
| 20 | struct hexdig_chars_t | ||
| 21 | { | ||
| 22 | /** Determine if a character is a hexadecimal digit | ||
| 23 | |||
| 24 | @param c The character to test | ||
| 25 | @return `true` if `c` is a hexadecimal digit. | ||
| 26 | */ | ||
| 27 | constexpr | ||
| 28 | bool | ||
| 29 | 3493 | operator()(char c) const noexcept | |
| 30 | { | ||
| 31 | return | ||
| 32 |
4/4✓ Branch 0 taken 835 times.
✓ Branch 1 taken 625 times.
✓ Branch 2 taken 792 times.
✓ Branch 3 taken 2076 times.
|
3493 | (c >= '0' && c <= '9') || |
| 33 |
6/6✓ Branch 0 taken 1460 times.
✓ Branch 1 taken 2033 times.
✓ Branch 2 taken 539 times.
✓ Branch 3 taken 253 times.
✓ Branch 4 taken 379 times.
✓ Branch 5 taken 2236 times.
|
7365 | (c >= 'A' && c <= 'F') || |
| 34 |
2/2✓ Branch 0 taken 225 times.
✓ Branch 1 taken 154 times.
|
3872 | (c >= 'a' && c <= 'f'); |
| 35 | } | ||
| 36 | |||
| 37 | #ifdef BOOST_URL_USE_SSE2 | ||
| 38 | char const* | ||
| 39 | 256 | find_if( | |
| 40 | char const* first, | ||
| 41 | char const* last) const noexcept | ||
| 42 | { | ||
| 43 | 256 | return detail::find_if_pred( | |
| 44 | 256 | *this, first, last); | |
| 45 | } | ||
| 46 | |||
| 47 | char const* | ||
| 48 | 272 | find_if_not( | |
| 49 | char const* first, | ||
| 50 | char const* last) const noexcept | ||
| 51 | { | ||
| 52 | 272 | return detail::find_if_not_pred( | |
| 53 | 272 | *this, first, last); | |
| 54 | } | ||
| 55 | #endif | ||
| 56 | }; | ||
| 57 | } | ||
| 58 | |||
| 59 | /** The set of hexadecimal digits | ||
| 60 | |||
| 61 | @par Example | ||
| 62 | Character sets are used with rules and the | ||
| 63 | functions @ref find_if and @ref find_if_not. | ||
| 64 | @code | ||
| 65 | system::result< core::string_view > rv = parse( "8086FC19", token_rule( hexdig_chars ) ); | ||
| 66 | @endcode | ||
| 67 | |||
| 68 | @par BNF | ||
| 69 | @code | ||
| 70 | HEXDIG = DIGIT | ||
| 71 | / "A" / "B" / "C" / "D" / "E" / "F" | ||
| 72 | / "a" / "b" / "c" / "d" / "e" / "f" | ||
| 73 | @endcode | ||
| 74 | |||
| 75 | @note The RFCs are inconsistent on the case | ||
| 76 | sensitivity of hexadecimal digits. Existing | ||
| 77 | uses suggest case-insensitivity is a de-facto | ||
| 78 | standard. | ||
| 79 | |||
| 80 | @par Specification | ||
| 81 | @li <a href="https://datatracker.ietf.org/doc/html/rfc5234#appendix-B.1" | ||
| 82 | >B.1. Core Rules (rfc5234)</a> | ||
| 83 | @li <a href="https://datatracker.ietf.org/doc/html/rfc7230#section-1.2" | ||
| 84 | >1.2. Syntax Notation (rfc7230)</a> | ||
| 85 | @li <a href="https://datatracker.ietf.org/doc/html/rfc5952#section-2.3" | ||
| 86 | >2.3. Uppercase or Lowercase (rfc5952)</a> | ||
| 87 | @li <a href="https://datatracker.ietf.org/doc/html/rfc5952#section-4.3" | ||
| 88 | >4.3. Lowercase (rfc5952)</a> | ||
| 89 | |||
| 90 | @see | ||
| 91 | @ref find_if, | ||
| 92 | @ref find_if_not, | ||
| 93 | @ref hexdig_value, | ||
| 94 | @ref parse, | ||
| 95 | @ref token_rule. | ||
| 96 | */ | ||
| 97 | constexpr implementation_defined::hexdig_chars_t hexdig_chars{}; | ||
| 98 | |||
| 99 | /** Return the decimal value of a hex character | ||
| 100 | |||
| 101 | This function returns the decimal | ||
| 102 | value of a hexadecimal character, | ||
| 103 | or -1 if the argument is not a | ||
| 104 | valid hexadecimal digit. | ||
| 105 | |||
| 106 | @par BNF | ||
| 107 | @code | ||
| 108 | HEXDIG = DIGIT | ||
| 109 | / "A" / "B" / "C" / "D" / "E" / "F" | ||
| 110 | / "a" / "b" / "c" / "d" / "e" / "f" | ||
| 111 | @endcode | ||
| 112 | |||
| 113 | @param ch The character to check | ||
| 114 | |||
| 115 | @return The decimal value or -1 | ||
| 116 | */ | ||
| 117 | inline | ||
| 118 | signed char | ||
| 119 | 8636 | hexdig_value(char ch) noexcept | |
| 120 | { | ||
| 121 | // Idea for a switch statement to | ||
| 122 | // minimize emitted assembly from | ||
| 123 | // Glen Fernandes | ||
| 124 | signed char res; | ||
| 125 |
17/17✓ Branch 0 taken 962 times.
✓ Branch 1 taken 1158 times.
✓ Branch 2 taken 730 times.
✓ Branch 3 taken 1589 times.
✓ Branch 4 taken 795 times.
✓ Branch 5 taken 348 times.
✓ Branch 6 taken 268 times.
✓ Branch 7 taken 520 times.
✓ Branch 8 taken 233 times.
✓ Branch 9 taken 210 times.
✓ Branch 10 taken 84 times.
✓ Branch 11 taken 310 times.
✓ Branch 12 taken 156 times.
✓ Branch 13 taken 188 times.
✓ Branch 14 taken 211 times.
✓ Branch 15 taken 408 times.
✓ Branch 16 taken 466 times.
|
8636 | switch(ch) |
| 126 | { | ||
| 127 | 962 | default: res = -1; break; | |
| 128 | 1158 | case '0': res = 0; break; | |
| 129 | 730 | case '1': res = 1; break; | |
| 130 | 1589 | case '2': res = 2; break; | |
| 131 | 795 | case '3': res = 3; break; | |
| 132 | 348 | case '4': res = 4; break; | |
| 133 | 268 | case '5': res = 5; break; | |
| 134 | 520 | case '6': res = 6; break; | |
| 135 | 233 | case '7': res = 7; break; | |
| 136 | 210 | case '8': res = 8; break; | |
| 137 | 84 | case '9': res = 9; break; | |
| 138 | 310 | case 'a': case 'A': res = 10; break; | |
| 139 | 156 | case 'b': case 'B': res = 11; break; | |
| 140 | 188 | case 'c': case 'C': res = 12; break; | |
| 141 | 211 | case 'd': case 'D': res = 13; break; | |
| 142 | 408 | case 'e': case 'E': res = 14; break; | |
| 143 | 466 | case 'f': case 'F': res = 15; break; | |
| 144 | } | ||
| 145 | 8636 | return res; | |
| 146 | } | ||
| 147 | |||
| 148 | } // grammar | ||
| 149 | } // urls | ||
| 150 | } // boost | ||
| 151 | |||
| 152 | #endif | ||
| 153 |