1*8363Ssam /* @(#)inet_network.c 4.2 10/07/82 */ 28362Ssam 38362Ssam #include <sys/types.h> 48362Ssam #include <ctype.h> 58362Ssam 68362Ssam /* 78362Ssam * Internet network address interpretation routine. 88362Ssam * The library routines call this routine to interpret 98362Ssam * network numbers. 108362Ssam */ 118362Ssam u_long 128362Ssam inet_network(cp) 138362Ssam register char *cp; 148362Ssam { 158362Ssam register u_long val, base, n; 168362Ssam register char c; 178362Ssam u_long parts[4], *pp = parts; 18*8363Ssam register int i; 198362Ssam 208362Ssam again: 218362Ssam val = 0; base = 10; 228362Ssam if (*cp == '0') 238362Ssam base = 8, cp++; 248362Ssam if (*cp == 'x' || *cp == 'X') 258362Ssam base = 16, cp++; 268362Ssam while (c = *cp) { 278362Ssam if (isdigit(c)) { 288362Ssam val = (val * base) + (c - '0'); 298362Ssam cp++; 308362Ssam continue; 318362Ssam } 328362Ssam if (base == 16 && isxdigit(c)) { 338362Ssam val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A')); 348362Ssam cp++; 358362Ssam continue; 368362Ssam } 378362Ssam break; 388362Ssam } 398362Ssam if (*cp == '.') { 408362Ssam if (pp >= parts + 4) 418362Ssam return (-1); 428362Ssam *pp++ = val, cp++; 438362Ssam goto again; 448362Ssam } 458362Ssam if (*cp && !isspace(*cp)) 468362Ssam return (-1); 478362Ssam *pp++ = val; 488362Ssam n = pp - parts; 498362Ssam if (n > 4) 508362Ssam return (-1); 518362Ssam for (val = 0, i = 0; i < n; i++) { 528362Ssam val <<= 8; 538362Ssam val |= parts[i] & 0xff; 548362Ssam } 558362Ssam return (val); 568362Ssam } 57