gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libmicrohttpd] branch master updated (db2ab3a5 -> 9949f0f3)


From: gnunet
Subject: [libmicrohttpd] branch master updated (db2ab3a5 -> 9949f0f3)
Date: Sun, 01 Aug 2021 20:11:58 +0200

This is an automated email from the git hooks/post-receive script.

karlson2k pushed a change to branch master
in repository libmicrohttpd.

    from db2ab3a5 response: do not allow "Connection: keep-alive" header
     new 39eb60df response header: more pre-processing, better docs
     new 571bdda9 response headers: disallow space in header name, allow tab in 
header value
     new 8933bf8f Added internal MHD_uint8_to_str_pad() function
     new 9949f0f3 Used faster internal function for Date: timestamp

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 src/include/microhttpd.h               |  11 +
 src/microhttpd/connection.c            | 103 +++-
 src/microhttpd/internal.h              |   9 +-
 src/microhttpd/mhd_str.c               |  47 ++
 src/microhttpd/mhd_str.h               |  22 +
 src/microhttpd/response.c              |  73 ++-
 src/microhttpd/test_response_entries.c | 105 ++++
 src/microhttpd/test_str.c              | 907 ++++++++++++++++++++++++++++++++-
 8 files changed, 1224 insertions(+), 53 deletions(-)

diff --git a/src/include/microhttpd.h b/src/include/microhttpd.h
index 91bf38e8..7dcfd275 100644
--- a/src/include/microhttpd.h
+++ b/src/include/microhttpd.h
@@ -3648,6 +3648,7 @@ MHD_destroy_response (struct MHD_Response *response);
  * The list of automatic headers:
  * + "Date" header is added automatically unless already set by
  *   this function
+ *   @see #MHD_USE_SUPPRESS_DATE_NO_CLOCK
  * + "Content-Length" is added automatically when required, attempt to set
  *   it manually by this function is ignored.
  *   @see #MHD_RF_INSANITY_HEADER_CONTENT_LENGTH
@@ -3662,6 +3663,16 @@ MHD_destroy_response (struct MHD_Response *response);
  *   to enforce closure of the connection after sending this response.
  *   "Keep-Alive" cannot be enforced and will be removed automatically.
  *
+ * Some headers are pre-processed by this function:
+ * * "Connection" headers are combined into single header entry, value is
+ *   normilised, "Keep-Alive" tokens are removed.
+ * * "Transfer-Encoding" header: the only one header is allowed, the only
+ *   allowed value is "chunked".
+ * * "Date" header: the only one header is allowed, the second added header
+ *   replaces the first one.
+ * * "Content-Length" manual header is now allowed.
+ *   @see #MHD_RF_INSANITY_HEADER_CONTENT_LENGTH
+ *
  * Headers are used in order as they were added.
  *
  * @param response the response to add a header to
diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c
index a59e3d60..3167a4aa 100644
--- a/src/microhttpd/connection.c
+++ b/src/microhttpd/connection.c
@@ -1187,15 +1187,16 @@ keepalive_possible (struct MHD_Connection *connection)
 
 
 /**
- * Produce HTTP time stamp.
+ * Produce time stamp.
  *
- * @param date where to write the header, with
- *        at least 128 bytes available space.
- * @param date_len number of bytes in @a date
+ * Result is NOT null-terminated.
+ * Result is always 29 bytes long.
+ *
+ * @param[out] date where to write the time stamp, with
+ *             at least 29 bytes available space.
  */
