extern "C" double FXstrtod(const char* nptr, char** endptr) { double ret = 0.0; const char* ptr = nptr; const char* exp_ptr = NULL; int e_number = 0, e_signal = 0, e_point = 0, is_negative = 0; int exp_ret = 0, exp_sig = 1, fra_ret = 0, fra_count = 0, fra_base = 1; if (nptr == NULL) { return 0.0; } for (;; ptr++) { if (!e_number && !e_point && (*ptr == '\t' || *ptr == ' ')) continue; if (std::isdigit(*ptr)) { if (!e_number) e_number = 1; if (!e_point) { ret *= 10; ret += FXSYS_toDecimalDigit(*ptr); } else { fra_count++; fra_ret *= 10; fra_ret += FXSYS_toDecimalDigit(*ptr); } continue; } if (!e_point && *ptr == '.') { e_point = 1; continue; } if (!e_number && !e_point && !e_signal) { switch (*ptr) { case '-': is_negative = 1; case '+': e_signal = 1; continue; } } if (e_number && (*ptr == 'e' || *ptr == 'E')) { exp_ptr = ptr++; if (*ptr == '+' || *ptr == '-') { exp_sig = (*ptr++ == '+') ? 1 : -1; if (!std::isdigit(*ptr)) { if (endptr) { *endptr = (char*)exp_ptr; } break; } EXPONENT_DETECT(ptr); } else if (std::isdigit(*ptr)) { EXPONENT_DETECT(ptr); } else { if (endptr) { *endptr = (char*)exp_ptr; } break; } break; } if (ptr != nptr && !e_number) { if (endptr) { *endptr = (char*)nptr; } break; } if (endptr) { *endptr = (char*)ptr; } break; } while (fra_count--) { fra_base *= 10; } ret += (double)fra_ret / (double)fra_base; if (exp_sig == 1) { while (exp_ret--) { ret *= 10.0; } } else { while (exp_ret--) { ret /= 10.0; } } return is_negative ? -ret : ret; }
extern "C" double FXstrtod(const char* nptr, char** endptr) { double ret = 0.0; const char* ptr = nptr; const char* exp_ptr = NULL; int e_number = 0, e_signal = 0, e_point = 0, is_negative = 0; int exp_ret = 0, exp_sig = 1, fra_ret = 0, fra_count = 0, fra_base = 1; if(nptr == NULL) { return 0.0; } for (;; ptr++) { if(!e_number && !e_point && (*ptr == '\t' || *ptr == ' ')) { continue; } if(*ptr >= '0' && *ptr <= '9') { if(!e_number) { e_number = 1; } if(!e_point) { ret *= 10; ret += (*ptr - '0'); } else { fra_count++; fra_ret *= 10; fra_ret += (*ptr - '0'); } continue; } if(!e_point && *ptr == '.') { e_point = 1; continue; } if(!e_number && !e_point && !e_signal) { switch(*ptr) { case '-': is_negative = 1; case '+': e_signal = 1; continue; } } if(e_number && (*ptr == 'e' || *ptr == 'E')) { #define EXPONENT_DETECT(ptr) \ for(;;ptr++){ \ if(*ptr < '0' || *ptr > '9'){ \ if(endptr) *endptr = (char*)ptr; \ break; \ }else{ \ exp_ret *= 10; \ exp_ret += (*ptr - '0'); \ continue; \ } \ } exp_ptr = ptr++; if(*ptr == '+' || *ptr == '-') { exp_sig = (*ptr++ == '+') ? 1 : -1; if(*ptr < '0' || *ptr > '9') { if(endptr) { *endptr = (char*)exp_ptr; } break; } EXPONENT_DETECT(ptr); } else if(*ptr >= '0' && *ptr <= '9') { EXPONENT_DETECT(ptr); } else { if(endptr) { *endptr = (char*)exp_ptr; } break; } #undef EXPONENT_DETECT break; } if(ptr != nptr && !e_number) { if(endptr) { *endptr = (char*)nptr; } break; } if(endptr) { *endptr = (char*)ptr; } break; } while(fra_count--) { fra_base *= 10; } ret += (double)fra_ret / (double)fra_base; if(exp_sig == 1) { while(exp_ret--) { ret *= 10.0; } } else { while(exp_ret--) { ret /= 10.0; } } return is_negative ? -ret : ret; }