/* * Copyright (c) 1986 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. * */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)ns_ntoa.c 6.3 (Berkeley) 3/9/86"; #endif LIBC_SCCS and not lint #include #include char * ns_ntoa(addr) struct ns_addr addr; { static char obuf[40]; char *spectHex(); union { union ns_net net_e; u_long long_e; } net; u_short port = htons(addr.x_port); register char *cp; char *cp2; register u_char *up = addr.x_host.c_host; u_char *uplim = up + 6; net.net_e = addr.x_net; sprintf(obuf, "%lx", ntohl(net.long_e)); cp = spectHex(obuf); cp2 = cp + 1; while (*up==0 && up < uplim) up++; if (up == uplim) { if (port) { sprintf(cp, ".0"); cp += 2; } } else { sprintf(cp, ".%x", *up++); while (up < uplim) { while (*cp) cp++; sprintf(cp, "%02x", *up++); } cp = spectHex(cp2); } if (port) { sprintf(cp, ".%x", port); spectHex(cp + 1); } return (obuf); } static char * spectHex(p0) char *p0; { int ok = 0; int nonzero = 0; register char *p = p0; for (; *p; p++) switch (*p) { case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': *p += ('A' - 'a'); /* fall into . . . */ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': ok = 1; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': nonzero = 1; } if (nonzero && !ok) { *p++ = 'H'; *p = 0; } return (p); }