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))
118 if (isupper((
unsigned char) ch))
119 ch = tolower((
unsigned char) ch);
120 n = strchr(xdigits, ch) - xdigits;
121 assert(n >= 0 && n <= 15);
125 tmp = (tmp << 4) | n;
130 *dst++ = (u_char) tmp;
138 *dst++ = (u_char) (tmp << 4);
141 else if (isdigit((
unsigned char) ch))
155 }
while ((ch = *src++) !=
'\0' &&
156 isdigit((
unsigned char) ch));
159 *dst++ = (u_char) tmp;
160 if (ch ==
'\0' || ch ==
'/')
165 if (!isdigit((
unsigned char) ch))
173 if (ch ==
'/' && isdigit((
unsigned char) src[0]) && dst > odst)
184 }
while ((ch = *src++) !=
'\0' && isdigit((
unsigned char) ch));
203 else if (*odst >= 224)
205 else if (*odst >= 192)
207 else if (*odst >= 128)
213 if (bits < ((dst - odst) * 8))
214 bits = (dst - odst) * 8;
220 if (bits == 8 && *odst == 224)
224 while (bits > ((dst - odst) * 8))
261 static const char digits[] =
"0123456789";
262 const u_char *odst = dst;
270 while (ch = *src++, isdigit((
unsigned char) ch))
281 }
while ((ch = *src++) !=
'\0' && isdigit((
unsigned char) ch));
284 *dst++ = (u_char) tmp;
285 if (ch ==
'\0' || ch ==
'/')
293 if (ch ==
'/' && isdigit((
unsigned char) src[0]) && dst > odst)
304 }
while ((ch = *src++) !=
'\0' && isdigit((
unsigned char) ch));
329 if ((bits / 8) > (dst - odst))
350 static const char digits[] =
"0123456789";
357 while ((ch = *src++) !=
'\0')
364 if (n++ != 0 &&
val == 0)
381getv4(
const char *src, u_char *dst,
int *bitsp)
383 static const char digits[] =
"0123456789";
391 while ((ch = *src++) !=
'\0')
398 if (n++ != 0 &&
val == 0)
406 if (ch ==
'.' || ch ==
'/')
433#define NS_IN6ADDRSZ 16
440 static const char xdigits_l[] =
"0123456789abcdef",
441 xdigits_u[] =
"0123456789ABCDEF";
469 while ((ch = *src++) !=
'\0')
473 if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
474 pch = strchr((xdigits = xdigits_u), ch);
478 val |= (pch - xdigits);
494 else if (*src ==
'\0')
498 *tp++ = (u_char) (
val >> 8) & 0xff;
499 *tp++ = (u_char)
val & 0xff;
506 getv4(curtok, tp, &bits) > 0)
512 if (ch ==
'/' &&
getbits(src, &bits) > 0)
520 *tp++ = (u_char) (
val >> 8) & 0xff;
521 *tp++ = (u_char)
val & 0xff;
534 const int n = tp - colonp;
539 for (
i = 1;
i <= n;
i++)
541 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)