Subversion Repositories Kolibri OS

Rev

Rev 8793 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
8687 turbocat 1
#include 
2
#include 
3
#include 
4
 
5
#define LONG_MIN (-2147483647L-1)
6
#define LONG_MAX (2147483647L)
7
#define ULONG_MAX (4294967295UL)
8
 
9
 
10
int getdigit(char ch, int base)
11
{
12
	if (isdigit(ch)) ch-= '0';
13
    	else
14
    if (isalpha(ch) && ch <= 'Z') ch = 10 + ch - 'A';
15
       	else
16
    if (isalpha(ch)) ch = 10 + ch - 'a';
17
    	else
18
    return -1;
19
 
20
   	if (ch / base != 0) return -1;
21
 
22
   	return ch;
23
}
24
 
25
 
26
long int strtol (const char* str, char** endptr, int base)
27
{
28
    long int res = 0;
29
	int		sign = 1;
30
 
31
	if (base > 36)
32
	{
33
		errno = EINVAL;
34
	 	goto bye;
35
	}
36
 
37
	while (isspace(*str)) str++;
38
 
39
	if (*str == '-') { sign = -1; str++; }
40
		else
41
	if (*str == '+') str++;
42
 
43
	if (base == 0 || base == 16)
44
	{
45
		if (*str == '0' && (str[1] == 'x' || str[1] == 'X'))
46
		{
47
			base = 16;
48
			str += 2;
49
		}
50
	}
51
 
52
	if (base == 0 && *str == '0') base = 8;
53
 
54
	if (base == 0) base = 10;
55
 
56
 
57
	int digit;
58
	while ((digit = getdigit(*str, base)) >= 0)
59
	{
60
		res = base * res + digit;
61
		str++;
62
		if (res < 0)
63
		{
64
			errno = ERANGE;
65
			if (sign > 0)
66
				res = LONG_MAX;
67
			else
68
				res = LONG_MIN;
69
		}
70
	}
71
 
72
bye:
73
	if (endptr)
74
		*endptr = (char*)str;
75
 
76
	return res * sign;
77
}
78