20#if defined(LIBC_SCCS) && !defined(lint)
21static const char rcsid[] =
"Id: inet_net_pton.c,v 1.4.2.3 2004/03/17 00:40:11 marka Exp $";
98 static const char xdigits[] =
"0123456789abcdef";
99 static const char digits[] =
"0123456789";
105 const u_char *odst = dst;
108 if (ch ==
'0' && (src[0] ==
'x' || src[0] ==
'X')
109 && isxdigit((
unsigned char) src[1]))
116 while ((ch = *src++) !=
'\0' && isxdigit((
unsigned char) ch))
119 n = strchr(xdigits, ch) - xdigits;
120 assert(n >= 0 && n <= 15);
124 tmp = (tmp << 4) | n;
129 *dst++ = (u_char) tmp;
137 *dst++ = (u_char) (tmp << 4);
140 else if (isdigit((
unsigned char) ch))
154 }
while ((ch = *src++) !=
'\0' &&
155 isdigit((
unsigned char) ch));
158 *dst++ = (u_char) tmp;
159 if (ch ==
'\0' || ch ==
'/')
164 if (!isdigit((
unsigned char) ch))
172 if (ch ==
'/' && isdigit((
unsigned char) src[0]) && dst > odst)
183 }
while ((ch = *src++) !=
'\0' && isdigit((
unsigned char) ch));
202 else if (*odst >= 224)
204 else if (*odst >= 192)
206 else if (*odst >= 128)
212 if (bits < ((dst - odst) * 8))
213 bits = (dst - odst) * 8;
219 if (bits == 8 && *odst == 224)
223 while (bits > ((dst - odst) * 8))
260 static const char digits[] =
"0123456789";
261 const u_char *odst = dst;
269 while (ch = *src++, isdigit((
unsigned char) ch))
280 }
while ((ch = *src++) !=
'\0' && isdigit((
unsigned char) ch));
283 *dst++ = (u_char) tmp;
284 if (ch ==
'\0' || ch ==
'/')
292 if (ch ==
'/' && isdigit((
unsigned char) src[0]) && dst > odst)
303 }
while ((ch = *src++) !=
'\0' && isdigit((
unsigned char) ch));
328 if ((bits / 8) > (dst - odst))
349 static const char digits[] =
"0123456789";
356 while ((ch = *src++) !=
'\0')
363 if (n++ != 0 &&
val == 0)
380getv4(
const char *src, u_char *dst,
int *bitsp)
382 static const char digits[] =
"0123456789";
390 while ((ch = *src++) !=
'\0')
397 if (n++ != 0 &&
val == 0)
405 if (ch ==
'.' || ch ==
'/')
432#define NS_IN6ADDRSZ 16
439 static const char xdigits_l[] =
"0123456789abcdef",
440 xdigits_u[] =
"0123456789ABCDEF";
468 while ((ch = *src++) !=
'\0')
472 if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
473 pch = strchr((xdigits = xdigits_u), ch);
477 val |= (pch - xdigits);
493 else if (*src ==
'\0')
497 *tp++ = (u_char) (
val >> 8) & 0xff;
498 *tp++ = (u_char)
val & 0xff;
505 getv4(curtok, tp, &bits) > 0)
511 if (ch ==
'/' &&
getbits(src, &bits) > 0)
519 *tp++ = (u_char) (
val >> 8) & 0xff;
520 *tp++ = (u_char)
val & 0xff;
533 const int n = tp - colonp;
538 for (
i = 1;
i <= n;
i++)
540 endp[-
i] = colonp[n -
i];
int pg_inet_net_pton(int af, const char *src, void *dst, size_t size)
static int inet_net_pton_ipv6(const char *src, u_char *dst)
static int inet_net_pton_ipv4(const char *src, u_char *dst)
static int getbits(const char *src, int *bitsp)
static int getv4(const char *src, u_char *dst, int *bitsp)
static int inet_cidr_pton_ipv6(const char *src, u_char *dst, size_t size)
static int inet_cidr_pton_ipv4(const char *src, u_char *dst, size_t size)
unsigned char pg_ascii_tolower(unsigned char ch)