File: strtol.c

package info (click to toggle)
emile 0.10-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 1,716 kB
  • ctags: 2,737
  • sloc: ansic: 18,908; makefile: 726; asm: 622; sh: 2
file content (72 lines) | stat: -rw-r--r-- 1,108 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdlib.h>

static int my_isspace(int c)
{
	return (c == ' ') || (c == '\f') || (c == '\n') || 
		(c == '\r') || (c == '\t') || (c == '\v');
}

long int __strtol_internal (const char *nptr, char **endptr, int base, int group)
{
	long result = 0;
	int sign;

	while(my_isspace(*nptr))
		nptr++;

	if (*nptr == '-')
	{
		nptr++;
		sign = -1;
	} else if (*nptr == '+')
	{
		nptr++;
		sign = 1;
	} else
		sign = 1;

	if (base == 0)
	{
		if (*nptr == '0')
		{
			nptr++;
			if (*nptr == 'x')
			{
				base = 16;
				nptr++;
			} else
				base = 8;
		}
		else
			base = 10;
	}

	while (*nptr)
	{
		int digit;

		if ( (*nptr >= '0') && (*nptr <= '9') )
			digit = *nptr - '0';
		else if ( (*nptr >= 'a') && (*nptr <= 'z') )
			digit = *nptr - 'a' + 10;
		else if ( (*nptr >= 'A') && (*nptr <= 'Z') )
			digit = *nptr - 'A' + 10;
		else
			break;

		if (digit >= base)
			break;

		result = (result * base) + digit;

		nptr++;
	}
	if (endptr)
		*endptr = (char*)nptr;
	return sign * result;
}

long int strtol(const char *nptr, char **endptr, int base)
{
	return __strtol_internal(nptr, endptr, base, 0);
}