/*
  This file is part of libmicrohttpd
  Copyright (C) 2016 Karlson2k (Evgeny Grin)

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

  This test tool 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/unit_str_test.h
 * @brief  Unit tests for mhd_str functions
 * @author Karlson2k (Evgeny Grin)
 */

#include "mhd_options.h"
#include <stdio.h>
#include <locale.h>
#include <string.h>
#ifdef HAVE_INTTYPES_H
#include <inttypes.h>
#else  /* ! HAVE_INTTYPES_H */
#define PRIu64  "llu"
#define PRIuPTR "u"
#define PRIX64 "llX"
#endif /* ! HAVE_INTTYPES_H */
#include <stdint.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif /* HAVE_STDLIB_H */
#include "mhd_limits.h"
#include "mhd_str.h"
#include "test_helpers.h"


static int verbose = 0; /* verbose level (0-3)*/

/* Locale names to test.
 * Functions must not depend of current current locale,
 * so result must be the same in any locale.
 */
static const char *const locale_names[] = {
  "C",
  "",        /* System default locale */
#if defined(_WIN32) && ! defined(__CYGWIN__)
  ".OCP",    /* W32 system default OEM code page */
  ".ACP",    /* W32 system default ANSI code page */
  ".65001",  /* UTF-8 */
  ".437",
  ".850",
  ".857",
  ".866",
  ".1250",
  ".1251",
  ".1252",
  ".1254",
  ".20866",   /* number for KOI8-R */
  ".28591",   /* number for ISO-8859-1 */
  ".28595",   /* number for ISO-8859-5 */
  ".28599",   /* number for ISO-8859-9 */
  ".28605",   /* number for ISO-8859-15 */
  "en",
  "english",
  "en-US",
  "English-US",
  "en-US.437",
  "English_United States.437",
  "en-US.1252",
  "English_United States.1252",
  "English_United States.28591",
  "English_United States.65001",
  "fra",
  "french",
  "fr-FR",
  "French_France",
  "fr-FR.850",
  "french_france.850",
  "fr-FR.1252",
  "French_france.1252",
  "French_france.28605",
  "French_France.65001",
  "de",
  "de-DE",
  "de-DE.850",
  "German_Germany.850",
  "German_Germany.1250",
  "de-DE.1252",
  "German_Germany.1252",
  "German_Germany.28605",
  "German_Germany.65001",
  "tr",
  "trk",
  "turkish",
  "tr-TR",
  "tr-TR.1254",
  "Turkish_Turkey.1254",
  "tr-TR.857",
  "Turkish_Turkey.857",
  "Turkish_Turkey.28599",
  "Turkish_Turkey.65001",
  "ru",
  "ru-RU",
  "Russian",
  "ru-RU.866",
  "Russian_Russia.866",
  "ru-RU.1251",
  "Russian_Russia.1251",
  "Russian_Russia.20866",
  "Russian_Russia.28595",
  "Russian_Russia.65001",
  "zh-Hans",
  "zh-Hans.936",
  "chinese-simplified"
#else /* ! _WIN32 || __CYGWIN__ */
  "C.UTF-8",
  "POSIX",
  "en",
  "en_US",
  "en_US.ISO-8859-1",
  "en_US.ISO_8859-1",
  "en_US.ISO8859-1",
  "en_US.iso88591",
  "en_US.ISO-8859-15",
  "en_US.DIS_8859-15",
  "en_US.ISO8859-15",
  "en_US.iso885915",
  "en_US.1252",
  "en_US.CP1252",
  "en_US.UTF-8",
  "en_US.utf8",
  "fr",
  "fr_FR",
  "fr_FR.850",
  "fr_FR.IBM850",
  "fr_FR.1252",
  "fr_FR.CP1252",
  "fr_FR.ISO-8859-1",
  "fr_FR.ISO_8859-1",
  "fr_FR.ISO8859-1",
  "fr_FR.iso88591",
  "fr_FR.ISO-8859-15",
  "fr_FR.DIS_8859-15",
  "fr_FR.ISO8859-15",
  "fr_FR.iso8859-15",
  "fr_FR.UTF-8",
  "fr_FR.utf8",
  "de",
  "de_DE",
  "de_DE.850",
  "de_DE.IBM850",
  "de_DE.1250",
  "de_DE.CP1250",
  "de_DE.1252",
  "de_DE.CP1252",
  "de_DE.ISO-8859-1",
  "de_DE.ISO_8859-1",
  "de_DE.ISO8859-1",
  "de_DE.iso88591",
  "de_DE.ISO-8859-15",
  "de_DE.DIS_8859-15",
  "de_DE.ISO8859-15",
  "de_DE.iso885915",
  "de_DE.UTF-8",
  "de_DE.utf8",
  "tr",
  "tr_TR",
  "tr_TR.1254",
  "tr_TR.CP1254",
  "tr_TR.857",
  "tr_TR.IBM857",
  "tr_TR.ISO-8859-9",
  "tr_TR.ISO8859-9",
  "tr_TR.iso88599",
  "tr_TR.UTF-8",
  "tr_TR.utf8",
  "ru",
  "ru_RU",
  "ru_RU.1251",
  "ru_RU.CP1251",
  "ru_RU.866",
  "ru_RU.IBM866",
  "ru_RU.KOI8-R",
  "ru_RU.koi8-r",
  "ru_RU.KOI8-RU",
  "ru_RU.ISO-8859-5",
  "ru_RU.ISO_8859-5",
  "ru_RU.ISO8859-5",
  "ru_RU.iso88595",
  "ru_RU.UTF-8",
  "zh_CN",
  "zh_CN.GB2312",
  "zh_CN.UTF-8",
#endif /* ! _WIN32 || __CYGWIN__ */
};

static const unsigned int locale_name_count = sizeof(locale_names)
                                              / sizeof(locale_names[0]);


/*
 *  Helper functions
 */

static int
set_test_locale (size_t num)
{
  if (num >= locale_name_count)
  {
    fprintf (stderr, "Unexpected number of locale.\n");
    exit (99);
  }
  if (verbose > 2)
    printf ("Setting locale \"%s\":", locale_names[num]);
  if (setlocale (LC_ALL, locale_names[num]))
  {
    if (verbose > 2)
      printf (" succeed.\n");
    return 1;
  }
  if (verbose > 2)
    printf (" failed.\n");
  return 0;
}


static const char *
get_current_locale_str (void)
{
  char const *loc_str = setlocale (LC_ALL, NULL);
  return loc_str ? loc_str : "unknown";
}


static char tmp_bufs[4][4 * 1024]; /* should be enough for testing */
static size_t buf_idx = 0;

/* print non-printable chars as char codes */
static char *
n_prnt (const char *str)
{
  static char *buf;  /* should be enough for testing */
  static const size_t buf_size = sizeof(tmp_bufs[0]);
  const unsigned char *p = (const unsigned char *) str;
  size_t w_pos = 0;
  if (++buf_idx > 3)
    buf_idx = 0;
  buf = tmp_bufs[buf_idx];

  while (*p && w_pos + 1 < buf_size)
  {
    const unsigned char c = *p;
    if ((c == '\\') || (c == '"') )
    {
      if (w_pos + 2 >= buf_size)
        break;
      buf[w_pos++] = '\\';
      buf[w_pos++] = (char) c;
    }
    else if ((c >= 0x20) && (c <= 0x7E) )
      buf[w_pos++] = (char) c;
    else
    {
      if (w_pos + 4 >= buf_size)
        break;
      if (snprintf (buf + w_pos, buf_size - w_pos, "\\x%02hX", (short unsigned
                                                                int) c) != 4)
        break;
      w_pos += 4;
    }
    p++;
  }
  if (*p)
  {   /* not full string is printed */
      /* enough space for "..." ? */
    if (w_pos + 3 > buf_size)
      w_pos = buf_size - 4;
    buf[w_pos++] = '.';
    buf[w_pos++] = '.';
    buf[w_pos++] = '.';
  }
  buf[w_pos] = 0;
  return buf;
}


struct str_with_len
{
  const char *const str;
  const size_t len;
};

#define D_STR_W_LEN(s) {(s), (sizeof((s)) / sizeof(char)) - 1}

/*
 * String caseless equality functions tests
 */

struct two_eq_strs
{
  const struct str_with_len s1;
  const struct str_with_len s2;
};

