]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/ntp/libntp/atoint.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / ntp / libntp / atoint.c
1 /*
2  * atoint - convert an ascii string to a signed long, with error checking
3  */
4 #include <config.h>
5 #include <sys/types.h>
6 #include <ctype.h>
7
8 #include "ntp_types.h"
9 #include "ntp_stdlib.h"
10
11 int
12 atoint(
13         const char *str,
14         long *ival
15         )
16 {
17         register long u;
18         register const char *cp;
19         register int isneg;
20         register int oflow_digit;
21
22         cp = str;
23
24         if (*cp == '-') {
25                 cp++;
26                 isneg = 1;
27                 oflow_digit = '8';
28         } else {
29                 isneg = 0;
30                 oflow_digit = '7';
31         }
32
33         if (*cp == '\0')
34             return 0;
35
36         u = 0;
37         while (*cp != '\0') {
38                 if (!isdigit((unsigned char)*cp))
39                     return 0;
40                 if (u > 214748364 || (u == 214748364 && *cp > oflow_digit))
41                     return 0;   /* overflow */
42                 u = (u << 3) + (u << 1);
43                 u += *cp++ - '0';       /* ascii dependent */
44         }
45
46         if (isneg)
47             *ival = -u;
48         else 
49             *ival = u;
50         return 1;
51 }