diff options
| author | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2009-05-21 19:01:41 +0000 |
|---|---|---|
| committer | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2009-05-21 19:01:41 +0000 |
| commit | cf87597226f5d6b269f1f2c4d6f402aa1eccb852 (patch) | |
| tree | 4ba1f3ae53b3bd9cae0e2c6c4dd57836b43a5ece /apps/plugins/lua/strtoul.c | |
| parent | c483efadc63eaed35b5fb5e4e02c2282daf32470 (diff) | |
| download | rockbox-cf87597226f5d6b269f1f2c4d6f402aa1eccb852.zip rockbox-cf87597226f5d6b269f1f2c4d6f402aa1eccb852.tar.gz rockbox-cf87597226f5d6b269f1f2c4d6f402aa1eccb852.tar.bz2 rockbox-cf87597226f5d6b269f1f2c4d6f402aa1eccb852.tar.xz | |
Commit FS#9174: Lua scripting language by Dan Everton
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21020 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/lua/strtoul.c')
| -rw-r--r-- | apps/plugins/lua/strtoul.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/apps/plugins/lua/strtoul.c b/apps/plugins/lua/strtoul.c new file mode 100644 index 0000000..74d9b4b --- /dev/null +++ b/apps/plugins/lua/strtoul.c @@ -0,0 +1,53 @@ +#include "rocklibc.h" + +unsigned long int strtoul(const char *ptr, char **endptr, int base) +{ + int neg = 0, overflow = 0; + unsigned long int v=0; + const char* orig; + const char* nptr=ptr; + + while(isspace(*nptr)) ++nptr; + + if (*nptr == '-') { neg=1; nptr++; } + else if (*nptr == '+') ++nptr; + orig=nptr; + if (base==16 && nptr[0]=='0') goto skip0x; + if (base) { + register unsigned int b=base-2; + if (__unlikely(b>34)) { errno=EINVAL; return 0; } + } else { + if (*nptr=='0') { + base=8; +skip0x: + if ((nptr[1]=='x'||nptr[1]=='X') && isxdigit(nptr[2])) { + nptr+=2; + base=16; + } + } else + base=10; + } + while(__likely(*nptr)) { + register unsigned char c=*nptr; + c=(c>='a'?c-'a'+10:c>='A'?c-'A'+10:c<='9'?c-'0':0xff); + if (__unlikely(c>=base)) break; /* out of base */ + { + register unsigned long x=(v&0xff)*base+c; + register unsigned long w=(v>>8)*base+(x>>8); + if (w>(ULONG_MAX>>8)) overflow=1; + v=(w<<8)+(x&0xff); + } + ++nptr; + } + if (__unlikely(nptr==orig)) { /* no conversion done */ + nptr=ptr; + errno=EINVAL; + v=0; + } + if (endptr) *endptr=(char *)nptr; + if (overflow) { + errno=ERANGE; + return ULONG_MAX; + } + return (neg?-v:v); +} |