Home | History | Annotate | Line # | Download | only in libutil
t_snprintb.c revision 1.33
      1  1.33    rillig /* $NetBSD: t_snprintb.c,v 1.33 2024/04/07 10:10:54 rillig Exp $ */
      2   1.1      jmmv 
      3   1.1      jmmv /*
      4   1.9    rillig  * Copyright (c) 2002, 2004, 2008, 2010, 2024 The NetBSD Foundation, Inc.
      5   1.1      jmmv  * All rights reserved.
      6   1.1      jmmv  *
      7   1.9    rillig  * This code was contributed to The NetBSD Foundation by Christos Zoulas and
      8   1.9    rillig  * Roland Illig.
      9   1.1      jmmv  *
     10   1.1      jmmv  * Redistribution and use in source and binary forms, with or without
     11   1.1      jmmv  * modification, are permitted provided that the following conditions
     12   1.1      jmmv  * are met:
     13   1.1      jmmv  * 1. Redistributions of source code must retain the above copyright
     14   1.1      jmmv  *    notice, this list of conditions and the following disclaimer.
     15   1.1      jmmv  * 2. Redistributions in binary form must reproduce the above copyright
     16   1.1      jmmv  *    notice, this list of conditions and the following disclaimer in the
     17   1.1      jmmv  *    documentation and/or other materials provided with the distribution.
     18   1.1      jmmv  *
     19   1.1      jmmv  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20   1.1      jmmv  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21   1.1      jmmv  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22   1.1      jmmv  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23   1.1      jmmv  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24   1.1      jmmv  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25   1.1      jmmv  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26   1.1      jmmv  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27   1.1      jmmv  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28   1.1      jmmv  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29   1.1      jmmv  * POSSIBILITY OF SUCH DAMAGE.
     30   1.1      jmmv  */
     31   1.1      jmmv 
     32   1.1      jmmv #include <sys/cdefs.h>
     33  1.21    rillig __COPYRIGHT("@(#) Copyright (c) 2008, 2010, 2024\
     34   1.1      jmmv  The NetBSD Foundation, inc. All rights reserved.");
     35  1.33    rillig __RCSID("$NetBSD: t_snprintb.c,v 1.33 2024/04/07 10:10:54 rillig Exp $");
     36   1.1      jmmv 
     37   1.9    rillig #include <stdio.h>
     38   1.1      jmmv #include <string.h>
     39   1.1      jmmv #include <util.h>
     40   1.9    rillig #include <vis.h>
     41   1.1      jmmv 
     42   1.1      jmmv #include <atf-c.h>
     43   1.1      jmmv 
     44   1.9    rillig static const char *
     45  1.32    rillig vis_arr(char *buf, size_t bufsize, const char *arr, size_t arrsize)
     46   1.9    rillig {
     47  1.32    rillig 	ATF_REQUIRE(bufsize >= 2);
     48  1.32    rillig 	int rv = strnvisx(buf + 1, bufsize - 2, arr, arrsize,
     49  1.10    rillig 	    VIS_WHITE | VIS_OCTAL);
     50  1.29    rillig 	ATF_REQUIRE_MSG(rv >= 0, "buffer too small for size %zu", arrsize);
     51  1.32    rillig 	buf[0] = '"';
     52  1.32    rillig 	buf[1 + rv] = '"';
     53  1.32    rillig 	buf[1 + rv + 1] = '\0';
     54  1.32    rillig 	return buf;
     55   1.9    rillig }
     56   1.9    rillig 
     57   1.1      jmmv static void
     58  1.27    rillig check_snprintb_m(const char *file, size_t line,
     59  1.21    rillig     size_t bufsize, const char *bitfmt, size_t bitfmtlen, uint64_t val,
     60  1.27    rillig     size_t line_max,
     61  1.21    rillig     int want_rv, const char *want_buf, size_t want_bufsize)
     62   1.1      jmmv {
     63  1.32    rillig 	char buf[1024], vis_bitfmt[1024], vis_want_buf[1024], vis_buf[1024];
     64   1.9    rillig 
     65  1.10    rillig 	ATF_REQUIRE(bufsize <= sizeof(buf));
     66  1.21    rillig 	ATF_REQUIRE(want_bufsize <= sizeof(buf));
     67  1.27    rillig 	if (bitfmtlen > 2 && bitfmt[0] == '\177')
     68  1.27    rillig 		ATF_REQUIRE_MSG(
     69  1.27    rillig 		    bitfmt[bitfmtlen - 1] == '\0',
     70  1.27    rillig 		    "%s:%zu: missing trailing '\\0' in new-style bitfmt",
     71  1.27    rillig 		    file, line);
     72  1.24    rillig 	if (bufsize == 0)
     73  1.27    rillig 		want_bufsize = 0;
     74  1.29    rillig 	memset(buf, 0x5a, sizeof(buf));
     75  1.10    rillig 
     76  1.27    rillig 	int rv = snprintb_m(buf, bufsize, bitfmt, val, line_max);
     77  1.27    rillig 
     78  1.24    rillig 	size_t have_bufsize = sizeof(buf);
     79  1.29    rillig 	while (have_bufsize > 0 && buf[have_bufsize - 1] == 0x5a)
     80  1.24    rillig 		have_bufsize--;
     81  1.27    rillig 	if (rv > 0 && (unsigned)rv < have_bufsize
     82  1.27    rillig 	    && buf[rv - 1] == '\0' && buf[rv] == '\0')
     83  1.27    rillig 		have_bufsize = rv + 1;
     84  1.27    rillig 	if (rv < 0)
     85  1.27    rillig 		for (size_t i = have_bufsize; i >= 2; i--)
     86  1.27    rillig 			if (buf[i - 2] == '\0' && buf[i - 1] == '\0')
     87  1.27    rillig 				have_bufsize = i;
     88   1.1      jmmv 
     89   1.9    rillig 	ATF_CHECK_MSG(
     90  1.21    rillig 	    rv == want_rv
     91  1.21    rillig 	    && memcmp(buf, want_buf, want_bufsize) == 0
     92  1.27    rillig 	    && (line_max == 0 || have_bufsize < 2
     93  1.27    rillig 		|| buf[have_bufsize - 2] == '\0')
     94  1.27    rillig 	    && (have_bufsize < 1 || buf[have_bufsize - 1] == '\0'),
     95   1.9    rillig 	    "failed:\n"
     96   1.9    rillig 	    "\ttest case: %s:%zu\n"
     97   1.9    rillig 	    "\tformat: %s\n"
     98   1.9    rillig 	    "\tvalue: %#jx\n"
     99  1.27    rillig 	    "\tline_max: %zu\n"
    100  1.10    rillig 	    "\twant: %d bytes %s\n"
    101  1.10    rillig 	    "\thave: %d bytes %s\n",
    102   1.9    rillig 	    file, line,
    103  1.32    rillig 	    vis_arr(vis_bitfmt, sizeof(vis_bitfmt), bitfmt, bitfmtlen),
    104  1.11    rillig 	    (uintmax_t)val,
    105  1.27    rillig 	    line_max,
    106  1.32    rillig 	    want_rv, vis_arr(vis_want_buf, sizeof(vis_want_buf),
    107  1.32    rillig 		want_buf, want_bufsize),
    108  1.32    rillig 	    rv, vis_arr(vis_buf, sizeof(vis_buf), buf, have_bufsize));
    109   1.1      jmmv }
    110   1.1      jmmv 
    111  1.27    rillig #define	h_snprintb_m_len(bufsize, bitfmt, val, line_max,		\
    112  1.27    rillig 	    want_rv, want_buf)						\
    113  1.27    rillig 	check_snprintb_m(__FILE__, __LINE__,				\
    114  1.27    rillig 	    bufsize, bitfmt, sizeof(bitfmt) - 1, val, line_max,		\
    115  1.21    rillig 	    want_rv, want_buf, sizeof(want_buf))
    116  1.27    rillig 
    117  1.21    rillig #define	h_snprintb(bitfmt, val, want_buf)				\
    118  1.27    rillig 	h_snprintb_m_len(1024, bitfmt, val, 0, sizeof(want_buf) - 1, want_buf)
    119  1.10    rillig 
    120  1.27    rillig #define	h_snprintb_len(bufsize, bitfmt, val, want_rv, want_buf)		\
    121  1.27    rillig 	h_snprintb_m_len(bufsize, bitfmt, val, 0, want_rv, want_buf)
    122  1.10    rillig 
    123  1.27    rillig #define	h_snprintb_error(bitfmt, want_buf)				\
    124  1.29    rillig 	h_snprintb_m_len(1024, bitfmt, 0x00, 0, -1, want_buf)
    125  1.10    rillig 
    126  1.27    rillig #define	h_snprintb_m(bitfmt, val, line_max, want_buf)			\
    127  1.27    rillig 	h_snprintb_m_len(1024, bitfmt, val, line_max,			\
    128  1.27    rillig 	    sizeof(want_buf) - 1, want_buf)
    129   1.9    rillig 
    130   1.1      jmmv ATF_TC(snprintb);
    131   1.1      jmmv ATF_TC_HEAD(snprintb, tc)
    132   1.1      jmmv {
    133   1.1      jmmv 	atf_tc_set_md_var(tc, "descr", "Checks snprintb(3)");
    134   1.1      jmmv }
    135   1.1      jmmv ATF_TC_BODY(snprintb, tc)
    136   1.1      jmmv {
    137  1.10    rillig 
    138  1.21    rillig 	// style and number base, old style, octal, zero value
    139  1.21    rillig 	//
    140  1.21    rillig 	// The value 0 does not get a leading '0'.
    141  1.21    rillig 	h_snprintb(
    142  1.21    rillig 	    "\010",
    143  1.29    rillig 	    0x00,
    144  1.21    rillig 	    "0");
    145  1.21    rillig 
    146  1.21    rillig 	// style and number base, old style, octal, nonzero value
    147  1.21    rillig 	//
    148  1.21    rillig 	// Nonzero octal values get a leading '0'.
    149   1.9    rillig 	h_snprintb(
    150  1.21    rillig 	    "\010",
    151  1.21    rillig 	    0xff,
    152  1.21    rillig 	    "0377");
    153  1.21    rillig 
    154  1.21    rillig 	// style and number base, old style, decimal, zero value
    155  1.21    rillig 	h_snprintb(
    156  1.21    rillig 	    "\012",
    157  1.29    rillig 	    0x00,
    158  1.21    rillig 	    "0");
    159   1.9    rillig 
    160  1.21    rillig 	// style and number base, old style, decimal, nonzero value
    161   1.9    rillig 	h_snprintb(
    162  1.21    rillig 	    "\012",
    163  1.21    rillig 	    0xff,
    164  1.21    rillig 	    "255");
    165  1.10    rillig 
    166  1.21    rillig 	// style and number base, old style, hexadecimal, zero value
    167  1.21    rillig 	//
    168  1.21    rillig 	// The value 0 does not get a leading '0x'.
    169  1.10    rillig 	h_snprintb(
    170  1.21    rillig 	    "\020",
    171  1.29    rillig 	    0x00,
    172  1.21    rillig 	    "0");
    173  1.21    rillig 
    174  1.21    rillig 	// style and number base, old style, hexadecimal, nonzero value
    175  1.21    rillig 	//
    176  1.21    rillig 	// Nonzero hexadecimal values get a leading '0x'.
    177  1.10    rillig 	h_snprintb(
    178  1.21    rillig 	    "\177\020",
    179  1.21    rillig 	    0xff,
    180  1.21    rillig 	    "0xff");
    181  1.10    rillig 
    182  1.21    rillig 	// style and number base, old style, invalid base 0
    183  1.10    rillig 	h_snprintb_error(
    184  1.27    rillig 	    "",
    185  1.27    rillig 	    "#");
    186  1.10    rillig 
    187  1.21    rillig 	// style and number base, old style, invalid base 2
    188  1.10    rillig 	h_snprintb_error(
    189  1.27    rillig 	    "\002",
    190  1.27    rillig 	    "#");
    191  1.10    rillig 
    192  1.21    rillig 	// style and number base, old style, invalid base 255 or -1
    193  1.10    rillig 	h_snprintb_error(
    194  1.27    rillig 	    "\377",
    195  1.27    rillig 	    "#");
    196  1.10    rillig 
    197  1.21    rillig 	// style and number base, new style, octal, zero value
    198  1.21    rillig 	//
    199  1.21    rillig 	// The value 0 does not get a leading '0'.
    200  1.21    rillig 	h_snprintb(
    201  1.21    rillig 	    "\177\010",
    202  1.29    rillig 	    0x00,
    203  1.21    rillig 	    "0");
    204  1.21    rillig 
    205  1.21    rillig 	// style and number base, new style, octal, nonzero value
    206  1.21    rillig 	//
    207  1.21    rillig 	// Nonzero octal values get a leading '0'.
    208  1.21    rillig 	h_snprintb(
    209  1.21    rillig 	    "\177\010",
    210  1.21    rillig 	    0xff,
    211  1.21    rillig 	    "0377");
    212  1.21    rillig 
    213  1.21    rillig 	// style and number base, new style, decimal, zero value
    214  1.21    rillig 	h_snprintb(
    215  1.21    rillig 	    "\177\012",
    216  1.29    rillig 	    0x00,
    217  1.21    rillig 	    "0");
    218  1.21    rillig 
    219  1.21    rillig 	// style and number base, new style, decimal, nonzero value
    220  1.21    rillig 	h_snprintb(
    221  1.21    rillig 	    "\177\012",
    222  1.21    rillig 	    0xff,
    223  1.21    rillig 	    "255");
    224  1.21    rillig 
    225  1.21    rillig 	// style and number base, new style, hexadecimal, zero value
    226  1.21    rillig 	//
    227  1.21    rillig 	// The value 0 does not get a leading '0x'.
    228  1.21    rillig 	h_snprintb(
    229  1.21    rillig 	    "\177\020",
    230  1.29    rillig 	    0x00,
    231  1.21    rillig 	    "0");
    232  1.21    rillig 
    233  1.21    rillig 	// style and number base, new style, hexadecimal, nonzero value
    234  1.21    rillig 	//
    235  1.21    rillig 	// Nonzero hexadecimal values get a leading '0x'.
    236  1.21    rillig 	h_snprintb(
    237  1.21    rillig 	    "\177\020",
    238  1.21    rillig 	    0xff,
    239  1.21    rillig 	    "0xff");
    240  1.21    rillig 
    241  1.21    rillig 	// style and number base, new style, invalid number base 0
    242  1.21    rillig 	h_snprintb_error(
    243  1.27    rillig 	    "\177",
    244  1.27    rillig 	    "#");
    245  1.21    rillig 
    246  1.21    rillig 	// style and number base, new style, invalid number base 2
    247  1.21    rillig 	h_snprintb_error(
    248  1.27    rillig 	    "\177\002",
    249  1.27    rillig 	    "#");
    250  1.21    rillig 
    251  1.21    rillig 	// style and number base, new style, invalid number base 255 or -1
    252  1.21    rillig 	h_snprintb_error(
    253  1.27    rillig 	    "\177\377",
    254  1.27    rillig 	    "#");
    255  1.21    rillig 
    256  1.21    rillig 	// old style, from lsb to msb
    257  1.21    rillig 	h_snprintb(
    258  1.21    rillig 	    "\020"
    259  1.21    rillig 	    "\001bit1"
    260  1.21    rillig 	    "\002bit2"
    261  1.21    rillig 	    "\037bit31"
    262  1.21    rillig 	    "\040bit32",
    263  1.21    rillig 	    0xffffffff80000001,
    264  1.21    rillig 	    "0xffffffff80000001<bit1,bit32>");
    265  1.21    rillig 
    266  1.21    rillig 	// old style, invalid bit number, at the beginning
    267  1.21    rillig 	h_snprintb_error(
    268  1.21    rillig 	    "\020"
    269  1.27    rillig 	    "\041invalid",
    270  1.27    rillig 	    "0#");
    271  1.21    rillig 
    272  1.21    rillig 	// old style, invalid bit number, in the middle
    273  1.21    rillig 	//
    274  1.21    rillig 	// The old-style format supports only 32 bits, interpreting the
    275  1.21    rillig 	// \041 as part of the text belonging to bit 1.
    276  1.21    rillig 	h_snprintb(
    277  1.21    rillig 	    "\020"
    278  1.21    rillig 	    "\001bit1"
    279  1.21    rillig 	    "\041bit33",
    280  1.29    rillig 	    0x01,
    281  1.21    rillig 	    "0x1<bit1!bit33>");
    282  1.21    rillig 
    283  1.21    rillig 	// old style, repeated bit numbers
    284  1.21    rillig 	//
    285  1.21    rillig 	// When a bit number is mentioned more than once,
    286  1.21    rillig 	// this is most likely a typo.
    287  1.21    rillig 	h_snprintb(
    288  1.21    rillig 	    "\020"
    289  1.21    rillig 	    "\001once"
    290  1.21    rillig 	    "\001again",
    291  1.29    rillig 	    0x01,
    292  1.21    rillig 	    "0x1<once,again>");
    293  1.21    rillig 
    294  1.21    rillig 	// old style, non-printable description
    295  1.21    rillig 	//
    296  1.21    rillig 	// The characters ' ' and '\t' are interpreted as bit numbers,
    297  1.29    rillig 	// not as part of the description; the visual arrangement in this
    298  1.29    rillig 	// example is intentionally misleading.
    299  1.21    rillig 	h_snprintb(
    300  1.21    rillig 	    "\020"
    301  1.21    rillig 	    "\001least significant"
    302  1.28    rillig 	    "\002horizontal\ttab"
    303  1.28    rillig 	    "\003\xC3\xA4",
    304  1.21    rillig 	    0xff,
    305  1.28    rillig 	    "0xff<least,horizontal,\xC3\xA4>");
    306  1.21    rillig 
    307  1.21    rillig 	// old style, empty description
    308  1.21    rillig 	//
    309  1.21    rillig 	// Empty descriptions result in multiple commas in a row, which is a
    310  1.21    rillig 	// mistake.
    311  1.21    rillig 	h_snprintb(
    312  1.21    rillig 	    "\020"
    313  1.21    rillig 	    "\001lsb"
    314  1.21    rillig 	    "\004"
    315  1.21    rillig 	    "\005"
    316  1.21    rillig 	    "\010msb",
    317  1.21    rillig 	    0xff,
    318  1.21    rillig 	    "0xff<lsb,,,msb>");
    319  1.21    rillig 
    320  1.27    rillig 	// old style, buffer size 0, null buffer
    321  1.27    rillig 	//
    322  1.29    rillig 	// If the buffer size is 0, the buffer is not accessed at all and
    323  1.29    rillig 	// may be a null pointer.
    324  1.27    rillig 	int null_rv_old = snprintb(NULL, 0, "\020\001lsb", 0x01);
    325  1.27    rillig 	ATF_CHECK_MSG(
    326  1.27    rillig 	    null_rv_old == 8,
    327  1.27    rillig 	    "want length 8, have %d", null_rv_old);
    328  1.27    rillig 
    329  1.21    rillig 	// old style, buffer too small for value
    330  1.10    rillig 	h_snprintb_len(
    331  1.29    rillig 	    1, "\020", 0x00,
    332  1.16    rillig 	    1, "");
    333  1.21    rillig 
    334  1.21    rillig 	// old style, buffer large enough for zero value
    335  1.10    rillig 	h_snprintb_len(
    336  1.29    rillig 	    2, "\020", 0x00,
    337  1.16    rillig 	    1, "0");
    338  1.21    rillig 
    339  1.21    rillig 	// old style, buffer too small for nonzero value
    340  1.10    rillig 	h_snprintb_len(
    341  1.29    rillig 	    3, "\020", 0x07,
    342  1.31    rillig 	    3, "0#");
    343  1.21    rillig 
    344  1.21    rillig 	// old style, buffer large enough for nonzero value
    345  1.10    rillig 	h_snprintb_len(
    346  1.29    rillig 	    4, "\020", 0x07,
    347  1.16    rillig 	    3, "0x7");
    348  1.21    rillig 
    349  1.21    rillig 	// old style, buffer too small for '<'
    350  1.21    rillig 	h_snprintb_len(
    351  1.29    rillig 	    4, "\020\001lsb", 0x07,
    352  1.31    rillig 	    8, "0x#");
    353  1.21    rillig 
    354  1.21    rillig 	// old style, buffer too small for description
    355  1.10    rillig 	h_snprintb_len(
    356  1.29    rillig 	    7, "\020\001lsb", 0x07,
    357  1.31    rillig 	    8, "0x7<l#");
    358  1.21    rillig 
    359  1.21    rillig 	// old style, buffer too small for '>'
    360  1.10    rillig 	h_snprintb_len(
    361  1.29    rillig 	    8, "\020\001lsb", 0x07,
    362  1.31    rillig 	    8, "0x7<ls#");
    363  1.21    rillig 
    364  1.29    rillig 	// old style, buffer large enough for '>'
    365  1.10    rillig 	h_snprintb_len(
    366  1.29    rillig 	    9, "\020\001lsb", 0x07,
    367  1.16    rillig 	    8, "0x7<lsb>");
    368  1.21    rillig 
    369  1.21    rillig 	// old style, buffer too small for second description
    370  1.10    rillig 	h_snprintb_len(
    371  1.29    rillig 	    9, "\020\001one\002two", 0x07,
    372  1.31    rillig 	    12, "0x7<one#");
    373  1.21    rillig 
    374  1.21    rillig 	// old style, buffer too small for second description
    375  1.10    rillig 	h_snprintb_len(
    376  1.29    rillig 	    10, "\020\001one\002two", 0x07,
    377  1.31    rillig 	    12, "0x7<one,#");
    378  1.21    rillig 
    379  1.21    rillig 	// old style, buffer too small for '>' after second description
    380  1.10    rillig 	h_snprintb_len(
    381  1.29    rillig 	    12, "\020\001one\002two", 0x07,
    382  1.31    rillig 	    12, "0x7<one,tw#");
    383  1.21    rillig 
    384  1.21    rillig 	// old style, buffer large enough for '>' after second description
    385  1.10    rillig 	h_snprintb_len(
    386  1.29    rillig 	    13, "\020\001one\002two", 0x07,
    387  1.16    rillig 	    12, "0x7<one,two>");
    388  1.10    rillig 
    389  1.27    rillig 	// new style, buffer size 0, null buffer
    390  1.27    rillig 	//
    391  1.27    rillig 	// If the buffer size is 0, the buffer may be NULL.
    392  1.27    rillig 	int null_rv_new = snprintb(NULL, 0, "\177\020b\000lsb\0", 0x01);
    393  1.27    rillig 	ATF_CHECK_MSG(
    394  1.27    rillig 	    null_rv_new == 8,
    395  1.27    rillig 	    "want length 8, have %d", null_rv_new);
    396  1.27    rillig 
    397  1.21    rillig 	// new style single bits
    398  1.10    rillig 	h_snprintb(
    399  1.21    rillig 	    "\177\020"
    400  1.21    rillig 	    "b\000lsb\0"
    401  1.21    rillig 	    "b\001above-lsb\0"
    402  1.10    rillig 	    "b\037bit31\0"
    403  1.10    rillig 	    "b\040bit32\0"
    404  1.21    rillig 	    "b\076below-msb\0"
    405  1.21    rillig 	    "b\077msb\0",
    406  1.21    rillig 	    0x8000000180000001,
    407  1.21    rillig 	    "0x8000000180000001<lsb,bit31,bit32,msb>");
    408  1.10    rillig 
    409  1.21    rillig 	// new style single bits, duplicate bits
    410  1.10    rillig 	h_snprintb(
    411  1.21    rillig 	    "\177\020"
    412  1.21    rillig 	    "b\000lsb\0"
    413  1.21    rillig 	    "b\000lsb\0"
    414  1.21    rillig 	    "b\000lsb\0",
    415  1.21    rillig 	    0xff,
    416  1.21    rillig 	    "0xff<lsb,lsb,lsb>");
    417   1.9    rillig 
    418  1.33    rillig 	// new style single bits, 'b' with empty description
    419  1.33    rillig 	//
    420  1.33    rillig 	// The description of a 'b' conversion must not be empty, as the
    421  1.33    rillig 	// output would contain several commas in a row.
    422  1.33    rillig 	h_snprintb_len(
    423  1.33    rillig 	    1024,
    424  1.10    rillig 	    "\177\020"
    425  1.21    rillig 	    "b\000lsb\0"
    426  1.21    rillig 	    "b\001\0"
    427  1.21    rillig 	    "b\002\0"
    428  1.33    rillig 	    "b\007msb\0",
    429  1.21    rillig 	    0xff,
    430  1.33    rillig 	    -1,
    431  1.33    rillig 	    "0xff<lsb#");
    432  1.10    rillig 
    433  1.26    rillig 	// new style single bits, bit number too large
    434  1.10    rillig 	h_snprintb_error(
    435  1.21    rillig 	    "\177\020"
    436  1.27    rillig 	    "b\100too-high\0",
    437  1.27    rillig 	    "0#");
    438  1.10    rillig 	h_snprintb_error(
    439  1.21    rillig 	    "\177\020"
    440  1.27    rillig 	    "b\377too-high\0",
    441  1.27    rillig 	    "0#");
    442  1.10    rillig 
    443  1.21    rillig 	// new style single bits, non-printable description
    444  1.10    rillig 	//
    445  1.21    rillig 	// Contrary to the old-style format, the new-style format allows
    446  1.21    rillig 	// arbitrary characters in the description, even control characters
    447  1.21    rillig 	// and non-ASCII characters.
    448  1.21    rillig 	h_snprintb(
    449  1.21    rillig 	    "\177\020"
    450  1.21    rillig 	    "b\000space \t \xC3\xA4\0",
    451  1.21    rillig 	    0x1,
    452  1.21    rillig 	    "0x1<space \t \xC3\xA4>");
    453  1.10    rillig 
    454  1.21    rillig 	// new style named bit-field, octal
    455  1.21    rillig 	//
    456  1.21    rillig 	// The bit-field value gets a leading '0' iff it is nonzero.
    457  1.10    rillig 	h_snprintb(
    458  1.10    rillig 	    "\177\010"
    459  1.21    rillig 	    "f\000\010byte0\0"
    460  1.21    rillig 	    "f\010\010byte1\0",
    461  1.21    rillig 	    0x0100,
    462  1.21    rillig 	    "0400<byte0=0,byte1=01>");
    463  1.10    rillig 
    464  1.21    rillig 	// new style named bit-field, decimal
    465  1.10    rillig 	h_snprintb(
    466  1.10    rillig 	    "\177\012"
    467  1.21    rillig 	    "f\000\010byte0\0"
    468  1.21    rillig 	    "f\010\010byte1\0",
    469  1.21    rillig 	    0x0100,
    470  1.21    rillig 	    "256<byte0=0,byte1=1>");
    471  1.21    rillig 
    472  1.21    rillig 	// new style named bit-field, hexadecimal
    473  1.29    rillig 	//
    474  1.29    rillig 	// The bit-field value gets a leading '0x' iff it is nonzero.
    475  1.21    rillig 	h_snprintb(
    476  1.21    rillig 	    "\177\020"
    477  1.21    rillig 	    "f\000\010byte0\0"
    478  1.21    rillig 	    "f\010\010byte1\0",
    479  1.21    rillig 	    0x0100,
    480  1.21    rillig 	    "0x100<byte0=0,byte1=0x1>");
    481  1.21    rillig 
    482  1.21    rillig 	// new style bit-field, from 0 width 0
    483  1.21    rillig 	h_snprintb(
    484  1.21    rillig 	    "\177\020"
    485  1.21    rillig 	    "f\000\000zero-width\0"
    486  1.21    rillig 		"=\000zero\0",
    487  1.21    rillig 	    0xffff,
    488  1.21    rillig 	    "0xffff<zero-width=0=zero>");
    489  1.21    rillig 
    490  1.21    rillig 	// new style bit-field, from 0 width 1
    491  1.21    rillig 	h_snprintb(
    492  1.21    rillig 	    "\177\020"
    493  1.21    rillig 	    "f\000\001lsb\0"
    494  1.21    rillig 		"=\000zero\0"
    495  1.21    rillig 		"=\001one\0",
    496  1.21    rillig 	    0x0,
    497  1.21    rillig 	    "0<lsb=0=zero>");
    498  1.21    rillig 	h_snprintb(
    499  1.21    rillig 	    "\177\020"
    500  1.21    rillig 	    "f\000\001lsb\0"
    501  1.21    rillig 		"=\000zero\0"
    502  1.21    rillig 		"=\001one\0",
    503  1.21    rillig 	    0x1,
    504  1.21    rillig 	    "0x1<lsb=0x1=one>");
    505  1.21    rillig 
    506  1.21    rillig 	// new style bit-field, from 0 width 63
    507  1.21    rillig 	h_snprintb(
    508  1.21    rillig 	    "\177\020"
    509  1.21    rillig 	    "f\000\077uint63\0"
    510  1.21    rillig 		"=\125match\0",
    511  1.21    rillig 	    0xaaaa5555aaaa5555,
    512  1.21    rillig 	    "0xaaaa5555aaaa5555<uint63=0x2aaa5555aaaa5555>");
    513  1.21    rillig 
    514  1.21    rillig 	// new style bit-field, from 0 width 64
    515  1.21    rillig 	h_snprintb(
    516  1.21    rillig 	    "\177\020"
    517  1.21    rillig 	    "f\000\100uint64\0"
    518  1.21    rillig 		"=\125match\0",
    519  1.21    rillig 	    0xaaaa5555aaaa5555,
    520  1.21    rillig 	    "0xaaaa5555aaaa5555<uint64=0xaaaa5555aaaa5555>");
    521  1.21    rillig 
    522  1.21    rillig 	// new style bit-field, from 0 width 65
    523  1.21    rillig 	h_snprintb_error(
    524  1.21    rillig 	    "\177\020"
    525  1.27    rillig 	    "f\000\101uint65\0",
    526  1.27    rillig 	    "0#");
    527  1.10    rillig 
    528  1.21    rillig 	// new style bit-field, from 1 width 8
    529  1.10    rillig 	h_snprintb(
    530  1.10    rillig 	    "\177\020"
    531  1.21    rillig 	    "f\001\010uint8\0"
    532  1.21    rillig 		"=\203match\0",
    533  1.21    rillig 	    0x0106,
    534  1.21    rillig 	    "0x106<uint8=0x83=match>");
    535  1.10    rillig 
    536  1.21    rillig 	// new style bit-field, from 1 width 9
    537  1.21    rillig 	//
    538  1.29    rillig 	// The '=' and ':' directives can match a bit-field value between
    539  1.21    rillig 	// 0 and 255, independent of the bit-field's width.
    540  1.10    rillig 	h_snprintb(
    541  1.21    rillig 	    "\177\020"
    542  1.21    rillig 	    "f\001\011uint9\0"
    543  1.21    rillig 		"=\203match\0"
    544  1.29    rillig 		"*=default-f\0"
    545  1.21    rillig 	    "F\001\011\0"
    546  1.21    rillig 		":\203match\0"
    547  1.29    rillig 		"*default-F\0",
    548  1.21    rillig 	    0x0306,
    549  1.29    rillig 	    "0x306<uint9=0x183=default-f,default-F>");
    550  1.10    rillig 
    551  1.29    rillig 	// new style bit-field, from 24 width 32
    552  1.10    rillig 	h_snprintb(
    553  1.21    rillig 	    "\177\020"
    554  1.29    rillig 	    "f\030\040uint32\0",
    555  1.21    rillig 	    0xaaaa555500000000,
    556  1.29    rillig 	    "0xaaaa555500000000<uint32=0xaa555500>");
    557   1.9    rillig 
    558  1.21    rillig 	// new style bit-field, from 60 width 4
    559   1.9    rillig 	h_snprintb(
    560  1.10    rillig 	    "\177\020"
    561  1.21    rillig 	    "f\074\004uint4\0",
    562  1.21    rillig 	    0xf555555555555555,
    563  1.21    rillig 	    "0xf555555555555555<uint4=0xf>");
    564  1.10    rillig 
    565  1.21    rillig 	// new style bit-field, from 60 width 5
    566  1.10    rillig 	//
    567  1.21    rillig 	// The end of the bit-field is out of bounds.
    568  1.10    rillig 	h_snprintb(
    569  1.21    rillig 	    "\177\020"
    570  1.21    rillig 	    "f\074\005uint5\0",
    571  1.21    rillig 	    0xf555555555555555,
    572  1.21    rillig 	    "0xf555555555555555<uint5=0xf>");
    573  1.21    rillig 
    574  1.21    rillig 	// new style bit-field, from 64 width 0
    575  1.21    rillig 	//
    576  1.21    rillig 	// The beginning of the bit-field is out of bounds, the end is fine.
    577  1.21    rillig 	h_snprintb_error(
    578  1.21    rillig 	    "\177\020"
    579  1.27    rillig 	    "f\100\000uint0\0",
    580  1.27    rillig 	    "0#");
    581  1.21    rillig 
    582  1.21    rillig 	// new style bit-field, from 65 width 0
    583  1.21    rillig 	//
    584  1.21    rillig 	// The beginning and end of the bit-field are out of bounds.
    585  1.21    rillig 	h_snprintb_error(
    586  1.21    rillig 	    "\177\020"
    587  1.27    rillig 	    "f\101\000uint0\0",
    588  1.27    rillig 	    "0#");
    589  1.10    rillig 
    590  1.33    rillig 	// new style bit-field, 'f' with empty description
    591  1.10    rillig 	//
    592  1.33    rillig 	// The description of an 'f' conversion must not be empty, as the
    593  1.33    rillig 	// output would contain an isolated '='.
    594  1.33    rillig 	h_snprintb_len(
    595  1.33    rillig 	    1024,
    596  1.21    rillig 	    "\177\020"
    597  1.21    rillig 	    "f\000\004\0"
    598  1.21    rillig 		"=\001one\0",
    599  1.21    rillig 	    0x1,
    600  1.33    rillig 	    -1,
    601  1.33    rillig 	    "0x1#");
    602  1.10    rillig 
    603  1.21    rillig 	// new style bit-field, non-printable description
    604  1.10    rillig 	//
    605  1.21    rillig 	// Contrary to the old-style format, the new-style format allows
    606  1.21    rillig 	// arbitrary characters in the description, even control characters
    607  1.21    rillig 	// and non-ASCII characters.
    608   1.9    rillig 	h_snprintb(
    609  1.10    rillig 	    "\177\020"
    610  1.21    rillig 	    "f\000\010\t \xC3\xA4\0"
    611  1.21    rillig 		"=\001\t \xC3\xA4\0"
    612  1.21    rillig 	    "F\000\010\0"
    613  1.21    rillig 		":\001\t \xC3\xA4\0"
    614  1.21    rillig 	    "F\000\010\0"
    615  1.21    rillig 		"*\t \xC3\xA4\0",
    616  1.21    rillig 	    0x1,
    617  1.21    rillig 	    "0x1<\t \xC3\xA4=0x1=\t \xC3\xA4,\t \xC3\xA4,\t \xC3\xA4>");
    618   1.5       ryo 
    619  1.21    rillig 	// new style bit-field, '=' with empty description
    620  1.21    rillig 	//
    621  1.33    rillig 	// The description of a '=' conversion must not be empty, as the
    622  1.33    rillig 	// output would contain several '=' in a row.
    623  1.33    rillig 	h_snprintb_len(
    624  1.33    rillig 	    1024,
    625  1.10    rillig 	    "\177\020"
    626  1.21    rillig 	    "f\000\004f\0"
    627  1.21    rillig 		"=\001one\0"
    628  1.21    rillig 		"=\001\0"
    629  1.21    rillig 		"=\001\0",
    630  1.21    rillig 	    0x1,
    631  1.33    rillig 	    -1,
    632  1.33    rillig 	    "0x1<f=0x1=one#");
    633  1.10    rillig 
    634  1.21    rillig 	// new style bit-field, 'F' followed by ':' with empty description
    635  1.10    rillig 	//
    636  1.33    rillig 	// The description of a ':' conversion must not be empty, as the
    637  1.33    rillig 	// output would contain empty angle brackets.
    638  1.33    rillig 	h_snprintb_len(
    639  1.33    rillig 	    1024,
    640   1.9    rillig 	    "\177\020"
    641  1.21    rillig 	    "F\000\004\0"
    642  1.21    rillig 		":\001\0"
    643  1.21    rillig 		"*default\0",
    644  1.21    rillig 	    0x1,
    645  1.33    rillig 	    -1,
    646  1.33    rillig 	    "0x1<#");
    647   1.6       kre 
    648  1.21    rillig 	// new style bit-field, 'F', ':' with empty description, '*'
    649  1.21    rillig 	//
    650  1.33    rillig 	// The description of a ':' conversion must not be empty, as the
    651  1.33    rillig 	// output would contain empty angle brackets. Not in this particular
    652  1.33    rillig 	// test case, as the value is different, but the structural error is
    653  1.33    rillig 	// detected nevertheless.
    654  1.33    rillig 	h_snprintb_len(
    655  1.33    rillig 	    1024,
    656  1.17    rillig 	    "\177\020"
    657  1.21    rillig 	    "F\000\004\0"
    658  1.21    rillig 		":\001\0"
    659  1.21    rillig 		"*default\0",
    660  1.21    rillig 	    0x2,
    661  1.33    rillig 	    -1,
    662  1.33    rillig 	    "0x2<#");
    663  1.17    rillig 
    664  1.21    rillig 	// new style bit-field, 'f' with non-exhaustive '='
    665   1.9    rillig 	h_snprintb(
    666  1.10    rillig 	    "\177\020"
    667  1.21    rillig 	    "f\000\004Field\0"
    668  1.10    rillig 		"=\1one\0"
    669  1.10    rillig 		"=\2two\0",
    670  1.21    rillig 	    0x3,
    671  1.21    rillig 	    "0x3<Field=0x3>");
    672  1.21    rillig 
    673  1.21    rillig 	// new style bit-field, 'F' with non-exhaustive ':'
    674  1.21    rillig 	//
    675  1.29    rillig 	// An unnamed bit-field that does not match any values generates empty
    676  1.29    rillig 	// angle brackets, which looks confusing. The ':' directives should
    677  1.29    rillig 	// either be exhaustive, or there should be a '*' catch-all directive.
    678   1.9    rillig 	h_snprintb(
    679  1.10    rillig 	    "\177\020"
    680  1.21    rillig 	    "F\000\004\0"
    681  1.10    rillig 		":\1one\0"
    682  1.10    rillig 		":\2two\0",
    683  1.21    rillig 	    0x3,
    684  1.21    rillig 	    "0x3<>");
    685  1.21    rillig 
    686  1.21    rillig 	// new style bit-field, 'F' with non-exhaustive ':'
    687  1.21    rillig 	//
    688  1.29    rillig 	// A bit-field that does not match any values generates multiple commas
    689  1.29    rillig 	// in a row, which looks confusing. The ':' directives should either be
    690  1.29    rillig 	// exhaustive, or there should be a '*' catch-all directive.
    691  1.21    rillig 	h_snprintb(
    692  1.21    rillig 	    "\177\020"
    693  1.21    rillig 	    "b\000bit0\0"
    694  1.21    rillig 	    "F\000\004\0"
    695  1.21    rillig 		":\1one\0"
    696  1.21    rillig 		":\2two\0"
    697  1.21    rillig 	    "b\001bit1\0",
    698  1.21    rillig 	    0x3,
    699  1.21    rillig 	    "0x3<bit0,,bit1>");
    700  1.21    rillig 
    701  1.25    rillig 	// new style bit-field, '=', can never match
    702  1.29    rillig 	//
    703  1.29    rillig 	// The extracted value from the bit-field has 7 bits and is thus less
    704  1.29    rillig 	// than 128, therefore it can neither match 128 nor 255.
    705  1.25    rillig 	h_snprintb(
    706  1.25    rillig 	    "\177\020"
    707  1.25    rillig 	    "f\000\007f\0"
    708  1.25    rillig 		"=\200never\0"
    709  1.25    rillig 		"=\377never\0",
    710  1.25    rillig 	    0xff,
    711  1.25    rillig 	    "0xff<f=0x7f>");
    712  1.25    rillig 
    713  1.21    rillig 	// new style, two separate bit-fields
    714   1.9    rillig 	h_snprintb(
    715   1.9    rillig 	    "\177\020"
    716  1.21    rillig 	    "f\000\004f1\0"
    717  1.21    rillig 		"=\001one\0"
    718  1.21    rillig 		"=\002two\0"
    719  1.21    rillig 	    "f\004\004f2\0"
    720  1.21    rillig 		"=\001one\0"
    721  1.21    rillig 		"=\002two\0",
    722  1.21    rillig 	    0x12,
    723  1.21    rillig 	    "0x12<f1=0x2=two,f2=0x1=one>");
    724  1.21    rillig 
    725  1.21    rillig 	// new style, mixed named and unnamed bit-fields
    726  1.21    rillig 	h_snprintb(
    727  1.21    rillig 	    "\177\020"
    728  1.21    rillig 	    "f\000\004f1\0"
    729  1.21    rillig 		"=\001one\0"
    730  1.21    rillig 		"=\002two\0"
    731  1.10    rillig 	    "F\010\004\0"
    732  1.21    rillig 		":\015thirteen\0"
    733  1.21    rillig 	    "f\004\004f2\0"
    734  1.21    rillig 		"=\001one\0"
    735  1.21    rillig 		"=\002two\0",
    736  1.21    rillig 	    0x0d12,
    737  1.21    rillig 	    "0xd12<f1=0x2=two,thirteen,f2=0x1=one>");
    738  1.21    rillig 
    739  1.21    rillig 	// new style bit-field, overlapping
    740  1.21    rillig 	h_snprintb(
    741  1.21    rillig 	    "\177\020"
    742  1.21    rillig 	    "f\000\004lo\0"
    743  1.21    rillig 	    "f\002\004mid\0"
    744  1.21    rillig 	    "f\004\004hi\0"
    745  1.21    rillig 	    "f\000\010all\0",
    746  1.21    rillig 	    0x18,
    747  1.21    rillig 	    "0x18<lo=0x8,mid=0x6,hi=0x1,all=0x18>");
    748  1.21    rillig 
    749  1.21    rillig 	// new style bit-field, difference between '=' and ':'
    750  1.21    rillig 	//
    751  1.21    rillig 	// The ':' directive can almost emulate the '=' directive, without the
    752  1.21    rillig 	// numeric output and with a different separator. It's best to use
    753  1.29    rillig 	// either 'f' with '=', or 'F' with ':', but not mix them.
    754  1.21    rillig 	h_snprintb(
    755  1.21    rillig 	    "\177\020"
    756  1.21    rillig 	    "f\000\004field\0"
    757  1.29    rillig 		"=\010f-value\0"
    758  1.29    rillig 	    "F\000\000\0"		// Use an empty bit-field
    759  1.29    rillig 		":\000separator\0"	// to generate a separator.
    760  1.21    rillig 	    "F\000\004\0"
    761  1.29    rillig 		":\010F-value\0",
    762  1.21    rillig 	    0x18,
    763  1.29    rillig 	    "0x18<field=0x8=f-value,separator,F-value>");
    764  1.21    rillig 
    765  1.21    rillig 	// new style bit-field default, fixed string
    766  1.21    rillig 	//
    767  1.21    rillig 	// The 'f' directive pairs up with the '=' directive,
    768  1.21    rillig 	// the 'F' directive pairs up with the ':' directive,
    769  1.21    rillig 	// but there's only one 'default' directive for both variants,
    770  1.21    rillig 	// so its description should include the '=' when used with 'f' but
    771  1.21    rillig 	// not with 'F'.
    772  1.21    rillig 	h_snprintb(
    773  1.21    rillig 	    "\177\020"
    774  1.21    rillig 	    "f\030\010f1\0"
    775  1.21    rillig 		"*default\0"
    776  1.21    rillig 	    "f\020\010f2\0"
    777  1.21    rillig 		"*=default\0"
    778  1.21    rillig 	    "F\010\010\0"
    779  1.21    rillig 		"*default\0"
    780  1.21    rillig 	    "F\010\010\0"
    781  1.21    rillig 		"*=default\0",
    782  1.21    rillig 	    0x11223344,
    783  1.21    rillig 	    "0x11223344<f1=0x11default,f2=0x22=default,default,=default>");
    784  1.21    rillig 
    785  1.21    rillig 	// new style bit-field default, numeric conversion specifier
    786  1.21    rillig 	h_snprintb(
    787  1.21    rillig 	    "\177\020"
    788  1.21    rillig 	    "f\010\010f\0"
    789  1.21    rillig 		"*=f(%ju)\0"
    790  1.21    rillig 	    "F\000\010F\0"
    791  1.21    rillig 		"*F(%ju)\0",
    792  1.21    rillig 	    0x1122,
    793  1.21    rillig 	    "0x1122<f=0x11=f(17),F(34)>");
    794  1.21    rillig 
    795  1.25    rillig 	// new style bit-field default, can never match
    796  1.29    rillig 	//
    797  1.29    rillig 	// The '=' directive are exhaustive, making the '*' redundant.
    798  1.25    rillig 	h_snprintb(
    799  1.25    rillig 	    "\177\020"
    800  1.25    rillig 	    "f\010\002f\0"
    801  1.25    rillig 		"=\000zero\0"
    802  1.25    rillig 		"=\001one\0"
    803  1.25    rillig 		"=\002two\0"
    804  1.25    rillig 		"=\003three\0"
    805  1.29    rillig 		"*default\0",
    806  1.25    rillig 	    0xff00,
    807  1.25    rillig 	    "0xff00<f=0x3=three>");
    808  1.25    rillig 
    809  1.21    rillig 	// new style bit-field default, invalid conversion specifier
    810  1.21    rillig 	//
    811  1.21    rillig 	// There is no reliable way to make snprintf return an error, as such
    812  1.21    rillig 	// errors are defined as undefined behavior in the C standard.
    813  1.21    rillig 	// Instead, here's a conversion specifier that produces a literal '%'.
    814  1.21    rillig 	h_snprintb(
    815  1.21    rillig 	    "\177\020"
    816  1.21    rillig 	    "f\000\010f\0"
    817  1.21    rillig 		"*=%030ju%%\0",
    818  1.21    rillig 	    0xff,
    819  1.21    rillig 	    "0xff<f=0xff=000000000000000000000000000255%>");
    820  1.21    rillig 
    821  1.30    rillig 	// new style unknown directive, at the beginning
    822  1.30    rillig 	h_snprintb_len(
    823  1.30    rillig 	    128,
    824  1.30    rillig 	    "\177\020"
    825  1.30    rillig 	    "unknown\0",
    826  1.30    rillig 	    0xff,
    827  1.30    rillig 	    -1,
    828  1.30    rillig 	    "0xff#");
    829  1.30    rillig 
    830  1.30    rillig 	// new style unknown directive, after a known directive
    831  1.30    rillig 	h_snprintb_len(
    832  1.30    rillig 	    128,
    833  1.21    rillig 	    "\177\020"
    834  1.30    rillig 	    "b\007msb\0"
    835  1.30    rillig 	    "unknown\0",
    836  1.21    rillig 	    0xff,
    837  1.30    rillig 	    -1,
    838  1.30    rillig 	    "0xff<msb#");
    839  1.21    rillig 
    840  1.21    rillig 	// new style combinations, 'b' '='
    841  1.21    rillig 	//
    842  1.29    rillig 	// A '=' directive without a preceding 'f' or 'F' directive generates
    843  1.29    rillig 	// misleading output outside the angle brackets, which is a mistake.
    844  1.21    rillig 	h_snprintb(
    845  1.21    rillig 	    "\177\020"
    846  1.21    rillig 	    "b\004bit4\0"
    847  1.21    rillig 		"=\000clear\0"
    848  1.21    rillig 		"=\001set\0"
    849  1.21    rillig 		"=\245complete\0"
    850  1.21    rillig 	    "b\000bit0\0"
    851  1.21    rillig 		"=\000clear\0"
    852  1.21    rillig 		"=\001set\0"
    853  1.21    rillig 		"=\245complete\0",
    854  1.21    rillig 	    0xa5,
    855  1.21    rillig 	    "0xa5=complete<bit0=complete>");
    856  1.21    rillig 
    857  1.21    rillig 	// new style combinations, 'b' ':'
    858  1.21    rillig 	//
    859  1.29    rillig 	// A ':' directive without a preceding 'f' or 'F' directive generates
    860  1.29    rillig 	// misleading output outside or inside the angle brackets, which is a
    861  1.29    rillig 	// mistake.
    862  1.21    rillig 	h_snprintb(
    863  1.21    rillig 	    "\177\020"
    864  1.21    rillig 	    "b\004bit4\0"
    865  1.21    rillig 		":\000clear\0"
    866  1.21    rillig 		":\001set\0"
    867  1.21    rillig 		":\245complete\0"
    868  1.21    rillig 	    "b\000bit0\0"
    869  1.21    rillig 		":\000clear\0"
    870  1.21    rillig 		":\001set\0"
    871  1.21    rillig 		":\245complete\0",
    872  1.21    rillig 	    0xa5,
    873  1.21    rillig 	    "0xa5complete<bit0complete>");
    874  1.21    rillig 
    875  1.21    rillig 	// new style combinations, 'b' '*'
    876  1.21    rillig 	//
    877  1.21    rillig 	// A '*' directive without a preceding 'f' or 'F' directive is ignored.
    878  1.21    rillig 	h_snprintb(
    879  1.21    rillig 	    "\177\020"
    880  1.21    rillig 	    "b\004bit4\0"
    881  1.21    rillig 		"*default(%ju)\0"
    882  1.21    rillig 	    "b\000bit0\0"
    883  1.21    rillig 		"*default(%ju)\0",
    884  1.21    rillig 	    0xa5,
    885  1.21    rillig 	    "0xa5<bit0>");
    886  1.21    rillig 
    887  1.21    rillig 	// new style combinations, 'f' 'b' '='
    888  1.21    rillig 	//
    889  1.29    rillig 	// A 'b' directive that occurs between an 'f' and an '=' directive
    890  1.29    rillig 	// generates misleading output, which is a mistake.
    891  1.21    rillig 	h_snprintb(
    892  1.21    rillig 	    "\177\020"
    893  1.21    rillig 	    "f\000\010f\0"
    894  1.21    rillig 	    "b\005bit5\0"
    895  1.29    rillig 		"=\245match\0",
    896  1.21    rillig 	    0xa5,
    897  1.21    rillig 	    "0xa5<f=0xa5,bit5=match>");
    898  1.21    rillig 
    899  1.21    rillig 	// new style combinations, 'f' 'b' ':'
    900  1.21    rillig 	//
    901  1.29    rillig 	// A 'b' directive that occurs between an 'f' and a ':' directive
    902  1.29    rillig 	// generates misleading output, which is a mistake.
    903  1.21    rillig 	h_snprintb(
    904  1.21    rillig 	    "\177\020"
    905  1.21    rillig 	    "f\000\010f\0"
    906  1.21    rillig 	    "b\005bit5\0"
    907  1.29    rillig 		":\245match\0",
    908  1.21    rillig 	    0xa5,
    909  1.21    rillig 	    "0xa5<f=0xa5,bit5match>");
    910  1.21    rillig 
    911  1.21    rillig 	// new style combinations, 'f' ':'
    912  1.29    rillig 	//
    913  1.29    rillig 	// Combining the 'f' directive with the ':' directive produces the
    914  1.29    rillig 	// misleading output '0x1one', which is a mistake.
    915  1.21    rillig 	h_snprintb(
    916  1.21    rillig 	    "\177\20"
    917  1.21    rillig 	    "f\000\004nibble\0"
    918  1.21    rillig 		":\001one\0",
    919  1.21    rillig 	    0x01,
    920  1.21    rillig 	    "0x1<nibble=0x1one>");
    921   1.6       kre 
    922  1.21    rillig 	// new style combinations, 'F' '='
    923  1.21    rillig 	//
    924  1.21    rillig 	// Combining the 'F' and '=' directives outputs an isolated '=', which
    925  1.29    rillig 	// is a mistake.
    926   1.9    rillig 	h_snprintb(
    927   1.9    rillig 	    "\177\20"
    928  1.21    rillig 	    "F\000\004\0"
    929  1.21    rillig 		"=\001one\0",
    930  1.21    rillig 	    0x01,
    931  1.21    rillig 	    "0x1<=one>");
    932  1.21    rillig 
    933  1.21    rillig 	// new style combinations, '='
    934  1.21    rillig 	//
    935  1.29    rillig 	// A '=' directive without a preceding 'f' or 'F' directive generates
    936  1.29    rillig 	// output that doesn't match the standard '0xaa<description>' form,
    937  1.29    rillig 	// which is a mistake.
    938  1.21    rillig 	h_snprintb(
    939  1.21    rillig 	    "\177\020"
    940  1.29    rillig 		"=\245match\0",
    941  1.21    rillig 	    0xa5,
    942  1.21    rillig 	    "0xa5=match");
    943  1.21    rillig 
    944  1.21    rillig 	// new style combinations, ':'
    945  1.21    rillig 	//
    946  1.29    rillig 	// A ':' directive without a preceding 'f' or 'F' directive generates
    947  1.29    rillig 	// misleading output, which is a mistake.
    948  1.21    rillig 	h_snprintb(
    949  1.21    rillig 	    "\177\020"
    950  1.29    rillig 		":\245match\0",
    951  1.21    rillig 	    0xa5,
    952  1.21    rillig 	    "0xa5match");
    953  1.21    rillig 
    954  1.21    rillig 	// new style combinations, '*'
    955  1.21    rillig 	//
    956  1.29    rillig 	// A '*' directive without a preceding 'f' or 'F' is useless, which is
    957  1.29    rillig 	// a mistake.
    958  1.21    rillig 	h_snprintb(
    959  1.21    rillig 	    "\177\020"
    960  1.21    rillig 		"*match\0",
    961  1.21    rillig 	    0xa5,
    962  1.21    rillig 	    "0xa5");
    963  1.21    rillig 
    964  1.21    rillig 	// new style combinations, 'f' '*' '='
    965  1.21    rillig 	//
    966  1.29    rillig 	// After a catch-all '*' directive, any following '=' directive
    967  1.29    rillig 	// generates misleading output, which is a mistake.
    968  1.21    rillig 	h_snprintb(
    969  1.21    rillig 	    "\177\020"
    970  1.21    rillig 	    "f\000\010f\0"
    971  1.21    rillig 		"*=default\0"
    972  1.29    rillig 		"=\245match\0",
    973  1.21    rillig 	    0xa5,
    974  1.21    rillig 	    "0xa5<f=0xa5=default=match>");
    975  1.21    rillig 
    976  1.21    rillig 	// new style combinations, 'F' '*' ':'
    977  1.21    rillig 	//
    978  1.29    rillig 	// After a catch-all '*' directive, any following ':' directive
    979  1.29    rillig 	// generates misleading output, which is a mistake.
    980  1.21    rillig 	h_snprintb(
    981  1.21    rillig 	    "\177\020"
    982  1.21    rillig 	    "F\000\010F\0"
    983  1.21    rillig 		"*default\0"
    984  1.29    rillig 		":\245-match\0",
    985  1.21    rillig 	    0xa5,
    986  1.21    rillig 	    "0xa5<default-match>");
    987  1.21    rillig 
    988  1.21    rillig 	// new style combinations, '*' '*'
    989  1.21    rillig 	//
    990  1.29    rillig 	// After a catch-all '*' directive, any further '*' directive is
    991  1.29    rillig 	// ignored and thus redundant, which is a mistake.
    992  1.21    rillig 	h_snprintb(
    993  1.21    rillig 	    "\177\020"
    994  1.21    rillig 	    "f\000\010f\0"
    995  1.21    rillig 		"*=default-f\0"
    996  1.21    rillig 		"*ignored\0"
    997  1.21    rillig 	    "F\000\010\0"
    998  1.21    rillig 		"*default-F\0"
    999  1.21    rillig 		"*ignored\0",
   1000  1.21    rillig 	    0xa5,
   1001  1.21    rillig 	    "0xa5<f=0xa5=default-f,default-F>");
   1002  1.21    rillig 
   1003  1.29    rillig 	// example from the manual page, old style octal
   1004  1.21    rillig 	h_snprintb(
   1005  1.21    rillig 	    "\10\2BITTWO\1BITONE",
   1006  1.29    rillig 	    0x03,
   1007  1.21    rillig 	    "03<BITTWO,BITONE>");
   1008  1.21    rillig 
   1009  1.29    rillig 	// example from the manual page, old style hexadecimal
   1010  1.29    rillig 	//
   1011  1.29    rillig 	// When using a hexadecimal escape sequence to encode a bit number,
   1012  1.29    rillig 	// the description must not start with a hexadecimal digit, or that
   1013  1.29    rillig 	// digit is interpreted as part of the bit number. To prevent this,
   1014  1.29    rillig 	// the bit number and the description need to be written as separate
   1015  1.29    rillig 	// string literals.
   1016  1.21    rillig 	h_snprintb(
   1017  1.21    rillig 	    "\20"
   1018  1.21    rillig 	    "\x10NOTBOOT" "\x0f""FPP" "\x0eSDVMA"
   1019  1.21    rillig 	    "\x0cVIDEO" "\x0bLORES" "\x0a""FPA" "\x09""DIAG"
   1020  1.21    rillig 	    "\x07""CACHE" "\x06IOCACHE" "\x05LOOPBACK"
   1021  1.21    rillig 	    "\x04""DBGCACHE",
   1022  1.21    rillig 	    0xe860,
   1023  1.21    rillig 	    "0xe860<NOTBOOT,FPP,SDVMA,VIDEO,CACHE,IOCACHE>");
   1024  1.21    rillig 
   1025  1.29    rillig 	// example from the manual page, new style bits and fields
   1026  1.21    rillig 	h_snprintb(
   1027  1.21    rillig 	    "\177\020"
   1028  1.21    rillig 	    "b\0LSB\0" "b\1BITONE\0"
   1029  1.21    rillig 	    "f\4\4NIBBLE2\0"
   1030  1.21    rillig 	    "f\x10\4BURST\0" "=\4FOUR\0" "=\xf""FIFTEEN\0"
   1031  1.21    rillig 	    "b\x1fMSB\0",
   1032  1.21    rillig 	    0x800f0701,
   1033  1.21    rillig 	    "0x800f0701<LSB,NIBBLE2=0,BURST=0xf=FIFTEEN,MSB>");
   1034   1.6       kre 
   1035  1.29    rillig 	// example from the manual page, new style mmap
   1036  1.21    rillig #define	MAP_FMT				\
   1037  1.21    rillig 	"\177\020"			\
   1038  1.21    rillig 	"b\0"  "SHARED\0"		\
   1039  1.21    rillig 	"b\1"  "PRIVATE\0"		\
   1040  1.21    rillig 	"b\2"  "COPY\0"			\
   1041  1.21    rillig 	"b\4"  "FIXED\0"		\
   1042  1.21    rillig 	"b\5"  "RENAME\0"		\
   1043  1.21    rillig 	"b\6"  "NORESERVE\0"		\
   1044  1.21    rillig 	"b\7"  "INHERIT\0"		\
   1045  1.21    rillig 	"b\11" "HASSEMAPHORE\0"		\
   1046  1.21    rillig 	"b\12" "TRYFIXED\0"		\
   1047  1.21    rillig 	"b\13" "WIRED\0"		\
   1048  1.21    rillig 	"F\14\1\0"			\
   1049  1.21    rillig 		":\0" "FILE\0"		\
   1050  1.21    rillig 		":\1" "ANONYMOUS\0"	\
   1051  1.21    rillig 	"b\15" "STACK\0"		\
   1052  1.21    rillig 	"F\30\010\0"			\
   1053  1.21    rillig 		":\000" "ALIGN=NONE\0"	\
   1054  1.21    rillig 		":\015" "ALIGN=8KB\0"	\
   1055  1.21    rillig 		"*"     "ALIGN=2^%ju\0"
   1056  1.21    rillig 	h_snprintb(
   1057  1.21    rillig 	    MAP_FMT,
   1058  1.21    rillig 	    0x0d001234,
   1059  1.21    rillig 	    "0xd001234<COPY,FIXED,RENAME,HASSEMAPHORE,ANONYMOUS,ALIGN=8KB>");
   1060  1.21    rillig 	h_snprintb(
   1061  1.21    rillig 	    MAP_FMT,
   1062  1.21    rillig 	    0x2e000000,
   1063  1.21    rillig 	    "0x2e000000<FILE,ALIGN=2^46>");
   1064  1.10    rillig 
   1065   1.9    rillig 	// It is possible but cumbersome to implement a reduced variant of
   1066   1.9    rillig 	// rot13 using snprintb, shown here for lowercase letters only.
   1067   1.9    rillig 	for (char ch = 'A'; ch <= '~'; ch++) {
   1068   1.9    rillig 		char rot13 = ch >= 'a' && ch <= 'm' ? ch + 13
   1069   1.9    rillig 		    : ch >= 'n' && ch <= 'z' ? ch - 13
   1070   1.9    rillig 		    : '?';
   1071   1.9    rillig 		char expected[8];
   1072   1.9    rillig 		ATF_REQUIRE_EQ(7,
   1073   1.9    rillig 		    snprintf(expected, sizeof(expected), "%#x<%c>", ch, rot13));
   1074   1.9    rillig 		h_snprintb(
   1075   1.9    rillig 		    "\177\020"
   1076   1.9    rillig 		    "F\000\010\0"
   1077   1.9    rillig 		    ":an\0:bo\0:cp\0:dq\0:er\0:fs\0:gt\0:hu\0"
   1078   1.9    rillig 		    ":iv\0:jw\0:kx\0:ly\0:mz\0"
   1079   1.9    rillig 		    ":na\0:ob\0:pc\0:qd\0:re\0:sf\0:tg\0:uh\0"
   1080   1.9    rillig 		    ":vi\0:wj\0:xk\0:yl\0:zm\0"
   1081   1.9    rillig 		    // If snprintf accepted "%jc", it would be possible to
   1082   1.9    rillig 		    // echo the non-alphabetic characters instead of a
   1083   1.9    rillig 		    // catchall question mark.
   1084   1.9    rillig 		    "*?\0",
   1085   1.9    rillig 		    ch,
   1086   1.9    rillig 		    expected);
   1087   1.9    rillig 	}
   1088  1.15    rillig 
   1089  1.21    rillig 	// new style, small buffers
   1090  1.15    rillig 	h_snprintb_len(
   1091  1.29    rillig 	    0, "\177\020", 0x00,
   1092  1.16    rillig 	    1, "");
   1093  1.15    rillig 	h_snprintb_len(
   1094  1.29    rillig 	    1, "\177\020", 0x00,
   1095  1.16    rillig 	    1, "");
   1096  1.15    rillig 	h_snprintb_len(
   1097  1.29    rillig 	    2, "\177\020", 0x00,
   1098  1.16    rillig 	    1, "0");
   1099  1.15    rillig 	h_snprintb_len(
   1100  1.29    rillig 	    3, "\177\020", 0x00,
   1101  1.16    rillig 	    1, "0");
   1102  1.15    rillig 	h_snprintb_len(
   1103  1.29    rillig 	    3, "\177\020", 0x07,
   1104  1.31    rillig 	    3, "0#");
   1105  1.15    rillig 	h_snprintb_len(
   1106  1.29    rillig 	    4, "\177\020", 0x07,
   1107  1.16    rillig 	    3, "0x7");
   1108  1.15    rillig 	h_snprintb_len(
   1109  1.29    rillig 	    7, "\177\020b\000lsb\0", 0x07,
   1110  1.31    rillig 	    8, "0x7<l#");
   1111  1.15    rillig 	h_snprintb_len(
   1112  1.29    rillig 	    8, "\177\020b\000lsb\0", 0x07,
   1113  1.31    rillig 	    8, "0x7<ls#");
   1114  1.15    rillig 	h_snprintb_len(
   1115  1.29    rillig 	    9, "\177\020b\000lsb\0", 0x07,
   1116  1.16    rillig 	    8, "0x7<lsb>");
   1117  1.15    rillig 	h_snprintb_len(
   1118  1.29    rillig 	    9, "\177\020b\000one\0b\001two\0", 0x07,
   1119  1.31    rillig 	    12, "0x7<one#");
   1120  1.15    rillig 	h_snprintb_len(
   1121  1.29    rillig 	    10, "\177\020b\000one\0b\001two\0", 0x07,
   1122  1.31    rillig 	    12, "0x7<one,#");
   1123  1.15    rillig 	h_snprintb_len(
   1124  1.29    rillig 	    12, "\177\020b\000one\0b\001two\0", 0x07,
   1125  1.31    rillig 	    12, "0x7<one,tw#");
   1126  1.15    rillig 	h_snprintb_len(
   1127  1.29    rillig 	    13, "\177\020b\000one\0b\001two\0", 0x07,
   1128  1.16    rillig 	    12, "0x7<one,two>");
   1129   1.1      jmmv }
   1130   1.1      jmmv 
   1131   1.2  pgoyette ATF_TC(snprintb_m);
   1132   1.2  pgoyette ATF_TC_HEAD(snprintb_m, tc)
   1133   1.2  pgoyette {
   1134   1.2  pgoyette 	atf_tc_set_md_var(tc, "descr", "Checks snprintb_m(3)");
   1135   1.2  pgoyette }
   1136   1.2  pgoyette ATF_TC_BODY(snprintb_m, tc)
   1137   1.2  pgoyette {
   1138  1.21    rillig 
   1139  1.21    rillig 	// old style, line_max exceeded by number in line 1
   1140  1.21    rillig 	h_snprintb_m(
   1141  1.21    rillig 	    "\020",
   1142  1.21    rillig 	    0xff,
   1143  1.21    rillig 	    1,
   1144  1.24    rillig 	    "#\0");
   1145  1.21    rillig 
   1146  1.21    rillig 	// old style, line_max exceeded by '<' in line 1
   1147  1.21    rillig 	h_snprintb_m(
   1148  1.27    rillig 	    "\020"
   1149  1.27    rillig 	    "\001lsb",
   1150  1.21    rillig 	    0xff,
   1151  1.21    rillig 	    4,
   1152  1.27    rillig 	    "0xf#\0");
   1153  1.21    rillig 
   1154  1.27    rillig 	// old style, line_max exceeded by description
   1155  1.21    rillig 	h_snprintb_m(
   1156  1.21    rillig 	    "\020"
   1157  1.21    rillig 	    "\001bit1"
   1158  1.21    rillig 	    "\002bit2",
   1159  1.21    rillig 	    0xff,
   1160  1.27    rillig 	    7,
   1161  1.27    rillig 	    "0xff<b#\0"
   1162  1.27    rillig 	    "0xff<b#\0");
   1163  1.21    rillig 
   1164  1.21    rillig 	// old style, line_max exceeded by '>' in line 1
   1165  1.21    rillig 	h_snprintb_m(
   1166  1.13    rillig 	    "\020"
   1167  1.13    rillig 	    "\001bit1"
   1168  1.21    rillig 	    "\0022",
   1169  1.21    rillig 	    0xff,
   1170  1.21    rillig 	    9,
   1171  1.24    rillig 	    "0xff<bit#\0"
   1172  1.24    rillig 	    "0xff<2>\0");
   1173  1.21    rillig 
   1174  1.21    rillig 	// old style, line_max exceeded by description in line 2
   1175  1.21    rillig 	h_snprintb_m(
   1176  1.21    rillig 	    "\020"
   1177  1.21    rillig 	    "\0011"
   1178  1.21    rillig 	    "\002bit2",
   1179  1.21    rillig 	    0xff,
   1180  1.21    rillig 	    8,
   1181  1.21    rillig 	    "0xff<1>\0"
   1182  1.24    rillig 	    "0xff<bi#\0");
   1183  1.21    rillig 
   1184  1.21    rillig 	// old style, line_max exceeded by '>' in line 2
   1185  1.21    rillig 	h_snprintb_m(
   1186  1.21    rillig 	    "\020"
   1187  1.21    rillig 	    "\0011"
   1188  1.21    rillig 	    "\002bit2",
   1189  1.21    rillig 	    0xff,
   1190  1.21    rillig 	    9,
   1191  1.21    rillig 	    "0xff<1>\0"
   1192  1.24    rillig 	    "0xff<bit#\0");
   1193  1.21    rillig 
   1194  1.29    rillig 	// old style, complete
   1195  1.21    rillig 	h_snprintb_m(
   1196  1.21    rillig 	    "\020"
   1197  1.21    rillig 	    "\0011"
   1198  1.21    rillig 	    "\002bit2",
   1199  1.21    rillig 	    0xff,
   1200  1.21    rillig 	    10,
   1201  1.21    rillig 	    "0xff<1>\0"
   1202  1.21    rillig 	    "0xff<bit2>\0");
   1203  1.21    rillig 
   1204  1.21    rillig 	// new style, line_max exceeded by value in line 1
   1205  1.21    rillig 	h_snprintb_m(
   1206  1.21    rillig 	    "\177\020",
   1207  1.21    rillig 	    0xff,
   1208  1.29    rillig 	    3,
   1209  1.29    rillig 	    "0x#\0");
   1210  1.21    rillig 
   1211  1.21    rillig 	// new style, line_max exceeded by single-bit '<' in line 1
   1212  1.21    rillig 	h_snprintb_m(
   1213  1.21    rillig 	    "\177\020"
   1214  1.21    rillig 	    "b\000bit\0",
   1215  1.21    rillig 	    0xff,
   1216  1.21    rillig 	    4,
   1217  1.24    rillig 	    "0xf#\0");
   1218  1.21    rillig 
   1219  1.21    rillig 	// new style, line_max exceeded by single-bit description in line 1
   1220  1.21    rillig 	h_snprintb_m(
   1221  1.21    rillig 	    "\177\020"
   1222  1.21    rillig 	    "b\000bit0\0"
   1223  1.21    rillig 	    "b\001two\0",
   1224  1.21    rillig 	    0xff,
   1225  1.21    rillig 	    8,
   1226  1.24    rillig 	    "0xff<bi#\0"
   1227  1.24    rillig 	    "0xff<tw#\0");
   1228  1.21    rillig 
   1229  1.21    rillig 	// new style, line_max exceeded by single-bit '>' in line 1
   1230  1.21    rillig 	h_snprintb_m(
   1231  1.21    rillig 	    "\177\020"
   1232  1.21    rillig 	    "b\000bit0\0"
   1233  1.21    rillig 	    "b\001two\0",
   1234  1.21    rillig 	    0xff,
   1235  1.21    rillig 	    9,
   1236  1.24    rillig 	    "0xff<bit#\0"
   1237  1.24    rillig 	    "0xff<two>\0");
   1238  1.21    rillig 
   1239  1.21    rillig 	// new style, line_max exceeded by single-bit description in line 2
   1240  1.21    rillig 	h_snprintb_m(
   1241  1.21    rillig 	    "\177\020"
   1242  1.21    rillig 	    "b\000one\0"
   1243  1.21    rillig 	    "b\001three\0",
   1244  1.21    rillig 	    0xff,
   1245  1.21    rillig 	    9,
   1246  1.21    rillig 	    "0xff<one>\0"
   1247  1.24    rillig 	    "0xff<thr#\0");
   1248  1.21    rillig 
   1249  1.21    rillig 	// new style, line_max exceeded by single-bit '>' in line 2
   1250  1.21    rillig 	h_snprintb_m(
   1251  1.21    rillig 	    "\177\020"
   1252  1.21    rillig 	    "b\000one\0"
   1253  1.29    rillig 	    "b\001three\0",
   1254  1.21    rillig 	    0xff,
   1255  1.29    rillig 	    10,
   1256  1.21    rillig 	    "0xff<one>\0"
   1257  1.29    rillig 	    "0xff<thre#\0");
   1258  1.21    rillig 
   1259  1.21    rillig 	// new style, single-bit complete
   1260  1.21    rillig 	h_snprintb_m(
   1261  1.21    rillig 	    "\177\020"
   1262  1.21    rillig 	    "b\000one\0"
   1263  1.21    rillig 	    "b\001three\0",
   1264  1.21    rillig 	    0xff,
   1265  1.21    rillig 	    11,
   1266  1.21    rillig 	    "0xff<one>\0"
   1267  1.21    rillig 	    "0xff<three>\0");
   1268  1.21    rillig 
   1269  1.21    rillig 	// new style, line_max exceeded by named bit-field number in line 1
   1270  1.21    rillig 	h_snprintb_m(
   1271  1.21    rillig 	    "\177\020"
   1272  1.21    rillig 	    "f\000\004lo\0",
   1273  1.21    rillig 	    0xff,
   1274  1.21    rillig 	    3,
   1275  1.24    rillig 	    "0x#\0");
   1276  1.21    rillig 
   1277  1.21    rillig 	// new style, line_max exceeded by named bit-field '<' in line 1
   1278  1.21    rillig 	h_snprintb_m(
   1279  1.21    rillig 	    "\177\020"
   1280  1.21    rillig 	    "f\000\004lo\0",
   1281  1.21    rillig 	    0xff,
   1282  1.21    rillig 	    4,
   1283  1.24    rillig 	    "0xf#\0");
   1284  1.13    rillig 
   1285  1.29    rillig 	// new style, line_max exceeded by bit-field description in line 1
   1286  1.21    rillig 	h_snprintb_m(
   1287  1.13    rillig 	    "\177\020"
   1288  1.21    rillig 	    "f\000\004lo\0",
   1289  1.21    rillig 	    0xff,
   1290  1.13    rillig 	    6,
   1291  1.24    rillig 	    "0xff<#\0");
   1292  1.16    rillig 
   1293  1.21    rillig 	// new style, line_max exceeded by named bit-field '=' in line 1
   1294  1.21    rillig 	h_snprintb_m(
   1295  1.21    rillig 	    "\177\020"
   1296  1.21    rillig 	    "f\000\004lo\0",
   1297  1.21    rillig 	    0xff,
   1298  1.21    rillig 	    7,
   1299  1.24    rillig 	    "0xff<l#\0");
   1300  1.16    rillig 
   1301  1.21    rillig 	// new style, line_max exceeded by named bit-field value in line 1
   1302  1.21    rillig 	h_snprintb_m(
   1303  1.16    rillig 	    "\177\020"
   1304  1.21    rillig 	    "f\000\004lo\0",
   1305  1.16    rillig 	    0xff,
   1306  1.16    rillig 	    10,
   1307  1.24    rillig 	    "0xff<lo=0#\0");
   1308  1.21    rillig 
   1309  1.21    rillig 	// new style, line_max exceeded by named bit-field '=' in line 1
   1310  1.21    rillig 	h_snprintb_m(
   1311  1.21    rillig 	    "\177\020"
   1312  1.21    rillig 	    "f\000\004lo\0"
   1313  1.21    rillig 		"=\017match\0",
   1314  1.21    rillig 	    0xff,
   1315  1.29    rillig 	    12,
   1316  1.29    rillig 	    "0xff<lo=0xf#\0");
   1317  1.21    rillig 
   1318  1.27    rillig 	// new style, line_max exceeded by named bit-field value description in
   1319  1.27    rillig 	// line 1
   1320  1.21    rillig 	h_snprintb_m(
   1321  1.21    rillig 	    "\177\020"
   1322  1.21    rillig 	    "f\000\004lo\0"
   1323  1.21    rillig 		"=\017match\0",
   1324  1.21    rillig 	    0xff,
   1325  1.21    rillig 	    16,
   1326  1.24    rillig 	    "0xff<lo=0xf=mat#\0");
   1327  1.21    rillig 
   1328  1.21    rillig 	// new style, line_max exceeded by named bit-field '>' in line 1
   1329  1.21    rillig 	h_snprintb_m(
   1330  1.21    rillig 	    "\177\020"
   1331  1.21    rillig 	    "f\000\004lo\0"
   1332  1.21    rillig 		"=\017match\0",
   1333  1.21    rillig 	    0xff,
   1334  1.21    rillig 	    17,
   1335  1.24    rillig 	    "0xff<lo=0xf=matc#\0");
   1336  1.21    rillig 
   1337  1.29    rillig 	// new style, line_max exceeded by named bit-field description in
   1338  1.29    rillig 	// line 2
   1339  1.21    rillig 	h_snprintb_m(
   1340  1.21    rillig 	    "\177\020"
   1341  1.21    rillig 	    "f\000\004lo\0"
   1342  1.21    rillig 	    "f\000\004low-bits\0"
   1343  1.21    rillig 		"=\017match\0",
   1344  1.21    rillig 	    0xff,
   1345  1.21    rillig 	    12,
   1346  1.21    rillig 	    "0xff<lo=0xf>\0"
   1347  1.24    rillig 	    "0xff<low-bi#\0");
   1348  1.21    rillig 
   1349  1.21    rillig 	// new style, line_max exceeded by named bit-field '=' in line 2
   1350  1.21    rillig 	h_snprintb_m(
   1351  1.21    rillig 	    "\177\020"
   1352  1.21    rillig 	    "f\000\004lo\0"
   1353  1.21    rillig 	    "f\000\004low-bits\0"
   1354  1.21    rillig 		"=\017match\0",
   1355  1.21    rillig 	    0xff,
   1356  1.21    rillig 	    13,
   1357  1.21    rillig 	    "0xff<lo=0xf>\0"
   1358  1.24    rillig 	    "0xff<low-bit#\0");
   1359  1.21    rillig 
   1360  1.21    rillig 	// new style, line_max exceeded by named bit-field value in line 2
   1361  1.21    rillig 	h_snprintb_m(
   1362  1.21    rillig 	    "\177\020"
   1363  1.21    rillig 	    "f\000\004lo\0"
   1364  1.21    rillig 	    "f\000\004low-bits\0"
   1365  1.21    rillig 		"=\017match\0",
   1366  1.21    rillig 	    0xff,
   1367  1.21    rillig 	    16,
   1368  1.21    rillig 	    "0xff<lo=0xf>\0"
   1369  1.24    rillig 	    "0xff<low-bits=0#\0");
   1370  1.21    rillig 
   1371  1.21    rillig 	// new style, line_max exceeded by named bit-field '=' in line 2
   1372  1.21    rillig 	h_snprintb_m(
   1373  1.21    rillig 	    "\177\020"
   1374  1.21    rillig 	    "f\000\004lo\0"
   1375  1.21    rillig 	    "f\000\004low-bits\0"
   1376  1.21    rillig 		"=\017match\0",
   1377  1.21    rillig 	    0xff,
   1378  1.29    rillig 	    18,
   1379  1.21    rillig 	    "0xff<lo=0xf>\0"
   1380  1.29    rillig 	    "0xff<low-bits=0xf#\0");
   1381  1.21    rillig 
   1382  1.27    rillig 	// new style, line_max exceeded by named bit-field value description
   1383  1.27    rillig 	// in line 2
   1384  1.21    rillig 	h_snprintb_m(
   1385  1.21    rillig 	    "\177\020"
   1386  1.21    rillig 	    "f\000\004lo\0"
   1387  1.21    rillig 	    "f\000\004low-bits\0"
   1388  1.21    rillig 		"=\017match\0",
   1389  1.21    rillig 	    0xff,
   1390  1.21    rillig 	    22,
   1391  1.21    rillig 	    "0xff<lo=0xf>\0"
   1392  1.24    rillig 	    "0xff<low-bits=0xf=mat#\0");
   1393  1.21    rillig 
   1394  1.21    rillig 	// new style, line_max exceeded by named bit-field '>' in line 2
   1395  1.21    rillig 	h_snprintb_m(
   1396  1.21    rillig 	    "\177\020"
   1397  1.21    rillig 	    "f\000\004lo\0"
   1398  1.21    rillig 	    "f\000\004low-bits\0"
   1399  1.21    rillig 		"=\017match\0",
   1400  1.21    rillig 	    0xff,
   1401  1.21    rillig 	    23,
   1402  1.21    rillig 	    "0xff<lo=0xf>\0"
   1403  1.24    rillig 	    "0xff<low-bits=0xf=matc#\0");
   1404  1.21    rillig 
   1405  1.21    rillig 	// new style, named bit-field complete
   1406  1.21    rillig 	h_snprintb_m(
   1407  1.21    rillig 	    "\177\020"
   1408  1.21    rillig 	    "f\000\004lo\0"
   1409  1.21    rillig 	    "f\000\004low-bits\0"
   1410  1.21    rillig 		"=\017match\0",
   1411  1.21    rillig 	    0xff,
   1412  1.21    rillig 	    24,
   1413  1.21    rillig 	    "0xff<lo=0xf>\0"
   1414  1.22    rillig 	    "0xff<low-bits=0xf=match>\0");
   1415  1.21    rillig 
   1416  1.21    rillig 	// new style, line_max exceeded by unnamed bit-field number in line 1
   1417  1.21    rillig 	h_snprintb_m(
   1418  1.21    rillig 	    "\177\020"
   1419  1.21    rillig 	    "F\000\004\0",
   1420  1.21    rillig 	    0xff,
   1421  1.21    rillig 	    3,
   1422  1.24    rillig 	    "0x#\0");
   1423  1.13    rillig 
   1424  1.21    rillig 	// new style, line_max exceeded by unnamed bit-field '<' in line 1
   1425  1.21    rillig 	h_snprintb_m(
   1426  1.15    rillig 	    "\177\020"
   1427  1.21    rillig 	    "F\000\004\0",
   1428  1.16    rillig 	    0xff,
   1429  1.21    rillig 	    4,
   1430  1.24    rillig 	    "0xf#\0");
   1431  1.16    rillig 
   1432  1.27    rillig 	// new style, line_max exceeded by unnamed bit-field value description
   1433  1.27    rillig 	// in line 1
   1434  1.21    rillig 	h_snprintb_m(
   1435  1.21    rillig 	    "\177\020"
   1436  1.21    rillig 	    "F\000\004\0"
   1437  1.21    rillig 		":\017match\0",
   1438  1.21    rillig 	    0xff,
   1439  1.16    rillig 	    9,
   1440  1.24    rillig 	    "0xff<mat#\0");
   1441  1.21    rillig 
   1442  1.21    rillig 	// new style, line_max exceeded by unnamed bit-field '>' in line 1
   1443  1.21    rillig 	h_snprintb_m(
   1444  1.16    rillig 	    "\177\020"
   1445  1.21    rillig 	    "F\000\004\0"
   1446  1.21    rillig 		":\017match\0",
   1447  1.16    rillig 	    0xff,
   1448  1.16    rillig 	    10,
   1449  1.24    rillig 	    "0xff<matc#\0");
   1450  1.16    rillig 
   1451  1.27    rillig 	// new style, line_max exceeded by unnamed bit-field value description
   1452  1.27    rillig 	// in line 2
   1453  1.21    rillig 	h_snprintb_m(
   1454  1.21    rillig 	    "\177\020"
   1455  1.21    rillig 	    "F\000\004\0"
   1456  1.21    rillig 		":\017m1\0"
   1457  1.21    rillig 		":\017match\0",
   1458  1.21    rillig 	    0xff,
   1459  1.16    rillig 	    10,
   1460  1.24    rillig 	    "0xff<m1ma#\0");
   1461  1.21    rillig 
   1462  1.21    rillig 	// new style, line_max exceeded by unnamed bit-field '>' in line 2
   1463  1.21    rillig 	h_snprintb_m(
   1464  1.16    rillig 	    "\177\020"
   1465  1.21    rillig 	    "F\000\004\0"
   1466  1.21    rillig 		":\017m1\0"
   1467  1.21    rillig 		":\017match\0",
   1468  1.16    rillig 	    0xff,
   1469  1.16    rillig 	    10,
   1470  1.24    rillig 	    "0xff<m1ma#\0");
   1471  1.16    rillig 
   1472  1.21    rillig 	// new style unnamed bit-field complete
   1473  1.21    rillig 	h_snprintb_m(
   1474  1.21    rillig 	    "\177\020"
   1475  1.21    rillig 	    "F\000\004\0"
   1476  1.21    rillig 		":\017m1\0"
   1477  1.21    rillig 		":\017match\0",
   1478  1.21    rillig 	    0xff,
   1479  1.27    rillig 	    13,
   1480  1.27    rillig 	    "0xff<m1match>\0");
   1481  1.21    rillig 
   1482  1.21    rillig 	// new style, line_max exceeded by bit-field default
   1483  1.21    rillig 	h_snprintb_m(
   1484  1.16    rillig 	    "\177\020"
   1485  1.21    rillig 	    "f\000\004f\0"
   1486  1.21    rillig 		"*=default\0",
   1487  1.16    rillig 	    0xff,
   1488  1.21    rillig 	    17,
   1489  1.24    rillig 	    "0xff<f=0xf=defau#\0");
   1490  1.16    rillig 
   1491  1.21    rillig 	// new style, line_max exceeded by unmatched field value
   1492  1.21    rillig 	h_snprintb_m(
   1493  1.16    rillig 	    "\177\020"
   1494  1.21    rillig 	    "f\000\004bits\0"
   1495  1.29    rillig 		":\000zero\0",
   1496  1.16    rillig 	    0xff,
   1497  1.16    rillig 	    11,
   1498  1.24    rillig 	    "0xff<bits=#\0");
   1499  1.21    rillig 
   1500  1.29    rillig 	// example from the manual page, new style bits and fields
   1501  1.21    rillig 	h_snprintb_m(
   1502  1.21    rillig 	    "\177\020"
   1503  1.21    rillig 	    "b\0LSB\0"
   1504  1.21    rillig 	    "b\1BITONE\0"
   1505  1.21    rillig 	    "f\4\4NIBBLE2\0"
   1506  1.21    rillig 	    "f\x10\4BURST\0"
   1507  1.21    rillig 		"=\4FOUR\0"
   1508  1.21    rillig 		"=\xf""FIFTEEN\0"
   1509  1.21    rillig 	    "b\x1fMSB\0",
   1510  1.21    rillig 	    0x800f0701,
   1511  1.21    rillig 	    34,
   1512  1.21    rillig 	    "0x800f0701<LSB,NIBBLE2=0>\0"
   1513  1.22    rillig 	    "0x800f0701<BURST=0xf=FIFTEEN,MSB>\0");
   1514  1.16    rillig 
   1515  1.32    rillig 	// new style, missing number base
   1516  1.32    rillig 	h_snprintb_m_len(
   1517  1.32    rillig 	    1024,
   1518  1.32    rillig 	    "\177",
   1519  1.32    rillig 	    0xff,
   1520  1.32    rillig 	    128,
   1521  1.32    rillig 	    -1,
   1522  1.32    rillig 	    "#\0");
   1523  1.32    rillig 
   1524  1.21    rillig 	// new style, buffer too small for complete number in line 2
   1525  1.16    rillig 	h_snprintb_m_len(
   1526  1.16    rillig 	    15,
   1527  1.16    rillig 	    "\177\020"
   1528  1.16    rillig 	    "b\000lsb\0"
   1529  1.16    rillig 	    "b\001two\0",
   1530  1.16    rillig 	    0xff,
   1531  1.16    rillig 	    11,
   1532  1.16    rillig 	    20,
   1533  1.16    rillig 	    "0xff<lsb>\0"
   1534  1.31    rillig 	    "0x#\0");
   1535  1.16    rillig 
   1536  1.16    rillig 	// new-style format, buffer too small for '<' in line 2
   1537  1.16    rillig 	h_snprintb_m_len(
   1538  1.16    rillig 	    16,
   1539  1.16    rillig 	    "\177\020"
   1540  1.16    rillig 	    "b\000lsb\0"
   1541  1.16    rillig 	    "b\001two\0",
   1542  1.16    rillig 	    0xff,
   1543  1.16    rillig 	    11,
   1544  1.16    rillig 	    20,
   1545  1.16    rillig 	    "0xff<lsb>\0"
   1546  1.31    rillig 	    "0xf#\0");
   1547  1.16    rillig 
   1548  1.31    rillig 	// new-style format, buffer too small for textual fallback
   1549  1.31    rillig 	h_snprintb_m_len(
   1550  1.31    rillig 	    24,
   1551  1.16    rillig 	    "\177\020"
   1552  1.16    rillig 	    "f\000\004bits\0"
   1553  1.16    rillig 		"*=fallback\0"
   1554  1.16    rillig 	    "b\0024\0",
   1555  1.16    rillig 	    0xff,
   1556  1.16    rillig 	    64,
   1557  1.31    rillig 	    26,
   1558  1.31    rillig 	    "0xff<bits=0xf=fallbac#\0");
   1559  1.15    rillig 
   1560  1.19    rillig 	// new-style format, buffer too small for numeric fallback
   1561  1.19    rillig 	h_snprintb_m_len(
   1562  1.19    rillig 	    20,
   1563  1.19    rillig 	    "\177\020"
   1564  1.19    rillig 	    "F\000\004\0"
   1565  1.19    rillig 		"*fallback(%040jd)\0",
   1566  1.19    rillig 	    0xff,
   1567  1.19    rillig 	    64,
   1568  1.19    rillig 	    57,
   1569  1.31    rillig 	    "0xff<fallback(000#\0");
   1570  1.19    rillig 
   1571  1.19    rillig 	// new-style format, buffer too small for numeric fallback past buffer
   1572  1.19    rillig 	h_snprintb_m_len(
   1573  1.19    rillig 	    15,
   1574  1.19    rillig 	    "\177\020"
   1575  1.19    rillig 	    "F\000\004\0"
   1576  1.19    rillig 		"*fallback(%010jd)\0"
   1577  1.19    rillig 	    "F\004\004\0"
   1578  1.19    rillig 		"*fallback(%010jd)\0",
   1579  1.19    rillig 	    0xff,
   1580  1.19    rillig 	    64,
   1581  1.19    rillig 	    48,
   1582  1.31    rillig 	    "0xff<fallbac#\0");
   1583  1.19    rillig 
   1584  1.21    rillig 	// new style, bits and fields, line break between fields
   1585   1.9    rillig 	h_snprintb_m(
   1586   1.9    rillig 	    "\177\020"
   1587   1.9    rillig 	    "b\0LSB\0"
   1588   1.9    rillig 	    "b\1_BITONE\0"
   1589   1.9    rillig 	    "f\4\4NIBBLE2\0"
   1590   1.9    rillig 	    "f\x10\4BURST\0"
   1591   1.9    rillig 		"=\04FOUR\0"
   1592   1.9    rillig 		"=\17FIFTEEN\0"
   1593   1.9    rillig 	    "b\x1fMSB\0",
   1594   1.9    rillig 	    0x800f0701,
   1595   1.9    rillig 	    33,
   1596   1.9    rillig 	    "0x800f0701<LSB,NIBBLE2=0>\0"
   1597  1.29    rillig 	    "0x800f0701<BURST=0xf=FIFTEEN,MSB>\0");
   1598   1.9    rillig 
   1599  1.21    rillig 	// new style, bits and fields, line break after field description
   1600   1.9    rillig 	h_snprintb_m(
   1601   1.9    rillig 	    "\177\020"
   1602   1.9    rillig 	    "b\0LSB\0"
   1603   1.9    rillig 	    "b\1_BITONE\0"
   1604   1.9    rillig 	    "f\4\4NIBBLE2\0"
   1605  1.29    rillig 	    "f\020\4BURST\0"
   1606   1.9    rillig 		"=\04FOUR\0"
   1607   1.9    rillig 		"=\17FIFTEEN\0"
   1608  1.29    rillig 	    "b\037MSB\0",
   1609   1.9    rillig 	    0x800f0701,
   1610   1.9    rillig 	    32,
   1611   1.9    rillig 	    "0x800f0701<LSB,NIBBLE2=0>\0"
   1612   1.9    rillig 	    "0x800f0701<BURST=0xf=FIFTEEN>\0"
   1613   1.9    rillig 	    "0x800f0701<MSB>\0");
   1614   1.2  pgoyette }
   1615   1.2  pgoyette 
   1616   1.1      jmmv ATF_TP_ADD_TCS(tp)
   1617   1.1      jmmv {
   1618   1.1      jmmv 
   1619   1.1      jmmv 	ATF_TP_ADD_TC(tp, snprintb);
   1620   1.2  pgoyette 	ATF_TP_ADD_TC(tp, snprintb_m);
   1621   1.1      jmmv 
   1622   1.1      jmmv 	return atf_no_error();
   1623   1.1      jmmv }
   1624