/*
  This file is part of libmicrohttpd
  Copyright (C) 2015-2022 Karlson2k (Evgeny Grin)

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*/

/**
 * @file microhttpd/mhd_str.h
 * @brief  Header for string manipulating helpers
 * @author Karlson2k (Evgeny Grin)
 */

#ifndef MHD_STR_H
#define MHD_STR_H 1

#include "mhd_options.h"
#include <stdint.h>
#ifdef HAVE_STDDEF_H
#include <stddef.h>
#endif /* HAVE_STDDEF_H */
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif /* HAVE_SYS_TYPES_H */
#ifdef HAVE_STDBOOL_H
#include <stdbool.h>
#endif /* HAVE_STDBOOL_H */

#include "mhd_str_types.h"

#if defined(_MSC_FULL_VER) && ! defined(_SSIZE_T_DEFINED)
#define _SSIZE_T_DEFINED
typedef intptr_t ssize_t;
#endif /* !_SSIZE_T_DEFINED */

#ifdef MHD_FAVOR_SMALL_CODE
#include "mhd_limits.h"
#endif /* MHD_FAVOR_SMALL_CODE */

/*
 * Block of functions/macros that use US-ASCII charset as required by HTTP
 * standards. Not affected by current locale settings.
 */

#ifndef MHD_FAVOR_SMALL_CODE
/**
 * Check two strings for equality, ignoring case of US-ASCII letters.
 *
 * @param str1 first string to compare
 * @param str2 second string to compare
 * @return non-zero if two strings are equal, zero otherwise.
 */
int
MHD_str_equal_caseless_ (const char *str1,
                         const char *str2);

#else  /* MHD_FAVOR_SMALL_CODE */
/* Reuse MHD_str_equal_caseless_n_() to reduce size */
#define MHD_str_equal_caseless_(s1,s2) MHD_str_equal_caseless_n_ ((s1),(s2), \
                                                                  SIZE_MAX)
#endif /* MHD_FAVOR_SMALL_CODE */


/**
 * Check two string for equality, ignoring case of US-ASCII letters and
 * checking not more than @a maxlen characters.
 * Compares up to first terminating null character, but not more than
 * first @a maxlen characters.
 * @param str1 first string to compare
 * @param str2 second string to compare
 * @param maxlen maximum number of characters to compare
 * @return non-zero if two strings are equal, zero otherwise.
 */
int
MHD_str_equal_caseless_n_ (const char *const str1,
                           const char *const str2,
                           size_t maxlen);


/**
 * Check two string for equality, ignoring case of US-ASCII letters and
 * checking not more than @a len bytes.
 * Compares not more first than @a len bytes, including binary zero characters.
 * Comparison stops at first unmatched byte.
 * @param str1 first string to compare
 * @param str2 second string to compare
 * @param len number of characters to compare
 * @return non-zero if @a len bytes are equal, zero otherwise.
 */
bool
MHD_str_equal_caseless_bin_n_ (const char *const str1,
                               const char *const str2,
                               size_t len);


/**
 * Check whether string is equal statically allocated another string,
 * ignoring case of US-ASCII letters and checking not more than @a len bytes.
 *
 * If strings have different sizes (lengths) then macro returns boolean false
 * without checking the content.
 *
 * Compares not more first than @a len bytes, including binary zero characters.
 * Comparison stops at first unmatched byte.
 * @param a the statically allocated string to compare
 * @param s the string to compare
 * @param len number of characters to compare
 * @return non-zero if @a len bytes are equal, zero otherwise.
 */
#define MHD_str_equal_caseless_s_bin_n_(a,s,l) \
  ((MHD_STATICSTR_LEN_(a) == (l)) \
   && MHD_str_equal_caseless_bin_n_(a,s,l))

/**
 * Check whether @a str has case-insensitive @a token.
 * Token could be surrounded by spaces and tabs and delimited by comma.
 * Match succeed if substring between start, end (of string) or comma
 * contains only case-insensitive token and optional spaces and tabs.
 * @warning token must not contain null-characters except optional
 *          terminating null-character.
 * @param str the string to check
 * @param token the token to find
 * @param token_len length of token, not including optional terminating
 *                  null-character.
 * @return non-zero if two strings are equal, zero otherwise.
 */
