diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-07-31 11:14:46 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-07-31 11:14:46 +0000 |
commit | c3966b88eeb1e0b5726ca16a70a94269d40ee152 (patch) | |
tree | 01b5267fea81493dda40ddbad0391c4a35c19c76 /stdio-common/vfscanf.c | |
parent | bdd421cc6d055af6a1a561344b2fa56267cad617 (diff) | |
download | glibc-c3966b88eeb1e0b5726ca16a70a94269d40ee152.zip glibc-c3966b88eeb1e0b5726ca16a70a94269d40ee152.tar.gz glibc-c3966b88eeb1e0b5726ca16a70a94269d40ee152.tar.bz2 |
Update.
1998-07-31 11:10 Ulrich Drepper <drepper@cygnus.com>
* elf/elf.h: Add lots of new symbols from Irix and Solaris.
* sysdeps/unix/sysv/linux/sigstack.c: Include stddef.h to get NULL
definition.
1998-07-31 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
* sunrpc/xcrypt.c: Use only the first 8 characters of the password.
1998-07-30 21:06 -0400 Zack Weinberg <zack@rabi.phys.columbia.edu>
* sysdeps/generic/glob.c: Undefine strdup before defining it,
because bits/string2.h may have defined it already.
1998-07-29 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* stdio-common/vfscanf.c: Optimize looking for type modifiers.
Fix recognition of 'a' modifier vs. 'a' format.
(TYPEMOD): Removed.
* stdio-common/printf-parse.h (parse_one_spec): Optimize looking
for type modifiers. Fix recognition of 'hh' modifier.
1998-07-31 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
* sunrpc/svc_unix.c: Fix typo.
1998-07-31 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
* sysdeps/unix/sysv/linux/recvmsg.c: Don't check for SCM_CREDS before
syscall.
Diffstat (limited to 'stdio-common/vfscanf.c')
-rw-r--r-- | stdio-common/vfscanf.c | 141 |
1 files changed, 62 insertions, 79 deletions
diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c index ce5e512..116b19b 100644 --- a/stdio-common/vfscanf.c +++ b/stdio-common/vfscanf.c @@ -47,8 +47,6 @@ # define MALLOC 0x100 /* a: malloc strings */ # define CHAR 0x200 /* hh: char */ -# define TYPEMOD (LONG|LONGDBL|SHORT|CHAR) - #ifdef USE_IN_LIBIO # include <libioP.h> @@ -408,84 +406,69 @@ __vfscanf (FILE *s, const char *format, va_list argptr) width = -1; /* Check for type modifiers. */ - while (*f == 'h' || *f == 'l' || *f == 'L' || *f == 'a' || *f == 'q' - || *f == 'z' || *f == 't' || *f == 'j') - switch (*f++) - { - case 'h': - /* int's are short int's. */ - if (flags & (LONG|LONGDBL|CHAR)) - /* Signal illegal format element. */ - conv_error (); - if (flags & SHORT) - { - flags &= ~SHORT; - flags |= CHAR; - } - else - flags |= SHORT; - break; - case 'l': - if (flags & (SHORT|LONGDBL|CHAR)) - conv_error (); - else if (flags & LONG) - { - /* A double `l' is equivalent to an `L'. */ - flags &= ~LONG; - flags |= LONGDBL; - } - else - /* int's are long int's. */ - flags |= LONG; - break; - case 'q': - case 'L': - /* double's are long double's, and int's are long long int's. */ - if (flags & TYPEMOD) - /* Signal illegal format element. */ - conv_error (); - flags |= LONGDBL; - break; - case 'a': - /* The `a' is used as a flag only if followed by `s', `S' or - `['. */ - if (*f != 's' && *f != 'S' && *f != '[') - { - --f; - break; - } - if (flags & TYPEMOD) - /* Signal illegal format element. */ - conv_error (); - /* String conversions (%s, %[) take a `char **' - arg and fill it in with a malloc'd pointer. */ - flags |= MALLOC; - break; - case 'z': - if (flags & (SHORT|LONGDBL|CHAR)) - conv_error (); - if (sizeof (size_t) > sizeof (unsigned long int)) - flags |= LONGDBL; - else if (sizeof (size_t) > sizeof (unsigned int)) - flags |= LONG; - break; - case 'j': - if (flags & (SHORT|LONGDBL|CHAR)) - conv_error (); - if (sizeof (intmax_t) > sizeof (unsigned long int)) - flags |= LONGDBL; - else if (sizeof (intmax_t) > sizeof (unsigned int)) - flags |= LONG; - break; - case 't': - if (flags & (SHORT|LONGDBL|CHAR)) - conv_error (); - if (sizeof (ptrdiff_t) > sizeof (unsigned long int)) + switch (*f++) + { + case 'h': + /* ints are short ints or chars. */ + if (*f == 'h') + { + ++f; + flags |= CHAR; + } + else + flags |= SHORT; + break; + case 'l': + if (*f == 'l') + { + /* A double `l' is equivalent to an `L'. */ + ++f; flags |= LONGDBL; - else if (sizeof (ptrdiff_t) > sizeof (unsigned int)) - flags |= LONG; - break; - } + } + else + /* ints are long ints. */ + flags |= LONG; + break; + case 'q': + case 'L': + /* doubles are long doubles, and ints are long long ints. */ + flags |= LONGDBL; + break; + case 'a': + /* The `a' is used as a flag only if followed by `s', `S' or + `['. */ + if (*f != 's' && *f != 'S' && *f != '[') + { + --f; + break; + } + /* String conversions (%s, %[) take a `char **' + arg and fill it in with a malloc'd pointer. */ + flags |= MALLOC; + break; + case 'z': + if (sizeof (size_t) > sizeof (unsigned long int)) + flags |= LONGDBL; + else if (sizeof (size_t) > sizeof (unsigned int)) + flags |= LONG; + break; + case 'j': + if (sizeof (uintmax_t) > sizeof (unsigned long int)) + flags |= LONGDBL; + else if (sizeof (uintmax_t) > sizeof (unsigned int)) + flags |= LONG; + break; + case 't': + if (sizeof (ptrdiff_t) > sizeof (long int)) + flags |= LONGDBL; + else if (sizeof (ptrdiff_t) > sizeof (int)) + flags |= LONG; + break; + default: + /* Not a recognized modifier. Backup. */ + --f; + break; + } /* End of the format string? */ if (*f == '\0') |