Home | History | Annotate | Line # | Download | only in libutil
t_snprintb.c revision 1.38
      1  1.38    rillig /* $NetBSD: t_snprintb.c,v 1.38 2025/08/24 16:19:31 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.38    rillig __RCSID("$NetBSD: t_snprintb.c,v 1.38 2025/08/24 16:19:31 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.38    rillig 	// A bit-field that does not match any values generates multiple
    682  1.38    rillig 	// commas in a row, which looks confusing. The ':' conversions should
    683  1.38    rillig 	// either be exhaustive, or there should be a '*' catch-all
    684  1.38    rillig 	// conversion.
    685  1.21    rillig 	h_snprintb(
    686  1.21    rillig 	    "\177\020"
    687  1.21    rillig 	    "b\000bit0\0"
    688  1.21    rillig 	    "F\000\004\0"
    689  1.21    rillig 		":\1one\0"
    690  1.21    rillig 		":\2two\0"
    691  1.21    rillig 	    "b\001bit1\0",
    692  1.21    rillig 	    0x3,
    693  1.21    rillig 	    "0x3<bit0,,bit1>");
    694  1.21    rillig 
    695  1.25    rillig 	// new style bit-field, '=', can never match
    696  1.29    rillig 	//
    697  1.29    rillig 	// The extracted value from the bit-field has 7 bits and is thus less
    698  1.29    rillig 	// than 128, therefore it can neither match 128 nor 255.
    699  1.25    rillig 	h_snprintb(
    700  1.25    rillig 	    "\177\020"
    701  1.25    rillig 	    "f\000\007f\0"
    702  1.25    rillig 		"=\200never\0"
    703  1.25    rillig 		"=\377never\0",
    704  1.25    rillig 	    0xff,
    705  1.25    rillig 	    "0xff<f=0x7f>");
    706  1.25    rillig 
    707  1.21    rillig 	// new style, two separate bit-fields
    708   1.9    rillig 	h_snprintb(
    709   1.9    rillig 	    "\177\020"
    710  1.21    rillig 	    "f\000\004f1\0"
    711  1.21    rillig 		"=\001one\0"
    712  1.21    rillig 		"=\002two\0"
    713  1.21    rillig 	    "f\004\004f2\0"
    714  1.21    rillig 		"=\001one\0"
    715  1.21    rillig 		"=\002two\0",
    716  1.21    rillig 	    0x12,
    717  1.21    rillig 	    "0x12<f1=0x2=two,f2=0x1=one>");
    718  1.21    rillig 
    719  1.21    rillig 	// new style, mixed named and unnamed bit-fields
    720  1.21    rillig 	h_snprintb(
    721  1.21    rillig 	    "\177\020"
    722  1.21    rillig 	    "f\000\004f1\0"
    723  1.21    rillig 		"=\001one\0"
    724  1.21    rillig 		"=\002two\0"
    725  1.10    rillig 	    "F\010\004\0"
    726  1.21    rillig 		":\015thirteen\0"
    727  1.21    rillig 	    "f\004\004f2\0"
    728  1.21    rillig 		"=\001one\0"
    729  1.21    rillig 		"=\002two\0",
    730  1.21    rillig 	    0x0d12,
    731  1.21    rillig 	    "0xd12<f1=0x2=two,thirteen,f2=0x1=one>");
    732  1.21    rillig 
    733  1.21    rillig 	// new style bit-field, overlapping
    734  1.21    rillig 	h_snprintb(
    735  1.21    rillig 	    "\177\020"
    736  1.21    rillig 	    "f\000\004lo\0"
    737  1.21    rillig 	    "f\002\004mid\0"
    738  1.21    rillig 	    "f\004\004hi\0"
    739  1.21    rillig 	    "f\000\010all\0",
    740  1.21    rillig 	    0x18,
    741  1.21    rillig 	    "0x18<lo=0x8,mid=0x6,hi=0x1,all=0x18>");
    742  1.21    rillig 
    743  1.21    rillig 	// new style bit-field, difference between '=' and ':'
    744  1.21    rillig 	//
    745  1.38    rillig 	// The ':' conversion can almost emulate the '=' conversion by
    746  1.38    rillig 	// starting its description with '=', excluding the numeric value of
    747  1.38    rillig 	// the field. The 'f' and '=' conversions mix well, and so do 'F' and
    748  1.38    rillig 	// ':'. Other combinations don't mix well and are thus erroneous.
    749  1.21    rillig 	h_snprintb(
    750  1.21    rillig 	    "\177\020"
    751  1.21    rillig 	    "f\000\004field\0"
    752  1.29    rillig 		"=\010f-value\0"
    753  1.29    rillig 	    "F\000\000\0"		// Use an empty bit-field
    754  1.29    rillig 		":\000separator\0"	// to generate a separator.
    755  1.21    rillig 	    "F\000\004\0"
    756  1.29    rillig 		":\010F-value\0",
    757  1.21    rillig 	    0x18,
    758  1.29    rillig 	    "0x18<field=0x8=f-value,separator,F-value>");
    759  1.21    rillig 
    760  1.21    rillig 	// new style bit-field default, fixed string
    761  1.21    rillig 	//
    762  1.37    rillig 	// When used with the 'f' conversion, the '*' conversion should
    763  1.37    rillig 	// start with '=' to match the rest of the format.
    764  1.37    rillig 	//
    765  1.37    rillig 	// When used with the 'F' conversion, the '*' conversion should not
    766  1.37    rillig 	// start with '=' to avoid the wrong punctuation ',=' in the output.
    767  1.21    rillig 	h_snprintb(
    768  1.21    rillig 	    "\177\020"
    769  1.21    rillig 	    "f\030\010f1\0"
    770  1.37    rillig 		"*default-f\0"
    771  1.21    rillig 	    "f\020\010f2\0"
    772  1.37    rillig 		"*=default-f\0"
    773  1.21    rillig 	    "F\010\010\0"
    774  1.37    rillig 		"*default-F\0"
    775  1.21    rillig 	    "F\010\010\0"
    776  1.37    rillig 		"*=default-F\0",
    777  1.21    rillig 	    0x11223344,
    778  1.37    rillig 	    "0x11223344<f1=0x11default-f,f2=0x22=default-f,default-F,=default-F>");
    779  1.21    rillig 
    780  1.21    rillig 	// new style bit-field default, numeric conversion specifier
    781  1.21    rillig 	h_snprintb(
    782  1.21    rillig 	    "\177\020"
    783  1.21    rillig 	    "f\010\010f\0"
    784  1.21    rillig 		"*=f(%ju)\0"
    785  1.21    rillig 	    "F\000\010F\0"
    786  1.21    rillig 		"*F(%ju)\0",
    787  1.21    rillig 	    0x1122,
    788  1.21    rillig 	    "0x1122<f=0x11=f(17),F(34)>");
    789  1.21    rillig 
    790  1.25    rillig 	// new style bit-field default, can never match
    791  1.29    rillig 	//
    792  1.38    rillig 	// The '=' conversions are exhaustive, making the '*' redundant.
    793  1.25    rillig 	h_snprintb(
    794  1.25    rillig 	    "\177\020"
    795  1.25    rillig 	    "f\010\002f\0"
    796  1.25    rillig 		"=\000zero\0"
    797  1.25    rillig 		"=\001one\0"
    798  1.25    rillig 		"=\002two\0"
    799  1.25    rillig 		"=\003three\0"
    800  1.29    rillig 		"*default\0",
    801  1.25    rillig 	    0xff00,
    802  1.25    rillig 	    "0xff00<f=0x3=three>");
    803  1.25    rillig 
    804  1.21    rillig 	// new style bit-field default, invalid conversion specifier
    805  1.21    rillig 	//
    806  1.21    rillig 	// There is no reliable way to make snprintf return an error, as such
    807  1.21    rillig 	// errors are defined as undefined behavior in the C standard.
    808  1.21    rillig 	// Instead, here's a conversion specifier that produces a literal '%'.
    809  1.21    rillig 	h_snprintb(
    810  1.21    rillig 	    "\177\020"
    811  1.21    rillig 	    "f\000\010f\0"
    812  1.21    rillig 		"*=%030ju%%\0",
    813  1.21    rillig 	    0xff,
    814  1.21    rillig 	    "0xff<f=0xff=000000000000000000000000000255%>");
    815  1.21    rillig 
    816  1.35    rillig 	// new style unknown conversion, at the beginning
    817  1.34    rillig 	h_snprintb_val_error(
    818  1.30    rillig 	    "\177\020"
    819  1.30    rillig 	    "unknown\0",
    820  1.30    rillig 	    0xff,
    821  1.30    rillig 	    "0xff#");
    822  1.30    rillig 
    823  1.35    rillig 	// new style unknown conversion, after a known conversion
    824  1.34    rillig 	h_snprintb_val_error(
    825  1.21    rillig 	    "\177\020"
    826  1.30    rillig 	    "b\007msb\0"
    827  1.30    rillig 	    "unknown\0",
    828  1.21    rillig 	    0xff,
    829  1.30    rillig 	    "0xff<msb#");
    830  1.21    rillig 
    831  1.21    rillig 	// new style combinations, 'b' '='
    832  1.21    rillig 	//
    833  1.34    rillig 	// A '=' conversion requires a preceding 'f' conversion.
    834  1.34    rillig 	h_snprintb_val_error(
    835  1.21    rillig 	    "\177\020"
    836  1.21    rillig 	    "b\004bit4\0"
    837  1.21    rillig 		"=\000clear\0"
    838  1.21    rillig 		"=\001set\0"
    839  1.21    rillig 		"=\245complete\0"
    840  1.21    rillig 	    "b\000bit0\0"
    841  1.21    rillig 		"=\000clear\0"
    842  1.21    rillig 		"=\001set\0"
    843  1.21    rillig 		"=\245complete\0",
    844  1.21    rillig 	    0xa5,
    845  1.34    rillig 	    "0xa5#");
    846  1.21    rillig 
    847  1.21    rillig 	// new style combinations, 'b' ':'
    848  1.21    rillig 	//
    849  1.34    rillig 	// A ':' conversion requires a preceding 'f' or 'F' conversion.
    850  1.34    rillig 	h_snprintb_val_error(
    851  1.21    rillig 	    "\177\020"
    852  1.21    rillig 	    "b\004bit4\0"
    853  1.21    rillig 		":\000clear\0"
    854  1.21    rillig 		":\001set\0"
    855  1.21    rillig 		":\245complete\0"
    856  1.21    rillig 	    "b\000bit0\0"
    857  1.21    rillig 		":\000clear\0"
    858  1.21    rillig 		":\001set\0"
    859  1.21    rillig 		":\245complete\0",
    860  1.21    rillig 	    0xa5,
    861  1.34    rillig 	    "0xa5#");
    862  1.21    rillig 
    863  1.21    rillig 	// new style combinations, 'b' '*'
    864  1.21    rillig 	//
    865  1.34    rillig 	// A '*' conversion requires a preceding 'f' or 'F' conversion.
    866  1.34    rillig 	h_snprintb_val_error(
    867  1.21    rillig 	    "\177\020"
    868  1.21    rillig 	    "b\004bit4\0"
    869  1.21    rillig 		"*default(%ju)\0"
    870  1.21    rillig 	    "b\000bit0\0"
    871  1.21    rillig 		"*default(%ju)\0",
    872  1.21    rillig 	    0xa5,
    873  1.34    rillig 	    "0xa5#");
    874  1.21    rillig 
    875  1.21    rillig 	// new style combinations, 'f' 'b' '='
    876  1.21    rillig 	//
    877  1.34    rillig 	// A '=' conversion requires a preceding 'f' conversion, there must
    878  1.34    rillig 	// not be a 'b' conversion in between.
    879  1.34    rillig 	h_snprintb_val_error(
    880  1.21    rillig 	    "\177\020"
    881  1.21    rillig 	    "f\000\010f\0"
    882  1.21    rillig 	    "b\005bit5\0"
    883  1.29    rillig 		"=\245match\0",
    884  1.21    rillig 	    0xa5,
    885  1.34    rillig 	    "0xa5<f=0xa5,bit5#");
    886  1.21    rillig 
    887  1.34    rillig 	// new style combinations, 'F' 'b' ':'
    888  1.21    rillig 	//
    889  1.34    rillig 	// A ':' conversion requires a preceding 'F' conversion, there must
    890  1.34    rillig 	// not be a 'b' conversion in between.
    891  1.34    rillig 	//
    892  1.34    rillig 	// The isolated leading comma is produced by the non-exhaustive 'F'
    893  1.34    rillig 	// conversion. Detecting these at runtime would be too costly.
    894  1.34    rillig 	h_snprintb_val_error(
    895  1.21    rillig 	    "\177\020"
    896  1.34    rillig 	    "F\000\010f\0"
    897  1.21    rillig 	    "b\005bit5\0"
    898  1.29    rillig 		":\245match\0",
    899  1.21    rillig 	    0xa5,
    900  1.34    rillig 	    "0xa5<,bit5#");
    901  1.21    rillig 
    902  1.21    rillig 	// new style combinations, 'f' ':'
    903  1.29    rillig 	//
    904  1.34    rillig 	// The ':' conversion requires a preceding 'F' conversion, not 'f'.
    905  1.34    rillig 	h_snprintb_val_error(
    906  1.21    rillig 	    "\177\20"
    907  1.21    rillig 	    "f\000\004nibble\0"
    908  1.21    rillig 		":\001one\0",
    909  1.21    rillig 	    0x01,
    910  1.34    rillig 	    "0x1<nibble=0x1#");
    911   1.6       kre 
    912  1.21    rillig 	// new style combinations, 'F' '='
    913  1.21    rillig 	//
    914  1.34    rillig 	// A '=' conversion requires a preceding 'f' conversion, not 'F'.
    915  1.34    rillig 	h_snprintb_val_error(
    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.34    rillig 	    "0x1<#");
    921  1.21    rillig 
    922  1.21    rillig 	// new style combinations, '='
    923  1.21    rillig 	//
    924  1.34    rillig 	// A '=' conversion requires a preceding 'f' or 'F' conversion.
    925  1.34    rillig 	h_snprintb_val_error(
    926  1.21    rillig 	    "\177\020"
    927  1.29    rillig 		"=\245match\0",
    928  1.21    rillig 	    0xa5,
    929  1.34    rillig 	    "0xa5#");
    930  1.21    rillig 
    931  1.21    rillig 	// new style combinations, ':'
    932  1.21    rillig 	//
    933  1.34    rillig 	// A ':' conversion requires a preceding 'f' or 'F' conversion.
    934  1.34    rillig 	h_snprintb_val_error(
    935  1.21    rillig 	    "\177\020"
    936  1.29    rillig 		":\245match\0",
    937  1.21    rillig 	    0xa5,
    938  1.34    rillig 	    "0xa5#");
    939  1.21    rillig 
    940  1.21    rillig 	// new style combinations, '*'
    941  1.21    rillig 	//
    942  1.34    rillig 	// A '*' conversion requires a preceding 'f' or 'F' conversion.
    943  1.34    rillig 	h_snprintb_val_error(
    944  1.21    rillig 	    "\177\020"
    945  1.21    rillig 		"*match\0",
    946  1.21    rillig 	    0xa5,
    947  1.34    rillig 	    "0xa5#");
    948  1.21    rillig 
    949  1.21    rillig 	// new style combinations, 'f' '*' '='
    950  1.21    rillig 	//
    951  1.38    rillig 	// After a catch-all '*' conversion, there must not be further '='
    952  1.35    rillig 	// conversions.
    953  1.35    rillig 	h_snprintb_val_error(
    954  1.21    rillig 	    "\177\020"
    955  1.21    rillig 	    "f\000\010f\0"
    956  1.21    rillig 		"*=default\0"
    957  1.29    rillig 		"=\245match\0",
    958  1.21    rillig 	    0xa5,
    959  1.35    rillig 	    "0xa5<f=0xa5=default#");
    960  1.21    rillig 
    961  1.21    rillig 	// new style combinations, 'F' '*' ':'
    962  1.21    rillig 	//
    963  1.35    rillig 	// After a catch-all '*' conversion, there must not be further ':'
    964  1.35    rillig 	// conversions.
    965  1.35    rillig 	h_snprintb_val_error(
    966  1.21    rillig 	    "\177\020"
    967  1.21    rillig 	    "F\000\010F\0"
    968  1.21    rillig 		"*default\0"
    969  1.29    rillig 		":\245-match\0",
    970  1.21    rillig 	    0xa5,
    971  1.35    rillig 	    "0xa5<default#");
    972  1.21    rillig 
    973  1.35    rillig 	// new style combinations, 'f' '*' '*'
    974  1.21    rillig 	//
    975  1.35    rillig 	// After a catch-all '*' conversion, there must not be further '=' or
    976  1.35    rillig 	// '*' conversions.
    977  1.35    rillig 	h_snprintb_val_error(
    978  1.21    rillig 	    "\177\020"
    979  1.21    rillig 	    "f\000\010f\0"
    980  1.21    rillig 		"*=default-f\0"
    981  1.35    rillig 		"*ignored\0",
    982  1.35    rillig 	    0xa5,
    983  1.35    rillig 	    "0xa5<f=0xa5=default-f#");
    984  1.35    rillig 
    985  1.35    rillig 	// new style combinations, 'F' '*' '*'
    986  1.35    rillig 	//
    987  1.35    rillig 	// After a catch-all '*' conversion, there must not be further ':' or
    988  1.35    rillig 	// '*' conversions.
    989  1.35    rillig 	h_snprintb_val_error(
    990  1.35    rillig 	    "\177\020"
    991  1.21    rillig 	    "F\000\010\0"
    992  1.21    rillig 		"*default-F\0"
    993  1.21    rillig 		"*ignored\0",
    994  1.21    rillig 	    0xa5,
    995  1.35    rillig 	    "0xa5<default-F#");
    996  1.21    rillig 
    997  1.29    rillig 	// example from the manual page, old style octal
    998  1.21    rillig 	h_snprintb(
    999  1.36    rillig 	    "\010\002BITTWO\001BITONE",
   1000  1.29    rillig 	    0x03,
   1001  1.21    rillig 	    "03<BITTWO,BITONE>");
   1002  1.21    rillig 
   1003  1.29    rillig 	// example from the manual page, old style hexadecimal
   1004  1.29    rillig 	//
   1005  1.29    rillig 	// When using a hexadecimal escape sequence to encode a bit number,
   1006  1.29    rillig 	// the description must not start with a hexadecimal digit, or that
   1007  1.29    rillig 	// digit is interpreted as part of the bit number. To prevent this,
   1008  1.29    rillig 	// the bit number and the description need to be written as separate
   1009  1.29    rillig 	// string literals.
   1010  1.21    rillig 	h_snprintb(
   1011  1.36    rillig 	    "\x10"
   1012  1.36    rillig 	    "\x10" "NOTBOOT"
   1013  1.36    rillig 	    "\x0f" "FPP"
   1014  1.36    rillig 	    "\x0e" "SDVMA"
   1015  1.36    rillig 	    "\x0c" "VIDEO"
   1016  1.36    rillig 	    "\x0b" "LORES"
   1017  1.36    rillig 	    "\x0a" "FPA"
   1018  1.36    rillig 	    "\x09" "DIAG"
   1019  1.36    rillig 	    "\x07" "CACHE"
   1020  1.36    rillig 	    "\x06" "IOCACHE"
   1021  1.36    rillig 	    "\x05" "LOOPBACK"
   1022  1.36    rillig 	    "\x04" "DBGCACHE",
   1023  1.21    rillig 	    0xe860,
   1024  1.21    rillig 	    "0xe860<NOTBOOT,FPP,SDVMA,VIDEO,CACHE,IOCACHE>");
   1025  1.21    rillig 
   1026  1.29    rillig 	// example from the manual page, new style bits and fields
   1027  1.21    rillig 	h_snprintb(
   1028  1.21    rillig 	    "\177\020"
   1029  1.36    rillig 	    "b\000" "LSB\0"
   1030  1.36    rillig 	    "b\001" "BITONE\0"
   1031  1.36    rillig 	    "f\004\004" "NIBBLE2\0"
   1032  1.36    rillig 	    "f\020\004" "BURST\0"
   1033  1.36    rillig 		"=\x04" "FOUR\0"
   1034  1.36    rillig 		"=\x0f" "FIFTEEN\0"
   1035  1.36    rillig 	    "b\037" "MSB\0",
   1036  1.21    rillig 	    0x800f0701,
   1037  1.21    rillig 	    "0x800f0701<LSB,NIBBLE2=0,BURST=0xf=FIFTEEN,MSB>");
   1038   1.6       kre 
   1039  1.29    rillig 	// example from the manual page, new style mmap
   1040  1.21    rillig #define	MAP_FMT				\
   1041  1.21    rillig 	"\177\020"			\
   1042  1.21    rillig 	"b\0"  "SHARED\0"		\
   1043  1.21    rillig 	"b\1"  "PRIVATE\0"		\
   1044  1.21    rillig 	"b\2"  "COPY\0"			\
   1045  1.21    rillig 	"b\4"  "FIXED\0"		\
   1046  1.21    rillig 	"b\5"  "RENAME\0"		\
   1047  1.21    rillig 	"b\6"  "NORESERVE\0"		\
   1048  1.21    rillig 	"b\7"  "INHERIT\0"		\
   1049  1.21    rillig 	"b\11" "HASSEMAPHORE\0"		\
   1050  1.21    rillig 	"b\12" "TRYFIXED\0"		\
   1051  1.21    rillig 	"b\13" "WIRED\0"		\
   1052  1.21    rillig 	"F\14\1\0"			\
   1053  1.21    rillig 		":\0" "FILE\0"		\
   1054  1.21    rillig 		":\1" "ANONYMOUS\0"	\
   1055  1.21    rillig 	"b\15" "STACK\0"		\
   1056  1.21    rillig 	"F\30\010\0"			\
   1057  1.21    rillig 		":\000" "ALIGN=NONE\0"	\
   1058  1.21    rillig 		":\015" "ALIGN=8KB\0"	\
   1059  1.21    rillig 		"*"     "ALIGN=2^%ju\0"
   1060  1.21    rillig 	h_snprintb(
   1061  1.21    rillig 	    MAP_FMT,
   1062  1.21    rillig 	    0x0d001234,
   1063  1.21    rillig 	    "0xd001234<COPY,FIXED,RENAME,HASSEMAPHORE,ANONYMOUS,ALIGN=8KB>");
   1064  1.21    rillig 	h_snprintb(
   1065  1.21    rillig 	    MAP_FMT,
   1066  1.21    rillig 	    0x2e000000,
   1067  1.21    rillig 	    "0x2e000000<FILE,ALIGN=2^46>");
   1068  1.10    rillig 
   1069   1.9    rillig 	// It is possible but cumbersome to implement a reduced variant of
   1070   1.9    rillig 	// rot13 using snprintb, shown here for lowercase letters only.
   1071   1.9    rillig 	for (char ch = 'A'; ch <= '~'; ch++) {
   1072   1.9    rillig 		char rot13 = ch >= 'a' && ch <= 'm' ? ch + 13
   1073   1.9    rillig 		    : ch >= 'n' && ch <= 'z' ? ch - 13
   1074   1.9    rillig 		    : '?';
   1075   1.9    rillig 		char expected[8];
   1076   1.9    rillig 		ATF_REQUIRE_EQ(7,
   1077   1.9    rillig 		    snprintf(expected, sizeof(expected), "%#x<%c>", ch, rot13));
   1078   1.9    rillig 		h_snprintb(
   1079   1.9    rillig 		    "\177\020"
   1080   1.9    rillig 		    "F\000\010\0"
   1081   1.9    rillig 		    ":an\0:bo\0:cp\0:dq\0:er\0:fs\0:gt\0:hu\0"
   1082   1.9    rillig 		    ":iv\0:jw\0:kx\0:ly\0:mz\0"
   1083   1.9    rillig 		    ":na\0:ob\0:pc\0:qd\0:re\0:sf\0:tg\0:uh\0"
   1084   1.9    rillig 		    ":vi\0:wj\0:xk\0:yl\0:zm\0"
   1085   1.9    rillig 		    // If snprintf accepted "%jc", it would be possible to
   1086   1.9    rillig 		    // echo the non-alphabetic characters instead of a
   1087   1.9    rillig 		    // catchall question mark.
   1088   1.9    rillig 		    "*?\0",
   1089   1.9    rillig 		    ch,
   1090   1.9    rillig 		    expected);
   1091   1.9    rillig 	}
   1092  1.15    rillig 
   1093  1.21    rillig 	// new style, small buffers
   1094  1.15    rillig 	h_snprintb_len(
   1095  1.29    rillig 	    0, "\177\020", 0x00,
   1096  1.16    rillig 	    1, "");
   1097  1.15    rillig 	h_snprintb_len(
   1098  1.29    rillig 	    1, "\177\020", 0x00,
   1099  1.16    rillig 	    1, "");
   1100  1.15    rillig 	h_snprintb_len(
   1101  1.29    rillig 	    2, "\177\020", 0x00,
   1102  1.16    rillig 	    1, "0");
   1103  1.15    rillig 	h_snprintb_len(
   1104  1.29    rillig 	    3, "\177\020", 0x00,
   1105  1.16    rillig 	    1, "0");
   1106  1.15    rillig 	h_snprintb_len(
   1107  1.29    rillig 	    3, "\177\020", 0x07,
   1108  1.31    rillig 	    3, "0#");
   1109  1.15    rillig 	h_snprintb_len(
   1110  1.29    rillig 	    4, "\177\020", 0x07,
   1111  1.16    rillig 	    3, "0x7");
   1112  1.15    rillig 	h_snprintb_len(
   1113  1.29    rillig 	    7, "\177\020b\000lsb\0", 0x07,
   1114  1.31    rillig 	    8, "0x7<l#");
   1115  1.15    rillig 	h_snprintb_len(
   1116  1.29    rillig 	    8, "\177\020b\000lsb\0", 0x07,
   1117  1.31    rillig 	    8, "0x7<ls#");
   1118  1.15    rillig 	h_snprintb_len(
   1119  1.29    rillig 	    9, "\177\020b\000lsb\0", 0x07,
   1120  1.16    rillig 	    8, "0x7<lsb>");
   1121  1.15    rillig 	h_snprintb_len(
   1122  1.29    rillig 	    9, "\177\020b\000one\0b\001two\0", 0x07,
   1123  1.31    rillig 	    12, "0x7<one#");
   1124  1.15    rillig 	h_snprintb_len(
   1125  1.29    rillig 	    10, "\177\020b\000one\0b\001two\0", 0x07,
   1126  1.31    rillig 	    12, "0x7<one,#");
   1127  1.15    rillig 	h_snprintb_len(
   1128  1.29    rillig 	    12, "\177\020b\000one\0b\001two\0", 0x07,
   1129  1.31    rillig 	    12, "0x7<one,tw#");
   1130  1.15    rillig 	h_snprintb_len(
   1131  1.29    rillig 	    13, "\177\020b\000one\0b\001two\0", 0x07,
   1132  1.16    rillig 	    12, "0x7<one,two>");
   1133   1.1      jmmv }
   1134   1.1      jmmv 
   1135   1.2  pgoyette ATF_TC(snprintb_m);
   1136   1.2  pgoyette ATF_TC_HEAD(snprintb_m, tc)
   1137   1.2  pgoyette {
   1138   1.2  pgoyette 	atf_tc_set_md_var(tc, "descr", "Checks snprintb_m(3)");
   1139   1.2  pgoyette }
   1140   1.2  pgoyette ATF_TC_BODY(snprintb_m, tc)
   1141   1.2  pgoyette {
   1142  1.21    rillig 
   1143  1.21    rillig 	// old style, line_max exceeded by number in line 1
   1144  1.21    rillig 	h_snprintb_m(
   1145  1.21    rillig 	    "\020",
   1146  1.21    rillig 	    0xff,
   1147  1.21    rillig 	    1,
   1148  1.24    rillig 	    "#\0");
   1149  1.21    rillig 
   1150  1.21    rillig 	// old style, line_max exceeded by '<' in line 1
   1151  1.21    rillig 	h_snprintb_m(
   1152  1.27    rillig 	    "\020"
   1153  1.27    rillig 	    "\001lsb",
   1154  1.21    rillig 	    0xff,
   1155  1.21    rillig 	    4,
   1156  1.27    rillig 	    "0xf#\0");
   1157  1.21    rillig 
   1158  1.27    rillig 	// old style, line_max exceeded by description
   1159  1.21    rillig 	h_snprintb_m(
   1160  1.21    rillig 	    "\020"
   1161  1.21    rillig 	    "\001bit1"
   1162  1.21    rillig 	    "\002bit2",
   1163  1.21    rillig 	    0xff,
   1164  1.27    rillig 	    7,
   1165  1.27    rillig 	    "0xff<b#\0"
   1166  1.27    rillig 	    "0xff<b#\0");
   1167  1.21    rillig 
   1168  1.21    rillig 	// old style, line_max exceeded by '>' in line 1
   1169  1.21    rillig 	h_snprintb_m(
   1170  1.13    rillig 	    "\020"
   1171  1.13    rillig 	    "\001bit1"
   1172  1.21    rillig 	    "\0022",
   1173  1.21    rillig 	    0xff,
   1174  1.21    rillig 	    9,
   1175  1.24    rillig 	    "0xff<bit#\0"
   1176  1.24    rillig 	    "0xff<2>\0");
   1177  1.21    rillig 
   1178  1.21    rillig 	// old style, line_max exceeded by description in line 2
   1179  1.21    rillig 	h_snprintb_m(
   1180  1.21    rillig 	    "\020"
   1181  1.21    rillig 	    "\0011"
   1182  1.21    rillig 	    "\002bit2",
   1183  1.21    rillig 	    0xff,
   1184  1.21    rillig 	    8,
   1185  1.21    rillig 	    "0xff<1>\0"
   1186  1.24    rillig 	    "0xff<bi#\0");
   1187  1.21    rillig 
   1188  1.21    rillig 	// old style, line_max exceeded by '>' in line 2
   1189  1.21    rillig 	h_snprintb_m(
   1190  1.21    rillig 	    "\020"
   1191  1.21    rillig 	    "\0011"
   1192  1.21    rillig 	    "\002bit2",
   1193  1.21    rillig 	    0xff,
   1194  1.21    rillig 	    9,
   1195  1.21    rillig 	    "0xff<1>\0"
   1196  1.24    rillig 	    "0xff<bit#\0");
   1197  1.21    rillig 
   1198  1.29    rillig 	// old style, complete
   1199  1.21    rillig 	h_snprintb_m(
   1200  1.21    rillig 	    "\020"
   1201  1.21    rillig 	    "\0011"
   1202  1.21    rillig 	    "\002bit2",
   1203  1.21    rillig 	    0xff,
   1204  1.21    rillig 	    10,
   1205  1.21    rillig 	    "0xff<1>\0"
   1206  1.21    rillig 	    "0xff<bit2>\0");
   1207  1.21    rillig 
   1208  1.21    rillig 	// new style, line_max exceeded by value in line 1
   1209  1.21    rillig 	h_snprintb_m(
   1210  1.21    rillig 	    "\177\020",
   1211  1.21    rillig 	    0xff,
   1212  1.29    rillig 	    3,
   1213  1.29    rillig 	    "0x#\0");
   1214  1.21    rillig 
   1215  1.21    rillig 	// new style, line_max exceeded by single-bit '<' in line 1
   1216  1.21    rillig 	h_snprintb_m(
   1217  1.21    rillig 	    "\177\020"
   1218  1.21    rillig 	    "b\000bit\0",
   1219  1.21    rillig 	    0xff,
   1220  1.21    rillig 	    4,
   1221  1.24    rillig 	    "0xf#\0");
   1222  1.21    rillig 
   1223  1.21    rillig 	// new style, line_max exceeded by single-bit description in line 1
   1224  1.21    rillig 	h_snprintb_m(
   1225  1.21    rillig 	    "\177\020"
   1226  1.21    rillig 	    "b\000bit0\0"
   1227  1.21    rillig 	    "b\001two\0",
   1228  1.21    rillig 	    0xff,
   1229  1.21    rillig 	    8,
   1230  1.24    rillig 	    "0xff<bi#\0"
   1231  1.24    rillig 	    "0xff<tw#\0");
   1232  1.21    rillig 
   1233  1.21    rillig 	// new style, line_max exceeded by single-bit '>' in line 1
   1234  1.21    rillig 	h_snprintb_m(
   1235  1.21    rillig 	    "\177\020"
   1236  1.21    rillig 	    "b\000bit0\0"
   1237  1.21    rillig 	    "b\001two\0",
   1238  1.21    rillig 	    0xff,
   1239  1.21    rillig 	    9,
   1240  1.24    rillig 	    "0xff<bit#\0"
   1241  1.24    rillig 	    "0xff<two>\0");
   1242  1.21    rillig 
   1243  1.21    rillig 	// new style, line_max exceeded by single-bit description in line 2
   1244  1.21    rillig 	h_snprintb_m(
   1245  1.21    rillig 	    "\177\020"
   1246  1.21    rillig 	    "b\000one\0"
   1247  1.21    rillig 	    "b\001three\0",
   1248  1.21    rillig 	    0xff,
   1249  1.21    rillig 	    9,
   1250  1.21    rillig 	    "0xff<one>\0"
   1251  1.24    rillig 	    "0xff<thr#\0");
   1252  1.21    rillig 
   1253  1.21    rillig 	// new style, line_max exceeded by single-bit '>' in line 2
   1254  1.21    rillig 	h_snprintb_m(
   1255  1.21    rillig 	    "\177\020"
   1256  1.21    rillig 	    "b\000one\0"
   1257  1.29    rillig 	    "b\001three\0",
   1258  1.21    rillig 	    0xff,
   1259  1.29    rillig 	    10,
   1260  1.21    rillig 	    "0xff<one>\0"
   1261  1.29    rillig 	    "0xff<thre#\0");
   1262  1.21    rillig 
   1263  1.21    rillig 	// new style, single-bit complete
   1264  1.21    rillig 	h_snprintb_m(
   1265  1.21    rillig 	    "\177\020"
   1266  1.21    rillig 	    "b\000one\0"
   1267  1.21    rillig 	    "b\001three\0",
   1268  1.21    rillig 	    0xff,
   1269  1.21    rillig 	    11,
   1270  1.21    rillig 	    "0xff<one>\0"
   1271  1.21    rillig 	    "0xff<three>\0");
   1272  1.21    rillig 
   1273  1.21    rillig 	// new style, line_max exceeded by named bit-field number in line 1
   1274  1.21    rillig 	h_snprintb_m(
   1275  1.21    rillig 	    "\177\020"
   1276  1.21    rillig 	    "f\000\004lo\0",
   1277  1.21    rillig 	    0xff,
   1278  1.21    rillig 	    3,
   1279  1.24    rillig 	    "0x#\0");
   1280  1.21    rillig 
   1281  1.21    rillig 	// new style, line_max exceeded by named bit-field '<' in line 1
   1282  1.21    rillig 	h_snprintb_m(
   1283  1.21    rillig 	    "\177\020"
   1284  1.21    rillig 	    "f\000\004lo\0",
   1285  1.21    rillig 	    0xff,
   1286  1.21    rillig 	    4,
   1287  1.24    rillig 	    "0xf#\0");
   1288  1.13    rillig 
   1289  1.29    rillig 	// new style, line_max exceeded by bit-field description in line 1
   1290  1.21    rillig 	h_snprintb_m(
   1291  1.13    rillig 	    "\177\020"
   1292  1.21    rillig 	    "f\000\004lo\0",
   1293  1.21    rillig 	    0xff,
   1294  1.13    rillig 	    6,
   1295  1.24    rillig 	    "0xff<#\0");
   1296  1.16    rillig 
   1297  1.21    rillig 	// new style, line_max exceeded by named bit-field '=' in line 1
   1298  1.21    rillig 	h_snprintb_m(
   1299  1.21    rillig 	    "\177\020"
   1300  1.21    rillig 	    "f\000\004lo\0",
   1301  1.21    rillig 	    0xff,
   1302  1.21    rillig 	    7,
   1303  1.24    rillig 	    "0xff<l#\0");
   1304  1.16    rillig 
   1305  1.21    rillig 	// new style, line_max exceeded by named bit-field value in line 1
   1306  1.21    rillig 	h_snprintb_m(
   1307  1.16    rillig 	    "\177\020"
   1308  1.21    rillig 	    "f\000\004lo\0",
   1309  1.16    rillig 	    0xff,
   1310  1.16    rillig 	    10,
   1311  1.24    rillig 	    "0xff<lo=0#\0");
   1312  1.21    rillig 
   1313  1.21    rillig 	// new style, line_max exceeded by named bit-field '=' in line 1
   1314  1.21    rillig 	h_snprintb_m(
   1315  1.21    rillig 	    "\177\020"
   1316  1.21    rillig 	    "f\000\004lo\0"
   1317  1.21    rillig 		"=\017match\0",
   1318  1.21    rillig 	    0xff,
   1319  1.29    rillig 	    12,
   1320  1.29    rillig 	    "0xff<lo=0xf#\0");
   1321  1.21    rillig 
   1322  1.27    rillig 	// new style, line_max exceeded by named bit-field value description in
   1323  1.27    rillig 	// line 1
   1324  1.21    rillig 	h_snprintb_m(
   1325  1.21    rillig 	    "\177\020"
   1326  1.21    rillig 	    "f\000\004lo\0"
   1327  1.21    rillig 		"=\017match\0",
   1328  1.21    rillig 	    0xff,
   1329  1.21    rillig 	    16,
   1330  1.24    rillig 	    "0xff<lo=0xf=mat#\0");
   1331  1.21    rillig 
   1332  1.21    rillig 	// new style, line_max exceeded by named bit-field '>' in line 1
   1333  1.21    rillig 	h_snprintb_m(
   1334  1.21    rillig 	    "\177\020"
   1335  1.21    rillig 	    "f\000\004lo\0"
   1336  1.21    rillig 		"=\017match\0",
   1337  1.21    rillig 	    0xff,
   1338  1.21    rillig 	    17,
   1339  1.24    rillig 	    "0xff<lo=0xf=matc#\0");
   1340  1.21    rillig 
   1341  1.29    rillig 	// new style, line_max exceeded by named bit-field description in
   1342  1.29    rillig 	// line 2
   1343  1.21    rillig 	h_snprintb_m(
   1344  1.21    rillig 	    "\177\020"
   1345  1.21    rillig 	    "f\000\004lo\0"
   1346  1.21    rillig 	    "f\000\004low-bits\0"
   1347  1.21    rillig 		"=\017match\0",
   1348  1.21    rillig 	    0xff,
   1349  1.21    rillig 	    12,
   1350  1.21    rillig 	    "0xff<lo=0xf>\0"
   1351  1.24    rillig 	    "0xff<low-bi#\0");
   1352  1.21    rillig 
   1353  1.21    rillig 	// new style, line_max exceeded by named bit-field '=' in line 2
   1354  1.21    rillig 	h_snprintb_m(
   1355  1.21    rillig 	    "\177\020"
   1356  1.21    rillig 	    "f\000\004lo\0"
   1357  1.21    rillig 	    "f\000\004low-bits\0"
   1358  1.21    rillig 		"=\017match\0",
   1359  1.21    rillig 	    0xff,
   1360  1.21    rillig 	    13,
   1361  1.21    rillig 	    "0xff<lo=0xf>\0"
   1362  1.24    rillig 	    "0xff<low-bit#\0");
   1363  1.21    rillig 
   1364  1.21    rillig 	// new style, line_max exceeded by named bit-field value in line 2
   1365  1.21    rillig 	h_snprintb_m(
   1366  1.21    rillig 	    "\177\020"
   1367  1.21    rillig 	    "f\000\004lo\0"
   1368  1.21    rillig 	    "f\000\004low-bits\0"
   1369  1.21    rillig 		"=\017match\0",
   1370  1.21    rillig 	    0xff,
   1371  1.21    rillig 	    16,
   1372  1.21    rillig 	    "0xff<lo=0xf>\0"
   1373  1.24    rillig 	    "0xff<low-bits=0#\0");
   1374  1.21    rillig 
   1375  1.21    rillig 	// new style, line_max exceeded by named bit-field '=' 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.29    rillig 	    18,
   1383  1.21    rillig 	    "0xff<lo=0xf>\0"
   1384  1.29    rillig 	    "0xff<low-bits=0xf#\0");
   1385  1.21    rillig 
   1386  1.27    rillig 	// new style, line_max exceeded by named bit-field value description
   1387  1.27    rillig 	// in line 2
   1388  1.21    rillig 	h_snprintb_m(
   1389  1.21    rillig 	    "\177\020"
   1390  1.21    rillig 	    "f\000\004lo\0"
   1391  1.21    rillig 	    "f\000\004low-bits\0"
   1392  1.21    rillig 		"=\017match\0",
   1393  1.21    rillig 	    0xff,
   1394  1.21    rillig 	    22,
   1395  1.21    rillig 	    "0xff<lo=0xf>\0"
   1396  1.24    rillig 	    "0xff<low-bits=0xf=mat#\0");
   1397  1.21    rillig 
   1398  1.21    rillig 	// new style, line_max exceeded by named bit-field '>' in line 2
   1399  1.21    rillig 	h_snprintb_m(
   1400  1.21    rillig 	    "\177\020"
   1401  1.21    rillig 	    "f\000\004lo\0"
   1402  1.21    rillig 	    "f\000\004low-bits\0"
   1403  1.21    rillig 		"=\017match\0",
   1404  1.21    rillig 	    0xff,
   1405  1.21    rillig 	    23,
   1406  1.21    rillig 	    "0xff<lo=0xf>\0"
   1407  1.24    rillig 	    "0xff<low-bits=0xf=matc#\0");
   1408  1.21    rillig 
   1409  1.21    rillig 	// new style, named bit-field complete
   1410  1.21    rillig 	h_snprintb_m(
   1411  1.21    rillig 	    "\177\020"
   1412  1.21    rillig 	    "f\000\004lo\0"
   1413  1.21    rillig 	    "f\000\004low-bits\0"
   1414  1.21    rillig 		"=\017match\0",
   1415  1.21    rillig 	    0xff,
   1416  1.21    rillig 	    24,
   1417  1.21    rillig 	    "0xff<lo=0xf>\0"
   1418  1.22    rillig 	    "0xff<low-bits=0xf=match>\0");
   1419  1.21    rillig 
   1420  1.21    rillig 	// new style, line_max exceeded by unnamed bit-field number in line 1
   1421  1.21    rillig 	h_snprintb_m(
   1422  1.21    rillig 	    "\177\020"
   1423  1.21    rillig 	    "F\000\004\0",
   1424  1.21    rillig 	    0xff,
   1425  1.21    rillig 	    3,
   1426  1.24    rillig 	    "0x#\0");
   1427  1.13    rillig 
   1428  1.21    rillig 	// new style, line_max exceeded by unnamed bit-field '<' in line 1
   1429  1.21    rillig 	h_snprintb_m(
   1430  1.15    rillig 	    "\177\020"
   1431  1.21    rillig 	    "F\000\004\0",
   1432  1.16    rillig 	    0xff,
   1433  1.21    rillig 	    4,
   1434  1.24    rillig 	    "0xf#\0");
   1435  1.16    rillig 
   1436  1.27    rillig 	// new style, line_max exceeded by unnamed bit-field value description
   1437  1.27    rillig 	// in line 1
   1438  1.21    rillig 	h_snprintb_m(
   1439  1.21    rillig 	    "\177\020"
   1440  1.21    rillig 	    "F\000\004\0"
   1441  1.21    rillig 		":\017match\0",
   1442  1.21    rillig 	    0xff,
   1443  1.16    rillig 	    9,
   1444  1.24    rillig 	    "0xff<mat#\0");
   1445  1.21    rillig 
   1446  1.21    rillig 	// new style, line_max exceeded by unnamed bit-field '>' in line 1
   1447  1.21    rillig 	h_snprintb_m(
   1448  1.16    rillig 	    "\177\020"
   1449  1.21    rillig 	    "F\000\004\0"
   1450  1.21    rillig 		":\017match\0",
   1451  1.16    rillig 	    0xff,
   1452  1.16    rillig 	    10,
   1453  1.24    rillig 	    "0xff<matc#\0");
   1454  1.16    rillig 
   1455  1.27    rillig 	// new style, line_max exceeded by unnamed bit-field value description
   1456  1.27    rillig 	// in line 2
   1457  1.21    rillig 	h_snprintb_m(
   1458  1.21    rillig 	    "\177\020"
   1459  1.21    rillig 	    "F\000\004\0"
   1460  1.21    rillig 		":\017m1\0"
   1461  1.21    rillig 		":\017match\0",
   1462  1.21    rillig 	    0xff,
   1463  1.16    rillig 	    10,
   1464  1.24    rillig 	    "0xff<m1ma#\0");
   1465  1.21    rillig 
   1466  1.21    rillig 	// new style, line_max exceeded by unnamed bit-field '>' in line 2
   1467  1.21    rillig 	h_snprintb_m(
   1468  1.16    rillig 	    "\177\020"
   1469  1.21    rillig 	    "F\000\004\0"
   1470  1.21    rillig 		":\017m1\0"
   1471  1.21    rillig 		":\017match\0",
   1472  1.16    rillig 	    0xff,
   1473  1.16    rillig 	    10,
   1474  1.24    rillig 	    "0xff<m1ma#\0");
   1475  1.16    rillig 
   1476  1.21    rillig 	// new style unnamed bit-field complete
   1477  1.21    rillig 	h_snprintb_m(
   1478  1.21    rillig 	    "\177\020"
   1479  1.21    rillig 	    "F\000\004\0"
   1480  1.21    rillig 		":\017m1\0"
   1481  1.21    rillig 		":\017match\0",
   1482  1.21    rillig 	    0xff,
   1483  1.27    rillig 	    13,
   1484  1.27    rillig 	    "0xff<m1match>\0");
   1485  1.21    rillig 
   1486  1.21    rillig 	// new style, line_max exceeded by bit-field default
   1487  1.21    rillig 	h_snprintb_m(
   1488  1.16    rillig 	    "\177\020"
   1489  1.21    rillig 	    "f\000\004f\0"
   1490  1.21    rillig 		"*=default\0",
   1491  1.16    rillig 	    0xff,
   1492  1.21    rillig 	    17,
   1493  1.24    rillig 	    "0xff<f=0xf=defau#\0");
   1494  1.16    rillig 
   1495  1.21    rillig 	// new style, line_max exceeded by unmatched field value
   1496  1.21    rillig 	h_snprintb_m(
   1497  1.16    rillig 	    "\177\020"
   1498  1.21    rillig 	    "f\000\004bits\0"
   1499  1.34    rillig 		"=\000zero\0",
   1500  1.16    rillig 	    0xff,
   1501  1.16    rillig 	    11,
   1502  1.24    rillig 	    "0xff<bits=#\0");
   1503  1.21    rillig 
   1504  1.29    rillig 	// example from the manual page, new style bits and fields
   1505  1.21    rillig 	h_snprintb_m(
   1506  1.21    rillig 	    "\177\020"
   1507  1.36    rillig 	    "b\000" "LSB\0"
   1508  1.36    rillig 	    "b\001" "BITONE\0"
   1509  1.36    rillig 	    "f\004\004" "NIBBLE2\0"
   1510  1.36    rillig 	    "f\020\004" "BURST\0"
   1511  1.36    rillig 		"=\x04" "FOUR\0"
   1512  1.36    rillig 		"=\x0f" "FIFTEEN\0"
   1513  1.36    rillig 	    "b\037" "MSB\0",
   1514  1.21    rillig 	    0x800f0701,
   1515  1.21    rillig 	    34,
   1516  1.21    rillig 	    "0x800f0701<LSB,NIBBLE2=0>\0"
   1517  1.22    rillig 	    "0x800f0701<BURST=0xf=FIFTEEN,MSB>\0");
   1518  1.16    rillig 
   1519  1.32    rillig 	// new style, missing number base
   1520  1.32    rillig 	h_snprintb_m_len(
   1521  1.32    rillig 	    1024,
   1522  1.32    rillig 	    "\177",
   1523  1.32    rillig 	    0xff,
   1524  1.32    rillig 	    128,
   1525  1.32    rillig 	    -1,
   1526  1.32    rillig 	    "#\0");
   1527  1.32    rillig 
   1528  1.21    rillig 	// new style, buffer too small for complete number in line 2
   1529  1.16    rillig 	h_snprintb_m_len(
   1530  1.16    rillig 	    15,
   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 	    "0x#\0");
   1539  1.16    rillig 
   1540  1.16    rillig 	// new-style format, buffer too small for '<' in line 2
   1541  1.16    rillig 	h_snprintb_m_len(
   1542  1.16    rillig 	    16,
   1543  1.16    rillig 	    "\177\020"
   1544  1.16    rillig 	    "b\000lsb\0"
   1545  1.16    rillig 	    "b\001two\0",
   1546  1.16    rillig 	    0xff,
   1547  1.16    rillig 	    11,
   1548  1.16    rillig 	    20,
   1549  1.16    rillig 	    "0xff<lsb>\0"
   1550  1.31    rillig 	    "0xf#\0");
   1551  1.16    rillig 
   1552  1.31    rillig 	// new-style format, buffer too small for textual fallback
   1553  1.31    rillig 	h_snprintb_m_len(
   1554  1.31    rillig 	    24,
   1555  1.16    rillig 	    "\177\020"
   1556  1.16    rillig 	    "f\000\004bits\0"
   1557  1.16    rillig 		"*=fallback\0"
   1558  1.16    rillig 	    "b\0024\0",
   1559  1.16    rillig 	    0xff,
   1560  1.16    rillig 	    64,
   1561  1.31    rillig 	    26,
   1562  1.31    rillig 	    "0xff<bits=0xf=fallbac#\0");
   1563  1.15    rillig 
   1564  1.19    rillig 	// new-style format, buffer too small for numeric fallback
   1565  1.19    rillig 	h_snprintb_m_len(
   1566  1.19    rillig 	    20,
   1567  1.19    rillig 	    "\177\020"
   1568  1.19    rillig 	    "F\000\004\0"
   1569  1.19    rillig 		"*fallback(%040jd)\0",
   1570  1.19    rillig 	    0xff,
   1571  1.19    rillig 	    64,
   1572  1.19    rillig 	    57,
   1573  1.31    rillig 	    "0xff<fallback(000#\0");
   1574  1.19    rillig 
   1575  1.19    rillig 	// new-style format, buffer too small for numeric fallback past buffer
   1576  1.19    rillig 	h_snprintb_m_len(
   1577  1.19    rillig 	    15,
   1578  1.19    rillig 	    "\177\020"
   1579  1.19    rillig 	    "F\000\004\0"
   1580  1.19    rillig 		"*fallback(%010jd)\0"
   1581  1.19    rillig 	    "F\004\004\0"
   1582  1.19    rillig 		"*fallback(%010jd)\0",
   1583  1.19    rillig 	    0xff,
   1584  1.19    rillig 	    64,
   1585  1.19    rillig 	    48,
   1586  1.31    rillig 	    "0xff<fallbac#\0");
   1587  1.19    rillig 
   1588  1.21    rillig 	// new style, bits and fields, line break between fields
   1589   1.9    rillig 	h_snprintb_m(
   1590   1.9    rillig 	    "\177\020"
   1591   1.9    rillig 	    "b\0LSB\0"
   1592   1.9    rillig 	    "b\1_BITONE\0"
   1593   1.9    rillig 	    "f\4\4NIBBLE2\0"
   1594   1.9    rillig 	    "f\x10\4BURST\0"
   1595   1.9    rillig 		"=\04FOUR\0"
   1596   1.9    rillig 		"=\17FIFTEEN\0"
   1597   1.9    rillig 	    "b\x1fMSB\0",
   1598   1.9    rillig 	    0x800f0701,
   1599   1.9    rillig 	    33,
   1600   1.9    rillig 	    "0x800f0701<LSB,NIBBLE2=0>\0"
   1601  1.29    rillig 	    "0x800f0701<BURST=0xf=FIFTEEN,MSB>\0");
   1602   1.9    rillig 
   1603  1.21    rillig 	// new style, bits and fields, line break after field description
   1604   1.9    rillig 	h_snprintb_m(
   1605   1.9    rillig 	    "\177\020"
   1606   1.9    rillig 	    "b\0LSB\0"
   1607   1.9    rillig 	    "b\1_BITONE\0"
   1608   1.9    rillig 	    "f\4\4NIBBLE2\0"
   1609  1.29    rillig 	    "f\020\4BURST\0"
   1610   1.9    rillig 		"=\04FOUR\0"
   1611   1.9    rillig 		"=\17FIFTEEN\0"
   1612  1.29    rillig 	    "b\037MSB\0",
   1613   1.9    rillig 	    0x800f0701,
   1614   1.9    rillig 	    32,
   1615   1.9    rillig 	    "0x800f0701<LSB,NIBBLE2=0>\0"
   1616   1.9    rillig 	    "0x800f0701<BURST=0xf=FIFTEEN>\0"
   1617   1.9    rillig 	    "0x800f0701<MSB>\0");
   1618   1.2  pgoyette }
   1619   1.2  pgoyette 
   1620   1.1      jmmv ATF_TP_ADD_TCS(tp)
   1621   1.1      jmmv {
   1622   1.1      jmmv 
   1623   1.1      jmmv 	ATF_TP_ADD_TC(tp, snprintb);
   1624   1.2  pgoyette 	ATF_TP_ADD_TC(tp, snprintb_m);
   1625   1.1      jmmv 
   1626   1.1      jmmv 	return atf_no_error();
   1627   1.1      jmmv }
   1628