1c0b746e5SOllivier Robert /* 2c0b746e5SOllivier Robert * octtoint - convert an ascii string in octal to an unsigned 3c0b746e5SOllivier Robert * long, with error checking 4c0b746e5SOllivier Robert */ 5*2b15cb3dSCy Schubert #include <config.h> 6c0b746e5SOllivier Robert #include <stdio.h> 7c0b746e5SOllivier Robert #include <ctype.h> 8c0b746e5SOllivier Robert 9c0b746e5SOllivier Robert #include "ntp_stdlib.h" 10c0b746e5SOllivier Robert 11c0b746e5SOllivier Robert int octtoint(const char * str,u_long * ival)12c0b746e5SOllivier Robertocttoint( 13c0b746e5SOllivier Robert const char *str, 14c0b746e5SOllivier Robert u_long *ival 15c0b746e5SOllivier Robert ) 16c0b746e5SOllivier Robert { 17c0b746e5SOllivier Robert register u_long u; 18c0b746e5SOllivier Robert register const char *cp; 19c0b746e5SOllivier Robert 20c0b746e5SOllivier Robert cp = str; 21c0b746e5SOllivier Robert 22c0b746e5SOllivier Robert if (*cp == '\0') 23c0b746e5SOllivier Robert return 0; 24c0b746e5SOllivier Robert 25c0b746e5SOllivier Robert u = 0; 26c0b746e5SOllivier Robert while (*cp != '\0') { 27*2b15cb3dSCy Schubert if (!isdigit((unsigned char)*cp) || *cp == '8' || *cp == '9') 28c0b746e5SOllivier Robert return 0; 29c0b746e5SOllivier Robert if (u >= 0x20000000) 30c0b746e5SOllivier Robert return 0; /* overflow */ 31c0b746e5SOllivier Robert u <<= 3; 32c0b746e5SOllivier Robert u += *cp++ - '0'; /* ascii dependent */ 33c0b746e5SOllivier Robert } 34c0b746e5SOllivier Robert *ival = u; 35c0b746e5SOllivier Robert return 1; 36c0b746e5SOllivier Robert } 37