-static void
-get_date_string (char *date,
-                 size_t date_len)
+static bool
+get_date_str (char *date)
 {
   static const char *const days[] = {
     "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
@@ -1204,43 +1205,96 @@ get_date_string (char *date,
     "Jan", "Feb", "Mar", "Apr", "May", "Jun",
     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
   };
+  static const size_t buf_len = 29;
   struct tm now;
   time_t t;
+  const char *src;
 #if ! defined(HAVE_C11_GMTIME_S) && ! defined(HAVE_W32_GMTIME_S) && \
   ! defined(HAVE_GMTIME_R)
-  struct tm*pNow;
+  struct tm *pNow;
 #endif
 
-  date[0] = 0;
   time (&t);
 #if defined(HAVE_C11_GMTIME_S)
   if (NULL == gmtime_s (&t,
                         &now))
-    return;
+    return false;
 #elif defined(HAVE_W32_GMTIME_S)
   if (0 != gmtime_s (&now,
                      &t))
-    return;
+    return false;
 #elif defined(HAVE_GMTIME_R)
   if (NULL == gmtime_r (&t,
                         &now))
-    return;
+    return false;
 #else
   pNow = gmtime (&t);
   if (NULL == pNow)
-    return;
+    return false;
   now = *pNow;
 #endif
-  MHD_snprintf_ (date,
-                 date_len,
-                 "Date: %3s, %02u %3s %04u %02u:%02u:%02u GMT\r\n",
-                 days[now.tm_wday % 7],
-                 (unsigned int) now.tm_mday,
-                 mons[now.tm_mon % 12],
-                 (unsigned int) (1900 + now.tm_year),
-                 (unsigned int) now.tm_hour,
-                 (unsigned int) now.tm_min,
-                 (unsigned int) now.tm_sec);
+
+  /* Day of the week */
+  src = days[now.tm_wday % 7];
+  date[0] = src[0];
+  date[1] = src[1];
+  date[2] = src[2];
+  date[3] = ',';
+  date[4] = ' ';
+  /* Day of the month */
+  MHD_uint8_to_str_pad ((uint8_t) now.tm_mday, 2, date + 5, buf_len - 5);
+  date[7] = ' ';
+  /* Month */
+  src = mons[now.tm_mon % 12];
+  date[8] = src[0];
+  date[9] = src[1];
+  date[10] = src[2];
+  date[11] = ' ';
+  /* Year */
+  if (4 != MHD_uint16_to_str ((uint16_t) (1900 + now.tm_year), date + 12,
+                              buf_len - 12))
+    return false;
+  date[16] = ' ';
+  /* Time */
+  MHD_uint8_to_str_pad ((uint8_t) now.tm_hour, 2, date + 17, buf_len - 17);
+  date[19] = ':';
+  MHD_uint8_to_str_pad ((uint8_t) now.tm_min, 2, date + 20, buf_len - 20);
+  date[22] = ':';
+  MHD_uint8_to_str_pad ((uint8_t) now.tm_sec, 2, date + 23, buf_len - 23);
+  date[25] = ' ';
+  date[26] = 'G';
+  date[27] = 'M';
+  date[28] = 'T';
+
+  return true;
+}
+
+
+/**
+ * Produce HTTP DATE header.
+ * Result is always 37 bytes long (including terminating null).
+ *
+ * @param[out] header where to write the header, with
+ *             at least 38 bytes available space.
+ */
+static bool
+get_date_header (char *header)
+{
+  if (! get_date_str (header + 6))
+  {
+    header[0] = 0;
+    return false;
+  }
+  header[0] = 'D';
+  header[1] = 'a';
+  header[2] = 't';
+  header[3] = 'e';
+  header[4] = ':';
+  header[5] = ' ';
+  header[35] = '\r';
+  header[36] = '\n';
+  header[37] = 0;
+  return true;
 }
 
 
@@ -1501,8 +1555,7 @@ build_header_response (struct MHD_Connection *connection)
                 & MHD_USE_SUPPRESS_DATE_NO_CLOCK)) &&
          (NULL == MHD_get_response_header (response,
                                            MHD_HTTP_HEADER_DATE)) )
-      get_date_string (date,
-                       sizeof (date));
+      get_date_header (date);
     else
       date[0] = '\0';
     datelen = strlen (date);
