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