Upgrade to ExtUtils-MakeMaker-6.50
[p5sagit/p5-mst-13.2.git] / pp_sys.c
index 225b55e..b42cced 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
 #include "EXTERN.h"
 #define PERL_IN_PP_SYS_C
 #include "perl.h"
-#include "time64.h"
-#include "time64.c"
+#if !defined(PERL_MICRO) && defined(Quad_t)
+#  include "time64.h"
+#  include "time64.c"
+#endif
 
 #ifdef I_SHADOW
 /* Shadow password support for solaris - pdo@cs.umd.edu
@@ -1816,9 +1818,8 @@ PP(pp_send)
            SV *sv;
 
            if (MARK == SP - 1) {
-               EXTEND(SP, 1000);
-               sv = sv_2mortal(newSViv(sv_len(*SP)));
-               PUSHs(sv);
+               sv = *SP;
+               mXPUSHi(sv_len(sv));
                PUTBACK;
            }
 
@@ -4316,6 +4317,7 @@ PP(pp_setpgrp)
     if (MAXARG < 2) {
        pgrp = 0;
        pid = 0;
+       XPUSHi(-1);
     }
     else {
        pgrp = POPi;
@@ -4422,9 +4424,15 @@ PP(pp_gmtime)
 {
     dVAR;
     dSP;
+#if defined(PERL_MICRO) || !defined(Quad_t)
+    Time_t when;
+    const struct tm *err;
+    struct tm tmbuf;
+#else
     Time64_T when;
     struct TM tmbuf;
     struct TM *err;
+#endif
     const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
     static const char * const dayname[] =
        {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
@@ -4432,6 +4440,20 @@ PP(pp_gmtime)
        {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
         "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
 
+#if defined(PERL_MICRO) || !defined(Quad_t)
+    if (MAXARG < 1)
+       (void)time(&when);
+    else
+       when = (Time_t)SvIVx(POPs);
+
+    if (PL_op->op_type == OP_LOCALTIME)
+       err = localtime(&when);
+    else
+       err = gmtime(&when);
+
+    if (!err)
+       tmbuf = *err;
+#else
     if (MAXARG < 1) {
        time_t now;
        (void)time(&now);
@@ -4442,9 +4464,9 @@ PP(pp_gmtime)
           using a double causes an unfortunate loss of accuracy on high numbers.
           What we really need is an SvQV.
        */
-       double input = POPn;
+       double input = Perl_floor(POPn);
        when = (Time64_T)input;
-       if( when != input ) {
+       if (when != input && ckWARN(WARN_OVERFLOW)) {
            Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
                        "%s(%.0f) too large", opname, input);
        }
@@ -4454,8 +4476,9 @@ PP(pp_gmtime)
         err = localtime64_r(&when, &tmbuf);
     else
        err = gmtime64_r(&when, &tmbuf);
+#endif
 
-    if( err == NULL ) {
+    if (err == NULL && ckWARN(WARN_OVERFLOW)) {
        /* XXX %lld broken for quads */
        Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
                    "%s(%.0f) failed", opname, (double)when);
@@ -5305,7 +5328,11 @@ PP(pp_ggrent)
        PUSHs(sv);
        if (grent) {
            if (which == OP_GGRNAM)
+#if Gid_t_sign <= 0
                sv_setiv(sv, (IV)grent->gr_gid);
+#else
+               sv_setuv(sv, (UV)grent->gr_gid);
+#endif
            else
                sv_setpv(sv, grent->gr_name);
        }
@@ -5321,7 +5348,11 @@ PP(pp_ggrent)
        PUSHs(sv_mortalcopy(&PL_sv_no));
 #endif
 
+#if Gid_t_sign <= 0
        mPUSHi(grent->gr_gid);
+#else
+       mPUSHu(grent->gr_gid);
+#endif
 
 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
        /* In UNICOS/mk (_CRAYMPP) the multithreading