1*37238Ssklower /* 2*37238Ssklower * Copyright (c) 1989 Regents of the University of California. 3*37238Ssklower * All rights reserved. 4*37238Ssklower * 5*37238Ssklower * Redistribution and use in source and binary forms are permitted 6*37238Ssklower * provided that the above copyright notice and this paragraph are 7*37238Ssklower * duplicated in all such forms and that any documentation, 8*37238Ssklower * advertising materials, and other materials related to such 9*37238Ssklower * distribution and use acknowledge that the software was developed 10*37238Ssklower * by the University of California, Berkeley. The name of the 11*37238Ssklower * University may not be used to endorse or promote products derived 12*37238Ssklower * from this software without specific prior written permission. 13*37238Ssklower * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14*37238Ssklower * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15*37238Ssklower * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16*37238Ssklower */ 17*37238Ssklower 18*37238Ssklower #if defined(LIBC_SCCS) && !defined(lint) 19*37238Ssklower static char sccsid[] = "@(#)iso_addr.c 5.1 (Berkeley) 03/27/89"; 20*37238Ssklower #endif /* LIBC_SCCS and not lint */ 21*37238Ssklower 22*37238Ssklower #include <sys/types.h> 23*37238Ssklower #include <netiso/iso.h> 24*37238Ssklower 25*37238Ssklower struct iso_addr * 26*37238Ssklower iso_addr(addr) 27*37238Ssklower register char *addr; 28*37238Ssklower { 29*37238Ssklower static struct iso_addr out_addr; 30*37238Ssklower register char *cp = out_addr.isoa_genaddr; 31*37238Ssklower char *cplim = cp + sizeof(out_addr.isoa_genaddr); 32*37238Ssklower register int byte; 33*37238Ssklower register nibble_cnt = 0; 34*37238Ssklower 35*37238Ssklower bzero((char *)&out_addr, sizeof(out_addr)); 36*37238Ssklower while (*addr && (cp < cplim)) { 37*37238Ssklower byte <<= 8; 38*37238Ssklower if ((*addr >= '0') && (*addr <= '9')) { 39*37238Ssklower byte += *addr - '0'; 40*37238Ssklower } else if ((*addr >= 'a') && (*addr <= 'f')) { 41*37238Ssklower byte += *addr - 'a' + 10; 42*37238Ssklower } else if ((*addr >= 'A') && (*addr <= 'F')) { 43*37238Ssklower byte += *addr - 'A' + 10; 44*37238Ssklower } else 45*37238Ssklower nibble_cnt++; 46*37238Ssklower addr++; 47*37238Ssklower nibble_cnt++; 48*37238Ssklower if (nibble_cnt > 1) { 49*37238Ssklower *cp++ = byte; 50*37238Ssklower nibble_cnt = byte = 0; 51*37238Ssklower } 52*37238Ssklower } 53*37238Ssklower if (nibble_cnt && (cp < cplim)) 54*37238Ssklower *cp++ = byte; 55*37238Ssklower out_addr.isoa_len = cp - out_addr.isoa_genaddr; 56*37238Ssklower return (&out_addr); 57*37238Ssklower } 58*37238Ssklower 59*37238Ssklower char * 60*37238Ssklower iso_ntoa(isoa) 61*37238Ssklower struct iso_addr *isoa; 62*37238Ssklower { 63*37238Ssklower static char hexlist[] = "0123456789abcdef"; 64*37238Ssklower static char obuf[64]; 65*37238Ssklower register char *out = obuf; 66*37238Ssklower register int i; 67*37238Ssklower register u_char *in = (u_char *)isoa->isoa_genaddr; 68*37238Ssklower u_char *inlim = in + isoa->isoa_len; 69*37238Ssklower 70*37238Ssklower out[1] = 0; 71*37238Ssklower while (in < inlim) { 72*37238Ssklower i = *in++; 73*37238Ssklower *out++ = '.'; 74*37238Ssklower if (i > 0xf) { 75*37238Ssklower out[1] = hexlist[i & 0xf]; 76*37238Ssklower i >>= 8; 77*37238Ssklower out[0] = hexlist[i]; 78*37238Ssklower out += 2; 79*37238Ssklower } else 80*37238Ssklower *out++ = hexlist[i]; 81*37238Ssklower } 82*37238Ssklower *out = 0; 83*37238Ssklower return(obuf + 1); 84*37238Ssklower } 85