atouint.c revision 54359
1169689Skan/* 2169689Skan * atouint - convert an ascii string to an unsigned long, with error checking 3169689Skan */ 4169689Skan#include <sys/types.h> 5169689Skan#include <ctype.h> 6169689Skan 7169689Skan#include "ntp_types.h" 8169689Skan#include "ntp_stdlib.h" 9169689Skan 10169689Skanint 11169689Skanatouint( 12169689Skan const char *str, 13169689Skan u_long *uval 14169689Skan ) 15169689Skan{ 16169689Skan register u_long u; 17169689Skan register const char *cp; 18169689Skan 19169689Skan cp = str; 20169689Skan if (*cp == '\0') 21169689Skan return 0; 22169689Skan 23169689Skan u = 0; 24169689Skan while (*cp != '\0') { 25169689Skan if (!isdigit((int)*cp)) 26169689Skan return 0; 27169689Skan if (u > 429496729 || (u == 429496729 && *cp >= '6')) 28169689Skan return 0; /* overflow */ 29169689Skan u = (u << 3) + (u << 1); 30169689Skan u += *cp++ - '0'; /* ascii dependent */ 31169689Skan } 32169689Skan 33169689Skan *uval = u; 34169689Skan return 1; 35169689Skan} 36169689Skan