diff --git a/src/microhttpd/internal.h b/src/microhttpd/internal.h
index ad60502e..87e75063 100644
--- a/src/microhttpd/internal.h
+++ b/src/microhttpd/internal.h
@@ -356,10 +356,11 @@ struct MHD_HTTP_Header
  */
 enum MHD_ResponseAutoFlags
 {
-  MHD_RAF_NO_FLAGS = 0,                  /**< No auto flags */
-  MHD_RAF_HAS_CONNECTION_HDR = 1 << 0,   /**< Has "Connection" header */
-  MHD_RAF_HAS_CONNECTION_CLOSE = 1 << 1, /**< Has "Connection: close" */
-  MHD_RAF_HAS_TRANS_ENC_CHUNKED = 2 << 2 /**< Has "Transfer-Encoding: chunked 
*/
+  MHD_RAF_NO_FLAGS = 0,                   /**< No auto flags */
+  MHD_RAF_HAS_CONNECTION_HDR = 1 << 0,    /**< Has "Connection" header */
+  MHD_RAF_HAS_CONNECTION_CLOSE = 1 << 1,  /**< Has "Connection: close" */
+  MHD_RAF_HAS_TRANS_ENC_CHUNKED = 1 << 2, /**< Has "Transfer-Encoding: chunked 
*/
+  MHD_RAF_HAS_DATE_HDR = 1 << 3           /**< Has "Date" header */
 } _MHD_FIXED_FLAGS_ENUM;
 
 
diff --git a/src/microhttpd/mhd_str.c b/src/microhttpd/mhd_str.c
index b106859d..1c77a46d 100644
--- a/src/microhttpd/mhd_str.c
+++ b/src/microhttpd/mhd_str.c
@@ -1294,3 +1294,50 @@ MHD_uint64_to_str (uint64_t val,
   }
   return 0; /* The buffer is too small */
 }
+
+
+size_t
+MHD_uint8_to_str_pad (uint8_t val,
+                      uint8_t min_digits,
+                      char *buf,
+                      size_t buf_size)
+{
+  size_t pos; /**< the position of the current printed digit */
+  int digit;
+  mhd_assert (3 >= min_digits);
+  if (0 == buf_size)
+    return 0;
+
+  pos = 0;
+  digit = val / 100;
+  if (0 == digit)
+  {
+    if (3 <= min_digits)
+      buf[pos++] = '0';
+  }
+  else
+  {
+    buf[pos++] = '0' + digit;
+    val %= 100;
+    min_digits = 2;
+  }
+
+  if (buf_size <= pos)
+    return 0;
+  digit = val / 10;
+  if (0 == digit)
+  {
+    if (2 <= min_digits)
+      buf[pos++] = '0';
+  }
+  else
+  {
+    buf[pos++] = '0' + digit;
+    val %= 10;
+  }
+
+  if (buf_size <= pos)
+    return 0;
+  buf[pos++] = '0' + val;
+  return pos;
+}
diff --git a/src/microhttpd/mhd_str.h b/src/microhttpd/mhd_str.h
index 9cc4bb19..b21ae256 100644
--- a/src/microhttpd/mhd_str.h
+++ b/src/microhttpd/mhd_str.h
@@ -424,4 +424,26 @@ MHD_uint64_to_str (uint64_t val,
                    size_t buf_size);
 
 
+/**
+ * Convert uint16_t value to decimal US-ASCII string padded with
+ * zeros on the left side.
+ *
+ * @note: result is NOT zero-terminated.
+ * @param val the value to convert
+ * @param min_digits the minimal number of digits to print,
+ *                   output padded with zeros on the left side,
+ *                   'zero' value is interpreted as 'one',
+ *                   valid values are 3, 2, 1, 0
+ * @param buf the buffer to result to
+ * @param buf_size size of the @a buffer
+ * @return number of charters has been put to the @a buf,
+ *         zero if buffer is too small (buffer may be modified).
+ */
+size_t
+MHD_uint8_to_str_pad (uint8_t val,
+                      uint8_t min_digits,
+                      char *buf,
+                      size_t buf_size);
+
+
 #endif /* MHD_STR_H */
