7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/***********************************************************************
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-2010 AT&T Intellectual Property *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* and is licensed under the *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* A copy of the License is available at *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Information and Software Systems Research *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* AT&T Research *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Florham Park NJ *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Glenn Fowler <gsf@research.att.com> *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* David Korn <dgk@research.att.com> *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Phong Vo <kpv@research.att.com> *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin***********************************************************************/
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * convert string to ipv6 network byte order ip address
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * with optional prefix bits
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * pointer to first unused char placed in *e, even on error
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * return 0:ok <0:error
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstrtoip6(register const char* s, char** e, unsigned char* addr, unsigned char* bits)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register unsigned char* b = addr;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register unsigned char* x = b + IP6ADDR;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register unsigned char* z;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register int c;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (c = 0; c < sizeof(lex); ++c)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin switch (c = lex[*((unsigned char*)s++)])
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if ((x - b) < 2)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *b++ = a>>8;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if ((x - b) < 2)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *b++ = a>>8;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (*s == ':')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *b++ = ((a >> 8) & 0xf) * 100 + ((a >> 4) & 0xf) * 10 + (a & 0xf);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin switch (c = lex[*((unsigned char*)s++)])
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a = (a * 10) + c;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (*s == ':')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if ((b - addr) == 6 && addr[0] == 0x20 && addr[1] == 0x02)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a = (a << 4) | c;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while (b > z)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *--x = *--b;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while (x > z)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while (b < x)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a = a * 10 + c;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *e = (char*)(s - 1);