aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-07-06 19:24:57 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-07-06 19:24:57 -0400
commit4d8a743cdd2690c0bc8d1b8cbd02cffb1ead849f (patch)
tree772c0e66fba248da8736edc4b633ddf294b86e8b
parent78a8bf69b32980879975f7e31d30386c50bfe851 (diff)
vsprintf: add infrastructure support for extended '%p' specifiers
This expands the kernel '%p' handling with an arbitrary alphanumberic specifier extension string immediately following the '%p'. Right now it's just being ignored, but the next commit will start adding some specific pointer type extensions. NOTE! The reason the extension is appended to the '%p' is to allow minimal gcc type checking: gcc will still see the '%p' and will check that the argument passed in is indeed a pointer, and yet will not complain about the extended information that gcc doesn't understand about (on the other hand, it also won't actually check that the pointer type and the extension are compatible). Alphanumeric characters were chosen because there is no sane existing use for a string format with a hex pointer representation immediately followed by alphanumerics (which is what such a format string would have traditionally resulted in). Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--lib/vsprintf.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index f569feb7662e..5d6f0718b6d9 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -511,7 +511,14 @@ static char *string(char *buf, char *end, char *s, int field_width, int precisio
511 return buf; 511 return buf;
512} 512}
513 513
514static char *pointer(char *buf, char *end, void *ptr, int field_width, int precision, int flags) 514/*
515 * Show a '%p' thing. A kernel extension is that the '%p' is followed
516 * by an extra set of alphanumeric characters that are extended format
517 * specifiers.
518 *
519 * Right now don't actually handle any such, but we will..
520 */
521static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field_width, int precision, int flags)
515{ 522{
516 flags |= SMALL; 523 flags |= SMALL;
517 if (field_width == -1) { 524 if (field_width == -1) {
@@ -663,7 +670,12 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
663 continue; 670 continue;
664 671
665 case 'p': 672 case 'p':
666 str = pointer(str, end, va_arg(args, void *), field_width, precision, flags); 673 str = pointer(fmt+1, str, end,
674 va_arg(args, void *),
675 field_width, precision, flags);
676 /* Skip all alphanumeric pointer suffixes */
677 while (isalnum(fmt[1]))
678 fmt++;
667 continue; 679 continue;
668 680
669 case 'n': 681 case 'n':