Home | History | Annotate | Line # | Download | only in libutil
t_snprintb.c revision 1.32
      1  1.32    rillig /* $NetBSD: t_snprintb.c,v 1.32 2024/04/01 09:15:51 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.32    rillig __RCSID("$NetBSD: t_snprintb.c,v 1.32 2024/04/01 09:15:51 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.21    rillig 	// new style single bits, empty description
    419  1.10    rillig 	h_snprintb(
    420  1.10    rillig 	    "\177\020"
    421  1.21    rillig 	    "b\000lsb\0"
    422  1.21    rillig 	    "b\001\0"
    423  1.21    rillig 	    "b\002\0"
    424  1.21    rillig 	    "b\007msb\0"
    425  1.21    rillig 	    ,
    426  1.21    rillig 	    0xff,
    427  1.21    rillig 	    "0xff<lsb,,,msb>");
    428  1.10    rillig 
    429  1.26    rillig 	// new style single bits, bit number too large
    430  1.10    rillig 	h_snprintb_error(
    431  1.21    rillig 	    "\177\020"
    432  1.27    rillig 	    "b\100too-high\0",
    433  1.27    rillig 	    "0#");
    434  1.10    rillig 	h_snprintb_error(
    435  1.21    rillig 	    "\177\020"
    436  1.27    rillig 	    "b\377too-high\0",
    437  1.27    rillig 	    "0#");
    438  1.10    rillig 
    439  1.21    rillig 	// new style single bits, non-printable description
    440  1.10    rillig 	//
    441  1.21    rillig 	// Contrary to the old-style format, the new-style format allows
    442  1.21    rillig 	// arbitrary characters in the description, even control characters
    443  1.21    rillig 	// and non-ASCII characters.
    444  1.21    rillig 	h_snprintb(
    445  1.21    rillig 	    "\177\020"
    446  1.21    rillig 	    "b\000space \t \xC3\xA4\0",
    447  1.21    rillig 	    0x1,
    448  1.21    rillig 	    "0x1<space \t \xC3\xA4>");
    449  1.10    rillig 
    450  1.21    rillig 	// new style named bit-field, octal
    451  1.21    rillig 	//
    452  1.21    rillig 	// The bit-field value gets a leading '0' iff it is nonzero.
    453  1.10    rillig 	h_snprintb(
    454  1.10    rillig 	    "\177\010"
    455  1.21    rillig 	    "f\000\010byte0\0"
    456  1.21    rillig 	    "f\010\010byte1\0",
    457  1.21    rillig 	    0x0100,
    458  1.21    rillig 	    "0400<byte0=0,byte1=01>");
    459  1.10    rillig 
    460  1.21    rillig 	// new style named bit-field, decimal
    461  1.10    rillig 	h_snprintb(
    462  1.10    rillig 	    "\177\012"
    463  1.21    rillig 	    "f\000\010byte0\0"
    464  1.21    rillig 	    "f\010\010byte1\0",
    465  1.21    rillig 	    0x0100,
    466  1.21    rillig 	    "256<byte0=0,byte1=1>");
    467  1.21    rillig 
    468  1.21    rillig 	// new style named bit-field, hexadecimal
    469  1.29    rillig 	//
    470  1.29    rillig 	// The bit-field value gets a leading '0x' iff it is nonzero.
    471  1.21    rillig 	h_snprintb(
    472  1.21    rillig 	    "\177\020"
    473  1.21    rillig 	    "f\000\010byte0\0"
    474  1.21    rillig 	    "f\010\010byte1\0",
    475  1.21    rillig 	    0x0100,
    476  1.21    rillig 	    "0x100<byte0=0,byte1=0x1>");
    477  1.21    rillig 
    478  1.21    rillig 	// new style bit-field, from 0 width 0
    479  1.21    rillig 	h_snprintb(
    480  1.21    rillig 	    "\177\020"
    481  1.21    rillig 	    "f\000\000zero-width\0"
    482  1.21    rillig 		"=\000zero\0",
    483  1.21    rillig 	    0xffff,
    484  1.21    rillig 	    "0xffff<zero-width=0=zero>");
    485  1.21    rillig 
    486  1.21    rillig 	// new style bit-field, from 0 width 1
    487  1.21    rillig 	h_snprintb(
    488  1.21    rillig 	    "\177\020"
    489  1.21    rillig 	    "f\000\001lsb\0"
    490  1.21    rillig 		"=\000zero\0"
    491  1.21    rillig 		"=\001one\0",
    492  1.21    rillig 	    0x0,
    493  1.21    rillig 	    "0<lsb=0=zero>");
    494  1.21    rillig 	h_snprintb(
    495  1.21    rillig 	    "\177\020"
    496  1.21    rillig 	    "f\000\001lsb\0"
    497  1.21    rillig 		"=\000zero\0"
    498  1.21    rillig 		"=\001one\0",
    499  1.21    rillig 	    0x1,
    500  1.21    rillig 	    "0x1<lsb=0x1=one>");
    501  1.21    rillig 
    502  1.21    rillig 	// new style bit-field, from 0 width 63
    503  1.21    rillig 	h_snprintb(
    504  1.21    rillig 	    "\177\020"
    505  1.21    rillig 	    "f\000\077uint63\0"
    506  1.21    rillig 		"=\125match\0",
    507  1.21    rillig 	    0xaaaa5555aaaa5555,
    508  1.21    rillig 	    "0xaaaa5555aaaa5555<uint63=0x2aaa5555aaaa5555>");
    509  1.21    rillig 
    510  1.21    rillig 	// new style bit-field, from 0 width 64
    511  1.21    rillig 	h_snprintb(
    512  1.21    rillig 	    "\177\020"
    513  1.21    rillig 	    "f\000\100uint64\0"
    514  1.21    rillig 		"=\125match\0",
    515  1.21    rillig 	    0xaaaa5555aaaa5555,
    516  1.21    rillig 	    "0xaaaa5555aaaa5555<uint64=0xaaaa5555aaaa5555>");
    517  1.21    rillig 
    518  1.21    rillig 	// new style bit-field, from 0 width 65
    519  1.21    rillig 	h_snprintb_error(
    520  1.21    rillig 	    "\177\020"
    521  1.27    rillig 	    "f\000\101uint65\0",
    522  1.27    rillig 	    "0#");
    523  1.10    rillig 
    524  1.21    rillig 	// new style bit-field, from 1 width 8
    525  1.10    rillig 	h_snprintb(
    526  1.10    rillig 	    "\177\020"
    527  1.21    rillig 	    "f\001\010uint8\0"
    528  1.21    rillig 		"=\203match\0",
    529  1.21    rillig 	    0x0106,
    530  1.21    rillig 	    "0x106<uint8=0x83=match>");
    531  1.10    rillig 
    532  1.21    rillig 	// new style bit-field, from 1 width 9
    533  1.21    rillig 	//
    534  1.29    rillig 	// The '=' and ':' directives can match a bit-field value between
    535  1.21    rillig 	// 0 and 255, independent of the bit-field's width.
    536  1.10    rillig 	h_snprintb(
    537  1.21    rillig 	    "\177\020"
    538  1.21    rillig 	    "f\001\011uint9\0"
    539  1.21    rillig 		"=\203match\0"
    540  1.29    rillig 		"*=default-f\0"
    541  1.21    rillig 	    "F\001\011\0"
    542  1.21    rillig 		":\203match\0"
    543  1.29    rillig 		"*default-F\0",
    544  1.21    rillig 	    0x0306,
    545  1.29    rillig 	    "0x306<uint9=0x183=default-f,default-F>");
    546  1.10    rillig 
    547  1.29    rillig 	// new style bit-field, from 24 width 32
    548  1.10    rillig 	h_snprintb(
    549  1.21    rillig 	    "\177\020"
    550  1.29    rillig 	    "f\030\040uint32\0",
    551  1.21    rillig 	    0xaaaa555500000000,
    552  1.29    rillig 	    "0xaaaa555500000000<uint32=0xaa555500>");
    553   1.9    rillig 
    554  1.21    rillig 	// new style bit-field, from 60 width 4
    555   1.9    rillig 	h_snprintb(
    556  1.10    rillig 	    "\177\020"
    557  1.21    rillig 	    "f\074\004uint4\0",
    558  1.21    rillig 	    0xf555555555555555,
    559  1.21    rillig 	    "0xf555555555555555<uint4=0xf>");
    560  1.10    rillig 
    561  1.21    rillig 	// new style bit-field, from 60 width 5
    562  1.10    rillig 	//
    563  1.21    rillig 	// The end of the bit-field is out of bounds.
    564  1.10    rillig 	h_snprintb(
    565  1.21    rillig 	    "\177\020"
    566  1.21    rillig 	    "f\074\005uint5\0",
    567  1.21    rillig 	    0xf555555555555555,
    568  1.21    rillig 	    "0xf555555555555555<uint5=0xf>");
    569  1.21    rillig 
    570  1.21    rillig 	// new style bit-field, from 64 width 0
    571  1.21    rillig 	//
    572  1.21    rillig 	// The beginning of the bit-field is out of bounds, the end is fine.
    573  1.21    rillig 	h_snprintb_error(
    574  1.21    rillig 	    "\177\020"
    575  1.27    rillig 	    "f\100\000uint0\0",
    576  1.27    rillig 	    "0#");
    577  1.21    rillig 
    578  1.21    rillig 	// new style bit-field, from 65 width 0
    579  1.21    rillig 	//
    580  1.21    rillig 	// The beginning and end of the bit-field are out of bounds.
    581  1.21    rillig 	h_snprintb_error(
    582  1.21    rillig 	    "\177\020"
    583  1.27    rillig 	    "f\101\000uint0\0",
    584  1.27    rillig 	    "0#");
    585  1.10    rillig 
    586  1.21    rillig 	// new style bit-field, empty field description
    587  1.10    rillig 	//
    588  1.29    rillig 	// An empty field description results in an isolated '=', which is a
    589  1.29    rillig 	// mistake.
    590  1.10    rillig 	h_snprintb(
    591  1.21    rillig 	    "\177\020"
    592  1.21    rillig 	    "f\000\004\0"
    593  1.21    rillig 		"=\001one\0",
    594  1.21    rillig 	    0x1,
    595  1.21    rillig 	    "0x1<=0x1=one>");
    596  1.10    rillig 
    597  1.21    rillig 	// new style bit-field, non-printable description
    598  1.10    rillig 	//
    599  1.21    rillig 	// Contrary to the old-style format, the new-style format allows
    600  1.21    rillig 	// arbitrary characters in the description, even control characters
    601  1.21    rillig 	// and non-ASCII characters.
    602   1.9    rillig 	h_snprintb(
    603  1.10    rillig 	    "\177\020"
    604  1.21    rillig 	    "f\000\010\t \xC3\xA4\0"
    605  1.21    rillig 		"=\001\t \xC3\xA4\0"
    606  1.21    rillig 	    "F\000\010\0"
    607  1.21    rillig 		":\001\t \xC3\xA4\0"
    608  1.21    rillig 	    "F\000\010\0"
    609  1.21    rillig 		"*\t \xC3\xA4\0",
    610  1.21    rillig 	    0x1,
    611  1.21    rillig 	    "0x1<\t \xC3\xA4=0x1=\t \xC3\xA4,\t \xC3\xA4,\t \xC3\xA4>");
    612   1.5       ryo 
    613  1.21    rillig 	// new style bit-field, '=' with empty description
    614  1.21    rillig 	//
    615  1.29    rillig 	// The description of a '=' directive should not be empty, as the
    616  1.29    rillig 	// outputs contains several '=' in a row.
    617   1.9    rillig 	h_snprintb(
    618  1.10    rillig 	    "\177\020"
    619  1.21    rillig 	    "f\000\004f\0"
    620  1.21    rillig 		"=\001one\0"
    621  1.21    rillig 		"=\001\0"
    622  1.21    rillig 		"=\001\0",
    623  1.21    rillig 	    0x1,
    624  1.21    rillig 	    "0x1<f=0x1=one==>");
    625  1.10    rillig 
    626  1.21    rillig 	// new style bit-field, 'F' followed by ':' with empty description
    627  1.10    rillig 	//
    628  1.29    rillig 	// An empty description of a ':' directive that doesn't match results
    629  1.29    rillig 	// in empty angle brackets, which is a mistake.
    630   1.9    rillig 	h_snprintb(
    631   1.9    rillig 	    "\177\020"
    632  1.21    rillig 	    "F\000\004\0"
    633  1.21    rillig 		":\001\0"
    634  1.21    rillig 		"*default\0",
    635  1.21    rillig 	    0x1,
    636  1.21    rillig 	    "0x1<>");
    637   1.6       kre 
    638  1.21    rillig 	// new style bit-field, 'F', ':' with empty description, '*'
    639  1.21    rillig 	//
    640  1.29    rillig 	// An empty description of a ':' directive that matches results in
    641  1.29    rillig 	// normal-looking output, but if it didn't match, the output would
    642  1.29    rillig 	// contain empty angle brackets, which is a mistake.
    643  1.17    rillig 	h_snprintb(
    644  1.17    rillig 	    "\177\020"
    645  1.21    rillig 	    "F\000\004\0"
    646  1.21    rillig 		":\001\0"
    647  1.21    rillig 		"*default\0",
    648  1.21    rillig 	    0x2,
    649  1.21    rillig 	    "0x2<default>");
    650  1.17    rillig 
    651  1.21    rillig 	// new style bit-field, 'f' with non-exhaustive '='
    652   1.9    rillig 	h_snprintb(
    653  1.10    rillig 	    "\177\020"
    654  1.21    rillig 	    "f\000\004Field\0"
    655  1.10    rillig 		"=\1one\0"
    656  1.10    rillig 		"=\2two\0",
    657  1.21    rillig 	    0x3,
    658  1.21    rillig 	    "0x3<Field=0x3>");
    659  1.21    rillig 
    660  1.21    rillig 	// new style bit-field, 'F' with non-exhaustive ':'
    661  1.21    rillig 	//
    662  1.29    rillig 	// An unnamed bit-field that does not match any values generates empty
    663  1.29    rillig 	// angle brackets, which looks confusing. The ':' directives should
    664  1.29    rillig 	// either be exhaustive, or there should be a '*' catch-all directive.
    665   1.9    rillig 	h_snprintb(
    666  1.10    rillig 	    "\177\020"
    667  1.21    rillig 	    "F\000\004\0"
    668  1.10    rillig 		":\1one\0"
    669  1.10    rillig 		":\2two\0",
    670  1.21    rillig 	    0x3,
    671  1.21    rillig 	    "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 	// A bit-field that does not match any values generates multiple commas
    676  1.29    rillig 	// in a row, which looks confusing. The ':' directives should either be
    677  1.29    rillig 	// exhaustive, or there should be a '*' catch-all directive.
    678  1.21    rillig 	h_snprintb(
    679  1.21    rillig 	    "\177\020"
    680  1.21    rillig 	    "b\000bit0\0"
    681  1.21    rillig 	    "F\000\004\0"
    682  1.21    rillig 		":\1one\0"
    683  1.21    rillig 		":\2two\0"
    684  1.21    rillig 	    "b\001bit1\0",
    685  1.21    rillig 	    0x3,
    686  1.21    rillig 	    "0x3<bit0,,bit1>");
    687  1.21    rillig 
    688  1.25    rillig 	// new style bit-field, '=', can never match
    689  1.29    rillig 	//
    690  1.29    rillig 	// The extracted value from the bit-field has 7 bits and is thus less
    691  1.29    rillig 	// than 128, therefore it can neither match 128 nor 255.
    692  1.25    rillig 	h_snprintb(
    693  1.25    rillig 	    "\177\020"
    694  1.25    rillig 	    "f\000\007f\0"
    695  1.25    rillig 		"=\200never\0"
    696  1.25    rillig 		"=\377never\0",
    697  1.25    rillig 	    0xff,
    698  1.25    rillig 	    "0xff<f=0x7f>");
    699  1.25    rillig 
    700  1.21    rillig 	// new style, two separate bit-fields
    701   1.9    rillig 	h_snprintb(
    702   1.9    rillig 	    "\177\020"
    703  1.21    rillig 	    "f\000\004f1\0"
    704  1.21    rillig 		"=\001one\0"
    705  1.21    rillig 		"=\002two\0"
    706  1.21    rillig 	    "f\004\004f2\0"
    707  1.21    rillig 		"=\001one\0"
    708  1.21    rillig 		"=\002two\0",
    709  1.21    rillig 	    0x12,
    710  1.21    rillig 	    "0x12<f1=0x2=two,f2=0x1=one>");
    711  1.21    rillig 
    712  1.21    rillig 	// new style, mixed named and unnamed bit-fields
    713  1.21    rillig 	h_snprintb(
    714  1.21    rillig 	    "\177\020"
    715  1.21    rillig 	    "f\000\004f1\0"
    716  1.21    rillig 		"=\001one\0"
    717  1.21    rillig 		"=\002two\0"
    718  1.10    rillig 	    "F\010\004\0"
    719  1.21    rillig 		":\015thirteen\0"
    720  1.21    rillig 	    "f\004\004f2\0"
    721  1.21    rillig 		"=\001one\0"
    722  1.21    rillig 		"=\002two\0",
    723  1.21    rillig 	    0x0d12,
    724  1.21    rillig 	    "0xd12<f1=0x2=two,thirteen,f2=0x1=one>");
    725  1.21    rillig 
    726  1.21    rillig 	// new style bit-field, overlapping
    727  1.21    rillig 	h_snprintb(
    728  1.21    rillig 	    "\177\020"
    729  1.21    rillig 	    "f\000\004lo\0"
    730  1.21    rillig 	    "f\002\004mid\0"
    731  1.21    rillig 	    "f\004\004hi\0"
    732  1.21    rillig 	    "f\000\010all\0",
    733  1.21    rillig 	    0x18,
    734  1.21    rillig 	    "0x18<lo=0x8,mid=0x6,hi=0x1,all=0x18>");
    735  1.21    rillig 
    736  1.21    rillig 	// new style bit-field, difference between '=' and ':'
    737  1.21    rillig 	//
    738  1.21    rillig 	// The ':' directive can almost emulate the '=' directive, without the
    739  1.21    rillig 	// numeric output and with a different separator. It's best to use
    740  1.29    rillig 	// either 'f' with '=', or 'F' with ':', but not mix them.
    741  1.21    rillig 	h_snprintb(
    742  1.21    rillig 	    "\177\020"
    743  1.21    rillig 	    "f\000\004field\0"
    744  1.29    rillig 		"=\010f-value\0"
    745  1.29    rillig 	    "F\000\000\0"		// Use an empty bit-field
    746  1.29    rillig 		":\000separator\0"	// to generate a separator.
    747  1.21    rillig 	    "F\000\004\0"
    748  1.29    rillig 		":\010F-value\0",
    749  1.21    rillig 	    0x18,
    750  1.29    rillig 	    "0x18<field=0x8=f-value,separator,F-value>");
    751  1.21    rillig 
    752  1.21    rillig 	// new style bit-field default, fixed string
    753  1.21    rillig 	//
    754  1.21    rillig 	// The 'f' directive pairs up with the '=' directive,
    755  1.21    rillig 	// the 'F' directive pairs up with the ':' directive,
    756  1.21    rillig 	// but there's only one 'default' directive for both variants,
    757  1.21    rillig 	// so its description should include the '=' when used with 'f' but
    758  1.21    rillig 	// not with 'F'.
    759  1.21    rillig 	h_snprintb(
    760  1.21    rillig 	    "\177\020"
    761  1.21    rillig 	    "f\030\010f1\0"
    762  1.21    rillig 		"*default\0"
    763  1.21    rillig 	    "f\020\010f2\0"
    764  1.21    rillig 		"*=default\0"
    765  1.21    rillig 	    "F\010\010\0"
    766  1.21    rillig 		"*default\0"
    767  1.21    rillig 	    "F\010\010\0"
    768  1.21    rillig 		"*=default\0",
    769  1.21    rillig 	    0x11223344,
    770  1.21    rillig 	    "0x11223344<f1=0x11default,f2=0x22=default,default,=default>");
    771  1.21    rillig 
    772  1.21    rillig 	// new style bit-field default, numeric conversion specifier
    773  1.21    rillig 	h_snprintb(
    774  1.21    rillig 	    "\177\020"
    775  1.21    rillig 	    "f\010\010f\0"
    776  1.21    rillig 		"*=f(%ju)\0"
    777  1.21    rillig 	    "F\000\010F\0"
    778  1.21    rillig 		"*F(%ju)\0",
    779  1.21    rillig 	    0x1122,
    780  1.21    rillig 	    "0x1122<f=0x11=f(17),F(34)>");
    781  1.21    rillig 
    782  1.25    rillig 	// new style bit-field default, can never match
    783  1.29    rillig 	//
    784  1.29    rillig 	// The '=' directive are exhaustive, making the '*' redundant.
    785  1.25    rillig 	h_snprintb(
    786  1.25    rillig 	    "\177\020"
    787  1.25    rillig 	    "f\010\002f\0"
    788  1.25    rillig 		"=\000zero\0"
    789  1.25    rillig 		"=\001one\0"
    790  1.25    rillig 		"=\002two\0"
    791  1.25    rillig 		"=\003three\0"
    792  1.29    rillig 		"*default\0",
    793  1.25    rillig 	    0xff00,
    794  1.25    rillig 	    "0xff00<f=0x3=three>");
    795  1.25    rillig 
    796  1.21    rillig 	// new style bit-field default, invalid conversion specifier
    797  1.21    rillig 	//
    798  1.21    rillig 	// There is no reliable way to make snprintf return an error, as such
    799  1.21    rillig 	// errors are defined as undefined behavior in the C standard.
    800  1.21    rillig 	// Instead, here's a conversion specifier that produces a literal '%'.
    801  1.21    rillig 	h_snprintb(
    802  1.21    rillig 	    "\177\020"
    803  1.21    rillig 	    "f\000\010f\0"
    804  1.21    rillig 		"*=%030ju%%\0",
    805  1.21    rillig 	    0xff,
    806  1.21    rillig 	    "0xff<f=0xff=000000000000000000000000000255%>");
    807  1.21    rillig 
    808  1.30    rillig 	// new style unknown directive, at the beginning
    809  1.30    rillig 	h_snprintb_len(
    810  1.30    rillig 	    128,
    811  1.30    rillig 	    "\177\020"
    812  1.30    rillig 	    "unknown\0",
    813  1.30    rillig 	    0xff,
    814  1.30    rillig 	    -1,
    815  1.30    rillig 	    "0xff#");
    816  1.30    rillig 
    817  1.30    rillig 	// new style unknown directive, after a known directive
    818  1.30    rillig 	h_snprintb_len(
    819  1.30    rillig 	    128,
    820  1.21    rillig 	    "\177\020"
    821  1.30    rillig 	    "b\007msb\0"
    822  1.30    rillig 	    "unknown\0",
    823  1.21    rillig 	    0xff,
    824  1.30    rillig 	    -1,
    825  1.30    rillig 	    "0xff<msb#");
    826  1.21    rillig 
    827  1.21    rillig 	// new style combinations, 'b' '='
    828  1.21    rillig 	//
    829  1.29    rillig 	// A '=' directive without a preceding 'f' or 'F' directive generates
    830  1.29    rillig 	// misleading output outside the angle brackets, which is a mistake.
    831  1.21    rillig 	h_snprintb(
    832  1.21    rillig 	    "\177\020"
    833  1.21    rillig 	    "b\004bit4\0"
    834  1.21    rillig 		"=\000clear\0"
    835  1.21    rillig 		"=\001set\0"
    836  1.21    rillig 		"=\245complete\0"
    837  1.21    rillig 	    "b\000bit0\0"
    838  1.21    rillig 		"=\000clear\0"
    839  1.21    rillig 		"=\001set\0"
    840  1.21    rillig 		"=\245complete\0",
    841  1.21    rillig 	    0xa5,
    842  1.21    rillig 	    "0xa5=complete<bit0=complete>");
    843  1.21    rillig 
    844  1.21    rillig 	// new style combinations, 'b' ':'
    845  1.21    rillig 	//
    846  1.29    rillig 	// A ':' directive without a preceding 'f' or 'F' directive generates
    847  1.29    rillig 	// misleading output outside or inside the angle brackets, which is a
    848  1.29    rillig 	// mistake.
    849  1.21    rillig 	h_snprintb(
    850  1.21    rillig 	    "\177\020"
    851  1.21    rillig 	    "b\004bit4\0"
    852  1.21    rillig 		":\000clear\0"
    853  1.21    rillig 		":\001set\0"
    854  1.21    rillig 		":\245complete\0"
    855  1.21    rillig 	    "b\000bit0\0"
    856  1.21    rillig 		":\000clear\0"
    857  1.21    rillig 		":\001set\0"
    858  1.21    rillig 		":\245complete\0",
    859  1.21    rillig 	    0xa5,
    860  1.21    rillig 	    "0xa5complete<bit0complete>");
    861  1.21    rillig 
    862  1.21    rillig 	// new style combinations, 'b' '*'
    863  1.21    rillig 	//
    864  1.21    rillig 	// A '*' directive without a preceding 'f' or 'F' directive is ignored.
    865  1.21    rillig 	h_snprintb(
    866  1.21    rillig 	    "\177\020"
    867  1.21    rillig 	    "b\004bit4\0"
    868  1.21    rillig 		"*default(%ju)\0"
    869  1.21    rillig 	    "b\000bit0\0"
    870  1.21    rillig 		"*default(%ju)\0",
    871  1.21    rillig 	    0xa5,
    872  1.21    rillig 	    "0xa5<bit0>");
    873  1.21    rillig 
    874  1.21    rillig 	// new style combinations, 'f' 'b' '='
    875  1.21    rillig 	//
    876  1.29    rillig 	// A 'b' directive that occurs between an 'f' and an '=' directive
    877  1.29    rillig 	// generates misleading output, which is a mistake.
    878  1.21    rillig 	h_snprintb(
    879  1.21    rillig 	    "\177\020"
    880  1.21    rillig 	    "f\000\010f\0"
    881  1.21    rillig 	    "b\005bit5\0"
    882  1.29    rillig 		"=\245match\0",
    883  1.21    rillig 	    0xa5,
    884  1.21    rillig 	    "0xa5<f=0xa5,bit5=match>");
    885  1.21    rillig 
    886  1.21    rillig 	// new style combinations, 'f' 'b' ':'
    887  1.21    rillig 	//
    888  1.29    rillig 	// A 'b' directive that occurs between an 'f' and a ':' directive
    889  1.29    rillig 	// generates misleading output, which is a mistake.
    890  1.21    rillig 	h_snprintb(
    891  1.21    rillig 	    "\177\020"
    892  1.21    rillig 	    "f\000\010f\0"
    893  1.21    rillig 	    "b\005bit5\0"
    894  1.29    rillig 		":\245match\0",
    895  1.21    rillig 	    0xa5,
    896  1.21    rillig 	    "0xa5<f=0xa5,bit5match>");
    897  1.21    rillig 
    898  1.21    rillig 	// new style combinations, 'f' ':'
    899  1.29    rillig 	//
    900  1.29    rillig 	// Combining the 'f' directive with the ':' directive produces the
    901  1.29    rillig 	// misleading output '0x1one', which is a mistake.
    902  1.21    rillig 	h_snprintb(
    903  1.21    rillig 	    "\177\20"
    904  1.21    rillig 	    "f\000\004nibble\0"
    905  1.21    rillig 		":\001one\0",
    906  1.21    rillig 	    0x01,
    907  1.21    rillig 	    "0x1<nibble=0x1one>");
    908   1.6       kre 
    909  1.21    rillig 	// new style combinations, 'F' '='
    910  1.21    rillig 	//
    911  1.21    rillig 	// Combining the 'F' and '=' directives outputs an isolated '=', which
    912  1.29    rillig 	// is a mistake.
    913   1.9    rillig 	h_snprintb(
    914   1.9    rillig 	    "\177\20"
    915  1.21    rillig 	    "F\000\004\0"
    916  1.21    rillig 		"=\001one\0",
    917  1.21    rillig 	    0x01,
    918  1.21    rillig 	    "0x1<=one>");
    919  1.21    rillig 
    920  1.21    rillig 	// new style combinations, '='
    921  1.21    rillig 	//
    922  1.29    rillig 	// A '=' directive without a preceding 'f' or 'F' directive generates
    923  1.29    rillig 	// output that doesn't match the standard '0xaa<description>' form,
    924  1.29    rillig 	// which is a mistake.
    925  1.21    rillig 	h_snprintb(
    926  1.21    rillig 	    "\177\020"
    927  1.29    rillig 		"=\245match\0",
    928  1.21    rillig 	    0xa5,
    929  1.21    rillig 	    "0xa5=match");
    930  1.21    rillig 
    931  1.21    rillig 	// new style combinations, ':'
    932  1.21    rillig 	//
    933  1.29    rillig 	// A ':' directive without a preceding 'f' or 'F' directive generates
    934  1.29    rillig 	// misleading output, which is a mistake.
    935  1.21    rillig 	h_snprintb(
    936  1.21    rillig 	    "\177\020"
    937  1.29    rillig 		":\245match\0",
    938  1.21    rillig 	    0xa5,
    939  1.21    rillig 	    "0xa5match");
    940  1.21    rillig 
    941  1.21    rillig 	// new style combinations, '*'
    942  1.21    rillig 	//
    943  1.29    rillig 	// A '*' directive without a preceding 'f' or 'F' is useless, which is
    944  1.29    rillig 	// a mistake.
    945  1.21    rillig 	h_snprintb(
    946  1.21    rillig 	    "\177\020"
    947  1.21    rillig 		"*match\0",
    948  1.21    rillig 	    0xa5,
    949  1.21    rillig 	    "0xa5");
    950  1.21    rillig 
    951  1.21    rillig 	// new style combinations, 'f' '*' '='
    952  1.21    rillig 	//
    953  1.29    rillig 	// After a catch-all '*' directive, any following '=' directive
    954  1.29    rillig 	// generates misleading output, which is a mistake.
    955  1.21    rillig 	h_snprintb(
    956  1.21    rillig 	    "\177\020"
    957  1.21    rillig 	    "f\000\010f\0"
    958  1.21    rillig 		"*=default\0"
    959  1.29    rillig 		"=\245match\0",
    960  1.21    rillig 	    0xa5,
    961  1.21    rillig 	    "0xa5<f=0xa5=default=match>");
    962  1.21    rillig 
    963  1.21    rillig 	// new style combinations, 'F' '*' ':'
    964  1.21    rillig 	//
    965  1.29    rillig 	// After a catch-all '*' directive, any following ':' directive
    966  1.29    rillig 	// generates misleading output, which is a mistake.
    967  1.21    rillig 	h_snprintb(
    968  1.21    rillig 	    "\177\020"
    969  1.21    rillig 	    "F\000\010F\0"
    970  1.21    rillig 		"*default\0"
    971  1.29    rillig 		":\245-match\0",
    972  1.21    rillig 	    0xa5,
    973  1.21    rillig 	    "0xa5<default-match>");
    974  1.21    rillig 
    975  1.21    rillig 	// new style combinations, '*' '*'
    976  1.21    rillig 	//
    977  1.29    rillig 	// After a catch-all '*' directive, any further '*' directive is
    978  1.29    rillig 	// ignored and thus redundant, which is a mistake.
    979  1.21    rillig 	h_snprintb(
    980  1.21    rillig 	    "\177\020"
    981  1.21    rillig 	    "f\000\010f\0"
    982  1.21    rillig 		"*=default-f\0"
    983  1.21    rillig 		"*ignored\0"
    984  1.21    rillig 	    "F\000\010\0"
    985  1.21    rillig 		"*default-F\0"
    986  1.21    rillig 		"*ignored\0",
    987  1.21    rillig 	    0xa5,
    988  1.21    rillig 	    "0xa5<f=0xa5=default-f,default-F>");
    989  1.21    rillig 
    990  1.29    rillig 	// example from the manual page, old style octal
    991  1.21    rillig 	h_snprintb(
    992  1.21    rillig 	    "\10\2BITTWO\1BITONE",
    993  1.29    rillig 	    0x03,
    994  1.21    rillig 	    "03<BITTWO,BITONE>");
    995  1.21    rillig 
    996  1.29    rillig 	// example from the manual page, old style hexadecimal
    997  1.29    rillig 	//
    998  1.29    rillig 	// When using a hexadecimal escape sequence to encode a bit number,
    999  1.29    rillig 	// the description must not start with a hexadecimal digit, or that
   1000  1.29    rillig 	// digit is interpreted as part of the bit number. To prevent this,
   1001  1.29    rillig 	// the bit number and the description need to be written as separate
   1002  1.29    rillig 	// string literals.
   1003  1.21    rillig 	h_snprintb(
   1004  1.21    rillig 	    "\20"
   1005  1.21    rillig 	    "\x10NOTBOOT" "\x0f""FPP" "\x0eSDVMA"
   1006  1.21    rillig 	    "\x0cVIDEO" "\x0bLORES" "\x0a""FPA" "\x09""DIAG"
   1007  1.21    rillig 	    "\x07""CACHE" "\x06IOCACHE" "\x05LOOPBACK"
   1008  1.21    rillig 	    "\x04""DBGCACHE",
   1009  1.21    rillig 	    0xe860,
   1010  1.21    rillig 	    "0xe860<NOTBOOT,FPP,SDVMA,VIDEO,CACHE,IOCACHE>");
   1011  1.21    rillig 
   1012  1.29    rillig 	// example from the manual page, new style bits and fields
   1013  1.21    rillig 	h_snprintb(
   1014  1.21    rillig 	    "\177\020"
   1015  1.21    rillig 	    "b\0LSB\0" "b\1BITONE\0"
   1016  1.21    rillig 	    "f\4\4NIBBLE2\0"
   1017  1.21    rillig 	    "f\x10\4BURST\0" "=\4FOUR\0" "=\xf""FIFTEEN\0"
   1018  1.21    rillig 	    "b\x1fMSB\0",
   1019  1.21    rillig 	    0x800f0701,
   1020  1.21    rillig 	    "0x800f0701<LSB,NIBBLE2=0,BURST=0xf=FIFTEEN,MSB>");
   1021   1.6       kre 
   1022  1.29    rillig 	// example from the manual page, new style mmap
   1023  1.21    rillig #define	MAP_FMT				\
   1024  1.21    rillig 	"\177\020"			\
   1025  1.21    rillig 	"b\0"  "SHARED\0"		\
   1026  1.21    rillig 	"b\1"  "PRIVATE\0"		\
   1027  1.21    rillig 	"b\2"  "COPY\0"			\
   1028  1.21    rillig 	"b\4"  "FIXED\0"		\
   1029  1.21    rillig 	"b\5"  "RENAME\0"		\
   1030  1.21    rillig 	"b\6"  "NORESERVE\0"		\
   1031  1.21    rillig 	"b\7"  "INHERIT\0"		\
   1032  1.21    rillig 	"b\11" "HASSEMAPHORE\0"		\
   1033  1.21    rillig 	"b\12" "TRYFIXED\0"		\
   1034  1.21    rillig 	"b\13" "WIRED\0"		\
   1035  1.21    rillig 	"F\14\1\0"			\
   1036  1.21    rillig 		":\0" "FILE\0"		\
   1037  1.21    rillig 		":\1" "ANONYMOUS\0"	\
   1038  1.21    rillig 	"b\15" "STACK\0"		\
   1039  1.21    rillig 	"F\30\010\0"			\
   1040  1.21    rillig 		":\000" "ALIGN=NONE\0"	\
   1041  1.21    rillig 		":\015" "ALIGN=8KB\0"	\
   1042  1.21    rillig 		"*"     "ALIGN=2^%ju\0"
   1043  1.21    rillig 	h_snprintb(
   1044  1.21    rillig 	    MAP_FMT,
   1045  1.21    rillig 	    0x0d001234,
   1046  1.21    rillig 	    "0xd001234<COPY,FIXED,RENAME,HASSEMAPHORE,ANONYMOUS,ALIGN=8KB>");
   1047  1.21    rillig 	h_snprintb(
   1048  1.21    rillig 	    MAP_FMT,
   1049  1.21    rillig 	    0x2e000000,
   1050  1.21    rillig 	    "0x2e000000<FILE,ALIGN=2^46>");
   1051  1.10    rillig 
   1052   1.9    rillig 	// It is possible but cumbersome to implement a reduced variant of
   1053   1.9    rillig 	// rot13 using snprintb, shown here for lowercase letters only.
   1054   1.9    rillig 	for (char ch = 'A'; ch <= '~'; ch++) {
   1055   1.9    rillig 		char rot13 = ch >= 'a' && ch <= 'm' ? ch + 13
   1056   1.9    rillig 		    : ch >= 'n' && ch <= 'z' ? ch - 13
   1057   1.9    rillig 		    : '?';
   1058   1.9    rillig 		char expected[8];
   1059   1.9    rillig 		ATF_REQUIRE_EQ(7,
   1060   1.9    rillig 		    snprintf(expected, sizeof(expected), "%#x<%c>", ch, rot13));
   1061   1.9    rillig 		h_snprintb(
   1062   1.9    rillig 		    "\177\020"
   1063   1.9    rillig 		    "F\000\010\0"
   1064   1.9    rillig 		    ":an\0:bo\0:cp\0:dq\0:er\0:fs\0:gt\0:hu\0"
   1065   1.9    rillig 		    ":iv\0:jw\0:kx\0:ly\0:mz\0"
   1066   1.9    rillig 		    ":na\0:ob\0:pc\0:qd\0:re\0:sf\0:tg\0:uh\0"
   1067   1.9    rillig 		    ":vi\0:wj\0:xk\0:yl\0:zm\0"
   1068   1.9    rillig 		    // If snprintf accepted "%jc", it would be possible to
   1069   1.9    rillig 		    // echo the non-alphabetic characters instead of a
   1070   1.9    rillig 		    // catchall question mark.
   1071   1.9    rillig 		    "*?\0",
   1072   1.9    rillig 		    ch,
   1073   1.9    rillig 		    expected);
   1074   1.9    rillig 	}
   1075  1.15    rillig 
   1076  1.21    rillig 	// new style, small buffers
   1077  1.15    rillig 	h_snprintb_len(
   1078  1.29    rillig 	    0, "\177\020", 0x00,
   1079  1.16    rillig 	    1, "");
   1080  1.15    rillig 	h_snprintb_len(
   1081  1.29    rillig 	    1, "\177\020", 0x00,
   1082  1.16    rillig 	    1, "");
   1083  1.15    rillig 	h_snprintb_len(
   1084  1.29    rillig 	    2, "\177\020", 0x00,
   1085  1.16    rillig 	    1, "0");
   1086  1.15    rillig 	h_snprintb_len(
   1087  1.29    rillig 	    3, "\177\020", 0x00,
   1088  1.16    rillig 	    1, "0");
   1089  1.15    rillig 	h_snprintb_len(
   1090  1.29    rillig 	    3, "\177\020", 0x07,
   1091  1.31    rillig 	    3, "0#");
   1092  1.15    rillig 	h_snprintb_len(
   1093  1.29    rillig 	    4, "\177\020", 0x07,
   1094  1.16    rillig 	    3, "0x7");
   1095  1.15    rillig 	h_snprintb_len(
   1096  1.29    rillig 	    7, "\177\020b\000lsb\0", 0x07,
   1097  1.31    rillig 	    8, "0x7<l#");
   1098  1.15    rillig 	h_snprintb_len(
   1099  1.29    rillig 	    8, "\177\020b\000lsb\0", 0x07,
   1100  1.31    rillig 	    8, "0x7<ls#");
   1101  1.15    rillig 	h_snprintb_len(
   1102  1.29    rillig 	    9, "\177\020b\000lsb\0", 0x07,
   1103  1.16    rillig 	    8, "0x7<lsb>");
   1104  1.15    rillig 	h_snprintb_len(
   1105  1.29    rillig 	    9, "\177\020b\000one\0b\001two\0", 0x07,
   1106  1.31    rillig 	    12, "0x7<one#");
   1107  1.15    rillig 	h_snprintb_len(
   1108  1.29    rillig 	    10, "\177\020b\000one\0b\001two\0", 0x07,
   1109  1.31    rillig 	    12, "0x7<one,#");
   1110  1.15    rillig 	h_snprintb_len(
   1111  1.29    rillig 	    12, "\177\020b\000one\0b\001two\0", 0x07,
   1112  1.31    rillig 	    12, "0x7<one,tw#");
   1113  1.15    rillig 	h_snprintb_len(
   1114  1.29    rillig 	    13, "\177\020b\000one\0b\001two\0", 0x07,
   1115  1.16    rillig 	    12, "0x7<one,two>");
   1116   1.1      jmmv }
   1117   1.1      jmmv 
   1118   1.2  pgoyette ATF_TC(snprintb_m);
   1119   1.2  pgoyette ATF_TC_HEAD(snprintb_m, tc)
   1120   1.2  pgoyette {
   1121   1.2  pgoyette 	atf_tc_set_md_var(tc, "descr", "Checks snprintb_m(3)");
   1122   1.2  pgoyette }
   1123   1.2  pgoyette ATF_TC_BODY(snprintb_m, tc)
   1124   1.2  pgoyette {
   1125  1.21    rillig 
   1126  1.21    rillig 	// old style, line_max exceeded by number in line 1
   1127  1.21    rillig 	h_snprintb_m(
   1128  1.21    rillig 	    "\020",
   1129  1.21    rillig 	    0xff,
   1130  1.21    rillig 	    1,
   1131  1.24    rillig 	    "#\0");
   1132  1.21    rillig 
   1133  1.21    rillig 	// old style, line_max exceeded by '<' in line 1
   1134  1.21    rillig 	h_snprintb_m(
   1135  1.27    rillig 	    "\020"
   1136  1.27    rillig 	    "\001lsb",
   1137  1.21    rillig 	    0xff,
   1138  1.21    rillig 	    4,
   1139  1.27    rillig 	    "0xf#\0");
   1140  1.21    rillig 
   1141  1.27    rillig 	// old style, line_max exceeded by description
   1142  1.21    rillig 	h_snprintb_m(
   1143  1.21    rillig 	    "\020"
   1144  1.21    rillig 	    "\001bit1"
   1145  1.21    rillig 	    "\002bit2",
   1146  1.21    rillig 	    0xff,
   1147  1.27    rillig 	    7,
   1148  1.27    rillig 	    "0xff<b#\0"
   1149  1.27    rillig 	    "0xff<b#\0");
   1150  1.21    rillig 
   1151  1.21    rillig 	// old style, line_max exceeded by '>' in line 1
   1152  1.21    rillig 	h_snprintb_m(
   1153  1.13    rillig 	    "\020"
   1154  1.13    rillig 	    "\001bit1"
   1155  1.21    rillig 	    "\0022",
   1156  1.21    rillig 	    0xff,
   1157  1.21    rillig 	    9,
   1158  1.24    rillig 	    "0xff<bit#\0"
   1159  1.24    rillig 	    "0xff<2>\0");
   1160  1.21    rillig 
   1161  1.21    rillig 	// old style, line_max exceeded by description in line 2
   1162  1.21    rillig 	h_snprintb_m(
   1163  1.21    rillig 	    "\020"
   1164  1.21    rillig 	    "\0011"
   1165  1.21    rillig 	    "\002bit2",
   1166  1.21    rillig 	    0xff,
   1167  1.21    rillig 	    8,
   1168  1.21    rillig 	    "0xff<1>\0"
   1169  1.24    rillig 	    "0xff<bi#\0");
   1170  1.21    rillig 
   1171  1.21    rillig 	// old style, line_max exceeded by '>' in line 2
   1172  1.21    rillig 	h_snprintb_m(
   1173  1.21    rillig 	    "\020"
   1174  1.21    rillig 	    "\0011"
   1175  1.21    rillig 	    "\002bit2",
   1176  1.21    rillig 	    0xff,
   1177  1.21    rillig 	    9,
   1178  1.21    rillig 	    "0xff<1>\0"
   1179  1.24    rillig 	    "0xff<bit#\0");
   1180  1.21    rillig 
   1181  1.29    rillig 	// old style, complete
   1182  1.21    rillig 	h_snprintb_m(
   1183  1.21    rillig 	    "\020"
   1184  1.21    rillig 	    "\0011"
   1185  1.21    rillig 	    "\002bit2",
   1186  1.21    rillig 	    0xff,
   1187  1.21    rillig 	    10,
   1188  1.21    rillig 	    "0xff<1>\0"
   1189  1.21    rillig 	    "0xff<bit2>\0");
   1190  1.21    rillig 
   1191  1.21    rillig 	// new style, line_max exceeded by value in line 1
   1192  1.21    rillig 	h_snprintb_m(
   1193  1.21    rillig 	    "\177\020",
   1194  1.21    rillig 	    0xff,
   1195  1.29    rillig 	    3,
   1196  1.29    rillig 	    "0x#\0");
   1197  1.21    rillig 
   1198  1.21    rillig 	// new style, line_max exceeded by single-bit '<' in line 1
   1199  1.21    rillig 	h_snprintb_m(
   1200  1.21    rillig 	    "\177\020"
   1201  1.21    rillig 	    "b\000bit\0",
   1202  1.21    rillig 	    0xff,
   1203  1.21    rillig 	    4,
   1204  1.24    rillig 	    "0xf#\0");
   1205  1.21    rillig 
   1206  1.21    rillig 	// new style, line_max exceeded by single-bit description in line 1
   1207  1.21    rillig 	h_snprintb_m(
   1208  1.21    rillig 	    "\177\020"
   1209  1.21    rillig 	    "b\000bit0\0"
   1210  1.21    rillig 	    "b\001two\0",
   1211  1.21    rillig 	    0xff,
   1212  1.21    rillig 	    8,
   1213  1.24    rillig 	    "0xff<bi#\0"
   1214  1.24    rillig 	    "0xff<tw#\0");
   1215  1.21    rillig 
   1216  1.21    rillig 	// new style, line_max exceeded by single-bit '>' in line 1
   1217  1.21    rillig 	h_snprintb_m(
   1218  1.21    rillig 	    "\177\020"
   1219  1.21    rillig 	    "b\000bit0\0"
   1220  1.21    rillig 	    "b\001two\0",
   1221  1.21    rillig 	    0xff,
   1222  1.21    rillig 	    9,
   1223  1.24    rillig 	    "0xff<bit#\0"
   1224  1.24    rillig 	    "0xff<two>\0");
   1225  1.21    rillig 
   1226  1.21    rillig 	// new style, line_max exceeded by single-bit description in line 2
   1227  1.21    rillig 	h_snprintb_m(
   1228  1.21    rillig 	    "\177\020"
   1229  1.21    rillig 	    "b\000one\0"
   1230  1.21    rillig 	    "b\001three\0",
   1231  1.21    rillig 	    0xff,
   1232  1.21    rillig 	    9,
   1233  1.21    rillig 	    "0xff<one>\0"
   1234  1.24    rillig 	    "0xff<thr#\0");
   1235  1.21    rillig 
   1236  1.21    rillig 	// new style, line_max exceeded by single-bit '>' in line 2
   1237  1.21    rillig 	h_snprintb_m(
   1238  1.21    rillig 	    "\177\020"
   1239  1.21    rillig 	    "b\000one\0"
   1240  1.29    rillig 	    "b\001three\0",
   1241  1.21    rillig 	    0xff,
   1242  1.29    rillig 	    10,
   1243  1.21    rillig 	    "0xff<one>\0"
   1244  1.29    rillig 	    "0xff<thre#\0");
   1245  1.21    rillig 
   1246  1.21    rillig 	// new style, single-bit complete
   1247  1.21    rillig 	h_snprintb_m(
   1248  1.21    rillig 	    "\177\020"
   1249  1.21    rillig 	    "b\000one\0"
   1250  1.21    rillig 	    "b\001three\0",
   1251  1.21    rillig 	    0xff,
   1252  1.21    rillig 	    11,
   1253  1.21    rillig 	    "0xff<one>\0"
   1254  1.21    rillig 	    "0xff<three>\0");
   1255  1.21    rillig 
   1256  1.21    rillig 	// new style, line_max exceeded by named bit-field number in line 1
   1257  1.21    rillig 	h_snprintb_m(
   1258  1.21    rillig 	    "\177\020"
   1259  1.21    rillig 	    "f\000\004lo\0",
   1260  1.21    rillig 	    0xff,
   1261  1.21    rillig 	    3,
   1262  1.24    rillig 	    "0x#\0");
   1263  1.21    rillig 
   1264  1.21    rillig 	// new style, line_max exceeded by named bit-field '<' in line 1
   1265  1.21    rillig 	h_snprintb_m(
   1266  1.21    rillig 	    "\177\020"
   1267  1.21    rillig 	    "f\000\004lo\0",
   1268  1.21    rillig 	    0xff,
   1269  1.21    rillig 	    4,
   1270  1.24    rillig 	    "0xf#\0");
   1271  1.13    rillig 
   1272  1.29    rillig 	// new style, line_max exceeded by bit-field description in line 1
   1273  1.21    rillig 	h_snprintb_m(
   1274  1.13    rillig 	    "\177\020"
   1275  1.21    rillig 	    "f\000\004lo\0",
   1276  1.21    rillig 	    0xff,
   1277  1.13    rillig 	    6,
   1278  1.24    rillig 	    "0xff<#\0");
   1279  1.16    rillig 
   1280  1.21    rillig 	// new style, line_max exceeded by named bit-field '=' in line 1
   1281  1.21    rillig 	h_snprintb_m(
   1282  1.21    rillig 	    "\177\020"
   1283  1.21    rillig 	    "f\000\004lo\0",
   1284  1.21    rillig 	    0xff,
   1285  1.21    rillig 	    7,
   1286  1.24    rillig 	    "0xff<l#\0");
   1287  1.16    rillig 
   1288  1.21    rillig 	// new style, line_max exceeded by named bit-field value in line 1
   1289  1.21    rillig 	h_snprintb_m(
   1290  1.16    rillig 	    "\177\020"
   1291  1.21    rillig 	    "f\000\004lo\0",
   1292  1.16    rillig 	    0xff,
   1293  1.16    rillig 	    10,
   1294  1.24    rillig 	    "0xff<lo=0#\0");
   1295  1.21    rillig 
   1296  1.21    rillig 	// new style, line_max exceeded by named bit-field '=' in line 1
   1297  1.21    rillig 	h_snprintb_m(
   1298  1.21    rillig 	    "\177\020"
   1299  1.21    rillig 	    "f\000\004lo\0"
   1300  1.21    rillig 		"=\017match\0",
   1301  1.21    rillig 	    0xff,
   1302  1.29    rillig 	    12,
   1303  1.29    rillig 	    "0xff<lo=0xf#\0");
   1304  1.21    rillig 
   1305  1.27    rillig 	// new style, line_max exceeded by named bit-field value description in
   1306  1.27    rillig 	// line 1
   1307  1.21    rillig 	h_snprintb_m(
   1308  1.21    rillig 	    "\177\020"
   1309  1.21    rillig 	    "f\000\004lo\0"
   1310  1.21    rillig 		"=\017match\0",
   1311  1.21    rillig 	    0xff,
   1312  1.21    rillig 	    16,
   1313  1.24    rillig 	    "0xff<lo=0xf=mat#\0");
   1314  1.21    rillig 
   1315  1.21    rillig 	// new style, line_max exceeded by named bit-field '>' in line 1
   1316  1.21    rillig 	h_snprintb_m(
   1317  1.21    rillig 	    "\177\020"
   1318  1.21    rillig 	    "f\000\004lo\0"
   1319  1.21    rillig 		"=\017match\0",
   1320  1.21    rillig 	    0xff,
   1321  1.21    rillig 	    17,
   1322  1.24    rillig 	    "0xff<lo=0xf=matc#\0");
   1323  1.21    rillig 
   1324  1.29    rillig 	// new style, line_max exceeded by named bit-field description in
   1325  1.29    rillig 	// line 2
   1326  1.21    rillig 	h_snprintb_m(
   1327  1.21    rillig 	    "\177\020"
   1328  1.21    rillig 	    "f\000\004lo\0"
   1329  1.21    rillig 	    "f\000\004low-bits\0"
   1330  1.21    rillig 		"=\017match\0",
   1331  1.21    rillig 	    0xff,
   1332  1.21    rillig 	    12,
   1333  1.21    rillig 	    "0xff<lo=0xf>\0"
   1334  1.24    rillig 	    "0xff<low-bi#\0");
   1335  1.21    rillig 
   1336  1.21    rillig 	// new style, line_max exceeded by named bit-field '=' in line 2
   1337  1.21    rillig 	h_snprintb_m(
   1338  1.21    rillig 	    "\177\020"
   1339  1.21    rillig 	    "f\000\004lo\0"
   1340  1.21    rillig 	    "f\000\004low-bits\0"
   1341  1.21    rillig 		"=\017match\0",
   1342  1.21    rillig 	    0xff,
   1343  1.21    rillig 	    13,
   1344  1.21    rillig 	    "0xff<lo=0xf>\0"
   1345  1.24    rillig 	    "0xff<low-bit#\0");
   1346  1.21    rillig 
   1347  1.21    rillig 	// new style, line_max exceeded by named bit-field value in line 2
   1348  1.21    rillig 	h_snprintb_m(
   1349  1.21    rillig 	    "\177\020"
   1350  1.21    rillig 	    "f\000\004lo\0"
   1351  1.21    rillig 	    "f\000\004low-bits\0"
   1352  1.21    rillig 		"=\017match\0",
   1353  1.21    rillig 	    0xff,
   1354  1.21    rillig 	    16,
   1355  1.21    rillig 	    "0xff<lo=0xf>\0"
   1356  1.24    rillig 	    "0xff<low-bits=0#\0");
   1357  1.21    rillig 
   1358  1.21    rillig 	// new style, line_max exceeded by named bit-field '=' in line 2
   1359  1.21    rillig 	h_snprintb_m(
   1360  1.21    rillig 	    "\177\020"
   1361  1.21    rillig 	    "f\000\004lo\0"
   1362  1.21    rillig 	    "f\000\004low-bits\0"
   1363  1.21    rillig 		"=\017match\0",
   1364  1.21    rillig 	    0xff,
   1365  1.29    rillig 	    18,
   1366  1.21    rillig 	    "0xff<lo=0xf>\0"
   1367  1.29    rillig 	    "0xff<low-bits=0xf#\0");
   1368  1.21    rillig 
   1369  1.27    rillig 	// new style, line_max exceeded by named bit-field value description
   1370  1.27    rillig 	// in line 2
   1371  1.21    rillig 	h_snprintb_m(
   1372  1.21    rillig 	    "\177\020"
   1373  1.21    rillig 	    "f\000\004lo\0"
   1374  1.21    rillig 	    "f\000\004low-bits\0"
   1375  1.21    rillig 		"=\017match\0",
   1376  1.21    rillig 	    0xff,
   1377  1.21    rillig 	    22,
   1378  1.21    rillig 	    "0xff<lo=0xf>\0"
   1379  1.24    rillig 	    "0xff<low-bits=0xf=mat#\0");
   1380  1.21    rillig 
   1381  1.21    rillig 	// new style, line_max exceeded by named bit-field '>' in line 2
   1382  1.21    rillig 	h_snprintb_m(
   1383  1.21    rillig 	    "\177\020"
   1384  1.21    rillig 	    "f\000\004lo\0"
   1385  1.21    rillig 	    "f\000\004low-bits\0"
   1386  1.21    rillig 		"=\017match\0",
   1387  1.21    rillig 	    0xff,
   1388  1.21    rillig 	    23,
   1389  1.21    rillig 	    "0xff<lo=0xf>\0"
   1390  1.24    rillig 	    "0xff<low-bits=0xf=matc#\0");
   1391  1.21    rillig 
   1392  1.21    rillig 	// new style, named bit-field complete
   1393  1.21    rillig 	h_snprintb_m(
   1394  1.21    rillig 	    "\177\020"
   1395  1.21    rillig 	    "f\000\004lo\0"
   1396  1.21    rillig 	    "f\000\004low-bits\0"
   1397  1.21    rillig 		"=\017match\0",
   1398  1.21    rillig 	    0xff,
   1399  1.21    rillig 	    24,
   1400  1.21    rillig 	    "0xff<lo=0xf>\0"
   1401  1.22    rillig 	    "0xff<low-bits=0xf=match>\0");
   1402  1.21    rillig 
   1403  1.21    rillig 	// new style, line_max exceeded by unnamed bit-field number in line 1
   1404  1.21    rillig 	h_snprintb_m(
   1405  1.21    rillig 	    "\177\020"
   1406  1.21    rillig 	    "F\000\004\0",
   1407  1.21    rillig 	    0xff,
   1408  1.21    rillig 	    3,
   1409  1.24    rillig 	    "0x#\0");
   1410  1.13    rillig 
   1411  1.21    rillig 	// new style, line_max exceeded by unnamed bit-field '<' in line 1
   1412  1.21    rillig 	h_snprintb_m(
   1413  1.15    rillig 	    "\177\020"
   1414  1.21    rillig 	    "F\000\004\0",
   1415  1.16    rillig 	    0xff,
   1416  1.21    rillig 	    4,
   1417  1.24    rillig 	    "0xf#\0");
   1418  1.16    rillig 
   1419  1.27    rillig 	// new style, line_max exceeded by unnamed bit-field value description
   1420  1.27    rillig 	// in line 1
   1421  1.21    rillig 	h_snprintb_m(
   1422  1.21    rillig 	    "\177\020"
   1423  1.21    rillig 	    "F\000\004\0"
   1424  1.21    rillig 		":\017match\0",
   1425  1.21    rillig 	    0xff,
   1426  1.16    rillig 	    9,
   1427  1.24    rillig 	    "0xff<mat#\0");
   1428  1.21    rillig 
   1429  1.21    rillig 	// new style, line_max exceeded by unnamed bit-field '>' in line 1
   1430  1.21    rillig 	h_snprintb_m(
   1431  1.16    rillig 	    "\177\020"
   1432  1.21    rillig 	    "F\000\004\0"
   1433  1.21    rillig 		":\017match\0",
   1434  1.16    rillig 	    0xff,
   1435  1.16    rillig 	    10,
   1436  1.24    rillig 	    "0xff<matc#\0");
   1437  1.16    rillig 
   1438  1.27    rillig 	// new style, line_max exceeded by unnamed bit-field value description
   1439  1.27    rillig 	// in line 2
   1440  1.21    rillig 	h_snprintb_m(
   1441  1.21    rillig 	    "\177\020"
   1442  1.21    rillig 	    "F\000\004\0"
   1443  1.21    rillig 		":\017m1\0"
   1444  1.21    rillig 		":\017match\0",
   1445  1.21    rillig 	    0xff,
   1446  1.16    rillig 	    10,
   1447  1.24    rillig 	    "0xff<m1ma#\0");
   1448  1.21    rillig 
   1449  1.21    rillig 	// new style, line_max exceeded by unnamed bit-field '>' in line 2
   1450  1.21    rillig 	h_snprintb_m(
   1451  1.16    rillig 	    "\177\020"
   1452  1.21    rillig 	    "F\000\004\0"
   1453  1.21    rillig 		":\017m1\0"
   1454  1.21    rillig 		":\017match\0",
   1455  1.16    rillig 	    0xff,
   1456  1.16    rillig 	    10,
   1457  1.24    rillig 	    "0xff<m1ma#\0");
   1458  1.16    rillig 
   1459  1.21    rillig 	// new style unnamed bit-field complete
   1460  1.21    rillig 	h_snprintb_m(
   1461  1.21    rillig 	    "\177\020"
   1462  1.21    rillig 	    "F\000\004\0"
   1463  1.21    rillig 		":\017m1\0"
   1464  1.21    rillig 		":\017match\0",
   1465  1.21    rillig 	    0xff,
   1466  1.27    rillig 	    13,
   1467  1.27    rillig 	    "0xff<m1match>\0");
   1468  1.21    rillig 
   1469  1.21    rillig 	// new style, line_max exceeded by bit-field default
   1470  1.21    rillig 	h_snprintb_m(
   1471  1.16    rillig 	    "\177\020"
   1472  1.21    rillig 	    "f\000\004f\0"
   1473  1.21    rillig 		"*=default\0",
   1474  1.16    rillig 	    0xff,
   1475  1.21    rillig 	    17,
   1476  1.24    rillig 	    "0xff<f=0xf=defau#\0");
   1477  1.16    rillig 
   1478  1.21    rillig 	// new style, line_max exceeded by unmatched field value
   1479  1.21    rillig 	h_snprintb_m(
   1480  1.16    rillig 	    "\177\020"
   1481  1.21    rillig 	    "f\000\004bits\0"
   1482  1.29    rillig 		":\000zero\0",
   1483  1.16    rillig 	    0xff,
   1484  1.16    rillig 	    11,
   1485  1.24    rillig 	    "0xff<bits=#\0");
   1486  1.21    rillig 
   1487  1.29    rillig 	// example from the manual page, new style bits and fields
   1488  1.21    rillig 	h_snprintb_m(
   1489  1.21    rillig 	    "\177\020"
   1490  1.21    rillig 	    "b\0LSB\0"
   1491  1.21    rillig 	    "b\1BITONE\0"
   1492  1.21    rillig 	    "f\4\4NIBBLE2\0"
   1493  1.21    rillig 	    "f\x10\4BURST\0"
   1494  1.21    rillig 		"=\4FOUR\0"
   1495  1.21    rillig 		"=\xf""FIFTEEN\0"
   1496  1.21    rillig 	    "b\x1fMSB\0",
   1497  1.21    rillig 	    0x800f0701,
   1498  1.21    rillig 	    34,
   1499  1.21    rillig 	    "0x800f0701<LSB,NIBBLE2=0>\0"
   1500  1.22    rillig 	    "0x800f0701<BURST=0xf=FIFTEEN,MSB>\0");
   1501  1.16    rillig 
   1502  1.32    rillig 	// new style, missing number base
   1503  1.32    rillig 	h_snprintb_m_len(
   1504  1.32    rillig 	    1024,
   1505  1.32    rillig 	    "\177",
   1506  1.32    rillig 	    0xff,
   1507  1.32    rillig 	    128,
   1508  1.32    rillig 	    -1,
   1509  1.32    rillig 	    "#\0");
   1510  1.32    rillig 
   1511  1.21    rillig 	// new style, buffer too small for complete number in line 2
   1512  1.16    rillig 	h_snprintb_m_len(
   1513  1.16    rillig 	    15,
   1514  1.16    rillig 	    "\177\020"
   1515  1.16    rillig 	    "b\000lsb\0"
   1516  1.16    rillig 	    "b\001two\0",
   1517  1.16    rillig 	    0xff,
   1518  1.16    rillig 	    11,
   1519  1.16    rillig 	    20,
   1520  1.16    rillig 	    "0xff<lsb>\0"
   1521  1.31    rillig 	    "0x#\0");
   1522  1.16    rillig 
   1523  1.16    rillig 	// new-style format, buffer too small for '<' in line 2
   1524  1.16    rillig 	h_snprintb_m_len(
   1525  1.16    rillig 	    16,
   1526  1.16    rillig 	    "\177\020"
   1527  1.16    rillig 	    "b\000lsb\0"
   1528  1.16    rillig 	    "b\001two\0",
   1529  1.16    rillig 	    0xff,
   1530  1.16    rillig 	    11,
   1531  1.16    rillig 	    20,
   1532  1.16    rillig 	    "0xff<lsb>\0"
   1533  1.31    rillig 	    "0xf#\0");
   1534  1.16    rillig 
   1535  1.31    rillig 	// new-style format, buffer too small for textual fallback
   1536  1.31    rillig 	h_snprintb_m_len(
   1537  1.31    rillig 	    24,
   1538  1.16    rillig 	    "\177\020"
   1539  1.16    rillig 	    "f\000\004bits\0"
   1540  1.16    rillig 		"*=fallback\0"
   1541  1.16    rillig 	    "b\0024\0",
   1542  1.16    rillig 	    0xff,
   1543  1.16    rillig 	    64,
   1544  1.31    rillig 	    26,
   1545  1.31    rillig 	    "0xff<bits=0xf=fallbac#\0");
   1546  1.15    rillig 
   1547  1.19    rillig 	// new-style format, buffer too small for numeric fallback
   1548  1.19    rillig 	h_snprintb_m_len(
   1549  1.19    rillig 	    20,
   1550  1.19    rillig 	    "\177\020"
   1551  1.19    rillig 	    "F\000\004\0"
   1552  1.19    rillig 		"*fallback(%040jd)\0",
   1553  1.19    rillig 	    0xff,
   1554  1.19    rillig 	    64,
   1555  1.19    rillig 	    57,
   1556  1.31    rillig 	    "0xff<fallback(000#\0");
   1557  1.19    rillig 
   1558  1.19    rillig 	// new-style format, buffer too small for numeric fallback past buffer
   1559  1.19    rillig 	h_snprintb_m_len(
   1560  1.19    rillig 	    15,
   1561  1.19    rillig 	    "\177\020"
   1562  1.19    rillig 	    "F\000\004\0"
   1563  1.19    rillig 		"*fallback(%010jd)\0"
   1564  1.19    rillig 	    "F\004\004\0"
   1565  1.19    rillig 		"*fallback(%010jd)\0",
   1566  1.19    rillig 	    0xff,
   1567  1.19    rillig 	    64,
   1568  1.19    rillig 	    48,
   1569  1.31    rillig 	    "0xff<fallbac#\0");
   1570  1.19    rillig 
   1571  1.21    rillig 	// new style, bits and fields, line break between fields
   1572   1.9    rillig 	h_snprintb_m(
   1573   1.9    rillig 	    "\177\020"
   1574   1.9    rillig 	    "b\0LSB\0"
   1575   1.9    rillig 	    "b\1_BITONE\0"
   1576   1.9    rillig 	    "f\4\4NIBBLE2\0"
   1577   1.9    rillig 	    "f\x10\4BURST\0"
   1578   1.9    rillig 		"=\04FOUR\0"
   1579   1.9    rillig 		"=\17FIFTEEN\0"
   1580   1.9    rillig 	    "b\x1fMSB\0",
   1581   1.9    rillig 	    0x800f0701,
   1582   1.9    rillig 	    33,
   1583   1.9    rillig 	    "0x800f0701<LSB,NIBBLE2=0>\0"
   1584  1.29    rillig 	    "0x800f0701<BURST=0xf=FIFTEEN,MSB>\0");
   1585   1.9    rillig 
   1586  1.21    rillig 	// new style, bits and fields, line break after field description
   1587   1.9    rillig 	h_snprintb_m(
   1588   1.9    rillig 	    "\177\020"
   1589   1.9    rillig 	    "b\0LSB\0"
   1590   1.9    rillig 	    "b\1_BITONE\0"
   1591   1.9    rillig 	    "f\4\4NIBBLE2\0"
   1592  1.29    rillig 	    "f\020\4BURST\0"
   1593   1.9    rillig 		"=\04FOUR\0"
   1594   1.9    rillig 		"=\17FIFTEEN\0"
   1595  1.29    rillig 	    "b\037MSB\0",
   1596   1.9    rillig 	    0x800f0701,
   1597   1.9    rillig 	    32,
   1598   1.9    rillig 	    "0x800f0701<LSB,NIBBLE2=0>\0"
   1599   1.9    rillig 	    "0x800f0701<BURST=0xf=FIFTEEN>\0"
   1600   1.9    rillig 	    "0x800f0701<MSB>\0");
   1601   1.2  pgoyette }
   1602   1.2  pgoyette 
   1603   1.1      jmmv ATF_TP_ADD_TCS(tp)
   1604   1.1      jmmv {
   1605   1.1      jmmv 
   1606   1.1      jmmv 	ATF_TP_ADD_TC(tp, snprintb);
   1607   1.2  pgoyette 	ATF_TP_ADD_TC(tp, snprintb_m);
   1608   1.1      jmmv 
   1609   1.1      jmmv 	return atf_no_error();
   1610   1.1      jmmv }
   1611