137238Ssklower /* 237238Ssklower * Copyright (c) 1989 Regents of the University of California. 337238Ssklower * All rights reserved. 437238Ssklower * 5*42626Sbostic * %sccs.include.redist.c% 637238Ssklower */ 737238Ssklower 837238Ssklower #if defined(LIBC_SCCS) && !defined(lint) 9*42626Sbostic static char sccsid[] = "@(#)iso_addr.c 5.3 (Berkeley) 06/01/90"; 1037238Ssklower #endif /* LIBC_SCCS and not lint */ 1137238Ssklower 1237238Ssklower #include <sys/types.h> 1337238Ssklower #include <netiso/iso.h> 1439209Ssklower /* States*/ 1539209Ssklower #define VIRGIN 0 1639209Ssklower #define GOTONE 1 1739209Ssklower #define GOTTWO 2 1839209Ssklower /* Inputs */ 1939209Ssklower #define DIGIT (4*0) 2039209Ssklower #define END (4*1) 2139209Ssklower #define DELIM (4*2) 2237238Ssklower 2337238Ssklower struct iso_addr * 2437238Ssklower iso_addr(addr) 2537238Ssklower register char *addr; 2637238Ssklower { 2737238Ssklower static struct iso_addr out_addr; 2837238Ssklower register char *cp = out_addr.isoa_genaddr; 2937238Ssklower char *cplim = cp + sizeof(out_addr.isoa_genaddr); 3039209Ssklower register int byte = 0, state = VIRGIN, new; 3137238Ssklower 3237238Ssklower bzero((char *)&out_addr, sizeof(out_addr)); 3339209Ssklower do { 3437238Ssklower if ((*addr >= '0') && (*addr <= '9')) { 3539209Ssklower new = *addr - '0'; 3637238Ssklower } else if ((*addr >= 'a') && (*addr <= 'f')) { 3739209Ssklower new = *addr - 'a' + 10; 3837238Ssklower } else if ((*addr >= 'A') && (*addr <= 'F')) { 3939209Ssklower new = *addr - 'A' + 10; 4039209Ssklower } else if (*addr == 0) 4139209Ssklower state |= END; 4239209Ssklower else 4339209Ssklower state |= DELIM; 4437238Ssklower addr++; 4539209Ssklower switch (state /* | INPUT */) { 4639209Ssklower case GOTTWO | DIGIT: 4739209Ssklower *cp++ = byte; /*FALLTHROUGH*/ 4839209Ssklower case VIRGIN | DIGIT: 4939209Ssklower state = GOTONE; byte = new; continue; 5039209Ssklower case GOTONE | DIGIT: 5139209Ssklower state = GOTTWO; byte = new + (byte << 4); continue; 5239209Ssklower default: /* | DELIM */ 5339209Ssklower state = VIRGIN; *cp++ = byte; byte = 0; continue; 5439209Ssklower case GOTONE | END: 5539209Ssklower case GOTTWO | END: 5639209Ssklower *cp++ = byte; /* FALLTHROUGH */ 5739209Ssklower case VIRGIN | END: 5839209Ssklower break; 5937238Ssklower } 6039209Ssklower break; 6139209Ssklower } while (cp < cplim); 6237238Ssklower out_addr.isoa_len = cp - out_addr.isoa_genaddr; 6337238Ssklower return (&out_addr); 6437238Ssklower } 6539209Ssklower static char hexlist[] = "0123456789abcdef"; 6637238Ssklower 6737238Ssklower char * 6837238Ssklower iso_ntoa(isoa) 6937238Ssklower struct iso_addr *isoa; 7037238Ssklower { 7137238Ssklower static char obuf[64]; 7237238Ssklower register char *out = obuf; 7337238Ssklower register int i; 7437238Ssklower register u_char *in = (u_char *)isoa->isoa_genaddr; 7537238Ssklower u_char *inlim = in + isoa->isoa_len; 7637238Ssklower 7737238Ssklower out[1] = 0; 7837238Ssklower while (in < inlim) { 7937238Ssklower i = *in++; 8037238Ssklower *out++ = '.'; 8137238Ssklower if (i > 0xf) { 8237238Ssklower out[1] = hexlist[i & 0xf]; 8339209Ssklower i >>= 4; 8437238Ssklower out[0] = hexlist[i]; 8537238Ssklower out += 2; 8637238Ssklower } else 8737238Ssklower *out++ = hexlist[i]; 8837238Ssklower } 8937238Ssklower *out = 0; 9037238Ssklower return(obuf + 1); 9137238Ssklower } 92