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