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