mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
Update.
* resolv/inet_addr.c (inet_aton): Optimize switch statement away.
This commit is contained in:
@ -99,6 +99,7 @@ inet_aton(cp, addr)
|
||||
const char *cp;
|
||||
struct in_addr *addr;
|
||||
{
|
||||
static const u_int32_t max[4] = { 0xffffffff, 0xffffff, 0xffff, 0xff };
|
||||
register u_int32_t val; /* changed from u_long --david */
|
||||
#ifndef _LIBC
|
||||
register int base;
|
||||
@ -113,6 +114,8 @@ inet_aton(cp, addr)
|
||||
__set_errno (0);
|
||||
#endif
|
||||
|
||||
memset (parts, '\0', sizeof (parts));
|
||||
|
||||
c = *cp;
|
||||
for (;;) {
|
||||
/*
|
||||
@ -178,33 +181,14 @@ inet_aton(cp, addr)
|
||||
* the number of parts specified.
|
||||
*/
|
||||
n = pp - parts + 1;
|
||||
switch (n) {
|
||||
|
||||
case 0:
|
||||
goto ret_0; /* initial nondigit */
|
||||
if (n == 0 /* initial nondigit */
|
||||
|| parts[0] > 0xff || parts[1] > 0xff || parts[2] > 0xff
|
||||
|| val > max[n - 1])
|
||||
goto ret_0;
|
||||
|
||||
case 1: /* a -- 32 bits */
|
||||
break;
|
||||
val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
|
||||
|
||||
case 2: /* a.b -- 8.24 bits */
|
||||
if (parts[0] > 0xff || val > 0xffffff)
|
||||
goto ret_0;
|
||||
val |= parts[0] << 24;
|
||||
break;
|
||||
|
||||
case 3: /* a.b.c -- 8.8.16 bits */
|
||||
if (parts[0] > 0xff || parts[1] > 0xff || val > 0xffff)
|
||||
goto ret_0;
|
||||
val |= (parts[0] << 24) | (parts[1] << 16);
|
||||
break;
|
||||
|
||||
case 4: /* a.b.c.d -- 8.8.8.8 bits */
|
||||
if (parts[0] > 0xff || parts[1] > 0xff || parts[2] > 0xff
|
||||
|| val > 0xff)
|
||||
goto ret_0;
|
||||
val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
|
||||
break;
|
||||
}
|
||||
if (addr)
|
||||
addr->s_addr = htonl(val);
|
||||
|
||||
|
@ -24,6 +24,7 @@ static char rcsid[] = "$Id$";
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <arpa/nameser.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <conf/portability.h>
|
||||
|
Reference in New Issue
Block a user