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