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