bool
MHD_str_has_token_caseless_ (const char *str,
                             const char *const token,
                             size_t token_len);

/**
 * Check whether @a str has case-insensitive static @a tkn.
 * Token could be surrounded by spaces and tabs and delimited by comma.
 * Match succeed if substring between start, end of string or comma
 * contains only case-insensitive token and optional spaces and tabs.
 * @warning tkn must be static string
 * @param str the string to check
 * @param tkn the static string of token to find
 * @return non-zero if two strings are equal, zero otherwise.
 */
#define MHD_str_has_s_token_caseless_(str,tkn) \
  MHD_str_has_token_caseless_ ((str),(tkn),MHD_STATICSTR_LEN_ (tkn))


/**
 * Remove case-insensitive @a token from the @a str and put result
 * to the output @a buf.
 *
 * Tokens in @a str could be surrounded by spaces and tabs and delimited by
 * comma. The token match succeed if substring between start, end (of string)
 * or comma contains only case-insensitive token and optional spaces and tabs.
 * The quoted strings and comments are not supported by this function.
 *
 * The output string is normalised: empty tokens and repeated whitespaces
 * are removed, no whitespaces before commas, exactly one space is used after
 * each comma.
 *
 * @param str the string to process
 * @param str_len the length of the @a str, not including optional
 *                terminating null-character.
 * @param token the token to find
 * @param token_len the length of @a token, not including optional
 *                  terminating null-character.
 * @param[out] buf the output buffer, not null-terminated.
 * @param[in,out] buf_size pointer to the size variable, at input it
 *                         is the size of allocated buffer, at output
 *                         it is the size of the resulting string (can
 *                         be up to 50% larger than input) or negative value
 *                         if there is not enough space for the result
 * @return 'true' if token has been removed,
 *         'false' otherwise.
 */
bool
MHD_str_remove_token_caseless_ (const char *str,
                                size_t str_len,
                                const char *const token,
                                const size_t token_len,
                                char *buf,
                                ssize_t *buf_size);


/**
 * Perform in-place case-insensitive removal of @a tokens from the @a str.
 *
 * Token could be surrounded by spaces and tabs and delimited by comma.
 * The token match succeed if substring between start, end (of the string), or
 * comma contains only case-insensitive token and optional spaces and tabs.
 * The quoted strings and comments are not supported by this function.
 *
 * The input string must be normalised: empty tokens and repeated whitespaces
 * are removed, no whitespaces before commas, exactly one space is used after
 * each comma. The string is updated in-place.
 *
 * Behavior is undefined is the input string in not normalised.
 *
 * @param[in,out] str the string to update
 * @param[in,out] str_len the length of the @a str, not including optional
 *                        terminating null-character, not null-terminated
 * @param tokens the token to find
 * @param tokens_len the length of @a tokens, not including optional
 *                   terminating null-character.
 * @return 'true' if any token has been removed,
 *         'false' otherwise.
 */
bool
MHD_str_remove_tokens_caseless_ (char *str,
                                 size_t *str_len,
                                 const char *const tokens,
                                 const size_t tokens_len);


#ifndef MHD_FAVOR_SMALL_CODE
/* Use individual function for each case to improve speed */

/**
 * Convert decimal US-ASCII digits in string to number in uint64_t.
 * Conversion stopped at first non-digit character.
 *
 * @param str string to convert
 * @param[out] out_val pointer to uint64_t to store result of conversion
 * @return non-zero number of characters processed on succeed,
 *         zero if no digit is found, resulting value is larger
 *         then possible to store in uint64_t or @a out_val is NULL
 */
size_t
MHD_str_to_uint64_ (const char *str,
                    uint64_t *out_val);

