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