|
|
1.1 root 1: /*
2: * Copyright (c) 1989 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #if defined(LIBC_SCCS) && !defined(lint)
21: static char sccsid[] = "@(#)iso_addr.c 5.3 (Berkeley) 6/1/90";
22: #endif /* LIBC_SCCS and not lint */
23:
24: #include <sys/types.h>
25: #include <netiso/iso.h>
26: /* States*/
27: #define VIRGIN 0
28: #define GOTONE 1
29: #define GOTTWO 2
30: /* Inputs */
31: #define DIGIT (4*0)
32: #define END (4*1)
33: #define DELIM (4*2)
34:
35: struct iso_addr *
36: iso_addr(addr)
37: register char *addr;
38: {
39: static struct iso_addr out_addr;
40: register char *cp = out_addr.isoa_genaddr;
41: char *cplim = cp + sizeof(out_addr.isoa_genaddr);
42: register int byte = 0, state = VIRGIN, new;
43:
44: bzero((char *)&out_addr, sizeof(out_addr));
45: do {
46: if ((*addr >= '0') && (*addr <= '9')) {
47: new = *addr - '0';
48: } else if ((*addr >= 'a') && (*addr <= 'f')) {
49: new = *addr - 'a' + 10;
50: } else if ((*addr >= 'A') && (*addr <= 'F')) {
51: new = *addr - 'A' + 10;
52: } else if (*addr == 0)
53: state |= END;
54: else
55: state |= DELIM;
56: addr++;
57: switch (state /* | INPUT */) {
58: case GOTTWO | DIGIT:
59: *cp++ = byte; /*FALLTHROUGH*/
60: case VIRGIN | DIGIT:
61: state = GOTONE; byte = new; continue;
62: case GOTONE | DIGIT:
63: state = GOTTWO; byte = new + (byte << 4); continue;
64: default: /* | DELIM */
65: state = VIRGIN; *cp++ = byte; byte = 0; continue;
66: case GOTONE | END:
67: case GOTTWO | END:
68: *cp++ = byte; /* FALLTHROUGH */
69: case VIRGIN | END:
70: break;
71: }
72: break;
73: } while (cp < cplim);
74: out_addr.isoa_len = cp - out_addr.isoa_genaddr;
75: return (&out_addr);
76: }
77: static char hexlist[] = "0123456789abcdef";
78:
79: char *
80: iso_ntoa(isoa)
81: struct iso_addr *isoa;
82: {
83: static char obuf[64];
84: register char *out = obuf;
85: register int i;
86: register u_char *in = (u_char *)isoa->isoa_genaddr;
87: u_char *inlim = in + isoa->isoa_len;
88:
89: out[1] = 0;
90: while (in < inlim) {
91: i = *in++;
92: *out++ = '.';
93: if (i > 0xf) {
94: out[1] = hexlist[i & 0xf];
95: i >>= 4;
96: out[0] = hexlist[i];
97: out += 2;
98: } else
99: *out++ = hexlist[i];
100: }
101: *out = 0;
102: return(obuf + 1);
103: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.