* @qualifier: qualifier of a number (long, size_t, ...)
*/
static noinline_for_stack
-int format_decode(const char *fmt, struct printf_spec *spec)
+const char *format_decode(const char *fmt, struct printf_spec *spec)
{
const char *start = fmt;
char qualifier;
/* Return the current non-format string */
if (fmt != start || !*fmt)
- return fmt - start;
+ return fmt;
/* Process flags */
spec->flags = 0;
else if (*fmt == '*') {
/* it's the next argument */
spec->type = FORMAT_TYPE_WIDTH;
- return ++fmt - start;
+ return ++fmt;
}
precision:
} else if (*fmt == '*') {
/* it's the next argument */
spec->type = FORMAT_TYPE_PRECISION;
- return ++fmt - start;
+ return ++fmt;
}
}
switch (*fmt) {
case 'c':
spec->type = FORMAT_TYPE_CHAR;
- return ++fmt - start;
+ return ++fmt;
case 's':
spec->type = FORMAT_TYPE_STR;
- return ++fmt - start;
+ return ++fmt;
case 'p':
spec->type = FORMAT_TYPE_PTR;
- return ++fmt - start;
+ return ++fmt;
case '%':
spec->type = FORMAT_TYPE_PERCENT_CHAR;
- return ++fmt - start;
+ return ++fmt;
/* integer number formats - set up the flags and "break" */
case 'o':
default:
WARN_ONCE(1, "Please remove unsupported %%%c in format string\n", *fmt);
spec->type = FORMAT_TYPE_INVALID;
- return fmt - start;
+ return fmt;
}
if (qualifier == 'L')
spec->type = FORMAT_TYPE_SIZE(int);
}
- return ++fmt - start;
+ return ++fmt;
}
static void
while (*fmt) {
const char *old_fmt = fmt;
- int read = format_decode(fmt, &spec);
- fmt += read;
+ fmt = format_decode(fmt, &spec);
switch (spec.type) {
case FORMAT_TYPE_NONE: {
- int copy = read;
+ int read = fmt - old_fmt;
if (str < end) {
+ int copy = read;
if (copy > end - str)
copy = end - str;
memcpy(str, old_fmt, copy);
})
while (*fmt) {
- int read = format_decode(fmt, &spec);
-
- fmt += read;
+ fmt = format_decode(fmt, &spec);
switch (spec.type) {
case FORMAT_TYPE_NONE:
while (*fmt) {
const char *old_fmt = fmt;
- int read = format_decode(fmt, &spec);
unsigned long long num;
- fmt += read;
-
+ fmt = format_decode(fmt, &spec);
switch (spec.type) {
case FORMAT_TYPE_NONE: {
- int copy = read;
+ int read = fmt - old_fmt;
if (str < end) {
+ int copy = read;
if (copy > end - str)
copy = end - str;
memcpy(str, old_fmt, copy);