PageRenderTime 27ms CodeModel.GetById 18ms app.highlight 6ms RepoModel.GetById 1ms app.codeStats 0ms

/contrib/ntp/libntp/atoint.c

https://bitbucket.org/freebsd/freebsd-head/
C | 50 lines | 40 code | 7 blank | 3 comment | 14 complexity | b1c311470cb2499f9b47d124b6953989 MD5 | raw file
 1/*
 2 * atoint - convert an ascii string to a signed long, with error checking
 3 */
 4#include <sys/types.h>
 5#include <ctype.h>
 6
 7#include "ntp_types.h"
 8#include "ntp_stdlib.h"
 9
10int
11atoint(
12	const char *str,
13	long *ival
14	)
15{
16	register long u;
17	register const char *cp;
18	register int isneg;
19	register int oflow_digit;
20
21	cp = str;
22
23	if (*cp == '-') {
24		cp++;
25		isneg = 1;
26		oflow_digit = '8';
27	} else {
28		isneg = 0;
29		oflow_digit = '7';
30	}
31
32	if (*cp == '\0')
33	    return 0;
34
35	u = 0;
36	while (*cp != '\0') {
37		if (!isdigit((int)*cp))
38		    return 0;
39		if (u > 214748364 || (u == 214748364 && *cp > oflow_digit))
40		    return 0;	/* overflow */
41		u = (u << 3) + (u << 1);
42		u += *cp++ - '0';	/* ascii dependent */
43	}
44
45	if (isneg)
46	    *ival = -u;
47	else 
48	    *ival = u;
49	return 1;
50}