xref: /freebsd/contrib/ntp/libntp/octtoint.c (revision 416ba5c74546f32a993436a99516d35008e9f384)
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 Robert octtoint(
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