]> git.hungrycats.org Git - linux/commitdiff
[PATCH] Teach sscanf about 'hh' and 'll'
authorAlexander Viro <viro@parcelfarce.linux.theplanet.co.uk>
Sat, 7 Aug 2004 12:14:56 +0000 (05:14 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Sat, 7 Aug 2004 12:14:56 +0000 (05:14 -0700)
Adds support for 'hh' (store number in char *) and 'll' (proper C99 for
long long) modifiers to sscanf().

lib/vsprintf.c

index b1f5c9deede5f32ef90cebfe8ec064248eb42a09..0b0935915066aa33841feab4f547be008621bcb6 100644 (file)
@@ -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 *);