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