X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pp_sort.c;h=582b811570177142a25fd7e286b509fd51fd704a;hb=aa1f7c5b6ec66b97fca8377d522bdd9e4ff098de;hp=aa1fe809294f73e325a49f6e926a0c17256e4fa1;hpb=f4f44d658c5179458c57c4af43429aac25bf8546;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pp_sort.c b/pp_sort.c index aa1fe80..582b811 100644 --- a/pp_sort.c +++ b/pp_sort.c @@ -1,7 +1,7 @@ /* pp_sort.c * * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - * 2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others + * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 by Larry Wall and others * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -1365,8 +1365,10 @@ S_qsortsv(pTHX_ gptr *list1, size_t nmemb, SVCOMPARE_t cmp, U32 flags) PL_sort_RealCmp = cmp; /* Put comparison routine where cmpindir can find it */ /* sort, with indirection */ - S_qsortsvu(aTHX_ (gptr *)indir, nmemb, - ((flags & SORTf_DESC) != 0 ? cmpindir_desc : cmpindir)); + if (flags & SORTf_DESC) + qsortsvu((gptr *)indir, nmemb, cmpindir_desc); + else + qsortsvu((gptr *)indir, nmemb, cmpindir); pp = indir; q = list1; @@ -1413,11 +1415,11 @@ S_qsortsv(pTHX_ gptr *list1, size_t nmemb, SVCOMPARE_t cmp, U32 flags) const SVCOMPARE_t savecmp = PL_sort_RealCmp; /* Save current comparison routine, if any */ PL_sort_RealCmp = cmp; /* Put comparison routine where cmp_desc can find it */ cmp = cmp_desc; - S_qsortsvu(aTHX_ list1, nmemb, cmp); + qsortsvu(list1, nmemb, cmp); /* restore prevailing comparison routine */ PL_sort_RealCmp = savecmp; } else { - S_qsortsvu(aTHX_ list1, nmemb, cmp); + qsortsvu(list1, nmemb, cmp); } } @@ -1523,7 +1525,7 @@ PP(pp_sort) SV *tmpstr = sv_newmortal(); gv_efullname3(tmpstr, gv, NULL); DIE(aTHX_ "Undefined sort subroutine \"%"SVf"\" called", - tmpstr); + SVfARG(tmpstr)); } else { DIE(aTHX_ "Undefined subroutine in sort"); @@ -1693,9 +1695,9 @@ PP(pp_sort) : ( overloading ? S_amagic_ncmp : S_sv_ncmp ) ) : ( IN_LOCALE_RUNTIME ? ( overloading - ? S_amagic_cmp_locale - : sv_cmp_locale_static) - : ( overloading ? S_amagic_cmp : sv_cmp_static)), + ? (SVCOMPARE_t)S_amagic_cmp_locale + : (SVCOMPARE_t)sv_cmp_locale_static) + : ( overloading ? (SVCOMPARE_t)S_amagic_cmp : (SVCOMPARE_t)sv_cmp_static)), sort_flags); } if ((priv & OPpSORT_REVERSE) != 0) { @@ -1768,12 +1770,12 @@ S_sortcv_stacked(pTHX_ SV *a, SV *b) SV** ary = AvALLOC(av); if (AvARRAY(av) != ary) { AvMAX(av) += AvARRAY(av) - AvALLOC(av); - SvPV_set(av, (char*)ary); + AvARRAY(av) = ary; } if (AvMAX(av) < 1) { AvMAX(av) = 1; Renew(ary,2,SV*); - SvPV_set(av, (char*)ary); + AvARRAY(av) = ary; } } AvFILLp(av) = 1; @@ -1845,6 +1847,8 @@ S_sv_i_ncmp(pTHX_ SV *a, SV *b) ? amagic_call(left, right, CAT2(meth,_amg), 0) \ : NULL; +#define SORT_NORMAL_RETURN_VALUE(val) (((val) > 0) ? 1 : ((val) ? -1 : 0)) + static I32 S_amagic_ncmp(pTHX_ register SV *a, register SV *b) { @@ -1853,15 +1857,11 @@ S_amagic_ncmp(pTHX_ register SV *a, register SV *b) if (tmpsv) { if (SvIOK(tmpsv)) { const I32 i = SvIVX(tmpsv); - if (i > 0) - return 1; - return i? -1 : 0; + return SORT_NORMAL_RETURN_VALUE(i); } else { const NV d = SvNV(tmpsv); - if (d > 0) - return 1; - return d ? -1 : 0; + return SORT_NORMAL_RETURN_VALUE(d); } } return S_sv_ncmp(aTHX_ a, b); @@ -1875,15 +1875,11 @@ S_amagic_i_ncmp(pTHX_ register SV *a, register SV *b) if (tmpsv) { if (SvIOK(tmpsv)) { const I32 i = SvIVX(tmpsv); - if (i > 0) - return 1; - return i? -1 : 0; + return SORT_NORMAL_RETURN_VALUE(i); } else { const NV d = SvNV(tmpsv); - if (d > 0) - return 1; - return d ? -1 : 0; + return SORT_NORMAL_RETURN_VALUE(d); } } return S_sv_i_ncmp(aTHX_ a, b); @@ -1897,15 +1893,11 @@ S_amagic_cmp(pTHX_ register SV *str1, register SV *str2) if (tmpsv) { if (SvIOK(tmpsv)) { const I32 i = SvIVX(tmpsv); - if (i > 0) - return 1; - return i? -1 : 0; + return SORT_NORMAL_RETURN_VALUE(i); } else { const NV d = SvNV(tmpsv); - if (d > 0) - return 1; - return d? -1 : 0; + return SORT_NORMAL_RETURN_VALUE(d); } } return sv_cmp(str1, str2); @@ -1919,15 +1911,11 @@ S_amagic_cmp_locale(pTHX_ register SV *str1, register SV *str2) if (tmpsv) { if (SvIOK(tmpsv)) { const I32 i = SvIVX(tmpsv); - if (i > 0) - return 1; - return i? -1 : 0; + return SORT_NORMAL_RETURN_VALUE(i); } else { const NV d = SvNV(tmpsv); - if (d > 0) - return 1; - return d? -1 : 0; + return SORT_NORMAL_RETURN_VALUE(d); } } return sv_cmp_locale(str1, str2);