diff --git a/src/microhttpd/response.c b/src/microhttpd/response.c
index 3833990c..a7085767 100644
--- a/src/microhttpd/response.c
+++ b/src/microhttpd/response.c
@@ -167,9 +167,9 @@ add_response_entry (struct MHD_Response *response,
        (0 == header[0]) ||
        (0 == content[0]) ||
        (NULL != strchr (header, '\t')) ||
+       (NULL != strchr (header, ' ')) ||
        (NULL != strchr (header, '\r')) ||
        (NULL != strchr (header, '\n')) ||
-       (NULL != strchr (content, '\t')) ||
        (NULL != strchr (content, '\r')) ||
        (NULL != strchr (content, '\n')) )
     return MHD_NO;
@@ -438,6 +438,7 @@ del_response_header_connection (struct MHD_Response 
*response,
  * The list of automatic headers:
  * + "Date" header is added automatically unless already set by
  *   this function
+ *   @see #MHD_USE_SUPPRESS_DATE_NO_CLOCK
  * + "Content-Length" is added automatically when required, attempt to set
  *   it manually by this function is ignored.
  *   @see #MHD_RF_INSANITY_HEADER_CONTENT_LENGTH
@@ -452,6 +453,16 @@ del_response_header_connection (struct MHD_Response 
*response,
  *   to enforce closure of the connection after sending this response.
  *   "Keep-Alive" cannot be enforced and will be removed automatically.
  *
+ * Some headers are pre-processed by this function:
+ * * "Connection" headers are combined into single header entry, value is
+ *   normilised, "Keep-Alive" tokens are removed.
+ * * "Transfer-Encoding" header: the only one header is allowed, the only
+ *   allowed value is "chunked".
+ * * "Date" header: the only one header is allowed, the second added header
+ *   replaces the first one.
+ * * "Content-Length" manual header is now allowed.
+ *   @see #MHD_RF_INSANITY_HEADER_CONTENT_LENGTH
+ *
  * Headers are used in order as they were added.
  *
  * @param response the response to add a header to
@@ -473,30 +484,40 @@ MHD_add_response_header (struct MHD_Response *response,
   if (MHD_str_equal_caseless_ (header,
                                MHD_HTTP_HEADER_TRANSFER_ENCODING))
   {
-    /* TODO: remove support for "identity" */
-    /* Only one "Transfer-Encoding" header is allowed */
-    if (NULL !=
-        MHD_get_response_header (response, MHD_HTTP_HEADER_TRANSFER_ENCODING) )
+    if (! MHD_str_equal_caseless_ (content, "chunked"))
       return MHD_NO;
-    /* Setting transfer encodings other than "identity" or
-       "chunked" is not allowed.  Note that MHD will set the
-       correct transfer encoding if required automatically. */
-    /* NOTE: for compressed bodies, use the "Content-encoding" header */
-    if (MHD_str_equal_caseless_ (content, "identity"))
-      return add_response_entry (response,
-                                 MHD_HEADER_KIND,
-                                 header,
-                                 content);
-    else if (MHD_str_equal_caseless_ (content, "chunked"))
+    if (0 != (response->flags_auto & MHD_RAF_HAS_TRANS_ENC_CHUNKED))
+      return MHD_YES;
+    if (MHD_NO != add_response_entry (response,
+                                      MHD_HEADER_KIND,
+                                      header,
+                                      content))
     {
-      if (MHD_NO != add_response_entry (response,
-                                        MHD_HEADER_KIND,
-                                        header,
-                                        content))
-      {
-        response->flags_auto |= MHD_RAF_HAS_TRANS_ENC_CHUNKED;
-        return MHD_YES;
-      }
+      response->flags_auto |= MHD_RAF_HAS_TRANS_ENC_CHUNKED;
+      return MHD_YES;
+    }
+    return MHD_NO;
+  }
+  if (MHD_str_equal_caseless_ (header,
+                               MHD_HTTP_HEADER_DATE))
+  {
+    if (0 != (response->flags_auto & MHD_RAF_HAS_DATE_HDR))
+    {
+      struct MHD_HTTP_Header *hdr;
+      hdr = MHD_get_response_element_n_ (response, MHD_HEADER_KIND,
+                                         MHD_HTTP_HEADER_DATE,
+                                         MHD_STATICSTR_LEN_ ( \
+                                           MHD_HTTP_HEADER_DATE));
+      mhd_assert (NULL != hdr);
+      _MHD_remove_header (response, hdr);
+    }
+    if (MHD_NO != add_response_entry (response,
+                                      MHD_HEADER_KIND,
+                                      header,
+                                      content))
+    {
+      response->flags_auto |= MHD_RAF_HAS_DATE_HDR;
+      return MHD_YES;
     }
     return MHD_NO;
   }
@@ -590,6 +611,12 @@ MHD_del_response_header (struct MHD_Response *response,
                                           MHD_HTTP_HEADER_TRANSFER_ENCODING,
                                           header_len) )
         response->flags_auto &= ~(MHD_RAF_HAS_TRANS_ENC_CHUNKED);
+      else if ( (MHD_STATICSTR_LEN_ (MHD_HTTP_HEADER_DATE) ==
+                 header_len) &&
+                MHD_str_equal_caseless_bin_n_ (header,
+                                               MHD_HTTP_HEADER_DATE,
+                                               header_len) )
+        response->flags_auto &= ~(MHD_RAF_HAS_DATE_HDR);
       return MHD_YES;
     }
     pos = pos->next;
diff --git a/src/microhttpd/test_response_entries.c 
b/src/microhttpd/test_response_entries.c
index c4bf293d..c08466df 100644
--- a/src/microhttpd/test_response_entries.c
+++ b/src/microhttpd/test_response_entries.c
@@ -775,6 +775,111 @@ main (int argc,
     return 4;
   }
 
+  if (MHD_YES != MHD_add_response_header (r, "Date",
+                                          "Wed, 01 Apr 2015 00:00:00 GMT"))
+  {
+    fprintf (stderr,
+             "Cannot add \"Date\" header with \"Wed, 01 Apr 2015 00:00:00 
GMT\".\n");
+    MHD_destroy_response (r);
+    return 5;
+  }
+  if (! expect_str (MHD_get_response_header (r, "Date"),
+                    "Wed, 01 Apr 2015 00:00:00 GMT"))
+  {
+    MHD_destroy_response (r);
+    return 5;
+  }
+  if (MHD_YES != MHD_add_response_header (r, "Date",
+                                          "Thu, 01 Apr 2021 00:00:00 GMT"))
+  {
+    fprintf (stderr,
+             "Cannot add \"Date\" header with \"Thu, 01 Apr 2021 00:00:00 
GMT\".\n");
+    MHD_destroy_response (r);
+    return 5;
+  }
+  if (! expect_str (MHD_get_response_header (r, "Date"),
+                    "Thu, 01 Apr 2021 00:00:00 GMT"))
+  {
+    MHD_destroy_response (r);
+    return 5;
+  }
+  if (MHD_YES != MHD_del_response_header (r, "Date",
+                                          "Thu, 01 Apr 2021 00:00:00 GMT"))
+  {
+    fprintf (stderr, "Cannot remove \"Date\" header.\n");
+    MHD_destroy_response (r);
+    return 5;
+  }
+  if (! expect_str (MHD_get_response_header (r, "Date"), NULL))
+  {
+    MHD_destroy_response (r);
+    return 5;
+  }
+
+  if (MHD_YES != MHD_add_response_header (r, MHD_HTTP_HEADER_TRANSFER_ENCODING,
+                                          "chunked"))
+  {
+    fprintf (stderr,
+             "Cannot add \"" MHD_HTTP_HEADER_TRANSFER_ENCODING \
+             "\" header with \"chunked\".\n");
+    MHD_destroy_response (r);
+    return 6;
+  }
+  if (! expect_str (MHD_get_response_header (r,
+                                             
MHD_HTTP_HEADER_TRANSFER_ENCODING),
+                    "chunked"))
+  {
+    MHD_destroy_response (r);
+    return 6;
+  }
+  if (MHD_YES != MHD_add_response_header (r, MHD_HTTP_HEADER_TRANSFER_ENCODING,
+                                          "chunked"))
+  {
+    fprintf (stderr,
+             "Cannot add \"" MHD_HTTP_HEADER_TRANSFER_ENCODING \
+             "\" second header with \"chunked\".\n");
+    MHD_destroy_response (r);
+    return 6;
+  }
+  if (! expect_str (MHD_get_response_header (r,
+                                             
MHD_HTTP_HEADER_TRANSFER_ENCODING),
+                    "chunked"))
+  {
+    MHD_destroy_response (r);
+    return 6;
+  }
+  if (MHD_NO != MHD_add_response_header (r, MHD_HTTP_HEADER_TRANSFER_ENCODING,
+                                         "identity"))
+  {
+    fprintf (stderr,
+             "Successfully added \"" MHD_HTTP_HEADER_TRANSFER_ENCODING \
+             "\" header with \"identity\".\n");
+    MHD_destroy_response (r);
+    return 6;
+  }
+  if (! expect_str (MHD_get_response_header (r,
+                                             
MHD_HTTP_HEADER_TRANSFER_ENCODING),
+                    "chunked"))
+  {
+    MHD_destroy_response (r);
+    return 6;
+  }
+  if (MHD_YES != MHD_del_response_header (r, MHD_HTTP_HEADER_TRANSFER_ENCODING,
+                                          "chunked"))
+  {
+    fprintf (stderr, "Cannot remove \"" MHD_HTTP_HEADER_TRANSFER_ENCODING \
+             "\" header.\n");
+    MHD_destroy_response (r);
+    return 6;
+  }
+  if (! expect_str (MHD_get_response_header (r,
+                                             
MHD_HTTP_HEADER_TRANSFER_ENCODING),
+                    NULL))
+  {
+    MHD_destroy_response (r);
+    return 6;
+  }
+
   MHD_destroy_response (r);
   printf ("All tests has been successfully passed.\n");
   return 0;
diff --git a/src/microhttpd/test_str.c b/src/microhttpd/test_str.c
index a65cb61d..941f8406 100644
--- a/src/microhttpd/test_str.c
+++ b/src/microhttpd/test_str.c
@@ -3685,12 +3685,901 @@ check_strx_from_uint32 (void)
 }
 
 
