1 /***********************************************************************
3 * This software is part of the ast package *
4 * Copyright (c) 1985-2010 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Common Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
9 * A copy of the License is available at *
10 * http://www.opensource.org/licenses/cpl1.0.txt *
11 * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
13 * Information and Software Systems Research *
17 * Glenn Fowler <gsf@research.att.com> *
18 * David Korn <dgk@research.att.com> *
19 * Phong Vo <kpv@research.att.com> *
21 ***********************************************************************/
33 * return a pointer to n bytes from a circular re-use buffer
41 static char buf
[1024];
44 if ((&buf
[sizeof(buf
)] - p
) < n
)
54 * copy p to s, then convert 0<=n<=999 to text
55 * next char in s returned
56 * caller ensures that s can take strlen(p)+3 bytes
60 dec(char* s
, char* p
, int n
)
65 *s
++ = '0' + ((n
/ 100) % 10);
67 *s
++ = '0' + ((n
/ 10) % 10);
68 *s
++ = '0' + (n
% 10);
73 * return pointer to normalized ipv6 address addr
74 * with optional prefix bits if 0 < bits <= 128
75 * return value in short-term circular buffer
79 fmtip6(unsigned char* addr
, int bits
)
81 register unsigned char* a
= addr
;
82 register int n
= IP6ADDR
;
87 unsigned char r
[IP6ADDR
];
91 static const char dig
[] = "0123456789ABCDEF";
95 if (a
[0] == 0x20 && a
[1] == 0x02 && (a
[2] || a
[3] || a
[4] || a
[5]))
98 s
= dec(s
, "2002:", a
[2]);
99 s
= dec(s
, ".", a
[3]);
100 s
= dec(s
, ".", a
[4]);
101 s
= dec(s
, ".", a
[5]);
103 for (i
= z
; i
< n
; i
+= 2)
105 for (k
= i
; i
< n
- 1 && !a
[i
] && !a
[i
+ 1]; i
+= 2);
106 if ((r
[k
] = i
- k
) > r
[m
] || r
[k
] == r
[m
] && i
>= (n
- 1))
116 if (!a
[14] && a
[15] <= 15)
120 s
= dec(s
, "::", a
[12]);
121 s
= dec(s
, ".", a
[13]);
122 s
= dec(s
, ".", a
[14]);
123 s
= dec(s
, ".", a
[15]);
127 if (a
[10] == 0xFF && a
[11] == 0xFF)
129 s
= dec(s
, "::FFFF:", a
[12]);
130 s
= dec(s
, ".", a
[13]);
131 s
= dec(s
, ".", a
[14]);
132 s
= dec(s
, ".", a
[15]);
137 for (i
= z
; i
< n
; i
++)
143 if ((i
+= r
[m
]) >= n
)
150 else if (i
&& !(i
& 1))
158 if ((k
= (a
[i
] >> 4) & 0xf) || z
)
163 if ((k
= a
[i
] & 0xf) || z
)
169 if (!z
&& *(s
- 1) == ':')
171 if (bits
> 0 && bits
<= 128)
172 s
= dec(s
, "/", bits
);