154359Sroberto/* 254359Sroberto * atoint - convert an ascii string to a signed long, with error checking 354359Sroberto */ 4280849Scy#include <config.h> 554359Sroberto#include <sys/types.h> 654359Sroberto#include <ctype.h> 754359Sroberto 854359Sroberto#include "ntp_types.h" 954359Sroberto#include "ntp_stdlib.h" 1054359Sroberto 1154359Srobertoint 1254359Srobertoatoint( 1354359Sroberto const char *str, 1454359Sroberto long *ival 1554359Sroberto ) 1654359Sroberto{ 1754359Sroberto register long u; 1854359Sroberto register const char *cp; 1954359Sroberto register int isneg; 2054359Sroberto register int oflow_digit; 2154359Sroberto 2254359Sroberto cp = str; 2354359Sroberto 2454359Sroberto if (*cp == '-') { 2554359Sroberto cp++; 2654359Sroberto isneg = 1; 2754359Sroberto oflow_digit = '8'; 2854359Sroberto } else { 2954359Sroberto isneg = 0; 3054359Sroberto oflow_digit = '7'; 3154359Sroberto } 3254359Sroberto 3354359Sroberto if (*cp == '\0') 3454359Sroberto return 0; 3554359Sroberto 3654359Sroberto u = 0; 3754359Sroberto while (*cp != '\0') { 38280849Scy if (!isdigit((unsigned char)*cp)) 3954359Sroberto return 0; 4054359Sroberto if (u > 214748364 || (u == 214748364 && *cp > oflow_digit)) 4154359Sroberto return 0; /* overflow */ 4254359Sroberto u = (u << 3) + (u << 1); 4354359Sroberto u += *cp++ - '0'; /* ascii dependent */ 4454359Sroberto } 4554359Sroberto 4654359Sroberto if (isneg) 4754359Sroberto *ival = -u; 4854359Sroberto else 4954359Sroberto *ival = u; 5054359Sroberto return 1; 5154359Sroberto} 52