libmicrohttpd2

HTTP server C library (MHD 2.x, alpha)
Log | Files | Refs | README | LICENSE

commit 514dca2e6c7867b17cf4541f02e39e456e6b5758
parent 3acd1a8a2562a4d3497c33a7c60d45d3c4eb3d2e
Author: Evgeny Grin (Karlson2k) <k2k@drgrin.dev>
Date:   Wed, 11 Jun 2025 17:37:58 +0200

xdigittovalue(): optimised.

Improved performance of the "fast code" version.
Improved both performance and the size of the "compact code" version.

Can be backported.

Diffstat:
Msrc/mhd2/mhd_str.c | 583++++++++++++++++++++++++++++++++++++-------------------------------------------
1 file changed, 268 insertions(+), 315 deletions(-)

diff --git a/src/mhd2/mhd_str.c b/src/mhd2/mhd_str.c @@ -209,323 +209,276 @@ todigitvalue (char c) MHD_static_inline_ int xdigittovalue (char c) { + const unsigned char uc = (unsigned char) c; /* Force unsigned value */ #if ! defined(MHD_FAVOR_SMALL_CODE) - switch ((unsigned char) c) - { -#if 0 /* Disabled to give the compiler a hint about low probability */ - case 0x00U: /* NUL */ - case 0x01U: /* SOH */ - case 0x02U: /* STX */ - case 0x03U: /* ETX */ - case 0x04U: /* EOT */ - case 0x05U: /* ENQ */ - case 0x06U: /* ACK */ - case 0x07U: /* BEL */ - case 0x08U: /* BS */ - case 0x09U: /* HT */ - case 0x0AU: /* LF */ - case 0x0BU: /* VT */ - case 0x0CU: /* FF */ - case 0x0DU: /* CR */ - case 0x0EU: /* SO */ - case 0x0FU: /* SI */ - case 0x10U: /* DLE */ - case 0x11U: /* DC1 */ - case 0x12U: /* DC2 */ - case 0x13U: /* DC3 */ - case 0x14U: /* DC4 */ - case 0x15U: /* NAK */ - case 0x16U: /* SYN */ - case 0x17U: /* ETB */ - case 0x18U: /* CAN */ - case 0x19U: /* EM */ - case 0x1AU: /* SUB */ - case 0x1BU: /* ESC */ - case 0x1CU: /* FS */ - case 0x1DU: /* GS */ - case 0x1EU: /* RS */ - case 0x1FU: /* US */ - case 0x20U: /* ' ' */ - case 0x21U: /* '!' */ - case 0x22U: /* '"' */ - case 0x23U: /* '#' */ - case 0x24U: /* '$' */ - case 0x25U: /* '%' */ - case 0x26U: /* '&' */ - case 0x27U: /* '\'' */ - case 0x28U: /* '(' */ - case 0x29U: /* ')' */ - case 0x2AU: /* '*' */ - case 0x2BU: /* '+' */ - case 0x2CU: /* ',' */ - case 0x2DU: /* '-' */ - case 0x2EU: /* '.' */ - case 0x2FU: /* '/' */ - return -1; -#endif - case 0x30U: /* '0' */ - return 0; - case 0x31U: /* '1' */ - return 1; - case 0x32U: /* '2' */ - return 2; - case 0x33U: /* '3' */ - return 3; - case 0x34U: /* '4' */ - return 4; - case 0x35U: /* '5' */ - return 5; - case 0x36U: /* '6' */ - return 6; - case 0x37U: /* '7' */ - return 7; - case 0x38U: /* '8' */ - return 8; - case 0x39U: /* '9' */ - return 9; -#if 0 /* Disabled to give the compiler a hint about low probability */ - case 0x3AU: /* ':' */ - case 0x3BU: /* ';' */ - case 0x3CU: /* '<' */ - case 0x3DU: /* '=' */ - case 0x3EU: /* '>' */ - case 0x3FU: /* '?' */ - case 0x40U: /* '@' */ - return -1; -#endif - case 0x41U: /* 'A' */ - return 0xAU; - case 0x42U: /* 'B' */ - return 0xBU; - case 0x43U: /* 'C' */ - return 0xCU; - case 0x44U: /* 'D' */ - return 0xDU; - case 0x45U: /* 'E' */ - return 0xEU; - case 0x46U: /* 'F' */ - return 0xFU; -#if 0 /* Disabled to give the compiler a hint about low probability */ - case 0x47U: /* 'G' */ - case 0x48U: /* 'H' */ - case 0x49U: /* 'I' */ - case 0x4AU: /* 'J' */ - case 0x4BU: /* 'K' */ - case 0x4CU: /* 'L' */ - case 0x4DU: /* 'M' */ - case 0x4EU: /* 'N' */ - case 0x4FU: /* 'O' */ - case 0x50U: /* 'P' */ - case 0x51U: /* 'Q' */ - case 0x52U: /* 'R' */ - case 0x53U: /* 'S' */ - case 0x54U: /* 'T' */ - case 0x55U: /* 'U' */ - case 0x56U: /* 'V' */ - case 0x57U: /* 'W' */ - case 0x58U: /* 'X' */ - case 0x59U: /* 'Y' */ - case 0x5AU: /* 'Z' */ - case 0x5BU: /* '[' */ - case 0x5CU: /* '\' */ - case 0x5DU: /* ']' */ - case 0x5EU: /* '^' */ - case 0x5FU: /* '_' */ - case 0x60U: /* '`' */ - return -1; -#endif - case 0x61U: /* 'a' */ - return 0xAU; - case 0x62U: /* 'b' */ - return 0xBU; - case 0x63U: /* 'c' */ - return 0xCU; - case 0x64U: /* 'd' */ - return 0xDU; - case 0x65U: /* 'e' */ - return 0xEU; - case 0x66U: /* 'f' */ - return 0xFU; -#if 0 /* Disabled to give the compiler a hint about low probability */ - case 0x67U: /* 'g' */ - case 0x68U: /* 'h' */ - case 0x69U: /* 'i' */ - case 0x6AU: /* 'j' */ - case 0x6BU: /* 'k' */ - case 0x6CU: /* 'l' */ - case 0x6DU: /* 'm' */ - case 0x6EU: /* 'n' */ - case 0x6FU: /* 'o' */ - case 0x70U: /* 'p' */ - case 0x71U: /* 'q' */ - case 0x72U: /* 'r' */ - case 0x73U: /* 's' */ - case 0x74U: /* 't' */ - case 0x75U: /* 'u' */ - case 0x76U: /* 'v' */ - case 0x77U: /* 'w' */ - case 0x78U: /* 'x' */ - case 0x79U: /* 'y' */ - case 0x7AU: /* 'z' */ - case 0x7BU: /* '{' */ - case 0x7CU: /* '|' */ - case 0x7DU: /* '}' */ - case 0x7EU: /* '~' */ - case 0x7FU: /* DEL */ - case 0x80U: /* EXT */ - case 0x81U: /* EXT */ - case 0x82U: /* EXT */ - case 0x83U: /* EXT */ - case 0x84U: /* EXT */ - case 0x85U: /* EXT */ - case 0x86U: /* EXT */ - case 0x87U: /* EXT */ - case 0x88U: /* EXT */ - case 0x89U: /* EXT */ - case 0x8AU: /* EXT */ - case 0x8BU: /* EXT */ - case 0x8CU: /* EXT */ - case 0x8DU: /* EXT */ - case 0x8EU: /* EXT */ - case 0x8FU: /* EXT */ - case 0x90U: /* EXT */ - case 0x91U: /* EXT */ - case 0x92U: /* EXT */ - case 0x93U: /* EXT */ - case 0x94U: /* EXT */ - case 0x95U: /* EXT */ - case 0x96U: /* EXT */ - case 0x97U: /* EXT */ - case 0x98U: /* EXT */ - case 0x99U: /* EXT */ - case 0x9AU: /* EXT */ - case 0x9BU: /* EXT */ - case 0x9CU: /* EXT */ - case 0x9DU: /* EXT */ - case 0x9EU: /* EXT */ - case 0x9FU: /* EXT */ - case 0xA0U: /* EXT */ - case 0xA1U: /* EXT */ - case 0xA2U: /* EXT */ - case 0xA3U: /* EXT */ - case 0xA4U: /* EXT */ - case 0xA5U: /* EXT */ - case 0xA6U: /* EXT */ - case 0xA7U: /* EXT */ - case 0xA8U: /* EXT */ - case 0xA9U: /* EXT */ - case 0xAAU: /* EXT */ - case 0xABU: /* EXT */ - case 0xACU: /* EXT */ - case 0xADU: /* EXT */ - case 0xAEU: /* EXT */ - case 0xAFU: /* EXT */ - case 0xB0U: /* EXT */ - case 0xB1U: /* EXT */ - case 0xB2U: /* EXT */ - case 0xB3U: /* EXT */ - case 0xB4U: /* EXT */ - case 0xB5U: /* EXT */ - case 0xB6U: /* EXT */ - case 0xB7U: /* EXT */ - case 0xB8U: /* EXT */ - case 0xB9U: /* EXT */ - case 0xBAU: /* EXT */ - case 0xBBU: /* EXT */ - case 0xBCU: /* EXT */ - case 0xBDU: /* EXT */ - case 0xBEU: /* EXT */ - case 0xBFU: /* EXT */ - case 0xC0U: /* EXT */ - case 0xC1U: /* EXT */ - case 0xC2U: /* EXT */ - case 0xC3U: /* EXT */ - case 0xC4U: /* EXT */ - case 0xC5U: /* EXT */ - case 0xC6U: /* EXT */ - case 0xC7U: /* EXT */ - case 0xC8U: /* EXT */ - case 0xC9U: /* EXT */ - case 0xCAU: /* EXT */ - case 0xCBU: /* EXT */ - case 0xCCU: /* EXT */ - case 0xCDU: /* EXT */ - case 0xCEU: /* EXT */ - case 0xCFU: /* EXT */ - case 0xD0U: /* EXT */ - case 0xD1U: /* EXT */ - case 0xD2U: /* EXT */ - case 0xD3U: /* EXT */ - case 0xD4U: /* EXT */ - case 0xD5U: /* EXT */ - case 0xD6U: /* EXT */ - case 0xD7U: /* EXT */ - case 0xD8U: /* EXT */ - case 0xD9U: /* EXT */ - case 0xDAU: /* EXT */ - case 0xDBU: /* EXT */ - case 0xDCU: /* EXT */ - case 0xDDU: /* EXT */ - case 0xDEU: /* EXT */ - case 0xDFU: /* EXT */ - case 0xE0U: /* EXT */ - case 0xE1U: /* EXT */ - case 0xE2U: /* EXT */ - case 0xE3U: /* EXT */ - case 0xE4U: /* EXT */ - case 0xE5U: /* EXT */ - case 0xE6U: /* EXT */ - case 0xE7U: /* EXT */ - case 0xE8U: /* EXT */ - case 0xE9U: /* EXT */ - case 0xEAU: /* EXT */ - case 0xEBU: /* EXT */ - case 0xECU: /* EXT */ - case 0xEDU: /* EXT */ - case 0xEEU: /* EXT */ - case 0xEFU: /* EXT */ - case 0xF0U: /* EXT */ - case 0xF1U: /* EXT */ - case 0xF2U: /* EXT */ - case 0xF3U: /* EXT */ - case 0xF4U: /* EXT */ - case 0xF5U: /* EXT */ - case 0xF6U: /* EXT */ - case 0xF7U: /* EXT */ - case 0xF8U: /* EXT */ - case 0xF9U: /* EXT */ - case 0xFAU: /* EXT */ - case 0xFBU: /* EXT */ - case 0xFCU: /* EXT */ - case 0xFDU: /* EXT */ - case 0xFEU: /* EXT */ - case 0xFFU: /* EXT */ - return -1; - default: - mhd_assert (0); - break; /* Should be unreachable */ -#else - default: - break; -#endif - } - return -1; + static const signed char map_xdigit_to_value[256] = { + -1 /* 0x00 (NUL) */, + -1 /* 0x01 (SOH) */, + -1 /* 0x02 (STX) */, + -1 /* 0x03 (ETX) */, + -1 /* 0x04 (EOT) */, + -1 /* 0x05 (ENQ) */, + -1 /* 0x06 (ACK) */, + -1 /* 0x07 (BEL) */, + -1 /* 0x08 (BS) */, + -1 /* 0x09 (HT) */, + -1 /* 0x0A (LF) */, + -1 /* 0x0B (VT) */, + -1 /* 0x0C (FF) */, + -1 /* 0x0D (CR) */, + -1 /* 0x0E (SO) */, + -1 /* 0x0F (SI) */, + -1 /* 0x10 (DLE) */, + -1 /* 0x11 (DC1) */, + -1 /* 0x12 (DC2) */, + -1 /* 0x13 (DC3) */, + -1 /* 0x14 (DC4) */, + -1 /* 0x15 (NAK) */, + -1 /* 0x16 (SYN) */, + -1 /* 0x17 (ETB) */, + -1 /* 0x18 (CAN) */, + -1 /* 0x19 (EM) */, + -1 /* 0x1A (SUB) */, + -1 /* 0x1B (ESC) */, + -1 /* 0x1C (FS) */, + -1 /* 0x1D (GS) */, + -1 /* 0x1E (RS) */, + -1 /* 0x1F (US) */, + -1 /* 0x20 (' ') */, + -1 /* 0x21 ('!') */, + -1 /* 0x22 ('"') */, + -1 /* 0x23 ('#') */, + -1 /* 0x24 ('$') */, + -1 /* 0x25 ('%') */, + -1 /* 0x26 ('&') */, + -1 /* 0x27 ('\'') */, + -1 /* 0x28 ('(') */, + -1 /* 0x29 (')') */, + -1 /* 0x2A ('*') */, + -1 /* 0x2B ('+') */, + -1 /* 0x2C (',') */, + -1 /* 0x2D ('-') */, + -1 /* 0x2E ('.') */, + -1 /* 0x2F ('/') */, + 0 /* 0x30 ('0') */, + 1 /* 0x31 ('1') */, + 2 /* 0x32 ('2') */, + 3 /* 0x33 ('3') */, + 4 /* 0x34 ('4') */, + 5 /* 0x35 ('5') */, + 6 /* 0x36 ('6') */, + 7 /* 0x37 ('7') */, + 8 /* 0x38 ('8') */, + 9 /* 0x39 ('9') */, + -1 /* 0x3A (':') */, + -1 /* 0x3B (';') */, + -1 /* 0x3C ('<') */, + -1 /* 0x3D ('=') */, + -1 /* 0x3E ('>') */, + -1 /* 0x3F ('?') */, + -1 /* 0x40 ('@') */, + 10 /* 0x41 ('A') */, + 11 /* 0x42 ('B') */, + 12 /* 0x43 ('C') */, + 13 /* 0x44 ('D') */, + 14 /* 0x45 ('E') */, + 15 /* 0x46 ('F') */, + -1 /* 0x47 ('G') */, + -1 /* 0x48 ('H') */, + -1 /* 0x49 ('I') */, + -1 /* 0x4A ('J') */, + -1 /* 0x4B ('K') */, + -1 /* 0x4C ('L') */, + -1 /* 0x4D ('M') */, + -1 /* 0x4E ('N') */, + -1 /* 0x4F ('O') */, + -1 /* 0x50 ('P') */, + -1 /* 0x51 ('Q') */, + -1 /* 0x52 ('R') */, + -1 /* 0x53 ('S') */, + -1 /* 0x54 ('T') */, + -1 /* 0x55 ('U') */, + -1 /* 0x56 ('V') */, + -1 /* 0x57 ('W') */, + -1 /* 0x58 ('X') */, + -1 /* 0x59 ('Y') */, + -1 /* 0x5A ('Z') */, + -1 /* 0x5B ('[') */, + -1 /* 0x5C ('\') */, + -1 /* 0x5D (']') */, + -1 /* 0x5E ('^') */, + -1 /* 0x5F ('_') */, + -1 /* 0x60 ('`') */, + 10 /* 0x61 ('a') */, + 11 /* 0x62 ('b') */, + 12 /* 0x63 ('c') */, + 13 /* 0x64 ('d') */, + 14 /* 0x65 ('e') */, + 15 /* 0x66 ('f') */, + -1 /* 0x67 ('g') */, + -1 /* 0x68 ('h') */, + -1 /* 0x69 ('i') */, + -1 /* 0x6A ('j') */, + -1 /* 0x6B ('k') */, + -1 /* 0x6C ('l') */, + -1 /* 0x6D ('m') */, + -1 /* 0x6E ('n') */, + -1 /* 0x6F ('o') */, + -1 /* 0x70 ('p') */, + -1 /* 0x71 ('q') */, + -1 /* 0x72 ('r') */, + -1 /* 0x73 ('s') */, + -1 /* 0x74 ('t') */, + -1 /* 0x75 ('u') */, + -1 /* 0x76 ('v') */, + -1 /* 0x77 ('w') */, + -1 /* 0x78 ('x') */, + -1 /* 0x79 ('y') */, + -1 /* 0x7A ('z') */, + -1 /* 0x7B ('{') */, + -1 /* 0x7C ('|') */, + -1 /* 0x7D ('}') */, + -1 /* 0x7E ('~') */, + -1 /* 0x7F (DEL) */, + -1 /* 0x80 (EXT) */, + -1 /* 0x81 (EXT) */, + -1 /* 0x82 (EXT) */, + -1 /* 0x83 (EXT) */, + -1 /* 0x84 (EXT) */, + -1 /* 0x85 (EXT) */, + -1 /* 0x86 (EXT) */, + -1 /* 0x87 (EXT) */, + -1 /* 0x88 (EXT) */, + -1 /* 0x89 (EXT) */, + -1 /* 0x8A (EXT) */, + -1 /* 0x8B (EXT) */, + -1 /* 0x8C (EXT) */, + -1 /* 0x8D (EXT) */, + -1 /* 0x8E (EXT) */, + -1 /* 0x8F (EXT) */, + -1 /* 0x90 (EXT) */, + -1 /* 0x91 (EXT) */, + -1 /* 0x92 (EXT) */, + -1 /* 0x93 (EXT) */, + -1 /* 0x94 (EXT) */, + -1 /* 0x95 (EXT) */, + -1 /* 0x96 (EXT) */, + -1 /* 0x97 (EXT) */, + -1 /* 0x98 (EXT) */, + -1 /* 0x99 (EXT) */, + -1 /* 0x9A (EXT) */, + -1 /* 0x9B (EXT) */, + -1 /* 0x9C (EXT) */, + -1 /* 0x9D (EXT) */, + -1 /* 0x9E (EXT) */, + -1 /* 0x9F (EXT) */, + -1 /* 0xA0 (EXT) */, + -1 /* 0xA1 (EXT) */, + -1 /* 0xA2 (EXT) */, + -1 /* 0xA3 (EXT) */, + -1 /* 0xA4 (EXT) */, + -1 /* 0xA5 (EXT) */, + -1 /* 0xA6 (EXT) */, + -1 /* 0xA7 (EXT) */, + -1 /* 0xA8 (EXT) */, + -1 /* 0xA9 (EXT) */, + -1 /* 0xAA (EXT) */, + -1 /* 0xAB (EXT) */, + -1 /* 0xAC (EXT) */, + -1 /* 0xAD (EXT) */, + -1 /* 0xAE (EXT) */, + -1 /* 0xAF (EXT) */, + -1 /* 0xB0 (EXT) */, + -1 /* 0xB1 (EXT) */, + -1 /* 0xB2 (EXT) */, + -1 /* 0xB3 (EXT) */, + -1 /* 0xB4 (EXT) */, + -1 /* 0xB5 (EXT) */, + -1 /* 0xB6 (EXT) */, + -1 /* 0xB7 (EXT) */, + -1 /* 0xB8 (EXT) */, + -1 /* 0xB9 (EXT) */, + -1 /* 0xBA (EXT) */, + -1 /* 0xBB (EXT) */, + -1 /* 0xBC (EXT) */, + -1 /* 0xBD (EXT) */, + -1 /* 0xBE (EXT) */, + -1 /* 0xBF (EXT) */, + -1 /* 0xC0 (EXT) */, + -1 /* 0xC1 (EXT) */, + -1 /* 0xC2 (EXT) */, + -1 /* 0xC3 (EXT) */, + -1 /* 0xC4 (EXT) */, + -1 /* 0xC5 (EXT) */, + -1 /* 0xC6 (EXT) */, + -1 /* 0xC7 (EXT) */, + -1 /* 0xC8 (EXT) */, + -1 /* 0xC9 (EXT) */, + -1 /* 0xCA (EXT) */, + -1 /* 0xCB (EXT) */, + -1 /* 0xCC (EXT) */, + -1 /* 0xCD (EXT) */, + -1 /* 0xCE (EXT) */, + -1 /* 0xCF (EXT) */, + -1 /* 0xD0 (EXT) */, + -1 /* 0xD1 (EXT) */, + -1 /* 0xD2 (EXT) */, + -1 /* 0xD3 (EXT) */, + -1 /* 0xD4 (EXT) */, + -1 /* 0xD5 (EXT) */, + -1 /* 0xD6 (EXT) */, + -1 /* 0xD7 (EXT) */, + -1 /* 0xD8 (EXT) */, + -1 /* 0xD9 (EXT) */, + -1 /* 0xDA (EXT) */, + -1 /* 0xDB (EXT) */, + -1 /* 0xDC (EXT) */, + -1 /* 0xDD (EXT) */, + -1 /* 0xDE (EXT) */, + -1 /* 0xDF (EXT) */, + -1 /* 0xE0 (EXT) */, + -1 /* 0xE1 (EXT) */, + -1 /* 0xE2 (EXT) */, + -1 /* 0xE3 (EXT) */, + -1 /* 0xE4 (EXT) */, + -1 /* 0xE5 (EXT) */, + -1 /* 0xE6 (EXT) */, + -1 /* 0xE7 (EXT) */, + -1 /* 0xE8 (EXT) */, + -1 /* 0xE9 (EXT) */, + -1 /* 0xEA (EXT) */, + -1 /* 0xEB (EXT) */, + -1 /* 0xEC (EXT) */, + -1 /* 0xED (EXT) */, + -1 /* 0xEE (EXT) */, + -1 /* 0xEF (EXT) */, + -1 /* 0xF0 (EXT) */, + -1 /* 0xF1 (EXT) */, + -1 /* 0xF2 (EXT) */, + -1 /* 0xF3 (EXT) */, + -1 /* 0xF4 (EXT) */, + -1 /* 0xF5 (EXT) */, + -1 /* 0xF6 (EXT) */, + -1 /* 0xF7 (EXT) */, + -1 /* 0xF8 (EXT) */, + -1 /* 0xF9 (EXT) */, + -1 /* 0xFA (EXT) */, + -1 /* 0xFB (EXT) */, + -1 /* 0xFC (EXT) */, + -1 /* 0xFD (EXT) */, + -1 /* 0xFE (EXT) */, + -1 /* 0xFF (EXT) */ + }; + return map_xdigit_to_value[uc]; #else /* MHD_FAVOR_SMALL_CODE */ - if (c <= 9) - { - if (c >= 0) - return (unsigned char) (c - '0'); - } - else if (c <= 'F') - { - if (c >= 'A') - return (unsigned char) (c - 'A' + 10); - } - else if (c >= 'a') - { - if (c <= 'f') - return (unsigned char) (c - 'a' + 10); - } + unsigned int try_val; + + try_val = uc - (unsigned char) '0'; + if (9 >= try_val) + return (int) (unsigned int) try_val; + try_val = (uc | 0x20u /* fold case */) - (unsigned char) 'a'; + if (5 >= try_val) + return (int) (unsigned int) (try_val + 10u); return -1; #endif /* MHD_FAVOR_SMALL_CODE */