3 * - By John Hodge (thePowersGang)
6 * - strto[u][l]l/atoi implimentation
13 unsigned long long strtoull(const char *str, char **end, int base)
17 if( !str || base < 0 || base > 36 || base == 1 ) {
24 // Trim leading spaces
25 while( isspace(*str) )
28 // Handle base detection for hex
29 if( base == 0 || base == 16 ) {
30 if( *str == '0' && (str[1] == 'x' || str[1] == 'X') && isxdigit(str[2]) ) {
36 // Handle base detection for octal
37 if( base == 0 && *str == '0' ) {
42 // Fall back on decimal when unknown
50 if( '0' <= *str && *str <= '0'+base-1 )
54 if( '0' <= *str && *str <= '9' )
56 if( 'A' <= *str && *str <= 'A'+base-10-1 )
57 next = *str - 'A' + 10;
58 if( 'a' <= *str && *str <= 'a'+base-10-1 )
59 next = *str - 'a' + 10;
64 if( ret == ULLONG_MAX ) {
67 // Keep eating until first unrecognised character
70 if( ret > (ULLONG_MAX-next)/base ) {
71 //_SysDebug("strtoull - Out of range (0x%llx > 0x%llx)", ret, (ULLONG_MAX-next)/base);
72 //_SysDebug("strtoull - (%llu > %llu)", ret, (ULLONG_MAX-next)/base);
88 unsigned long strtoul(const char *ptr, char **end, int base)
90 unsigned long long tmp = strtoull(ptr, end, base);
92 if( tmp > ULONG_MAX ) {
100 long long strtoll(const char *str, char **end, int base)
109 while( isspace(*str) )
112 // Check for negative (or positive) sign
113 if(*str == '-' || *str == '+')
115 //_SysDebug("strtoll - str[0:1] = '%.2s'", str);
116 if( !isdigit(str[1]) ) {
117 // Non-digit, invalid string
118 if(end) *end = (char*)str;
125 unsigned long long ret = strtoull(str, end, base);
126 //_SysDebug("strtoll - neg=%i,ret=%llu", neg, ret);
129 if( -ret < LLONG_MIN ) {
137 if( ret > LLONG_MAX ) {
145 long strtol(const char *str, char **end, int base)
147 long long tmp = strtoll(str, end, base);
148 if( tmp > LONG_MAX || tmp < LONG_MIN ) {
150 return (tmp > LONG_MAX) ? LONG_MAX : LONG_MIN;
156 * \fn int atoi(const char *str)
157 * \brief Convert a string to an integer
159 int atoi(const char *str)
161 long long tmp = strtoll(str, NULL, 0);
162 if( tmp > INT_MAX || tmp < INT_MIN ) {
164 return (tmp > INT_MAX) ? INT_MAX : INT_MIN;
169 long atol(const char *str)
171 long long tmp = strtoll(str, NULL, 0);
172 if( tmp > LONG_MAX || tmp < LONG_MIN ) {
174 return (tmp > LONG_MAX) ? LONG_MAX : LONG_MIN;
179 long long atoll(const char *str)
181 long long tmp = strtoll(str, NULL, 0);