/**
 * Convert not more then @a maxlen decimal US-ASCII digits in string to
 * number in uint64_t.
 * Conversion stopped at first non-digit character or after @a maxlen
 * digits.
 *
 * @param str string to convert
 * @param maxlen maximum number of characters to process
 * @param[out] out_val pointer to uint64_t to store result of conversion
 * @return non-zero number of characters processed on succeed,
 *         zero if no digit is found, resulting value is larger
 *         then possible to store in uint64_t or @a out_val is NULL
 */
size_t
MHD_str_to_uint64_n_ (const char *str,
                      size_t maxlen,
                      uint64_t *out_val);


/**
 * Convert hexadecimal US-ASCII digits in string to number in uint32_t.
 * Conversion stopped at first non-digit character.
 *
 * @param str string to convert
 * @param[out] out_val pointer to uint32_t to store result of conversion
 * @return non-zero number of characters processed on succeed,
 *         zero if no digit is found, resulting value is larger
 *         then possible to store in uint32_t or @a out_val is NULL
 */
size_t
MHD_strx_to_uint32_ (const char *str,
                     uint32_t *out_val);


/**
 * Convert not more then @a maxlen hexadecimal US-ASCII digits in string
 * to number in uint32_t.
 * Conversion stopped at first non-digit character or after @a maxlen
 * digits.
 *
 * @param str string to convert
 * @param maxlen maximum number of characters to process
 * @param[out] out_val pointer to uint32_t to store result of conversion
 * @return non-zero number of characters processed on succeed,
 *         zero if no digit is found, resulting value is larger
 *         then possible to store in uint32_t or @a out_val is NULL
 */
size_t
MHD_strx_to_uint32_n_ (const char *str,
                       size_t maxlen,
                       uint32_t *out_val);


/**
 * Convert hexadecimal US-ASCII digits in string to number in uint64_t.
 * Conversion stopped at first non-digit character.
 *
 * @param str string to convert
 * @param[out] out_val pointer to uint64_t to store result of conversion
 * @return non-zero number of characters processed on succeed,
 *         zero if no digit is found, resulting value is larger
 *         then possible to store in uint64_t or @a out_val is NULL
 */
size_t
MHD_strx_to_uint64_ (const char *str,
                     uint64_t *out_val);


/**
 * Convert not more then @a maxlen hexadecimal US-ASCII digits in string
 * to number in uint64_t.
 * Conversion stopped at first non-digit character or after @a maxlen
 * digits.
 *
 * @param str string to convert
 * @param maxlen maximum number of characters to process
 * @param[out] out_val pointer to uint64_t to store result of conversion
 * @return non-zero number of characters processed on succeed,
 *         zero if no digit is found, resulting value is larger
 *         then possible to store in uint64_t or @a out_val is NULL
 */
size_t
MHD_strx_to_uint64_n_ (const char *str,
                       size_t maxlen,
                       uint64_t *out_val);

#else  /* MHD_FAVOR_SMALL_CODE */
/* Use one universal function and macros to reduce size */

/**
 * Generic function for converting not more then @a maxlen
 * hexadecimal or decimal US-ASCII digits in string to number.
 * Conversion stopped at first non-digit character or after @a maxlen
 * digits.
 * To be used only within macro.
 *
 * @param str the string to convert
 * @param maxlen the maximum number of characters to process
 * @param out_val the pointer to variable to store result of conversion
 * @param val_size the size of variable pointed by @a out_val, in bytes, 4 or 8
 * @param max_val the maximum decoded number
 * @param base the numeric base, 10 or 16
 * @return non-zero number of characters processed on succeed,
 *         zero if no digit is found, resulting value is larger
 *         then @a max_val, @a val_size is not 4/8 or @a out_val is NULL
 */
size_t
MHD_str_to_uvalue_n_ (const char *str,
                      size_t maxlen,
                      void *out_val,
                      size_t val_size,
                      uint64_t max_val,
                      unsigned int base);

#define MHD_str_to_uint64_(s,ov) MHD_str_to_uvalue_n_ ((s),SIZE_MAX,(ov), \
                                                       sizeof(uint64_t), \
                                                       UINT64_MAX,10)

