2016-08-17 Daniel Richard G. <skunk@iSKUNK.ORG>
+ maint: preprocessor changes to support z/OS
+ * lib/alloca.in.h, lib/fnmatch.c, lib/get-rusage-as.c:
+ * lib/glob.c, lib/math.in.h, lib/ptsname_r.c:
+ * tests/infinity.h, tests/nan.h, tests/test-canonicalize-lgpl.c:
+ * tests/test-nonblocking-pipe.h:
+
fclose, strstr-simple, wchar: port to z/OS
* m4/fclose.m4, m4/strstr.m4, m4/wchar_h.m4:
Changes to the Autoconf M4 code to support z/OS. Note that
void *_alloca (unsigned short);
# pragma intrinsic (_alloca)
# define alloca _alloca
+# elif defined __MVS__
+# include <stdlib.h>
# else
# include <stddef.h>
# ifdef __cplusplus
# define _GNU_SOURCE 1
#endif
-#if ! defined __builtin_expect && __GNUC__ < 3
+#if ! defined __builtin_expect && defined __GNUC__ && __GNUC__ < 3
# define __builtin_expect(expr, expected) (expr)
#endif
uintptr_t
get_rusage_as (void)
{
-#if (defined __APPLE__ && defined __MACH__) || defined _AIX || defined __CYGWIN__ /* Mac OS X, AIX, Cygwin */
+#if (defined __APPLE__ && defined __MACH__) || defined _AIX || defined __CYGWIN__ || defined __MVS__ /* Mac OS X, AIX, Cygwin, z/OS */
/* get_rusage_as_via_setrlimit() does not work.
Prefer get_rusage_as_via_iterator(). */
return get_rusage_as_via_iterator ();
# define __stat64(fname, buf) stat (fname, buf)
# define __fxstatat64(_, d, f, st, flag) fstatat (d, f, st, flag)
# define struct_stat64 struct stat
-# define __alloca alloca
+# ifndef __MVS__
+# define __alloca alloca
+# endif
# define __readdir readdir
# define __glob_pattern_p glob_pattern_p
# define COMPILE_GLOB64
#if @GNULIB_CEIL@
# if @REPLACE_CEIL@
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ceil
# define ceil rpl_ceil
# endif
_GL_FUNCDECL_RPL (ceil, double, (double x));
#if @GNULIB_FLOOR@
# if @REPLACE_FLOOR@
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef floor
# define floor rpl_floor
# endif
_GL_FUNCDECL_RPL (floor, double, (double x));
#if @GNULIB_FREXP@
# if @REPLACE_FREXP@
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef frexp
# define frexp rpl_frexp
# endif
_GL_FUNCDECL_RPL (frexp, double, (double x, int *expptr) _GL_ARG_NONNULL ((2)));
#if @GNULIB_TRUNCF@
# if @REPLACE_TRUNCF@
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef truncf
# define truncf rpl_truncf
# endif
_GL_FUNCDECL_RPL (truncf, float, (float x));
#if @GNULIB_TRUNC@
# if @REPLACE_TRUNC@
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef trunc
# define trunc rpl_trunc
# endif
_GL_FUNCDECL_RPL (trunc, double, (double x));
# define _PATH_DEV "/dev/"
# endif
+# undef __set_errno
+# undef __stat
+# undef __ttyname_r
+# undef __ptsname_r
+
# define __set_errno(e) errno = (e)
# define __isatty isatty
# define __stat stat
/* Infinityf () returns a 'float' +Infinity. */
-/* The Microsoft MSVC 9 compiler chokes on the expression 1.0f / 0.0f. */
-#if defined _MSC_VER
+/* The Microsoft MSVC 9 compiler chokes on the expression 1.0f / 0.0f.
+ The IBM XL C compiler on z/OS complains. */
+#if defined _MSC_VER || (defined __MVS__ && defined __IBMC__)
static float
Infinityf ()
{
/* Infinityd () returns a 'double' +Infinity. */
-/* The Microsoft MSVC 9 compiler chokes on the expression 1.0 / 0.0. */
-#if defined _MSC_VER
+/* The Microsoft MSVC 9 compiler chokes on the expression 1.0 / 0.0.
+ The IBM XL C compiler on z/OS complains. */
+#if defined _MSC_VER || (defined __MVS__ && defined __IBMC__)
static double
Infinityd ()
{
/* Infinityl () returns a 'long double' +Infinity. */
-/* The Microsoft MSVC 9 compiler chokes on the expression 1.0L / 0.0L. */
-#if defined _MSC_VER
-static double
+/* The Microsoft MSVC 9 compiler chokes on the expression 1.0L / 0.0L.
+ The IBM XL C compiler on z/OS complains. */
+#if defined _MSC_VER || (defined __MVS__ && defined __IBMC__)
+static long double
Infinityl ()
{
static long double zero = 0.0L;
along with this program. If not, see <http://www.gnu.org/licenses/>. */
+/* IBM z/OS supports both hexadecimal and IEEE floating-point formats. The
+ former does not support NaN and its isnan() implementation returns zero
+ for all values. */
+#if defined __MVS__ && defined __IBMC__ && !defined __BFP__
+# error "NaN is not supported with IBM's hexadecimal floating-point format; please re-compile with -qfloat=ieee"
+#endif
+
/* NaNf () returns a 'float' not-a-number. */
/* The Compaq (ex-DEC) C 6.4 compiler and the Microsoft MSVC 9 compiler choke
- on the expression 0.0 / 0.0. */
-#if defined __DECC || defined _MSC_VER
+ on the expression 0.0 / 0.0. The IBM XL C compiler on z/OS complains. */
+#if defined __DECC || defined _MSC_VER || (defined __MVS__ && defined __IBMC__)
static float
NaNf ()
{
/* NaNd () returns a 'double' not-a-number. */
/* The Compaq (ex-DEC) C 6.4 compiler and the Microsoft MSVC 9 compiler choke
- on the expression 0.0 / 0.0. */
-#if defined __DECC || defined _MSC_VER
+ on the expression 0.0 / 0.0. The IBM XL C compiler on z/OS complains. */
+#if defined __DECC || defined _MSC_VER || (defined __MVS__ && defined __IBMC__)
static double
NaNd ()
{
/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
runtime type conversion.
- The Microsoft MSVC 9 compiler chokes on the expression 0.0L / 0.0L. */
+ The Microsoft MSVC 9 compiler chokes on the expression 0.0L / 0.0L.
+ The IBM XL C compiler on z/OS complains. */
#ifdef __sgi
static long double NaNl ()
{
double zero = 0.0;
return zero / zero;
}
-#elif defined _MSC_VER
+#elif defined _MSC_VER || (defined __MVS__ && defined __IBMC__)
static long double
NaNl ()
{
ASSERT (result2);
ASSERT (stat ("/", &st1) == 0);
ASSERT (stat ("//", &st2) == 0);
+ /* On IBM z/OS, "/" and "//" are distinct, yet they both have
+ st_dev == st_ino == 1. */
+#ifndef __MVS__
if (SAME_INODE (st1, st2))
{
ASSERT (strcmp (result1, "/") == 0);
ASSERT (strcmp (result2, "/") == 0);
}
else
+#endif
{
ASSERT (strcmp (result1, "//") == 0);
ASSERT (strcmp (result2, "//") == 0);
OSF/1 >= 262145
Solaris <= 7 >= 10241
Solaris >= 8 >= 20481
+ z/OS >= 131073
Cygwin >= 65537
native Windows >= 4097 (depends on the _pipe argument)
*/
-#if defined __osf__ || (defined __linux__ && (defined __ia64__ || defined __mips__))
+#if defined __MVS__ || defined __osf__ || (defined __linux__ && (defined __ia64__ || defined __mips__))
# define PIPE_DATA_BLOCK_SIZE 270000
#elif defined __linux__ && defined __sparc__
# define PIPE_DATA_BLOCK_SIZE 140000