Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Oct 2012 08:40:00 GMT
From:      Andrey Simonenko <simon@comsys.ntu-kpi.kiev.ua>
To:        freebsd-net@FreeBSD.org
Subject:   kern/92880: [libc] [patch] almost rewritten inet_network(3) function
Message-ID:  <201210230840.q9N8e038066538@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/92880; it has been noted by GNATS.

From: Andrey Simonenko <simon@comsys.ntu-kpi.kiev.ua>
To: bug-followup@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);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201210230840.q9N8e038066538>