#define MHD_str_to_uint64_n_(s,ml,ov) MHD_str_to_uvalue_n_ ((s),(ml),(ov), \
                                                            sizeof(uint64_t), \
                                                            UINT64_MAX,10)

#define MHD_strx_to_sizet_(s,ov) MHD_str_to_uvalue_n_ ((s),SIZE_MAX,(ov), \
                                                       sizeof(size_t),SIZE_MAX, \
                                                       16)

#define MHD_strx_to_sizet_n_(s,ml,ov) MHD_str_to_uvalue_n_ ((s),(ml),(ov), \
                                                            sizeof(size_t), \
                                                            SIZE_MAX,16)

#define MHD_strx_to_uint32_(s,ov) MHD_str_to_uvalue_n_ ((s),SIZE_MAX,(ov), \
                                                        sizeof(uint32_t), \
                                                        UINT32_MAX,16)

#define MHD_strx_to_uint32_n_(s,ml,ov) MHD_str_to_uvalue_n_ ((s),(ml),(ov), \
                                                             sizeof(uint32_t), \
                                                             UINT32_MAX,16)

#define MHD_strx_to_uint64_(s,ov) MHD_str_to_uvalue_n_ ((s),SIZE_MAX,(ov), \
                                                        sizeof(uint64_t), \
                                                        UINT64_MAX,16)

#define MHD_strx_to_uint64_n_(s,ml,ov) MHD_str_to_uvalue_n_ ((s),(ml),(ov), \
                                                             sizeof(uint64_t), \
                                                             UINT64_MAX,16)

#endif /* MHD_FAVOR_SMALL_CODE */


/**
 * Convert uint32_t value to hexdecimal US-ASCII string.
 * @note: result is NOT zero-terminated.
 * @param val the value to convert
 * @param buf the buffer to result to
 * @param buf_size size of the @a buffer
 * @return number of characters has been put to the @a buf,
 *         zero if buffer is too small (buffer may be modified).
 */
size_t
MHD_uint32_to_strx (uint32_t val,
                    char *buf,
                    size_t buf_size);


#ifndef MHD_FAVOR_SMALL_CODE
/**
 * Convert uint16_t value to decimal US-ASCII string.
 * @note: result is NOT zero-terminated.
 * @param val the value to convert
 * @param buf the buffer to result to
 * @param buf_size size of the @a buffer
 * @return number of characters has been put to the @a buf,
 *         zero if buffer is too small (buffer may be modified).
 */
size_t
MHD_uint16_to_str (uint16_t val,
                   char *buf,
                   size_t buf_size);

#else  /* MHD_FAVOR_SMALL_CODE */
#define MHD_uint16_to_str(v,b,s) MHD_uint64_to_str(v,b,s)
#endif /* MHD_FAVOR_SMALL_CODE */


/**
 * Convert uint64_t value to decimal US-ASCII string.
 * @note: result is NOT zero-terminated.
 * @param val the value to convert
 * @param buf the buffer to result to
 * @param buf_size size of the @a buffer
 * @return number of characters has been put to the @a buf,
 *         zero if buffer is too small (buffer may be modified).
 */
size_t
MHD_uint64_to_str (uint64_t val,
                   char *buf,
                   size_t buf_size);


/**
 * Convert uint16_t value to decimal US-ASCII string padded with
 * zeros on the left side.
 *
 * @note: result is NOT zero-terminated.
 * @param val the value to convert
 * @param min_digits the minimal number of digits to print,
 *                   output padded with zeros on the left side,
 *                   'zero' value is interpreted as 'one',
 *                   valid values are 3, 2, 1, 0
 * @param buf the buffer to result to
 * @param buf_size size of the @a buffer
 * @return number of characters has been put to the @a buf,
 *         zero if buffer is too small (buffer may be modified).
 */
size_t
MHD_uint8_to_str_pad (uint8_t val,
                      uint8_t min_digits,
                      char *buf,
                      size_t buf_size);


