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