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