This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
integrate cfgperl contents into mainline
authorGurusamy Sarathy <gsar@cpan.org>
Wed, 26 Apr 2000 23:42:12 +0000 (23:42 +0000)
committerGurusamy Sarathy <gsar@cpan.org>
Wed, 26 Apr 2000 23:42:12 +0000 (23:42 +0000)
p4raw-id: //depot/perl@5954

29 files changed:
Configure
Porting/Glossary
Porting/config.sh
Porting/config_H
Todo-5.6
config_h.SH
epoc/config.sh
hints/unicos.sh
lib/Math/Complex.pm
perl.c
perl.h
pod/perlop.pod
pp.c
pp_sys.c
sv.c
t/lib/complex.t
t/op/64bitint.t
t/op/bop.t
t/op/misc.t
vms/subconfigure.com
vos/config.def
vos/config.h
vos/config_h.SH_orig
win32/config.bc
win32/config.gc
win32/config.vc
win32/config_H.bc
win32/config_H.gc
win32/config_H.vc

index 2864e96..9538137 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -20,7 +20,7 @@
 
 # $Id: Head.U,v 3.0.1.9 1997/02/28 15:02:09 ram Exp $
 #
-# Generated on Wed Mar 22 19:13:31 EET 2000 [metaconfig 3.0 PL70]
+# Generated on Mon Apr 24 23:59:43 EET DST 2000 [metaconfig 3.0 PL70]
 # (with additional metaconfig patches by perlbug@perl.com)
 
 cat >/tmp/c1$$ <<EOF
@@ -355,6 +355,7 @@ d_flexfnam=''
 d_flock=''
 d_fork=''
 d_fpos64_t=''
+d_frexpl=''
 d_fs_data_s=''
 d_fseeko=''
 d_fsetpos=''
@@ -406,6 +407,8 @@ d_iconv=''
 d_inetaton=''
 d_int64_t=''
 d_isascii=''
+d_isnan=''
+d_isnanl=''
 d_killpg=''
 d_lchown=''
 d_ldbl_dig=''
@@ -435,6 +438,7 @@ d_mkstemps=''
 d_mktime=''
 d_mmap=''
 mmaptype=''
+d_modfl=''
 d_mprotect=''
 d_msg=''
 d_msgctl=''
@@ -9061,6 +9065,10 @@ $rm -f try.* try
 set d_fpos64_t
 eval $setvar
 
+: see if frexpl exists
+set frexpl d_frexpl
+eval $inlibc
+
 hasstruct='varname=$1; struct=$2; shift; shift;
 while $test $# -ge 2; do
        case "$1" in
@@ -9551,6 +9559,14 @@ set d_isascii
 eval $setvar
 $rm -f isascii*
 
+: see if isnan exists
+set isnan d_isnan
+eval $inlibc
+
+: see if isnanl exists
+set isnanl d_isnanl
+eval $inlibc
+
 : see if killpg exists
 set killpg d_killpg
 eval $inlibc
@@ -9770,6 +9786,10 @@ esac
 
 
 
+: see if modfl exists
+set modfl d_modfl
+eval $inlibc
+
 : see if mprotect exists
 set mprotect d_mprotect
 eval $inlibc
@@ -15176,6 +15196,7 @@ d_flock='$d_flock'
 d_fork='$d_fork'
 d_fpathconf='$d_fpathconf'
 d_fpos64_t='$d_fpos64_t'
+d_frexpl='$d_frexpl'
 d_fs_data_s='$d_fs_data_s'
 d_fseeko='$d_fseeko'
 d_fsetpos='$d_fsetpos'
@@ -15225,6 +15246,8 @@ d_index='$d_index'
 d_inetaton='$d_inetaton'
 d_int64_t='$d_int64_t'
 d_isascii='$d_isascii'
+d_isnan='$d_isnan'
+d_isnanl='$d_isnanl'
 d_killpg='$d_killpg'
 d_lchown='$d_lchown'
 d_ldbl_dig='$d_ldbl_dig'
@@ -15251,6 +15274,7 @@ d_mkstemp='$d_mkstemp'
 d_mkstemps='$d_mkstemps'
 d_mktime='$d_mktime'
 d_mmap='$d_mmap'
+d_modfl='$d_modfl'
 d_mprotect='$d_mprotect'
 d_msg='$d_msg'
 d_msg_ctrunc='$d_msg_ctrunc'
index cc66d70..d60a168 100644 (file)
@@ -573,6 +573,10 @@ d_fpathconf (d_pathconf.U):
 d_fpos64_t (d_fpos64_t.U):
        This symbol will be defined if the C compiler supports fpos64_t.
 
+d_frexpl (d_frexpl.U):
+       This variable conditionally defines the HAS_FREXPL symbol, which
+       indicates to the C program that the frexpl() routine is available.
+
 d_fs_data_s (d_fs_data_s.U):
        This variable conditionally defines the HAS_STRUCT_FS_DATA symbol,
        which indicates that the struct fs_data is supported.
@@ -811,6 +815,14 @@ d_isascii (d_isascii.U):
        This variable conditionally defines the HAS_ISASCII constant,
        which indicates to the C program that isascii() is available.
 
+d_isnan (d_isnan.U):
+       This variable conditionally defines the HAS_ISNAN symbol, which
+       indicates to the C program that the isnan() routine is available.
+
+d_isnanl (d_isnanl.U):
+       This variable conditionally defines the HAS_ISNANL symbol, which
+       indicates to the C program that the isnanl() routine is available.
+
 d_killpg (d_killpg.U):
        This variable conditionally defines the HAS_KILLPG symbol, which
        indicates to the C program that the killpg() routine is available
@@ -933,6 +945,10 @@ d_mmap (d_mmap.U):
        This variable conditionally defines HAS_MMAP if mmap() is
        available to map a file into memory.
 
+d_modfl (d_modfl.U):
+       This variable conditionally defines the HAS_MODFL symbol, which
+       indicates to the C program that the modfl() routine is available.
+
 d_mprotect (d_mprotect.U):
        This variable conditionally defines HAS_MPROTECT if mprotect() is
        available to modify the access protection of a memory mapped file.
index 3f29888..a658cc2 100644 (file)
@@ -8,7 +8,7 @@
 
 # Package name      : perl5
 # Source directory  : .
-# Configuration time: Tue Mar 21 23:22:20 EET 2000
+# Configuration time: Tue Apr 25 00:14:34 EET DST 2000
 # Configured by     : jhi
 # Target system     : osf1 alpha.hut.fi v4.0 878 alpha 
 
@@ -59,7 +59,7 @@ ccflags='-pthread -std -DLANGUAGE_C'
 ccsymbols='__alpha=1 __LANGUAGE_C__=1 __osf__=1 __unix__=1 _LONGLONG=1 _SYSTYPE_BSD=1 SYSTYPE_BSD=1 unix=1'
 cf_by='jhi'
 cf_email='yourname@yourhost.yourplace.com'
-cf_time='Tue Mar 21 23:22:20 EET 2000'
+cf_time='Tue Apr 25 00:14:34 EET DST 2000'
 charsize='1'
 chgrp=''
 chmod=''
@@ -151,6 +151,7 @@ d_flock='define'
 d_fork='define'
 d_fpathconf='define'
 d_fpos64_t='undef'
+d_frexpl='define'
 d_fs_data_s='undef'
 d_fseeko='undef'
 d_fsetpos='define'
@@ -200,6 +201,8 @@ d_index='undef'
 d_inetaton='define'
 d_int64_t='undef'
 d_isascii='define'
+d_isnan='define'
+d_isnanl='define'
 d_killpg='define'
 d_lchown='define'
 d_ldbl_dig='define'
@@ -226,6 +229,7 @@ d_mkstemp='define'
 d_mkstemps='undef'
 d_mktime='define'
 d_mmap='define'
+d_modfl='define'
 d_mprotect='define'
 d_msg='define'
 d_msg_ctrunc='define'
index c80ebaf..130a613 100644 (file)
@@ -17,7 +17,7 @@
 /*
  * Package name      : perl5
  * Source directory  : .
- * Configuration time: Tue Mar 21 23:22:20 EET 2000
+ * Configuration time: Tue Apr 25 00:14:34 EET DST 2000
  * Configured by     : jhi
  * Target system     : osf1 alpha.hut.fi v4.0 878 alpha 
  */
 #  define STRINGIFY(a) PeRl_StGiFy(a)
 #endif
 #if 42 != 1 && 42 != 42
-#include "Bletch: How does this C preprocessor catenate tokens?"
+#   include "Bletch: How does this C preprocessor catenate tokens?"
 #endif
 
 /* CPPSTDIN:
  */
 #define HAS_FD_SET     /**/
 
+/* FLEXFILENAMES:
+ *     This symbol, if defined, indicates that the system supports filenames
+ *     longer than 14 characters.
+ */
+#define        FLEXFILENAMES           /**/
+
 /* HAS_FPOS64_T:
  *     This symbol will be defined if the C compiler supports fpos64_t.
  */
 /*#define      HAS_FPOS64_T            / **/
 
+/* HAS_FREXPL:
+ *     This symbol, if defined, indicates that the frexpl routine is
+ *     available to break a long double floating-point number into
+ *     a normalized fraction and an integral power of 2.
+ */
+#define HAS_FREXPL             /**/
+
 /* HAS_STRUCT_FS_DATA:
  *     This symbol, if defined, indicates that the struct fs_data
  *     to do statfs() is supported.
  */
 #define HAS_ISASCII            /**/
 
+/* HAS_ISNAN:
+ *     This symbol, if defined, indicates that the isnan routine is
+ *     available to check whether a double is a NaN.
+ */
+#define HAS_ISNAN              /**/
+
+/* HAS_ISNANL:
+ *     This symbol, if defined, indicates that the isnanl routine is
+ *     available to check whether a long double is a NaN.
+ */
+#define HAS_ISNANL             /**/
+
+/* HAS_LCHOWN:
+ *     This symbol, if defined, indicates that the lchown routine is
+ *     available to operate on a symbolic link (instead of following the
+ *     link).
+ */
+#define HAS_LCHOWN             /**/
+
 /* HAS_LDBL_DIG:
  *     This symbol, if defined, indicates that this system's <float.h>
  *     or <limits.h> defines the symbol LDBL_DIG, which is the number
 /* U64SIZE:
  *     This symbol contains the sizeof(U64).
  */
+/* NVSIZE:
+ *     This symbol contains the sizeof(NV).
+ */
 /* NV_PRESERVES_UV:
  *     This symbol, if defined, indicates that a variable of type NVTYPE
  *     can preserve all the bit of a variable of type UVSIZE.
 #define        I64SIZE         8       /**/
 #define        U64SIZE         8       /**/
 #endif
