1*8362Ssam /* @(#)inet_network.c 4.1 10/07/82 */ 2*8362Ssam 3*8362Ssam #include <sys/types.h> 4*8362Ssam #include <ctype.h> 5*8362Ssam 6*8362Ssam /* 7*8362Ssam * Internet network address interpretation routine. 8*8362Ssam * The library routines call this routine to interpret 9*8362Ssam * network numbers. 10*8362Ssam */ 11*8362Ssam u_long 12*8362Ssam inet_network(cp) 13*8362Ssam register char *cp; 14*8362Ssam { 15*8362Ssam register u_long val, base, n; 16*8362Ssam register char c; 17*8362Ssam u_long parts[4], *pp = parts; 18*8362Ssam 19*8362Ssam again: 20*8362Ssam val = 0; base = 10; 21*8362Ssam if (*cp == '0') 22*8362Ssam base = 8, cp++; 23*8362Ssam if (*cp == 'x' || *cp == 'X') 24*8362Ssam base = 16, cp++; 25*8362Ssam while (c = *cp) { 26*8362Ssam if (isdigit(c)) { 27*8362Ssam val = (val * base) + (c - '0'); 28*8362Ssam cp++; 29*8362Ssam continue; 30*8362Ssam } 31*8362Ssam if (base == 16 && isxdigit(c)) { 32*8362Ssam val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A')); 33*8362Ssam cp++; 34*8362Ssam continue; 35*8362Ssam } 36*8362Ssam break; 37*8362Ssam } 38*8362Ssam if (*cp == '.') { 39*8362Ssam if (pp >= parts + 4) 40*8362Ssam return (-1); 41*8362Ssam *pp++ = val, cp++; 42*8362Ssam goto again; 43*8362Ssam } 44*8362Ssam if (*cp && !isspace(*cp)) 45*8362Ssam return (-1); 46*8362Ssam *pp++ = val; 47*8362Ssam n = pp - parts; 48*8362Ssam if (n > 4) 49*8362Ssam return (-1); 50*8362Ssam for (val = 0, i = 0; i < n; i++) { 51*8362Ssam val <<= 8; 52*8362Ssam val |= parts[i] & 0xff; 53*8362Ssam } 54*8362Ssam return (val); 55*8362Ssam } 56