Lines Matching +full:is +full:- +full:decoded +full:- +full:cs
1 // SPDX-License-Identifier: GPL-2.0-only
8 /* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */
10 * Wirzenius wrote this portably, Torvalds fucked it up :-)
15 * - changed to provide snprintf and vsnprintf functions
17 * - scnprintf and vscnprintf
23 #include <linux/clk-provider.h>
72 prefix_chars = cp - startp; in simple_strntoull()
74 rv = _parse_integer_limit(cp, base, &result, max_chars - prefix_chars); in simple_strntoull()
89 * simple_strtoull - convert a string to an unsigned long long
104 * simple_strtoul - convert a string to an unsigned long
118 * simple_strtol - convert a string to a signed long
127 if (*cp == '-') in simple_strtol()
128 return -simple_strtoul(cp + 1, endp, base); in simple_strtol()
139 * case cp[0] == '-' && max_chars == 1. in simple_strntoll()
141 * and the content of *cp is irrelevant. in simple_strntoll()
143 if (*cp == '-' && max_chars > 0) in simple_strntoll()
144 return -simple_strntoull(cp + 1, endp, base, max_chars - 1); in simple_strntoll()
150 * simple_strtoll - convert a string to a signed long long
168 i = i*10 + *((*s)++) - '0'; in skip_atoi()
175 * Decimal conversion is by far the most typical, and is used for
182 * <http://www.cs.uiowa.edu/~jones/bcd/divide.html> (with permission
185 * It turns out there is precisely one 26 bit fixed-point
187 * holds for all x in [0, 10^8-1], namely a = 0x28f5c29. The actual
191 * For dividing a number in the range [10^4, 10^6-1] by 100, we still
192 * need a 32x32->64 bit multiply, so we simply use the same constant.
194 * For dividing a number in the range [100, 10^4-1] by 100, there are
195 * several options. The simplest is (x * 0x147b) >> 19, which is valid
217 * one of them accounted for in buf. This is needed by ip4_string
218 * below. All other callers pass a non-zero value of r.
231 *((u16 *)buf) = decpair[r - 100*q]; in put_dec_trunc8()
240 *((u16 *)buf) = decpair[q - 100*r]; in put_dec_trunc8()
249 *((u16 *)buf) = decpair[r - 100*q]; in put_dec_trunc8()
269 *((u16 *)buf) = decpair[r - 100*q]; in put_dec_full8()
274 *((u16 *)buf) = decpair[q - 100*r]; in put_dec_full8()
279 *((u16 *)buf) = decpair[r - 100*q]; in put_dec_full8()
309 *((u16 *)buf) = decpair[r - 100*q]; in put_dec_full4()
319 * helper will ever be asked to convert is 1,125,520,955.
320 * (second call in the put_dec code, assuming n is all-ones).
327 put_dec_full4(buf, x - q * 10000); in put_dec_helper4()
332 * <http://www.cs.uiowa.edu/~jones/bcd/decimal.html#sixtyfour>
334 * Performs no 64-bit division and hence should be fast on 32-bit machines.
364 else while (buf[-1] == '0') in put_dec()
365 --buf; in put_dec()
376 * If speed is not important, use snprintf(). It's easy to read the code.
380 /* put_dec requires 2-byte alignment of the buffer. */ in num_to_str()
389 len = put_dec(tmp, num) - tmp; in num_to_str()
396 width = width - len; in num_to_str()
404 buf[idx + width] = tmp[len - idx - 1]; in num_to_str()
413 #define ZEROPAD 16 /* pad with zero, must be 16 == '0' - ' ' */
417 static_assert(ZEROPAD == ('0' - ' '));
440 #define FIELD_WIDTH_MAX ((1 << 23) - 1)
441 #define PRECISION_MAX ((1 << 15) - 1)
447 /* put_dec requires 2-byte alignment of the buffer. */ in number()
465 sign = '-'; in number()
466 num = -(signed long long)num; in number()
467 field_width--; in number()
470 field_width--; in number()
473 field_width--; in number()
478 field_width -= 2; in number()
480 field_width--; in number()
488 int mask = spec.base - 1; in number()
498 i = put_dec(tmp, num) - tmp; in number()
505 field_width -= precision; in number()
507 while (--field_width >= 0) { in number()
536 while (--field_width >= 0) { in number()
543 while (i <= --precision) { in number()
549 while (--i >= 0) { in number()
555 while (--field_width >= 0) { in number()
572 spec.precision = -1; in special_hex_number()
582 size = end - buf; in move_right()
588 if (len > size - spaces) in move_right()
589 len = size - spaces; in move_right()
611 spaces = spec.field_width - n; in widen_string()
613 move_right(buf - n, end, n, spaces); in widen_string()
616 while (spaces--) { in widen_string()
631 while (lim--) { in string_nocheck()
653 * Somebody passed ERR_PTR(-1234) or some other non-existing in err_ptr()
654 * Efoo - or perhaps CONFIG_SYMBOLIC_ERRNAME=n. Fall back to in err_ptr()
671 if (spec.precision == -1) in error_string()
701 return -EFAULT; in check_pointer()
723 if (spec.field_width == -1) { in pointer_string()
769 return -EBUSY; in subsys_initcall()
778 * modified the address (and 32 bits is plenty for a unique ID). in subsys_initcall()
807 /* When debugging early boot use non-cryptographically secure hash. */ in ptr_to_id()
827 * default is to _not_ leak addresses, so hash before printing, in default_pointer()
828 * unless no_hash_pointers is specified on the command line. in default_pointer()
854 if (spec.field_width == -1) in restricted_pointer()
856 return error_string(buf, end, "pK-error", spec); in restricted_pointer()
861 * process has CAP_SYSLOG and is running with the in restricted_pointer()
862 * same credentials it started with. This is because in restricted_pointer()
863 * access to files is checked at open() time, but %pK in restricted_pointer()
870 !uid_eq(cred->euid, cred->uid) || in restricted_pointer()
871 !gid_eq(cred->egid, cred->gid)) in restricted_pointer()
896 depth = fmt[1] - '0'; in dentry_name()
909 p = READ_ONCE(d->d_parent); in dentry_name()
910 array[i] = READ_ONCE(d->d_name.name); in dentry_name()
918 s = array[--i]; in dentry_name()
925 s = array[--i]; in dentry_name()
941 return dentry_name(buf, end, f->f_path.dentry, spec, fmt); in file_dentry_name()
953 hd = bdev->bd_disk; in bdev_name()
954 buf = string(buf, end, hd->disk_name, spec); in bdev_name()
956 if (isdigit(hd->disk_name[strlen(hd->disk_name)-1])) { in bdev_name()
999 .field_width = -1,
1000 .precision = -1,
1005 .precision = -1,
1011 .precision = -1,
1017 .precision = -1,
1024 .precision = -1,
1037 *buf = '-'; in hex_range()
1056 .precision = -1, in resource_string()
1062 .precision = -1, in resource_string()
1068 .precision = -1, in resource_string()
1072 .field_width = -1, in resource_string()
1077 /* 32-bit res (sizeof==4): 10 chars in dec, 10 in hex ("0x" + 8) in resource_string()
1078 * 64-bit res (sizeof==8): 20 chars in dec, 18 in hex ("0x" + 16) */ in resource_string()
1080 #define FLAG_BUF_SIZE (2 * sizeof(res->flags)) in resource_string()
1081 #define DECODED_BUF_SIZE sizeof("[mem - 64bit pref window disabled]") in resource_string()
1082 #define RAW_BUF_SIZE sizeof("[mem - flags 0x]") in resource_string()
1094 if (res->flags & IORESOURCE_IO) { in resource_string()
1097 } else if (res->flags & IORESOURCE_MEM) { in resource_string()
1100 } else if (res->flags & IORESOURCE_IRQ) { in resource_string()
1103 } else if (res->flags & IORESOURCE_DMA) { in resource_string()
1106 } else if (res->flags & IORESOURCE_BUS) { in resource_string()
1114 if (decode && res->flags & IORESOURCE_UNSET) { in resource_string()
1118 p = hex_range(p, pend, res->start, res->end, *specp); in resource_string()
1121 if (res->flags & IORESOURCE_MEM_64) in resource_string()
1123 if (res->flags & IORESOURCE_PREFETCH) in resource_string()
1125 if (res->flags & IORESOURCE_WINDOW) in resource_string()
1127 if (res->flags & IORESOURCE_DISABLED) in resource_string()
1131 p = number(p, pend, res->flags, default_flag_spec); in resource_string()
1143 char sym[sizeof("[range 0x0123456789abcdef-0x0123456789abcdef]")]; in range_string()
1147 .field_width = 2 + 2 * sizeof(range->start), /* 0x + 2 * 8 */ in range_string()
1150 .precision = -1, in range_string()
1157 p = hex_range(p, pend, range->start, range->end, range_spec); in range_string()
1184 separator = '-'; in hex_string()
1205 if (separator && i != len - 1) { in hex_string()
1230 chunksz = nr_bits & (CHUNKSZ - 1); in bitmap_string()
1234 i = ALIGN(nr_bits, CHUNKSZ) - CHUNKSZ; in bitmap_string()
1235 for (; i >= 0; i -= CHUNKSZ) { in bitmap_string()
1239 chunkmask = ((1ULL << chunksz) - 1); in bitmap_string()
1283 *buf = '-'; in bitmap_list_string()
1284 buf = number(++buf, end, rtop - 1, default_dec_spec); in bitmap_list_string()
1304 separator = '-'; in mac_address_string()
1318 p = hex_byte_pack(p, addr[5 - i]); in mac_address_string()
1345 step = -1; in ip4_string()
1350 step = -1; in ip4_string()
1361 int digits = put_dec_trunc8(temp, addr[index]) - temp; in ip4_string()
1369 while (digits--) in ip4_string()
1386 int colonpos = -1; in ip6_compressed_string()
1419 colonpos = -1; in ip6_compressed_string()
1428 i += longest - 1; in ip6_compressed_string()
1513 const u8 *addr = (const u8 *) &sa->sin6_addr; in ip6_addr_string_sa()
1550 p = number(p, pend, ntohs(sa->sin6_port), spec); in ip6_addr_string_sa()
1554 p = number(p, pend, ntohl(sa->sin6_flowinfo & in ip6_addr_string_sa()
1559 p = number(p, pend, sa->sin6_scope_id, spec); in ip6_addr_string_sa()
1573 const u8 *addr = (const u8 *) &sa->sin_addr.s_addr; in ip4_addr_string_sa()
1594 p = number(p, pend, ntohs(sa->sin_port), spec); in ip4_addr_string_sa()
1622 switch (sa->raw.sa_family) { in ip_addr_string()
1624 return ip4_addr_string_sa(buf, end, &sa->v4, spec, fmt); in ip_addr_string()
1626 return ip6_addr_string_sa(buf, end, &sa->v6, spec, fmt); in ip_addr_string()
1690 buf += string_escape_mem(addr, len, buf, buf < end ? end - buf : 0, flags, NULL); in escaped_string()
1703 va_copy(va, *va_fmt->va); in va_format()
1704 buf += vsnprintf(buf, end > buf ? end - buf : 0, va_fmt->fmt, va); in va_format()
1745 *p++ = '-'; in uuid_string()
1781 char output[sizeof("0123 little-endian (0x01234567)")]; in fourcc_string()
1798 /* Print non-control ASCII characters as-is, dot otherwise */ in fourcc_string()
1803 strcpy(p, orig & BIT(31) ? "big-endian" : "little-endian"); in fourcc_string()
1808 p = special_hex_number(p, output + sizeof(output) - 2, orig, sizeof(u32)); in fourcc_string()
1843 int year = tm->tm_year + (r ? 0 : 1900); in date_str()
1844 int mon = tm->tm_mon + (r ? 0 : 1); in date_str()
1848 *buf = '-'; in date_str()
1853 *buf = '-'; in date_str()
1856 return number(buf, end, tm->tm_mday, default_dec02_spec); in date_str()
1862 buf = number(buf, end, tm->tm_hour, default_dec02_spec); in time_str()
1867 buf = number(buf, end, tm->tm_min, default_dec02_spec); in time_str()
1872 return number(buf, end, tm->tm_sec, default_dec02_spec); in time_str()
1989 for ( ; flags && names->name; names++) { in format_flags()
1990 mask = names->mask; in format_flags()
1994 buf = string(buf, end, names->name, default_str_spec); in format_flags()
2113 for (depth = fwnode_count_parents(fwnode); depth >= 0; depth--) { in fwnode_full_name_string()
2145 str_spec.field_width = -1; in device_node_string()
2177 str_spec.precision = strchrnul(p, '@') - p; in device_node_string()
2182 buf = number(buf, end, (unsigned int)dn->phandle, default_dec_spec); in device_node_string()
2184 case 'P': /* path-spec */ in device_node_string()
2191 tbuf[0] = of_node_check_flag(dn, OF_DYNAMIC) ? 'D' : '-'; in device_node_string()
2192 tbuf[1] = of_node_check_flag(dn, OF_DETACHED) ? 'd' : '-'; in device_node_string()
2193 tbuf[2] = of_node_check_flag(dn, OF_POPULATED) ? 'P' : '-'; in device_node_string()
2194 tbuf[3] = of_node_check_flag(dn, OF_POPULATED_BUS) ? 'B' : '-'; in device_node_string()
2220 return widen_string(buf, buf - buf_start, end, spec); in device_node_string()
2230 str_spec.field_width = -1; in fwnode_string()
2250 return widen_string(buf, buf - buf_start, end, spec); in fwnode_string()
2291 * Show a '%p' thing. A kernel extension is that the '%p' is followed
2300 * - 'S' For symbolic direct pointers (or function descriptors) with offset
2301 * - 's' For symbolic direct pointers (or function descriptors) without offset
2302 * - '[Ss]R' as above with __builtin_extract_return_addr() translation
2303 * - 'S[R]b' as above with module build ID (for use in backtraces)
2304 * - '[Ff]' %pf and %pF were obsoleted and later removed in favor of
2305 * %ps and %pS. Be careful when re-using these specifiers.
2306 * - 'B' For backtraced symbolic direct pointers with offset
2307 * - 'Bb' as above with module build ID (for use in backtraces)
2308 * - 'R' For decoded struct resource, e.g., [mem 0x0-0x1f 64bit pref]
2309 * - 'r' For raw struct resource, e.g., [mem 0x0-0x1f flags 0x201]
2310 * - 'ra' For struct ranges, e.g., [range 0x0000000000000000 - 0x00000000000000ff]
2311 * - 'b[l]' For a bitmap, the number of bits is determined by the field
2314 * range-list format instead of hex format
2315 * - 'M' For a 6-byte MAC address, it prints the address in the
2316 * usual colon-separated hex notation
2317 * - 'm' For a 6-byte MAC address, it prints the hex address without colons
2318 * - 'MF' For a 6-byte MAC FDDI address, it prints the address
2319 * with a dash-separated hex notation
2320 * - '[mM]R' For a 6-byte MAC address, Reverse order (Bluetooth)
2321 * - 'I' [46] for IPv4/IPv6 addresses printed in the usual way
2322 * IPv4 uses dot-separated decimal without leading 0's (1.2.3.4)
2323 * IPv6 uses colon separated network-order 16 bit hex with leading 0's
2326 * [4] or [6] and is able to print port [p], flowinfo [f], scope [s]
2327 * - 'i' [46] for 'raw' IPv4/IPv6 addresses
2329 * IPv4 uses dot-separated decimal with leading 0's (010.123.045.006)
2332 * [4] or [6] and is able to print port [p], flowinfo [f], scope [s]
2333 * - '[Ii][4S][hnbl]' IPv4 addresses in host, network, big or little endian order
2334 * - 'I[6S]c' for IPv6 addresses printed as specified by
2336 * - 'E[achnops]' For an escaped buffer, where rules are defined by combination
2339 * a - ESCAPE_ANY
2340 * c - ESCAPE_SPECIAL
2341 * h - ESCAPE_HEX
2342 * n - ESCAPE_NULL
2343 * o - ESCAPE_OCTAL
2344 * p - ESCAPE_NP
2345 * s - ESCAPE_SPACE
2346 * By default ESCAPE_ANY_NP is used.
2347 * - 'U' For a 16 byte UUID/GUID, it prints the UUID/GUID in the form
2348 * "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
2354 * big endian output byte order is:
2355 * [0][1][2][3]-[4][5]-[6][7]-[8][9]-[10][11][12][13][14][15]
2356 * little endian output byte order is:
2357 * [3][2][1][0]-[5][4]-[7][6]-[8][9]-[10][11][12][13][14][15]
2358 * - 'V' For a struct va_format which contains a format string * and va_list *,
2359 * call vsnprintf(->format, *->va_list).
2363 * - 'K' For a kernel pointer that should be hidden from unprivileged users.
2366 * - 'NF' For a netdev_features_t
2367 * - '4cc' V4L2 or DRM FourCC code, with endianness and raw numerical value.
2368 * - 'h[CDN]' For a variable-length buffer, it prints it as a hex string with
2373 * The maximum supported length is 64 bytes of the input. Consider
2375 * - 'a[pd]' For address types [p] phys_addr_t, [d] dma_addr_t and derivatives
2377 * - 'd[234]' For a dentry name (optionally 2-4 last components)
2378 * - 'D[234]' Same as 'd' but for a struct file
2379 * - 'g' For block_device name (gendisk + partition number)
2380 * - 't[RT][dt][r][s]' For time and date as represented by:
2383 * - 'C' For a clock, it prints the name (Common Clock Framework) or address
2385 * - 'Cn' For a clock, it prints the name (Common Clock Framework) or address
2387 * - 'G' For flags to be printed as a collection of symbolic strings that would
2392 * - 'OF[fnpPcCF]' For a device tree object
2401 * - 'fw[fP]' For a firmware node (struct fwnode_handle) pointer
2405 * - 'x' For printing the address unmodified. Equivalent to "%lx".
2407 * - '[ku]s' For a BPF/tracing related format specifier, e.g. used out of
2413 * Documentation/core-api/printk-formats.rst
2415 * Note: The default behaviour (unadorned %p) is to hash the address,
2418 * There is also a '%pA' format specifier, but it is only intended to be used
2495 WARN_ONCE(1, "Please remove %%pA from non-Rust code\n"); in pointer()
2502 /* %pe with a non-ERR_PTR gets treated as plain %p */ in pointer()
2525 #define SPEC_CHAR(x, flag) [(x)-32] = flag
2532 SPEC_CHAR('-', LEFT), in spec_flag()
2535 c -= 32; in spec_flag()
2544 * The decoded token is returned through the parameters
2548 * 'z' changed to 'Z' --davidm 1/25/99
2549 * 'Z' changed to 'z' --adobriyan 2017-01-25
2554 * @flags: various flags such as +, -, # tokens..
2568 if (spec->field_width < 0) { in format_decode()
2569 spec->field_width = -spec->field_width; in format_decode()
2570 spec->flags |= LEFT; in format_decode()
2578 if (spec->precision < 0) in format_decode()
2579 spec->precision = 0; in format_decode()
2593 /* Return the current non-format string */ in format_decode()
2598 spec->flags = 0; in format_decode()
2602 spec->flags |= flag; in format_decode()
2606 spec->field_width = -1; in format_decode()
2609 spec->field_width = skip_atoi(&fmt.str); in format_decode()
2619 spec->precision = -1; in format_decode()
2623 spec->precision = skip_atoi(&fmt.str); in format_decode()
2624 if (spec->precision < 0) in format_decode()
2625 spec->precision = 0; in format_decode()
2636 spec->base = 10; in format_decode()
2653 // Non-numeric formats in format_decode()
2675 if (p->size) { in format_decode()
2676 fmt.size = p->size; in format_decode()
2677 if (p->flags_or_double_size && fmt.str[0] == fmt.str[1]) { in format_decode()
2678 fmt.size = p->flags_or_double_size; in format_decode()
2684 if (p->state) { in format_decode()
2685 if (p->base) in format_decode()
2686 spec->base = p->base; in format_decode()
2687 spec->flags |= p->flags_or_double_size; in format_decode()
2688 fmt.state = p->state; in format_decode()
2701 spec->field_width = width; in set_field_width()
2702 if (WARN_ONCE(spec->field_width != width, "field width %d too large", width)) { in set_field_width()
2703 spec->field_width = clamp(width, -FIELD_WIDTH_MAX, FIELD_WIDTH_MAX); in set_field_width()
2710 spec->precision = prec; in set_precision()
2711 if (WARN_ONCE(spec->precision != prec, "precision %d too large", prec)) { in set_precision()
2712 spec->precision = clamp(prec, 0, PRECISION_MAX); in set_precision()
2717 * Turn a 1/2/4-byte value into a 64-bit one for printing: truncate
2720 * 'size' is the size of the value in bytes.
2724 unsigned int shift = 32 - size*8; in convert_num_spec()
2733 * vsnprintf - Format a string and place it in a buffer
2742 * - ``%n`` is unsupported
2743 * - ``%p*`` is handled by pointer()
2745 * See pointer() or Documentation/core-api/printk-formats.rst for more
2750 * The return value is the number of characters which would
2755 * return is greater than or equal to @size, the resulting
2756 * string is truncated.
2769 /* Reject out-of-range values early. Large positive sizes are in vsnprintf()
2777 /* Make sure end is always >= buf */ in vsnprintf()
2779 end = ((void *)-1); in vsnprintf()
2780 size = end - buf; in vsnprintf()
2790 int read = fmt.str - old_fmt; in vsnprintf()
2793 if (copy > end - str) in vsnprintf()
2794 copy = end - str; in vsnprintf()
2823 while (--spec.field_width > 0) { in vsnprintf()
2834 while (--spec.field_width > 0) { in vsnprintf()
2862 * checking, but there is no safe or sane way in vsnprintf()
2877 end[-1] = '\0'; in vsnprintf()
2881 return str-buf; in vsnprintf()
2887 * vscnprintf - Format a string and place it in a buffer
2893 * The return value is the number of characters which have been written into
2894 * the @buf not including the trailing '\0'. If @size is == 0 the function
2913 return size - 1; in vscnprintf()
2918 * snprintf - Format a string and place it in a buffer
2924 * The return value is the number of characters which would be
2926 * as per ISO C99. If the return is greater than or equal to
2927 * @size, the resulting string is truncated.
2945 * scnprintf - Format a string and place it in a buffer
2951 * The return value is the number of characters written into @buf not including
2952 * the trailing '\0'. If @size is == 0 the function returns 0.
2969 * vsprintf - Format a string and place it in a buffer
2989 * sprintf - Format a string and place it in a buffer
3016 * vbin_printf() - VA arguments to binary data
3017 * bstr_printf() - Binary data to text string
3021 * vbin_printf - Parse a format string and place args' binary value in a buffer
3027 * The format follows C99 vsnprintf, except %n is ignored, and its argument
3028 * is skipped.
3030 * The return value is the number of words(32bits) which would be generated for
3034 * If the return value is greater than @size, the resulting bin_buf is NOT
3115 /* Dereference of functions is still OK */ in vbin_printf()
3133 end[-1] = '\0'; /* Must be nul terminated */ in vbin_printf()
3150 return (u32 *)(PTR_ALIGN(str, sizeof(u32))) - bin_buf; in vbin_printf()
3156 * bstr_printf - Format a string from binary arguments and place it in a buffer
3162 * This function like C99 vsnprintf, but the difference is that vsnprintf gets
3163 * arguments from stack, and bstr_printf gets arguments from @bin_buf which is
3169 * The return value is the number of characters which would
3174 * return is greater than or equal to @size, the resulting
3175 * string is truncated.
3208 /* Make sure end is always >= buf */ in bstr_printf()
3210 end = ((void *)-1); in bstr_printf()
3211 size = end - buf; in bstr_printf()
3221 int read = fmt.str - old_fmt; in bstr_printf()
3224 if (copy > end - str) in bstr_printf()
3225 copy = end - str; in bstr_printf()
3244 while (--spec.field_width > 0) { in bstr_printf()
3254 while (--spec.field_width > 0) { in bstr_printf()
3289 if (copy > end - str) in bstr_printf()
3290 copy = end - str; in bstr_printf()
3329 end[-1] = '\0'; in bstr_printf()
3335 return str - buf; in bstr_printf()
3342 * vsscanf - Unformat a buffer into a list of arguments
3372 /* anything that is not a conversion must match exactly */ in vsscanf()
3401 field_width = -1; in vsscanf()
3409 qualifier = -1; in vsscanf()
3429 *va_arg(args, int *) = str - buf; in vsscanf()
3444 if (field_width == -1) in vsscanf()
3448 } while (--field_width > 0 && *str); in vsscanf()
3455 if (field_width == -1) in vsscanf()
3461 while (*str && !isspace(*str) && field_width--) in vsscanf()
3470 * (1) It does NOT support ranges i.e. '-' is NOT a special in vsscanf()
3473 * (3) A field width is required in vsscanf()
3474 * (4) '%*[' (discard matching input) is currently not supported in vsscanf()
3489 /* field width is required */ in vsscanf()
3490 if (field_width == -1) in vsscanf()
3510 /* match must be non-empty */ in vsscanf()
3514 while (test_bit((u8)*str, set) && field_width--) in vsscanf()
3551 if (is_sign && digit == '-') { in vsscanf()
3619 * sscanf - Unformat a buffer into a list of arguments