]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/ntp/libntp/hextoint.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / ntp / libntp / hextoint.c
1 /*
2  * hextoint - convert an ascii string in hex to an unsigned
3  *            long, with error checking
4  */
5 #include <config.h>
6 #include <ctype.h>
7
8 #include "ntp_stdlib.h"
9
10 int
11 hextoint(
12         const char *str,
13         u_long *pu
14         )
15 {
16         register u_long u;
17         register const char *cp;
18
19         cp = str;
20
21         if (*cp == '\0')
22                 return 0;
23
24         u = 0;
25         while (*cp != '\0') {
26                 if (!isxdigit((unsigned char)*cp))
27                         return 0;
28                 if (u & 0xF0000000)
29                         return 0;       /* overflow */
30                 u <<= 4;
31                 if ('0' <= *cp && *cp <= '9')
32                         u += *cp++ - '0';
33                 else if ('a' <= *cp && *cp <= 'f')
34                         u += *cp++ - 'a' + 10;
35                 else if ('A' <= *cp && *cp <= 'F')
36                         u += *cp++ - 'A' + 10;
37                 else
38                         return 0;
39         }
40         *pu = u;
41         return 1;
42 }