X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pp_sys.c;h=b42cced0e2d7d53fe2a1c89b83b50094185410ce;hb=76467b2a651c6c83b127a7ee5b8170cd17171b66;hp=225b55ef79954f15811eab2d8069dfb64b8146a7;hpb=a8cb02613db44c6c8a53ff84a0d959222f9c694f;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pp_sys.c b/pp_sys.c index 225b55e..b42cced 100644 --- a/pp_sys.c +++ b/pp_sys.c @@ -29,8 +29,10 @@ #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