From: Alexander Viro Date: Sat, 7 Aug 2004 12:14:56 +0000 (-0700) Subject: [PATCH] Teach sscanf about 'hh' and 'll' X-Git-Tag: v2.6.8-rc4~14 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=dc4d629f8c94848e15a618f6d9d0e8778cd319ff;p=history.git [PATCH] Teach sscanf about 'hh' and 'll' Adds support for 'hh' (store number in char *) and 'll' (proper C99 for long long) modifiers to sscanf(). --- diff --git a/lib/vsprintf.c b/lib/vsprintf.c index b1f5c9deede5..0b0935915066 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -668,8 +668,16 @@ int vsscanf(const char * buf, const char * fmt, va_list args) qualifier = -1; if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || *fmt == 'Z' || *fmt == 'z') { - qualifier = *fmt; - fmt++; + qualifier = *fmt++; + if (unlikely(qualifier == *fmt)) { + if (qualifier == 'h') { + qualifier = 'H'; + fmt++; + } else if (qualifier == 'l') { + qualifier = 'L'; + fmt++; + } + } } base = 10; is_sign = 0; @@ -754,6 +762,15 @@ int vsscanf(const char * buf, const char * fmt, va_list args) break; switch(qualifier) { + case 'H': /* that's 'hh' in format */ + if (is_sign) { + signed char *s = (signed char *) va_arg(args,signed char *); + *s = (signed char) simple_strtol(str,&next,base); + } else { + unsigned char *s = (unsigned char *) va_arg(args, unsigned char *); + *s = (unsigned char) simple_strtoul(str, &next, base); + } + break; case 'h': if (is_sign) { short *s = (short *) va_arg(args,short *);