static size_t SDL_ScanFloat(const char *text, double *valuep) { const char *textstart = text; unsigned long lvalue = 0; double value = 0.0; SDL_bool negative = SDL_FALSE; if ( *text == '-' ) { negative = SDL_TRUE; ++text; } text += SDL_ScanUnsignedLong(text, 10, &lvalue); value += lvalue; if ( *text == '.' ) { int mult = 10; ++text; while ( SDL_isdigit((unsigned char) *text) ) { lvalue = *text - '0'; value += (double)lvalue / mult; mult *= 10; ++text; } } if ( valuep ) { if ( negative && value ) { *valuep = -value; } else { *valuep = value; } } return (text - textstart); }
unsigned long SDL_strtoul(const char *string, char **endp, int base) { size_t len; unsigned long value; if ( !base ) { if ( (SDL_strlen(string) > 2) && (SDL_strncmp(string, "0x", 2) == 0) ) { base = 16; } else { base = 10; } } len = SDL_ScanUnsignedLong(string, base, &value); if ( endp ) { *endp = (char *)string + len; } return value; }
unsigned long SDL_strtoul(const char *string, char **endp, int base) { #if defined(HAVE_STRTOUL) return strtoul(string, endp, base); #else size_t len; unsigned long value; if (!base) { if ((SDL_strlen(string) > 2) && (SDL_strncmp(string, "0x", 2) == 0)) { base = 16; } else { base = 10; } } len = SDL_ScanUnsignedLong(string, base, &value); if (endp) { *endp = (char *) string + len; } return value; #endif /* HAVE_STRTOUL */ }