/**
 * Convert @a size bytes from input binary data to lower case
 * hexadecimal digits.
 * Result is NOT zero-terminated
 * @param bin the pointer to the binary data to convert
 * @param size the size in bytes of the binary data to convert
 * @param[out] hex the output buffer, should be at least 2 * @a size
 * @return The number of characters written to the output buffer.
 */
size_t
MHD_bin_to_hex (const void *bin,
                size_t size,
                char *hex);

/**
 * Convert @a size bytes from input binary data to lower case
 * hexadecimal digits, zero-terminate the result.
 * @param bin the pointer to the binary data to convert
 * @param size the size in bytes of the binary data to convert
 * @param[out] hex the output buffer, should be at least 2 * @a size + 1
 * @return The number of characters written to the output buffer,
 *         not including terminating zero.
 */
size_t
MHD_bin_to_hex_z (const void *bin,
                  size_t size,
                  char *hex);

/**
 * Convert hexadecimal digits to binary data.
 *
 * The input decoded byte-by-byte (each byte is two hexadecimal digits).
 * If length is an odd number, extra leading zero is assumed.
 *
 * @param hex the input string with hexadecimal digits
 * @param len the length of the input string
 * @param[out] bin the output buffer, must be at least len/2 bytes long (or
 *                 len/2 + 1 if @a len is not even number)
 * @return the number of bytes written to the output buffer,
 *         zero if found any character which is not hexadecimal digits
 */
size_t
MHD_hex_to_bin (const char *hex,
                size_t len,
                void *bin);

/**
 * Decode string with percent-encoded characters as defined by
 * RFC 3986 #section-2.1.
 *
 * This function decode string by converting percent-encoded characters to
 * their decoded versions and copying all other characters without extra
 * processing.
 *
 * @param pct_encoded the input string to be decoded
 * @param pct_encoded_len the length of the @a pct_encoded
 * @param[out] decoded the output buffer, NOT zero-terminated, can point
 *                     to the same buffer as @a pct_encoded
 * @param buf_size the size of the output buffer
 * @return the number of characters written to the output buffer or
 *         zero if any percent-encoded characters is broken ('%' followed
 *         by less than two hexadecimal digits) or output buffer is too
 *         small to hold the result
 */
size_t
MHD_str_pct_decode_strict_n_ (const char *pct_encoded,
                              size_t pct_encoded_len,
                              char *decoded,
                              size_t buf_size);

/**
 * Decode string with percent-encoded characters as defined by
 * RFC 3986 #section-2.1.
 *
 * This function decode string by converting percent-encoded characters to
 * their decoded versions and copying all other characters without extra
 * processing.
 *
 * Any invalid percent-encoding sequences ('%' symbol not followed by two
 * valid hexadecimal digits) are copied to the output string without decoding.
 *
 * @param pct_encoded the input string to be decoded
 * @param pct_encoded_len the length of the @a pct_encoded
 * @param[out] decoded the output buffer, NOT zero-terminated, can point
 *                     to the same buffer as @a pct_encoded
 * @param buf_size the size of the output buffer
 * @param[out] broken_encoding will be set to true if any '%' symbol is not
 *                             followed by two valid hexadecimal digits,
 *                             optional, can be NULL
 * @return the number of characters written to the output buffer or
 *         zero if output buffer is too small to hold the result
 */
size_t
MHD_str_pct_decode_lenient_n_ (const char *pct_encoded,
                               size_t pct_encoded_len,
                               char *decoded,
                               size_t buf_size,
                               bool *broken_encoding);


/**
 * Decode string in-place with percent-encoded characters as defined by
 * RFC 3986 #section-2.1.
 *
 * This function decode string by converting percent-encoded characters to
 * their decoded versions and copying back all other characters without extra
 * processing.
 *
 * @param[in,out] str the string to be updated in-place, must be zero-terminated
 *                    on input, the output is zero-terminated; the string is
 *                    truncated to zero length if broken encoding is found
 * @return the number of character in decoded string
 */
