📄 atodbl.inl
字号:
/***
*atodbl.inl - convert a string to a floating point value
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
* Converts a string to a floating point value.
*
*******************************************************************************/
#ifdef _SAFECRT_IMPL
#define _LOCALE_DATA dec_point
#else /* _SAFECRT_IMPL */
#define _LOCALE_DATA _loc_update.GetLocaleT()
#endif /* _SAFECRT_IMPL */
/***
*int _atodbl(_CRT_DOUBLE *, char *) - char string to convert floating point
*
*Purpose:
* _atodbl like atod converts string to floating point. but this function
* tries to avoid floating point exceptions by using _CRT_DOUBLE struct
* which keeps the value in normal register.
*
*Entry:
* _CRT_DOUBLE * - number to be converted to.
* char * - string to be converted.
*
*Exit:
* returns 0, when sucessful or _UNDERFLOW, _OVERFLOW when applicable.
*
*Exceptions:
*
*******************************************************************************/
#ifdef _SAFECRT_IMPL
int _safecrt_atodbl(_CRT_DOUBLE *d, char *str, char dec_point)
#else /* _SAFECRT_IMPL */
int _atodbl_l(_CRT_DOUBLE *d, char *str, _locale_t plocinfo)
#endif /* _SAFECRT_IMPL */
{
const char *EndPtr;
_LDBL12 ld12;
unsigned int retval1=0;
INTRNCVT_STATUS retval2=INTRNCVT_OK;
#ifndef _SAFECRT_IMPL
_LocaleUpdate _loc_update(plocinfo);
#endif /* _SAFECRT_IMPL */
/*
* The return valued of this return is 0, _OVERFLOW or _UNDERFLOW
* The reason behind this is once we make these routines public,
* we need some return value that are defined in shiped headers.
*/
retval1 = __strgtold12_l(&ld12, &EndPtr, str, 0, 0, 0, 0, _LOCALE_DATA);
retval2 = _ld12tod(&ld12, d);
if ((retval1 & (SLD_OVERFLOW|SLD_UNDERFLOW))==0) {
if (retval2 == INTRNCVT_OVERFLOW) {
return _OVERFLOW;
} else if (retval2 == INTRNCVT_UNDERFLOW) {
return _UNDERFLOW;
}
} else if (retval1 & SLD_UNDERFLOW){
return _UNDERFLOW;
} else if (retval1 & SLD_OVERFLOW) {
return _OVERFLOW;
}
return 0;
}
#ifndef _SAFECRT_IMPL
int _atodbl(_CRT_DOUBLE *d, char *str)
{
return _atodbl_l(d, str, NULL);
}
#endif /* _SAFECRT_IMPL */
#ifdef _SAFECRT_IMPL
int _safecrt_atoldbl(_LDOUBLE *d, char *str, char dec_point)
#else /* _SAFECRT_IMPL */
int _atoldbl_l(_LDOUBLE *d, char *str, _locale_t plocinfo)
#endif /* _SAFECRT_IMPL */
{
const char *EndPtr;
_LDBL12 ld12;
unsigned int retval1=0;
INTRNCVT_STATUS retval2=INTRNCVT_OK;
#ifndef _SAFECRT_IMPL
_LocaleUpdate _loc_update(plocinfo);
#endif /* _SAFECRT_IMPL */
/*
* The return valued of this return is 0, _OVERFLOW or _UNDERFLOW
* The reason behind this is once we make these routines public,
* we need some return value that are defined in shiped headers.
*/
retval1 = __strgtold12_l(&ld12, &EndPtr, str, 1, 0, 0, 0, _LOCALE_DATA);
retval2 = _ld12told(&ld12, d);
if ((retval1 & (SLD_OVERFLOW|SLD_UNDERFLOW))==0) {
if (retval2 == INTRNCVT_OVERFLOW) {
return _OVERFLOW;
} else if (retval2 == INTRNCVT_UNDERFLOW) {
return _UNDERFLOW;
}
} else if (retval1 & SLD_UNDERFLOW){
return _UNDERFLOW;
} else if (retval1 & SLD_OVERFLOW) {
return _OVERFLOW;
}
return 0;
}
#ifndef _SAFECRT_IMPL
int _atoldbl(_LDOUBLE *d, char *str)
{
return _atoldbl_l(d, str, NULL);
}
#endif /* _SAFECRT_IMPL */
#ifdef _SAFECRT_IMPL
int _safecrt_atoflt(_CRT_FLOAT *d, char *str, char dec_point)
#else /* _SAFECRT_IMPL */
int _atoflt_l(_CRT_FLOAT *d, char *str, _locale_t plocinfo)
#endif /* _SAFECRT_IMPL */
{
const char *EndPtr;
_LDBL12 ld12;
unsigned int retval1=0;
INTRNCVT_STATUS retval2=INTRNCVT_OK;
#ifndef _SAFECRT_IMPL
_LocaleUpdate _loc_update(plocinfo);
#endif /* _SAFECRT_IMPL */
/*
* The return valued of this return is 0, _OVERFLOW or _UNDERFLOW
* The reason behind this is once we make these routines public,
* we need some return value that are defined in shiped headers.
*/
retval1 = __strgtold12_l(&ld12, &EndPtr, str, 0, 0, 0, 0, _LOCALE_DATA);
retval2 = _ld12tof(&ld12, d);
if ((retval1 & (SLD_OVERFLOW|SLD_UNDERFLOW))==0) {
if (retval2 == INTRNCVT_OVERFLOW) {
return _OVERFLOW;
} else if (retval2 == INTRNCVT_UNDERFLOW) {
return _UNDERFLOW;
}
} else if (retval1 & SLD_UNDERFLOW){
return _UNDERFLOW;
} else if (retval1 & SLD_OVERFLOW) {
return _OVERFLOW;
}
return 0;
}
#ifndef _SAFECRT_IMPL
int _atoflt(_CRT_FLOAT *d, char *str)
{
return _atoflt_l(d, str, NULL);
}
#endif /* _SAFECRT_IMPL */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -