137238Ssklower /* 2*61150Sbostic * Copyright (c) 1989, 1993 3*61150Sbostic * The Regents of the University of California. All rights reserved. 437238Ssklower * 542626Sbostic * %sccs.include.redist.c% 637238Ssklower */ 737238Ssklower 837238Ssklower #if defined(LIBC_SCCS) && !defined(lint) 9*61150Sbostic static char sccsid[] = "@(#)iso_addr.c 8.1 (Berkeley) 06/04/93"; 1037238Ssklower #endif /* LIBC_SCCS and not lint */ 1137238Ssklower 1237238Ssklower #include <sys/types.h> 1337238Ssklower #include <netiso/iso.h> 1446604Sbostic #include <string.h> 1546604Sbostic 1639209Ssklower /* States*/ 1739209Ssklower #define VIRGIN 0 1839209Ssklower #define GOTONE 1 1939209Ssklower #define GOTTWO 2 2039209Ssklower /* Inputs */ 2139209Ssklower #define DIGIT (4*0) 2239209Ssklower #define END (4*1) 2339209Ssklower #define DELIM (4*2) 2437238Ssklower 2537238Ssklower struct iso_addr * iso_addr(addr)2637238Sskloweriso_addr(addr) 2746604Sbostic register const char *addr; 2837238Ssklower { 2937238Ssklower static struct iso_addr out_addr; 3037238Ssklower register char *cp = out_addr.isoa_genaddr; 3137238Ssklower char *cplim = cp + sizeof(out_addr.isoa_genaddr); 3239209Ssklower register int byte = 0, state = VIRGIN, new; 3337238Ssklower 3437238Ssklower bzero((char *)&out_addr, sizeof(out_addr)); 3539209Ssklower do { 3637238Ssklower if ((*addr >= '0') && (*addr <= '9')) { 3739209Ssklower new = *addr - '0'; 3837238Ssklower } else if ((*addr >= 'a') && (*addr <= 'f')) { 3939209Ssklower new = *addr - 'a' + 10; 4037238Ssklower } else if ((*addr >= 'A') && (*addr <= 'F')) { 4139209Ssklower new = *addr - 'A' + 10; 4239209Ssklower } else if (*addr == 0) 4339209Ssklower state |= END; 4439209Ssklower else 4539209Ssklower state |= DELIM; 4637238Ssklower addr++; 4739209Ssklower switch (state /* | INPUT */) { 4839209Ssklower case GOTTWO | DIGIT: 4939209Ssklower *cp++ = byte; /*FALLTHROUGH*/ 5039209Ssklower case VIRGIN | DIGIT: 5139209Ssklower state = GOTONE; byte = new; continue; 5239209Ssklower case GOTONE | DIGIT: 5339209Ssklower state = GOTTWO; byte = new + (byte << 4); continue; 5439209Ssklower default: /* | DELIM */ 5539209Ssklower state = VIRGIN; *cp++ = byte; byte = 0; continue; 5639209Ssklower case GOTONE | END: 5739209Ssklower case GOTTWO | END: 5839209Ssklower *cp++ = byte; /* FALLTHROUGH */ 5939209Ssklower case VIRGIN | END: 6039209Ssklower break; 6137238Ssklower } 6239209Ssklower break; 6339209Ssklower } while (cp < cplim); 6437238Ssklower out_addr.isoa_len = cp - out_addr.isoa_genaddr; 6537238Ssklower return (&out_addr); 6637238Ssklower } 6739209Ssklower static char hexlist[] = "0123456789abcdef"; 6837238Ssklower 6937238Ssklower char * iso_ntoa(isoa)7037238Sskloweriso_ntoa(isoa) 7146604Sbostic const struct iso_addr *isoa; 7237238Ssklower { 7337238Ssklower static char obuf[64]; 7437238Ssklower register char *out = obuf; 7537238Ssklower register int i; 7637238Ssklower register u_char *in = (u_char *)isoa->isoa_genaddr; 7737238Ssklower u_char *inlim = in + isoa->isoa_len; 7837238Ssklower 7937238Ssklower out[1] = 0; 8037238Ssklower while (in < inlim) { 8137238Ssklower i = *in++; 8237238Ssklower *out++ = '.'; 8337238Ssklower if (i > 0xf) { 8437238Ssklower out[1] = hexlist[i & 0xf]; 8539209Ssklower i >>= 4; 8637238Ssklower out[0] = hexlist[i]; 8737238Ssklower out += 2; 8837238Ssklower } else 8937238Ssklower *out++ = hexlist[i]; 9037238Ssklower } 9137238Ssklower *out = 0; 9237238Ssklower return(obuf + 1); 9337238Ssklower } 94