#define TAINT_PROPER(s) if (tainting) taint_proper(no_security, s)
#define TAINT_ENV() if (tainting) taint_env()
-#ifdef USE_BSDPGRP
-# ifdef HAS_GETPGRP
-# define BSD_GETPGRP(pid) getpgrp((pid))
-# endif
-# ifdef HAS_SETPGRP
-# define BSD_SETPGRP(pid, pgrp) setpgrp((pid), (pgrp))
-# endif
+/* XXX All process group stuff is handled in pp_sys.c. Should these
+ defines move there? If so, I could simplify this a lot. --AD 9/96.
+*/
+/* Process group stuff changed from traditional BSD to POSIX.
+ perlfunc.pod documents the traditional BSD-style syntax, so we'll
+ try to preserve that, if possible.
+*/
+#ifdef HAS_SETPGID
+# define BSD_SETPGRP(pid, pgrp) setpgid((pid), (pgrp))
#else
-# ifdef HAS_GETPGRP2
-# define BSD_GETPGRP(pid) getpgrp2((pid))
-# ifndef HAS_GETPGRP
-# define HAS_GETPGRP
-# endif
-# endif
-# ifdef HAS_SETPGRP2
-# define BSD_SETPGRP(pid, pgrp) setpgrp2((pid), (pgrp))
-# ifndef HAS_SETPGRP
-# define HAS_SETPGRP
-# endif
-# endif
+# if defined(HAS_SETPGRP) && defined(USE_BSD_SETPGRP)
+# define BSD_SETPGRP(pid, pgrp) setpgrp((pid), (pgrp))
+# else
+# ifdef HAS_SETPGRP2 /* DG/UX */
+# define BSD_SETPGRP(pid, pgrp) setpgrp2((pid), (pgrp))
+# endif
+# endif
+#endif
+#if defined(BSD_SETPGRP) && !defined(HAS_SETPGRP)
+# define HAS_SETPGRP /* Well, effectively it does . . . */
+#endif
+
+/* getpgid isn't POSIX, but at least Solaris and Linux have it, and it makes
+ our life easier :-) so we'll try it.
+*/
+#ifdef HAS_GETPGID
+# define BSD_GETPGRP(pid) getpgid((pid))
+#else
+# if defined(HAS_GETPGRP) && defined(USE_BSD_GETPGRP)
+# define BSD_GETPGRP(pid) getpgrp((pid))
+# else
+# ifdef HAS_GETPGRP2 /* DG/UX */
+# define BSD_GETPGRP(pid) getpgrp2((pid))
+# endif
+# endif
+#endif
+#if defined(BSD_GETPGRP) && !defined(HAS_GETPGRP)
+# define HAS_GETPGRP /* Well, effectively it does . . . */
+#endif
+
+/* These are not exact synonyms, since setpgrp() and getpgrp() may
+ have different behaviors, but perl.h used to define USE_BSDPGRP
+ (prior to 5.003_05) so some extension might depend on it.
+*/
+#if defined(USE_BSD_SETPGRP) || defined(USE_BSD_GETPGRP)
+# ifndef USE_BSDPGRP
+# define USE_BSDPGRP
+# endif
#endif
#ifndef _TYPES_ /* If types.h defines this it's easy. */
# endif
#endif /* HAS_MEMCMP */
-/* XXX we prefer bcmp slightly for comparisons that don't care about ordering */
-#ifndef HAS_BCMP
-# ifndef bcmp
-# define bcmp(s1,s2,l) memcmp(s1,s2,l)
-# endif
-#endif /* HAS_BCMP */
-
#if !defined(HAS_MEMMOVE) && !defined(memmove)
# if defined(HAS_BCOPY) && defined(HAS_SAFE_BCOPY)
# define memmove(d,s,l) bcopy(s,d,l)
#undef UV
#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
+*/
+
#ifdef HAS_QUAD
# ifdef cray
# define Quad_t int
# endif
typedef Quad_t IV;
typedef unsigned Quad_t UV;
+# define IV_MAX PERL_QUAD_MAX
+# define IV_MIN PERL_QUAD_MIN
+# define UV_MAX PERL_UQUAD_MAX
+# define UV_MIN PERL_UQUAD_MIN
#else
typedef long IV;
typedef unsigned long UV;
+# define IV_MAX PERL_LONG_MAX
+# define IV_MIN PERL_LONG_MIN
+# define UV_MAX PERL_ULONG_MAX
+# define UV_MIN PERL_ULONG_MIN
#endif
/* Previously these definitions used hardcoded figures.
#endif
#endif
+#ifdef CHAR_MAX
+# define PERL_CHAR_MAX CHAR_MAX
+#else
+# ifdef MAXCHAR /* Often used in <values.h> */
+# define PERL_CHAR_MAX MAXCHAR
+# else
+# define PERL_CHAR_MAX ((char) ((~(unsigned char)0) >> 1))
+# endif
+#endif
+
+#ifdef CHAR_MIN
+# define PERL_CHAR_MIN CHAR_MIN
+#else
+# ifdef MINCHAR
+# define PERL_CHAR_MIN MINCHAR
+# else
+# define PERL_CHAR_MIN (-PERL_CHAR_MAX - ((3 & -1) == 3))
+# endif
+#endif
+
+#ifdef UCHAR_MAX
+# define PERL_UCHAR_MAX UCHAR_MAX
+#else
+# ifdef MAXUCHAR
+# define PERL_UCHAR_MAX MAXUCHAR
+# else
+# define PERL_UCHAR_MAX (~(unsigned char)0)
+# endif
+#endif
+
+#define PERL_UCHAR_MIN 0
+
+#ifdef SHORT_MAX
+# define PERL_SHORT_MAX SHORT_MAX
+#else
+# ifdef MAXSHORT /* Often used in <values.h> */
+# define PERL_SHORT_MAX MAXSHORT
+# else
+# define PERL_SHORT_MAX ((short) ((~(unsigned short)0) >> 1))
+# endif
+#endif
+
+#ifdef SHORT_MIN
+# define PERL_SHORT_MIN SHORT_MIN
+#else
+# ifdef MINSHORT
+# define PERL_SHORT_MIN MINSHORT
+# else
+# define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
+# endif
+#endif
+
+#ifdef USHORT_MAX
+# define PERL_USHORT_MAX USHORT_MAX
+#else
+# ifdef MAXUSHORT
+# define PERL_USHORT_MAX MAXUSHORT
+# else
+# define PERL_USHORT_MAX (~(unsigned short)0)
+# endif
+#endif
+
+#define PERL_USHORT_MIN 0
+
+#ifdef INT_MAX
+# define PERL_INT_MAX INT_MAX
+#else
+# ifdef MAXINT /* Often used in <values.h> */
+# define PERL_INT_MAX MAXINT
+# else
+# define PERL_INT_MAX ((int) ((~(unsigned int)0) >> 1))
+# endif
+#endif
+
+#ifdef INT_MIN
+# define PERL_INT_MIN INT_MIN
+#else
+# ifdef MININT
+# define PERL_INT_MIN MININT
+# else
+# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
+# endif
+#endif
+
+#ifdef UINT_MAX
+# define PERL_UINT_MAX UINT_MAX
+#else
+# ifdef MAXUINT
+# define PERL_UINT_MAX MAXUINT
+# else
+# define PERL_UINT_MAX (~(unsigned int)0)
+# endif
+#endif
+
+#define PERL_UINT_MIN 0
+
#ifdef LONG_MAX
-#define PERL_LONG_MAX LONG_MAX
+# define PERL_LONG_MAX LONG_MAX
#else
# ifdef MAXLONG /* Often used in <values.h> */
# define PERL_LONG_MAX MAXLONG
#endif
#ifdef LONG_MIN
-#define PERL_LONG_MIN LONG_MIN
+# define PERL_LONG_MIN LONG_MIN
#else
# ifdef MINLONG
# define PERL_LONG_MIN MINLONG
# else
-# define PERL_LONG_MIN (-LONG_MAX - ((3 & -1) == 3))
+# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
# endif
#endif
#ifdef ULONG_MAX
-#define PERL_ULONG_MAX ULONG_MAX
+# define PERL_ULONG_MAX ULONG_MAX
#else
# ifdef MAXULONG
# define PERL_ULONG_MAX MAXULONG
# endif
#endif
-#ifdef ULONG_MIN
-#define PERL_ULONG_MIN ULONG_MIN
-#else
-# define ULONG_MIN 0L
+#define PERL_ULONG_MIN 0L
+
+#ifdef HAS_QUAD
+# ifdef QUAD_MAX
+# define PERL_QUAD_MAX QUAD_MAX
+# else
+# define PERL_QUAD_MAX ((IV) ((~(UV)0) >> 1))
+# endif
+
+# ifdef QUAD_MIN
+# define PERL_QUAD_MIN QUAD_MIN
+# else
+# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
+# endif
+
+# ifdef UQUAD_MAX
+# define PERL_UQUAD_MAX UQUAD_MAX
+# else
+# define PERL_UQUAD_MAX (~(UV)0)
+# endif
+
+# define PERL_UQUAD_MIN 0
#endif
typedef MEM_SIZE STRLEN;
# endif
# endif
#endif
-
-#ifndef SH_PATH /* May be a variable. */
-# define SH_PATH BIN_SH
-#ifndef BIN_SH
-# define BIN_SH "/bin/sh"
-#endif
-#endif
-
-#ifndef HAS_PAUSE
-#define pause() sleep((32767<<16)+32767)
+
+/* 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.
+*/
+#ifdef HAS_PAUSE
+#define Pause pause
+#else
+#define Pause() sleep((32767<<16)+32767)
#endif
#ifndef IOCPARM_LEN
#define U_I(what) ((unsigned int)(what))
#define U_L(what) ((U32)(what))
#else
+# ifdef __cplusplus
+ extern "C" {
+# endif
U32 cast_ulong _((double));
+# ifdef __cplusplus
+ }
+# endif
#define U_S(what) ((U16)cast_ulong((double)(what)))
#define U_I(what) ((unsigned int)cast_ulong((double)(what)))
#define U_L(what) (cast_ulong((double)(what)))
#define I_V(what) ((IV)(what))
#define U_V(what) ((UV)(what))
#else
+# ifdef __cplusplus
+ extern "C" {
+# endif
I32 cast_i32 _((double));
-#define I_32(what) (cast_i32((double)(what)))
IV cast_iv _((double));
-#define I_V(what) (cast_iv((double)(what)))
UV cast_uv _((double));
+# ifdef __cplusplus
+ }
+# endif
+#define I_32(what) (cast_i32((double)(what)))
+#define I_V(what) (cast_iv((double)(what)))
#define U_V(what) (cast_uv((double)(what)))
#endif
#endif
#define YYMAXDEPTH 300
+#ifndef assert /* <assert.h> might have been included somehow */
#define assert(what) DEB( { \
if (!(what)) { \
croak("Assertion failed: file \"%s\", line %d", \
__FILE__, __LINE__); \
exit(1); \
}})
+#endif
struct ufuncs {
I32 (*uf_val)_((IV, SV*));
#endif
#ifndef __cplusplus
+#ifdef __NeXT__ /* or whatever catches all NeXTs */
+char *crypt (); /* Maybe more hosts will need the unprototyped version */
+#else
char *crypt _((const char*, const char*));
+#endif
char *getenv _((const char*));
Off_t lseek _((int,Off_t,int));
char *getlogin _((void));
/* temp space */
EXT SV * Sv;
+EXT HE He;
EXT XPV * Xpv;
EXT char buf[2048]; /* should be longer than PATH_MAX */
EXT char tokenbuf[256];
#endif
#endif /* Include guard */
+