+#define        NVSIZE          8               /**/
 #undef NV_PRESERVES_UV
 
 /* IVdf:
 #define PERL_XS_APIVERSION "5.6.0"
 #define PERL_PM_APIVERSION "5.005"
 
-/* HAS_LCHOWN:
- *     This symbol, if defined, indicates that the lchown routine is
- *     available to operate on a symbolic link (instead of following the
- *     link).
+/* HAS_MODFL:
+ *     This symbol, if defined, indicates that the modfl routine is
+ *     available to split a long double x into a fractional part f and
+ *     an integer part i such that |f| < 1.0 and (f + i) = x.
  */
-#define HAS_LCHOWN             /**/
-
-/* FLEXFILENAMES:
- *     This symbol, if defined, indicates that the system supports filenames
- *     longer than 14 characters.
- */
-#define        FLEXFILENAMES           /**/
+#define HAS_MODFL              /**/
 
 #endif
index 9abeb55..fac325c 100644 (file)
--- a/Todo-5.6
+++ b/Todo-5.6
@@ -125,12 +125,14 @@ Miscellaneous
        Configure doesn't yet probe for usleep/nanosleep/ualarm but
        the units exist)
     floating point handling: nans, infinities, fp exception masks, etc.
-       at least the following interfaces exist: fp_classify(), fp_class(),
-       class(), isnan(), isinf(), isfinite(), finite(), isnormal(),
-       ordered(), fp_setmask(), fp_getmask(), fp_setround(), fp_getround(), 
-       ieeefp.h, fp_class.h.  There are metaconfig units for most of these.
-        Search for ifdef __osf__ in pp.c to find a temporary fix that
-       needs to be done right.
+       At least the following interfaces exist: fp_classify(), fp_class(),
+       class(), isinf(), isfinite(), finite(), isnormal(), unordered(),
+       <ieeefp.h>, <fp_class.h> (there are metaconfig units for all these),
+       fp_setmask(), fp_getmask(), fp_setround(), fp_getround()
+       (no metaconfig units yet for these).
+        Don't forget finitel(), fp_classl(), fp_class_l(), (yes, both do,
+       unfortunately, exist), and unorderedl().
+       As of 5.6.1 there is cpp macro Perl_isnan().
     fix the basic arithmetics (+ - * / %) to preserve IVness/UVness if
        both arguments are IVs/UVs
     replace pod2html with new PodtoHtml? (requires other modules from CPAN)
index bf14044..08a1cf5 100644 (file)
@@ -1212,7 +1212,7 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
 #  define STRINGIFY(a) PeRl_StGiFy(a)
 #endif
 #if $cpp_stuff != 1 && $cpp_stuff != 42
-# include "Bletch: How does this C preprocessor catenate tokens?"
+#   include "Bletch: How does this C preprocessor catenate tokens?"
 #endif
 
 /* CPPSTDIN:
@@ -1354,11 +1354,24 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  */
 #$d_fd_set HAS_FD_SET  /**/
 
+/* FLEXFILENAMES:
+ *     This symbol, if defined, indicates that the system supports filenames
+ *     longer than 14 characters.
+ */
+#$d_flexfnam   FLEXFILENAMES           /**/
+
 /* HAS_FPOS64_T:
  *     This symbol will be defined if the C compiler supports fpos64_t.
  */
 #$d_fpos64_t   HAS_FPOS64_T            /**/
 
+/* HAS_FREXPL:
+ *     This symbol, if defined, indicates that the frexpl routine is
+ *     available to break a long double floating-point number into
+ *     a normalized fraction and an integral power of 2.
+ */
+#$d_frexpl HAS_FREXPL          /**/
+
 /* HAS_STRUCT_FS_DATA:
  *     This symbol, if defined, indicates that the struct fs_data
  *     to do statfs() is supported.
@@ -1638,6 +1651,25 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  */
 #$d_isascii HAS_ISASCII                /**/
 
+/* HAS_ISNAN:
+ *     This symbol, if defined, indicates that the isnan routine is
+ *     available to check whether a double is a NaN.
+ */
+#$d_isnan HAS_ISNAN            /**/
+
+/* HAS_ISNANL:
+ *     This symbol, if defined, indicates that the isnanl routine is
+ *     available to check whether a long double is a NaN.
+ */
+#$d_isnanl HAS_ISNANL          /**/
+
+/* HAS_LCHOWN:
+ *     This symbol, if defined, indicates that the lchown routine is
+ *     available to operate on a symbolic link (instead of following the
+ *     link).
+ */
+#$d_lchown HAS_LCHOWN          /**/
+
 /* HAS_LDBL_DIG:
  *     This symbol, if defined, indicates that this system's <float.h>
  *     or <limits.h> defines the symbol LDBL_DIG, which is the number
@@ -2637,6 +2669,9 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
 /* U64SIZE:
  *     This symbol contains the sizeof(U64).
  */
+/* NVSIZE:
+ *     This symbol contains the sizeof(NV).
+ */
 /* NV_PRESERVES_UV:
  *     This symbol, if defined, indicates that a variable of type NVTYPE
  *     can preserve all the bit of a variable of type UVSIZE.
@@ -2666,6 +2701,7 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
 #define        I64SIZE         $i64size        /**/
 #define        U64SIZE         $u64size        /**/
 #endif
+#define        NVSIZE          $nvsize         /**/
 #$d_nv_preserves_uv    NV_PRESERVES_UV
 
 /* IVdf:
@@ -3086,18 +3122,12 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
 #define PERL_XS_APIVERSION "$xs_apiversion"
 #define PERL_PM_APIVERSION "$pm_apiversion"
 
-/* HAS_LCHOWN:
- *     This symbol, if defined, indicates that the lchown routine is
- *     available to operate on a symbolic link (instead of following the
- *     link).
+/* HAS_MODFL:
+ *     This symbol, if defined, indicates that the modfl routine is
+ *     available to split a long double x into a fractional part f and
+ *     an integer part i such that |f| < 1.0 and (f + i) = x.
  */
-#$d_lchown HAS_LCHOWN          /**/
-
-/* FLEXFILENAMES:
- *     This symbol, if defined, indicates that the system supports filenames
- *     longer than 14 characters.
- */
-#$d_flexfnam   FLEXFILENAMES           /**/
+#$d_modfl HAS_MODFL            /**/
 
 #endif
 !GROK!THIS!
index a60b7a0..b1fee71 100644 (file)
@@ -33,8 +33,8 @@ apirevision=''
 apisubversion=''
 apiversion=''
 ar='arm-pe-ar'
-archlib='/perl/lib/5.6.0/epoc'
-archlibexp='/perl/lib/5.6.0/epoc'
+archlib='/perl/lib/5.6.1/epoc'
+archlibexp='/perl/lib/5.6.1/epoc'
 archname64=''
 archname='epoc'
 archobjs='epoc.o epocish.o epoc_stubs.o'
@@ -149,6 +149,7 @@ d_flock='undef'
 d_fork='undef'
 d_fpathconf='undef'
 d_fpos64_t='undef'
+d_frexpl='undef'
 d_fseeko='undef'
 d_fsetpos='define'
 d_fstatfs='define'
@@ -196,6 +197,8 @@ d_inetaton='define'
 d_int64t='undef'
 d_iovec_s='undef'
 d_isascii='define'
+d_isnan='define'
+d_isnanl='undef'
 d_killpg='undef'
 d_lchown='undef'
 d_ldbl_dig='undef'
@@ -220,6 +223,7 @@ d_mkdir='define'
 d_mkfifo='undef'
 d_mktime='define'
 d_mmap='undef'
+d_modfl='undef'
 d_mprotect='undef'
 d_msg='undef'
 d_msg_ctrunc='undef'
@@ -581,8 +585,8 @@ pmake=''
 pr=''
 prefix=''
 prefixexp=''
-privlib='/perl/lib/5.6.0'
-privlibexp='/perl/lib/5.6.0'
+privlib='/perl/lib/5.6.1'
+privlibexp='/perl/lib/5.6.1'
 prototype='define'
 ptrsize='4'
 randbits='31'
@@ -626,11 +630,11 @@ sig_name_init='"ZERO", 0'
 sig_num='0'
 sig_num_init='0, 0'
 signal_t='void'
-sitearch='/perl/lib/site_perl/5.6.0/epoc'
-sitearchexp='/perl/lib/site_perl/5.6.0/epoc'
-sitelib='/perl/lib/site_perl/5.6.0/'
+sitearch='/perl/lib/site_perl/5.6.1/epoc'
+sitearchexp='/perl/lib/site_perl/5.6.1/epoc'
+sitelib='/perl/lib/site_perl/5.6.1/'
 sitelib_stem='/perl/lib/site_perl'
-sitelibexp='/perl/lib/site_perl/5.6.0/'
+sitelibexp='/perl/lib/site_perl/5.6.1/'
 siteprefix=''
 siteprefixexp=''
 sizesize='4'
@@ -702,7 +706,7 @@ vendorlib_stem=''
 vendorlibexp=''
 vendorprefix=''
 vendorprefixexp=''
-version='5.6.0'
+version='5.6.1'
 vi=''
 voidflags='15'
 xlibpth=''
@@ -725,7 +729,7 @@ config_arg10=''
 config_arg11=''
 PERL_REVISION=5
 PERL_VERSION=6
-PERL_SUBVERSION=0
+PERL_SUBVERSION=1
 PERL_API_REVISION=5
 PERL_API_VERSION=6
 PERL_API_SUBVERSION=0
index 7ffd73f..5d29754 100644 (file)
@@ -2,13 +2,16 @@ case `uname -r` in
 6.1*) shellflags="-m+65536" ;;
 esac
 case "$optimize" in
-'') optimize="-O1" ;;
+'') optimize="-h nofastmd" ;; # fastmd: integer values limited to 46 bits
+esac
+case `uname -r` in
+10.*) pp_ctl_cflags='optimize="$optimize -h scalar 0 -h vector 0"' ;;
 esac
 d_setregid='undef'
 d_setreuid='undef'
 case "$usemymalloc" in
-'') # The perl malloc.c SHOULD work says Ilya.
-    # But for the time being (5.004_68), alas, it doesn't.
+'') # The perl malloc.c SHOULD work in Unicos (ILP64) says Ilya.
+    # But for the time being (5.004_68), alas, it doesn't. --jhi
     # usemymalloc='y'
     # ccflags="$ccflags -DNO_RCHECK"
     usemymalloc='n'
index 1a47f4a..b13ab77 100644 (file)
@@ -13,7 +13,7 @@ use strict;
 
 our($VERSION, @ISA, @EXPORT, %EXPORT_TAGS);
 
-my ( $i, $ip2, %logn );
+my ( $i, %logn );
 
 $VERSION = sprintf("%s", q$Id: Complex.pm,v 1.26 1998/11/01 00:00:00 dsl Exp $ =~ /(\d+\.\d+)/);
 
@@ -49,6 +49,7 @@ use overload
        '*'     => \&multiply,
        '/'     => \&divide,
        '**'    => \&power,
+       '=='    => \&numeq,
        '<=>'   => \&spaceship,
        'neg'   => \&negate,
        '~'     => \&conjugate,
@@ -71,6 +72,9 @@ my %DISPLAY_FORMAT = ('style' => 'cartesian',
                      'polar_pretty_print' => 1);
 my $eps            = 1e-14;            # Epsilon
 
