xref: /csrg-svn/lib/libc/net/inet_addr.c (revision 8309)
1*8309Ssam /*	inet_addr.c	4.1	82/10/05	*/
2*8309Ssam /*
3*8309Ssam  * Internet address interpretation routine.
4*8309Ssam  * All the network library routines call this
5*8309Ssam  * routine to interpret entries in the data bases
6*8309Ssam  * which are expected to be an address.
7*8309Ssam  */
8*8309Ssam u_long
9*8309Ssam inet_addr(cp)
10*8309Ssam 	register char *cp;
11*8309Ssam {
12*8309Ssam 	register unsigned long val, base, n;
13*8309Ssam 	register char c;
14*8309Ssam 	unsigned long parts[4], *pp = parts;
15*8309Ssam 
16*8309Ssam again:
17*8309Ssam 	val = 0; base = 10;
18*8309Ssam 	if (*cp == '0')
19*8309Ssam 		base = 8, cp++;
20*8309Ssam 	if (*cp == 'x' || *cp == 'X')
21*8309Ssam 		base = 16, cp++;
22*8309Ssam 	while (c = *cp) {
23*8309Ssam 		if (isdigit(c)) {
24*8309Ssam 			val = (val * base) + (c - '0');
25*8309Ssam 			cp++;
26*8309Ssam 			continue;
27*8309Ssam 		}
28*8309Ssam 		if (base == 16 && isxdigit(c)) {
29*8309Ssam 			val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A'));
30*8309Ssam 			cp++;
31*8309Ssam 			continue;
32*8309Ssam 		}
33*8309Ssam 		break;
34*8309Ssam 	}
35*8309Ssam 	if (*cp == '.') {
36*8309Ssam 		/*
37*8309Ssam 		 * Internet format:
38*8309Ssam 		 *	a.b.c.d
39*8309Ssam 		 *	a.b.c	(with c treated as 16-bits)
40*8309Ssam 		 *	a.b	(with b treated as 24 bits)
41*8309Ssam 		 */
42*8309Ssam 		if (pp >= parts + 4)
43*8309Ssam 			return (-1);
44*8309Ssam 		*pp++ = val, cp++;
45*8309Ssam 		goto again;
46*8309Ssam 	}
47*8309Ssam 	if (*cp && !isspace(*cp))
48*8309Ssam 		return (-1);
49*8309Ssam 	n = pp - parts;
50*8309Ssam 	if (n > 0) {
51*8309Ssam 		if (n > 4)
52*8309Ssam 			return (-1);
53*8309Ssam 		*pp++ = val; n++;
54*8309Ssam 		val = parts[0];
55*8309Ssam 		if (n > 1)
56*8309Ssam 			val <<= 24;
57*8309Ssam 		if (n > 2)
58*8309Ssam 			val |= (parts[1] & 0xff) << 16;
59*8309Ssam 		if (n > 3)
60*8309Ssam 			val |= (parts[2] & 0xff) << 8;
61*8309Ssam 		if (n > 1)
62*8309Ssam 			val |= parts[n - 1];
63*8309Ssam #if vax || pdp11
64*8309Ssam 		val = htonl(val);
65*8309Ssam #endif
66*8309Ssam 	}
67*8309Ssam 	return (val);
68*8309Ssam }
69*8309Ssam 
70