size_t
MHD_str_pct_decode_in_place_strict_ (char *str);


/**
 * Decode string in-place with percent-encoded characters as defined by
 * RFC 3986 #section-2.1.
 *
 * This function decode string by converting percent-encoded characters to
 * their decoded versions and copying back all other characters without extra
 * processing.
 *
 * Any invalid percent-encoding sequences ('%' symbol not followed by two
 * valid hexadecimal digits) are copied to the output string without decoding.
 *
 * @param[in,out] str the string to be updated in-place, must be zero-terminated
 *                    on input, the output is zero-terminated
 * @param[out] broken_encoding will be set to true if any '%' symbol is not
 *                             followed by two valid hexadecimal digits,
 *                             optional, can be NULL
 * @return the number of character in decoded string
 */
size_t
MHD_str_pct_decode_in_place_lenient_ (char *str,
                                      bool *broken_encoding);

#ifdef DAUTH_SUPPORT
/**
 * Check two strings for equality, "unquoting" the first string from quoted
 * form as specified by RFC7230#section-3.2.6 and RFC7694#quoted.strings.
 *
 * Null-termination for input strings is not required, binary zeros compared
 * like other characters.
 *
 * @param quoted the quoted string to compare, must NOT include leading and
 *               closing DQUOTE chars, does not need to be zero-terminated
 * @param quoted_len the length in chars of the @a quoted string
 * @param unquoted the unquoted string to compare, does not need to be
 *                 zero-terminated
 * @param unquoted_len the length in chars of the @a unquoted string
 * @return zero if quoted form is broken (no character after the last escaping
 *         backslash), zero if strings are not equal after unquoting of the
 *         first string,
 *         non-zero if two strings are equal after unquoting of the
 *         first string.
 */
bool
MHD_str_equal_quoted_bin_n (const char *quoted,
                            size_t quoted_len,
                            const char *unquoted,
                            size_t unquoted_len);

/**
 * Check whether the string after "unquoting" equals static string.
 *
 * Null-termination for input string is not required, binary zeros compared
 * like other characters.
 *
 * @param q the quoted string to compare, must NOT include leading and
 *          closing DQUOTE chars, does not need to be zero-terminated
 * @param l the length in chars of the @a q string
 * @param u the unquoted static string to compare
 * @return zero if quoted form is broken (no character after the last escaping
 *         backslash), zero if strings are not equal after unquoting of the
 *         first string,
 *         non-zero if two strings are equal after unquoting of the
 *         first string.
 */
#define MHD_str_equal_quoted_s_bin_n(q,l,u) \
    MHD_str_equal_quoted_bin_n(q,l,u,MHD_STATICSTR_LEN_(u))

/**
 * Check two strings for equality, "unquoting" the first string from quoted
 * form as specified by RFC7230#section-3.2.6 and RFC7694#quoted.strings and
 * ignoring case of US-ASCII letters.
 *
 * Null-termination for input strings is not required, binary zeros compared
 * like other characters.
 *
 * @param quoted the quoted string to compare, must NOT include leading and
 *               closing DQUOTE chars, does not need to be zero-terminated
 * @param quoted_len the length in chars of the @a quoted string
 * @param unquoted the unquoted string to compare, does not need to be
 *                 zero-terminated
 * @param unquoted_len the length in chars of the @a unquoted string
 * @return zero if quoted form is broken (no character after the last escaping
 *         backslash), zero if strings are not equal after unquoting of the
 *         first string,
 *         non-zero if two strings are caseless equal after unquoting of the
 *         first string.
 */
bool
MHD_str_equal_caseless_quoted_bin_n (const char *quoted,
                                     size_t quoted_len,
                                     const char *unquoted,
                                     size_t unquoted_len);

/**
 * Check whether the string after "unquoting" equals static string, ignoring
 * case of US-ASCII letters.
 *
 * Null-termination for input string is not required, binary zeros compared
 * like other characters.
 *
 * @param q the quoted string to compare, must NOT include leading and
 *          closing DQUOTE chars, does not need to be zero-terminated
 * @param l the length in chars of the @a q string
 * @param u the unquoted static string to compare
 * @return zero if quoted form is broken (no character after the last escaping
 *         backslash), zero if strings are not equal after unquoting of the
 *         first string,
 *         non-zero if two strings are caseless equal after unquoting of the
 *         first string.
 */
