diff options
author | Andrew Morton <akpm@digeo.com> | 2003-02-11 21:38:37 -0800 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2003-02-11 21:38:37 -0800 |
commit | 7f9397987172533e6df5e0f5f0a6a16f8f3d19c4 (patch) | |
tree | 904be94a3ce8cde29c257d83cc2f5394a04cd930 /lib | |
parent | 61b8dae6813f1f2558cfd0a37f39fa75ed37d9a5 (diff) | |
download | history-7f9397987172533e6df5e0f5f0a6a16f8f3d19c4.tar.gz |
[PATCH] printk size_t qualifier confusion
My printf manpage says:
z A following integer conversion corresponds to a
size_t or ssize_t argument. (Linux libc5 has Z with
this meaning. Don't use it.)
And the opengroup spec says
z Specifies that a following d , i , o , u , x , or X conversion specifier
applies to a size_t or the corresponding signed integer type argument; or
that a following n conversion specifier applies to a pointer to a signed
integer type corresponding to a size_t argument.
yet our vsnprintf implementation has
/* 'z' support added 23/7/1999 S.H. */
/* 'z' changed to 'Z' --davidm 1/25/99 */
I guess the path of least surprise is to support both. gcc-3.2.1 doesn't
seem to care.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/vsprintf.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 0889e9e5a2e7fe..f790458f4520a5 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -306,7 +306,8 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) /* get the conversion qualifier */ qualifier = -1; - if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || *fmt =='Z') { + if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || + *fmt =='Z' || *fmt == 'z') { qualifier = *fmt; ++fmt; if (qualifier == 'l' && *fmt == 'l') { @@ -381,7 +382,7 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) if (qualifier == 'l') { long * ip = va_arg(args, long *); *ip = (str - buf); - } else if (qualifier == 'Z') { + } else if (qualifier == 'Z' || qualifier == 'z') { size_t * ip = va_arg(args, size_t *); *ip = (str - buf); } else { @@ -432,7 +433,7 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) num = va_arg(args, unsigned long); if (flags & SIGN) num = (signed long) num; - } else if (qualifier == 'Z') { + } else if (qualifier == 'Z' || qualifier == 'z') { num = va_arg(args, size_t); } else if (qualifier == 'h') { num = (unsigned short) va_arg(args, int); @@ -565,7 +566,8 @@ int vsscanf(const char * buf, const char * fmt, va_list args) /* get conversion qualifier */ qualifier = -1; - if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || *fmt == 'Z') { + if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || + *fmt == 'Z' || *fmt == 'z') { qualifier = *fmt; fmt++; } @@ -680,6 +682,7 @@ int vsscanf(const char * buf, const char * fmt, va_list args) } break; case 'Z': + case 'z': { size_t *s = (size_t*) va_arg(args,size_t*); *s = (size_t) simple_strtoul(str,&next,base); |