+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};
+
+int
+check_str_from_uint8_pad (void)
+{
+  int i;
+  int pad;
+  int 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");
+    return -1;
+  }
+  for (pad = 0; pad <= 3; pad++)
+  {
+    int table_num = pad - 1;
+    if (0 == pad)
+      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);
+        return -1;
+      }
+      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);
+        return -1;
+      }
+      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 (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,
+                     (intptr_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, (intptr_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, (intptr_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,
+                     (intptr_t) rs);
+          }
+        }
+      }
+    }
+  }
+  if ((verbose > 1) && (0 == t_failed))
+    printf ("PASSED: MHD_uint8_to_str_pad.\n");
+
+  return t_failed;
+}
+
+
 int
 run_str_from_X_tests (void)
 {
   int str_from_uint16;
   int str_from_uint64;
   int strx_from_uint32;
+  int str_from_uint8_pad;
   int failures;
 
   failures = 0;
@@ -3728,7 +4617,6 @@ run_str_from_X_tests (void)
   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)
   {
@@ -3746,6 +4634,23 @@ run_str_from_X_tests (void)
     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)
+  {
+    if (str_from_uint8_pad < 0)
+    {
+      fprintf (stderr,
+               "ERROR: test internal error in check_str_from_uint8_pad().\n");
+      return 99;
+    }
+    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)

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]