|
@@ -892,8 +892,8 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
|
|
|
case 'F':
|
|
|
case 'f':
|
|
|
ptr = dereference_function_descriptor(ptr);
|
|
|
- case 's':
|
|
|
/* Fallthrough */
|
|
|
+ case 's':
|
|
|
case 'S':
|
|
|
return symbol_string(buf, end, ptr, spec, *fmt);
|
|
|
case 'R':
|
|
@@ -1156,8 +1156,7 @@ qualifier:
|
|
|
int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
|
|
|
{
|
|
|
unsigned long long num;
|
|
|
- char *str, *end, c;
|
|
|
- int read;
|
|
|
+ char *str, *end;
|
|
|
struct printf_spec spec = {0};
|
|
|
|
|
|
/* Reject out-of-range values early. Large positive sizes are
|
|
@@ -1176,8 +1175,7 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
|
|
|
|
|
|
while (*fmt) {
|
|
|
const char *old_fmt = fmt;
|
|
|
-
|
|
|
- read = format_decode(fmt, &spec);
|
|
|
+ int read = format_decode(fmt, &spec);
|
|
|
|
|
|
fmt += read;
|
|
|
|
|
@@ -1201,7 +1199,9 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
|
|
|
spec.precision = va_arg(args, int);
|
|
|
break;
|
|
|
|
|
|
- case FORMAT_TYPE_CHAR:
|
|
|
+ case FORMAT_TYPE_CHAR: {
|
|
|
+ char c;
|
|
|
+
|
|
|
if (!(spec.flags & LEFT)) {
|
|
|
while (--spec.field_width > 0) {
|
|
|
if (str < end)
|
|
@@ -1220,6 +1220,7 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
|
|
|
++str;
|
|
|
}
|
|
|
break;
|
|
|
+ }
|
|
|
|
|
|
case FORMAT_TYPE_STR:
|
|
|
str = string(str, end, va_arg(args, char *), spec);
|
|
@@ -1464,7 +1465,6 @@ int vbin_printf(u32 *bin_buf, size_t size, const char *fmt, va_list args)
|
|
|
{
|
|
|
struct printf_spec spec = {0};
|
|
|
char *str, *end;
|
|
|
- int read;
|
|
|
|
|
|
str = (char *)bin_buf;
|
|
|
end = (char *)(bin_buf + size);
|
|
@@ -1490,12 +1490,14 @@ do { \
|
|
|
} while (0)
|
|
|
|
|
|
while (*fmt) {
|
|
|
- read = format_decode(fmt, &spec);
|
|
|
+ int read = format_decode(fmt, &spec);
|
|
|
|
|
|
fmt += read;
|
|
|
|
|
|
switch (spec.type) {
|
|
|
case FORMAT_TYPE_NONE:
|
|
|
+ case FORMAT_TYPE_INVALID:
|
|
|
+ case FORMAT_TYPE_PERCENT_CHAR:
|
|
|
break;
|
|
|
|
|
|
case FORMAT_TYPE_WIDTH:
|
|
@@ -1528,12 +1530,6 @@ do { \
|
|
|
fmt++;
|
|
|
break;
|
|
|
|
|
|
- case FORMAT_TYPE_PERCENT_CHAR:
|
|
|
- break;
|
|
|
-
|
|
|
- case FORMAT_TYPE_INVALID:
|
|
|
- break;
|
|
|
-
|
|
|
case FORMAT_TYPE_NRCHARS: {
|
|
|
/* skip %n 's argument */
|
|
|
int qualifier = spec.qualifier;
|
|
@@ -1606,10 +1602,9 @@ EXPORT_SYMBOL_GPL(vbin_printf);
|
|
|
*/
|
|
|
int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf)
|
|
|
{
|
|
|
- unsigned long long num;
|
|
|
- char *str, *end, c;
|
|
|
- const char *args = (const char *)bin_buf;
|
|
|
struct printf_spec spec = {0};
|
|
|
+ char *str, *end;
|
|
|
+ const char *args = (const char *)bin_buf;
|
|
|
|
|
|
if (WARN_ON_ONCE((int) size < 0))
|
|
|
return 0;
|
|
@@ -1639,10 +1634,8 @@ int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf)
|
|
|
}
|
|
|
|
|
|
while (*fmt) {
|
|
|
- int read;
|
|
|
const char *old_fmt = fmt;
|
|
|
-
|
|
|
- read = format_decode(fmt, &spec);
|
|
|
+ int read = format_decode(fmt, &spec);
|
|
|
|
|
|
fmt += read;
|
|
|
|
|
@@ -1666,7 +1659,9 @@ int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf)
|
|
|
spec.precision = get_arg(int);
|
|
|
break;
|
|
|
|
|
|
- case FORMAT_TYPE_CHAR:
|
|
|
+ case FORMAT_TYPE_CHAR: {
|
|
|
+ char c;
|
|
|
+
|
|
|
if (!(spec.flags & LEFT)) {
|
|
|
while (--spec.field_width > 0) {
|
|
|
if (str < end)
|
|
@@ -1684,11 +1679,11 @@ int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf)
|
|
|
++str;
|
|
|
}
|
|
|
break;
|
|
|
+ }
|
|
|
|
|
|
case FORMAT_TYPE_STR: {
|
|
|
const char *str_arg = args;
|
|
|
- size_t len = strlen(str_arg);
|
|
|
- args += len + 1;
|
|
|
+ args += strlen(str_arg) + 1;
|
|
|
str = string(str, end, (char *)str_arg, spec);
|
|
|
break;
|
|
|
}
|
|
@@ -1700,11 +1695,6 @@ int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf)
|
|
|
break;
|
|
|
|
|
|
case FORMAT_TYPE_PERCENT_CHAR:
|
|
|
- if (str < end)
|
|
|
- *str = '%';
|
|
|
- ++str;
|
|
|
- break;
|
|
|
-
|
|
|
case FORMAT_TYPE_INVALID:
|
|
|
if (str < end)
|
|
|
*str = '%';
|
|
@@ -1715,15 +1705,15 @@ int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf)
|
|
|
/* skip */
|
|
|
break;
|
|
|
|
|
|
- default:
|
|
|
+ default: {
|
|
|
+ unsigned long long num;
|
|
|
+
|
|
|
switch (spec.type) {
|
|
|
|
|
|
case FORMAT_TYPE_LONG_LONG:
|
|
|
num = get_arg(long long);
|
|
|
break;
|
|
|
case FORMAT_TYPE_ULONG:
|
|
|
- num = get_arg(unsigned long);
|
|
|
- break;
|
|
|
case FORMAT_TYPE_LONG:
|
|
|
num = get_arg(unsigned long);
|
|
|
break;
|
|
@@ -1753,8 +1743,9 @@ int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf)
|
|
|
}
|
|
|
|
|
|
str = number(str, end, num, spec);
|
|
|
- }
|
|
|
- }
|
|
|
+ } /* default: */
|
|
|
+ } /* switch(spec.type) */
|
|
|
+ } /* while(*fmt) */
|
|
|
|
|
|
if (size > 0) {
|
|
|
if (str < end)
|
|
@@ -1808,7 +1799,7 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
|
|
|
char digit;
|
|
|
int num = 0;
|
|
|
int qualifier, base, field_width;
|
|
|
- int is_sign = 0;
|
|
|
+ bool is_sign;
|
|
|
|
|
|
while (*fmt && *str) {
|
|
|
/* skip any white space in format */
|
|
@@ -1864,12 +1855,13 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- base = 10;
|
|
|
- is_sign = 0;
|
|
|
|
|
|
if (!*fmt || !*str)
|
|
|
break;
|
|
|
|
|
|
+ base = 10;
|
|
|
+ is_sign = 0;
|
|
|
+
|
|
|
switch (*fmt++) {
|
|
|
case 'c':
|
|
|
{
|