From 655c9557f6e0da64527cb6f97da65d4b59232c29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Wed, 5 Sep 2001 14:45:54 +0000 Subject: [PATCH] Patch #453627: Define the following macros when compiling on a UnixWare 7.x system: SCO_ATAN2_BUG, SCO_ACCEPT_BUG, and STRICT_SYSV_CURSES. Work aroudn a bug in the SCO UnixWare atan2() implementation. --- Modules/cmathmodule.c | 20 ++++++++++++++++++-- Modules/mathmodule.c | 18 +++++++++++++++++- Objects/complexobject.c | 18 +++++++++++++++++- pyconfig.h.in | 7 +++++++ 4 files changed, 59 insertions(+), 4 deletions(-) diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c index 521d3aa6fc3..2cef27cd30b 100644 --- a/Modules/cmathmodule.c +++ b/Modules/cmathmodule.c @@ -21,6 +21,22 @@ #define M_PI (3.141592653589793239) #endif +#ifdef SCO_ATAN2_BUG +/* + * UnixWare 7+ is known to have a bug in atan2 that will return PI instead + * of ZERO (0) if the first argument is ZERO(0). + */ +static double atan2_sco(double x, double y) +{ + if (x == 0.0) + return (double)0.0; + return atan2(x, y); +} +#define ATAN2 atan2_sco +#else +#define ATAN2 atan2 +#endif + /* First, the C functions that do the real work */ /* constants */ @@ -172,7 +188,7 @@ c_log(Py_complex x) { Py_complex r; double l = hypot(x.real,x.imag); - r.imag = atan2(x.imag, x.real); + r.imag = ATAN2(x.imag, x.real); r.real = log(l); return r; } @@ -188,7 +204,7 @@ c_log10(Py_complex x) { Py_complex r; double l = hypot(x.real,x.imag); - r.imag = atan2(x.imag, x.real)/log(10.); + r.imag = ATAN2(x.imag, x.real)/log(10.); r.real = log10(l); return r; } diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index c206ddc0314..7f4839a12fd 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -31,6 +31,22 @@ extern double modf (double, double *); #define CHECK(x) /* Don't know how to check */ #endif +#ifdef SCO_ATAN2_BUG +/* + * UnixWare 7+ is known to have a bug in atan2 that will return PI instead + * of ZERO (0) if the first argument is ZERO(0). + */ +static double atan2_sco(double x, double y) +{ + if (x == 0.0) + return (double)0.0; + return atan2(x, y); +} +#define ATAN2 atan2_sco +#else +#define ATAN2 atan2 +#endif + /* Call is_error when errno != 0, and where x is the result libm * returned. is_error will usually set up an exception and return * true (1), but may return false (0) without setting up an exception. @@ -115,7 +131,7 @@ FUNC1(asin, asin, "asin(x)\n\nReturn the arc sine (measured in radians) of x.") FUNC1(atan, atan, "atan(x)\n\nReturn the arc tangent (measured in radians) of x.") -FUNC2(atan2, atan2, +FUNC2(atan2, ATAN2, "atan2(y, x)\n\nReturn the arc tangent (measured in radians) of y/x.\n" "Unlike atan(y/x), the signs of both x and y are considered.") FUNC1(ceil, ceil, diff --git a/Objects/complexobject.c b/Objects/complexobject.c index 740499319a9..dde64498936 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -26,6 +26,22 @@ #define PREC_REPR 17 #define PREC_STR 12 +#ifdef SCO_ATAN2_BUG +/* + * UnixWare 7+ is known to have a bug in atan2 that will return PI instead + * of ZERO (0) if the first argument is ZERO(0). + */ +static double atan2_sco(double x, double y) +{ + if (x == 0.0) + return (double)0.0; + return atan2(x, y); +} +#define ATAN2 atan2_sco +#else +#define ATAN2 atan2 +#endif + /* elementary operations on complex numbers */ static Py_complex c_1 = {1., 0.}; @@ -138,7 +154,7 @@ c_pow(Py_complex a, Py_complex b) else { vabs = hypot(a.real,a.imag); len = pow(vabs,b.real); - at = atan2(a.imag, a.real); + at = ATAN2(a.imag, a.real); phase = at*b.real; if (b.imag != 0.0) { len /= exp(at*b.imag); diff --git a/pyconfig.h.in b/pyconfig.h.in index 72fad87c6d3..14fb375fc97 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -716,3 +716,10 @@ #define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE #endif #endif + +/* Define the macros needed if on a UnixWare 7.x system. */ +#if defined(__USLC__) && defined(__SCO_VERSION__) +#define SCO_ACCEPT_BUG /* Use workaround for UnixWare accept() bug */ +#define SCO_ATAN2_BUG /* Use workaround for UnixWare atan2() bug */ +#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */ +#endif