diff options
Diffstat (limited to 'lib/vsprintf.c')
-rw-r--r-- | lib/vsprintf.c | 71 |
1 files changed, 38 insertions, 33 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index af4aaa6c36f3..0d461c7c14db 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
@@ -381,8 +381,8 @@ static noinline char *put_dec(char *buf, unsigned long long num) | |||
381 | #define PLUS 4 /* show plus */ | 381 | #define PLUS 4 /* show plus */ |
382 | #define SPACE 8 /* space if plus */ | 382 | #define SPACE 8 /* space if plus */ |
383 | #define LEFT 16 /* left justified */ | 383 | #define LEFT 16 /* left justified */ |
384 | #define SMALL 32 /* Must be 32 == 0x20 */ | 384 | #define SMALL 32 /* use lowercase in hex (must be 32 == 0x20) */ |
385 | #define SPECIAL 64 /* 0x */ | 385 | #define SPECIAL 64 /* prefix hex with "0x", octal with "0" */ |
386 | 386 | ||
387 | enum format_type { | 387 | enum format_type { |
388 | FORMAT_TYPE_NONE, /* Just a string part */ | 388 | FORMAT_TYPE_NONE, /* Just a string part */ |
@@ -408,12 +408,12 @@ enum format_type { | |||
408 | }; | 408 | }; |
409 | 409 | ||
410 | struct printf_spec { | 410 | struct printf_spec { |
411 | enum format_type type; | 411 | u16 type; |
412 | int flags; /* flags to number() */ | 412 | s16 field_width; /* width of output field */ |
413 | int field_width; /* width of output field */ | 413 | u8 flags; /* flags to number() */ |
414 | int base; | 414 | u8 base; |
415 | int precision; /* # of digits/chars */ | 415 | s8 precision; /* # of digits/chars */ |
416 | int qualifier; | 416 | u8 qualifier; |
417 | }; | 417 | }; |
418 | 418 | ||
419 | static char *number(char *buf, char *end, unsigned long long num, | 419 | static char *number(char *buf, char *end, unsigned long long num, |
@@ -597,22 +597,29 @@ static char *resource_string(char *buf, char *end, struct resource *res, | |||
597 | #ifndef MEM_RSRC_PRINTK_SIZE | 597 | #ifndef MEM_RSRC_PRINTK_SIZE |
598 | #define MEM_RSRC_PRINTK_SIZE 10 | 598 | #define MEM_RSRC_PRINTK_SIZE 10 |
599 | #endif | 599 | #endif |
600 | struct printf_spec hex_spec = { | 600 | static const struct printf_spec io_spec = { |
601 | .base = 16, | 601 | .base = 16, |
602 | .field_width = IO_RSRC_PRINTK_SIZE, | ||
602 | .precision = -1, | 603 | .precision = -1, |
603 | .flags = SPECIAL | SMALL | ZEROPAD, | 604 | .flags = SPECIAL | SMALL | ZEROPAD, |
604 | }; | 605 | }; |
605 | struct printf_spec dec_spec = { | 606 | static const struct printf_spec mem_spec = { |
607 | .base = 16, | ||
608 | .field_width = MEM_RSRC_PRINTK_SIZE, | ||
609 | .precision = -1, | ||
610 | .flags = SPECIAL | SMALL | ZEROPAD, | ||
611 | }; | ||
612 | static const struct printf_spec dec_spec = { | ||
606 | .base = 10, | 613 | .base = 10, |
607 | .precision = -1, | 614 | .precision = -1, |
608 | .flags = 0, | 615 | .flags = 0, |
609 | }; | 616 | }; |
610 | struct printf_spec str_spec = { | 617 | static const struct printf_spec str_spec = { |
611 | .field_width = -1, | 618 | .field_width = -1, |
612 | .precision = 10, | 619 | .precision = 10, |
613 | .flags = LEFT, | 620 | .flags = LEFT, |
614 | }; | 621 | }; |
615 | struct printf_spec flag_spec = { | 622 | static const struct printf_spec flag_spec = { |
616 | .base = 16, | 623 | .base = 16, |
617 | .precision = -1, | 624 | .precision = -1, |
618 | .flags = SPECIAL | SMALL, | 625 | .flags = SPECIAL | SMALL, |
@@ -628,35 +635,31 @@ static char *resource_string(char *buf, char *end, struct resource *res, | |||
628 | 2*RSRC_BUF_SIZE + FLAG_BUF_SIZE + RAW_BUF_SIZE)]; | 635 | 2*RSRC_BUF_SIZE + FLAG_BUF_SIZE + RAW_BUF_SIZE)]; |
629 | 636 | ||
630 | char *p = sym, *pend = sym + sizeof(sym); | 637 | char *p = sym, *pend = sym + sizeof(sym); |
631 | int size = -1, addr = 0; | ||
632 | int decode = (fmt[0] == 'R') ? 1 : 0; | 638 | int decode = (fmt[0] == 'R') ? 1 : 0; |
633 | 639 | const struct printf_spec *specp; | |
634 | if (res->flags & IORESOURCE_IO) { | ||
635 | size = IO_RSRC_PRINTK_SIZE; | ||
636 | addr = 1; | ||
637 | } else if (res->flags & IORESOURCE_MEM) { | ||
638 | size = MEM_RSRC_PRINTK_SIZE; | ||
639 | addr = 1; | ||
640 | } | ||
641 | 640 | ||
642 | *p++ = '['; | 641 | *p++ = '['; |
643 | if (res->flags & IORESOURCE_IO) | 642 | if (res->flags & IORESOURCE_IO) { |
644 | p = string(p, pend, "io ", str_spec); | 643 | p = string(p, pend, "io ", str_spec); |
645 | else if (res->flags & IORESOURCE_MEM) | 644 | specp = &io_spec; |
645 | } else if (res->flags & IORESOURCE_MEM) { | ||
646 | p = string(p, pend, "mem ", str_spec); | 646 | p = string(p, pend, "mem ", str_spec); |
647 | else if (res->flags & IORESOURCE_IRQ) | 647 | specp = &mem_spec; |
648 | } else if (res->flags & IORESOURCE_IRQ) { | ||
648 | p = string(p, pend, "irq ", str_spec); | 649 | p = string(p, pend, "irq ", str_spec); |
649 | else if (res->flags & IORESOURCE_DMA) | 650 | specp = &dec_spec; |
651 | } else if (res->flags & IORESOURCE_DMA) { | ||
650 | p = string(p, pend, "dma ", str_spec); | 652 | p = string(p, pend, "dma ", str_spec); |
651 | else { | 653 | specp = &dec_spec; |
654 | } else { | ||
652 | p = string(p, pend, "??? ", str_spec); | 655 | p = string(p, pend, "??? ", str_spec); |
656 | specp = &mem_spec; | ||
653 | decode = 0; | 657 | decode = 0; |
654 | } | 658 | } |
655 | hex_spec.field_width = size; | 659 | p = number(p, pend, res->start, *specp); |
656 | p = number(p, pend, res->start, addr ? hex_spec : dec_spec); | ||
657 | if (res->start != res->end) { | 660 | if (res->start != res->end) { |
658 | *p++ = '-'; | 661 | *p++ = '-'; |
659 | p = number(p, pend, res->end, addr ? hex_spec : dec_spec); | 662 | p = number(p, pend, res->end, *specp); |
660 | } | 663 | } |
661 | if (decode) { | 664 | if (decode) { |
662 | if (res->flags & IORESOURCE_MEM_64) | 665 | if (res->flags & IORESOURCE_MEM_64) |
@@ -1333,7 +1336,7 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) | |||
1333 | break; | 1336 | break; |
1334 | 1337 | ||
1335 | case FORMAT_TYPE_NRCHARS: { | 1338 | case FORMAT_TYPE_NRCHARS: { |
1336 | int qualifier = spec.qualifier; | 1339 | u8 qualifier = spec.qualifier; |
1337 | 1340 | ||
1338 | if (qualifier == 'l') { | 1341 | if (qualifier == 'l') { |
1339 | long *ip = va_arg(args, long *); | 1342 | long *ip = va_arg(args, long *); |
@@ -1619,7 +1622,7 @@ do { \ | |||
1619 | 1622 | ||
1620 | case FORMAT_TYPE_NRCHARS: { | 1623 | case FORMAT_TYPE_NRCHARS: { |
1621 | /* skip %n 's argument */ | 1624 | /* skip %n 's argument */ |
1622 | int qualifier = spec.qualifier; | 1625 | u8 qualifier = spec.qualifier; |
1623 | void *skip_arg; | 1626 | void *skip_arg; |
1624 | if (qualifier == 'l') | 1627 | if (qualifier == 'l') |
1625 | skip_arg = va_arg(args, long *); | 1628 | skip_arg = va_arg(args, long *); |
@@ -1885,7 +1888,9 @@ int vsscanf(const char *buf, const char *fmt, va_list args) | |||
1885 | char *next; | 1888 | char *next; |
1886 | char digit; | 1889 | char digit; |
1887 | int num = 0; | 1890 | int num = 0; |
1888 | int qualifier, base, field_width; | 1891 | u8 qualifier; |
1892 | u8 base; | ||
1893 | s16 field_width; | ||
1889 | bool is_sign; | 1894 | bool is_sign; |
1890 | 1895 | ||
1891 | while (*fmt && *str) { | 1896 | while (*fmt && *str) { |
@@ -1963,7 +1968,7 @@ int vsscanf(const char *buf, const char *fmt, va_list args) | |||
1963 | { | 1968 | { |
1964 | char *s = (char *)va_arg(args, char *); | 1969 | char *s = (char *)va_arg(args, char *); |
1965 | if (field_width == -1) | 1970 | if (field_width == -1) |
1966 | field_width = INT_MAX; | 1971 | field_width = SHORT_MAX; |
1967 | /* first, skip leading white space in buffer */ | 1972 | /* first, skip leading white space in buffer */ |
1968 | str = skip_spaces(str); | 1973 | str = skip_spaces(str); |
1969 | 1974 | ||