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