static const struct two_eq_strs eq_strings[] = {
  {D_STR_W_LEN ("1234567890!@~%&$@#{}[]\\/!?`."),
   D_STR_W_LEN ("1234567890!@~%&$@#{}[]\\/!?`.")},
  {D_STR_W_LEN ("Simple string."), D_STR_W_LEN ("Simple string.")},
  {D_STR_W_LEN ("SIMPLE STRING."), D_STR_W_LEN ("SIMPLE STRING.")},
  {D_STR_W_LEN ("simple string."), D_STR_W_LEN ("simple string.")},
  {D_STR_W_LEN ("simple string."), D_STR_W_LEN ("Simple String.")},
  {D_STR_W_LEN ("sImPlE StRiNg."), D_STR_W_LEN ("SiMpLe sTrInG.")},
  {D_STR_W_LEN ("SIMPLE STRING."), D_STR_W_LEN ("simple string.")},
  {D_STR_W_LEN ("abcdefghijklmnopqrstuvwxyz"),
   D_STR_W_LEN ("abcdefghijklmnopqrstuvwxyz")},
  {D_STR_W_LEN ("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),
   D_STR_W_LEN ("ABCDEFGHIJKLMNOPQRSTUVWXYZ")},
  {D_STR_W_LEN ("abcdefghijklmnopqrstuvwxyz"),
   D_STR_W_LEN ("ABCDEFGHIJKLMNOPQRSTUVWXYZ")},
  {D_STR_W_LEN ("zyxwvutsrqponMLKJIHGFEDCBA"),
   D_STR_W_LEN ("ZYXWVUTSRQPONmlkjihgfedcba")},

  {D_STR_W_LEN ("Cha\x8cne pour le test."),
   D_STR_W_LEN ("Cha\x8cne pour le test.")},      /* "Chaîne pour le test." in CP850 */
  {D_STR_W_LEN ("cha\x8cne pOur Le TEst."),
   D_STR_W_LEN ("Cha\x8cne poUr Le teST.")},
  {D_STR_W_LEN ("Cha\xeene pour le test."),
   D_STR_W_LEN ("Cha\xeene pour le test.")},      /* "Chaîne pour le test." in CP1252/ISO-8859-1/ISO-8859-15 */
  {D_STR_W_LEN ("CHa\xeene POUR le test."),
   D_STR_W_LEN ("Cha\xeeNe pour lE TEST.")},
  {D_STR_W_LEN ("Cha\xc3\xaene pour le Test."),
   D_STR_W_LEN ("Cha\xc3\xaene pour le Test.")},  /* "Chaîne pour le test." in UTF-8 */
  {D_STR_W_LEN ("ChA\xc3\xaene pouR lE TesT."),
   D_STR_W_LEN ("Cha\xc3\xaeNe Pour le teSt.")},

  {D_STR_W_LEN (".Beispiel Zeichenfolge"),
   D_STR_W_LEN (".Beispiel Zeichenfolge")},
  {D_STR_W_LEN (".bEisPiel ZEIchenfoLgE"),
   D_STR_W_LEN (".BEiSpiEl zeIcheNfolge")},

  {D_STR_W_LEN ("Do\xa7rulama \x87izgi!"),
   D_STR_W_LEN ("Do\xa7rulama \x87izgi!")},       /* "Doğrulama çizgi!" in CP857 */
  {D_STR_W_LEN ("Do\xa7rulama \x87IzgI!"),        /* Spelling intentionally incorrect here */
   D_STR_W_LEN ("Do\xa7rulama \x87izgi!")},       /* Note: 'i' is not caseless equal to 'I' in Turkish */
  {D_STR_W_LEN ("Do\xf0rulama \xe7izgi!"),
   D_STR_W_LEN ("Do\xf0rulama \xe7izgi!")},       /* "Doğrulama çizgi!" in CP1254/ISO-8859-9 */
  {D_STR_W_LEN ("Do\xf0rulamA \xe7Izgi!"),
   D_STR_W_LEN ("do\xf0rulama \xe7izgi!")},
  {D_STR_W_LEN ("Do\xc4\x9frulama \xc3\xa7izgi!"),
   D_STR_W_LEN ("Do\xc4\x9frulama \xc3\xa7izgi!")},         /* "Doğrulama çizgi!" in UTF-8 */
  {D_STR_W_LEN ("do\xc4\x9fruLAMA \xc3\xa7Izgi!"),          /* Spelling intentionally incorrect here */
   D_STR_W_LEN ("DO\xc4\x9frulama \xc3\xa7izgI!")},         /* Spelling intentionally incorrect here */

  {D_STR_W_LEN ("\x92\xa5\xe1\xe2\xae\xa2\xa0\xef \x91\xe2\xe0\xae\xaa\xa0."),
   D_STR_W_LEN ("\x92\xa5\xe1\xe2\xae\xa2\xa0\xef \x91\xe2\xe0\xae\xaa\xa0.")},  /* "Тестовая Строка." in CP866 */
  {D_STR_W_LEN ("\xd2\xe5\xf1\xf2\xee\xe2\xe0\xff \xd1\xf2\xf0\xee\xea\xe0."),
   D_STR_W_LEN ("\xd2\xe5\xf1\xf2\xee\xe2\xe0\xff \xd1\xf2\xf0\xee\xea\xe0.")},  /* "Тестовая Строка." in CP1251 */
  {D_STR_W_LEN ("\xf4\xc5\xd3\xd4\xcf\xd7\xc1\xd1 \xf3\xd4\xd2\xcf\xcb\xc1."),
   D_STR_W_LEN ("\xf4\xc5\xd3\xd4\xcf\xd7\xc1\xd1 \xf3\xd4\xd2\xcf\xcb\xc1.")},  /* "Тестовая Строка." in KOI8-R */
  {D_STR_W_LEN ("\xc2\xd5\xe1\xe2\xde\xd2\xd0\xef \xc1\xe2\xe0\xde\xda\xd0."),
   D_STR_W_LEN ("\xc2\xd5\xe1\xe2\xde\xd2\xd0\xef \xc1\xe2\xe0\xde\xda\xd0.")},  /* "Тестовая Строка." in ISO-8859-5 */
  {D_STR_W_LEN ("\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82\xd0\xbe\xd0\xb2\xd0\xb0\xd1"
                "\x8f \xd0\xa1\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0."),
   D_STR_W_LEN ("\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82\xd0\xbe\xd0\xb2\xd0\xb0\xd1"
                "\x8f \xd0\xa1\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0.")},      /* "Тестовая Строка." in UTF-8 */

  {D_STR_W_LEN (
     "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
     "\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@[\\]"
     "^_`{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
     "\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4"
     "\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8"
     "\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc"
     "\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
     "\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4"
     "\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"),
   D_STR_W_LEN (
     "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
     "\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@[\\]"
     "^_`{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
     "\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4"
     "\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8"
     "\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc"
     "\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
     "\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4"
     "\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff")},             /* Full sequence without a-z */
  {D_STR_W_LEN (
     "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
     "\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@AB"
     "CDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83"
     "\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97"
     "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab"
     "\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
     "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3"
     "\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
     "\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb"
     "\xfc\xfd\xfe\xff"),
   D_STR_W_LEN (
     "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
     "\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@AB"
     "CDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83"
     "\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97"
     "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab"
     "\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
     "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3"
     "\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
     "\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb"
     "\xfc\xfd\xfe\xff")},             /* Full sequence */
  {D_STR_W_LEN (
     "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
     "\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@AB"
     "CDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89"
     "\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d"
     "\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1"
     "\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5"
     "\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9"
     "\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed"
     "\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"),
   D_STR_W_LEN (
     "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
     "\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ab"
     "cdefghijklmnopqrstuvwxyz[\\]^_`{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89"
     "\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d"
     "\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1"
     "\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5"
     "\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9"
     "\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed"
     "\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff")}             /* Full with A/a match */
};

struct two_neq_strs
{
  const struct str_with_len s1;
  const struct str_with_len s2;
  const size_t dif_pos;
};

static const struct two_neq_strs neq_strings[] = {
  {D_STR_W_LEN ("1234567890!@~%&$@#{}[]\\/!?`."),
   D_STR_W_LEN ("1234567890!@~%&$@#{}[]\\/!?`"), 27},
  {D_STR_W_LEN (".1234567890!@~%&$@#{}[]\\/!?`."),
   D_STR_W_LEN ("1234567890!@~%&$@#{}[]\\/!?`"), 0},
  {D_STR_W_LEN ("Simple string."), D_STR_W_LEN ("Simple ctring."), 7},
  {D_STR_W_LEN ("simple string."), D_STR_W_LEN ("simple string"), 13},
  {D_STR_W_LEN ("simple strings"), D_STR_W_LEN ("Simple String."), 13},
  {D_STR_W_LEN ("sImPlE StRiNg."), D_STR_W_LEN ("SYMpLe sTrInG."), 1},
  {D_STR_W_LEN ("SIMPLE STRING."), D_STR_W_LEN ("simple string.2"), 14},
  {D_STR_W_LEN ("abcdefghijklmnopqrstuvwxyz,"),
   D_STR_W_LEN ("abcdefghijklmnopqrstuvwxyz."), 26},
  {D_STR_W_LEN ("abcdefghijklmnopqrstuvwxyz!"),
   D_STR_W_LEN ("ABCDEFGHIJKLMNOPQRSTUVWXYZ?"), 26},
  {D_STR_W_LEN ("zyxwvutsrqponwMLKJIHGFEDCBA"),
   D_STR_W_LEN ("ZYXWVUTSRQPON%mlkjihgfedcba"), 13},

  {D_STR_W_LEN ("S\xbdur veulent plus d'\xbdufs."),         /* "Sœur veulent plus d'œufs." in ISO-8859-15 */
   D_STR_W_LEN ("S\xbcUR VEULENT PLUS D'\xbcUFS."), 1}, /* "SŒUR VEULENT PLUS D'ŒUFS." in ISO-8859-15 */
  {D_STR_W_LEN ("S\x9cur veulent plus d'\x9cufs."),         /* "Sœur veulent plus d'œufs." in CP1252 */
   D_STR_W_LEN ("S\x8cUR VEULENT PLUS D'\x8cUFS."), 1}, /* "SŒUR VEULENT PLUS D'ŒUFS." in CP1252 */
  {D_STR_W_LEN ("S\xc5\x93ur veulent plus d'\xc5\x93ufs."), /* "Sœur veulent plus d'œufs." in UTF-8 */
   D_STR_W_LEN ("S\xc5\x92UR VEULENT PLUS D'\xc5\x92UFS."), 2}, /* "SŒUR VEULENT PLUS D'ŒUFS." in UTF-8 */

  {D_STR_W_LEN ("Um ein sch\x94nes M\x84" "dchen zu k\x81ssen."),              /* "Um ein schönes Mädchen zu küssen." in CP850 */
   D_STR_W_LEN ("UM EIN SCH\x99NES M\x8e" "DCHEN ZU K\x9aSSEN."), 10}, /* "UM EIN SCHÖNES MÄDCHEN ZU KÜSSEN." in CP850 */
  {D_STR_W_LEN ("Um ein sch\xf6nes M\xe4" "dchen zu k\xfcssen."),              /* "Um ein schönes Mädchen zu küssen." in ISO-8859-1/ISO-8859-15/CP1250/CP1252 */
   D_STR_W_LEN ("UM EIN SCH\xd6NES M\xc4" "DCHEN ZU K\xdcSSEN."), 10}, /* "UM EIN SCHÖNES MÄDCHEN ZU KÜSSEN." in ISO-8859-1/ISO-8859-15/CP1250/CP1252 */
  {D_STR_W_LEN ("Um ein sch\xc3\xb6nes M\xc3\xa4" "dchen zu k\xc3\xbcssen."),  /* "Um ein schönes Mädchen zu küssen." in UTF-8 */
   D_STR_W_LEN ("UM EIN SCH\xc3\x96NES M\xc3\x84" "DCHEN ZU K\xc3\x9cSSEN."),
   11},                                                                        /* "UM EIN SCHÖNES MÄDCHEN ZU KÜSSEN." in UTF-8 */

  {D_STR_W_LEN ("\x98stanbul"),                                                /* "İstanbul" in CP857 */
   D_STR_W_LEN ("istanbul"), 0},                                               /* "istanbul" in CP857 */
  {D_STR_W_LEN ("\xddstanbul"),                                                /* "İstanbul" in ISO-8859-9/CP1254 */
   D_STR_W_LEN ("istanbul"), 0},                                               /* "istanbul" in ISO-8859-9/CP1254 */
  {D_STR_W_LEN ("\xc4\xb0stanbul"),                                            /* "İstanbul" in UTF-8 */
   D_STR_W_LEN ("istanbul"), 0},                                               /* "istanbul" in UTF-8 */
  {D_STR_W_LEN ("Diyarbak\x8dr"),                                              /* "Diyarbakır" in CP857 */
   D_STR_W_LEN ("DiyarbakIR"), 8},                                             /* "DiyarbakIR" in CP857 */
  {D_STR_W_LEN ("Diyarbak\xfdr"),                                              /* "Diyarbakır" in ISO-8859-9/CP1254 */
   D_STR_W_LEN ("DiyarbakIR"), 8},                                             /* "DiyarbakIR" in ISO-8859-9/CP1254 */
  {D_STR_W_LEN ("Diyarbak\xc4\xb1r"),                                          /* "Diyarbakır" in UTF-8 */
   D_STR_W_LEN ("DiyarbakIR"), 8},                                             /* "DiyarbakIR" in UTF-8 */

  {D_STR_W_LEN ("\x92\xa5\xe1\xe2\xae\xa2\xa0\xef \x91\xe2\xe0\xae\xaa\xa0."), /* "Тестовая Строка." in CP866 */
   D_STR_W_LEN ("\x92\x85\x91\x92\x8e\x82\x80\x9f \x91\x92\x90\x8e\x8a\x80."),
   1},                                                                         /* "ТЕСТОВАЯ СТРОКА." in CP866 */
  {D_STR_W_LEN ("\xd2\xe5\xf1\xf2\xee\xe2\xe0\xff \xd1\xf2\xf0\xee\xea\xe0."), /* "Тестовая Строка." in CP1251 */
   D_STR_W_LEN ("\xd2\xc5\xd1\xd2\xce\xc2\xc0\xdf \xd1\xd2\xd0\xce\xca\xc0."),
   1},                                                                         /* "ТЕСТОВАЯ СТРОКА." in CP1251 */
  {D_STR_W_LEN ("\xf4\xc5\xd3\xd4\xcf\xd7\xc1\xd1 \xf3\xd4\xd2\xcf\xcb\xc1."), /* "Тестовая Строка." in KOI8-R */
   D_STR_W_LEN ("\xf4\xe5\xf3\xf4\xef\xf7\xe1\xf1 \xf3\xf4\xf2\xef\xeb\xe1."),
   1},                                                                         /* "ТЕСТОВАЯ СТРОКА." in KOI8-R */
  {D_STR_W_LEN ("\xc2\xd5\xe1\xe2\xde\xd2\xd0\xef \xc1\xe2\xe0\xde\xda\xd0."), /* "Тестовая Строка." in ISO-8859-5 */
   D_STR_W_LEN ("\xc2\xb5\xc1\xc2\xbe\xb2\xb0\xcf \xc1\xc2\xc0\xbe\xba\xb0."),
   1},                                                                         /* "ТЕСТОВАЯ СТРОКА." in ISO-8859-5 */
  {D_STR_W_LEN ("\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82\xd0\xbe\xd0\xb2\xd0\xb0\xd1"
                "\x8f \xd0\xa1\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0."),     /* "Тестовая Строка." in UTF-8 */
   D_STR_W_LEN ("\xd0\xa2\xd0\x95\xd0\xa1\xd0\xa2\xd0\x9e\xd0\x92\xd0\x90\xd0"
                "\xaf \xd0\xa1\xd0\xa2\xd0\xa0\xd0\x9e\xd0\x9a\xd0\x90."), 3}  /* "ТЕСТОВАЯ СТРОКА." in UTF-8 */
};


static size_t
check_eq_strings (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(eq_strings) / sizeof(eq_strings[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      const struct two_eq_strs *const t = eq_strings + i;
      if (c_failed[i])
        continue;     /* skip already failed checks */
      if (! MHD_str_equal_caseless_ (t->s1.str, t->s2.str))
      {
        t_failed++;
        c_failed[i] = ! 0;
        fprintf (stderr,
                 "FAILED: MHD_str_equal_caseless_(\"%s\", \"%s\") returned zero, while expected non-zero."
                 " Locale: %s\n", n_prnt (t->s1.str), n_prnt (t->s2.str),
                 get_current_locale_str ());
      }
      else if (! MHD_str_equal_caseless_ (t->s2.str, t->s1.str))
      {
        t_failed++;
        c_failed[i] = ! 0;
        fprintf (stderr,
                 "FAILED: MHD_str_equal_caseless_(\"%s\", \"%s\") returned zero, while expected non-zero."
                 " Locale: %s\n", n_prnt (t->s2.str), n_prnt (t->s1.str),
                 get_current_locale_str ());
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_str_equal_caseless_(\"%s\", \"%s\") != 0 && \\\n"
                "        MHD_str_equal_caseless_(\"%s\", \"%s\") != 0\n",
                n_prnt (t->s1.str), n_prnt (t->s2.str),
                n_prnt (t->s2.str), n_prnt (t->s1.str));
    }
  }
  return t_failed;
}


static size_t
check_neq_strings (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(neq_strings) / sizeof(neq_strings[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      const struct two_neq_strs *const t = neq_strings + i;
      if (c_failed[i])
        continue;     /* skip already failed checks */
      if (MHD_str_equal_caseless_ (t->s1.str, t->s2.str))
      {
        t_failed++;
        c_failed[i] = ! 0;
        fprintf (stderr,
                 "FAILED: MHD_str_equal_caseless_(\"%s\", \"%s\") returned non-zero, while expected zero."
                 " Locale: %s\n", n_prnt (t->s1.str), n_prnt (t->s2.str),
                 get_current_locale_str ());
      }
      else if (MHD_str_equal_caseless_ (t->s2.str, t->s1.str))
      {
        t_failed++;
        c_failed[i] = ! 0;
        fprintf (stderr,
                 "FAILED: MHD_str_equal_caseless_(\"%s\", \"%s\") returned non-zero, while expected zero."
                 " Locale: %s\n", n_prnt (t->s2.str), n_prnt (t->s1.str),
                 get_current_locale_str ());
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_str_equal_caseless_(\"%s\", \"%s\") == 0 && \\\n"
                "        MHD_str_equal_caseless_(\"%s\", \"%s\") == 0\n",
                n_prnt (t->s1.str), n_prnt (t->s2.str),
                n_prnt (t->s2.str), n_prnt (t->s1.str));
    }
  }
  return t_failed;
}


static size_t
check_eq_strings_n (void)
{
  size_t t_failed = 0;
  size_t i, j, k;
  int c_failed[sizeof(eq_strings) / sizeof(eq_strings[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      size_t m_len;
      const struct two_eq_strs *const t = eq_strings + i;
      m_len = (t->s1.len > t->s2.len) ? t->s1.len : t->s2.len;
      for (k = 0; k <= m_len + 1 && ! c_failed[i]; k++)
      {
        if (! MHD_str_equal_caseless_n_ (t->s1.str, t->s2.str, k))
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_str_equal_caseless_n_(\"%s\", \"%s\", %u) returned zero,"
                   " while expected non-zero. Locale: %s\n",
                   n_prnt (t->s1.str), n_prnt (t->s2.str), (unsigned int) k,
                   get_current_locale_str ());
        }
        else if (! MHD_str_equal_caseless_n_ (t->s2.str, t->s1.str, k))
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_str_equal_caseless_n_(\"%s\", \"%s\", %u) returned zero,"
                   " while expected non-zero. Locale: %s\n",
                   n_prnt (t->s2.str), n_prnt (t->s1.str), (unsigned int) k,
                   get_current_locale_str ());
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_str_equal_caseless_n_(\"%s\", \"%s\", N) " \
                "!= 0 && \\\n" \
                "        MHD_str_equal_caseless_n_(\"%s\", \"%s\", N) " \
                "!= 0, where N is 0..%u\n",
                n_prnt (t->s1.str), n_prnt (t->s2.str), n_prnt (t->s2.str),
                n_prnt (t->s1.str), (unsigned int) m_len + 1);
    }
  }
  return t_failed;
}


static size_t
check_neq_strings_n (void)
{
  size_t t_failed = 0;
  size_t i, j, k;
  int c_failed[sizeof(neq_strings) / sizeof(neq_strings[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      size_t m_len;
      const struct two_neq_strs *const t = neq_strings + i;
      m_len = t->s1.len > t->s2.len ? t->s1.len : t->s2.len;
      if (t->dif_pos >= m_len)
      {
        fprintf (stderr,
                 "ERROR: neq_strings[%u] has wrong dif_pos (%u): dif_pos is expected to be less than "
                 "s1.len (%u) or s2.len (%u).\n", (unsigned int) i, (unsigned
                                                                     int) t->
                 dif_pos,
                 (unsigned int) t->s1.len, (unsigned int) t->s2.len);
        exit (99);
      }
      if (t->dif_pos > t->s1.len)
      {
        fprintf (stderr,
                 "ERROR: neq_strings[%u] has wrong dif_pos (%u): dif_pos is expected to be less or "
                 "equal to s1.len (%u).\n", (unsigned int) i, (unsigned
                                                               int) t->dif_pos,
                 (unsigned int) t->s1.len);
        exit (99);
      }
      if (t->dif_pos > t->s2.len)
      {
        fprintf (stderr,
                 "ERROR: neq_strings[%u] has wrong dif_pos (%u): dif_pos is expected to be less or "
                 "equal to s2.len (%u).\n", (unsigned int) i, (unsigned
                                                               int) t->dif_pos,
                 (unsigned int) t->s2.len);
        exit (99);
      }
      for (k = 0; k <= m_len + 1 && ! c_failed[i]; k++)
      {
        if (k <= t->dif_pos)
        {
          if (! MHD_str_equal_caseless_n_ (t->s1.str, t->s2.str, k))
          {
            t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_str_equal_caseless_n_(\"%s\", \"%s\", %u) returned zero,"
                     " while expected non-zero. Locale: %s\n",
                     n_prnt (t->s1.str), n_prnt (t->s2.str), (unsigned int) k,
                     get_current_locale_str ());
          }
          else if (! MHD_str_equal_caseless_n_ (t->s2.str, t->s1.str, k))
          {
            t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_str_equal_caseless_n_(\"%s\", \"%s\", %u) returned zero,"
                     " while expected non-zero. Locale: %s\n",
                     n_prnt (t->s2.str), n_prnt (t->s1.str), (unsigned int) k,
                     get_current_locale_str ());
          }
        }
        else
        {
          if (MHD_str_equal_caseless_n_ (t->s1.str, t->s2.str, k))
          {
            t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_str_equal_caseless_n_(\"%s\", \"%s\", %u) returned non-zero,"
                     " while expected zero. Locale: %s\n",
                     n_prnt (t->s1.str), n_prnt (t->s2.str), (unsigned int) k,
                     get_current_locale_str ());
          }
          else if (MHD_str_equal_caseless_n_ (t->s2.str, t->s1.str, k))
          {
            t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_str_equal_caseless_n_(\"%s\", \"%s\", %u) returned non-zero,"
                     " while expected zero. Locale: %s\n",
                     n_prnt (t->s2.str), n_prnt (t->s1.str), (unsigned int) k,
                     get_current_locale_str ());
          }
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
      {
        printf (
          "PASSED: MHD_str_equal_caseless_n_(\"%s\", \"%s\", N) != 0 && \\\n"
          "        MHD_str_equal_caseless_n_(\"%s\", \"%s\", N) != 0, where N is 0..%u\n",
          n_prnt (t->s1.str), n_prnt (t->s2.str), n_prnt (t->s2.str),
          n_prnt (t->s1.str),
          (unsigned int) t->dif_pos);

        printf (
          "PASSED: MHD_str_equal_caseless_n_(\"%s\", \"%s\", N) == 0 && \\\n"
          "        MHD_str_equal_caseless_n_(\"%s\", \"%s\", N) == 0, where N is %u..%u\n",
          n_prnt (t->s1.str), n_prnt (t->s2.str), n_prnt (t->s2.str),
          n_prnt (t->s1.str),
          (unsigned int) t->dif_pos + 1, (unsigned int) m_len + 1);
      }
    }
  }
  return t_failed;
}


/*
 * Run eq/neq strings tests
 */
static int
run_eq_neq_str_tests (void)
{
  size_t str_equal_caseless_fails = 0;
  size_t str_equal_caseless_n_fails = 0;
  size_t res;

  res = check_eq_strings ();
  if (res != 0)
  {
    str_equal_caseless_fails += res;
    fprintf (stderr, "FAILED: testcase check_eq_strings() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_eq_strings() successfully passed.\n\n");

  res = check_neq_strings ();
  if (res != 0)
  {
    str_equal_caseless_fails += res;
    fprintf (stderr, "FAILED: testcase check_neq_strings() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_neq_strings() successfully passed.\n\n");

  if (str_equal_caseless_fails)
    fprintf (stderr,
             "FAILED: function MHD_str_equal_caseless_() failed %lu time%s.\n\n",
             (unsigned long) str_equal_caseless_fails,
             str_equal_caseless_fails == 1 ? "" :
             "s");
  else if (verbose > 0)
    printf (
      "PASSED: function MHD_str_equal_caseless_() successfully passed all checks.\n\n");

  res = check_eq_strings_n ();
  if (res != 0)
  {
    str_equal_caseless_n_fails += res;
    fprintf (stderr, "FAILED: testcase check_eq_strings_n() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_eq_strings_n() successfully passed.\n\n");

  res = check_neq_strings_n ();
  if (res != 0)
  {
    str_equal_caseless_n_fails += res;
    fprintf (stderr, "FAILED: testcase check_neq_strings_n() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_neq_strings_n() successfully passed.\n\n");

  if (str_equal_caseless_n_fails)
    fprintf (stderr,
             "FAILED: function MHD_str_equal_caseless_n_() failed %lu time%s.\n\n",
             (unsigned long) str_equal_caseless_n_fails,
             str_equal_caseless_n_fails == 1 ? "" :
             "s");
  else if (verbose > 0)
    printf (
      "PASSED: function MHD_str_equal_caseless_n_() successfully passed all checks.\n\n");

  if (str_equal_caseless_fails || str_equal_caseless_n_fails)
  {
    if (verbose > 0)
      printf ("At least one test failed.\n");

    return 1;
  }

  if (verbose > 0)
    printf ("All tests passed successfully.\n");

  return 0;
}


/*
 * Digits in string -> value tests
 */

struct str_with_value
{
  const struct str_with_len str;
  const size_t num_of_digt;
  const uint64_t val;
};

/* valid string for conversion to unsigned integer value */
static const struct str_with_value dstrs_w_values[] = {
  /* simplest strings */
  {D_STR_W_LEN ("1"), 1, 1},
  {D_STR_W_LEN ("0"), 1, 0},
  {D_STR_W_LEN ("10000"), 5, 10000},

  /* all digits */
  {D_STR_W_LEN ("1234"), 4, 1234},
  {D_STR_W_LEN ("4567"), 4, 4567},
  {D_STR_W_LEN ("7890"), 4, 7890},
  {D_STR_W_LEN ("8021"), 4, 8021},
  {D_STR_W_LEN ("9754"), 4, 9754},
  {D_STR_W_LEN ("6392"), 4, 6392},

  /* various prefixes */
  {D_STR_W_LEN ("00000000"), 8, 0},
  {D_STR_W_LEN ("0755"), 4, 755},  /* not to be interpreted as octal value! */
  {D_STR_W_LEN ("002"), 3, 2},
  {D_STR_W_LEN ("0001"), 4, 1},
  {D_STR_W_LEN ("00000000000000000000000031295483"), 32, 31295483},

  /* numbers below and above limits */
  {D_STR_W_LEN ("127"), 3, 127},                /* 0x7F, SCHAR_MAX */
  {D_STR_W_LEN ("128"), 3, 128},                /* 0x80, SCHAR_MAX+1 */
  {D_STR_W_LEN ("255"), 3, 255},                /* 0xFF, UCHAR_MAX */
  {D_STR_W_LEN ("256"), 3, 256},                /* 0x100, UCHAR_MAX+1 */
  {D_STR_W_LEN ("32767"), 5, 32767},            /* 0x7FFF, INT16_MAX */
  {D_STR_W_LEN ("32768"), 5, 32768},            /* 0x8000, INT16_MAX+1 */
  {D_STR_W_LEN ("65535"), 5, 65535},            /* 0xFFFF, UINT16_MAX */
  {D_STR_W_LEN ("65536"), 5, 65536},            /* 0x10000, UINT16_MAX+1 */
  {D_STR_W_LEN ("2147483647"), 10, 2147483647}, /* 0x7FFFFFFF, INT32_MAX */
  {D_STR_W_LEN ("2147483648"), 10, UINT64_C (2147483648)}, /* 0x80000000, INT32_MAX+1 */
  {D_STR_W_LEN ("4294967295"), 10, UINT64_C (4294967295)}, /* 0xFFFFFFFF, UINT32_MAX */
  {D_STR_W_LEN ("4294967296"), 10, UINT64_C (4294967296)}, /* 0x100000000, UINT32_MAX+1 */
  {D_STR_W_LEN ("9223372036854775807"), 19, UINT64_C (9223372036854775807)}, /* 0x7FFFFFFFFFFFFFFF, INT64_MAX */
  {D_STR_W_LEN ("9223372036854775808"), 19, UINT64_C (9223372036854775808)}, /* 0x8000000000000000, INT64_MAX+1 */
  {D_STR_W_LEN ("18446744073709551615"), 20, UINT64_C (18446744073709551615)},  /* 0xFFFFFFFFFFFFFFFF, UINT64_MAX */

  /* random numbers */
  {D_STR_W_LEN ("10186753"), 8, 10186753},
  {D_STR_W_LEN ("144402566"), 9, 144402566},
  {D_STR_W_LEN ("151903144"), 9, 151903144},
  {D_STR_W_LEN ("139264621"), 9, 139264621},
  {D_STR_W_LEN ("730348"), 6, 730348},
  {D_STR_W_LEN ("21584377"), 8, 21584377},
  {D_STR_W_LEN ("709"), 3, 709},
  {D_STR_W_LEN ("54"), 2, 54},
  {D_STR_W_LEN ("8452"), 4, 8452},
  {D_STR_W_LEN ("17745098750013624977"), 20, UINT64_C (17745098750013624977)},
  {D_STR_W_LEN ("06786878769931678000"), 20, UINT64_C (6786878769931678000)},

  /* non-digit suffixes */
  {D_STR_W_LEN ("1234oa"), 4, 1234},
  {D_STR_W_LEN ("20h"), 2, 20},  /* not to be interpreted as hex value! */
  {D_STR_W_LEN ("0x1F"), 1, 0},  /* not to be interpreted as hex value! */
  {D_STR_W_LEN ("0564`~}"), 4, 564},
  {D_STR_W_LEN ("7240146.724"), 7, 7240146},
  {D_STR_W_LEN ("2,9"), 1, 2},
  {D_STR_W_LEN ("200+1"), 3, 200},
  {D_STR_W_LEN ("1a"), 1, 1},
  {D_STR_W_LEN ("2E"), 1, 2},
  {D_STR_W_LEN ("6c"), 1, 6},
  {D_STR_W_LEN ("8F"), 1, 8},
  {D_STR_W_LEN ("287416997! And the not too long string."), 9, 287416997}
};

/* strings that should overflow uint64_t */
static const struct str_with_len str_ovflw[] = {
  D_STR_W_LEN ("18446744073709551616"),  /* 0x10000000000000000, UINT64_MAX+1 */
  D_STR_W_LEN ("18446744073709551620"),
  D_STR_W_LEN ("18446744083709551615"),
  D_STR_W_LEN ("19234761020556472143"),
  D_STR_W_LEN ("184467440737095516150"),
  D_STR_W_LEN ("1844674407370955161500"),
  D_STR_W_LEN ("000018446744073709551616"),  /* 0x10000000000000000, UINT64_MAX+1 */
  D_STR_W_LEN ("20000000000000000000"),
  D_STR_W_LEN ("020000000000000000000"),
  D_STR_W_LEN ("0020000000000000000000"),
  D_STR_W_LEN ("100000000000000000000"),
  D_STR_W_LEN ("434532891232591226417"),
  D_STR_W_LEN ("99999999999999999999"),
  D_STR_W_LEN ("18446744073709551616abcd"),  /* 0x10000000000000000, UINT64_MAX+1 */
  D_STR_W_LEN ("20000000000000000000 suffix"),
  D_STR_W_LEN ("020000000000000000000x")
};

/* strings that should not be convertible to numeric value */
static const struct str_with_len str_no_num[] = {
  D_STR_W_LEN ("zero"),
  D_STR_W_LEN ("one"),
  D_STR_W_LEN ("\xb9\xb2\xb3"),                                    /* superscript "123" in ISO-8859-1/CP1252 */
  D_STR_W_LEN ("\xc2\xb9\xc2\xb2\xc2\xb3"),                        /* superscript "123" in UTF-8 */
  D_STR_W_LEN ("\xd9\xa1\xd9\xa2\xd9\xa3"),                        /* Arabic-Indic "١٢٣" in UTF-8 */
  D_STR_W_LEN ("\xdb\xb1\xdb\xb2\xdb\xb3"),                        /* Ext Arabic-Indic "۱۲۳" in UTF-8 */
  D_STR_W_LEN ("\xe0\xa5\xa7\xe0\xa5\xa8\xe0\xa5\xa9"),            /* Devanagari "१२३" in UTF-8 */
  D_STR_W_LEN ("\xe4\xb8\x80\xe4\xba\x8c\xe4\xb8\x89"),            /* Chinese "一二三" in UTF-8 */
  D_STR_W_LEN ("\xd2\xbb\xb6\xfe\xc8\xfd"),                        /* Chinese "一二三" in GB2312/CP936 */
  D_STR_W_LEN ("\x1B\x24\x29\x41\x0E\x52\x3B\x36\x7E\x48\x7D\x0F") /* Chinese "一二三" in ISO-2022-CN */
};

/* valid hex string for conversion to unsigned integer value */
static const struct str_with_value xdstrs_w_values[] = {
  /* simplest strings */
  {D_STR_W_LEN ("1"), 1, 0x1},
  {D_STR_W_LEN ("0"), 1, 0x0},
  {D_STR_W_LEN ("10000"), 5, 0x10000},

  /* all digits */
  {D_STR_W_LEN ("1234"), 4, 0x1234},
  {D_STR_W_LEN ("4567"), 4, 0x4567},
  {D_STR_W_LEN ("7890"), 4, 0x7890},
  {D_STR_W_LEN ("8021"), 4, 0x8021},
  {D_STR_W_LEN ("9754"), 4, 0x9754},
  {D_STR_W_LEN ("6392"), 4, 0x6392},
  {D_STR_W_LEN ("abcd"), 4, 0xABCD},
  {D_STR_W_LEN ("cdef"), 4, 0xCDEF},
  {D_STR_W_LEN ("FEAB"), 4, 0xFEAB},
  {D_STR_W_LEN ("BCED"), 4, 0xBCED},
  {D_STR_W_LEN ("bCeD"), 4, 0xBCED},
  {D_STR_W_LEN ("1A5F"), 4, 0x1A5F},
  {D_STR_W_LEN ("12AB"), 4, 0x12AB},
  {D_STR_W_LEN ("CD34"), 4, 0xCD34},
  {D_STR_W_LEN ("56EF"), 4, 0x56EF},
  {D_STR_W_LEN ("7a9f"), 4, 0x7A9F},

  /* various prefixes */
  {D_STR_W_LEN ("00000000"), 8, 0x0},
  {D_STR_W_LEN ("0755"), 4, 0x755},  /* not to be interpreted as octal value! */
  {D_STR_W_LEN ("002"), 3, 0x2},
  {D_STR_W_LEN ("0001"), 4, 0x1},
  {D_STR_W_LEN ("00a"), 3, 0xA},
  {D_STR_W_LEN ("0F"), 2, 0xF},
  {D_STR_W_LEN ("0000000000000000000000003A29e4C3"), 32, 0x3A29E4C3},

  /* numbers below and above limits */
  {D_STR_W_LEN ("7F"), 2, 127},              /* 0x7F, SCHAR_MAX */
  {D_STR_W_LEN ("7f"), 2, 127},              /* 0x7F, SCHAR_MAX */
  {D_STR_W_LEN ("80"), 2, 128},              /* 0x80, SCHAR_MAX+1 */
  {D_STR_W_LEN ("fF"), 2, 255},              /* 0xFF, UCHAR_MAX */
  {D_STR_W_LEN ("Ff"), 2, 255},              /* 0xFF, UCHAR_MAX */
  {D_STR_W_LEN ("FF"), 2, 255},              /* 0xFF, UCHAR_MAX */
  {D_STR_W_LEN ("ff"), 2, 255},              /* 0xFF, UCHAR_MAX */
  {D_STR_W_LEN ("100"), 3, 256},             /* 0x100, UCHAR_MAX+1 */
  {D_STR_W_LEN ("7fff"), 4, 32767},          /* 0x7FFF, INT16_MAX */
  {D_STR_W_LEN ("7FFF"), 4, 32767},          /* 0x7FFF, INT16_MAX */
  {D_STR_W_LEN ("7Fff"), 4, 32767},          /* 0x7FFF, INT16_MAX */
  {D_STR_W_LEN ("8000"), 4, 32768},          /* 0x8000, INT16_MAX+1 */
  {D_STR_W_LEN ("ffff"), 4, 65535},          /* 0xFFFF, UINT16_MAX */
  {D_STR_W_LEN ("FFFF"), 4, 65535},          /* 0xFFFF, UINT16_MAX */
  {D_STR_W_LEN ("FffF"), 4, 65535},          /* 0xFFFF, UINT16_MAX */
  {D_STR_W_LEN ("10000"), 5, 65536},         /* 0x10000, UINT16_MAX+1 */
  {D_STR_W_LEN ("7FFFFFFF"), 8, 2147483647}, /* 0x7FFFFFFF, INT32_MAX */
  {D_STR_W_LEN ("7fffffff"), 8, 2147483647}, /* 0x7FFFFFFF, INT32_MAX */
  {D_STR_W_LEN ("7FFffFff"), 8, 2147483647}, /* 0x7FFFFFFF, INT32_MAX */
  {D_STR_W_LEN ("80000000"), 8, UINT64_C (2147483648)}, /* 0x80000000, INT32_MAX+1 */
  {D_STR_W_LEN ("FFFFFFFF"), 8, UINT64_C (4294967295)}, /* 0xFFFFFFFF, UINT32_MAX */
  {D_STR_W_LEN ("ffffffff"), 8, UINT64_C (4294967295)}, /* 0xFFFFFFFF, UINT32_MAX */
  {D_STR_W_LEN ("FfFfFfFf"), 8, UINT64_C (4294967295)}, /* 0xFFFFFFFF, UINT32_MAX */
  {D_STR_W_LEN ("100000000"), 9, UINT64_C (4294967296)}, /* 0x100000000, UINT32_MAX+1 */
  {D_STR_W_LEN ("7fffffffffffffff"), 16, UINT64_C (9223372036854775807)}, /* 0x7FFFFFFFFFFFFFFF, INT64_MAX */
  {D_STR_W_LEN ("7FFFFFFFFFFFFFFF"), 16, UINT64_C (9223372036854775807)}, /* 0x7FFFFFFFFFFFFFFF, INT64_MAX */
  {D_STR_W_LEN ("7FfffFFFFffFFffF"), 16, UINT64_C (9223372036854775807)}, /* 0x7FFFFFFFFFFFFFFF, INT64_MAX */
  {D_STR_W_LEN ("8000000000000000"), 16, UINT64_C (9223372036854775808)}, /* 0x8000000000000000, INT64_MAX+1 */
  {D_STR_W_LEN ("ffffffffffffffff"), 16, UINT64_C (18446744073709551615)},  /* 0xFFFFFFFFFFFFFFFF, UINT64_MAX */
  {D_STR_W_LEN ("FFFFFFFFFFFFFFFF"), 16, UINT64_C (18446744073709551615)},  /* 0xFFFFFFFFFFFFFFFF, UINT64_MAX */
  {D_STR_W_LEN ("FffFffFFffFFfFFF"), 16, UINT64_C (18446744073709551615)},  /* 0xFFFFFFFFFFFFFFFF, UINT64_MAX */

  /* random numbers */
  {D_STR_W_LEN ("10186753"), 8, 0x10186753},
  {D_STR_W_LEN ("144402566"), 9, 0x144402566},
  {D_STR_W_LEN ("151903144"), 9, 0x151903144},
  {D_STR_W_LEN ("139264621"), 9, 0x139264621},
  {D_STR_W_LEN ("730348"), 6, 0x730348},
  {D_STR_W_LEN ("21584377"), 8, 0x21584377},
  {D_STR_W_LEN ("709"), 3, 0x709},
  {D_STR_W_LEN ("54"), 2, 0x54},
  {D_STR_W_LEN ("8452"), 4, 0x8452},
  {D_STR_W_LEN ("22353EC6"), 8, 0x22353EC6},
  {D_STR_W_LEN ("307F1655"), 8, 0x307F1655},
  {D_STR_W_LEN ("1FCB7226"), 8, 0x1FCB7226},
  {D_STR_W_LEN ("82480560"), 8, 0x82480560},
  {D_STR_W_LEN ("7386D95"), 7, 0x7386D95},
  {D_STR_W_LEN ("EC3AB"), 5, 0xEC3AB},
  {D_STR_W_LEN ("6DD05"), 5, 0x6DD05},
  {D_STR_W_LEN ("C5DF"), 4, 0xC5DF},
  {D_STR_W_LEN ("6CE"), 3, 0x6CE},
  {D_STR_W_LEN ("CE6"), 3, 0xCE6},
  {D_STR_W_LEN ("ce6"), 3, 0xCE6},
  {D_STR_W_LEN ("F27"), 3, 0xF27},
  {D_STR_W_LEN ("8497D54277D7E1"), 14, UINT64_C (37321639124785121)},
  {D_STR_W_LEN ("8497d54277d7e1"), 14, UINT64_C (37321639124785121)},
  {D_STR_W_LEN ("8497d54277d7E1"), 14, UINT64_C (37321639124785121)},
  {D_STR_W_LEN ("8C8112D0A06"), 11, UINT64_C (9655374645766)},
  {D_STR_W_LEN ("8c8112d0a06"), 11, UINT64_C (9655374645766)},
  {D_STR_W_LEN ("8c8112d0A06"), 11, UINT64_C (9655374645766)},
  {D_STR_W_LEN ("1774509875001362"), 16, UINT64_C (1690064375898968930)},
  {D_STR_W_LEN ("0678687876998000"), 16, UINT64_C (466237428027981824)},

  /* non-digit suffixes */
  {D_STR_W_LEN ("1234oa"), 4, 0x1234},
  {D_STR_W_LEN ("20h"), 2, 0x20},
  {D_STR_W_LEN ("2CH"), 2, 0x2C},
  {D_STR_W_LEN ("2ch"), 2, 0x2C},
  {D_STR_W_LEN ("0x1F"), 1, 0x0},  /* not to be interpreted as hex prefix! */
  {D_STR_W_LEN ("0564`~}"), 4, 0x564},
  {D_STR_W_LEN ("0A64`~}"), 4, 0xA64},
  {D_STR_W_LEN ("056c`~}"), 4, 0X56C},
  {D_STR_W_LEN ("7240146.724"), 7, 0x7240146},
  {D_STR_W_LEN ("7E4c1AB.724"), 7, 0X7E4C1AB},
  {D_STR_W_LEN ("F24B1B6.724"), 7, 0xF24B1B6},
  {D_STR_W_LEN ("2,9"), 1, 0x2},
  {D_STR_W_LEN ("a,9"), 1, 0xA},
  {D_STR_W_LEN ("200+1"), 3, 0x200},
  {D_STR_W_LEN ("2cc+1"), 3, 0x2CC},
  {D_STR_W_LEN ("2cC+1"), 3, 0x2CC},
  {D_STR_W_LEN ("27416997! And the not too long string."), 8, 0x27416997},
  {D_STR_W_LEN ("27555416997! And the not too long string."), 11,
   0x27555416997},
  {D_STR_W_LEN ("416997And the not too long string."), 7, 0x416997A},
  {D_STR_W_LEN ("0F4C3Dabstract addition to make string even longer"), 8,
   0xF4C3DAB}
};

/* hex strings that should overflow uint64_t */
static const struct str_with_len strx_ovflw[] = {
  D_STR_W_LEN ("10000000000000000"),            /* 0x10000000000000000, UINT64_MAX+1 */
  D_STR_W_LEN ("10000000000000001"),
  D_STR_W_LEN ("10000000000000002"),
  D_STR_W_LEN ("1000000000000000A"),
  D_STR_W_LEN ("11000000000000000"),
  D_STR_W_LEN ("010000000000000000"),           /* 0x10000000000000000, UINT64_MAX+1 */
  D_STR_W_LEN ("000010000000000000000"),        /* 0x10000000000000000, UINT64_MAX+1 */
  D_STR_W_LEN ("20000000000000000000"),
  D_STR_W_LEN ("020000000000000000000"),
  D_STR_W_LEN ("0020000000000000000000"),
  D_STR_W_LEN ("20000000000000000"),
  D_STR_W_LEN ("A0000000000000000"),
  D_STR_W_LEN ("F0000000000000000"),
  D_STR_W_LEN ("a0000000000000000"),
  D_STR_W_LEN ("11111111111111111"),
  D_STR_W_LEN ("CcCcCCccCCccCCccC"),
  D_STR_W_LEN ("f0000000000000000"),
  D_STR_W_LEN ("100000000000000000000"),
  D_STR_W_LEN ("434532891232591226417"),
  D_STR_W_LEN ("10000000000000000a"),
  D_STR_W_LEN ("10000000000000000E"),
  D_STR_W_LEN ("100000000000000000 and nothing"), /* 0x10000000000000000, UINT64_MAX+1 */
  D_STR_W_LEN ("100000000000000000xx"),           /* 0x10000000000000000, UINT64_MAX+1 */
  D_STR_W_LEN ("99999999999999999999"),
  D_STR_W_LEN ("18446744073709551616abcd"),
  D_STR_W_LEN ("20000000000000000000 suffix"),
  D_STR_W_LEN ("020000000000000000000x")
};


static size_t
check_str_to_uint64_valid (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(dstrs_w_values)
               / sizeof(dstrs_w_values[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      uint64_t rv;
      size_t rs;
      const struct str_with_value *const t = dstrs_w_values + i;

      if (c_failed[i])
        continue;     /* skip already failed checks */

      if (t->str.len < t->num_of_digt)
      {
        fprintf (stderr,
                 "ERROR: dstrs_w_values[%u] has wrong num_of_digt (%u): num_of_digt is expected"
                 " to be less or equal to str.len (%u).\n",
                 (unsigned int) i, (unsigned int) t->num_of_digt, (unsigned
                                                                   int) t->str.
                 len);
        exit (99);
      }
      rv = 9435223;     /* some random value */
      rs = MHD_str_to_uint64_ (t->str.str, &rv);
      if (rs != t->num_of_digt)
      {
        t_failed++;
        c_failed[i] = ! 0;
        fprintf (stderr,
                 "FAILED: MHD_str_to_uint64_(\"%s\", ->%" PRIu64 ") returned %"
                 PRIuPTR
                 ", while expecting %d."
                 " Locale: %s\n", n_prnt (t->str.str), rv, (uintptr_t) rs,
                 (int) t->num_of_digt, get_current_locale_str ());
      }
      if (rv != t->val)
      {
        t_failed++;
        c_failed[i] = ! 0;
        fprintf (stderr,
                 "FAILED: MHD_str_to_uint64_(\"%s\", ->%" PRIu64
                 ") converted string to value %"
                 PRIu64 ","
                 " while expecting result %" PRIu64 ". Locale: %s\n",
                 n_prnt (t->str.str), rv, rv,
                 t->val, get_current_locale_str ());
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_str_to_uint64_(\"%s\", ->%" PRIu64 ") == %" \
                PRIuPTR "\n",
                n_prnt (t->str.str), rv, rs);
    }
  }
  return t_failed;
}


static size_t
check_str_to_uint64_all_chars (void)
{
  int c_failed[256]; /* from 0 to 255 */
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);
  size_t t_failed = 0;
  size_t j;

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    unsigned int c;
    uint64_t test_val;

    set_test_locale (j);  /* setlocale() can be slow! */
    for (c = 0; c < n_checks; c++)
    {
      static const uint64_t rnd_val = 24941852;
      size_t rs;
      if ((c >= '0') && (c <= '9') )
        continue;     /* skip digits */
      for (test_val = 0; test_val <= rnd_val && ! c_failed[c]; test_val +=
             rnd_val)
      {
        char test_str[] = "0123";
        uint64_t rv = test_val;

        test_str[0] = (char) (unsigned char) c;      /* replace first char with non-digit char */
        rs = MHD_str_to_uint64_ (test_str, &rv);
        if (rs != 0)
        {
          t_failed++;
          c_failed[c] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_str_to_uint64_(\"%s\", ->%" PRIu64
                   ") returned %" PRIuPTR
                   ", while expecting zero."
                   " Locale: %s\n", n_prnt (test_str), rv, (uintptr_t) rs,
                   get_current_locale_str ());
        }
        else if (rv != test_val)
        {
          t_failed++;
          c_failed[c] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_str_to_uint64_(\"%s\", &ret_val) modified value of ret_val"
                   " (before call: %" PRIu64 ", after call %" PRIu64
                   "). Locale: %s\n",
                   n_prnt (test_str), test_val, rv, get_current_locale_str ());
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[c])
      {
        char test_str[] = "0123";
        test_str[0] = (char) (unsigned char) c;      /* replace first char with non-digit char */

        printf ("PASSED: MHD_str_to_uint64_(\"%s\", &ret_val) == 0, "
                "value of ret_val is unmodified\n",
                n_prnt (test_str));
      }
    }
  }
  return t_failed;
}


static size_t
check_str_to_uint64_overflow (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(str_ovflw) / sizeof(str_ovflw[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      size_t rs;
      const struct str_with_len *const t = str_ovflw + i;
      static const uint64_t rnd_val = 2;
      uint64_t test_val;

      for (test_val = 0; test_val <= rnd_val && ! c_failed[i]; test_val +=
             rnd_val)
      {
        uint64_t rv = test_val;

        rs = MHD_str_to_uint64_ (t->str, &rv);
        if (rs != 0)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_str_to_uint64_(\"%s\", ->%" PRIu64
                   ") returned %" PRIuPTR
                   ", while expecting zero."
                   " Locale: %s\n", n_prnt (t->str), rv, (uintptr_t) rs,
                   get_current_locale_str ());
        }
        else if (rv != test_val)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_str_to_uint64_(\"%s\", &ret_val) modified value of ret_val"
                   " (before call: %" PRIu64 ", after call %" PRIu64
                   "). Locale: %s\n",
                   n_prnt (t->str), test_val, rv, get_current_locale_str ());
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_str_to_uint64_(\"%s\", &ret_val) == 0, "
                "value of ret_val is unmodified\n",
                n_prnt (t->str));
    }
  }
  return t_failed;
}


static size_t
check_str_to_uint64_no_val (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(str_no_num) / sizeof(str_no_num[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      size_t rs;
      const struct str_with_len *const t = str_no_num + i;
      static const uint64_t rnd_val = 74218431;
      uint64_t test_val;

      for (test_val = 0; test_val <= rnd_val && ! c_failed[i]; test_val +=
             rnd_val)
      {
        uint64_t rv = test_val;

        rs = MHD_str_to_uint64_ (t->str, &rv);
        if (rs != 0)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_str_to_uint64_(\"%s\", ->%" PRIu64
                   ") returned %" PRIuPTR
                   ", while expecting zero."
                   " Locale: %s\n", n_prnt (t->str), rv, (uintptr_t) rs,
                   get_current_locale_str ());
        }
        else if (rv != test_val)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_str_to_uint64_(\"%s\", &ret_val) modified value of ret_val"
                   " (before call: %" PRIu64 ", after call %" PRIu64
                   "). Locale: %s\n",
                   n_prnt (t->str), test_val, rv, get_current_locale_str ());
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_str_to_uint64_(\"%s\", &ret_val) == 0, "
                "value of ret_val is unmodified\n",
                n_prnt (t->str));
    }
  }
  return t_failed;
}


static size_t
check_str_to_uint64_n_valid (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(dstrs_w_values)
               / sizeof(dstrs_w_values[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      uint64_t rv = 1235572;     /* some random value */
      size_t rs = 0;
      size_t len;
      const struct str_with_value *const t = dstrs_w_values + i;

      if (t->str.len < t->num_of_digt)
      {
        fprintf (stderr,
                 "ERROR: dstrs_w_values[%u] has wrong num_of_digt (%u): num_of_digt is expected"
                 " to be less or equal to str.len (%u).\n",
                 (unsigned int) i, (unsigned int) t->num_of_digt, (unsigned
                                                                   int) t->str.
                 len);
        exit (99);
      }
      for (len = t->num_of_digt; len <= t->str.len + 1 && ! c_failed[i]; len++)
      {
        rs = MHD_str_to_uint64_n_ (t->str.str, len, &rv);
        if (rs != t->num_of_digt)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_str_to_uint64_n_(\"%s\", %" PRIuPTR ", ->%"
                   PRIu64 ")"
                   " returned %" PRIuPTR ", while expecting %d. Locale: %s\n",
                   n_prnt (t->str.str), (uintptr_t) len, rv, (uintptr_t) rs,
                   (int) t->num_of_digt, get_current_locale_str ());
        }
        if (rv != t->val)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_str_to_uint64_n_(\"%s\", %" PRIuPTR ", ->%"
                   PRIu64 ")"
                   " converted string to value %" PRIu64
                   ", while expecting result %" PRIu64
                   ". Locale: %s\n", n_prnt (t->str.str), (uintptr_t) len, rv,
                   rv,
                   t->val, get_current_locale_str ());
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_str_to_uint64_n_(\"%s\", %" PRIuPTR "..%"
                PRIuPTR ", ->%" PRIu64 ")" " == %" PRIuPTR "\n",
                n_prnt (t->str.str),
                (uintptr_t) t->num_of_digt,
                (uintptr_t) t->str.len + 1, rv, rs);
    }
  }
  return t_failed;
}


static size_t
check_str_to_uint64_n_all_chars (void)
{
  int c_failed[256]; /* from 0 to 255 */
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);
  size_t t_failed = 0;
  size_t j;

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    unsigned int c;
    uint64_t test_val;

    set_test_locale (j);  /* setlocale() can be slow! */
    for (c = 0; c < n_checks; c++)
    {
      static const uint64_t rnd_val = 98372558;
      size_t rs;
      size_t len;

      if ((c >= '0') && (c <= '9') )
        continue;     /* skip digits */

      for (len = 0; len <= 5; len++)
      {
        for (test_val = 0; test_val <= rnd_val && ! c_failed[c]; test_val +=
               rnd_val)
        {
          char test_str[] = "0123";
          uint64_t rv = test_val;

          test_str[0] = (char) (unsigned char) c;        /* replace first char with non-digit char */
          rs = MHD_str_to_uint64_n_ (test_str, len, &rv);
          if (rs != 0)
          {
            t_failed++;
            c_failed[c] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_str_to_uint64_n_(\"%s\", %" PRIuPTR ", ->%"
                     PRIu64 ")"
                     " returned %" PRIuPTR
                     ", while expecting zero. Locale: %s\n",
                     n_prnt (test_str), (uintptr_t) len, rv, (uintptr_t) rs,
                     get_current_locale_str ());
          }
          else if (rv != test_val)
          {
            t_failed++;
            c_failed[c] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_str_to_uint64_n_(\"%s\", %" PRIuPTR
                     ", &ret_val)"
                     " modified value of ret_val (before call: %" PRIu64
                     ", after call %" PRIu64 ")."
                     " Locale: %s\n",
                     n_prnt (test_str), (uintptr_t) len, test_val, rv,
                     get_current_locale_str ());
          }
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[c])
      {
        char test_str[] = "0123";
        test_str[0] = (char) (unsigned char) c;      /* replace first char with non-digit char */

        printf ("PASSED: MHD_str_to_uint64_n_(\"%s\", 0..5, &ret_val) == 0, "
                "value of ret_val is unmodified\n",
                n_prnt (test_str));
      }
    }
  }
  return t_failed;
}


static size_t
check_str_to_uint64_n_overflow (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(str_ovflw) / sizeof(str_ovflw[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      size_t rs;
      const struct str_with_len *const t = str_ovflw + i;
      static const uint64_t rnd_val = 3;
      size_t len;

      for (len = t->len; len <= t->len + 1; len++)
      {
        uint64_t test_val;
        for (test_val = 0; test_val <= rnd_val && ! c_failed[i]; test_val +=
               rnd_val)
        {
          uint64_t rv = test_val;

          rs = MHD_str_to_uint64_n_ (t->str, len, &rv);
          if (rs != 0)
          {
            t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_str_to_uint64_n_(\"%s\", %" PRIuPTR ", ->%"
                     PRIu64 ")"
                     " returned %" PRIuPTR
                     ", while expecting zero. Locale: %s\n",
                     n_prnt (t->str), (uintptr_t) len, rv, (uintptr_t) rs,
                     get_current_locale_str ());
          }
          else if (rv != test_val)
          {
            t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_str_to_uint64_n_(\"%s\", %" PRIuPTR
                     ", &ret_val)"
                     " modified value of ret_val (before call: %" PRIu64
                     ", after call %" PRIu64 ")."
                     " Locale: %s\n", n_prnt (t->str), (uintptr_t) len,
                     test_val, rv,
                     get_current_locale_str ());
          }
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_str_to_uint64_n_(\"%s\", %" PRIuPTR "..%" PRIuPTR
                ", &ret_val) == 0,"
                " value of ret_val is unmodified\n", n_prnt (t->str),
                (uintptr_t) t->len,
                (uintptr_t) t->len + 1);
    }
  }
  return t_failed;
}


static size_t
check_str_to_uint64_n_no_val (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(str_no_num) / sizeof(str_no_num[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      size_t rs;
      const struct str_with_len *const t = str_no_num + i;
      static const uint64_t rnd_val = 43255654342;
      size_t len;

      for (len = 0; len <= t->len + 1; len++)
      {
        uint64_t test_val;
        for (test_val = 0; test_val <= rnd_val && ! c_failed[i]; test_val +=
               rnd_val)
        {
          uint64_t rv = test_val;

          rs = MHD_str_to_uint64_n_ (t->str, len, &rv);
          if (rs != 0)
          {
            t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_str_to_uint64_n_(\"%s\", %" PRIuPTR ", ->%"
                     PRIu64 ")"
                     " returned %" PRIuPTR
                     ", while expecting zero. Locale: %s\n",
                     n_prnt (t->str), (uintptr_t) len, rv, (uintptr_t) rs,
                     get_current_locale_str ());
          }
          else if (rv != test_val)
          {
            t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_str_to_uint64_n_(\"%s\", %" PRIuPTR
                     ", &ret_val)"
                     " modified value of ret_val (before call: %" PRIu64
                     ", after call %" PRIu64 ")."
                     " Locale: %s\n", n_prnt (t->str), (uintptr_t) len,
                     test_val, rv,
                     get_current_locale_str ());
          }
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_str_to_uint64_n_(\"%s\", 0..%" PRIuPTR
                ", &ret_val) == 0,"
                " value of ret_val is unmodified\n", n_prnt (t->str),
                (uintptr_t) t->len + 1);
    }
  }
  return t_failed;
}


static size_t
check_strx_to_uint32_valid (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(xdstrs_w_values)
               / sizeof(xdstrs_w_values[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      uint32_t rv;
      size_t rs;
      const struct str_with_value *const t = xdstrs_w_values + i;

      if (t->val > UINT32_MAX)
        continue;     /* number is too high for this function */

      if (c_failed[i])
        continue;     /* skip already failed checks */

      if (t->str.len < t->num_of_digt)
      {
        fprintf (stderr,
                 "ERROR: xdstrs_w_values[%u] has wrong num_of_digt (%u): num_of_digt is expected"
                 " to be less or equal to str.len (%u).\n",
                 (unsigned int) i, (unsigned int) t->num_of_digt, (unsigned
                                                                   int) t->str.
                 len);
        exit (99);
      }
      rv = 1458532;     /* some random value */
      rs = MHD_strx_to_uint32_ (t->str.str, &rv);
      if (rs != t->num_of_digt)
      {
        t_failed++;
        c_failed[i] = ! 0;
        fprintf (stderr,
                 "FAILED: MHD_strx_to_uint32_(\"%s\", ->0x%" PRIX64
                 ") returned %"
                 PRIuPTR ", while expecting %d."
                 " Locale: %s\n", n_prnt (t->str.str), (uint64_t) rv,
                 (uintptr_t) rs, (int) t->num_of_digt,
                 get_current_locale_str ());
      }
      if (rv != t->val)
      {
        t_failed++;
        c_failed[i] = ! 0;
        fprintf (stderr,
                 "FAILED: MHD_strx_to_uint32_(\"%s\", ->0x%" PRIX64
                 ") converted string to value 0x%"
                 PRIX64 ","
                 " while expecting result 0x%" PRIX64 ". Locale: %s\n",
                 n_prnt (t->str.str), (uint64_t) rv, (uint64_t) rv,
                 t->val, get_current_locale_str ());
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_strx_to_uint32_(\"%s\", ->0x%" PRIX64 ") == %"
                PRIuPTR "\n",
                n_prnt (t->str.str), (uint64_t) rv, rs);
    }
  }
  return t_failed;
}


static size_t
check_strx_to_uint32_all_chars (void)
{
  int c_failed[256]; /* from 0 to 255 */
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);
  size_t t_failed = 0;
  size_t j;

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    unsigned int c;
    uint32_t test_val;

    set_test_locale (j);  /* setlocale() can be slow! */
    for (c = 0; c < n_checks; c++)
    {
      static const uint32_t rnd_val = 234234;
      size_t rs;
      if (((c >= '0') && (c <= '9') ) || ((c >= 'A') && (c <= 'F') ) || ((c >=
                                                                          'a')
                                                                         &&
                                                                         (c <=
                                                                          'f') ))
        continue;     /* skip xdigits */
      for (test_val = 0; test_val <= rnd_val && ! c_failed[c]; test_val +=
             rnd_val)
      {
        char test_str[] = "0123";
        uint32_t rv = test_val;

        test_str[0] = (char) (unsigned char) c;      /* replace first char with non-digit char */
        rs = MHD_strx_to_uint32_ (test_str, &rv);
        if (rs != 0)
        {
          t_failed++;
          c_failed[c] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_strx_to_uint32_(\"%s\", ->0x%" PRIX64
                   ") returned %"
                   PRIuPTR ", while expecting zero."
                   " Locale: %s\n", n_prnt (test_str), (uint64_t) rv,
                   (uintptr_t) rs, get_current_locale_str ());
        }
        else if (rv != test_val)
        {
          t_failed++;
          c_failed[c] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_strx_to_uint32_(\"%s\", &ret_val) modified value of ret_val"
                   " (before call: 0x%" PRIX64 ", after call 0x%" PRIX64
                   "). Locale: %s\n",
                   n_prnt (test_str), (uint64_t) test_val, (uint64_t) rv,
                   get_current_locale_str ());
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[c])
      {
        char test_str[] = "0123";
        test_str[0] = (char) (unsigned char) c;      /* replace first char with non-digit char */

        printf ("PASSED: MHD_strx_to_uint32_(\"%s\", &ret_val) == 0, "
                "value of ret_val is unmodified\n",
                n_prnt (test_str));
      }
    }
  }
  return t_failed;
}


static size_t
check_strx_to_uint32_overflow (void)
{
  size_t t_failed = 0;
  size_t i, j;
  static const size_t n_checks1 = sizeof(strx_ovflw) / sizeof(strx_ovflw[0]);
  int c_failed[sizeof(strx_ovflw) / sizeof(strx_ovflw[0])
               + sizeof(xdstrs_w_values)
               / sizeof(xdstrs_w_values[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      size_t rs;
      static const uint32_t rnd_val = 74218431;
      uint32_t test_val;
      const char *str;
      if (i < n_checks1)
      {
        const struct str_with_len *const t = strx_ovflw + i;
        str = t->str;
      }
      else
      {
        const struct str_with_value *const t = xdstrs_w_values + (i
                                                                  - n_checks1);
        if (t->val <= UINT32_MAX)
          continue;       /* check only strings that should overflow uint32_t */
        str = t->str.str;
      }


      for (test_val = 0; test_val <= rnd_val && ! c_failed[i]; test_val +=
             rnd_val)
      {
        uint32_t rv = test_val;

        rs = MHD_strx_to_uint32_ (str, &rv);
        if (rs != 0)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_strx_to_uint32_(\"%s\", ->0x%" PRIX64
                   ") returned %"
                   PRIuPTR ", while expecting zero."
                   " Locale: %s\n", n_prnt (str), (uint64_t) rv, (uintptr_t) rs,
                   get_current_locale_str ());
        }
        else if (rv != test_val)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_strx_to_uint32_(\"%s\", &ret_val) modified value of ret_val"
                   " (before call: 0x%" PRIX64 ", after call 0x%" PRIX64
                   "). Locale: %s\n",
                   n_prnt (str), (uint64_t) test_val, (uint64_t) rv,
                   get_current_locale_str ());
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_strx_to_uint32_(\"%s\", &ret_val) == 0, "
                "value of ret_val is unmodified\n",
                n_prnt (str));
    }
  }
  return t_failed;
}


static size_t
check_strx_to_uint32_no_val (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(str_no_num) / sizeof(str_no_num[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      size_t rs;
      const struct str_with_len *const t = str_no_num + i;
      static const uint32_t rnd_val = 74218431;
      uint32_t test_val;

      for (test_val = 0; test_val <= rnd_val && ! c_failed[i]; test_val +=
             rnd_val)
      {
        uint32_t rv = test_val;

        rs = MHD_strx_to_uint32_ (t->str, &rv);
        if (rs != 0)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_strx_to_uint32_(\"%s\", ->0x%" PRIX64
                   ") returned %"
                   PRIuPTR ", while expecting zero."
                   " Locale: %s\n", n_prnt (t->str), (uint64_t) rv,
                   (uintptr_t) rs, get_current_locale_str ());
        }
        else if (rv != test_val)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_strx_to_uint32_(\"%s\", &ret_val) modified value of ret_val"
                   " (before call: 0x%" PRIX64 ", after call 0x%" PRIX64
                   "). Locale: %s\n",
                   n_prnt (t->str), (uint64_t) test_val, (uint64_t) rv,
                   get_current_locale_str ());
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_strx_to_uint32_(\"%s\", &ret_val) == 0, "
                "value of ret_val is unmodified\n",
                n_prnt (t->str));
    }
  }
  return t_failed;
}


static size_t
check_strx_to_uint32_n_valid (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(xdstrs_w_values)
               / sizeof(xdstrs_w_values[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      uint32_t rv = 2352932;      /* some random value */
      size_t rs = 0;
      size_t len;
      const struct str_with_value *const t = xdstrs_w_values + i;

      if (t->val > UINT32_MAX)
        continue;     /* number is too high for this function */

      if (t->str.len < t->num_of_digt)
      {
        fprintf (stderr,
                 "ERROR: xdstrs_w_values[%u] has wrong num_of_digt (%u): num_of_digt is expected"
                 " to be less or equal to str.len (%u).\n",
                 (unsigned int) i, (unsigned int) t->num_of_digt, (unsigned
                                                                   int) t->str.
                 len);
        exit (99);
      }
      for (len = t->num_of_digt; len <= t->str.len + 1 && ! c_failed[i]; len++)
      {
        rs = MHD_strx_to_uint32_n_ (t->str.str, len, &rv);
        if (rs != t->num_of_digt)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_strx_to_uint32_n_(\"%s\", %" PRIuPTR ", ->0x%"
                   PRIX64 ")"
                   " returned %" PRIuPTR ", while expecting %d. Locale: %s\n",
                   n_prnt (t->str.str), (uintptr_t) len, (uint64_t) rv,
                   (uintptr_t) rs,
                   (int) t->num_of_digt, get_current_locale_str ());
        }
        if (rv != t->val)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_strx_to_uint32_n_(\"%s\", %" PRIuPTR ", ->0x%"
                   PRIX64 ")"
                   " converted string to value 0x%" PRIX64
                   ", while expecting result 0x%" PRIX64
                   ". Locale: %s\n", n_prnt (t->str.str), (uintptr_t) len,
                   (uint64_t) rv, (uint64_t) rv,
                   t->val, get_current_locale_str ());
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf (
          "PASSED: MHD_strx_to_uint32_n_(\"%s\", %" PRIuPTR "..%" PRIuPTR
          ", ->0x%"
          PRIX64 ")"
          " == %" PRIuPTR "\n", n_prnt (t->str.str),
          (uintptr_t) t->num_of_digt,
          (uintptr_t) t->str.len + 1, (uint64_t) rv, rs);
    }
  }
  return t_failed;
}


static size_t
check_strx_to_uint32_n_all_chars (void)
{
  int c_failed[256]; /* from 0 to 255 */
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);
  size_t t_failed = 0;
  size_t j;

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    unsigned int c;
    uint32_t test_val;

    set_test_locale (j);  /* setlocale() can be slow! */
    for (c = 0; c < n_checks; c++)
    {
      static const uint32_t rnd_val = 98372558;
      size_t rs;
      size_t len;

      if (((c >= '0') && (c <= '9') ) || ((c >= 'A') && (c <= 'F') ) || ((c >=
                                                                          'a')
                                                                         &&
                                                                         (c <=
                                                                          'f') ))
        continue;     /* skip xdigits */

      for (len = 0; len <= 5; len++)
      {
        for (test_val = 0; test_val <= rnd_val && ! c_failed[c]; test_val +=
               rnd_val)
        {
          char test_str[] = "0123";
          uint32_t rv = test_val;

          test_str[0] = (char) (unsigned char) c;        /* replace first char with non-digit char */
          rs = MHD_strx_to_uint32_n_ (test_str, len, &rv);
          if (rs != 0)
          {
            t_failed++;
            c_failed[c] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_strx_to_uint32_n_(\"%s\", %" PRIuPTR ", ->0x%"
                     PRIX64
                     ")"
                     " returned %" PRIuPTR
                     ", while expecting zero. Locale: %s\n",
                     n_prnt (test_str), (uintptr_t) len, (uint64_t) rv,
                     (uintptr_t) rs, get_current_locale_str ());
          }
          else if (rv != test_val)
          {
            t_failed++;
            c_failed[c] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_strx_to_uint32_n_(\"%s\", %" PRIuPTR
                     ", &ret_val)"
                     " modified value of ret_val (before call: 0x%" PRIX64
                     ", after call 0x%" PRIX64 ")."
                     " Locale: %s\n",
                     n_prnt (test_str), (uintptr_t) len, (uint64_t) test_val,
                     (uint64_t) rv, get_current_locale_str ());
          }
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[c])
      {
        char test_str[] = "0123";
        test_str[0] = (char) (unsigned char) c;      /* replace first char with non-digit char */

        printf ("PASSED: MHD_strx_to_uint32_n_(\"%s\", 0..5, &ret_val) == 0, "
                "value of ret_val is unmodified\n",
                n_prnt (test_str));
      }
    }
  }
  return t_failed;
}


static size_t
check_strx_to_uint32_n_overflow (void)
{
  size_t t_failed = 0;
  size_t i, j;
  static const size_t n_checks1 = sizeof(strx_ovflw) / sizeof(strx_ovflw[0]);
  int c_failed[sizeof(strx_ovflw) / sizeof(strx_ovflw[0])
               + sizeof(xdstrs_w_values)
               / sizeof(xdstrs_w_values[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      size_t rs;
      static const uint32_t rnd_val = 4;
      size_t len;
      const char *str;
      size_t min_len, max_len;
      if (i < n_checks1)
      {
        const struct str_with_len *const t = strx_ovflw + i;
        str = t->str;
        min_len = t->len;
        max_len = t->len + 1;
      }
      else
      {
        const struct str_with_value *const t = xdstrs_w_values + (i
                                                                  - n_checks1);
        if (t->val <= UINT32_MAX)
          continue;       /* check only strings that should overflow uint32_t */

        if (t->str.len < t->num_of_digt)
        {
          fprintf (stderr,
                   "ERROR: xdstrs_w_values[%u] has wrong num_of_digt (%u): num_of_digt is expected"
                   " to be less or equal to str.len (%u).\n",
                   (unsigned int) (i - n_checks1), (unsigned
                                                    int) t->num_of_digt,
                   (unsigned int) t->str.len);
          exit (99);
        }
        str = t->str.str;
        min_len = t->num_of_digt;
        max_len = t->str.len + 1;
      }

      for (len = min_len; len <= max_len; len++)
      {
        uint32_t test_val;
        for (test_val = 0; test_val <= rnd_val && ! c_failed[i]; test_val +=
               rnd_val)
        {
          uint32_t rv = test_val;

          rs = MHD_strx_to_uint32_n_ (str, len, &rv);
          if (rs != 0)
          {
            t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_strx_to_uint32_n_(\"%s\", %" PRIuPTR ", ->0x%"
                     PRIX64
                     ")"
                     " returned %" PRIuPTR
                     ", while expecting zero. Locale: %s\n",
                     n_prnt (str), (uintptr_t) len, (uint64_t) rv,
                     (uintptr_t) rs, get_current_locale_str ());
          }
          else if (rv != test_val)
          {
            t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_strx_to_uint32_n_(\"%s\", %" PRIuPTR
                     ", &ret_val)"
                     " modified value of ret_val (before call: 0x%" PRIX64
                     ", after call 0x%" PRIX64 ")."
                     " Locale: %s\n", n_prnt (str), (uintptr_t) len,
                     (uint64_t) test_val, (uint64_t) rv,
                     get_current_locale_str ());
          }
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_strx_to_uint32_n_(\"%s\", %" PRIuPTR "..%" PRIuPTR
                ", &ret_val) == 0,"
                " value of ret_val is unmodified\n", n_prnt (str),
                (uintptr_t) min_len,
                (uintptr_t) max_len);
    }
  }
  return t_failed;
}


static size_t
check_strx_to_uint32_n_no_val (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(str_no_num) / sizeof(str_no_num[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      size_t rs;
      const struct str_with_len *const t = str_no_num + i;
      static const uint32_t rnd_val = 3214314212UL;
      size_t len;

      for (len = 0; len <= t->len + 1; len++)
      {
        uint32_t test_val;
        for (test_val = 0; test_val <= rnd_val && ! c_failed[i]; test_val +=
               rnd_val)
        {
          uint32_t rv = test_val;

          rs = MHD_strx_to_uint32_n_ (t->str, len, &rv);
          if (rs != 0)
          {
            t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_strx_to_uint32_n_(\"%s\", %" PRIuPTR ", ->0x%"
                     PRIX64
                     ")"
                     " returned %" PRIuPTR
                     ", while expecting zero. Locale: %s\n",
                     n_prnt (t->str), (uintptr_t) len, (uint64_t) rv,
                     (uintptr_t) rs, get_current_locale_str ());
          }
          else if (rv != test_val)
          {
            t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_strx_to_uint32_n_(\"%s\", %" PRIuPTR
                     ", &ret_val)"
                     " modified value of ret_val (before call: 0x%" PRIX64
                     ", after call 0x%" PRIX64 ")."
                     " Locale: %s\n", n_prnt (t->str), (uintptr_t) len,
                     (uint64_t) test_val, (uint64_t) rv,
                     get_current_locale_str ());
          }
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_strx_to_uint32_n_(\"%s\", 0..%" PRIuPTR
                ", &ret_val) == 0,"
                " value of ret_val is unmodified\n", n_prnt (t->str),
                (uintptr_t) t->len + 1);
    }
  }
  return t_failed;
}


static size_t
check_strx_to_uint64_valid (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(xdstrs_w_values)
               / sizeof(xdstrs_w_values[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      uint64_t rv;
      size_t rs;
      const struct str_with_value *const t = xdstrs_w_values + i;

      if (c_failed[i])
        continue;     /* skip already failed checks */

      if (t->str.len < t->num_of_digt)
      {
        fprintf (stderr,
                 "ERROR: xdstrs_w_values[%u] has wrong num_of_digt (%u): num_of_digt is expected"
                 " to be less or equal to str.len (%u).\n",
                 (unsigned int) i, (unsigned int) t->num_of_digt, (unsigned
                                                                   int) t->str.
                 len);
        exit (99);
      }
      rv = 1458532;     /* some random value */
      rs = MHD_strx_to_uint64_ (t->str.str, &rv);
      if (rs != t->num_of_digt)
      {
        t_failed++;
        c_failed[i] = ! 0;
        fprintf (stderr,
                 "FAILED: MHD_strx_to_uint64_(\"%s\", ->0x%" PRIX64
                 ") returned %"
                 PRIuPTR ", while expecting %d."
                 " Locale: %s\n", n_prnt (t->str.str), rv, (uintptr_t) rs,
                 (int) t->num_of_digt, get_current_locale_str ());
      }
      if (rv != t->val)
      {
        t_failed++;
        c_failed[i] = ! 0;
        fprintf (stderr,
                 "FAILED: MHD_strx_to_uint64_(\"%s\", ->0x%" PRIX64
                 ") converted string to value 0x%"
                 PRIX64 ","
                 " while expecting result 0x%" PRIX64 ". Locale: %s\n",
                 n_prnt (t->str.str), rv, rv,
                 t->val, get_current_locale_str ());
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_strx_to_uint64_(\"%s\", ->0x%" PRIX64 ") == %"
                PRIuPTR "\n",
                n_prnt (t->str.str), rv, rs);
    }
  }
  return t_failed;
}


static size_t
check_strx_to_uint64_all_chars (void)
{
  int c_failed[256]; /* from 0 to 255 */
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);
  size_t t_failed = 0;
  size_t j;

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    unsigned int c;
    uint64_t test_val;

    set_test_locale (j);  /* setlocale() can be slow! */
    for (c = 0; c < n_checks; c++)
    {
      static const uint64_t rnd_val = 234234;
      size_t rs;
      if (((c >= '0') && (c <= '9') ) || ((c >= 'A') && (c <= 'F') ) || ((c >=
                                                                          'a')
                                                                         &&
                                                                         (c <=
                                                                          'f') ))
        continue;     /* skip xdigits */
      for (test_val = 0; test_val <= rnd_val && ! c_failed[c]; test_val +=
             rnd_val)
      {
        char test_str[] = "0123";
        uint64_t rv = test_val;

        test_str[0] = (char) (unsigned char) c;      /* replace first char with non-digit char */
        rs = MHD_strx_to_uint64_ (test_str, &rv);
        if (rs != 0)
        {
          t_failed++;
          c_failed[c] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_strx_to_uint64_(\"%s\", ->0x%" PRIX64
                   ") returned %"
                   PRIuPTR ", while expecting zero."
                   " Locale: %s\n", n_prnt (test_str), rv, (uintptr_t) rs,
                   get_current_locale_str ());
        }
        else if (rv != test_val)
        {
          t_failed++;
          c_failed[c] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_strx_to_uint64_(\"%s\", &ret_val) modified value of ret_val"
                   " (before call: 0x%" PRIX64 ", after call 0x%" PRIX64
                   "). Locale: %s\n",
                   n_prnt (test_str), test_val, rv, get_current_locale_str ());
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[c])
      {
        char test_str[] = "0123";
        test_str[0] = (char) (unsigned char) c;      /* replace first char with non-digit char */

        printf ("PASSED: MHD_strx_to_uint64_(\"%s\", &ret_val) == 0, "
                "value of ret_val is unmodified\n",
                n_prnt (test_str));
      }
    }
  }
  return t_failed;
}


static size_t
check_strx_to_uint64_overflow (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(strx_ovflw) / sizeof(strx_ovflw[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      size_t rs;
      const struct str_with_len *const t = strx_ovflw + i;
      static const uint64_t rnd_val = 74218431;
      uint64_t test_val;

      for (test_val = 0; test_val <= rnd_val && ! c_failed[i]; test_val +=
             rnd_val)
      {
        uint64_t rv = test_val;

        rs = MHD_strx_to_uint64_ (t->str, &rv);
        if (rs != 0)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_strx_to_uint64_(\"%s\", ->0x%" PRIX64
                   ") returned %"
                   PRIuPTR ", while expecting zero."
                   " Locale: %s\n", n_prnt (t->str), rv, (uintptr_t) rs,
                   get_current_locale_str ());
        }
        else if (rv != test_val)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_strx_to_uint64_(\"%s\", &ret_val) modified value of ret_val"
                   " (before call: 0x%" PRIX64 ", after call 0x%" PRIX64
                   "). Locale: %s\n",
                   n_prnt (t->str), test_val, rv, get_current_locale_str ());
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_strx_to_uint64_(\"%s\", &ret_val) == 0, "
                "value of ret_val is unmodified\n",
                n_prnt (t->str));
    }
  }
  return t_failed;
}


static size_t
check_strx_to_uint64_no_val (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(str_no_num) / sizeof(str_no_num[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      size_t rs;
      const struct str_with_len *const t = str_no_num + i;
      static const uint64_t rnd_val = 74218431;
      uint64_t test_val;

      for (test_val = 0; test_val <= rnd_val && ! c_failed[i]; test_val +=
             rnd_val)
      {
        uint64_t rv = test_val;

        rs = MHD_strx_to_uint64_ (t->str, &rv);
        if (rs != 0)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_strx_to_uint64_(\"%s\", ->0x%" PRIX64
                   ") returned %"
                   PRIuPTR ", while expecting zero."
                   " Locale: %s\n", n_prnt (t->str), rv, (uintptr_t) rs,
                   get_current_locale_str ());
        }
        else if (rv != test_val)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_strx_to_uint64_(\"%s\", &ret_val) modified value of ret_val"
                   " (before call: 0x%" PRIX64 ", after call 0x%" PRIX64
                   "). Locale: %s\n",
                   n_prnt (t->str), test_val, rv, get_current_locale_str ());
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_strx_to_uint64_(\"%s\", &ret_val) == 0, "
                "value of ret_val is unmodified\n",
                n_prnt (t->str));
    }
  }
  return t_failed;
}


static size_t
check_strx_to_uint64_n_valid (void)
{
  size_t t_failed = 0;
  size_t i, j;
  static const size_t n_checks = sizeof(xdstrs_w_values)
                                 / sizeof(xdstrs_w_values[0]);
  int c_failed[n_checks];

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      uint64_t rv = 2352932;     /* some random value */
      size_t rs = 0;
      size_t len;
      const struct str_with_value *const t = xdstrs_w_values + i;

      if (t->str.len < t->num_of_digt)
      {
        fprintf (stderr,
                 "ERROR: xdstrs_w_values[%u] has wrong num_of_digt (%u): num_of_digt is expected"
                 " to be less or equal to str.len (%u).\n",
                 (unsigned int) i, (unsigned int) t->num_of_digt, (unsigned
                                                                   int) t->str.
                 len);
        exit (99);
      }
      for (len = t->num_of_digt; len <= t->str.len + 1 && ! c_failed[i]; len++)
      {
        rs = MHD_strx_to_uint64_n_ (t->str.str, len, &rv);
        if (rs != t->num_of_digt)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_strx_to_uint64_n_(\"%s\", %" PRIuPTR ", ->0x%"
                   PRIX64 ")"
                   " returned %" PRIuPTR ", while expecting %d. Locale: %s\n",
                   n_prnt (t->str.str), (uintptr_t) len, rv, (uintptr_t) rs,
                   (int) t->num_of_digt, get_current_locale_str ());
        }
        if (rv != t->val)
        {
          t_failed++;
          c_failed[i] = ! 0;
          fprintf (stderr,
                   "FAILED: MHD_strx_to_uint64_n_(\"%s\", %" PRIuPTR ", ->0x%"
                   PRIX64 ")"
                   " converted string to value 0x%" PRIX64
                   ", while expecting result 0x%" PRIX64
                   ". Locale: %s\n", n_prnt (t->str.str), (uintptr_t) len, rv,
                   rv,
                   t->val, get_current_locale_str ());
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_strx_to_uint64_n_(\"%s\", %" PRIuPTR "..%" PRIuPTR
                ", ->0x%"
                PRIX64 ")"
                " == %" PRIuPTR "\n", n_prnt (t->str.str),
                (uintptr_t) t->num_of_digt,
                (uintptr_t) t->str.len + 1, rv, rs);
    }
  }
  return t_failed;
}


static size_t
check_strx_to_uint64_n_all_chars (void)
{
  int c_failed[256]; /* from 0 to 255 */
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);
  size_t t_failed = 0;
  size_t j;

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    unsigned int c;
    uint64_t test_val;

    set_test_locale (j);  /* setlocale() can be slow! */
    for (c = 0; c < n_checks; c++)
    {
      static const uint64_t rnd_val = 98372558;
      size_t rs;
      size_t len;

      if (((c >= '0') && (c <= '9') ) || ((c >= 'A') && (c <= 'F') ) || ((c >=
                                                                          'a')
                                                                         &&
                                                                         (c <=
                                                                          'f') ))
        continue;     /* skip xdigits */

      for (len = 0; len <= 5; len++)
      {
        for (test_val = 0; test_val <= rnd_val && ! c_failed[c]; test_val +=
               rnd_val)
        {
          char test_str[] = "0123";
          uint64_t rv = test_val;

          test_str[0] = (char) (unsigned char) c;        /* replace first char with non-digit char */
          rs = MHD_strx_to_uint64_n_ (test_str, len, &rv);
          if (rs != 0)
          {
            t_failed++;
            c_failed[c] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_strx_to_uint64_n_(\"%s\", %" PRIuPTR ", ->0x%"
                     PRIX64
                     ")"
                     " returned %" PRIuPTR
                     ", while expecting zero. Locale: %s\n",
                     n_prnt (test_str), (uintptr_t) len, rv, (uintptr_t) rs,
                     get_current_locale_str ());
          }
          else if (rv != test_val)
          {
            t_failed++;
            c_failed[c] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_strx_to_uint64_n_(\"%s\", %" PRIuPTR
                     ", &ret_val)"
                     " modified value of ret_val (before call: 0x%" PRIX64
                     ", after call 0x%" PRIX64 ")."
                     " Locale: %s\n",
                     n_prnt (test_str), (uintptr_t) len, test_val, rv,
                     get_current_locale_str ());
          }
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[c])
      {
        char test_str[] = "0123";
        test_str[0] = (char) (unsigned char) c;      /* replace first char with non-digit char */

        printf ("PASSED: MHD_strx_to_uint64_n_(\"%s\", 0..5, &ret_val) == 0, "
                "value of ret_val is unmodified\n",
                n_prnt (test_str));
      }
    }
  }
  return t_failed;
}


static size_t
check_strx_to_uint64_n_overflow (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(strx_ovflw) / sizeof(strx_ovflw[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      size_t rs;
      const struct str_with_len *const t = strx_ovflw + i;
      static const uint64_t rnd_val = 4;
      size_t len;

      for (len = t->len; len <= t->len + 1; len++)
      {
        uint64_t test_val;
        for (test_val = 0; test_val <= rnd_val && ! c_failed[i]; test_val +=
               rnd_val)
        {
          uint64_t rv = test_val;

          rs = MHD_strx_to_uint64_n_ (t->str, len, &rv);
          if (rs != 0)
          {
            t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_strx_to_uint64_n_(\"%s\", %" PRIuPTR ", ->0x%"
                     PRIX64
                     ")"
                     " returned %" PRIuPTR
                     ", while expecting zero. Locale: %s\n",
                     n_prnt (t->str), (uintptr_t) len, rv, (uintptr_t) rs,
                     get_current_locale_str ());
          }
          else if (rv != test_val)
          {
            t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_strx_to_uint64_n_(\"%s\", %" PRIuPTR
                     ", &ret_val)"
                     " modified value of ret_val (before call: 0x%" PRIX64
                     ", after call 0x%" PRIX64 ")."
                     " Locale: %s\n", n_prnt (t->str), (uintptr_t) len,
                     test_val, rv,
                     get_current_locale_str ());
          }
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_strx_to_uint64_n_(\"%s\", %" PRIuPTR "..%" PRIuPTR
                ", &ret_val) == 0,"
                " value of ret_val is unmodified\n", n_prnt (t->str),
                (uintptr_t) t->len,
                (uintptr_t) t->len + 1);
    }
  }
  return t_failed;
}


static size_t
check_strx_to_uint64_n_no_val (void)
{
  size_t t_failed = 0;
  size_t i, j;
  int c_failed[sizeof(str_no_num) / sizeof(str_no_num[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      size_t rs;
      const struct str_with_len *const t = str_no_num + i;
      static const uint64_t rnd_val = 3214314212UL;
      size_t len;

      for (len = 0; len <= t->len + 1; len++)
      {
        uint64_t test_val;
        for (test_val = 0; test_val <= rnd_val && ! c_failed[i]; test_val +=
               rnd_val)
        {
          uint64_t rv = test_val;

          rs = MHD_strx_to_uint64_n_ (t->str, len, &rv);
          if (rs != 0)
          {
            t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_strx_to_uint64_n_(\"%s\", %" PRIuPTR ", ->0x%"
                     PRIX64
                     ")"
                     " returned %" PRIuPTR
                     ", while expecting zero. Locale: %s\n",
                     n_prnt (t->str), (uintptr_t) len, rv, (uintptr_t) rs,
                     get_current_locale_str ());
          }
          else if (rv != test_val)
          {
            t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_strx_to_uint64_n_(\"%s\", %" PRIuPTR
                     ", &ret_val)"
                     " modified value of ret_val (before call: 0x%" PRIX64
                     ", after call 0x%" PRIX64 ")."
                     " Locale: %s\n", n_prnt (t->str), (uintptr_t) len,
                     test_val, rv,
                     get_current_locale_str ());
          }
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_strx_to_uint64_n_(\"%s\", 0..%" PRIuPTR
                ", &ret_val) == 0,"
                " value of ret_val is unmodified\n", n_prnt (t->str),
                (uintptr_t) t->len + 1);
    }
  }
  return t_failed;
}


static int
run_str_to_X_tests (void)
{
  size_t str_to_uint64_fails = 0;
  size_t str_to_uint64_n_fails = 0;
  size_t strx_to_uint32_fails = 0;
  size_t strx_to_uint32_n_fails = 0;
  size_t strx_to_uint64_fails = 0;
  size_t strx_to_uint64_n_fails = 0;
  size_t res;

  res = check_str_to_uint64_valid ();
  if (res != 0)
  {
    str_to_uint64_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_str_to_uint64_valid() failed.\n\n");
  }
  else if (verbose > 1)
    printf (
      "PASSED: testcase check_str_to_uint64_valid() successfully passed.\n\n");

  res = check_str_to_uint64_all_chars ();
  if (res != 0)
  {
    str_to_uint64_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_str_to_uint64_all_chars() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_str_to_uint64_all_chars() "
            "successfully passed.\n\n");

  res = check_str_to_uint64_overflow ();
  if (res != 0)
  {
    str_to_uint64_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_str_to_uint64_overflow() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_str_to_uint64_overflow() "
            "successfully passed.\n\n");

  res = check_str_to_uint64_no_val ();
  if (res != 0)
  {
    str_to_uint64_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_str_to_uint64_no_val() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_str_to_uint64_no_val() "
            "successfully passed.\n\n");

  if (str_to_uint64_fails)
    fprintf (stderr,
             "FAILED: function MHD_str_to_uint64_() failed %lu time%s.\n\n",
             (unsigned long) str_to_uint64_fails,
             str_to_uint64_fails == 1 ? "" : "s");
  else if (verbose > 0)
    printf ("PASSED: function MHD_str_to_uint64_() successfully "
            "passed all checks.\n\n");

  res = check_str_to_uint64_n_valid ();
  if (res != 0)
  {
    str_to_uint64_n_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_str_to_uint64_n_valid() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_str_to_uint64_n_valid() "
            "successfully passed.\n\n");

  res = check_str_to_uint64_n_all_chars ();
  if (res != 0)
  {
    str_to_uint64_n_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_str_to_uint64_n_all_chars() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_str_to_uint64_n_all_chars() "
            "successfully passed.\n\n");

  res = check_str_to_uint64_n_overflow ();
  if (res != 0)
  {
    str_to_uint64_n_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_str_to_uint64_n_overflow() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_str_to_uint64_n_overflow() "
            "successfully passed.\n\n");

  res = check_str_to_uint64_n_no_val ();
  if (res != 0)
  {
    str_to_uint64_n_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_str_to_uint64_n_no_val() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_str_to_uint64_n_no_val() "
            "successfully passed.\n\n");

  if (str_to_uint64_n_fails)
    fprintf (stderr,
             "FAILED: function MHD_str_to_uint64_n_() failed %lu time%s.\n\n",
             (unsigned long) str_to_uint64_n_fails,
             str_to_uint64_n_fails == 1 ? "" : "s");
  else if (verbose > 0)
    printf ("PASSED: function MHD_str_to_uint64_n_() successfully "
            "passed all checks.\n\n");

  res = check_strx_to_uint32_valid ();
  if (res != 0)
  {
    strx_to_uint32_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_strx_to_uint32_valid() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_to_uint32_valid() "
            "successfully passed.\n\n");

  res = check_strx_to_uint32_all_chars ();
  if (res != 0)
  {
    strx_to_uint32_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_strx_to_uint32_all_chars() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_to_uint32_all_chars() "
            "successfully passed.\n\n");

  res = check_strx_to_uint32_overflow ();
  if (res != 0)
  {
    strx_to_uint32_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_strx_to_uint32_overflow() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_to_uint32_overflow() "
            "successfully passed.\n\n");

  res = check_strx_to_uint32_no_val ();
  if (res != 0)
  {
    strx_to_uint32_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_strx_to_uint32_no_val() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_to_uint32_no_val() "
            "successfully passed.\n\n");

  if (strx_to_uint32_fails)
    fprintf (stderr,
             "FAILED: function MHD_strx_to_uint32_() failed %lu time%s.\n\n",
             (unsigned long) strx_to_uint32_fails,
             strx_to_uint32_fails == 1 ? "" : "s");
  else if (verbose > 0)
    printf ("PASSED: function MHD_strx_to_uint32_() successfully "
            "passed all checks.\n\n");

  res = check_strx_to_uint32_n_valid ();
  if (res != 0)
  {
    strx_to_uint32_n_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_strx_to_uint32_n_valid() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_to_uint32_n_valid() "
            "successfully passed.\n\n");

  res = check_strx_to_uint32_n_all_chars ();
  if (res != 0)
  {
    strx_to_uint32_n_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_strx_to_uint32_n_all_chars() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_to_uint32_n_all_chars() "
            "successfully passed.\n\n");

  res = check_strx_to_uint32_n_overflow ();
  if (res != 0)
  {
    strx_to_uint32_n_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_strx_to_uint32_n_overflow() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_to_uint32_n_overflow() "
            "successfully passed.\n\n");

  res = check_strx_to_uint32_n_no_val ();
  if (res != 0)
  {
    strx_to_uint32_n_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_strx_to_uint32_n_no_val() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_to_uint32_n_no_val() "
            "successfully passed.\n\n");

  if (strx_to_uint32_n_fails)
    fprintf (stderr,
             "FAILED: function MHD_strx_to_uint32_n_() failed %lu time%s.\n\n",
             (unsigned long) strx_to_uint32_n_fails,
             strx_to_uint32_n_fails == 1 ? "" : "s");
  else if (verbose > 0)
    printf ("PASSED: function MHD_strx_to_uint32_n_() successfully "
            "passed all checks.\n\n");

  res = check_strx_to_uint64_valid ();
  if (res != 0)
  {
    strx_to_uint64_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_strx_to_uint64_valid() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_to_uint64_valid() "
            "successfully passed.\n\n");

  res = check_strx_to_uint64_all_chars ();
  if (res != 0)
  {
    strx_to_uint64_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_strx_to_uint64_all_chars() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_to_uint64_all_chars() "
            "successfully passed.\n\n");

  res = check_strx_to_uint64_overflow ();
  if (res != 0)
  {
    strx_to_uint64_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_strx_to_uint64_overflow() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_to_uint64_overflow() "
            "successfully passed.\n\n");

  res = check_strx_to_uint64_no_val ();
  if (res != 0)
  {
    strx_to_uint64_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_strx_to_uint64_no_val() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_to_uint64_no_val() "
            "successfully passed.\n\n");

  if (strx_to_uint64_fails)
    fprintf (stderr,
             "FAILED: function MHD_strx_to_uint64_() failed %lu time%s.\n\n",
             (unsigned long) strx_to_uint64_fails,
             strx_to_uint64_fails == 1 ? "" : "s");
  else if (verbose > 0)
    printf ("PASSED: function MHD_strx_to_uint64_() successfully "
            "passed all checks.\n\n");

  res = check_strx_to_uint64_n_valid ();
  if (res != 0)
  {
    strx_to_uint64_n_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_strx_to_uint64_n_valid() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_to_uint64_n_valid() "
            "successfully passed.\n\n");

  res = check_strx_to_uint64_n_all_chars ();
  if (res != 0)
  {
    strx_to_uint64_n_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_strx_to_uint64_n_all_chars() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_to_uint64_n_all_chars() "
            "successfully passed.\n\n");

  res = check_strx_to_uint64_n_overflow ();
  if (res != 0)
  {
    strx_to_uint64_n_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_strx_to_uint64_n_overflow() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_to_uint64_n_overflow() "
            "successfully passed.\n\n");

  res = check_strx_to_uint64_n_no_val ();
  if (res != 0)
  {
    strx_to_uint64_n_fails += res;
    fprintf (stderr,
             "FAILED: testcase check_strx_to_uint64_n_no_val() failed.\n\n");
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_to_uint64_n_no_val() "
            "successfully passed.\n\n");

  if (strx_to_uint64_n_fails)
    fprintf (stderr,
             "FAILED: function MHD_strx_to_uint64_n_() failed %lu time%s.\n\n",
             (unsigned long) strx_to_uint64_n_fails,
             strx_to_uint64_n_fails == 1 ? "" : "s");
  else if (verbose > 0)
    printf ("PASSED: function MHD_strx_to_uint64_n_() successfully "
            "passed all checks.\n\n");

  if (str_to_uint64_fails || str_to_uint64_n_fails ||
      strx_to_uint32_fails || strx_to_uint32_n_fails ||
      strx_to_uint64_fails || strx_to_uint64_n_fails)
  {
    if (verbose > 0)
      printf ("At least one test failed.\n");

    return 1;
  }

  if (verbose > 0)
    printf ("All tests passed successfully.\n");

  return 0;
}


static size_t
check_str_from_uint16 (void)
{
  size_t t_failed = 0;
  size_t i, j;
  char buf[70];
  const char *erase =
    "-@=sd#+&(pdiren456qwe#@C3S!DAS45AOIPUQWESAdFzxcv1s*()&#$%34`"
    "32452d098poiden45SADFFDA3S4D3SDFdfgsdfgsSADFzxdvs$*()&#2342`"
    "adsf##$$@&*^%*^&56qwe#3C@S!DAScFAOIP$#%#$Ad1zs3v1$*()&#1228`";
  int c_failed[sizeof(dstrs_w_values)
               / sizeof(dstrs_w_values[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      const struct str_with_value *const t = dstrs_w_values + i;
      size_t b_size;
      size_t rs;

      if (c_failed[i])
        continue;     /* skip already failed checks */

      if (t->str.len < t->num_of_digt)
      {
        fprintf (stderr,
                 "ERROR: dstrs_w_values[%u] has wrong num_of_digt (%u): num_of_digt is expected"
                 " to be less or equal to str.len (%u).\n",
                 (unsigned int) i, (unsigned int) t->num_of_digt, (unsigned
                                                                   int) t->str.
                 len);
        exit (99);
      }
      if ('0' == t->str.str[0])
        continue;  /* Skip strings prefixed with zeros */
      if (t->num_of_digt != t->str.len)
        continue;  /* Skip strings with suffixes */
      if (UINT16_MAX < t->val)
        continue;  /* Too large value to convert */
      if (sizeof(buf) < t->str.len + 1)
      {
        fprintf (stderr,
                 "ERROR: dstrs_w_values[%u] has too long (%u) string, "
                 "size of 'buf' should be increased.\n",
                 (unsigned int) i, (unsigned int) t->str.len);
        exit (99);
      }
      rs = 0; /* Only to mute compiler warning */
      for (b_size = 0; b_size <= t->str.len + 1; ++b_size)
      {
        /* fill buffer with pseudo-random values */
        memcpy (buf, erase, sizeof(buf));

        rs = MHD_uint16_to_str ((uint16_t) t->val, buf, b_size);

        if (t->num_of_digt > b_size)
        {
          /* Must fail, buffer is too small for result */
          if (0 != rs)
          {
            if (0 == c_failed[i])
              t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_uint16_to_str(%" PRIu64 ", -> buf,"
                     " %d) returned %" PRIuPTR
                     ", while expecting 0."
                     " Locale: %s\n", t->val, (int) b_size, (uintptr_t) rs,
                     get_current_locale_str ());
          }
        }
        else
        {
          if (t->num_of_digt != rs)
          {
            if (0 == c_failed[i])
              t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_uint16_to_str(%" PRIu64 ", -> buf,"
                     " %d) returned %" PRIuPTR
                     ", while expecting %d."
                     " Locale: %s\n", t->val, (int) b_size, (uintptr_t) rs,
                     (int) t->num_of_digt, get_current_locale_str ());
          }
          else if (0 != memcmp (buf, t->str.str, t->num_of_digt))
          {
            if (0 == c_failed[i])
              t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_uint16_to_str(%" PRIu64 ", -> \"%.*s\","
                     " %d) returned %" PRIuPTR "."
                     " Locale: %s\n", t->val, (int) rs, buf, (int) b_size,
                     (uintptr_t) rs,  get_current_locale_str ());
          }
          else if (0 != memcmp (buf + rs, erase + rs, sizeof(buf) - rs))
          {
            if (0 == c_failed[i])
              t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_uint16_to_str(%" PRIu64 ", -> \"%.*s\","
                     " %d) returned %" PRIuPTR
                     " and touched data after the resulting string."
                     " Locale: %s\n", t->val, (int) rs, buf, (int) b_size,
                     (uintptr_t) rs,  get_current_locale_str ());
          }
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_uint16_to_str(%" PRIu64 ", -> \"%.*s\", %d) "
                "== %" PRIuPTR "\n",
                t->val, (int) rs, buf, (int) b_size - 1, (uintptr_t) rs);
    }
  }
  return t_failed;
}


static size_t
check_str_from_uint64 (void)
{
  size_t t_failed = 0;
  size_t i, j;
  char buf[70];
  const char *erase =
    "-@=sd#+&(pdirenDSFGSe#@C&S!DAS*!AOIPUQWESAdFzxcvSs*()&#$%KH`"
    "32452d098poiden45SADFFDA3S4D3SDFdfgsdfgsSADFzxdvs$*()&#2342`"
    "adsf##$$@&*^%*^&56qwe#3C@S!DAScFAOIP$#%#$Ad1zs3v1$*()&#1228`";
  int c_failed[sizeof(dstrs_w_values)
               / sizeof(dstrs_w_values[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      const struct str_with_value *const t = dstrs_w_values + i;
      size_t b_size;
      size_t rs;

      if (c_failed[i])
        continue;     /* skip already failed checks */

      if (t->str.len < t->num_of_digt)
      {
        fprintf (stderr,
                 "ERROR: dstrs_w_values[%u] has wrong num_of_digt (%u): num_of_digt is expected"
                 " to be less or equal to str.len (%u).\n",
                 (unsigned int) i, (unsigned int) t->num_of_digt, (unsigned
                                                                   int) t->str.
                 len);
        exit (99);
      }
      if ('0' == t->str.str[0])
        continue;  /* Skip strings prefixed with zeros */
      if (t->num_of_digt != t->str.len)
        continue;  /* Skip strings with suffixes */
      if (sizeof(buf) < t->str.len + 1)
      {
        fprintf (stderr,
                 "ERROR: dstrs_w_values[%u] has too long (%u) string, "
                 "size of 'buf' should be increased.\n",
                 (unsigned int) i, (unsigned int) t->str.len);
        exit (99);
      }
      rs = 0; /* Only to mute compiler warning */
      for (b_size = 0; b_size <= t->str.len + 1; ++b_size)
      {
        /* fill buffer with pseudo-random values */
        memcpy (buf, erase, sizeof(buf));

        rs = MHD_uint64_to_str (t->val, buf, b_size);

        if (t->num_of_digt > b_size)
        {
          /* Must fail, buffer is too small for result */
          if (0 != rs)
          {
            if (0 == c_failed[i])
              t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_uint64_to_str(%" PRIu64 ", -> buf,"
                     " %d) returned %" PRIuPTR
                     ", while expecting 0."
                     " Locale: %s\n", t->val, (int) b_size, (uintptr_t) rs,
                     get_current_locale_str ());
          }
        }
        else
        {
          if (t->num_of_digt != rs)
          {
            if (0 == c_failed[i])
              t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_uint64_to_str(%" PRIu64 ", -> buf,"
                     " %d) returned %" PRIuPTR
                     ", while expecting %d."
                     " Locale: %s\n", t->val, (int) b_size, (uintptr_t) rs,
                     (int) t->num_of_digt, get_current_locale_str ());
          }
          else if (0 != memcmp (buf, t->str.str, t->num_of_digt))
          {
            if (0 == c_failed[i])
              t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_uint64_to_str(%" PRIu64 ", -> \"%.*s\","
                     " %d) returned %" PRIuPTR "."
                     " Locale: %s\n", t->val, (int) rs, buf, (int) b_size,
                     (uintptr_t) rs,  get_current_locale_str ());
          }
          else if (0 != memcmp (buf + rs, erase + rs, sizeof(buf) - rs))
          {
            if (0 == c_failed[i])
              t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_uint64_to_str(%" PRIu64 ", -> \"%.*s\","
                     " %d) returned %" PRIuPTR
                     " and touched data after the resulting string."
                     " Locale: %s\n", t->val, (int) rs, buf, (int) b_size,
                     (uintptr_t) rs,  get_current_locale_str ());
          }
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_uint64_to_str(%" PRIu64 ", -> \"%.*s\", %d) "
                "== %" PRIuPTR "\n",
                t->val, (int) rs, buf, (int) b_size - 1, (uintptr_t) rs);
    }
  }
  return t_failed;
}


static size_t
check_strx_from_uint32 (void)
{
  size_t t_failed = 0;
  size_t i, j;
  char buf[70];
  const char *erase =
    "jrlkjssfhjfvrjntJHLJ$@%$#adsfdkj;k$##$%#$%FGDF%$#^FDFG%$#$D`"
    ";skjdhjflsdkjhdjfalskdjhdfalkjdhf$%##%$$#%FSDGFSDDGDFSSDSDF`"
    "#5#$%#$#$DFSFDDFSGSDFSDF354FDDSGFDFfdssfddfswqemn,.zxih,.sx`";
  int c_failed[sizeof(xdstrs_w_values)
               / sizeof(xdstrs_w_values[0])];
  static const size_t n_checks = sizeof(c_failed) / sizeof(c_failed[0]);

  memset (c_failed, 0, sizeof(c_failed));

  for (j = 0; j < locale_name_count; j++)
  {
    set_test_locale (j);  /* setlocale() can be slow! */
    for (i = 0; i < n_checks; i++)
    {
      const struct str_with_value *const t = xdstrs_w_values + i;
      size_t b_size;
      size_t rs;

      if (c_failed[i])
        continue;     /* skip already failed checks */

      if (t->str.len < t->num_of_digt)
      {
        fprintf (stderr,
                 "ERROR: dstrs_w_values[%u] has wrong num_of_digt (%u): num_of_digt is expected"
                 " to be less or equal to str.len (%u).\n",
                 (unsigned int) i, (unsigned int) t->num_of_digt, (unsigned
                                                                   int) t->str.
                 len);
        exit (99);
      }
      if ('0' == t->str.str[0])
        continue;  /* Skip strings prefixed with zeros */
      if (t->num_of_digt != t->str.len)
        continue;  /* Skip strings with suffixes */
      if (UINT32_MAX < t->val)
        continue;  /* Too large value to convert */
      if (sizeof(buf) < t->str.len + 1)
      {
        fprintf (stderr,
                 "ERROR: dstrs_w_values[%u] has too long (%u) string, "
                 "size of 'buf' should be increased.\n",
                 (unsigned int) i, (unsigned int) t->str.len);
        exit (99);
      }
      rs = 0; /* Only to mute compiler warning */
      for (b_size = 0; b_size <= t->str.len + 1; ++b_size)
      {
        /* fill buffer with pseudo-random values */
        memcpy (buf, erase, sizeof(buf));

        rs = MHD_uint32_to_strx ((uint32_t) t->val, buf, b_size);

        if (t->num_of_digt > b_size)
        {
          /* Must fail, buffer is too small for result */
          if (0 != rs)
          {
            if (0 == c_failed[i])
              t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_uint32_to_strx(0x%" PRIX64 ", -> buf,"
                     " %d) returned %" PRIuPTR
                     ", while expecting 0."
                     " Locale: %s\n", t->val, (int) b_size, (uintptr_t) rs,
                     get_current_locale_str ());
          }
        }
        else
        {
          if (t->num_of_digt != rs)
          {
            if (0 == c_failed[i])
              t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_uint32_to_strx(0x%" PRIX64 ", -> buf,"
                     " %d) returned %" PRIuPTR
                     ", while expecting %d."
                     " Locale: %s\n", t->val, (int) b_size, (uintptr_t) rs,
                     (int) t->num_of_digt, get_current_locale_str ());
          }
          else if (0 == MHD_str_equal_caseless_bin_n_ (buf, t->str.str,
                                                       t->num_of_digt))
          {
            if (0 == c_failed[i])
              t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_uint32_to_strx(0x%" PRIX64 ", -> \"%.*s\","
                     " %d) returned %" PRIuPTR "."
                     " Locale: %s\n", t->val, (int) rs, buf, (int) b_size,
                     (uintptr_t) rs,  get_current_locale_str ());
          }
          else if (sizeof(buf) <= rs)
          {
            fprintf (stderr,
                     "ERROR: dstrs_w_values[%u] has string with too many"
                     "(%u) digits, size of 'buf' should be increased.\n",
                     (unsigned int) i, (unsigned int) rs);
            exit (99);
          }
          else if (0 != memcmp (buf + rs, erase + rs, sizeof(buf) - rs))
          {
            if (0 == c_failed[i])
              t_failed++;
            c_failed[i] = ! 0;
            fprintf (stderr,
                     "FAILED: MHD_uint32_to_strx(0x%" PRIX64 ", -> \"%.*s\","
                     " %d) returned %" PRIuPTR
                     " and touched data after the resulting string."
                     " Locale: %s\n", t->val, (int) rs, buf, (int) b_size,
                     (uintptr_t) rs,  get_current_locale_str ());
          }
        }
      }
      if ((verbose > 1) && (j == locale_name_count - 1) && ! c_failed[i])
        printf ("PASSED: MHD_uint32_to_strx(0x%" PRIX64 ", -> \"%.*s\", %d) "
                "== %" PRIuPTR "\n",
                t->val, (int) rs, buf, (int) b_size - 1, (uintptr_t) rs);
    }
  }
  return t_failed;
}


static const struct str_with_value duint8_w_values_p1[] = {
  {D_STR_W_LEN ("0"), 1, 0},
  {D_STR_W_LEN ("1"), 1, 1},
  {D_STR_W_LEN ("2"), 1, 2},
  {D_STR_W_LEN ("3"), 1, 3},
  {D_STR_W_LEN ("4"), 1, 4},
  {D_STR_W_LEN ("5"), 1, 5},
  {D_STR_W_LEN ("6"), 1, 6},
  {D_STR_W_LEN ("7"), 1, 7},
  {D_STR_W_LEN ("8"), 1, 8},
  {D_STR_W_LEN ("9"), 1, 9},
  {D_STR_W_LEN ("10"), 2, 10},
  {D_STR_W_LEN ("11"), 2, 11},
  {D_STR_W_LEN ("12"), 2, 12},
  {D_STR_W_LEN ("13"), 2, 13},
  {D_STR_W_LEN ("14"), 2, 14},
  {D_STR_W_LEN ("15"), 2, 15},
  {D_STR_W_LEN ("16"), 2, 16},
  {D_STR_W_LEN ("17"), 2, 17},
  {D_STR_W_LEN ("18"), 2, 18},
  {D_STR_W_LEN ("19"), 2, 19},
  {D_STR_W_LEN ("20"), 2, 20},
  {D_STR_W_LEN ("21"), 2, 21},
  {D_STR_W_LEN ("22"), 2, 22},
  {D_STR_W_LEN ("23"), 2, 23},
  {D_STR_W_LEN ("24"), 2, 24},
  {D_STR_W_LEN ("25"), 2, 25},
  {D_STR_W_LEN ("26"), 2, 26},
  {D_STR_W_LEN ("27"), 2, 27},
  {D_STR_W_LEN ("28"), 2, 28},
  {D_STR_W_LEN ("29"), 2, 29},
  {D_STR_W_LEN ("30"), 2, 30},
  {D_STR_W_LEN ("31"), 2, 31},
  {D_STR_W_LEN ("32"), 2, 32},
  {D_STR_W_LEN ("33"), 2, 33},
  {D_STR_W_LEN ("34"), 2, 34},
  {D_STR_W_LEN ("35"), 2, 35},
  {D_STR_W_LEN ("36"), 2, 36},
  {D_STR_W_LEN ("37"), 2, 37},
  {D_STR_W_LEN ("38"), 2, 38},
  {D_STR_W_LEN ("39"), 2, 39},
  {D_STR_W_LEN ("40"), 2, 40},
  {D_STR_W_LEN ("41"), 2, 41},
  {D_STR_W_LEN ("42"), 2, 42},
  {D_STR_W_LEN ("43"), 2, 43},
  {D_STR_W_LEN ("44"), 2, 44},
  {D_STR_W_LEN ("45"), 2, 45},
  {D_STR_W_LEN ("46"), 2, 46},
  {D_STR_W_LEN ("47"), 2, 47},
  {D_STR_W_LEN ("48"), 2, 48},
  {D_STR_W_LEN ("49"), 2, 49},
  {D_STR_W_LEN ("50"), 2, 50},
  {D_STR_W_LEN ("51"), 2, 51},
  {D_STR_W_LEN ("52"), 2, 52},
  {D_STR_W_LEN ("53"), 2, 53},
  {D_STR_W_LEN ("54"), 2, 54},
  {D_STR_W_LEN ("55"), 2, 55},
  {D_STR_W_LEN ("56"), 2, 56},
  {D_STR_W_LEN ("57"), 2, 57},
  {D_STR_W_LEN ("58"), 2, 58},
  {D_STR_W_LEN ("59"), 2, 59},
  {D_STR_W_LEN ("60"), 2, 60},
  {D_STR_W_LEN ("61"), 2, 61},
  {D_STR_W_LEN ("62"), 2, 62},
  {D_STR_W_LEN ("63"), 2, 63},
  {D_STR_W_LEN ("64"), 2, 64},
  {D_STR_W_LEN ("65"), 2, 65},
  {D_STR_W_LEN ("66"), 2, 66},
  {D_STR_W_LEN ("67"), 2, 67},
  {D_STR_W_LEN ("68"), 2, 68},
  {D_STR_W_LEN ("69"), 2, 69},
  {D_STR_W_LEN ("70"), 2, 70},
  {D_STR_W_LEN ("71"), 2, 71},
  {D_STR_W_LEN ("72"), 2, 72},
  {D_STR_W_LEN ("73"), 2, 73},
  {D_STR_W_LEN ("74"), 2, 74},
  {D_STR_W_LEN ("75"), 2, 75},
  {D_STR_W_LEN ("76"), 2, 76},
  {D_STR_W_LEN ("77"), 2, 77},
  {D_STR_W_LEN ("78"), 2, 78},
  {D_STR_W_LEN ("79"), 2, 79},
  {D_STR_W_LEN ("80"), 2, 80},
  {D_STR_W_LEN ("81"), 2, 81},
  {D_STR_W_LEN ("82"), 2, 82},
  {D_STR_W_LEN ("83"), 2, 83},
  {D_STR_W_LEN ("84"), 2, 84},
  {D_STR_W_LEN ("85"), 2, 85},
  {D_STR_W_LEN ("86"), 2, 86},
  {D_STR_W_LEN ("87"), 2, 87},
  {D_STR_W_LEN ("88"), 2, 88},
  {D_STR_W_LEN ("89"), 2, 89},
  {D_STR_W_LEN ("90"), 2, 90},
  {D_STR_W_LEN ("91"), 2, 91},
  {D_STR_W_LEN ("92"), 2, 92},
  {D_STR_W_LEN ("93"), 2, 93},
  {D_STR_W_LEN ("94"), 2, 94},
  {D_STR_W_LEN ("95"), 2, 95},
  {D_STR_W_LEN ("96"), 2, 96},
  {D_STR_W_LEN ("97"), 2, 97},
  {D_STR_W_LEN ("98"), 2, 98},
  {D_STR_W_LEN ("99"), 2, 99},
  {D_STR_W_LEN ("100"), 3, 100},
  {D_STR_W_LEN ("101"), 3, 101},
  {D_STR_W_LEN ("102"), 3, 102},
  {D_STR_W_LEN ("103"), 3, 103},
  {D_STR_W_LEN ("104"), 3, 104},
  {D_STR_W_LEN ("105"), 3, 105},
  {D_STR_W_LEN ("106"), 3, 106},
  {D_STR_W_LEN ("107"), 3, 107},
  {D_STR_W_LEN ("108"), 3, 108},
  {D_STR_W_LEN ("109"), 3, 109},
  {D_STR_W_LEN ("110"), 3, 110},
  {D_STR_W_LEN ("111"), 3, 111},
  {D_STR_W_LEN ("112"), 3, 112},
  {D_STR_W_LEN ("113"), 3, 113},
  {D_STR_W_LEN ("114"), 3, 114},
  {D_STR_W_LEN ("115"), 3, 115},
  {D_STR_W_LEN ("116"), 3, 116},
  {D_STR_W_LEN ("117"), 3, 117},
  {D_STR_W_LEN ("118"), 3, 118},
  {D_STR_W_LEN ("119"), 3, 119},
  {D_STR_W_LEN ("120"), 3, 120},
  {D_STR_W_LEN ("121"), 3, 121},
  {D_STR_W_LEN ("122"), 3, 122},
  {D_STR_W_LEN ("123"), 3, 123},
  {D_STR_W_LEN ("124"), 3, 124},
  {D_STR_W_LEN ("125"), 3, 125},
  {D_STR_W_LEN ("126"), 3, 126},
  {D_STR_W_LEN ("127"), 3, 127},
  {D_STR_W_LEN ("128"), 3, 128},
  {D_STR_W_LEN ("129"), 3, 129},
  {D_STR_W_LEN ("130"), 3, 130},
  {D_STR_W_LEN ("131"), 3, 131},
  {D_STR_W_LEN ("132"), 3, 132},
  {D_STR_W_LEN ("133"), 3, 133},
  {D_STR_W_LEN ("134"), 3, 134},
  {D_STR_W_LEN ("135"), 3, 135},
  {D_STR_W_LEN ("136"), 3, 136},
  {D_STR_W_LEN ("137"), 3, 137},
  {D_STR_W_LEN ("138"), 3, 138},
  {D_STR_W_LEN ("139"), 3, 139},
  {D_STR_W_LEN ("140"), 3, 140},
  {D_STR_W_LEN ("141"), 3, 141},
  {D_STR_W_LEN ("142"), 3, 142},
  {D_STR_W_LEN ("143"), 3, 143},
  {D_STR_W_LEN ("144"), 3, 144},
  {D_STR_W_LEN ("145"), 3, 145},
  {D_STR_W_LEN ("146"), 3, 146},
  {D_STR_W_LEN ("147"), 3, 147},
  {D_STR_W_LEN ("148"), 3, 148},
  {D_STR_W_LEN ("149"), 3, 149},
  {D_STR_W_LEN ("150"), 3, 150},
  {D_STR_W_LEN ("151"), 3, 151},
  {D_STR_W_LEN ("152"), 3, 152},
  {D_STR_W_LEN ("153"), 3, 153},
  {D_STR_W_LEN ("154"), 3, 154},
  {D_STR_W_LEN ("155"), 3, 155},
  {D_STR_W_LEN ("156"), 3, 156},
  {D_STR_W_LEN ("157"), 3, 157},
  {D_STR_W_LEN ("158"), 3, 158},
  {D_STR_W_LEN ("159"), 3, 159},
  {D_STR_W_LEN ("160"), 3, 160},
  {D_STR_W_LEN ("161"), 3, 161},
  {D_STR_W_LEN ("162"), 3, 162},
  {D_STR_W_LEN ("163"), 3, 163},
  {D_STR_W_LEN ("164"), 3, 164},
  {D_STR_W_LEN ("165"), 3, 165},
  {D_STR_W_LEN ("166"), 3, 166},
  {D_STR_W_LEN ("167"), 3, 167},
  {D_STR_W_LEN ("168"), 3, 168},
  {D_STR_W_LEN ("169"), 3, 169},
  {D_STR_W_LEN ("170"), 3, 170},
  {D_STR_W_LEN ("171"), 3, 171},
  {D_STR_W_LEN ("172"), 3, 172},
  {D_STR_W_LEN ("173"), 3, 173},
  {D_STR_W_LEN ("174"), 3, 174},
  {D_STR_W_LEN ("175"), 3, 175},
  {D_STR_W_LEN ("176"), 3, 176},
  {D_STR_W_LEN ("177"), 3, 177},
  {D_STR_W_LEN ("178"), 3, 178},
  {D_STR_W_LEN ("179"), 3, 179},
  {D_STR_W_LEN ("180"), 3, 180},
  {D_STR_W_LEN ("181"), 3, 181},
  {D_STR_W_LEN ("182"), 3, 182},
  {D_STR_W_LEN ("183"), 3, 183},
  {D_STR_W_LEN ("184"), 3, 184},
  {D_STR_W_LEN ("185"), 3, 185},
  {D_STR_W_LEN ("186"), 3, 186},
  {D_STR_W_LEN ("187"), 3, 187},
  {D_STR_W_LEN ("188"), 3, 188},
  {D_STR_W_LEN ("189"), 3, 189},
  {D_STR_W_LEN ("190"), 3, 190},
  {D_STR_W_LEN ("191"), 3, 191},
  {D_STR_W_LEN ("192"), 3, 192},
  {D_STR_W_LEN ("193"), 3, 193},
  {D_STR_W_LEN ("194"), 3, 194},
  {D_STR_W_LEN ("195"), 3, 195},
  {D_STR_W_LEN ("196"), 3, 196},
  {D_STR_W_LEN ("197"), 3, 197},
  {D_STR_W_LEN ("198"), 3, 198},
  {D_STR_W_LEN ("199"), 3, 199},
  {D_STR_W_LEN ("200"), 3, 200},
  {D_STR_W_LEN ("201"), 3, 201},
  {D_STR_W_LEN ("202"), 3, 202},
  {D_STR_W_LEN ("203"), 3, 203},
  {D_STR_W_LEN ("204"), 3, 204},
  {D_STR_W_LEN ("205"), 3, 205},
  {D_STR_W_LEN ("206"), 3, 206},
  {D_STR_W_LEN ("207"), 3, 207},
  {D_STR_W_LEN ("208"), 3, 208},
  {D_STR_W_LEN ("209"), 3, 209},
  {D_STR_W_LEN ("210"), 3, 210},
  {D_STR_W_LEN ("211"), 3, 211},
  {D_STR_W_LEN ("212"), 3, 212},
  {D_STR_W_LEN ("213"), 3, 213},
  {D_STR_W_LEN ("214"), 3, 214},
  {D_STR_W_LEN ("215"), 3, 215},
  {D_STR_W_LEN ("216"), 3, 216},
  {D_STR_W_LEN ("217"), 3, 217},
  {D_STR_W_LEN ("218"), 3, 218},
  {D_STR_W_LEN ("219"), 3, 219},
  {D_STR_W_LEN ("220"), 3, 220},
  {D_STR_W_LEN ("221"), 3, 221},
  {D_STR_W_LEN ("222"), 3, 222},
  {D_STR_W_LEN ("223"), 3, 223},
  {D_STR_W_LEN ("224"), 3, 224},
  {D_STR_W_LEN ("225"), 3, 225},
  {D_STR_W_LEN ("226"), 3, 226},
  {D_STR_W_LEN ("227"), 3, 227},
  {D_STR_W_LEN ("228"), 3, 228},
  {D_STR_W_LEN ("229"), 3, 229},
  {D_STR_W_LEN ("230"), 3, 230},
  {D_STR_W_LEN ("231"), 3, 231},
  {D_STR_W_LEN ("232"), 3, 232},
  {D_STR_W_LEN ("233"), 3, 233},
  {D_STR_W_LEN ("234"), 3, 234},
  {D_STR_W_LEN ("235"), 3, 235},
  {D_STR_W_LEN ("236"), 3, 236},
  {D_STR_W_LEN ("237"), 3, 237},
  {D_STR_W_LEN ("238"), 3, 238},
  {D_STR_W_LEN ("239"), 3, 239},
  {D_STR_W_LEN ("240"), 3, 240},
  {D_STR_W_LEN ("241"), 3, 241},
  {D_STR_W_LEN ("242"), 3, 242},
  {D_STR_W_LEN ("243"), 3, 243},
  {D_STR_W_LEN ("244"), 3, 244},
  {D_STR_W_LEN ("245"), 3, 245},
  {D_STR_W_LEN ("246"), 3, 246},
  {D_STR_W_LEN ("247"), 3, 247},
  {D_STR_W_LEN ("248"), 3, 248},
  {D_STR_W_LEN ("249"), 3, 249},
  {D_STR_W_LEN ("250"), 3, 250},
  {D_STR_W_LEN ("251"), 3, 251},
  {D_STR_W_LEN ("252"), 3, 252},
  {D_STR_W_LEN ("253"), 3, 253},
  {D_STR_W_LEN ("254"), 3, 254},
  {D_STR_W_LEN ("255"), 3, 255},
};

static const struct str_with_value duint8_w_values_p2[] = {
  {D_STR_W_LEN ("00"), 2, 0},
  {D_STR_W_LEN ("01"), 2, 1},
  {D_STR_W_LEN ("02"), 2, 2},
  {D_STR_W_LEN ("03"), 2, 3},
  {D_STR_W_LEN ("04"), 2, 4},
  {D_STR_W_LEN ("05"), 2, 5},
  {D_STR_W_LEN ("06"), 2, 6},
  {D_STR_W_LEN ("07"), 2, 7},
  {D_STR_W_LEN ("08"), 2, 8},
  {D_STR_W_LEN ("09"), 2, 9},
  {D_STR_W_LEN ("10"), 2, 10},
  {D_STR_W_LEN ("11"), 2, 11},
  {D_STR_W_LEN ("12"), 2, 12},
  {D_STR_W_LEN ("13"), 2, 13},
  {D_STR_W_LEN ("14"), 2, 14},
  {D_STR_W_LEN ("15"), 2, 15},
  {D_STR_W_LEN ("16"), 2, 16},
  {D_STR_W_LEN ("17"), 2, 17},
  {D_STR_W_LEN ("18"), 2, 18},
  {D_STR_W_LEN ("19"), 2, 19},
  {D_STR_W_LEN ("20"), 2, 20},
  {D_STR_W_LEN ("21"), 2, 21},
  {D_STR_W_LEN ("22"), 2, 22},
  {D_STR_W_LEN ("23"), 2, 23},
  {D_STR_W_LEN ("24"), 2, 24},
  {D_STR_W_LEN ("25"), 2, 25},
  {D_STR_W_LEN ("26"), 2, 26},
  {D_STR_W_LEN ("27"), 2, 27},
  {D_STR_W_LEN ("28"), 2, 28},
  {D_STR_W_LEN ("29"), 2, 29},
  {D_STR_W_LEN ("30"), 2, 30},
  {D_STR_W_LEN ("31"), 2, 31},
  {D_STR_W_LEN ("32"), 2, 32},
  {D_STR_W_LEN ("33"), 2, 33},
  {D_STR_W_LEN ("34"), 2, 34},
  {D_STR_W_LEN ("35"), 2, 35},
  {D_STR_W_LEN ("36"), 2, 36},
  {D_STR_W_LEN ("37"), 2, 37},
  {D_STR_W_LEN ("38"), 2, 38},
  {D_STR_W_LEN ("39"), 2, 39},
  {D_STR_W_LEN ("40"), 2, 40},
  {D_STR_W_LEN ("41"), 2, 41},
  {D_STR_W_LEN ("42"), 2, 42},
  {D_STR_W_LEN ("43"), 2, 43},
  {D_STR_W_LEN ("44"), 2, 44},
  {D_STR_W_LEN ("45"), 2, 45},
  {D_STR_W_LEN ("46"), 2, 46},
  {D_STR_W_LEN ("47"), 2, 47},
  {D_STR_W_LEN ("48"), 2, 48},
  {D_STR_W_LEN ("49"), 2, 49},
  {D_STR_W_LEN ("50"), 2, 50},
  {D_STR_W_LEN ("51"), 2, 51},
  {D_STR_W_LEN ("52"), 2, 52},
  {D_STR_W_LEN ("53"), 2, 53},
  {D_STR_W_LEN ("54"), 2, 54},
  {D_STR_W_LEN ("55"), 2, 55},
  {D_STR_W_LEN ("56"), 2, 56},
  {D_STR_W_LEN ("57"), 2, 57},
  {D_STR_W_LEN ("58"), 2, 58},
  {D_STR_W_LEN ("59"), 2, 59},
  {D_STR_W_LEN ("60"), 2, 60},
  {D_STR_W_LEN ("61"), 2, 61},
  {D_STR_W_LEN ("62"), 2, 62},
  {D_STR_W_LEN ("63"), 2, 63},
  {D_STR_W_LEN ("64"), 2, 64},
  {D_STR_W_LEN ("65"), 2, 65},
  {D_STR_W_LEN ("66"), 2, 66},
  {D_STR_W_LEN ("67"), 2, 67},
  {D_STR_W_LEN ("68"), 2, 68},
  {D_STR_W_LEN ("69"), 2, 69},
  {D_STR_W_LEN ("70"), 2, 70},
  {D_STR_W_LEN ("71"), 2, 71},
  {D_STR_W_LEN ("72"), 2, 72},
  {D_STR_W_LEN ("73"), 2, 73},
  {D_STR_W_LEN ("74"), 2, 74},
  {D_STR_W_LEN ("75"), 2, 75},
  {D_STR_W_LEN ("76"), 2, 76},
  {D_STR_W_LEN ("77"), 2, 77},
  {D_STR_W_LEN ("78"), 2, 78},
  {D_STR_W_LEN ("79"), 2, 79},
  {D_STR_W_LEN ("80"), 2, 80},
  {D_STR_W_LEN ("81"), 2, 81},
  {D_STR_W_LEN ("82"), 2, 82},
  {D_STR_W_LEN ("83"), 2, 83},
  {D_STR_W_LEN ("84"), 2, 84},
  {D_STR_W_LEN ("85"), 2, 85},
  {D_STR_W_LEN ("86"), 2, 86},
  {D_STR_W_LEN ("87"), 2, 87},
  {D_STR_W_LEN ("88"), 2, 88},
  {D_STR_W_LEN ("89"), 2, 89},
  {D_STR_W_LEN ("90"), 2, 90},
  {D_STR_W_LEN ("91"), 2, 91},
  {D_STR_W_LEN ("92"), 2, 92},
  {D_STR_W_LEN ("93"), 2, 93},
  {D_STR_W_LEN ("94"), 2, 94},
  {D_STR_W_LEN ("95"), 2, 95},
  {D_STR_W_LEN ("96"), 2, 96},
  {D_STR_W_LEN ("97"), 2, 97},
  {D_STR_W_LEN ("98"), 2, 98},
  {D_STR_W_LEN ("99"), 2, 99},
  {D_STR_W_LEN ("100"), 3, 100},
  {D_STR_W_LEN ("101"), 3, 101},
  {D_STR_W_LEN ("102"), 3, 102},
  {D_STR_W_LEN ("103"), 3, 103},
  {D_STR_W_LEN ("104"), 3, 104},
  {D_STR_W_LEN ("105"), 3, 105},
  {D_STR_W_LEN ("106"), 3, 106},
  {D_STR_W_LEN ("107"), 3, 107},
  {D_STR_W_LEN ("108"), 3, 108},
  {D_STR_W_LEN ("109"), 3, 109},
  {D_STR_W_LEN ("110"), 3, 110},
  {D_STR_W_LEN ("111"), 3, 111},
  {D_STR_W_LEN ("112"), 3, 112},
  {D_STR_W_LEN ("113"), 3, 113},
  {D_STR_W_LEN ("114"), 3, 114},
  {D_STR_W_LEN ("115"), 3, 115},
  {D_STR_W_LEN ("116"), 3, 116},
  {D_STR_W_LEN ("117"), 3, 117},
  {D_STR_W_LEN ("118"), 3, 118},
  {D_STR_W_LEN ("119"), 3, 119},
  {D_STR_W_LEN ("120"), 3, 120},
  {D_STR_W_LEN ("121"), 3, 121},
  {D_STR_W_LEN ("122"), 3, 122},
  {D_STR_W_LEN ("123"), 3, 123},
  {D_STR_W_LEN ("124"), 3, 124},
  {D_STR_W_LEN ("125"), 3, 125},
  {D_STR_W_LEN ("126"), 3, 126},
  {D_STR_W_LEN ("127"), 3, 127},
  {D_STR_W_LEN ("128"), 3, 128},
  {D_STR_W_LEN ("129"), 3, 129},
  {D_STR_W_LEN ("130"), 3, 130},
  {D_STR_W_LEN ("131"), 3, 131},
  {D_STR_W_LEN ("132"), 3, 132},
  {D_STR_W_LEN ("133"), 3, 133},
  {D_STR_W_LEN ("134"), 3, 134},
  {D_STR_W_LEN ("135"), 3, 135},
  {D_STR_W_LEN ("136"), 3, 136},
  {D_STR_W_LEN ("137"), 3, 137},
  {D_STR_W_LEN ("138"), 3, 138},
  {D_STR_W_LEN ("139"), 3, 139},
  {D_STR_W_LEN ("140"), 3, 140},
  {D_STR_W_LEN ("141"), 3, 141},
  {D_STR_W_LEN ("142"), 3, 142},
  {D_STR_W_LEN ("143"), 3, 143},
  {D_STR_W_LEN ("144"), 3, 144},
  {D_STR_W_LEN ("145"), 3, 145},
  {D_STR_W_LEN ("146"), 3, 146},
  {D_STR_W_LEN ("147"), 3, 147},
  {D_STR_W_LEN ("148"), 3, 148},
  {D_STR_W_LEN ("149"), 3, 149},
  {D_STR_W_LEN ("150"), 3, 150},
  {D_STR_W_LEN ("151"), 3, 151},
  {D_STR_W_LEN ("152"), 3, 152},
  {D_STR_W_LEN ("153"), 3, 153},
  {D_STR_W_LEN ("154"), 3, 154},
  {D_STR_W_LEN ("155"), 3, 155},
  {D_STR_W_LEN ("156"), 3, 156},
  {D_STR_W_LEN ("157"), 3, 157},
  {D_STR_W_LEN ("158"), 3, 158},
  {D_STR_W_LEN ("159"), 3, 159},
  {D_STR_W_LEN ("160"), 3, 160},
  {D_STR_W_LEN ("161"), 3, 161},
  {D_STR_W_LEN ("162"), 3, 162},
  {D_STR_W_LEN ("163"), 3, 163},
  {D_STR_W_LEN ("164"), 3, 164},
  {D_STR_W_LEN ("165"), 3, 165},
  {D_STR_W_LEN ("166"), 3, 166},
  {D_STR_W_LEN ("167"), 3, 167},
  {D_STR_W_LEN ("168"), 3, 168},
  {D_STR_W_LEN ("169"), 3, 169},
  {D_STR_W_LEN ("170"), 3, 170},
  {D_STR_W_LEN ("171"), 3, 171},
  {D_STR_W_LEN ("172"), 3, 172},
  {D_STR_W_LEN ("173"), 3, 173},
  {D_STR_W_LEN ("174"), 3, 174},
  {D_STR_W_LEN ("175"), 3, 175},
  {D_STR_W_LEN ("176"), 3, 176},
  {D_STR_W_LEN ("177"), 3, 177},
  {D_STR_W_LEN ("178"), 3, 178},
  {D_STR_W_LEN ("179"), 3, 179},
  {D_STR_W_LEN ("180"), 3, 180},
  {D_STR_W_LEN ("181"), 3, 181},
  {D_STR_W_LEN ("182"), 3, 182},
  {D_STR_W_LEN ("183"), 3, 183},
  {D_STR_W_LEN ("184"), 3, 184},
  {D_STR_W_LEN ("185"), 3, 185},
  {D_STR_W_LEN ("186"), 3, 186},
  {D_STR_W_LEN ("187"), 3, 187},
  {D_STR_W_LEN ("188"), 3, 188},
  {D_STR_W_LEN ("189"), 3, 189},
  {D_STR_W_LEN ("190"), 3, 190},
  {D_STR_W_LEN ("191"), 3, 191},
  {D_STR_W_LEN ("192"), 3, 192},
  {D_STR_W_LEN ("193"), 3, 193},
  {D_STR_W_LEN ("194"), 3, 194},
  {D_STR_W_LEN ("195"), 3, 195},
  {D_STR_W_LEN ("196"), 3, 196},
  {D_STR_W_LEN ("197"), 3, 197},
  {D_STR_W_LEN ("198"), 3, 198},
  {D_STR_W_LEN ("199"), 3, 199},
  {D_STR_W_LEN ("200"), 3, 200},
  {D_STR_W_LEN ("201"), 3, 201},
  {D_STR_W_LEN ("202"), 3, 202},
  {D_STR_W_LEN ("203"), 3, 203},
  {D_STR_W_LEN ("204"), 3, 204},
  {D_STR_W_LEN ("205"), 3, 205},
  {D_STR_W_LEN ("206"), 3, 206},
  {D_STR_W_LEN ("207"), 3, 207},
  {D_STR_W_LEN ("208"), 3, 208},
  {D_STR_W_LEN ("209"), 3, 209},
  {D_STR_W_LEN ("210"), 3, 210},
  {D_STR_W_LEN ("211"), 3, 211},
  {D_STR_W_LEN ("212"), 3, 212},
  {D_STR_W_LEN ("213"), 3, 213},
  {D_STR_W_LEN ("214"), 3, 214},
  {D_STR_W_LEN ("215"), 3, 215},
  {D_STR_W_LEN ("216"), 3, 216},
  {D_STR_W_LEN ("217"), 3, 217},
  {D_STR_W_LEN ("218"), 3, 218},
  {D_STR_W_LEN ("219"), 3, 219},
  {D_STR_W_LEN ("220"), 3, 220},
  {D_STR_W_LEN ("221"), 3, 221},
  {D_STR_W_LEN ("222"), 3, 222},
  {D_STR_W_LEN ("223"), 3, 223},
  {D_STR_W_LEN ("224"), 3, 224},
  {D_STR_W_LEN ("225"), 3, 225},
  {D_STR_W_LEN ("226"), 3, 226},
  {D_STR_W_LEN ("227"), 3, 227},
  {D_STR_W_LEN ("228"), 3, 228},
  {D_STR_W_LEN ("229"), 3, 229},
  {D_STR_W_LEN ("230"), 3, 230},
  {D_STR_W_LEN ("231"), 3, 231},
  {D_STR_W_LEN ("232"), 3, 232},
  {D_STR_W_LEN ("233"), 3, 233},
  {D_STR_W_LEN ("234"), 3, 234},
  {D_STR_W_LEN ("235"), 3, 235},
  {D_STR_W_LEN ("236"), 3, 236},
  {D_STR_W_LEN ("237"), 3, 237},
  {D_STR_W_LEN ("238"), 3, 238},
  {D_STR_W_LEN ("239"), 3, 239},
  {D_STR_W_LEN ("240"), 3, 240},
  {D_STR_W_LEN ("241"), 3, 241},
  {D_STR_W_LEN ("242"), 3, 242},
  {D_STR_W_LEN ("243"), 3, 243},
  {D_STR_W_LEN ("244"), 3, 244},
  {D_STR_W_LEN ("245"), 3, 245},
  {D_STR_W_LEN ("246"), 3, 246},
  {D_STR_W_LEN ("247"), 3, 247},
  {D_STR_W_LEN ("248"), 3, 248},
  {D_STR_W_LEN ("249"), 3, 249},
  {D_STR_W_LEN ("250"), 3, 250},
  {D_STR_W_LEN ("251"), 3, 251},
  {D_STR_W_LEN ("252"), 3, 252},
  {D_STR_W_LEN ("253"), 3, 253},
  {D_STR_W_LEN ("254"), 3, 254},
  {D_STR_W_LEN ("255"), 3, 255}
};

static const struct str_with_value duint8_w_values_p3[] = {
  {D_STR_W_LEN ("000"), 3, 0},
  {D_STR_W_LEN ("001"), 3, 1},
  {D_STR_W_LEN ("002"), 3, 2},
  {D_STR_W_LEN ("003"), 3, 3},
  {D_STR_W_LEN ("004"), 3, 4},
  {D_STR_W_LEN ("005"), 3, 5},
  {D_STR_W_LEN ("006"), 3, 6},
  {D_STR_W_LEN ("007"), 3, 7},
  {D_STR_W_LEN ("008"), 3, 8},
  {D_STR_W_LEN ("009"), 3, 9},
  {D_STR_W_LEN ("010"), 3, 10},
  {D_STR_W_LEN ("011"), 3, 11},
  {D_STR_W_LEN ("012"), 3, 12},
  {D_STR_W_LEN ("013"), 3, 13},
  {D_STR_W_LEN ("014"), 3, 14},
  {D_STR_W_LEN ("015"), 3, 15},
  {D_STR_W_LEN ("016"), 3, 16},
  {D_STR_W_LEN ("017"), 3, 17},
  {D_STR_W_LEN ("018"), 3, 18},
  {D_STR_W_LEN ("019"), 3, 19},
  {D_STR_W_LEN ("020"), 3, 20},
  {D_STR_W_LEN ("021"), 3, 21},
  {D_STR_W_LEN ("022"), 3, 22},
  {D_STR_W_LEN ("023"), 3, 23},
  {D_STR_W_LEN ("024"), 3, 24},
  {D_STR_W_LEN ("025"), 3, 25},
  {D_STR_W_LEN ("026"), 3, 26},
  {D_STR_W_LEN ("027"), 3, 27},
  {D_STR_W_LEN ("028"), 3, 28},
  {D_STR_W_LEN ("029"), 3, 29},
  {D_STR_W_LEN ("030"), 3, 30},
  {D_STR_W_LEN ("031"), 3, 31},
  {D_STR_W_LEN ("032"), 3, 32},
  {D_STR_W_LEN ("033"), 3, 33},
  {D_STR_W_LEN ("034"), 3, 34},
  {D_STR_W_LEN ("035"), 3, 35},
  {D_STR_W_LEN ("036"), 3, 36},
  {D_STR_W_LEN ("037"), 3, 37},
  {D_STR_W_LEN ("038"), 3, 38},
  {D_STR_W_LEN ("039"), 3, 39},
  {D_STR_W_LEN ("040"), 3, 40},
  {D_STR_W_LEN ("041"), 3, 41},
  {D_STR_W_LEN ("042"), 3, 42},
  {D_STR_W_LEN ("043"), 3, 43},
  {D_STR_W_LEN ("044"), 3, 44},
  {D_STR_W_LEN ("045"), 3, 45},
  {D_STR_W_LEN ("046"), 3, 46},
  {D_STR_W_LEN ("047"), 3, 47},
  {D_STR_W_LEN ("048"), 3, 48},
  {D_STR_W_LEN ("049"), 3, 49},
  {D_STR_W_LEN ("050"), 3, 50},
  {D_STR_W_LEN ("051"), 3, 51},
  {D_STR_W_LEN ("052"), 3, 52},
  {D_STR_W_LEN ("053"), 3, 53},
  {D_STR_W_LEN ("054"), 3, 54},
  {D_STR_W_LEN ("055"), 3, 55},
  {D_STR_W_LEN ("056"), 3, 56},
  {D_STR_W_LEN ("057"), 3, 57},
  {D_STR_W_LEN ("058"), 3, 58},
  {D_STR_W_LEN ("059"), 3, 59},
  {D_STR_W_LEN ("060"), 3, 60},
  {D_STR_W_LEN ("061"), 3, 61},
  {D_STR_W_LEN ("062"), 3, 62},
  {D_STR_W_LEN ("063"), 3, 63},
  {D_STR_W_LEN ("064"), 3, 64},
  {D_STR_W_LEN ("065"), 3, 65},
  {D_STR_W_LEN ("066"), 3, 66},
  {D_STR_W_LEN ("067"), 3, 67},
  {D_STR_W_LEN ("068"), 3, 68},
  {D_STR_W_LEN ("069"), 3, 69},
  {D_STR_W_LEN ("070"), 3, 70},
  {D_STR_W_LEN ("071"), 3, 71},
  {D_STR_W_LEN ("072"), 3, 72},
  {D_STR_W_LEN ("073"), 3, 73},
  {D_STR_W_LEN ("074"), 3, 74},
  {D_STR_W_LEN ("075"), 3, 75},
  {D_STR_W_LEN ("076"), 3, 76},
  {D_STR_W_LEN ("077"), 3, 77},
  {D_STR_W_LEN ("078"), 3, 78},
  {D_STR_W_LEN ("079"), 3, 79},
  {D_STR_W_LEN ("080"), 3, 80},
  {D_STR_W_LEN ("081"), 3, 81},
  {D_STR_W_LEN ("082"), 3, 82},
  {D_STR_W_LEN ("083"), 3, 83},
  {D_STR_W_LEN ("084"), 3, 84},
  {D_STR_W_LEN ("085"), 3, 85},
  {D_STR_W_LEN ("086"), 3, 86},
  {D_STR_W_LEN ("087"), 3, 87},
  {D_STR_W_LEN ("088"), 3, 88},
  {D_STR_W_LEN ("089"), 3, 89},
  {D_STR_W_LEN ("090"), 3, 90},
  {D_STR_W_LEN ("091"), 3, 91},
  {D_STR_W_LEN ("092"), 3, 92},
  {D_STR_W_LEN ("093"), 3, 93},
  {D_STR_W_LEN ("094"), 3, 94},
  {D_STR_W_LEN ("095"), 3, 95},
  {D_STR_W_LEN ("096"), 3, 96},
  {D_STR_W_LEN ("097"), 3, 97},
  {D_STR_W_LEN ("098"), 3, 98},
  {D_STR_W_LEN ("099"), 3, 99},
  {D_STR_W_LEN ("100"), 3, 100},
  {D_STR_W_LEN ("101"), 3, 101},
  {D_STR_W_LEN ("102"), 3, 102},
  {D_STR_W_LEN ("103"), 3, 103},
  {D_STR_W_LEN ("104"), 3, 104},
  {D_STR_W_LEN ("105"), 3, 105},
  {D_STR_W_LEN ("106"), 3, 106},
  {D_STR_W_LEN ("107"), 3, 107},
  {D_STR_W_LEN ("108"), 3, 108},
  {D_STR_W_LEN ("109"), 3, 109},
  {D_STR_W_LEN ("110"), 3, 110},
  {D_STR_W_LEN ("111"), 3, 111},
  {D_STR_W_LEN ("112"), 3, 112},
  {D_STR_W_LEN ("113"), 3, 113},
  {D_STR_W_LEN ("114"), 3, 114},
  {D_STR_W_LEN ("115"), 3, 115},
  {D_STR_W_LEN ("116"), 3, 116},
  {D_STR_W_LEN ("117"), 3, 117},
  {D_STR_W_LEN ("118"), 3, 118},
  {D_STR_W_LEN ("119"), 3, 119},
  {D_STR_W_LEN ("120"), 3, 120},
  {D_STR_W_LEN ("121"), 3, 121},
  {D_STR_W_LEN ("122"), 3, 122},
  {D_STR_W_LEN ("123"), 3, 123},
  {D_STR_W_LEN ("124"), 3, 124},
  {D_STR_W_LEN ("125"), 3, 125},
  {D_STR_W_LEN ("126"), 3, 126},
  {D_STR_W_LEN ("127"), 3, 127},
  {D_STR_W_LEN ("128"), 3, 128},
  {D_STR_W_LEN ("129"), 3, 129},
  {D_STR_W_LEN ("130"), 3, 130},
  {D_STR_W_LEN ("131"), 3, 131},
  {D_STR_W_LEN ("132"), 3, 132},
  {D_STR_W_LEN ("133"), 3, 133},
  {D_STR_W_LEN ("134"), 3, 134},
  {D_STR_W_LEN ("135"), 3, 135},
  {D_STR_W_LEN ("136"), 3, 136},
  {D_STR_W_LEN ("137"), 3, 137},
  {D_STR_W_LEN ("138"), 3, 138},
  {D_STR_W_LEN ("139"), 3, 139},
  {D_STR_W_LEN ("140"), 3, 140},
  {D_STR_W_LEN ("141"), 3, 141},
  {D_STR_W_LEN ("142"), 3, 142},
  {D_STR_W_LEN ("143"), 3, 143},
  {D_STR_W_LEN ("144"), 3, 144},
  {D_STR_W_LEN ("145"), 3, 145},
  {D_STR_W_LEN ("146"), 3, 146},
  {D_STR_W_LEN ("147"), 3, 147},
  {D_STR_W_LEN ("148"), 3, 148},
  {D_STR_W_LEN ("149"), 3, 149},
  {D_STR_W_LEN ("150"), 3, 150},
  {D_STR_W_LEN ("151"), 3, 151},
  {D_STR_W_LEN ("152"), 3, 152},
  {D_STR_W_LEN ("153"), 3, 153},
  {D_STR_W_LEN ("154"), 3, 154},
  {D_STR_W_LEN ("155"), 3, 155},
  {D_STR_W_LEN ("156"), 3, 156},
  {D_STR_W_LEN ("157"), 3, 157},
  {D_STR_W_LEN ("158"), 3, 158},
  {D_STR_W_LEN ("159"), 3, 159},
  {D_STR_W_LEN ("160"), 3, 160},
  {D_STR_W_LEN ("161"), 3, 161},
  {D_STR_W_LEN ("162"), 3, 162},
  {D_STR_W_LEN ("163"), 3, 163},
  {D_STR_W_LEN ("164"), 3, 164},
  {D_STR_W_LEN ("165"), 3, 165},
  {D_STR_W_LEN ("166"), 3, 166},
  {D_STR_W_LEN ("167"), 3, 167},
  {D_STR_W_LEN ("168"), 3, 168},
  {D_STR_W_LEN ("169"), 3, 169},
  {D_STR_W_LEN ("170"), 3, 170},
  {D_STR_W_LEN ("171"), 3, 171},
  {D_STR_W_LEN ("172"), 3, 172},
  {D_STR_W_LEN ("173"), 3, 173},
  {D_STR_W_LEN ("174"), 3, 174},
  {D_STR_W_LEN ("175"), 3, 175},
  {D_STR_W_LEN ("176"), 3, 176},
  {D_STR_W_LEN ("177"), 3, 177},
  {D_STR_W_LEN ("178"), 3, 178},
  {D_STR_W_LEN ("179"), 3, 179},
  {D_STR_W_LEN ("180"), 3, 180},
  {D_STR_W_LEN ("181"), 3, 181},
  {D_STR_W_LEN ("182"), 3, 182},
  {D_STR_W_LEN ("183"), 3, 183},
  {D_STR_W_LEN ("184"), 3, 184},
  {D_STR_W_LEN ("185"), 3, 185},
  {D_STR_W_LEN ("186"), 3, 186},
  {D_STR_W_LEN ("187"), 3, 187},
  {D_STR_W_LEN ("188"), 3, 188},
  {D_STR_W_LEN ("189"), 3, 189},
  {D_STR_W_LEN ("190"), 3, 190},
  {D_STR_W_LEN ("191"), 3, 191},
  {D_STR_W_LEN ("192"), 3, 192},
  {D_STR_W_LEN ("193"), 3, 193},
  {D_STR_W_LEN ("194"), 3, 194},
  {D_STR_W_LEN ("195"), 3, 195},
  {D_STR_W_LEN ("196"), 3, 196},
  {D_STR_W_LEN ("197"), 3, 197},
  {D_STR_W_LEN ("198"), 3, 198},
  {D_STR_W_LEN ("199"), 3, 199},
  {D_STR_W_LEN ("200"), 3, 200},
  {D_STR_W_LEN ("201"), 3, 201},
  {D_STR_W_LEN ("202"), 3, 202},
  {D_STR_W_LEN ("203"), 3, 203},
  {D_STR_W_LEN ("204"), 3, 204},
  {D_STR_W_LEN ("205"), 3, 205},
  {D_STR_W_LEN ("206"), 3, 206},
  {D_STR_W_LEN ("207"), 3, 207},
  {D_STR_W_LEN ("208"), 3, 208},
  {D_STR_W_LEN ("209"), 3, 209},
  {D_STR_W_LEN ("210"), 3, 210},
  {D_STR_W_LEN ("211"), 3, 211},
  {D_STR_W_LEN ("212"), 3, 212},
  {D_STR_W_LEN ("213"), 3, 213},
  {D_STR_W_LEN ("214"), 3, 214},
  {D_STR_W_LEN ("215"), 3, 215},
  {D_STR_W_LEN ("216"), 3, 216},
  {D_STR_W_LEN ("217"), 3, 217},
  {D_STR_W_LEN ("218"), 3, 218},
  {D_STR_W_LEN ("219"), 3, 219},
  {D_STR_W_LEN ("220"), 3, 220},
  {D_STR_W_LEN ("221"), 3, 221},
  {D_STR_W_LEN ("222"), 3, 222},
  {D_STR_W_LEN ("223"), 3, 223},
  {D_STR_W_LEN ("224"), 3, 224},
  {D_STR_W_LEN ("225"), 3, 225},
  {D_STR_W_LEN ("226"), 3, 226},
  {D_STR_W_LEN ("227"), 3, 227},
  {D_STR_W_LEN ("228"), 3, 228},
  {D_STR_W_LEN ("229"), 3, 229},
  {D_STR_W_LEN ("230"), 3, 230},
  {D_STR_W_LEN ("231"), 3, 231},
  {D_STR_W_LEN ("232"), 3, 232},
  {D_STR_W_LEN ("233"), 3, 233},
  {D_STR_W_LEN ("234"), 3, 234},
  {D_STR_W_LEN ("235"), 3, 235},
  {D_STR_W_LEN ("236"), 3, 236},
  {D_STR_W_LEN ("237"), 3, 237},
  {D_STR_W_LEN ("238"), 3, 238},
  {D_STR_W_LEN ("239"), 3, 239},
  {D_STR_W_LEN ("240"), 3, 240},
  {D_STR_W_LEN ("241"), 3, 241},
  {D_STR_W_LEN ("242"), 3, 242},
  {D_STR_W_LEN ("243"), 3, 243},
  {D_STR_W_LEN ("244"), 3, 244},
  {D_STR_W_LEN ("245"), 3, 245},
  {D_STR_W_LEN ("246"), 3, 246},
  {D_STR_W_LEN ("247"), 3, 247},
  {D_STR_W_LEN ("248"), 3, 248},
  {D_STR_W_LEN ("249"), 3, 249},
  {D_STR_W_LEN ("250"), 3, 250},
  {D_STR_W_LEN ("251"), 3, 251},
  {D_STR_W_LEN ("252"), 3, 252},
  {D_STR_W_LEN ("253"), 3, 253},
  {D_STR_W_LEN ("254"), 3, 254},
  {D_STR_W_LEN ("255"), 3, 255}
};


static const struct str_with_value *duint8_w_values_p[3] =
{duint8_w_values_p1, duint8_w_values_p2, duint8_w_values_p3};

static size_t
check_str_from_uint8_pad (void)
{
  int i;
  uint8_t pad;
  size_t t_failed = 0;

  if ((256 != sizeof(duint8_w_values_p1) / sizeof(duint8_w_values_p1[0])) ||
      (256 != sizeof(duint8_w_values_p2) / sizeof(duint8_w_values_p2[0])) ||
      (256 != sizeof(duint8_w_values_p3) / sizeof(duint8_w_values_p3[0])))
  {
    fprintf (stderr,
             "ERROR: wrong number of items in duint8_w_values_p*.\n");
    exit (99);
  }
  for (pad = 0; pad <= 3; pad++)
  {
    size_t table_num;
    if (0 != pad)
      table_num = pad - 1;
    else
      table_num = 0;

    for (i = 0; i <= 255; i++)
    {
      const struct str_with_value *const t = duint8_w_values_p[table_num] + i;
      size_t b_size;
      size_t rs;
      char buf[8];

      if (t->str.len < t->num_of_digt)
      {
        fprintf (stderr,
                 "ERROR: dstrs_w_values[%u] has wrong num_of_digt (%u): num_of_digt is expected"
                 " to be less or equal to str.len (%u).\n",
                 (unsigned int) i, (unsigned int) t->num_of_digt, (unsigned
                                                                   int) t->str.
                 len);
        exit (99);
      }
      if (sizeof(buf) < t->str.len + 1)
      {
        fprintf (stderr,
                 "ERROR: dstrs_w_values[%u] has too long (%u) string, "
                 "size of 'buf' should be increased.\n",
                 (unsigned int) i, (unsigned int) t->str.len);
        exit (99);
      }
      for (b_size = 0; b_size <= t->str.len + 1; ++b_size)
      {
        /* fill buffer with pseudo-random values */
        memset (buf, '#', sizeof(buf));

        rs = MHD_uint8_to_str_pad ((uint8_t) t->val, pad, buf, b_size);

        if (t->num_of_digt > b_size)
        {
          /* Must fail, buffer is too small for result */
          if (0 != rs)
          {
            t_failed++;
            fprintf (stderr,
                     "FAILED: MHD_uint8_to_str_pad(%" PRIu64 ", %d, -> buf,"
                     " %d) returned %" PRIuPTR
                     ", while expecting 0.\n", t->val, (int) pad, (int) b_size,
                     (uintptr_t) rs);
          }
        }
        else
        {
          if (t->num_of_digt != rs)
          {
            t_failed++;
            fprintf (stderr,
                     "FAILED: MHD_uint8_to_str_pad(%" PRIu64 ", %d, -> buf,"
                     " %d) returned %" PRIuPTR
                     ", while expecting %d.\n", t->val, (int) pad,
                     (int) b_size, (uintptr_t) rs, (int) t->num_of_digt);
          }
          else if (0 != memcmp (buf, t->str.str, t->num_of_digt))
          {
            t_failed++;
            fprintf (stderr,
                     "FAILED: MHD_uint8_to_str_pad(%" PRIu64 ", %d, "
                     "-> \"%.*s\", %d) returned %" PRIuPTR ".\n",
                     t->val, (int) pad, (int) rs, buf,
                     (int) b_size, (uintptr_t) rs);
          }
          else if (0 != memcmp (buf + rs, "########", sizeof(buf) - rs))
          {
            t_failed++;
            fprintf (stderr,
                     "FAILED: MHD_uint8_to_str_pad(%" PRIu64 ", %d,"
                     " -> \"%.*s\", %d) returned %" PRIuPTR
                     " and touched data after the resulting string.\n",
                     t->val, (int) pad, (int) rs, buf, (int) b_size,
                     (uintptr_t) rs);
          }
        }
      }
    }
  }
  if ((verbose > 1) && (0 == t_failed))
    printf ("PASSED: MHD_uint8_to_str_pad.\n");

  return t_failed;
}


static int
run_str_from_X_tests (void)
{
  size_t str_from_uint16;
  size_t str_from_uint64;
  size_t strx_from_uint32;
  size_t str_from_uint8_pad;
  size_t failures;

  failures = 0;

  str_from_uint16 = check_str_from_uint16 ();
  if (str_from_uint16 != 0)
  {
    fprintf (stderr,
             "FAILED: testcase check_str_from_uint16() failed.\n\n");
    failures += str_from_uint16;
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_str_from_uint16() successfully "
            "passed.\n\n");

  str_from_uint64 = check_str_from_uint64 ();
  if (str_from_uint64 != 0)
  {
    fprintf (stderr,
             "FAILED: testcase check_str_from_uint16() failed.\n\n");
    failures += str_from_uint64;
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_str_from_uint16() successfully "
            "passed.\n\n");
  strx_from_uint32 = check_strx_from_uint32 ();
  if (strx_from_uint32 != 0)
  {
    fprintf (stderr,
             "FAILED: testcase check_strx_from_uint32() failed.\n\n");
    failures += strx_from_uint32;
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_strx_from_uint32() successfully "
            "passed.\n\n");

  str_from_uint8_pad = check_str_from_uint8_pad ();
  if (str_from_uint8_pad != 0)
  {
    fprintf (stderr,
             "FAILED: testcase check_str_from_uint8_pad() failed.\n\n");
    failures += str_from_uint8_pad;
  }
  else if (verbose > 1)
    printf ("PASSED: testcase check_str_from_uint8_pad() successfully "
            "passed.\n\n");

  if (failures)
  {
    if (verbose > 0)
      printf ("At least one test failed.\n");

    return 1;
  }

  if (verbose > 0)
    printf ("All tests passed successfully.\n");

  return 0;
}


int
main (int argc, char *argv[])
{
  if (has_param (argc, argv, "-v") || has_param (argc, argv, "--verbose") ||
      has_param (argc, argv, "--verbose1"))
    verbose = 1;
  if (has_param (argc, argv, "-vv") || has_param (argc, argv, "--verbose2"))
    verbose = 2;
  if (has_param (argc, argv, "-vvv") || has_param (argc, argv, "--verbose3"))
    verbose = 3;

  if (has_in_name (argv[0], "_to_value"))
    return run_str_to_X_tests ();

  if (has_in_name (argv[0], "_from_value"))
    return run_str_from_X_tests ();

  return run_eq_neq_str_tests ();
}
