From bde583e6474553c8e86d1286b82ac3bbb04c0fee Mon Sep 17 00:00:00 2001 From: "Evgeny Grin (Karlson2k)" Date: Tue, 7 Jun 2022 13:29:02 +0300 Subject: MHD_str_quote(): optimized for typical scenario --- src/microhttpd/mhd_str.c | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) (limited to 'src/microhttpd/mhd_str.c') diff --git a/src/microhttpd/mhd_str.c b/src/microhttpd/mhd_str.c index f8e1965f..d3d8c594 100644 --- 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; -- cgit v1.2.3