#define MHD_str_equal_caseless_quoted_s_bin_n(q,l,u) \
    MHD_str_equal_caseless_quoted_bin_n(q,l,u,MHD_STATICSTR_LEN_(u))

/**
 * Convert string from quoted to unquoted form as specified by
 * RFC7230#section-3.2.6 and RFC7694#quoted.strings.
 *
 * @param quoted the quoted string, must NOT include leading and closing
 *               DQUOTE chars, does not need to be zero-terminated
 * @param quoted_len the length in chars of the @a quoted string
 * @param[out] result the pointer to the buffer to put the result, must
 *                    be at least @a size character long. May be modified even
 *                    if @a quoted is invalid sequence. The result is NOT
 *                    zero-terminated.
 * @return The number of characters written to the output buffer,
 *         zero if last backslash is not followed by any character (or
 *         @a quoted_len is zero).
 */
size_t
MHD_str_unquote (const char *quoted,
                 size_t quoted_len,
                 char *result);

#endif /* DAUTH_SUPPORT */

#if defined(DAUTH_SUPPORT) || defined(BAUTH_SUPPORT)

/**
 * Convert string from unquoted to quoted form as specified by
 * RFC7230#section-3.2.6 and RFC7694#quoted.strings.
 *
 * @param unquoted the unquoted string, does not need to be zero-terminated
 * @param unquoted_len the length in chars of the @a unquoted string
 * @param[out] result the pointer to the buffer to put the result. May be
 *                    modified even if function failed due to insufficient
 *                    space. The result is NOT zero-terminated and does not
 *                    have opening and closing DQUOTE chars.
 * @param buf_size the size of the allocated memory for @a result
 * @return The number of copied characters, can be up to two times more than
 *         @a unquoted_len, zero if @a unquoted_len is zero or if quoted
 *         string is larger than @a buf_size.
 */
size_t
MHD_str_quote (const char *unquoted,
               size_t unquoted_len,
               char *result,
               size_t buf_size);

#endif /* DAUTH_SUPPORT || BAUTH_SUPPORT */

#ifdef BAUTH_SUPPORT

/**
 * Returns the maximum possible size of the Base64 decoded data.
 * The real recoded size could be up to two bytes smaller.
 * @param enc_size the size of encoded data, in characters
 * @return the maximum possible size of the decoded data, in bytes, if
 *         @a enc_size is valid (properly padded),
 *         undefined value smaller then @a enc_size if @a enc_size is not valid
 */
#define MHD_base64_max_dec_size_(enc_size) (((enc_size) / 4) * 3)

/**
 * Convert Base64 encoded string to binary data.
 * @param base64 the input string with Base64 encoded data, could be NOT zero
 *               terminated
 * @param base64_len the number of characters to decode in @a base64 string,
 *                   valid number must be a multiple of four
 * @param[out] bin the pointer to the output buffer, the buffer may be altered
 *                 even if decoding failed
 * @param bin_size the size of the @a bin buffer in bytes, if the size is
 *                 at least @a base64_len / 4 * 3 then result will always
 *                 fit, regardless of the amount of the padding characters
 * @return 0 if @a base64_len is zero, or input string has wrong data (not
 *         valid Base64 sequence), or @a bin_size is too small;
 *         non-zero number of bytes written to the @a bin, the number must be
 *         (base64_len / 4 * 3 - 2), (base64_len / 4 * 3 - 1) or
 *         (base64_len / 4 * 3), depending on the number of padding characters.
 */
size_t
MHD_base64_to_bin_n (const char *base64,
                     size_t base64_len,
                     void *bin,
                     size_t bin_size);

#endif /* BAUTH_SUPPORT */

#endif /* MHD_STR_H */
