137238Ssklower /* 237238Ssklower * Copyright (c) 1989 Regents of the University of California. 337238Ssklower * All rights reserved. 437238Ssklower * 537238Ssklower * Redistribution and use in source and binary forms are permitted 637238Ssklower * provided that the above copyright notice and this paragraph are 737238Ssklower * duplicated in all such forms and that any documentation, 837238Ssklower * advertising materials, and other materials related to such 937238Ssklower * distribution and use acknowledge that the software was developed 1037238Ssklower * by the University of California, Berkeley. The name of the 1137238Ssklower * University may not be used to endorse or promote products derived 1237238Ssklower * from this software without specific prior written permission. 1337238Ssklower * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 1437238Ssklower * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 1537238Ssklower * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1637238Ssklower */ 1737238Ssklower 1837238Ssklower #if defined(LIBC_SCCS) && !defined(lint) 19*39209Ssklower static char sccsid[] = "@(#)iso_addr.c 5.2 (Berkeley) 09/25/89"; 2037238Ssklower #endif /* LIBC_SCCS and not lint */ 2137238Ssklower 2237238Ssklower #include <sys/types.h> 2337238Ssklower #include <netiso/iso.h> 24*39209Ssklower /* States*/ 25*39209Ssklower #define VIRGIN 0 26*39209Ssklower #define GOTONE 1 27*39209Ssklower #define GOTTWO 2 28*39209Ssklower /* Inputs */ 29*39209Ssklower #define DIGIT (4*0) 30*39209Ssklower #define END (4*1) 31*39209Ssklower #define DELIM (4*2) 3237238Ssklower 3337238Ssklower struct iso_addr * 3437238Ssklower iso_addr(addr) 3537238Ssklower register char *addr; 3637238Ssklower { 3737238Ssklower static struct iso_addr out_addr; 3837238Ssklower register char *cp = out_addr.isoa_genaddr; 3937238Ssklower char *cplim = cp + sizeof(out_addr.isoa_genaddr); 40*39209Ssklower register int byte = 0, state = VIRGIN, new; 4137238Ssklower 4237238Ssklower bzero((char *)&out_addr, sizeof(out_addr)); 43*39209Ssklower do { 4437238Ssklower if ((*addr >= '0') && (*addr <= '9')) { 45*39209Ssklower new = *addr - '0'; 4637238Ssklower } else if ((*addr >= 'a') && (*addr <= 'f')) { 47*39209Ssklower new = *addr - 'a' + 10; 4837238Ssklower } else if ((*addr >= 'A') && (*addr <= 'F')) { 49*39209Ssklower new = *addr - 'A' + 10; 50*39209Ssklower } else if (*addr == 0) 51*39209Ssklower state |= END; 52*39209Ssklower else 53*39209Ssklower state |= DELIM; 5437238Ssklower addr++; 55*39209Ssklower switch (state /* | INPUT */) { 56*39209Ssklower case GOTTWO | DIGIT: 57*39209Ssklower *cp++ = byte; /*FALLTHROUGH*/ 58*39209Ssklower case VIRGIN | DIGIT: 59*39209Ssklower state = GOTONE; byte = new; continue; 60*39209Ssklower case GOTONE | DIGIT: 61*39209Ssklower state = GOTTWO; byte = new + (byte << 4); continue; 62*39209Ssklower default: /* | DELIM */ 63*39209Ssklower state = VIRGIN; *cp++ = byte; byte = 0; continue; 64*39209Ssklower case GOTONE | END: 65*39209Ssklower case GOTTWO | END: 66*39209Ssklower *cp++ = byte; /* FALLTHROUGH */ 67*39209Ssklower case VIRGIN | END: 68*39209Ssklower break; 6937238Ssklower } 70*39209Ssklower break; 71*39209Ssklower } while (cp < cplim); 7237238Ssklower out_addr.isoa_len = cp - out_addr.isoa_genaddr; 7337238Ssklower return (&out_addr); 7437238Ssklower } 75*39209Ssklower static char hexlist[] = "0123456789abcdef"; 7637238Ssklower 7737238Ssklower char * 7837238Ssklower iso_ntoa(isoa) 7937238Ssklower struct iso_addr *isoa; 8037238Ssklower { 8137238Ssklower static char obuf[64]; 8237238Ssklower register char *out = obuf; 8337238Ssklower register int i; 8437238Ssklower register u_char *in = (u_char *)isoa->isoa_genaddr; 8537238Ssklower u_char *inlim = in + isoa->isoa_len; 8637238Ssklower 8737238Ssklower out[1] = 0; 8837238Ssklower while (in < inlim) { 8937238Ssklower i = *in++; 9037238Ssklower *out++ = '.'; 9137238Ssklower if (i > 0xf) { 9237238Ssklower out[1] = hexlist[i & 0xf]; 93*39209Ssklower i >>= 4; 9437238Ssklower out[0] = hexlist[i]; 9537238Ssklower out += 2; 9637238Ssklower } else 9737238Ssklower *out++ = hexlist[i]; 9837238Ssklower } 9937238Ssklower *out = 0; 10037238Ssklower return(obuf + 1); 10137238Ssklower } 102