diff options
| author | David S. Miller <davem@davemloft.net> | 2010-04-03 18:49:14 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-04-03 18:49:14 -0400 |
| commit | 87e8b821ed8db3dab03d96cd542e29666bf210aa (patch) | |
| tree | 0027060473aafbbb125655ba027319c8a1a665fc /lib/vsprintf.c | |
| parent | 33cd9dfa3a13e3d8e41aef225a9f98169816723b (diff) | |
| parent | 5e11611a5d22252f3f9c169a3c9377eac0c32033 (diff) | |
Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
Diffstat (limited to 'lib/vsprintf.c')
| -rw-r--r-- | lib/vsprintf.c | 84 |
1 files changed, 50 insertions, 34 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index af4aaa6c36f3..24112e5a5780 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,35 @@ 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 bus_spec = { | ||
| 613 | .base = 16, | ||
| 614 | .field_width = 2, | ||
| 615 | .precision = -1, | ||
| 616 | .flags = SMALL | ZEROPAD, | ||
| 617 | }; | ||
| 618 | static const struct printf_spec dec_spec = { | ||
| 606 | .base = 10, | 619 | .base = 10, |
| 607 | .precision = -1, | 620 | .precision = -1, |
| 608 | .flags = 0, | 621 | .flags = 0, |
| 609 | }; | 622 | }; |
| 610 | struct printf_spec str_spec = { | 623 | static const struct printf_spec str_spec = { |
| 611 | .field_width = -1, | 624 | .field_width = -1, |
| 612 | .precision = 10, | 625 | .precision = 10, |
| 613 | .flags = LEFT, | 626 | .flags = LEFT, |
| 614 | }; | 627 | }; |
| 615 | struct printf_spec flag_spec = { | 628 | static const struct printf_spec flag_spec = { |
| 616 | .base = 16, | 629 | .base = 16, |
| 617 | .precision = -1, | 630 | .precision = -1, |
| 618 | .flags = SPECIAL | SMALL, | 631 | .flags = SPECIAL | SMALL, |
| @@ -622,47 +635,48 @@ static char *resource_string(char *buf, char *end, struct resource *res, | |||
| 622 | * 64-bit res (sizeof==8): 20 chars in dec, 18 in hex ("0x" + 16) */ | 635 | * 64-bit res (sizeof==8): 20 chars in dec, 18 in hex ("0x" + 16) */ |
| 623 | #define RSRC_BUF_SIZE ((2 * sizeof(resource_size_t)) + 4) | 636 | #define RSRC_BUF_SIZE ((2 * sizeof(resource_size_t)) + 4) |
| 624 | #define FLAG_BUF_SIZE (2 * sizeof(res->flags)) | 637 | #define FLAG_BUF_SIZE (2 * sizeof(res->flags)) |
| 625 | #define DECODED_BUF_SIZE sizeof("[mem - 64bit pref disabled]") | 638 | #define DECODED_BUF_SIZE sizeof("[mem - 64bit pref window disabled]") |
| 626 | #define RAW_BUF_SIZE sizeof("[mem - flags 0x]") | 639 | #define RAW_BUF_SIZE sizeof("[mem - flags 0x]") |
| 627 | char sym[max(2*RSRC_BUF_SIZE + DECODED_BUF_SIZE, | 640 | char sym[max(2*RSRC_BUF_SIZE + DECODED_BUF_SIZE, |
| 628 | 2*RSRC_BUF_SIZE + FLAG_BUF_SIZE + RAW_BUF_SIZE)]; | 641 | 2*RSRC_BUF_SIZE + FLAG_BUF_SIZE + RAW_BUF_SIZE)]; |
| 629 | 642 | ||
| 630 | char *p = sym, *pend = sym + sizeof(sym); | 643 | char *p = sym, *pend = sym + sizeof(sym); |
| 631 | int size = -1, addr = 0; | ||
| 632 | int decode = (fmt[0] == 'R') ? 1 : 0; | 644 | int decode = (fmt[0] == 'R') ? 1 : 0; |
| 633 | 645 | 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 | 646 | ||
| 642 | *p++ = '['; | 647 | *p++ = '['; |
| 643 | if (res->flags & IORESOURCE_IO) | 648 | if (res->flags & IORESOURCE_IO) { |
| 644 | p = string(p, pend, "io ", str_spec); | 649 | p = string(p, pend, "io ", str_spec); |
| 645 | else if (res->flags & IORESOURCE_MEM) | 650 | specp = &io_spec; |
| 651 | } else if (res->flags & IORESOURCE_MEM) { | ||
| 646 | p = string(p, pend, "mem ", str_spec); | 652 | p = string(p, pend, "mem ", str_spec); |
| 647 | else if (res->flags & IORESOURCE_IRQ) | 653 | specp = &mem_spec; |
| 654 | } else if (res->flags & IORESOURCE_IRQ) { | ||
| 648 | p = string(p, pend, "irq ", str_spec); | 655 | p = string(p, pend, "irq ", str_spec); |
| 649 | else if (res->flags & IORESOURCE_DMA) | 656 | specp = &dec_spec; |
| 657 | } else if (res->flags & IORESOURCE_DMA) { | ||
| 650 | p = string(p, pend, "dma ", str_spec); | 658 | p = string(p, pend, "dma ", str_spec); |
| 651 | else { | 659 | specp = &dec_spec; |
| 660 | } else if (res->flags & IORESOURCE_BUS) { | ||
| 661 | p = string(p, pend, "bus ", str_spec); | ||
| 662 | specp = &bus_spec; | ||
| 663 | } else { | ||
| 652 | p = string(p, pend, "??? ", str_spec); | 664 | p = string(p, pend, "??? ", str_spec); |
| 665 | specp = &mem_spec; | ||
| 653 | decode = 0; | 666 | decode = 0; |
| 654 | } | 667 | } |
| 655 | hex_spec.field_width = size; | 668 | 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) { | 669 | if (res->start != res->end) { |
| 658 | *p++ = '-'; | 670 | *p++ = '-'; |
| 659 | p = number(p, pend, res->end, addr ? hex_spec : dec_spec); | 671 | p = number(p, pend, res->end, *specp); |
| 660 | } | 672 | } |
| 661 | if (decode) { | 673 | if (decode) { |
| 662 | if (res->flags & IORESOURCE_MEM_64) | 674 | if (res->flags & IORESOURCE_MEM_64) |
| 663 | p = string(p, pend, " 64bit", str_spec); | 675 | p = string(p, pend, " 64bit", str_spec); |
| 664 | if (res->flags & IORESOURCE_PREFETCH) | 676 | if (res->flags & IORESOURCE_PREFETCH) |
| 665 | p = string(p, pend, " pref", str_spec); | 677 | p = string(p, pend, " pref", str_spec); |
| 678 | if (res->flags & IORESOURCE_WINDOW) | ||
| 679 | p = string(p, pend, " window", str_spec); | ||
| 666 | if (res->flags & IORESOURCE_DISABLED) | 680 | if (res->flags & IORESOURCE_DISABLED) |
| 667 | p = string(p, pend, " disabled", str_spec); | 681 | p = string(p, pend, " disabled", str_spec); |
| 668 | } else { | 682 | } else { |
| @@ -1333,7 +1347,7 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) | |||
| 1333 | break; | 1347 | break; |
| 1334 | 1348 | ||
| 1335 | case FORMAT_TYPE_NRCHARS: { | 1349 | case FORMAT_TYPE_NRCHARS: { |
| 1336 | int qualifier = spec.qualifier; | 1350 | u8 qualifier = spec.qualifier; |
| 1337 | 1351 | ||
| 1338 | if (qualifier == 'l') { | 1352 | if (qualifier == 'l') { |
| 1339 | long *ip = va_arg(args, long *); | 1353 | long *ip = va_arg(args, long *); |
| @@ -1619,7 +1633,7 @@ do { \ | |||
| 1619 | 1633 | ||
| 1620 | case FORMAT_TYPE_NRCHARS: { | 1634 | case FORMAT_TYPE_NRCHARS: { |
| 1621 | /* skip %n 's argument */ | 1635 | /* skip %n 's argument */ |
| 1622 | int qualifier = spec.qualifier; | 1636 | u8 qualifier = spec.qualifier; |
| 1623 | void *skip_arg; | 1637 | void *skip_arg; |
| 1624 | if (qualifier == 'l') | 1638 | if (qualifier == 'l') |
| 1625 | skip_arg = va_arg(args, long *); | 1639 | skip_arg = va_arg(args, long *); |
| @@ -1885,7 +1899,9 @@ int vsscanf(const char *buf, const char *fmt, va_list args) | |||
| 1885 | char *next; | 1899 | char *next; |
| 1886 | char digit; | 1900 | char digit; |
| 1887 | int num = 0; | 1901 | int num = 0; |
| 1888 | int qualifier, base, field_width; | 1902 | u8 qualifier; |
| 1903 | u8 base; | ||
| 1904 | s16 field_width; | ||
| 1889 | bool is_sign; | 1905 | bool is_sign; |
| 1890 | 1906 | ||
| 1891 | while (*fmt && *str) { | 1907 | while (*fmt && *str) { |
| @@ -1963,7 +1979,7 @@ int vsscanf(const char *buf, const char *fmt, va_list args) | |||
| 1963 | { | 1979 | { |
| 1964 | char *s = (char *)va_arg(args, char *); | 1980 | char *s = (char *)va_arg(args, char *); |
| 1965 | if (field_width == -1) | 1981 | if (field_width == -1) |
| 1966 | field_width = INT_MAX; | 1982 | field_width = SHORT_MAX; |
| 1967 | /* first, skip leading white space in buffer */ | 1983 | /* first, skip leading white space in buffer */ |
| 1968 | str = skip_spaces(str); | 1984 | str = skip_spaces(str); |
| 1969 | 1985 | ||
