hextoint.c revision 285612
1327952Sdim/*
2274955Ssvnmir * hextoint - convert an ascii string in hex to an unsigned
3274955Ssvnmir *	      long, with error checking
4274955Ssvnmir */
5274955Ssvnmir#include <config.h>
6274955Ssvnmir#include <ctype.h>
7274955Ssvnmir
8274955Ssvnmir#include "ntp_stdlib.h"
9274955Ssvnmir
10274955Ssvnmirint
11274955Ssvnmirhextoint(
12274955Ssvnmir	const char *str,
13274955Ssvnmir	u_long *pu
14274955Ssvnmir	)
15274955Ssvnmir{
16274955Ssvnmir	register u_long u;
17274955Ssvnmir	register const char *cp;
18274955Ssvnmir
19274955Ssvnmir	cp = str;
20274955Ssvnmir
21274955Ssvnmir	if (*cp == '\0')
22274955Ssvnmir		return 0;
23274955Ssvnmir
24274955Ssvnmir	u = 0;
25274955Ssvnmir	while (*cp != '\0') {
26274955Ssvnmir		if (!isxdigit((unsigned char)*cp))
27274955Ssvnmir			return 0;
28274955Ssvnmir		if (u & 0xF0000000)
29274955Ssvnmir			return 0;	/* overflow */
30274955Ssvnmir		u <<= 4;
31274955Ssvnmir		if ('0' <= *cp && *cp <= '9')
32274955Ssvnmir			u += *cp++ - '0';
33274955Ssvnmir		else if ('a' <= *cp && *cp <= 'f')
34274955Ssvnmir			u += *cp++ - 'a' + 10;
35274955Ssvnmir		else if ('A' <= *cp && *cp <= 'F')
36274955Ssvnmir			u += *cp++ - 'A' + 10;
37274955Ssvnmir		else
38274955Ssvnmir			return 0;
39274955Ssvnmir	}
40274955Ssvnmir	*pu = u;
41274955Ssvnmir	return 1;
42274955Ssvnmir}
43274955Ssvnmir