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