# include "embed.h"
#endif
-#if defined(NeXT) || defined(__NeXT) || defined (__MACHTEN__)
-# undef PERL_POLLUTE_MALLOC
-#endif
-
#define MEM_SIZE Size_t
#if defined(STANDARD_C) && defined(I_STDDEF)
#include <inttypes.h>
#endif
-/* XXX QUAD stuff is not currently supported on most systems.
- Specifically, perl internals don't support long long. Among
- the many problems is that some compilers support long long,
- but the underlying library functions (such as sprintf) don't.
- Some things do work (such as quad pack/unpack on convex);
- also some systems use long long for the fpos_t typedef. That
- seems to work too.
-
+/*
The IV type is supposed to be long enough to hold any integral
value or a pointer.
--Andy Dougherty August 1996
*/
-/* Much more 64-bit probing added. Now we should get Quad_t
- in most systems: int64_t, long long, long, int, will do.
+/* We should be able to get Quad_t in most systems:
+ all of int64_t, long long, long, int, will work.
Beware of LP32 systems (ILP32, ILP32LL64). Such systems have been
used to sizeof(long) == sizeof(foo*). This is a bad assumption
Summary: a long long system needs to add -DUSE_LONG_LONG to $ccflags
to get quads -- and if its pointers are still 32 bits, this will break
binary compatibility. Casting an IV (a long long) to a pointer will
- truncate half of the IV away.
+ truncate half of the IV away. Most systems can just use
+ Configure -Duse64bits to get the -DUSE_LONG_LONG added either by
+ their hints files, or directly by Configure if they are using gcc.
- --jhi September 1998 */
+ --jhi September 1999 */
#if INTSIZE == 4 && LONGSIZE == 4 && PTRSIZE == 4
# define PERL_ILP32
# if defined(INT32_MAX) && LONGSIZE == 4
# define IV_MAX INT32_MAX
# define IV_MIN INT32_MIN
-# define UV_MAX UINT32_MAX
+# ifndef UINT32_MAX_BROKEN /* e.g. HP-UX with gcc messes this up */
+# define UV_MAX UINT32_MAX
+# else
+# define UV_MAX 4294967295U
+# endif
# ifndef UINT32_MIN
# define UINT32_MIN 0
# endif
# define IVSIZE LONGSIZE
#endif
#define IV_DIG (BIT_DIGITS(IVSIZE * 8))
-#define UV_DIG (BIT_DIGITS(IVSIZE * 8))
+#define UV_DIG (BIT_DIGITS(UVSIZE * 8))
+#if (IVSIZE > PTRSIZE) || (UVSIZE > PTRSIZE)
+# if PTRSIZE == LONGSIZE
+# define PTRV unsigned long
+# else
+# define PTRV unsigned
+# endif
+# define PTR_CAST (PTRV)
+#else
+# define PTRV UV
+# define PTR_CAST
+#endif
+
#ifdef USE_LONG_DOUBLE
# if defined(HAS_LONG_DOUBLE) && (LONG_DOUBLESIZE > DOUBLESIZE)
# define LDoub_t long double
# endif
#endif
+#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_GET_THX)
+# ifdef USE_THREADS
+# define PERL_GET_THX THR
+# else
+# ifdef MULTIPLICITY
+# define PERL_GET_THX PERL_GET_INTERP
+# else
+# ifdef PERL_OBJECT
+# define PERL_GET_THX ((CPerlObj*)PERL_GET_INTERP)
+# else
+# define PERL_GET_THX ((void*)0)
+# endif
+# endif
+# endif
+#endif
+
/* Some unistd.h's give a prototype for pause() even though
HAS_PAUSE ends up undefined. This causes the #define
below to be rejected by the compmiler. Sigh.
/* Fix these up for __STDC__ */
#ifndef DONT_DECLARE_STD
char *mktemp (char*);
+#ifndef atof
double atof (const char*);
#endif
+#endif
#ifndef STANDARD_C
/* All of these are in stdlib.h or time.h for ANSI C */