aboutsummaryrefslogtreecommitdiffstats
path: root/lib/vsprintf.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2010-04-03 18:49:14 -0400
committerDavid S. Miller <davem@davemloft.net>2010-04-03 18:49:14 -0400
commit87e8b821ed8db3dab03d96cd542e29666bf210aa (patch)
tree0027060473aafbbb125655ba027319c8a1a665fc /lib/vsprintf.c
parent33cd9dfa3a13e3d8e41aef225a9f98169816723b (diff)
parent5e11611a5d22252f3f9c169a3c9377eac0c32033 (diff)
Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
Diffstat (limited to 'lib/vsprintf.c')
-rw-r--r--lib/vsprintf.c84
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
387enum format_type { 387enum 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
410struct printf_spec { 410struct 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
419static char *number(char *buf, char *end, unsigned long long num, 419static 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