commit bde583e6474553c8e86d1286b82ac3bbb04c0fee parent 4195c246bb47080eb7ce8c55d25c825da96a3a6e Author: Evgeny Grin (Karlson2k) <k2k@narod.ru> Date: Tue, 7 Jun 2022 13:29:02 +0300 MHD_str_quote(): optimized for typical scenario Diffstat:
| M | src/microhttpd/mhd_str.c | | | 42 | +++++++++++++++++++++++++++++++----------- |
1 file changed, 31 insertions(+), 11 deletions(-)
diff --git a/src/microhttpd/mhd_str.c b/src/microhttpd/mhd_str.c @@ -1489,25 +1489,45 @@ MHD_str_quote (const char *unquoted, r = 0; w = 0; - if (unquoted_len > buf_size) - return 0; /* The output buffer is too small */ - - while (unquoted_len > r) +#ifndef MHD_FAVOR_SMALL_CODE + if (unquoted_len * 2 <= buf_size) { - if (buf_size <= w) - return 0; /* The output buffer is too small */ - else + /* Fast loop: the output will fit the buffer with any input string content */ + while (unquoted_len > r) { const char chr = unquoted[r++]; if (('\\' == chr) || ('\"' == chr)) - { result[w++] = '\\'; /* Escape current char */ - if (buf_size <= w) - return 0; /* The output buffer is too small */ - } result[w++] = chr; } } + else + { + if (unquoted_len > buf_size) + return 0; /* Quick fail: the output buffer is too small */ +#else /* MHD_FAVOR_SMALL_CODE */ + if (1) + { +#endif /* MHD_FAVOR_SMALL_CODE */ + + while (unquoted_len > r) + { + if (buf_size <= w) + return 0; /* The output buffer is too small */ + else + { + const char chr = unquoted[r++]; + if (('\\' == chr) || ('\"' == chr)) + { + result[w++] = '\\'; /* Escape current char */ + if (buf_size <= w) + return 0; /* The output buffer is too small */ + } + result[w++] = chr; + } + } + } + mhd_assert (w >= r); mhd_assert (w <= r * 2); return w;