1 1.38 rillig /* $NetBSD: t_snprintb.c,v 1.38 2025/08/24 16:19:31 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.38 rillig __RCSID("$NetBSD: t_snprintb.c,v 1.38 2025/08/24 16:19:31 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.38 rillig // A bit-field that does not match any values generates multiple 682 1.38 rillig // commas in a row, which looks confusing. The ':' conversions should 683 1.38 rillig // either be exhaustive, or there should be a '*' catch-all 684 1.38 rillig // conversion. 685 1.21 rillig h_snprintb( 686 1.21 rillig "\177\020" 687 1.21 rillig "b\000bit0\0" 688 1.21 rillig "F\000\004\0" 689 1.21 rillig ":\1one\0" 690 1.21 rillig ":\2two\0" 691 1.21 rillig "b\001bit1\0", 692 1.21 rillig 0x3, 693 1.21 rillig "0x3<bit0,,bit1>"); 694 1.21 rillig 695 1.25 rillig // new style bit-field, '=', can never match 696 1.29 rillig // 697 1.29 rillig // The extracted value from the bit-field has 7 bits and is thus less 698 1.29 rillig // than 128, therefore it can neither match 128 nor 255. 699 1.25 rillig h_snprintb( 700 1.25 rillig "\177\020" 701 1.25 rillig "f\000\007f\0" 702 1.25 rillig "=\200never\0" 703 1.25 rillig "=\377never\0", 704 1.25 rillig 0xff, 705 1.25 rillig "0xff<f=0x7f>"); 706 1.25 rillig 707 1.21 rillig // new style, two separate bit-fields 708 1.9 rillig h_snprintb( 709 1.9 rillig "\177\020" 710 1.21 rillig "f\000\004f1\0" 711 1.21 rillig "=\001one\0" 712 1.21 rillig "=\002two\0" 713 1.21 rillig "f\004\004f2\0" 714 1.21 rillig "=\001one\0" 715 1.21 rillig "=\002two\0", 716 1.21 rillig 0x12, 717 1.21 rillig "0x12<f1=0x2=two,f2=0x1=one>"); 718 1.21 rillig 719 1.21 rillig // new style, mixed named and unnamed bit-fields 720 1.21 rillig h_snprintb( 721 1.21 rillig "\177\020" 722 1.21 rillig "f\000\004f1\0" 723 1.21 rillig "=\001one\0" 724 1.21 rillig "=\002two\0" 725 1.10 rillig "F\010\004\0" 726 1.21 rillig ":\015thirteen\0" 727 1.21 rillig "f\004\004f2\0" 728 1.21 rillig "=\001one\0" 729 1.21 rillig "=\002two\0", 730 1.21 rillig 0x0d12, 731 1.21 rillig "0xd12<f1=0x2=two,thirteen,f2=0x1=one>"); 732 1.21 rillig 733 1.21 rillig // new style bit-field, overlapping 734 1.21 rillig h_snprintb( 735 1.21 rillig "\177\020" 736 1.21 rillig "f\000\004lo\0" 737 1.21 rillig "f\002\004mid\0" 738 1.21 rillig "f\004\004hi\0" 739 1.21 rillig "f\000\010all\0", 740 1.21 rillig 0x18, 741 1.21 rillig "0x18<lo=0x8,mid=0x6,hi=0x1,all=0x18>"); 742 1.21 rillig 743 1.21 rillig // new style bit-field, difference between '=' and ':' 744 1.21 rillig // 745 1.38 rillig // The ':' conversion can almost emulate the '=' conversion by 746 1.38 rillig // starting its description with '=', excluding the numeric value of 747 1.38 rillig // the field. The 'f' and '=' conversions mix well, and so do 'F' and 748 1.38 rillig // ':'. Other combinations don't mix well and are thus erroneous. 749 1.21 rillig h_snprintb( 750 1.21 rillig "\177\020" 751 1.21 rillig "f\000\004field\0" 752 1.29 rillig "=\010f-value\0" 753 1.29 rillig "F\000\000\0" // Use an empty bit-field 754 1.29 rillig ":\000separator\0" // to generate a separator. 755 1.21 rillig "F\000\004\0" 756 1.29 rillig ":\010F-value\0", 757 1.21 rillig 0x18, 758 1.29 rillig "0x18<field=0x8=f-value,separator,F-value>"); 759 1.21 rillig 760 1.21 rillig // new style bit-field default, fixed string 761 1.21 rillig // 762 1.37 rillig // When used with the 'f' conversion, the '*' conversion should 763 1.37 rillig // start with '=' to match the rest of the format. 764 1.37 rillig // 765 1.37 rillig // When used with the 'F' conversion, the '*' conversion should not 766 1.37 rillig // start with '=' to avoid the wrong punctuation ',=' in the output. 767 1.21 rillig h_snprintb( 768 1.21 rillig "\177\020" 769 1.21 rillig "f\030\010f1\0" 770 1.37 rillig "*default-f\0" 771 1.21 rillig "f\020\010f2\0" 772 1.37 rillig "*=default-f\0" 773 1.21 rillig "F\010\010\0" 774 1.37 rillig "*default-F\0" 775 1.21 rillig "F\010\010\0" 776 1.37 rillig "*=default-F\0", 777 1.21 rillig 0x11223344, 778 1.37 rillig "0x11223344<f1=0x11default-f,f2=0x22=default-f,default-F,=default-F>"); 779 1.21 rillig 780 1.21 rillig // new style bit-field default, numeric conversion specifier 781 1.21 rillig h_snprintb( 782 1.21 rillig "\177\020" 783 1.21 rillig "f\010\010f\0" 784 1.21 rillig "*=f(%ju)\0" 785 1.21 rillig "F\000\010F\0" 786 1.21 rillig "*F(%ju)\0", 787 1.21 rillig 0x1122, 788 1.21 rillig "0x1122<f=0x11=f(17),F(34)>"); 789 1.21 rillig 790 1.25 rillig // new style bit-field default, can never match 791 1.29 rillig // 792 1.38 rillig // The '=' conversions are exhaustive, making the '*' redundant. 793 1.25 rillig h_snprintb( 794 1.25 rillig "\177\020" 795 1.25 rillig "f\010\002f\0" 796 1.25 rillig "=\000zero\0" 797 1.25 rillig "=\001one\0" 798 1.25 rillig "=\002two\0" 799 1.25 rillig "=\003three\0" 800 1.29 rillig "*default\0", 801 1.25 rillig 0xff00, 802 1.25 rillig "0xff00<f=0x3=three>"); 803 1.25 rillig 804 1.21 rillig // new style bit-field default, invalid conversion specifier 805 1.21 rillig // 806 1.21 rillig // There is no reliable way to make snprintf return an error, as such 807 1.21 rillig // errors are defined as undefined behavior in the C standard. 808 1.21 rillig // Instead, here's a conversion specifier that produces a literal '%'. 809 1.21 rillig h_snprintb( 810 1.21 rillig "\177\020" 811 1.21 rillig "f\000\010f\0" 812 1.21 rillig "*=%030ju%%\0", 813 1.21 rillig 0xff, 814 1.21 rillig "0xff<f=0xff=000000000000000000000000000255%>"); 815 1.21 rillig 816 1.35 rillig // new style unknown conversion, at the beginning 817 1.34 rillig h_snprintb_val_error( 818 1.30 rillig "\177\020" 819 1.30 rillig "unknown\0", 820 1.30 rillig 0xff, 821 1.30 rillig "0xff#"); 822 1.30 rillig 823 1.35 rillig // new style unknown conversion, after a known conversion 824 1.34 rillig h_snprintb_val_error( 825 1.21 rillig "\177\020" 826 1.30 rillig "b\007msb\0" 827 1.30 rillig "unknown\0", 828 1.21 rillig 0xff, 829 1.30 rillig "0xff<msb#"); 830 1.21 rillig 831 1.21 rillig // new style combinations, 'b' '=' 832 1.21 rillig // 833 1.34 rillig // A '=' conversion requires a preceding 'f' conversion. 834 1.34 rillig h_snprintb_val_error( 835 1.21 rillig "\177\020" 836 1.21 rillig "b\004bit4\0" 837 1.21 rillig "=\000clear\0" 838 1.21 rillig "=\001set\0" 839 1.21 rillig "=\245complete\0" 840 1.21 rillig "b\000bit0\0" 841 1.21 rillig "=\000clear\0" 842 1.21 rillig "=\001set\0" 843 1.21 rillig "=\245complete\0", 844 1.21 rillig 0xa5, 845 1.34 rillig "0xa5#"); 846 1.21 rillig 847 1.21 rillig // new style combinations, 'b' ':' 848 1.21 rillig // 849 1.34 rillig // A ':' conversion requires a preceding 'f' or 'F' conversion. 850 1.34 rillig h_snprintb_val_error( 851 1.21 rillig "\177\020" 852 1.21 rillig "b\004bit4\0" 853 1.21 rillig ":\000clear\0" 854 1.21 rillig ":\001set\0" 855 1.21 rillig ":\245complete\0" 856 1.21 rillig "b\000bit0\0" 857 1.21 rillig ":\000clear\0" 858 1.21 rillig ":\001set\0" 859 1.21 rillig ":\245complete\0", 860 1.21 rillig 0xa5, 861 1.34 rillig "0xa5#"); 862 1.21 rillig 863 1.21 rillig // new style combinations, 'b' '*' 864 1.21 rillig // 865 1.34 rillig // A '*' conversion requires a preceding 'f' or 'F' conversion. 866 1.34 rillig h_snprintb_val_error( 867 1.21 rillig "\177\020" 868 1.21 rillig "b\004bit4\0" 869 1.21 rillig "*default(%ju)\0" 870 1.21 rillig "b\000bit0\0" 871 1.21 rillig "*default(%ju)\0", 872 1.21 rillig 0xa5, 873 1.34 rillig "0xa5#"); 874 1.21 rillig 875 1.21 rillig // new style combinations, 'f' 'b' '=' 876 1.21 rillig // 877 1.34 rillig // A '=' conversion requires a preceding 'f' conversion, there must 878 1.34 rillig // not be a 'b' conversion in between. 879 1.34 rillig h_snprintb_val_error( 880 1.21 rillig "\177\020" 881 1.21 rillig "f\000\010f\0" 882 1.21 rillig "b\005bit5\0" 883 1.29 rillig "=\245match\0", 884 1.21 rillig 0xa5, 885 1.34 rillig "0xa5<f=0xa5,bit5#"); 886 1.21 rillig 887 1.34 rillig // new style combinations, 'F' 'b' ':' 888 1.21 rillig // 889 1.34 rillig // A ':' conversion requires a preceding 'F' conversion, there must 890 1.34 rillig // not be a 'b' conversion in between. 891 1.34 rillig // 892 1.34 rillig // The isolated leading comma is produced by the non-exhaustive 'F' 893 1.34 rillig // conversion. Detecting these at runtime would be too costly. 894 1.34 rillig h_snprintb_val_error( 895 1.21 rillig "\177\020" 896 1.34 rillig "F\000\010f\0" 897 1.21 rillig "b\005bit5\0" 898 1.29 rillig ":\245match\0", 899 1.21 rillig 0xa5, 900 1.34 rillig "0xa5<,bit5#"); 901 1.21 rillig 902 1.21 rillig // new style combinations, 'f' ':' 903 1.29 rillig // 904 1.34 rillig // The ':' conversion requires a preceding 'F' conversion, not 'f'. 905 1.34 rillig h_snprintb_val_error( 906 1.21 rillig "\177\20" 907 1.21 rillig "f\000\004nibble\0" 908 1.21 rillig ":\001one\0", 909 1.21 rillig 0x01, 910 1.34 rillig "0x1<nibble=0x1#"); 911 1.6 kre 912 1.21 rillig // new style combinations, 'F' '=' 913 1.21 rillig // 914 1.34 rillig // A '=' conversion requires a preceding 'f' conversion, not 'F'. 915 1.34 rillig h_snprintb_val_error( 916 1.9 rillig "\177\20" 917 1.21 rillig "F\000\004\0" 918 1.21 rillig "=\001one\0", 919 1.21 rillig 0x01, 920 1.34 rillig "0x1<#"); 921 1.21 rillig 922 1.21 rillig // new style combinations, '=' 923 1.21 rillig // 924 1.34 rillig // A '=' conversion requires a preceding 'f' or 'F' conversion. 925 1.34 rillig h_snprintb_val_error( 926 1.21 rillig "\177\020" 927 1.29 rillig "=\245match\0", 928 1.21 rillig 0xa5, 929 1.34 rillig "0xa5#"); 930 1.21 rillig 931 1.21 rillig // new style combinations, ':' 932 1.21 rillig // 933 1.34 rillig // A ':' conversion requires a preceding 'f' or 'F' conversion. 934 1.34 rillig h_snprintb_val_error( 935 1.21 rillig "\177\020" 936 1.29 rillig ":\245match\0", 937 1.21 rillig 0xa5, 938 1.34 rillig "0xa5#"); 939 1.21 rillig 940 1.21 rillig // new style combinations, '*' 941 1.21 rillig // 942 1.34 rillig // A '*' conversion requires a preceding 'f' or 'F' conversion. 943 1.34 rillig h_snprintb_val_error( 944 1.21 rillig "\177\020" 945 1.21 rillig "*match\0", 946 1.21 rillig 0xa5, 947 1.34 rillig "0xa5#"); 948 1.21 rillig 949 1.21 rillig // new style combinations, 'f' '*' '=' 950 1.21 rillig // 951 1.38 rillig // After a catch-all '*' conversion, there must not be further '=' 952 1.35 rillig // conversions. 953 1.35 rillig h_snprintb_val_error( 954 1.21 rillig "\177\020" 955 1.21 rillig "f\000\010f\0" 956 1.21 rillig "*=default\0" 957 1.29 rillig "=\245match\0", 958 1.21 rillig 0xa5, 959 1.35 rillig "0xa5<f=0xa5=default#"); 960 1.21 rillig 961 1.21 rillig // new style combinations, 'F' '*' ':' 962 1.21 rillig // 963 1.35 rillig // After a catch-all '*' conversion, there must not be further ':' 964 1.35 rillig // conversions. 965 1.35 rillig h_snprintb_val_error( 966 1.21 rillig "\177\020" 967 1.21 rillig "F\000\010F\0" 968 1.21 rillig "*default\0" 969 1.29 rillig ":\245-match\0", 970 1.21 rillig 0xa5, 971 1.35 rillig "0xa5<default#"); 972 1.21 rillig 973 1.35 rillig // new style combinations, 'f' '*' '*' 974 1.21 rillig // 975 1.35 rillig // After a catch-all '*' conversion, there must not be further '=' or 976 1.35 rillig // '*' conversions. 977 1.35 rillig h_snprintb_val_error( 978 1.21 rillig "\177\020" 979 1.21 rillig "f\000\010f\0" 980 1.21 rillig "*=default-f\0" 981 1.35 rillig "*ignored\0", 982 1.35 rillig 0xa5, 983 1.35 rillig "0xa5<f=0xa5=default-f#"); 984 1.35 rillig 985 1.35 rillig // new style combinations, 'F' '*' '*' 986 1.35 rillig // 987 1.35 rillig // After a catch-all '*' conversion, there must not be further ':' or 988 1.35 rillig // '*' conversions. 989 1.35 rillig h_snprintb_val_error( 990 1.35 rillig "\177\020" 991 1.21 rillig "F\000\010\0" 992 1.21 rillig "*default-F\0" 993 1.21 rillig "*ignored\0", 994 1.21 rillig 0xa5, 995 1.35 rillig "0xa5<default-F#"); 996 1.21 rillig 997 1.29 rillig // example from the manual page, old style octal 998 1.21 rillig h_snprintb( 999 1.36 rillig "\010\002BITTWO\001BITONE", 1000 1.29 rillig 0x03, 1001 1.21 rillig "03<BITTWO,BITONE>"); 1002 1.21 rillig 1003 1.29 rillig // example from the manual page, old style hexadecimal 1004 1.29 rillig // 1005 1.29 rillig // When using a hexadecimal escape sequence to encode a bit number, 1006 1.29 rillig // the description must not start with a hexadecimal digit, or that 1007 1.29 rillig // digit is interpreted as part of the bit number. To prevent this, 1008 1.29 rillig // the bit number and the description need to be written as separate 1009 1.29 rillig // string literals. 1010 1.21 rillig h_snprintb( 1011 1.36 rillig "\x10" 1012 1.36 rillig "\x10" "NOTBOOT" 1013 1.36 rillig "\x0f" "FPP" 1014 1.36 rillig "\x0e" "SDVMA" 1015 1.36 rillig "\x0c" "VIDEO" 1016 1.36 rillig "\x0b" "LORES" 1017 1.36 rillig "\x0a" "FPA" 1018 1.36 rillig "\x09" "DIAG" 1019 1.36 rillig "\x07" "CACHE" 1020 1.36 rillig "\x06" "IOCACHE" 1021 1.36 rillig "\x05" "LOOPBACK" 1022 1.36 rillig "\x04" "DBGCACHE", 1023 1.21 rillig 0xe860, 1024 1.21 rillig "0xe860<NOTBOOT,FPP,SDVMA,VIDEO,CACHE,IOCACHE>"); 1025 1.21 rillig 1026 1.29 rillig // example from the manual page, new style bits and fields 1027 1.21 rillig h_snprintb( 1028 1.21 rillig "\177\020" 1029 1.36 rillig "b\000" "LSB\0" 1030 1.36 rillig "b\001" "BITONE\0" 1031 1.36 rillig "f\004\004" "NIBBLE2\0" 1032 1.36 rillig "f\020\004" "BURST\0" 1033 1.36 rillig "=\x04" "FOUR\0" 1034 1.36 rillig "=\x0f" "FIFTEEN\0" 1035 1.36 rillig "b\037" "MSB\0", 1036 1.21 rillig 0x800f0701, 1037 1.21 rillig "0x800f0701<LSB,NIBBLE2=0,BURST=0xf=FIFTEEN,MSB>"); 1038 1.6 kre 1039 1.29 rillig // example from the manual page, new style mmap 1040 1.21 rillig #define MAP_FMT \ 1041 1.21 rillig "\177\020" \ 1042 1.21 rillig "b\0" "SHARED\0" \ 1043 1.21 rillig "b\1" "PRIVATE\0" \ 1044 1.21 rillig "b\2" "COPY\0" \ 1045 1.21 rillig "b\4" "FIXED\0" \ 1046 1.21 rillig "b\5" "RENAME\0" \ 1047 1.21 rillig "b\6" "NORESERVE\0" \ 1048 1.21 rillig "b\7" "INHERIT\0" \ 1049 1.21 rillig "b\11" "HASSEMAPHORE\0" \ 1050 1.21 rillig "b\12" "TRYFIXED\0" \ 1051 1.21 rillig "b\13" "WIRED\0" \ 1052 1.21 rillig "F\14\1\0" \ 1053 1.21 rillig ":\0" "FILE\0" \ 1054 1.21 rillig ":\1" "ANONYMOUS\0" \ 1055 1.21 rillig "b\15" "STACK\0" \ 1056 1.21 rillig "F\30\010\0" \ 1057 1.21 rillig ":\000" "ALIGN=NONE\0" \ 1058 1.21 rillig ":\015" "ALIGN=8KB\0" \ 1059 1.21 rillig "*" "ALIGN=2^%ju\0" 1060 1.21 rillig h_snprintb( 1061 1.21 rillig MAP_FMT, 1062 1.21 rillig 0x0d001234, 1063 1.21 rillig "0xd001234<COPY,FIXED,RENAME,HASSEMAPHORE,ANONYMOUS,ALIGN=8KB>"); 1064 1.21 rillig h_snprintb( 1065 1.21 rillig MAP_FMT, 1066 1.21 rillig 0x2e000000, 1067 1.21 rillig "0x2e000000<FILE,ALIGN=2^46>"); 1068 1.10 rillig 1069 1.9 rillig // It is possible but cumbersome to implement a reduced variant of 1070 1.9 rillig // rot13 using snprintb, shown here for lowercase letters only. 1071 1.9 rillig for (char ch = 'A'; ch <= '~'; ch++) { 1072 1.9 rillig char rot13 = ch >= 'a' && ch <= 'm' ? ch + 13 1073 1.9 rillig : ch >= 'n' && ch <= 'z' ? ch - 13 1074 1.9 rillig : '?'; 1075 1.9 rillig char expected[8]; 1076 1.9 rillig ATF_REQUIRE_EQ(7, 1077 1.9 rillig snprintf(expected, sizeof(expected), "%#x<%c>", ch, rot13)); 1078 1.9 rillig h_snprintb( 1079 1.9 rillig "\177\020" 1080 1.9 rillig "F\000\010\0" 1081 1.9 rillig ":an\0:bo\0:cp\0:dq\0:er\0:fs\0:gt\0:hu\0" 1082 1.9 rillig ":iv\0:jw\0:kx\0:ly\0:mz\0" 1083 1.9 rillig ":na\0:ob\0:pc\0:qd\0:re\0:sf\0:tg\0:uh\0" 1084 1.9 rillig ":vi\0:wj\0:xk\0:yl\0:zm\0" 1085 1.9 rillig // If snprintf accepted "%jc", it would be possible to 1086 1.9 rillig // echo the non-alphabetic characters instead of a 1087 1.9 rillig // catchall question mark. 1088 1.9 rillig "*?\0", 1089 1.9 rillig ch, 1090 1.9 rillig expected); 1091 1.9 rillig } 1092 1.15 rillig 1093 1.21 rillig // new style, small buffers 1094 1.15 rillig h_snprintb_len( 1095 1.29 rillig 0, "\177\020", 0x00, 1096 1.16 rillig 1, ""); 1097 1.15 rillig h_snprintb_len( 1098 1.29 rillig 1, "\177\020", 0x00, 1099 1.16 rillig 1, ""); 1100 1.15 rillig h_snprintb_len( 1101 1.29 rillig 2, "\177\020", 0x00, 1102 1.16 rillig 1, "0"); 1103 1.15 rillig h_snprintb_len( 1104 1.29 rillig 3, "\177\020", 0x00, 1105 1.16 rillig 1, "0"); 1106 1.15 rillig h_snprintb_len( 1107 1.29 rillig 3, "\177\020", 0x07, 1108 1.31 rillig 3, "0#"); 1109 1.15 rillig h_snprintb_len( 1110 1.29 rillig 4, "\177\020", 0x07, 1111 1.16 rillig 3, "0x7"); 1112 1.15 rillig h_snprintb_len( 1113 1.29 rillig 7, "\177\020b\000lsb\0", 0x07, 1114 1.31 rillig 8, "0x7<l#"); 1115 1.15 rillig h_snprintb_len( 1116 1.29 rillig 8, "\177\020b\000lsb\0", 0x07, 1117 1.31 rillig 8, "0x7<ls#"); 1118 1.15 rillig h_snprintb_len( 1119 1.29 rillig 9, "\177\020b\000lsb\0", 0x07, 1120 1.16 rillig 8, "0x7<lsb>"); 1121 1.15 rillig h_snprintb_len( 1122 1.29 rillig 9, "\177\020b\000one\0b\001two\0", 0x07, 1123 1.31 rillig 12, "0x7<one#"); 1124 1.15 rillig h_snprintb_len( 1125 1.29 rillig 10, "\177\020b\000one\0b\001two\0", 0x07, 1126 1.31 rillig 12, "0x7<one,#"); 1127 1.15 rillig h_snprintb_len( 1128 1.29 rillig 12, "\177\020b\000one\0b\001two\0", 0x07, 1129 1.31 rillig 12, "0x7<one,tw#"); 1130 1.15 rillig h_snprintb_len( 1131 1.29 rillig 13, "\177\020b\000one\0b\001two\0", 0x07, 1132 1.16 rillig 12, "0x7<one,two>"); 1133 1.1 jmmv } 1134 1.1 jmmv 1135 1.2 pgoyette ATF_TC(snprintb_m); 1136 1.2 pgoyette ATF_TC_HEAD(snprintb_m, tc) 1137 1.2 pgoyette { 1138 1.2 pgoyette atf_tc_set_md_var(tc, "descr", "Checks snprintb_m(3)"); 1139 1.2 pgoyette } 1140 1.2 pgoyette ATF_TC_BODY(snprintb_m, tc) 1141 1.2 pgoyette { 1142 1.21 rillig 1143 1.21 rillig // old style, line_max exceeded by number in line 1 1144 1.21 rillig h_snprintb_m( 1145 1.21 rillig "\020", 1146 1.21 rillig 0xff, 1147 1.21 rillig 1, 1148 1.24 rillig "#\0"); 1149 1.21 rillig 1150 1.21 rillig // old style, line_max exceeded by '<' in line 1 1151 1.21 rillig h_snprintb_m( 1152 1.27 rillig "\020" 1153 1.27 rillig "\001lsb", 1154 1.21 rillig 0xff, 1155 1.21 rillig 4, 1156 1.27 rillig "0xf#\0"); 1157 1.21 rillig 1158 1.27 rillig // old style, line_max exceeded by description 1159 1.21 rillig h_snprintb_m( 1160 1.21 rillig "\020" 1161 1.21 rillig "\001bit1" 1162 1.21 rillig "\002bit2", 1163 1.21 rillig 0xff, 1164 1.27 rillig 7, 1165 1.27 rillig "0xff<b#\0" 1166 1.27 rillig "0xff<b#\0"); 1167 1.21 rillig 1168 1.21 rillig // old style, line_max exceeded by '>' in line 1 1169 1.21 rillig h_snprintb_m( 1170 1.13 rillig "\020" 1171 1.13 rillig "\001bit1" 1172 1.21 rillig "\0022", 1173 1.21 rillig 0xff, 1174 1.21 rillig 9, 1175 1.24 rillig "0xff<bit#\0" 1176 1.24 rillig "0xff<2>\0"); 1177 1.21 rillig 1178 1.21 rillig // old style, line_max exceeded by description in line 2 1179 1.21 rillig h_snprintb_m( 1180 1.21 rillig "\020" 1181 1.21 rillig "\0011" 1182 1.21 rillig "\002bit2", 1183 1.21 rillig 0xff, 1184 1.21 rillig 8, 1185 1.21 rillig "0xff<1>\0" 1186 1.24 rillig "0xff<bi#\0"); 1187 1.21 rillig 1188 1.21 rillig // old style, line_max exceeded by '>' in line 2 1189 1.21 rillig h_snprintb_m( 1190 1.21 rillig "\020" 1191 1.21 rillig "\0011" 1192 1.21 rillig "\002bit2", 1193 1.21 rillig 0xff, 1194 1.21 rillig 9, 1195 1.21 rillig "0xff<1>\0" 1196 1.24 rillig "0xff<bit#\0"); 1197 1.21 rillig 1198 1.29 rillig // old style, complete 1199 1.21 rillig h_snprintb_m( 1200 1.21 rillig "\020" 1201 1.21 rillig "\0011" 1202 1.21 rillig "\002bit2", 1203 1.21 rillig 0xff, 1204 1.21 rillig 10, 1205 1.21 rillig "0xff<1>\0" 1206 1.21 rillig "0xff<bit2>\0"); 1207 1.21 rillig 1208 1.21 rillig // new style, line_max exceeded by value in line 1 1209 1.21 rillig h_snprintb_m( 1210 1.21 rillig "\177\020", 1211 1.21 rillig 0xff, 1212 1.29 rillig 3, 1213 1.29 rillig "0x#\0"); 1214 1.21 rillig 1215 1.21 rillig // new style, line_max exceeded by single-bit '<' in line 1 1216 1.21 rillig h_snprintb_m( 1217 1.21 rillig "\177\020" 1218 1.21 rillig "b\000bit\0", 1219 1.21 rillig 0xff, 1220 1.21 rillig 4, 1221 1.24 rillig "0xf#\0"); 1222 1.21 rillig 1223 1.21 rillig // new style, line_max exceeded by single-bit description in line 1 1224 1.21 rillig h_snprintb_m( 1225 1.21 rillig "\177\020" 1226 1.21 rillig "b\000bit0\0" 1227 1.21 rillig "b\001two\0", 1228 1.21 rillig 0xff, 1229 1.21 rillig 8, 1230 1.24 rillig "0xff<bi#\0" 1231 1.24 rillig "0xff<tw#\0"); 1232 1.21 rillig 1233 1.21 rillig // new style, line_max exceeded by single-bit '>' in line 1 1234 1.21 rillig h_snprintb_m( 1235 1.21 rillig "\177\020" 1236 1.21 rillig "b\000bit0\0" 1237 1.21 rillig "b\001two\0", 1238 1.21 rillig 0xff, 1239 1.21 rillig 9, 1240 1.24 rillig "0xff<bit#\0" 1241 1.24 rillig "0xff<two>\0"); 1242 1.21 rillig 1243 1.21 rillig // new style, line_max exceeded by single-bit description in line 2 1244 1.21 rillig h_snprintb_m( 1245 1.21 rillig "\177\020" 1246 1.21 rillig "b\000one\0" 1247 1.21 rillig "b\001three\0", 1248 1.21 rillig 0xff, 1249 1.21 rillig 9, 1250 1.21 rillig "0xff<one>\0" 1251 1.24 rillig "0xff<thr#\0"); 1252 1.21 rillig 1253 1.21 rillig // new style, line_max exceeded by single-bit '>' in line 2 1254 1.21 rillig h_snprintb_m( 1255 1.21 rillig "\177\020" 1256 1.21 rillig "b\000one\0" 1257 1.29 rillig "b\001three\0", 1258 1.21 rillig 0xff, 1259 1.29 rillig 10, 1260 1.21 rillig "0xff<one>\0" 1261 1.29 rillig "0xff<thre#\0"); 1262 1.21 rillig 1263 1.21 rillig // new style, single-bit complete 1264 1.21 rillig h_snprintb_m( 1265 1.21 rillig "\177\020" 1266 1.21 rillig "b\000one\0" 1267 1.21 rillig "b\001three\0", 1268 1.21 rillig 0xff, 1269 1.21 rillig 11, 1270 1.21 rillig "0xff<one>\0" 1271 1.21 rillig "0xff<three>\0"); 1272 1.21 rillig 1273 1.21 rillig // new style, line_max exceeded by named bit-field number in line 1 1274 1.21 rillig h_snprintb_m( 1275 1.21 rillig "\177\020" 1276 1.21 rillig "f\000\004lo\0", 1277 1.21 rillig 0xff, 1278 1.21 rillig 3, 1279 1.24 rillig "0x#\0"); 1280 1.21 rillig 1281 1.21 rillig // new style, line_max exceeded by named bit-field '<' in line 1 1282 1.21 rillig h_snprintb_m( 1283 1.21 rillig "\177\020" 1284 1.21 rillig "f\000\004lo\0", 1285 1.21 rillig 0xff, 1286 1.21 rillig 4, 1287 1.24 rillig "0xf#\0"); 1288 1.13 rillig 1289 1.29 rillig // new style, line_max exceeded by bit-field description in line 1 1290 1.21 rillig h_snprintb_m( 1291 1.13 rillig "\177\020" 1292 1.21 rillig "f\000\004lo\0", 1293 1.21 rillig 0xff, 1294 1.13 rillig 6, 1295 1.24 rillig "0xff<#\0"); 1296 1.16 rillig 1297 1.21 rillig // new style, line_max exceeded by named bit-field '=' in line 1 1298 1.21 rillig h_snprintb_m( 1299 1.21 rillig "\177\020" 1300 1.21 rillig "f\000\004lo\0", 1301 1.21 rillig 0xff, 1302 1.21 rillig 7, 1303 1.24 rillig "0xff<l#\0"); 1304 1.16 rillig 1305 1.21 rillig // new style, line_max exceeded by named bit-field value in line 1 1306 1.21 rillig h_snprintb_m( 1307 1.16 rillig "\177\020" 1308 1.21 rillig "f\000\004lo\0", 1309 1.16 rillig 0xff, 1310 1.16 rillig 10, 1311 1.24 rillig "0xff<lo=0#\0"); 1312 1.21 rillig 1313 1.21 rillig // new style, line_max exceeded by named bit-field '=' in line 1 1314 1.21 rillig h_snprintb_m( 1315 1.21 rillig "\177\020" 1316 1.21 rillig "f\000\004lo\0" 1317 1.21 rillig "=\017match\0", 1318 1.21 rillig 0xff, 1319 1.29 rillig 12, 1320 1.29 rillig "0xff<lo=0xf#\0"); 1321 1.21 rillig 1322 1.27 rillig // new style, line_max exceeded by named bit-field value description in 1323 1.27 rillig // line 1 1324 1.21 rillig h_snprintb_m( 1325 1.21 rillig "\177\020" 1326 1.21 rillig "f\000\004lo\0" 1327 1.21 rillig "=\017match\0", 1328 1.21 rillig 0xff, 1329 1.21 rillig 16, 1330 1.24 rillig "0xff<lo=0xf=mat#\0"); 1331 1.21 rillig 1332 1.21 rillig // new style, line_max exceeded by named bit-field '>' in line 1 1333 1.21 rillig h_snprintb_m( 1334 1.21 rillig "\177\020" 1335 1.21 rillig "f\000\004lo\0" 1336 1.21 rillig "=\017match\0", 1337 1.21 rillig 0xff, 1338 1.21 rillig 17, 1339 1.24 rillig "0xff<lo=0xf=matc#\0"); 1340 1.21 rillig 1341 1.29 rillig // new style, line_max exceeded by named bit-field description in 1342 1.29 rillig // line 2 1343 1.21 rillig h_snprintb_m( 1344 1.21 rillig "\177\020" 1345 1.21 rillig "f\000\004lo\0" 1346 1.21 rillig "f\000\004low-bits\0" 1347 1.21 rillig "=\017match\0", 1348 1.21 rillig 0xff, 1349 1.21 rillig 12, 1350 1.21 rillig "0xff<lo=0xf>\0" 1351 1.24 rillig "0xff<low-bi#\0"); 1352 1.21 rillig 1353 1.21 rillig // new style, line_max exceeded by named bit-field '=' in line 2 1354 1.21 rillig h_snprintb_m( 1355 1.21 rillig "\177\020" 1356 1.21 rillig "f\000\004lo\0" 1357 1.21 rillig "f\000\004low-bits\0" 1358 1.21 rillig "=\017match\0", 1359 1.21 rillig 0xff, 1360 1.21 rillig 13, 1361 1.21 rillig "0xff<lo=0xf>\0" 1362 1.24 rillig "0xff<low-bit#\0"); 1363 1.21 rillig 1364 1.21 rillig // new style, line_max exceeded by named bit-field value in line 2 1365 1.21 rillig h_snprintb_m( 1366 1.21 rillig "\177\020" 1367 1.21 rillig "f\000\004lo\0" 1368 1.21 rillig "f\000\004low-bits\0" 1369 1.21 rillig "=\017match\0", 1370 1.21 rillig 0xff, 1371 1.21 rillig 16, 1372 1.21 rillig "0xff<lo=0xf>\0" 1373 1.24 rillig "0xff<low-bits=0#\0"); 1374 1.21 rillig 1375 1.21 rillig // new style, line_max exceeded by named bit-field '=' in line 2 1376 1.21 rillig h_snprintb_m( 1377 1.21 rillig "\177\020" 1378 1.21 rillig "f\000\004lo\0" 1379 1.21 rillig "f\000\004low-bits\0" 1380 1.21 rillig "=\017match\0", 1381 1.21 rillig 0xff, 1382 1.29 rillig 18, 1383 1.21 rillig "0xff<lo=0xf>\0" 1384 1.29 rillig "0xff<low-bits=0xf#\0"); 1385 1.21 rillig 1386 1.27 rillig // new style, line_max exceeded by named bit-field value description 1387 1.27 rillig // in line 2 1388 1.21 rillig h_snprintb_m( 1389 1.21 rillig "\177\020" 1390 1.21 rillig "f\000\004lo\0" 1391 1.21 rillig "f\000\004low-bits\0" 1392 1.21 rillig "=\017match\0", 1393 1.21 rillig 0xff, 1394 1.21 rillig 22, 1395 1.21 rillig "0xff<lo=0xf>\0" 1396 1.24 rillig "0xff<low-bits=0xf=mat#\0"); 1397 1.21 rillig 1398 1.21 rillig // new style, line_max exceeded by named bit-field '>' in line 2 1399 1.21 rillig h_snprintb_m( 1400 1.21 rillig "\177\020" 1401 1.21 rillig "f\000\004lo\0" 1402 1.21 rillig "f\000\004low-bits\0" 1403 1.21 rillig "=\017match\0", 1404 1.21 rillig 0xff, 1405 1.21 rillig 23, 1406 1.21 rillig "0xff<lo=0xf>\0" 1407 1.24 rillig "0xff<low-bits=0xf=matc#\0"); 1408 1.21 rillig 1409 1.21 rillig // new style, named bit-field complete 1410 1.21 rillig h_snprintb_m( 1411 1.21 rillig "\177\020" 1412 1.21 rillig "f\000\004lo\0" 1413 1.21 rillig "f\000\004low-bits\0" 1414 1.21 rillig "=\017match\0", 1415 1.21 rillig 0xff, 1416 1.21 rillig 24, 1417 1.21 rillig "0xff<lo=0xf>\0" 1418 1.22 rillig "0xff<low-bits=0xf=match>\0"); 1419 1.21 rillig 1420 1.21 rillig // new style, line_max exceeded by unnamed bit-field number in line 1 1421 1.21 rillig h_snprintb_m( 1422 1.21 rillig "\177\020" 1423 1.21 rillig "F\000\004\0", 1424 1.21 rillig 0xff, 1425 1.21 rillig 3, 1426 1.24 rillig "0x#\0"); 1427 1.13 rillig 1428 1.21 rillig // new style, line_max exceeded by unnamed bit-field '<' in line 1 1429 1.21 rillig h_snprintb_m( 1430 1.15 rillig "\177\020" 1431 1.21 rillig "F\000\004\0", 1432 1.16 rillig 0xff, 1433 1.21 rillig 4, 1434 1.24 rillig "0xf#\0"); 1435 1.16 rillig 1436 1.27 rillig // new style, line_max exceeded by unnamed bit-field value description 1437 1.27 rillig // in line 1 1438 1.21 rillig h_snprintb_m( 1439 1.21 rillig "\177\020" 1440 1.21 rillig "F\000\004\0" 1441 1.21 rillig ":\017match\0", 1442 1.21 rillig 0xff, 1443 1.16 rillig 9, 1444 1.24 rillig "0xff<mat#\0"); 1445 1.21 rillig 1446 1.21 rillig // new style, line_max exceeded by unnamed bit-field '>' in line 1 1447 1.21 rillig h_snprintb_m( 1448 1.16 rillig "\177\020" 1449 1.21 rillig "F\000\004\0" 1450 1.21 rillig ":\017match\0", 1451 1.16 rillig 0xff, 1452 1.16 rillig 10, 1453 1.24 rillig "0xff<matc#\0"); 1454 1.16 rillig 1455 1.27 rillig // new style, line_max exceeded by unnamed bit-field value description 1456 1.27 rillig // in line 2 1457 1.21 rillig h_snprintb_m( 1458 1.21 rillig "\177\020" 1459 1.21 rillig "F\000\004\0" 1460 1.21 rillig ":\017m1\0" 1461 1.21 rillig ":\017match\0", 1462 1.21 rillig 0xff, 1463 1.16 rillig 10, 1464 1.24 rillig "0xff<m1ma#\0"); 1465 1.21 rillig 1466 1.21 rillig // new style, line_max exceeded by unnamed bit-field '>' in line 2 1467 1.21 rillig h_snprintb_m( 1468 1.16 rillig "\177\020" 1469 1.21 rillig "F\000\004\0" 1470 1.21 rillig ":\017m1\0" 1471 1.21 rillig ":\017match\0", 1472 1.16 rillig 0xff, 1473 1.16 rillig 10, 1474 1.24 rillig "0xff<m1ma#\0"); 1475 1.16 rillig 1476 1.21 rillig // new style unnamed bit-field complete 1477 1.21 rillig h_snprintb_m( 1478 1.21 rillig "\177\020" 1479 1.21 rillig "F\000\004\0" 1480 1.21 rillig ":\017m1\0" 1481 1.21 rillig ":\017match\0", 1482 1.21 rillig 0xff, 1483 1.27 rillig 13, 1484 1.27 rillig "0xff<m1match>\0"); 1485 1.21 rillig 1486 1.21 rillig // new style, line_max exceeded by bit-field default 1487 1.21 rillig h_snprintb_m( 1488 1.16 rillig "\177\020" 1489 1.21 rillig "f\000\004f\0" 1490 1.21 rillig "*=default\0", 1491 1.16 rillig 0xff, 1492 1.21 rillig 17, 1493 1.24 rillig "0xff<f=0xf=defau#\0"); 1494 1.16 rillig 1495 1.21 rillig // new style, line_max exceeded by unmatched field value 1496 1.21 rillig h_snprintb_m( 1497 1.16 rillig "\177\020" 1498 1.21 rillig "f\000\004bits\0" 1499 1.34 rillig "=\000zero\0", 1500 1.16 rillig 0xff, 1501 1.16 rillig 11, 1502 1.24 rillig "0xff<bits=#\0"); 1503 1.21 rillig 1504 1.29 rillig // example from the manual page, new style bits and fields 1505 1.21 rillig h_snprintb_m( 1506 1.21 rillig "\177\020" 1507 1.36 rillig "b\000" "LSB\0" 1508 1.36 rillig "b\001" "BITONE\0" 1509 1.36 rillig "f\004\004" "NIBBLE2\0" 1510 1.36 rillig "f\020\004" "BURST\0" 1511 1.36 rillig "=\x04" "FOUR\0" 1512 1.36 rillig "=\x0f" "FIFTEEN\0" 1513 1.36 rillig "b\037" "MSB\0", 1514 1.21 rillig 0x800f0701, 1515 1.21 rillig 34, 1516 1.21 rillig "0x800f0701<LSB,NIBBLE2=0>\0" 1517 1.22 rillig "0x800f0701<BURST=0xf=FIFTEEN,MSB>\0"); 1518 1.16 rillig 1519 1.32 rillig // new style, missing number base 1520 1.32 rillig h_snprintb_m_len( 1521 1.32 rillig 1024, 1522 1.32 rillig "\177", 1523 1.32 rillig 0xff, 1524 1.32 rillig 128, 1525 1.32 rillig -1, 1526 1.32 rillig "#\0"); 1527 1.32 rillig 1528 1.21 rillig // new style, buffer too small for complete number in line 2 1529 1.16 rillig h_snprintb_m_len( 1530 1.16 rillig 15, 1531 1.16 rillig "\177\020" 1532 1.16 rillig "b\000lsb\0" 1533 1.16 rillig "b\001two\0", 1534 1.16 rillig 0xff, 1535 1.16 rillig 11, 1536 1.16 rillig 20, 1537 1.16 rillig "0xff<lsb>\0" 1538 1.31 rillig "0x#\0"); 1539 1.16 rillig 1540 1.16 rillig // new-style format, buffer too small for '<' in line 2 1541 1.16 rillig h_snprintb_m_len( 1542 1.16 rillig 16, 1543 1.16 rillig "\177\020" 1544 1.16 rillig "b\000lsb\0" 1545 1.16 rillig "b\001two\0", 1546 1.16 rillig 0xff, 1547 1.16 rillig 11, 1548 1.16 rillig 20, 1549 1.16 rillig "0xff<lsb>\0" 1550 1.31 rillig "0xf#\0"); 1551 1.16 rillig 1552 1.31 rillig // new-style format, buffer too small for textual fallback 1553 1.31 rillig h_snprintb_m_len( 1554 1.31 rillig 24, 1555 1.16 rillig "\177\020" 1556 1.16 rillig "f\000\004bits\0" 1557 1.16 rillig "*=fallback\0" 1558 1.16 rillig "b\0024\0", 1559 1.16 rillig 0xff, 1560 1.16 rillig 64, 1561 1.31 rillig 26, 1562 1.31 rillig "0xff<bits=0xf=fallbac#\0"); 1563 1.15 rillig 1564 1.19 rillig // new-style format, buffer too small for numeric fallback 1565 1.19 rillig h_snprintb_m_len( 1566 1.19 rillig 20, 1567 1.19 rillig "\177\020" 1568 1.19 rillig "F\000\004\0" 1569 1.19 rillig "*fallback(%040jd)\0", 1570 1.19 rillig 0xff, 1571 1.19 rillig 64, 1572 1.19 rillig 57, 1573 1.31 rillig "0xff<fallback(000#\0"); 1574 1.19 rillig 1575 1.19 rillig // new-style format, buffer too small for numeric fallback past buffer 1576 1.19 rillig h_snprintb_m_len( 1577 1.19 rillig 15, 1578 1.19 rillig "\177\020" 1579 1.19 rillig "F\000\004\0" 1580 1.19 rillig "*fallback(%010jd)\0" 1581 1.19 rillig "F\004\004\0" 1582 1.19 rillig "*fallback(%010jd)\0", 1583 1.19 rillig 0xff, 1584 1.19 rillig 64, 1585 1.19 rillig 48, 1586 1.31 rillig "0xff<fallbac#\0"); 1587 1.19 rillig 1588 1.21 rillig // new style, bits and fields, line break between fields 1589 1.9 rillig h_snprintb_m( 1590 1.9 rillig "\177\020" 1591 1.9 rillig "b\0LSB\0" 1592 1.9 rillig "b\1_BITONE\0" 1593 1.9 rillig "f\4\4NIBBLE2\0" 1594 1.9 rillig "f\x10\4BURST\0" 1595 1.9 rillig "=\04FOUR\0" 1596 1.9 rillig "=\17FIFTEEN\0" 1597 1.9 rillig "b\x1fMSB\0", 1598 1.9 rillig 0x800f0701, 1599 1.9 rillig 33, 1600 1.9 rillig "0x800f0701<LSB,NIBBLE2=0>\0" 1601 1.29 rillig "0x800f0701<BURST=0xf=FIFTEEN,MSB>\0"); 1602 1.9 rillig 1603 1.21 rillig // new style, bits and fields, line break after field description 1604 1.9 rillig h_snprintb_m( 1605 1.9 rillig "\177\020" 1606 1.9 rillig "b\0LSB\0" 1607 1.9 rillig "b\1_BITONE\0" 1608 1.9 rillig "f\4\4NIBBLE2\0" 1609 1.29 rillig "f\020\4BURST\0" 1610 1.9 rillig "=\04FOUR\0" 1611 1.9 rillig "=\17FIFTEEN\0" 1612 1.29 rillig "b\037MSB\0", 1613 1.9 rillig 0x800f0701, 1614 1.9 rillig 32, 1615 1.9 rillig "0x800f0701<LSB,NIBBLE2=0>\0" 1616 1.9 rillig "0x800f0701<BURST=0xf=FIFTEEN>\0" 1617 1.9 rillig "0x800f0701<MSB>\0"); 1618 1.2 pgoyette } 1619 1.2 pgoyette 1620 1.1 jmmv ATF_TP_ADD_TCS(tp) 1621 1.1 jmmv { 1622 1.1 jmmv 1623 1.1 jmmv ATF_TP_ADD_TC(tp, snprintb); 1624 1.2 pgoyette ATF_TP_ADD_TC(tp, snprintb_m); 1625 1.1 jmmv 1626 1.1 jmmv return atf_no_error(); 1627 1.1 jmmv } 1628