654 changes: 654 additions & 0 deletions src/root/longdouble.c

Large diffs are not rendered by default.

23 changes: 16 additions & 7 deletions src/root/port.d
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import core.stdc.ctype;
import core.stdc.string;
import core.math;

version (Windows) __gshared extern (C) extern const(char)* __locale_decpoint;
version(CRuntime_DigitalMars) __gshared extern (C) extern const(char)* __locale_decpoint;
version(CRuntime_Microsoft) extern(C++) struct longdouble {}

extern (C) float strtof(const(char)* p, char** endp);
extern (C) double strtod(const(char)* p, char** endp);
Expand Down Expand Up @@ -114,44 +115,52 @@ extern (C++) struct Port
return isNan(r) && !(((cast(ubyte*)&r)[7]) & 0x40);
}

version(CRuntime_Microsoft)
{
static int isSignallingNan(longdouble ld)
{
return isSignallingNan(*cast(real*)&ld);
}
}

static int isInfinity(double r)
{
return r is double.infinity || r is -double.infinity;
}

static float strtof(const(char)* p, char** endp)
{
version (Windows)
version (CRuntime_DigitalMars)
{
auto save = __locale_decpoint;
__locale_decpoint = ".";
}
auto r = .strtof(p, endp);
version (Windows) __locale_decpoint = save;
version (CRuntime_DigitalMars) __locale_decpoint = save;
return r;
}

static double strtod(const(char)* p, char** endp)
{
version (Windows)
version (CRuntime_DigitalMars)
{
auto save = __locale_decpoint;
__locale_decpoint = ".";
}
auto r = .strtod(p, endp);
version (Windows) __locale_decpoint = save;
version (CRuntime_DigitalMars) __locale_decpoint = save;
return r;
}

static real strtold(const(char)* p, char** endp)
{
version (Windows)
version (CRuntime_DigitalMars)
{
auto save = __locale_decpoint;
__locale_decpoint = ".";
}
auto r = .strtold(p, endp);
version (Windows) __locale_decpoint = save;
version (CRuntime_DigitalMars) __locale_decpoint = save;
return r;
}

Expand Down
5 changes: 5 additions & 0 deletions src/toir.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@
#include <string.h>
#include <time.h>

#ifdef _MSC_VER
#include <stdarg.h>
#undef va_start // mapped to _crt_va_start
#endif

#include "expression.h"
#include "mtype.h"
#include "dsymbol.h"
Expand Down