+my $Inf                   = CORE::exp(CORE::exp(30));
+$Inf = "Inf" if !defined $Inf || !$Inf > 0;
+
 #
 # Object attributes (internal):
 #      cartesian       [real, imaginary] -- cartesian form
@@ -228,6 +232,13 @@ sub i () {
 }
 
 #
+# ip2
+#
+# Half of i.
+#
+sub ip2 () { i / 2 }
+
+#
 # Attribute access/set routines
 #
 
@@ -262,7 +273,8 @@ sub update_polar {
        my ($x, $y) = @{$self->{'cartesian'}};
        $self->{p_dirty} = 0;
        return $self->{'polar'} = [0, 0] if $x == 0 && $y == 0;
-       return $self->{'polar'} = [CORE::sqrt($x*$x + $y*$y), CORE::atan2($y, $x)];
+       return $self->{'polar'} = [CORE::sqrt($x*$x + $y*$y),
+                                  CORE::atan2($y, $x)];
 }
 
 #
@@ -342,7 +354,7 @@ sub _divbyzero {
 
     if (defined $_[1]) {
        $mess .= "(Because in the definition of $_[0], the divisor ";
-       $mess .= "$_[1] " unless ($_[1] eq '0');
+       $mess .= "$_[1] " unless ("$_[1]" eq '0');
        $mess .= "is 0)\n";
     }
 
@@ -416,8 +428,8 @@ sub power {
            return 1 if $z2 == 0 || $z1 == 1;
            return 0 if $z1 == 0 && Re($z2) > 0;
        }
-       my $w = $inverted ? CORE::exp($z1 * CORE::log($z2))
-                         : CORE::exp($z2 * CORE::log($z1));
+       my $w = $inverted ? &exp($z1 * &log($z2))
+                         : &exp($z2 * &log($z1));
        # If both arguments cartesian, return cartesian, else polar.
        return $z1->{c_dirty} == 0 &&
               (not ref $z2 or $z2->{c_dirty} == 0) ?
@@ -440,6 +452,19 @@ sub spaceship {
 }
 
 #
+# (numeq)
+#
+# Computes z1 == z2.
+#
+# (Required in addition to spaceship() because of NaNs.)
+sub numeq {
+       my ($z1, $z2, $inverted) = @_;
+       my ($re1, $im1) = ref $z1 ? @{$z1->cartesian} : ($z1, 0);
+       my ($re2, $im2) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
+       return $re1 == $re2 && $im1 == $im2 ? 1 : 0;
+}
+
+#
 # (negate)
 #
 # Computes -z.
@@ -477,7 +502,13 @@ sub conjugate {
 #
 sub abs {
        my ($z, $rho) = @_;
-       return $z unless ref $z;
+       unless (ref $z) {
+           if (@_ == 2) {
+               $_[0] = $_[1];
+           } else {
+               return CORE::abs($z);
+           }
+       }
        if (defined $rho) {
            $z->{'polar'} = [ $rho, ${$z->polar}[1] ];
            $z->{p_dirty} = 0;
@@ -533,7 +564,8 @@ sub arg {
 sub sqrt {
        my ($z) = @_;
        my ($re, $im) = ref $z ? @{$z->cartesian} : ($z, 0);
-       return $re < 0 ? cplx(0, CORE::sqrt(-$re)) : CORE::sqrt($re) if $im == 0;
+       return $re < 0 ? cplx(0, CORE::sqrt(-$re)) : CORE::sqrt($re)
+           if $im == 0;
        my ($r, $t) = @{$z->polar};
        return (ref $z)->emake(CORE::sqrt($r), $t/2);
 }
@@ -547,9 +579,12 @@ sub sqrt {
 #
 sub cbrt {
        my ($z) = @_;
-       return $z < 0 ? -CORE::exp(CORE::log(-$z)/3) : ($z > 0 ? CORE::exp(CORE::log($z)/3): 0)
+       return $z < 0 ?
+           -CORE::exp(CORE::log(-$z)/3) :
+               ($z > 0 ? CORE::exp(CORE::log($z)/3): 0)
            unless ref $z;
        my ($r, $t) = @{$z->polar};
+       return 0 if $r == 0;
        return (ref $z)->emake(CORE::exp(CORE::log($r)/3), $t/3);
 }
 
@@ -559,7 +594,7 @@ sub cbrt {
 # Die on bad root.
 #
 sub _rootbad {
-    my $mess = "Root $_[0] not defined, root must be positive integer.\n";
+    my $mess = "Root $_[0] illegal, root rank must be positive integer.\n";
 
     my @up = caller(1);
 
@@ -581,7 +616,8 @@ sub _rootbad {
 sub root {
        my ($z, $n) = @_;
        _rootbad($n) if ($n < 1 or int($n) != $n);
-       my ($r, $t) = ref $z ? @{$z->polar} : (CORE::abs($z), $z >= 0 ? 0 : pi);
+       my ($r, $t) = ref $z ?
+           @{$z->polar} : (CORE::abs($z), $z >= 0 ? 0 : pi);
        my @root;
        my $k;
        my $theta_inc = pit2 / $n;
@@ -725,7 +761,7 @@ sub logn {
        $z = cplx($z, 0) unless ref $z;
        my $logn = $logn{$n};
        $logn = $logn{$n} = CORE::log($n) unless defined $logn; # Cache log(n)
-       return CORE::log($z) / $logn;
+       return &log($z) / $logn;
 }
 
 #
@@ -735,11 +771,14 @@ sub logn {
 #
 sub cos {
        my ($z) = @_;
+       return CORE::cos($z) unless ref $z;
        my ($x, $y) = @{$z->cartesian};
        my $ey = CORE::exp($y);
-       my $ey_1 = 1 / $ey;
-       return (ref $z)->make(CORE::cos($x) * ($ey + $ey_1)/2,
-                             CORE::sin($x) * ($ey_1 - $ey)/2);
+       my $sx = CORE::sin($x);
+       my $cx = CORE::cos($x);
+       my $ey_1 = $ey ? 1 / $ey : $Inf;
+       return (ref $z)->make($cx * ($ey + $ey_1)/2,
+                             $sx * ($ey_1 - $ey)/2);
 }
 
 #
@@ -749,11 +788,14 @@ sub cos {
 #
 sub sin {
        my ($z) = @_;
+       return CORE::sin($z) unless ref $z;
        my ($x, $y) = @{$z->cartesian};
        my $ey = CORE::exp($y);
-       my $ey_1 = 1 / $ey;
-       return (ref $z)->make(CORE::sin($x) * ($ey + $ey_1)/2,
-                             CORE::cos($x) * ($ey - $ey_1)/2);
+       my $sx = CORE::sin($x);
+       my $cx = CORE::cos($x);
+       my $ey_1 = $ey ? 1 / $ey : $Inf;
+       return (ref $z)->make($sx * ($ey + $ey_1)/2,
+                             $cx * ($ey - $ey_1)/2);
 }
 
 #
@@ -763,9 +805,9 @@ sub sin {
 #
 sub tan {
        my ($z) = @_;
-       my $cz = CORE::cos($z);
-       _divbyzero "tan($z)", "cos($z)" if (CORE::abs($cz) < $eps);
-       return CORE::sin($z) / $cz;
+       my $cz = &cos($z);
+       _divbyzero "tan($z)", "cos($z)" if $cz == 0;
+       return &sin($z) / $cz;
 }
 
 #
@@ -775,7 +817,7 @@ sub tan {
 #
 sub sec {
        my ($z) = @_;
-       my $cz = CORE::cos($z);
+       my $cz = &cos($z);
        _divbyzero "sec($z)", "cos($z)" if ($cz == 0);
        return 1 / $cz;
 }
@@ -787,7 +829,7 @@ sub sec {
 #
 sub csc {
        my ($z) = @_;
-       my $sz = CORE::sin($z);
+       my $sz = &sin($z);
        _divbyzero "csc($z)", "sin($z)" if ($sz == 0);
        return 1 / $sz;
 }
@@ -806,9 +848,9 @@ sub cosec { Math::Complex::csc(@_) }
 #
 sub cot {
        my ($z) = @_;
-       my $sz = CORE::sin($z);
+       my $sz = &sin($z);
        _divbyzero "cot($z)", "sin($z)" if ($sz == 0);
-       return CORE::cos($z) / $sz;
+       return &cos($z) / $sz;
 }
 
 #
@@ -825,8 +867,10 @@ sub cotan { Math::Complex::cot(@_) }
 #
 sub acos {
        my $z = $_[0];
-       return CORE::atan2(CORE::sqrt(1-$z*$z), $z) if (! ref $z) && CORE::abs($z) <= 1;
+       return CORE::atan2(CORE::sqrt(1-$z*$z), $z)
+           if (! ref $z) && CORE::abs($z) <= 1;
        my ($x, $y) = ref $z ? @{$z->cartesian} : ($z, 0);
+       return 0 if $x == 1 && $y == 0;
        my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y);
        my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y);
        my $alpha = ($t1 + $t2)/2;
@@ -847,8 +891,10 @@ sub acos {
 #
 sub asin {
        my $z = $_[0];
-       return CORE::atan2($z, CORE::sqrt(1-$z*$z)) if (! ref $z) && CORE::abs($z) <= 1;
+       return CORE::atan2($z, CORE::sqrt(1-$z*$z))
+           if (! ref $z) && CORE::abs($z) <= 1;
        my ($x, $y) = ref $z ? @{$z->cartesian} : ($z, 0);
+       return 0 if $x == 0 && $y == 0;
        my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y);
        my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y);
        my $alpha = ($t1 + $t2)/2;
@@ -870,11 +916,12 @@ sub asin {
 sub atan {
        my ($z) = @_;
        return CORE::atan2($z, 1) unless ref $z;
+       my ($x, $y) = ref $z ? @{$z->cartesian} : ($z, 0);
+       return 0 if $x == 0 && $y == 0;
        _divbyzero "atan(i)"  if ( $z == i);
-       _divbyzero "atan(-i)" if (-$z == i);
-       my $log = CORE::log((i + $z) / (i - $z));
-       $ip2 = 0.5 * i unless defined $ip2;
-       return $ip2 * $log;
+       _logofzero "atan(-i)" if (-$z == i); # -i is a bad file test...
+       my $log = &log((i + $z) / (i - $z));
+       return ip2 * $log;
 }
 
 #
@@ -913,10 +960,11 @@ sub acosec { Math::Complex::acsc(@_) }
 #
 sub acot {
        my ($z) = @_;
-       _divbyzero "acot(0)"  if (CORE::abs($z)     < $eps);
-       return ($z >= 0) ? CORE::atan2(1, $z) : CORE::atan2(-1, -$z) unless ref $z;
-       _divbyzero "acot(i)"  if (CORE::abs($z - i) < $eps);
-       _logofzero "acot(-i)" if (CORE::abs($z + i) < $eps);
+       _divbyzero "acot(0)"  if $z == 0;
+       return ($z >= 0) ? CORE::atan2(1, $z) : CORE::atan2(-1, -$z)
+           unless ref $z;
+       _divbyzero "acot(i)"  if ($z - i == 0);
+       _logofzero "acot(-i)" if ($z + i == 0);
        return atan(1 / $z);
 }
 
@@ -937,11 +985,13 @@ sub cosh {
        my $ex;
        unless (ref $z) {
            $ex = CORE::exp($z);
-           return ($ex + 1/$ex)/2;
+           return $ex ? ($ex + 1/$ex)/2 : $Inf;
        }
        my ($x, $y) = @{$z->cartesian};
+       my $cy = CORE::cos($y);
+       my $sy = CORE::cos($y);
        $ex = CORE::exp($x);
-       my $ex_1 = 1 / $ex;
+       my $ex_1 = $ex ? 1 / $ex : $Inf;
        return (ref $z)->make(CORE::cos($y) * ($ex + $ex_1)/2,
                              CORE::sin($y) * ($ex - $ex_1)/2);
 }
@@ -955,14 +1005,17 @@ sub sinh {
        my ($z) = @_;
        my $ex;
        unless (ref $z) {
+           return 0 if $z == 0;
            $ex = CORE::exp($z);
-           return ($ex - 1/$ex)/2;
+           return $ex ? ($ex - 1/$ex)/2 : "-$Inf";
        }
        my ($x, $y) = @{$z->cartesian};
+       my $cy = CORE::cos($y);
+       my $sy = CORE::sin($y);
        $ex = CORE::exp($x);
-       my $ex_1 = 1 / $ex;
-       return (ref $z)->make(CORE::cos($y) * ($ex - $ex_1)/2,
-                             CORE::sin($y) * ($ex + $ex_1)/2);
+       my $ex_1 = $ex ? 1 / $ex : $Inf;
+       return (ref $z)->make($cy * ($ex - $ex_1)/2,
+                             $sy * ($ex + $ex_1)/2);
 }
 
 #
@@ -1016,7 +1069,7 @@ sub cosech { Math::Complex::csch(@_) }
 sub coth {
        my ($z) = @_;
        my $sz = sinh($z);
-       _divbyzero "coth($z)", "sinh($z)" if ($sz == 0);
+       _divbyzero "coth($z)", "sinh($z)" if $sz == 0;
        return cosh($z) / $sz;
 }
 
@@ -1035,25 +1088,37 @@ sub cotanh { Math::Complex::coth(@_) }
 sub acosh {
        my ($z) = @_;
        unless (ref $z) {
-           return CORE::log($z + CORE::sqrt($z*$z-1)) if $z >= 1;
            $z = cplx($z, 0);
        }
        my ($re, $im) = @{$z->cartesian};
        if ($im == 0) {
-           return cplx(CORE::log($re + CORE::sqrt($re*$re - 1)), 0) if $re >= 1;
-           return cplx(0, CORE::atan2(CORE::sqrt(1-$re*$re), $re)) if CORE::abs($re) <= 1;
+           return CORE::log($re + CORE::sqrt($re*$re - 1))
+               if $re >= 1;
+           return cplx(0, CORE::atan2(CORE::sqrt(1 - $re*$re), $re))
+               if CORE::abs($re) < 1;
        }
-       return CORE::log($z + CORE::sqrt($z*$z - 1));
+       my $s = &sqrt($z*$z - 1);
+       my $t = $z + $s;
+       $t = 1/(2*$s) if $t == 0 || $t && &abs(cosh(&log($t)) - $z) > $eps;
+       return &log($t);
 }
 
 #
 # asinh
 #
-# Computes the arc hyperbolic sine asinh(z) = log(z + sqrt(z*z-1))
+# Computes the arc hyperbolic sine asinh(z) = log(z + sqrt(z*z+1))
 #
 sub asinh {
        my ($z) = @_;
-       return CORE::log($z + CORE::sqrt($z*$z + 1));
+       unless (ref $z) {
+           my $t = $z + CORE::sqrt($z*$z + 1);
+           return CORE::log($t) if $t;
+       }
+       my $s = &sqrt($z*$z + 1);
+       my $t = $z + $s;
+       # Try Taylor series if looking bad.
+       $t = 1/(2*$s) if $t == 0 || $t && &abs(sinh(&log($t)) - $z) > $eps;
+       return &log($t);
 }
 
 #
@@ -1067,9 +1132,9 @@ sub atanh {
            return CORE::log((1 + $z)/(1 - $z))/2 if CORE::abs($z) < 1;
            $z = cplx($z, 0);
        }
-       _divbyzero 'atanh(1)',  "1 - $z" if ($z ==  1);
-       _logofzero 'atanh(-1)'           if ($z == -1);
-       return 0.5 * CORE::log((1 + $z) / (1 - $z));
+       _divbyzero 'atanh(1)',  "1 - $z" if (1 - $z == 0);
+       _logofzero 'atanh(-1)'           if (1 + $z == 0);
+       return 0.5 * &log((1 + $z) / (1 - $z));
 }
 
 #
@@ -1079,7 +1144,7 @@ sub atanh {
 #
 sub asech {
        my ($z) = @_;
-       _divbyzero 'asech(0)', $z if ($z == 0);
+       _divbyzero 'asech(0)', "$z" if ($z == 0);
        return acosh(1 / $z);
 }
 
@@ -1108,14 +1173,14 @@ sub acosech { Math::Complex::acsch(@_) }
 #
 sub acoth {
        my ($z) = @_;
-       _divbyzero 'acoth(0)'            if (CORE::abs($z)     < $eps);
+       _divbyzero 'acoth(0)'            if ($z == 0);
        unless (ref $z) {
            return CORE::log(($z + 1)/($z - 1))/2 if CORE::abs($z) > 1;
            $z = cplx($z, 0);
        }
-       _divbyzero 'acoth(1)',  "$z - 1" if (CORE::abs($z - 1) < $eps);
-       _logofzero 'acoth(-1)', "1 / $z" if (CORE::abs($z + 1) < $eps);
-       return CORE::log((1 + $z) / ($z - 1)) / 2;
+       _divbyzero 'acoth(1)',  "$z - 1" if ($z - 1 == 0);
+       _logofzero 'acoth(-1)', "1 + $z" if (1 + $z == 0);
+       return &log((1 + $z) / ($z - 1)) / 2;
 }
 
 #
@@ -1141,8 +1206,8 @@ sub atan2 {
            ($re2, $im2) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
        }
        if ($im2 == 0) {
-           return cplx(CORE::atan2($re1, $re2), 0) if $im1 == 0;
-           return cplx(($im1<=>0) * pip2, 0) if $re2 == 0;
+           return CORE::atan2($re1, $re2) if $im1 == 0;
+           return ($im1<=>0) * pip2 if $re2 == 0;
        }
        my $w = atan($z1/$z2);
        my ($u, $v) = ref $w ? @{$w->cartesian} : ($w, 0);
@@ -1235,67 +1300,57 @@ sub stringify_cartesian {
        my ($x, $y) = @{$z->cartesian};
        my ($re, $im);
 
-       $x = int($x + ($x < 0 ? -1 : 1) * $eps)
-               if int(CORE::abs($x)) != int(CORE::abs($x) + $eps);
-       $y = int($y + ($y < 0 ? -1 : 1) * $eps)
-               if int(CORE::abs($y)) != int(CORE::abs($y) + $eps);
-
-       $re = "$x" if CORE::abs($x) >= $eps;
-
        my %format = $z->display_format;
        my $format = $format{format};
 
-       if ($y == 1)                           { $im = 'i' }
-       elsif ($y == -1)                       { $im = '-i' }
-       elsif (CORE::abs($y) >= $eps) {
-           $im = (defined $format ? sprintf($format, $y) : $y) . "i";
+       if ($x) {
+           if ($x =~ /^NaN[QS]?$/i) {
+               $re = $x;
+           } else {
+               if ($x =~ /^-?$Inf$/oi) {
+                   $re = $x;
+               } else {
+                   $re = defined $format ? sprintf($format, $x) : $x;
+               }
+           }
+       } else {
+           undef $re;
+       }
+
+       if ($y) {
+           if ($y == 1)     { $im = ""  }
+           elsif ($y == -1) { $im = "-" }
+           elsif ($y =~ /^(NaN[QS]?)$/i) {
+               $im = $y;
+           } else {
+               if ($y =~ /^-?$Inf$/oi) {
+                   $im = $y;
+               } else {
+                   $im = defined $format ? sprintf($format, $y) : $y;
+               }
+           }
+           $im .= "i";
+       } else {
+           undef $im;
        }
 
-       my $str = '';
-       $str = defined $format ? sprintf($format, $re) : $re
-           if defined $re;
+       my $str = $re;
+
        if (defined $im) {
            if ($y < 0) {
                $str .= $im;
-           } elsif ($y > 0)  {
+           } elsif ($y > 0 || $im =~ /^NaN[QS]?i$/i)  {
                $str .= "+" if defined $re;
                $str .= $im;
            }
+       } elsif (!defined $re) {
+           $str = "0";
        }
 
        return $str;
 }
 
 
-# Helper for stringify_polar, a Greatest Common Divisor with a memory.
-
-sub _gcd {
-    my ($a, $b) = @_;
-
-    use integer;
-
-    # Loops forever if given negative inputs.
-
-    if    ($b and $a > $b) { return gcd($a % $b, $b) }
-    elsif ($a and $b > $a) { return gcd($b % $a, $a) }
-    else                   { return $a ? $a : $b     }
-}
-
-my %gcd;
-
-sub gcd {
-    my ($a, $b) = @_;
-
-    my $id = "$a $b";
-
-    unless (exists $gcd{$id}) {
-       $gcd{$id} = _gcd($a, $b);
-       $gcd{"$b $a"} = $gcd{$id};
-    }
-
-    return $gcd{$id};
-}
-
 #
 # ->stringify_polar
 #
@@ -1306,68 +1361,45 @@ sub stringify_polar {
        my ($r, $t) = @{$z->polar};
        my $theta;
 
-       return '[0,0]' if $r <= $eps;
-
        my %format = $z->display_format;
+       my $format = $format{format};
 
-       my $nt = $t / pit2;
-       $nt = ($nt - int($nt)) * pit2;
-       $nt += pit2 if $nt < 0;                 # Range [0, 2pi]
-
-       if (CORE::abs($nt) <= $eps)             { $theta = 0 }
-       elsif (CORE::abs(pi-$nt) <= $eps)       { $theta = 'pi' }
-
-       if (defined $theta) {
-               $r = int($r + ($r < 0 ? -1 : 1) * $eps)
-                       if int(CORE::abs($r)) != int(CORE::abs($r) + $eps);
-               $theta = int($theta + ($theta < 0 ? -1 : 1) * $eps)
-                       if ($theta ne 'pi' and
-                           int(CORE::abs($theta)) != int(CORE::abs($theta) + $eps));
-               return "\[$r,$theta\]";
+       if ($t =~ /^NaN[QS]?$/i || $t =~ /^-?$Inf$/oi) {
+           $theta = $t; 
+       } elsif ($t == pi) {
+           $theta = "pi";
+       } elsif ($r == 0 || $t == 0) {
+           $theta = defined $format ? sprintf($format, $t) : $t;
        }
 
+       return "[$r,$theta]" if defined $theta;
+
        #
-       # Okay, number is not a real. Try to identify pi/n and friends...
+       # Try to identify pi/n and friends.
        #
 
-       $nt -= pit2 if $nt > pi;
-
-       if ($format{polar_pretty_print} && CORE::abs($nt) >= deg1) {
-           my ($n, $k, $kpi);
-
-           for ($k = 1, $kpi = pi; $k < 10; $k++, $kpi += pi) {
-               $n = int($kpi / $nt + ($nt > 0 ? 1 : -1) * 0.5);
-               if (CORE::abs($kpi/$n - $nt) <= $eps) {
-                   $n = CORE::abs($n);
-                   my $gcd = gcd($k, $n);
-                   if ($gcd > 1) {
-                       $k /= $gcd;
-                       $n /= $gcd;
-                   }
-                   next if $n > 360;
-                   $theta = ($nt < 0 ? '-':'').
-                            ($k == 1 ? 'pi':"${k}pi");
-                   $theta .= '/'.$n if $n > 1;
+       $t -= int(CORE::abs($t) / pit2) * pit2;
+
+       if ($format{polar_pretty_print}) {
+           my ($a, $b);
+           for $a (2, 3, 4, 6, 8, 12, 16, 24, 30, 32, 36, 48, 60, 64, 72) {
+               $b = $t * $a / pi;
+               if (int($b) == $b) {
+                   $b = $b < 0 ? "-" : "" if CORE::abs($b) == 1;
+                   $theta = "${b}pi/$a";
                    last;
                }
            }
        }
 
-       $theta = $nt unless defined $theta;
-
-       $r = int($r + ($r < 0 ? -1 : 1) * $eps)
-               if int(CORE::abs($r)) != int(CORE::abs($r) + $eps);
-       $theta = int($theta + ($theta < 0 ? -1 : 1) * $eps)
-               if ($theta !~ m(^-?\d*pi/\d+$) and
-                   int(CORE::abs($theta)) != int(CORE::abs($theta) + $eps));
-
-       my $format = $format{format};
         if (defined $format) {
            $r     = sprintf($format, $r);
-           $theta = sprintf($format, $theta);
+           $theta = sprintf($format, $theta) unless defined $theta;
+       } else {
+           $theta = $t unless defined $theta;
        }
 
-       return "\[$r,$theta\]";
+       return "[$r,$theta]";
 }
 
 1;
diff --git a/perl.c b/perl.c
index c4bd075..e7a9bc2 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -2611,72 +2611,85 @@ S_fd_on_nosuid_fs(pTHX_ int fd)
  * an irrelevant filesystem while trying to reach the right one.
  */
 
-#   ifdef HAS_FSTATVFS
+#undef FD_ON_NOSUID_CHECK_OKAY  /* found the syscalls to do the check? */
+
+#   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
+        defined(HAS_FSTATVFS)
+#   define FD_ON_NOSUID_CHECK_OKAY
     struct statvfs stfs;
+
     check_okay = fstatvfs(fd, &stfs) == 0;
     on_nosuid  = check_okay && (stfs.f_flag  & ST_NOSUID);
-#   else
-#       ifdef PERL_MOUNT_NOSUID
-#           if defined(HAS_FSTATFS) && \
-              defined(HAS_STRUCT_STATFS) && \
-              defined(HAS_STRUCT_STATFS_F_FLAGS)
+#   endif /* fstatvfs */
+#   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
+        defined(PERL_MOUNT_NOSUID)     && \
+        defined(HAS_FSTATFS)           && \
+        defined(HAS_STRUCT_STATFS)     && \
+        defined(HAS_STRUCT_STATFS_F_FLAGS)
+#   define FD_ON_NOSUID_CHECK_OKAY
     struct statfs  stfs;
+
     check_okay = fstatfs(fd, &stfs)  == 0;
     on_nosuid  = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID);
-#           else
-#               if defined(HAS_FSTAT) && \
-                  defined(HAS_USTAT) && \
-                  defined(HAS_GETMNT) && \
-                  defined(HAS_STRUCT_FS_DATA) && \
-                  defined(NOSTAT_ONE)
+#   endif /* fstatfs */
+
+#   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
+        defined(PERL_MOUNT_NOSUID)     && \
+        defined(HAS_FSTAT)             && \
+        defined(HAS_USTAT)             && \
+        defined(HAS_GETMNT)            && \
+        defined(HAS_STRUCT_FS_DATA)    && \
+        defined(NOSTAT_ONE)
+#   define FD_ON_NOSUID_CHECK_OKAY
     struct stat fdst;
+
     if (fstat(fd, &fdst) == 0) {
-       struct ustat us;
-       if (ustat(fdst.st_dev, &us) == 0) {
-           struct fs_data fsd;
-           /* NOSTAT_ONE here because we're not examining fields which
-            * vary between that case and STAT_ONE. */
+        struct ustat us;
+        if (ustat(fdst.st_dev, &us) == 0) {
+            struct fs_data fsd;
+            /* NOSTAT_ONE here because we're not examining fields which
+             * vary between that case and STAT_ONE. */
             if (getmnt((int*)0, &fsd, (int)0, NOSTAT_ONE, us.f_fname) == 0) {
-               size_t cmplen = sizeof(us.f_fname);
-               if (sizeof(fsd.fd_req.path) < cmplen)
-                   cmplen = sizeof(fsd.fd_req.path);
-               if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
-                   fdst.st_dev == fsd.fd_req.dev) {
-                       check_okay = 1;
-                       on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
-                   }
-               }
-           }
-       }
-    }
-#               endif /* fstat+ustat+getmnt */
-#           endif /* fstatfs */
-#       else
-#           if defined(HAS_GETMNTENT) && \
-              defined(HAS_HASMNTOPT) && \
-              defined(MNTOPT_NOSUID)
-    FILE               *mtab = fopen("/etc/mtab", "r");
-    struct mntent      *entry;
-    struct stat                stb, fsb;
+                size_t cmplen = sizeof(us.f_fname);
+                if (sizeof(fsd.fd_req.path) < cmplen)
+                    cmplen = sizeof(fsd.fd_req.path);
+                if (strnEQ(fsd.fd_req.path, us.f_fname, cmplen) &&
+                    fdst.st_dev == fsd.fd_req.dev) {
+                        check_okay = 1;
+                        on_nosuid = fsd.fd_req.flags & PERL_MOUNT_NOSUID;
+                    }
+                }
+            }
+        }
+    }
+#   endif /* fstat+ustat+getmnt */
+
+#   if !defined(FD_ON_NOSUID_CHECK_OKAY) && \
+        defined(HAS_GETMNTENT)         && \
+        defined(HAS_HASMNTOPT)         && \
+        defined(MNTOPT_NOSUID)
+#   define FD_ON_NOSUID_CHECK_OKAY
+    FILE                *mtab = fopen("/etc/mtab", "r");
+    struct mntent       *entry;
+    struct stat         stb, fsb;
 
     if (mtab && (fstat(fd, &stb) == 0)) {
-       while (entry = getmntent(mtab)) {
-           if (stat(entry->mnt_dir, &fsb) == 0
-               && fsb.st_dev == stb.st_dev)
-           {
-               /* found the filesystem */
-               check_okay = 1;
-               if (hasmntopt(entry, MNTOPT_NOSUID))
-                   on_nosuid = 1;
-               break;
-           } /* A single fs may well fail its stat(). */
-       }
+        while (entry = getmntent(mtab)) {
+            if (stat(entry->mnt_dir, &fsb) == 0
+                && fsb.st_dev == stb.st_dev)
+            {
+                /* found the filesystem */
+                check_okay = 1;
+                if (hasmntopt(entry, MNTOPT_NOSUID))
+                    on_nosuid = 1;
+                break;
+            } /* A single fs may well fail its stat(). */
+        }
     }
     if (mtab)
-       fclose(mtab);
-#           endif /* getmntent+hasmntopt */
-#       endif /* PERL_MOUNT_NOSUID: fstatfs or fstat+ustat+statfs */
-#   endif /* statvfs */
+        fclose(mtab);
+#   endif /* getmntent+hasmntopt */
 
     if (!check_okay) 
        Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid", PL_origfilename);
diff --git a/perl.h b/perl.h
index 2f30218..2f5a560 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -1145,15 +1145,6 @@ typedef NVTYPE NV;
 #   endif
 #   define NV_DIG LDBL_DIG
 #   ifdef HAS_SQRTL
-        /* libsunmath doesn't have modfl and frexpl as of mid-March 2000 */
-       /* XXX Configure probe for modfl and frexpl needed XXX */
-#       if defined(__sun) && defined(__svr4)
-#           define Perl_modf(x,y) ((long double)modf((double)(x),(double*)(y)))
-#           define Perl_frexp(x) ((long double)frexp((double)(x)))
-#       else
-#           define Perl_modf modfl
-#           define Perl_frexp frexpl
-#       endif
 #       define Perl_cos cosl
 #       define Perl_sin sinl
 #       define Perl_sqrt sqrtl
@@ -1164,10 +1155,28 @@ typedef NVTYPE NV;
 #       define Perl_floor floorl
 #       define Perl_fmod fmodl
 #   endif
+/* e.g. libsunmath doesn't have modfl and frexpl as of mid-March 2000 */
+#   ifdef HAS_MODFL
+#       define Perl_modf(x,y) modfl(x,y)
+#   else
+#       define Perl_modf(x,y) ((long double)modf((double)(x),(double*)(y)))
+#   endif
+#   ifdef HAS_FREXPL
+#       define Perl_frexp(x,y) frexpl(x,y)
+#   else
+#       define Perl_frexp(x,y) ((long double)frexp((double)(x),y))
+#   endif
+#   ifdef HAS_ISNANL
+#       define Perl_isnan(x) isnanl(x)
+#   else
+#       ifdef HAS_ISNAN
+#           define Perl_isnan(x) isnan((double)(x))
+#       else
+#           define Perl_isnan(x) ((x)!=(x))
+#       endif
+#   endif
 #else
 #   define NV_DIG DBL_DIG
-#   define Perl_modf modf
-#   define Perl_frexp frexp
 #   define Perl_cos cos
 #   define Perl_sin sin
 #   define Perl_sqrt sqrt
@@ -1177,6 +1186,13 @@ typedef NVTYPE NV;
 #   define Perl_pow pow
 #   define Perl_floor floor
 #   define Perl_fmod fmod
+#   define Perl_modf(x,y) modf(x,y)
+#   define Perl_frexp(x,y) frexp(x,y)
+#   ifdef HAS_ISNAN
+#       define Perl_isnan(x) isnan(x)
+#   else
+#       define Perl_isnan(x) ((x)!=(x))
+#   endif
 #endif
 
 #if !defined(Perl_atof) && defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
index d847c99..174cf00 100644 (file)
@@ -1225,6 +1225,12 @@ SEARCHLIST is delimited by bracketing quotes, the REPLACEMENTLIST has
 its own pair of quotes, which may or may not be bracketing quotes,
 e.g., C<tr[A-Z][a-z]> or C<tr(+\-*/)/ABCD/>.
 
+Note that C<tr> does B<not> do regular expression character classes
+such as C<\d> or C<[:lower:]>.  The <tr> operator is not equivalent to
+the tr(1) utility.  If you want to map strings between lower/upper
+cases, see L<perlfunc/lc> and L<perlfunc/uc>, and in general consider
+using the C<s> operator if you need regular expressions.
+
 Note also that the whole range idea is rather unportable between
 character sets--and even within character sets they may cause results
 you probably didn't expect.  A sound principle is to use only ranges
diff --git a/pp.c b/pp.c
index a59664e..e90b538 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -1199,15 +1199,8 @@ PP(pp_ncmp)
     {
       dPOPTOPnnrl;
       I32 value;
-#ifdef __osf__ /* XXX Configure probe for isnan and isnanl needed XXX */
-#if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
-#define Perl_isnan isnanl
-#else
-#define Perl_isnan isnan
-#endif
-#endif
 
-#ifdef __osf__ /* XXX fix in 5.6.1 --jhi */
+#ifdef Perl_isnan
       if (Perl_isnan(left) || Perl_isnan(right)) {
          SETs(&PL_sv_undef);
          RETURN;
@@ -4743,10 +4736,14 @@ PP(pp_pack)
                    DIE(aTHX_ "Cannot compress negative numbers");
 
                if (
-#ifdef CXUX_BROKEN_CONSTANT_CONVERT
-                   adouble <= UV_MAX_cxux
+#if UVSIZE > 4 && UVSIZE >= NVSIZE
+                   adouble <= 0xffffffff
 #else
+#   ifdef CXUX_BROKEN_CONSTANT_CONVERT
+                   adouble <= UV_MAX_cxux
+#   else
                    adouble <= UV_MAX
+#   endif
 #endif
                    )
                {
index 00de34a..f9f6052 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -198,7 +198,6 @@ static char zero_but_true[ZBTLEN + 1] = "0 but true";
 #   if defined(I_SYS_SECURITY)
 #       include <sys/security.h>
 #   endif
-    /* XXX Configure test needed for eaccess */
 #   ifdef ACC_SELF
         /* HP SecureWare */
 #       define PERL_EFF_ACCESS_R_OK(p) (eaccess((p), R_OK, ACC_SELF))
@@ -4086,14 +4085,14 @@ PP(pp_gmtime)
        SV *tsv;
        if (!tmbuf)
            RETPUSHUNDEF;
-       tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %d",
+       tsv = Perl_newSVpvf(aTHX_ "%s %s %2"IVdf" %02"IVdf":%02"IVdf":%02"IVdf" %"IVdf,
                            dayname[tmbuf->tm_wday],
                            monname[tmbuf->tm_mon],
-                           tmbuf->tm_mday,
-                           tmbuf->tm_hour,
-                           tmbuf->tm_min,
-                           tmbuf->tm_sec,
-                           tmbuf->tm_year + 1900);
+                           (IV)tmbuf->tm_mday,
+                           (IV)tmbuf->tm_hour,
+                           (IV)tmbuf->tm_min,
+                           (IV)tmbuf->tm_sec,
+                           (IV)tmbuf->tm_year + 1900);
        PUSHs(sv_2mortal(tsv));
     }
     else if (tmbuf) {
diff --git a/sv.c b/sv.c
index 44ba751..a996471 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -5935,6 +5935,11 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV
            break;
        }
 
+#ifdef USE_64_BIT_INT
+       if (!intsize)
+           intsize = 'q';
+#endif
+
        /* CONVERSION */
 
        switch (c = *q++) {
index a636ff0..7312c09 100755 (executable)
@@ -159,20 +159,18 @@ test_dbz(
         'acsch(0)',
         'asec(0)',
         'asech(0)',
-        'atan(-$i)',
         'atan($i)',
 #       'atanh(-1)',   # Log of zero.
         'atanh(+1)',
         'cot(0)',
         'coth(0)',
         'csc(0)',
-        'tan($pip2)',
         'csch(0)',
-        'tan($pip2)',
        );
 
 test_loz(
         'log($zero)',
+        'atan(-$i)',
         'acot(-$i)',
         'atanh(-1)',
         'acoth(-1)',
@@ -187,7 +185,7 @@ sub test_broot {
        eval 'root(2, $op)';
        (\$bad) = (\$@ =~ /(.+)/);
        print "# $test op = $op badroot? \$bad...\n";
-       print 'not ' unless (\$@ =~ /root must be/);
+       print 'not ' unless (\$@ =~ /root rank must be/);
 EOT
         push(@script, qq(print "ok $test\\n";\n));
     }
index 60f72c3..f59c953 100644 (file)
@@ -10,13 +10,13 @@ BEGIN {
        unshift @INC, '../lib';
 }
 
-# This could use a lot of more tests.
+# This could use many more tests.
 
 # so that using > 0xfffffff constants and
 # 32+ bit integers don't cause noise
 no warnings qw(overflow portable);
 
-print "1..48\n";
+print "1..52\n";
 
 my $q = 12345678901;
 my $r = 23456789012;
@@ -239,4 +239,17 @@ print "ok 47\n";
 print "not " unless (0xf000000000000000 ^ 0xfffffffffffffff0) == 0x0ffffffffffffff0;
 print "ok 48\n";
 
+
+print "not " unless (sprintf "%b", ~0)   eq '1111111111111111111111111111111111111111111111111111111111111111';
+print "ok 49\n";
+
+print "not " unless (sprintf "%64b", ~0) eq '1111111111111111111111111111111111111111111111111111111111111111';
+print "ok 50\n";
+
+print "not " unless (sprintf "%d", ~0>>1) eq '9223372036854775807';
+print "ok 51\n";
+
+print "not " unless (sprintf "%u", ~0)    eq '18446744073709551615';
+print "ok 52\n";
+
 # eof
index 7bcabdf..22a5bc9 100755 (executable)
@@ -39,7 +39,7 @@ print (((1 << ($bits - 1)) == $cusp &&
        do { use integer; 1 << ($bits - 1) } == -$cusp)
        ? "ok 11\n" : "not ok 11\n");
 print ((($cusp >> 1) == ($cusp / 2) &&
-       do { use integer; $cusp >> 1 } == -($cusp / 2))
+       do { use integer; abs($cusp >> 1) } == ($cusp / 2))
        ? "ok 12\n" : "not ok 12\n");
 
 $Aaz = chr(ord("A") & ord("z"));
index 1673b27..ef3be30 100755 (executable)
@@ -59,12 +59,12 @@ $a = ":="; split /($a)/o, "a:=b:=c"; print "@_"
 EXPECT
 a := b := c
 ########
-use integer;
 $cusp = ~0 ^ (~0 >> 1);
+use integer;
 $, = " ";
-print +($cusp - 1) % 8, $cusp % 8, -$cusp % 8, ($cusp + 1) % 8, "!\n";
+print +($cusp - 1) % 8, $cusp % 8, -$cusp % 8, 8 | (($cusp + 1) % 8 + 7), "!\n";
 EXPECT
--1 0 0 1 !
+7 0 0 8 !
 ########
 $foo=undef; $foo->go;
 EXPECT
index 56de278..479d315 100644 (file)
@@ -69,6 +69,7 @@ $ myname = myhostname
 $ IF myname .EQS. "" THEN myname = F$TRNLNM("SYS$NODE")
 $!
 $! ##ADD NEW CONSTANTS HERE##
+$ perl_d_isnan= = "define"
 $ perl_sizesize = "4"
 $ perl_shmattype = ""
 $ perl_mmaptype = ""
@@ -486,6 +487,9 @@ $   perl_d_quad = "define"
 $   perl_quadtype = "long long"
 $   perl_uquadtype = "unsigned long long"
 $   perl_quadkind  = "QUAD_IS_LONG_LONG"
+$   perl_d_frexpl = "define"
+$   perl_d_isnanl = "define"
+$   perl_d_modfl = "define"
 $ ELSE
 $   perl_d_PRIfldbl = "undef"
 $   perl_d_PRIgldbl = "undef"
@@ -503,6 +507,9 @@ $   perl_d_quad = "undef"
 $   perl_quadtype = "long"
 $   perl_uquadtype = "unsigned long"
 $   perl_quadkind  = "QUAD_IS_LONG"
+$   perl_d_frexpl = "undef"
+$   perl_d_isnanl = "undef"
+$   perl_d_modfl = "undef"
 $ ENDIF
 $!
 $! Now some that we build up
@@ -4246,6 +4253,10 @@ $ WC "uvoformat='" + perl_uvoformat + "'"
 $ WC "uvxformat='" + perl_uvxformat + "'"
 $ WC "d_vms_case_sensitive_symbols='" + d_vms_be_case_sensitive + "'"
 $ WC "sizesize='" + perl_sizesize + "'"
+$ WC "d_frexpl='" + perl_d_frexpl + "'"
+$ WC "d_isnan='" + perl_d_isnan + "'"
+$ WC "d_isnanl='" + perl_d_isnanl + "'"
+$ WC "d_modfl='" + perl_d_modfl + "'"
 $!
 $! ##WRITE NEW CONSTANTS HERE##
 $!
index 1352c05..e66c87a 100644 (file)
@@ -65,6 +65,7 @@ $d_flock='undef'
 $d_fork='undef'
 $d_fpathconf='define'
 $d_fpos64_t='undef'
+$d_frexpl='undef'
 $d_fs_data_s='undef'
 $d_fseeko='undef'
 $d_fsetpos='define'
@@ -114,6 +115,8 @@ $d_index='undef'
 $d_inetaton='undef'
 $d_int64_t='undef'
 $d_isascii='define'
+$d_isnan='define'
+$d_isnanl='undef'
 $d_killpg='undef'
 $d_lchown='undef'
 $d_ldbl_dig='define'
@@ -140,6 +143,7 @@ $d_mkstemps='undef'
 $d_mkfifo='define'
 $d_mktime='define'
 $d_mmap='undef'
+$d_modfl='undef'
 $d_mprotect='undef'
 $d_msg='undef'
 $d_msg_ctrunc='undef'
index d77218a..5e4e665 100644 (file)
  */
 #define HAS_FGETPOS    /**/
 
-/* FLEXFILENAMES:
- *     This symbol, if defined, indicates that the system supports filenames
- *     longer than 14 characters.
- */
-#define        FLEXFILENAMES           /**/
-
 /* HAS_FLOCK:
  *     This symbol, if defined, indicates that the flock routine is
  *     available to do file locking.
 #  define STRINGIFY(a) PeRl_StGiFy(a)
 #endif
 #if 42 != 1 && 42 != 42
-#include "Bletch: How does this C preprocessor catenate tokens?"
+#   include "Bletch: How does this C preprocessor catenate tokens?"
 #endif
 
 /* CPPSTDIN:
  */
 /*#define HAS_FD_SET   /**/
 
+/* FLEXFILENAMES:
+ *     This symbol, if defined, indicates that the system supports filenames
+ *     longer than 14 characters.
+ */
+#define        FLEXFILENAMES           /**/
+
 /* HAS_FPOS64_T:
  *     This symbol will be defined if the C compiler supports fpos64_t.
  */
 /*#define      HAS_FPOS64_T            /**/
 
+/* HAS_FREXPL:
+ *     This symbol, if defined, indicates that the frexpl routine is
+ *     available to break a long double floating-point number into
+ *     a normalized fraction and an integral power of 2.
+ */
+/*#define HAS_FREXPL           /**/
+
 /* HAS_STRUCT_FS_DATA:
  *     This symbol, if defined, indicates that the struct fs_data
  *     to do statfs() is supported.
  */
 #define HAS_GETCWD             /**/
 
+/* HAS_GETFSSTAT:
+ *     This symbol, if defined, indicates that the getfsstat routine is
+ *     available to stat filesystems in bulk.
+ */
+/*#define HAS_GETFSSTAT                /**/
+
 /* HAS_GETGRENT:
  *     This symbol, if defined, indicates that the getgrent routine is
  *     available for sequential access of the group database.
  */
 #define HAS_ISASCII            /**/
 
+/* HAS_ISNAN:
+ *     This symbol, if defined, indicates that the isnan routine is
+ *     available to check whether a double is a NaN.
+ */
+#define HAS_ISNAN              /**/
+
+/* HAS_ISNANL:
+ *     This symbol, if defined, indicates that the isnanl routine is
+ *     available to check whether a long double is a NaN.
+ */
+/*#define HAS_ISNANL           /**/
+
 /* HAS_LCHOWN:
  *     This symbol, if defined, indicates that the lchown routine is
  *     available to operate on a symbolic link (instead of following the
 #define LONGLONGSIZE _error_           /**/
 #endif
 
+/* HAS_LSEEK_PROTO:
+ *     This symbol, if defined, indicates that the system provides
+ *     a prototype for the lseek() function.  Otherwise, it is up
+ *     to the program to supply one.  A good guess is
+ *             extern off_t lseek(int, off_t, int);
+ */
+#define        HAS_LSEEK_PROTO /**/
+
 /* HAS_MADVISE:
  *     This symbol, if defined, indicates that the madvise system call is
  *     available to map a file into memory.
  */
 /*#define      I_ICONV         /**/
 
+/* I_IEEEFP:
+ *     This symbol, if defined, indicates that <ieeefp.h> exists and
+ *     should be included.
+ */
+/*#define      I_IEEEFP                /**/
+
 /* I_INTTYPES:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <inttypes.h>.
 /* U64SIZE:
  *     This symbol contains the sizeof(U64).
  */
+/* NVSIZE:
+ *     This symbol contains the sizeof(NV).
+ */
 /* NV_PRESERVES_UV:
  *     This symbol, if defined, indicates that a variable of type NVTYPE
  *     can preserve all the bit of a variable of type UVSIZE.
 #define        I64SIZE         _error_ /**/
 #define        U64SIZE         _error_ /**/
 #endif
+#define        NVSIZE          $nvsize         /**/
 #define        NV_PRESERVES_UV
 
 /* IVdf:
  *     This symbol contains the ~name expanded version of SITEARCH, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-/*#define SITEARCH ""          /**/
-/*#define SITEARCH_EXP ""              /**/
+#define SITEARCH ""            /**/
+#define SITEARCH_EXP ""                /**/
 
 /* SITELIB:
  *     This symbol contains the name of the private library for this package.
  */
 #define Size_t size_t   /* length paramater for string functions */
 
+/* Sock_size_t:
+ *     This symbol holds the type used for the size argument of
+ *     various socket calls (just the base type, not the pointer-to).
+ */
+#define Sock_size_t            int /**/
+
 /* SSize_t:
  *     This symbol holds the type used by functions that return
  *     a count of bytes or an error condition.  It must be a signed type.
 #endif
 /*#define      OLD_PTHREADS_API                /**/
 
+/* PERL_VENDORARCH:
+ *     If defined, this symbol contains the name of a private library.
+ *     The library is private in the sense that it needn't be in anyone's
+ *     execution path, but it should be accessible by the world.
+ *     It may have a ~ on the front. 
+ *     The standard distribution will put nothing in this directory.
+ *     Vendors who distribute perl may wish to place their own
+ *     architecture-dependent modules and extensions in this directory with
+ *             MakeMaker Makefile.PL INSTALLDIRS=vendor 
+ *     or equivalent.  See INSTALL for details.
+ */
 /* PERL_VENDORARCH_EXP:
  *     This symbol contains the ~name expanded version of PERL_VENDORARCH, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
+#define PERL_VENDORARCH ""             /**/
 #define PERL_VENDORARCH_EXP ""         /**/
 
 /* PERL_VENDORLIB_EXP:
 #define PERL_XS_APIVERSION "5.00563"
 #define PERL_PM_APIVERSION "5.00563"
 
-/* HAS_GETFSSTAT:
- *     This symbol, if defined, indicates that the getfsstat routine is
- *     available to stat filesystems in bulk.
- */
-/*#define HAS_GETFSSTAT                /**/
-
-/* I_IEEEFP:
- *     This symbol, if defined, indicates that <ieeefp.h> exists and
- *     should be included.
- */
-/*#define      I_IEEEFP                /**/
-
-/* HAS_LSEEK_PROTO:
- *     This symbol, if defined, indicates that the system provides
- *     a prototype for the lseek() function.  Otherwise, it is up
- *     to the program to supply one.  A good guess is
- *             extern off_t lseek(int, off_t, int);
+/* HAS_MODFL:
+ *     This symbol, if defined, indicates that the modfl routine is
+ *     available to split a long double x into a fractional part f and
+ *     an integer part i such that |f| < 1.0 and (f + i) = x.
  */
-#define        HAS_LSEEK_PROTO /**/
-
-/* Sock_size_t:
- *     This symbol holds the type used for the size argument of
- *     various socket calls (just the base type, not the pointer-to).
- */
-#define Sock_size_t            int /**/
+/*#define HAS_MODFL            /**/
 
 #endif
index b743847..08a1cf5 100755 (executable)
@@ -189,12 +189,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  */
 #$d_fgetpos HAS_FGETPOS        /**/
 
-/* FLEXFILENAMES:
- *     This symbol, if defined, indicates that the system supports filenames
- *     longer than 14 characters.
- */
-#$d_flexfnam   FLEXFILENAMES           /**/
-
 /* HAS_FLOCK:
  *     This symbol, if defined, indicates that the flock routine is
  *     available to do file locking.
@@ -1218,7 +1212,7 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
 #  define STRINGIFY(a) PeRl_StGiFy(a)
 #endif
 #if $cpp_stuff != 1 && $cpp_stuff != 42
-#include "Bletch: How does this C preprocessor catenate tokens?"
+#   include "Bletch: How does this C preprocessor catenate tokens?"
 #endif
 
 /* CPPSTDIN:
@@ -1360,11 +1354,24 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  */
 #$d_fd_set HAS_FD_SET  /**/
 
+/* FLEXFILENAMES:
+ *     This symbol, if defined, indicates that the system supports filenames
+ *     longer than 14 characters.
+ */
+#$d_flexfnam   FLEXFILENAMES           /**/
+
 /* HAS_FPOS64_T:
  *     This symbol will be defined if the C compiler supports fpos64_t.
  */
 #$d_fpos64_t   HAS_FPOS64_T            /**/
 
+/* HAS_FREXPL:
+ *     This symbol, if defined, indicates that the frexpl routine is
+ *     available to break a long double floating-point number into
+ *     a normalized fraction and an integral power of 2.
+ */
+#$d_frexpl HAS_FREXPL          /**/
+
 /* HAS_STRUCT_FS_DATA:
  *     This symbol, if defined, indicates that the struct fs_data
  *     to do statfs() is supported.
@@ -1412,6 +1419,12 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  */
 #$d_getcwd HAS_GETCWD          /**/
 
+/* HAS_GETFSSTAT:
+ *     This symbol, if defined, indicates that the getfsstat routine is
+ *     available to stat filesystems in bulk.
+ */
+#$d_getfsstat HAS_GETFSSTAT            /**/
+
 /* HAS_GETGRENT:
  *     This symbol, if defined, indicates that the getgrent routine is
  *     available for sequential access of the group database.
@@ -1638,6 +1651,18 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  */
 #$d_isascii HAS_ISASCII                /**/
 
+/* HAS_ISNAN:
+ *     This symbol, if defined, indicates that the isnan routine is
+ *     available to check whether a double is a NaN.
+ */
+#$d_isnan HAS_ISNAN            /**/
+
+/* HAS_ISNANL:
+ *     This symbol, if defined, indicates that the isnanl routine is
+ *     available to check whether a long double is a NaN.
+ */
+#$d_isnanl HAS_ISNANL          /**/
+
 /* HAS_LCHOWN:
  *     This symbol, if defined, indicates that the lchown routine is
  *     available to operate on a symbolic link (instead of following the
@@ -1680,6 +1705,14 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
 #define LONGLONGSIZE $longlongsize             /**/
 #endif
 
+/* HAS_LSEEK_PROTO:
+ *     This symbol, if defined, indicates that the system provides
+ *     a prototype for the lseek() function.  Otherwise, it is up
+ *     to the program to supply one.  A good guess is
+ *             extern off_t lseek(int, off_t, int);
+ */
+#$d_lseekproto HAS_LSEEK_PROTO /**/
+
 /* HAS_MADVISE:
  *     This symbol, if defined, indicates that the madvise system call is
  *     available to map a file into memory.
@@ -2280,6 +2313,12 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  */
 #$i_iconv      I_ICONV         /**/
 
+/* I_IEEEFP:
+ *     This symbol, if defined, indicates that <ieeefp.h> exists and
+ *     should be included.
+ */
+#$i_ieeefp     I_IEEEFP                /**/
+
 /* I_INTTYPES:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <inttypes.h>.
@@ -2630,6 +2669,9 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
 /* U64SIZE:
  *     This symbol contains the sizeof(U64).
  */
+/* NVSIZE:
+ *     This symbol contains the sizeof(NV).
+ */
 /* NV_PRESERVES_UV:
  *     This symbol, if defined, indicates that a variable of type NVTYPE
  *     can preserve all the bit of a variable of type UVSIZE.
@@ -2659,6 +2701,7 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
 #define        I64SIZE         $i64size        /**/
 #define        U64SIZE         $u64size        /**/
 #endif
+#define        NVSIZE          $nvsize         /**/
 #$d_nv_preserves_uv    NV_PRESERVES_UV
 
 /* IVdf:
@@ -2798,8 +2841,8 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  *     This symbol contains the ~name expanded version of SITEARCH, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#$d_sitearch SITEARCH "$sitearch"              /**/
-#$d_sitearch SITEARCH_EXP "$sitearchexp"               /**/
+#define SITEARCH "$sitearch"           /**/
+#define SITEARCH_EXP "$sitearchexp"            /**/
 
 /* SITELIB:
  *     This symbol contains the name of the private library for this package.
@@ -2838,6 +2881,12 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  */
 #define Size_t $sizetype        /* length paramater for string functions */
 
+/* Sock_size_t:
+ *     This symbol holds the type used for the size argument of
+ *     various socket calls (just the base type, not the pointer-to).
+ */
+#define Sock_size_t            $socksizetype /**/
+
 /* SSize_t:
  *     This symbol holds the type used by functions that return
  *     a count of bytes or an error condition.  It must be a signed type.
@@ -2983,10 +3032,22 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
 #endif
 #$d_oldpthreads        OLD_PTHREADS_API                /**/
 
+/* PERL_VENDORARCH:
+ *     If defined, this symbol contains the name of a private library.
+ *     The library is private in the sense that it needn't be in anyone's
+ *     execution path, but it should be accessible by the world.
+ *     It may have a ~ on the front. 
+ *     The standard distribution will put nothing in this directory.
+ *     Vendors who distribute perl may wish to place their own
+ *     architecture-dependent modules and extensions in this directory with
+ *             MakeMaker Makefile.PL INSTALLDIRS=vendor 
+ *     or equivalent.  See INSTALL for details.
+ */
 /* PERL_VENDORARCH_EXP:
  *     This symbol contains the ~name expanded version of PERL_VENDORARCH, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
+#$d_vendorarch PERL_VENDORARCH "$vendorarch"           /**/
 #$d_vendorarch PERL_VENDORARCH_EXP "$vendorarchexp"            /**/
 
 /* PERL_VENDORLIB_EXP:
@@ -3061,31 +3122,12 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
 #define PERL_XS_APIVERSION "$xs_apiversion"
 #define PERL_PM_APIVERSION "$pm_apiversion"
 
-/* HAS_GETFSSTAT:
- *     This symbol, if defined, indicates that the getfsstat routine is
- *     available to stat filesystems in bulk.
- */
-#$d_getfsstat HAS_GETFSSTAT            /**/
-
-/* I_IEEEFP:
- *     This symbol, if defined, indicates that <ieeefp.h> exists and
- *     should be included.
- */
-#$i_ieeefp     I_IEEEFP                /**/
-
-/* HAS_LSEEK_PROTO:
- *     This symbol, if defined, indicates that the system provides
- *     a prototype for the lseek() function.  Otherwise, it is up
- *     to the program to supply one.  A good guess is
- *             extern off_t lseek(int, off_t, int);
+/* HAS_MODFL:
+ *     This symbol, if defined, indicates that the modfl routine is
+ *     available to split a long double x into a fractional part f and
+ *     an integer part i such that |f| < 1.0 and (f + i) = x.
  */
-#$d_lseekproto HAS_LSEEK_PROTO /**/
-
-/* Sock_size_t:
- *     This symbol holds the type used for the size argument of
- *     various socket calls (just the base type, not the pointer-to).
- */
-#define Sock_size_t            $socksizetype /**/
+#$d_modfl HAS_MODFL            /**/
 
 #endif
 !GROK!THIS!
index 1b984bb..e737ae7 100644 (file)
@@ -140,6 +140,7 @@ d_flock='define'
 d_fork='undef'
 d_fpathconf='undef'
 d_fpos64_t='undef'
+d_frexpl='undef'
 d_fs_data_s='undef'
 d_fseeko='undef'
 d_fsetpos='define'
@@ -189,6 +190,8 @@ d_index='undef'
 d_inetaton='undef'
 d_int64_t='undef'
 d_isascii='define'
+d_isnan='define'
+d_isnanl='undef'
 d_killpg='undef'
 d_lchown='undef'
 d_ldbl_dig='define'
@@ -215,6 +218,7 @@ d_mkstemp='undef'
 d_mkstemps='undef'
 d_mktime='define'
 d_mmap='undef'
+d_modfl='undef'
 d_mprotect='undef'
 d_msg='undef'
 d_msg_ctrunc='undef'
index 762e792..a926ac5 100644 (file)
@@ -140,6 +140,7 @@ d_flock='define'
 d_fork='undef'
 d_fpathconf='undef'
 d_fpos64_t='undef'
+d_frexpl='undef'
 d_fs_data_s='undef'
 d_fseeko='undef'
 d_fsetpos='define'
@@ -189,6 +190,8 @@ d_index='undef'
 d_inetaton='undef'
 d_int64_t='undef'
 d_isascii='define'
+d_isnan='define'
+d_isnanl='undef'
 d_killpg='undef'
 d_lchown='undef'
 d_ldbl_dig='define'
@@ -215,6 +218,7 @@ d_mkstemp='undef'
 d_mkstemps='undef'
 d_mktime='define'
 d_mmap='undef'
+d_modfl='undef'
 d_mprotect='undef'
 d_msg='undef'
 d_msg_ctrunc='undef'
index f3dff46..2437be2 100644 (file)
@@ -140,6 +140,7 @@ d_flock='define'
 d_fork='undef'
 d_fpathconf='undef'
 d_fpos64_t='undef'
+d_frexpl='undef'
 d_fs_data_s='undef'
 d_fseeko='undef'
 d_fsetpos='define'
@@ -189,6 +190,8 @@ d_index='undef'
 d_inetaton='undef'
 d_int64_t='undef'
 d_isascii='define'
+d_isnan='define'
+d_isnanl='undef'
 d_killpg='undef'
 d_lchown='undef'
 d_ldbl_dig='define'
@@ -215,6 +218,7 @@ d_mkstemp='undef'
 d_mkstemps='undef'
 d_mktime='define'
 d_mmap='undef'
+d_modfl='undef'
 d_mprotect='undef'
 d_msg='undef'
 d_msg_ctrunc='undef'
index 7e04ed1..8ca757c 100644 (file)
  */
 /*#define HAS_FORK             /**/
 
+/* HAS_FREXPL:
+ *     This symbol, if defined, indicates that the frexpl routine is
+ *     available to break a long double floating-point number into
+ *     a normalized fraction and an integral power of 2.
+ */
+/*#define HAS_FREXPL           /**/
+
 /* HAS_FSETPOS:
  *     This symbol, if defined, indicates that the fsetpos routine is
  *     available to set the file position indicator, similar to fseek().
  */
 #define HAS_ISASCII            /**/
 
+/* HAS_ISNAN:
+ *     This symbol, if defined, indicates that the isnan routine is
+ *     available to check whether a double is a NaN.
+ */
+#define HAS_ISNAN              /**/
+
+/* HAS_ISNANL:
+ *     This symbol, if defined, indicates that the isnanl routine is
+ *     available to check whether a long double is a NaN.
+ */
+/*#define HAS_ISNANL           /**/
+
 /* HAS_LDBL_DIG:
  *     This symbol, if defined, indicates that this system's <float.h>
  *     or <limits.h> defines the symbol LDBL_DIG, which is the number
  */
 /*#define HAS_MPROTECT         /**/
 
+/* HAS_MODFL:
+ *     This symbol, if defined, indicates that the modfl routine is
+ *     available to split a long double x into a fractional part f and
+ *     an integer part i such that |f| < 1.0 and (f + i) = x.
+ */
+/*#define HAS_MODFL            /**/
+
 /* HAS_MSG:
  *     This symbol, if defined, indicates that the entire msg*(2) library is
  *     supported (IPC mechanism based on message queues).
index 07e89da..289eadd 100644 (file)
  */
 /*#define HAS_FORK             /**/
 
+/* HAS_FREXPL:
+ *     This symbol, if defined, indicates that the frexpl routine is
+ *     available to break a long double floating-point number into
+ *     a normalized fraction and an integral power of 2.
+ */
+/*#define HAS_FREXPL           /**/
+
 /* HAS_FSETPOS:
  *     This symbol, if defined, indicates that the fsetpos routine is
  *     available to set the file position indicator, similar to fseek().
  */
 #define HAS_ISASCII            /**/
 
+/* HAS_ISNAN:
+ *     This symbol, if defined, indicates that the isnan routine is
+ *     available to check whether a double is a NaN.
+ */
+#define HAS_ISNAN              /**/
+
+/* HAS_ISNANL:
+ *     This symbol, if defined, indicates that the isnanl routine is
+ *     available to check whether a long double is a NaN.
+ */
+/*#define HAS_ISNANL           /**/
+
 /* HAS_LDBL_DIG:
  *     This symbol, if defined, indicates that this system's <float.h>
  *     or <limits.h> defines the symbol LDBL_DIG, which is the number
  */
 /*#define HAS_MPROTECT         /**/
 
+/* HAS_MODFL:
+ *     This symbol, if defined, indicates that the modfl routine is
+ *     available to split a long double x into a fractional part f and
+ *     an integer part i such that |f| < 1.0 and (f + i) = x.
+ */
+/*#define HAS_MODFL            /**/
+
 /* HAS_MSG:
  *     This symbol, if defined, indicates that the entire msg*(2) library is
  *     supported (IPC mechanism based on message queues).
index 5d77c7b..b0702f0 100644 (file)
  */
 /*#define HAS_FORK             /**/
 
+/* HAS_FREXPL:
+ *     This symbol, if defined, indicates that the frexpl routine is
+ *     available to break a long double floating-point number into
+ *     a normalized fraction and an integral power of 2.
+ */
+/*#define HAS_FREXPL           /**/
+
 /* HAS_FSETPOS:
  *     This symbol, if defined, indicates that the fsetpos routine is
  *     available to set the file position indicator, similar to fseek().
  */
 #define HAS_ISASCII            /**/
 
+/* HAS_ISNAN:
+ *     This symbol, if defined, indicates that the isnan routine is
+ *     available to check whether a double is a NaN.
+ */
+#define HAS_ISNAN              /**/
+
+/* HAS_ISNANL:
+ *     This symbol, if defined, indicates that the isnanl routine is
+ *     available to check whether a long double is a NaN.
+ */
+/*#define HAS_ISNANL           /**/
+
 /* HAS_LDBL_DIG:
  *     This symbol, if defined, indicates that this system's <float.h>
  *     or <limits.h> defines the symbol LDBL_DIG, which is the number
  */
 /*#define HAS_MPROTECT         /**/
 
+/* HAS_MODFL:
+ *     This symbol, if defined, indicates that the modfl routine is
+ *     available to split a long double x into a fractional part f and
+ *     an integer part i such that |f| < 1.0 and (f + i) = x.
+ */
+/*#define HAS_MODFL            /**/
+
 /* HAS_MSG:
  *     This symbol, if defined, indicates that the entire msg*(2) library is
  *     supported (IPC mechanism based on message queues).