mirror of
https://github.com/reactos/reactos.git
synced 2025-06-20 07:36:05 +00:00
Create a branch for audio work
svn path=/branches/audio-bringup/; revision=49478
This commit is contained in:
parent
26c20f3857
commit
5eb25b5c24
20759 changed files with 0 additions and 1141005 deletions
125
lib/sdk/crt/string/strtold.c
Normal file
125
lib/sdk/crt/string/strtold.c
Normal file
|
@ -0,0 +1,125 @@
|
|||
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
|
||||
#include <stdlib.h>
|
||||
#include <msvcrt/ctype.h>
|
||||
|
||||
static double powten[] =
|
||||
{
|
||||
1e1L, 1e2L, 1e4L, 1e8L, 1e16L, 1e32L, 1e64L, 1e128L, 1e256L,
|
||||
#ifdef __GNUC__
|
||||
1e512L, 1e512L*1e512L, 1e2048L, 1e4096L
|
||||
#else
|
||||
1e256L, 1e256L, 1e256L, 1e256L
|
||||
#endif
|
||||
};
|
||||
|
||||
long double
|
||||
_strtold(const char *s, char **sret)
|
||||
{
|
||||
double r; /* result */
|
||||
int e, ne; /* exponent */
|
||||
int sign; /* +- 1.0 */
|
||||
int esign;
|
||||
int flags=0;
|
||||
int l2powm1;
|
||||
|
||||
r = 0.0L;
|
||||
sign = 1;
|
||||
e = ne = 0;
|
||||
esign = 1;
|
||||
|
||||
while(*s && isspace(*s))
|
||||
s++;
|
||||
|
||||
if (*s == '+')
|
||||
s++;
|
||||
else if (*s == '-')
|
||||
{
|
||||
sign = -1;
|
||||
s++;
|
||||
}
|
||||
|
||||
while ((*s >= '0') && (*s <= '9'))
|
||||
{
|
||||
flags |= 1;
|
||||
r *= 10.0L;
|
||||
r += *s - '0';
|
||||
s++;
|
||||
}
|
||||
|
||||
if (*s == '.')
|
||||
{
|
||||
s++;
|
||||
while ((*s >= '0') && (*s <= '9'))
|
||||
{
|
||||
flags |= 2;
|
||||
r *= 10.0L;
|
||||
r += *s - '0';
|
||||
s++;
|
||||
ne++;
|
||||
}
|
||||
}
|
||||
if (flags == 0)
|
||||
{
|
||||
if (sret)
|
||||
*sret = (char *)s;
|
||||
return 0.0L;
|
||||
}
|
||||
|
||||
if ((*s == 'e') || (*s == 'E'))
|
||||
{
|
||||
s++;
|
||||
if (*s == '+')
|
||||
s++;
|
||||
else if (*s == '-')
|
||||
{
|
||||
s++;
|
||||
esign = -1;
|
||||
}
|
||||
while ((*s >= '0') && (*s <= '9'))
|
||||
{
|
||||
e *= 10;
|
||||
e += *s - '0';
|
||||
s++;
|
||||
}
|
||||
}
|
||||
if (esign < 0)
|
||||
{
|
||||
esign = -esign;
|
||||
e = -e;
|
||||
}
|
||||
e = e - ne;
|
||||
if (e < -4096)
|
||||
{
|
||||
/* possibly subnormal number, 10^e would overflow */
|
||||
r *= 1.0e-2048L;
|
||||
e += 2048;
|
||||
}
|
||||
if (e < 0)
|
||||
{
|
||||
e = -e;
|
||||
esign = -esign;
|
||||
}
|
||||
if (e >= 8192)
|
||||
e = 8191;
|
||||
if (e)
|
||||
{
|
||||
double d = 1.0L;
|
||||
l2powm1 = 0;
|
||||
while (e)
|
||||
{
|
||||
if (e & 1)
|
||||
d *= powten[l2powm1];
|
||||
e >>= 1;
|
||||
l2powm1++;
|
||||
}
|
||||
if (esign > 0)
|
||||
r *= d;
|
||||
else
|
||||
r /= d;
|
||||
}
|
||||
if (sret)
|
||||
*sret = (char *)s;
|
||||
return r * sign;
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue