aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhaolei <zhaolei@cn.fujitsu.com>2009-03-27 05:07:05 -0400
committerIngo Molnar <mingo@elte.hu>2009-04-08 11:04:30 -0400
commita4e94ef0dd391eae05bdeacd12b8da3510957a97 (patch)
tree6ef080876d54e2f3b52bb551daf8e4cd601beff8
parent022624a758dc9489388a99ad29577b4c8c09237c (diff)
printk: add support of hh length modifier for printk
Impact: new feature, extend vsprintf format strings hh is used as length modifier for signed char or unsigned char. It is supported by glibc, we add kernel support now. Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com> Acked-by: Lai Jiangshan <laijs@cn.fujitsu.com> Acked-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: torvalds@linux-foundation.org Cc: Steven Rostedt <rostedt@goodmis.org> LKML-Reference: <49CC9739.30107@cn.fujitsu.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--lib/vsprintf.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 7536acea135b..b56f6d039d21 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -408,6 +408,8 @@ enum format_type {
408 FORMAT_TYPE_LONG_LONG, 408 FORMAT_TYPE_LONG_LONG,
409 FORMAT_TYPE_ULONG, 409 FORMAT_TYPE_ULONG,
410 FORMAT_TYPE_LONG, 410 FORMAT_TYPE_LONG,
411 FORMAT_TYPE_UBYTE,
412 FORMAT_TYPE_BYTE,
411 FORMAT_TYPE_USHORT, 413 FORMAT_TYPE_USHORT,
412 FORMAT_TYPE_SHORT, 414 FORMAT_TYPE_SHORT,
413 FORMAT_TYPE_UINT, 415 FORMAT_TYPE_UINT,
@@ -853,11 +855,15 @@ qualifier:
853 spec->qualifier = -1; 855 spec->qualifier = -1;
854 if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || 856 if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' ||
855 *fmt == 'Z' || *fmt == 'z' || *fmt == 't') { 857 *fmt == 'Z' || *fmt == 'z' || *fmt == 't') {
856 spec->qualifier = *fmt; 858 spec->qualifier = *fmt++;
857 ++fmt; 859 if (unlikely(spec->qualifier == *fmt)) {
858 if (spec->qualifier == 'l' && *fmt == 'l') { 860 if (spec->qualifier == 'l') {
859 spec->qualifier = 'L'; 861 spec->qualifier = 'L';
860 ++fmt; 862 ++fmt;
863 } else if (spec->qualifier == 'h') {
864 spec->qualifier = 'H';
865 ++fmt;
866 }
861 } 867 }
862 } 868 }
863 869
@@ -919,6 +925,11 @@ qualifier:
919 spec->type = FORMAT_TYPE_SIZE_T; 925 spec->type = FORMAT_TYPE_SIZE_T;
920 } else if (spec->qualifier == 't') { 926 } else if (spec->qualifier == 't') {
921 spec->type = FORMAT_TYPE_PTRDIFF; 927 spec->type = FORMAT_TYPE_PTRDIFF;
928 } else if (spec->qualifier == 'H') {
929 if (spec->flags & SIGN)
930 spec->type = FORMAT_TYPE_BYTE;
931 else
932 spec->type = FORMAT_TYPE_UBYTE;
922 } else if (spec->qualifier == 'h') { 933 } else if (spec->qualifier == 'h') {
923 if (spec->flags & SIGN) 934 if (spec->flags & SIGN)
924 spec->type = FORMAT_TYPE_SHORT; 935 spec->type = FORMAT_TYPE_SHORT;
@@ -1087,6 +1098,12 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
1087 case FORMAT_TYPE_PTRDIFF: 1098 case FORMAT_TYPE_PTRDIFF:
1088 num = va_arg(args, ptrdiff_t); 1099 num = va_arg(args, ptrdiff_t);
1089 break; 1100 break;
1101 case FORMAT_TYPE_UBYTE:
1102 num = (unsigned char) va_arg(args, int);
1103 break;
1104 case FORMAT_TYPE_BYTE:
1105 num = (signed char) va_arg(args, int);
1106 break;
1090 case FORMAT_TYPE_USHORT: 1107 case FORMAT_TYPE_USHORT:
1091 num = (unsigned short) va_arg(args, int); 1108 num = (unsigned short) va_arg(args, int);
1092 break; 1109 break;
@@ -1363,6 +1380,10 @@ do { \
1363 case FORMAT_TYPE_PTRDIFF: 1380 case FORMAT_TYPE_PTRDIFF:
1364 save_arg(ptrdiff_t); 1381 save_arg(ptrdiff_t);
1365 break; 1382 break;
1383 case FORMAT_TYPE_UBYTE:
1384 case FORMAT_TYPE_BYTE:
1385 save_arg(char);
1386 break;
1366 case FORMAT_TYPE_USHORT: 1387 case FORMAT_TYPE_USHORT:
1367 case FORMAT_TYPE_SHORT: 1388 case FORMAT_TYPE_SHORT:
1368 save_arg(short); 1389 save_arg(short);
@@ -1538,6 +1559,12 @@ int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf)
1538 case FORMAT_TYPE_PTRDIFF: 1559 case FORMAT_TYPE_PTRDIFF:
1539 num = get_arg(ptrdiff_t); 1560 num = get_arg(ptrdiff_t);
1540 break; 1561 break;
1562 case FORMAT_TYPE_UBYTE:
1563 num = get_arg(unsigned char);
1564 break;
1565 case FORMAT_TYPE_BYTE:
1566 num = get_arg(signed char);
1567 break;
1541 case FORMAT_TYPE_USHORT: 1568 case FORMAT_TYPE_USHORT:
1542 num = get_arg(unsigned short); 1569 num = get_arg(unsigned short);
1543 break; 1570 break;