JL_DLLEXPORT jl_nullable_float32_t jl_try_substrtof(char *str, size_t offset, size_t len) { char *p; char *bstr = str+offset; char *pend = bstr+len; char *tofree = NULL; int hasvalue = 0; errno = 0; if (!(*pend == '\0' || isspace((unsigned char)*pend) || *pend == ',')) { // confusing data outside substring. must copy. char *newstr; if (len + 1 < jl_page_size) { newstr = (char*)alloca(len + 1); } else { newstr = tofree = (char*)malloc(len + 1); } memcpy(newstr, bstr, len); newstr[len] = 0; bstr = newstr; pend = bstr+len; } #if defined(_OS_WINDOWS_) && !defined(_COMPILER_MINGW_) float out = (float)jl_strtod_c(bstr, &p); #else float out = jl_strtof_c(bstr, &p); #endif if (errno==ERANGE && (out==0 || out==HUGE_VALF || out==-HUGE_VALF)) { hasvalue = 0; } else if (p == bstr) { hasvalue = 0; } else { // Deal with case where the substring might be something like "1 ", // which is OK, and "1 X", which we don't allow. hasvalue = substr_isspace(p, pend) ? 1 : 0; } if (__unlikely(tofree)) free(tofree); jl_nullable_float32_t ret = {(uint8_t)hasvalue, out}; return ret; }
JL_DLLEXPORT float jl_strtof_c(const char *nptr, char **endptr) { return (float) jl_strtod_c(nptr, endptr); }