154359Sroberto/* 254359Sroberto * atouint - convert an ascii string to an unsigned long, with error checking 354359Sroberto */ 454359Sroberto#include <sys/types.h> 554359Sroberto#include <ctype.h> 654359Sroberto 754359Sroberto#include "ntp_types.h" 854359Sroberto#include "ntp_stdlib.h" 954359Sroberto 1054359Srobertoint 1154359Srobertoatouint( 1254359Sroberto const char *str, 1354359Sroberto u_long *uval 1454359Sroberto ) 1554359Sroberto{ 1654359Sroberto register u_long u; 1754359Sroberto register const char *cp; 1854359Sroberto 1954359Sroberto cp = str; 2054359Sroberto if (*cp == '\0') 2154359Sroberto return 0; 2254359Sroberto 2354359Sroberto u = 0; 2454359Sroberto while (*cp != '\0') { 2554359Sroberto if (!isdigit((int)*cp)) 2654359Sroberto return 0; 2754359Sroberto if (u > 429496729 || (u == 429496729 && *cp >= '6')) 2854359Sroberto return 0; /* overflow */ 2954359Sroberto u = (u << 3) + (u << 1); 3054359Sroberto u += *cp++ - '0'; /* ascii dependent */ 3154359Sroberto } 3254359Sroberto 3354359Sroberto *uval = u; 3454359Sroberto return 1; 3554359Sroberto} 36