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