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