]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/ntp/libntp/hextoint.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.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 <ctype.h>
6
7 #include "ntp_stdlib.h"
8
9 int
10 hextoint(
11         const char *str,
12         u_long *ival
13         )
14 {
15         register u_long u;
16         register const char *cp;
17
18         cp = str;
19
20         if (*cp == '\0')
21             return 0;
22
23         u = 0;
24         while (*cp != '\0') {
25                 if (!isxdigit((int)*cp))
26                     return 0;
27                 if (u >= 0x10000000)
28                     return 0;   /* overflow */
29                 u <<= 4;
30                 if (*cp <= '9')         /* very ascii dependent */
31                     u += *cp++ - '0';
32                 else if (*cp >= 'a')
33                     u += *cp++ - 'a' + 10;
34                 else
35                     u += *cp++ - 'A' + 10;
36         }
37         *ival = u;
38         return 1;
39 }