/* ECMA-262 3rd Edition 15.8.2.12 */ static HRESULT Math_min(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei) { DOUBLE min, d; DWORD i; HRESULT hres; TRACE("\n"); if(!arg_cnt(dp)) { if(retv) num_set_inf(retv, TRUE); return S_OK; } hres = to_number(ctx, get_arg(dp, 0), ei, &min); if(FAILED(hres)) return hres; for(i=1; i < arg_cnt(dp); i++) { hres = to_number(ctx, get_arg(dp, i), ei, &d); if(FAILED(hres)) return hres; if(d < min || isnan(d)) min = d; } if(retv) num_set_val(retv, min); return S_OK; }
static HRESULT JSGlobal_Infinity(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { TRACE("\n"); switch(flags) { case DISPATCH_PROPERTYGET: num_set_inf(retv, TRUE); break; default: FIXME("unimplemented flags %x\n", flags); return E_NOTIMPL; } return S_OK; }
/* ECMA-262 3rd Edition 9.3.1 */ static HRESULT str_to_number(BSTR str, VARIANT *ret) { const WCHAR *ptr = str; BOOL neg = FALSE; DOUBLE d = 0.0; static const WCHAR infinityW[] = {'I','n','f','i','n','i','t','y'}; while(isspaceW(*ptr)) ptr++; if(*ptr == '-') { neg = TRUE; ptr++; }else if(*ptr == '+') { ptr++; } if(!strncmpW(ptr, infinityW, sizeof(infinityW)/sizeof(WCHAR))) { ptr += sizeof(infinityW)/sizeof(WCHAR); while(*ptr && isspaceW(*ptr)) ptr++; if(*ptr) num_set_nan(ret); else num_set_inf(ret, !neg); return S_OK; } if(*ptr == '0' && ptr[1] == 'x') { DWORD l = 0; ptr += 2; while((l = hex_to_int(*ptr)) != -1) { d = d*16 + l; ptr++; } num_set_val(ret, d); return S_OK; } while(isdigitW(*ptr)) d = d*10 + (*ptr++ - '0'); if(*ptr == 'e' || *ptr == 'E') { BOOL eneg = FALSE; LONG l = 0; ptr++; if(*ptr == '-') { ptr++; eneg = TRUE; }else if(*ptr == '+') { ptr++; } while(isdigitW(*ptr)) l = l*10 + (*ptr++ - '0'); if(eneg) l = -l; d *= pow(10, l); }else if(*ptr == '.') { DOUBLE dec = 0.1; ptr++; while(isdigitW(*ptr)) { d += dec * (*ptr++ - '0'); dec *= 0.1; } } while(isspaceW(*ptr)) ptr++; if(*ptr) { num_set_nan(ret); return S_OK; } if(neg) d = -d; num_set_val(ret, d); return S_OK; }