The following reply was made to PR kern/92880; it has been noted by GNATS.

From: Andrey Simonenko <si...@comsys.ntu-kpi.kiev.ua>
To: bug-follo...@freebsd.org
Cc:  
Subject: kern/92880: [libc] [patch] almost rewritten inet_network(3) function
Date: Tue, 23 Oct 2012 11:36:04 +0300

 I optimized inet_network() again.
 
 Difference between implementation of inet_network(3) from 9.1-PRERELEASE
 and my implementation.
 
 STRING                 INET_NETWORK    INET_NETWORK_NEW
 "0x12"                 0x00000012      0x00000012
 "127.1"                        0x00007f01      0x00007f01
 "127.1.2.3"            0x7f010203      0x7f010203
 "0x123456"             INADDR_NONE     INADDR_NONE
 "0x12.0x34"            0x00001234      0x00001234
 "0x12.0x345"           INADDR_NONE     INADDR_NONE
 "1.2.3.4.5"            INADDR_NONE     INADDR_NONE
 "1..3.4"               INADDR_NONE     INADDR_NONE
 "."                    INADDR_NONE     INADDR_NONE
 "1."                   INADDR_NONE     INADDR_NONE
 ".1"                   INADDR_NONE     INADDR_NONE
 "0x"                   0x00000000      INADDR_NONE     <---
 "0"                    0x00000000      0x00000000
 "01.02.07.077"         0x0102073f      0x0102073f
 "0x1.23.045.0"         0x01172500      0x01172500
 ""                     INADDR_NONE     INADDR_NONE
 " "                    INADDR_NONE     INADDR_NONE
 " f"                   INADDR_NONE     INADDR_NONE
 "bar"                  INADDR_NONE     INADDR_NONE
 "1.2bar"               INADDR_NONE     INADDR_NONE
 "1."                   INADDR_NONE     INADDR_NONE
 "=CA=C3=D5=CB=C5=CE"           INADDR_NONE     INADDR_NONE
 "255.255.255.255"      INADDR_NONE     INADDR_NONE
 "x"                    INADDR_NONE     INADDR_NONE
 "0X12"                 0x00000012      0x00000012
 "078"                  INADDR_NONE     INADDR_NONE
 "1 bar"                        0x00000001      INADDR_NONE     <---
 "127.0xabcd"           INADDR_NONE     INADDR_NONE
 "128"                  0x00000080      0x00000080
 "0.1.2"                        0x00000102      0x00000102
 "0xff.010.23.0xa0"     0xff0817a0      0xff0817a0
 "x10"                  0x00000010      INADDR_NONE     <---
 "X20"                  0x00000020      INADDR_NONE     <---
 "x10.x20"              0x00001020      INADDR_NONE     <---
 "4294967297"           0x00000001      INADDR_NONE     <---
 "0x10000000f"          0x0000000f      INADDR_NONE     <---
 "040000000003"         0x00000003      INADDR_NONE     <---
 
 #include <sys/types.h>
 #include <sys/socket.h>
 
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
 #include <ctype.h>
 #include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
 static in_addr_t
 inet_network_new(const char *s)
 {
        u_int d, base, dots;
        in_addr_t addr, byte;
        u_char c;
        bool flag;
 
        addr =3D 0;
        dots =3D 0;
        for (;; ++s) {
                byte =3D 0;
                flag =3D false;
                if (*s =3D=3D '0') {
                        ++s;
                        if (*s =3D=3D 'x' || *s =3D=3D 'X') {
                                ++s;
                                base =3D 16;
                        } else {
                                base =3D 8;
                                flag =3D true;
                        }
                } else
                        base =3D 10;
                for (; (c =3D *s) !=3D '\0'; ++s) {
                        d =3D digittoint(c);
                        if (c !=3D '0' && (d =3D=3D 0 || d >=3D base))
                                break;
                        byte =3D byte * base + d;
                        if (byte > UINT8_MAX)
                                return (INADDR_NONE);
                        flag =3D true;
                }
                if (!flag)
                        return (INADDR_NONE);
                addr =3D (addr << 8) | byte;
                if (c !=3D '.')
                        break;
                if (++dots =3D=3D 4)
                        return (INADDR_NONE);
        }
        return (c =3D=3D '\0' ? addr : INADDR_NONE);
 }
 
 int
 main(void)
 {
        const char *const addr_str_tbl[] =3D {
            "0x12", "127.1", "127.1.2.3", "0x123456", "0x12.0x34",
            "0x12.0x345", "1.2.3.4.5", "1..3.4", ".", "1.", ".1", "0x",
            "0", "01.02.07.077", "0x1.23.045.0", "", " ", " f", "bar",
            "1.2bar", "1.", "=CA=C3=D5=CB=C5=CE", "255.255.255.255", "x", 
"0X12"=
 , "078",
            "1 bar", "127.0xabcd", "128", "0.1.2", "0xff.010.23.0xa0",
            "x10", "X20", "x10.x20", "4294967297", "0x10000000f",
            "040000000003", NULL };
        const char *const *addr_str;
        size_t len;
        in_addr_t addr1, addr2;
 
        printf("STRING\t\t\tINET_NETWORK\tINET_NETWORK_NEW\n");
        for (addr_str =3D addr_str_tbl; *addr_str !=3D NULL; ++addr_str) {
                printf("\"%s\"", *addr_str);
                len =3D strlen(*addr_str) + 2;
                if (len < 8)
                        printf("\t\t\t");
                else if (len < 16)
                        printf("\t\t");
                else
                        printf("\t");
                addr1 =3D inet_network(*addr_str);
                if (addr1 =3D=3D INADDR_NONE)
                        printf("INADDR_NONE\t");
                else
                        printf("0x%08x\t", addr1);
                addr2 =3D inet_network_new(*addr_str);
                if (addr2 =3D=3D INADDR_NONE)
                        printf("INADDR_NONE");
                else
                        printf("0x%08x", addr2);
                if (addr1 !=3D addr2)
                        printf("\t<---");
                printf("\n");
        }
        return (0);
 }
_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to