This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add memENDPs and use it in core
authorKarl Williamson <khw@cpan.org>
Tue, 25 Apr 2017 02:39:02 +0000 (20:39 -0600)
committerKarl Williamson <khw@cpan.org>
Mon, 6 Nov 2017 19:50:06 +0000 (12:50 -0700)
This corresponds to memBEGINPs

handy.h
pp_ctl.c

diff --git a/handy.h b/handy.h
index 7b5aeb8..2646ca1 100644 (file)
--- a/handy.h
+++ b/handy.h
@@ -501,6 +501,9 @@ Returns zero if non-equal, or non-zero if equal.
 #define memENDs(s1, l, s2)                                                  \
             (   (l) >= sizeof(s2) - 1                                       \
              && memEQ(s1 + (l) - (sizeof(s2) - 1), "" s2 "", sizeof(s2)-1))
+#define memENDPs(s1, l, s2)                                                 \
+            (   (l) > sizeof(s2)                                            \
+             && memEQ(s1 + (l) - (sizeof(s2) - 1), "" s2 "", sizeof(s2)-1))
 
 #define memLT(s1,s2,l) (memcmp(s1,s2,l) < 0)
 #define memLE(s1,s2,l) (memcmp(s1,s2,l) <= 0)
index 4042328..a113b48 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -3614,7 +3614,7 @@ S_doopen_pm(pTHX_ SV *name)
     if (!IS_SAFE_PATHNAME(p, namelen, "require"))
         return NULL;
 
-    if (namelen > 3 && memEQs(p + namelen - 3, 3, ".pm")) {
+    if (memENDPs(p, namelen, ".pm")) {
        SV *const pmcsv = sv_newmortal();
        PerlIO * pmcio;
 
@@ -4133,12 +4133,12 @@ S_require_file(pTHX_ SV *sv)
                    SSize_t i;
                    SV *const msg = newSVpvs_flags("", SVs_TEMP);
                    SV *const inc = newSVpvs_flags("", SVs_TEMP);
-                    const char *e = name + len - 3; /* possible .pm */
                    for (i = 0; i <= AvFILL(ar); i++) {
                        sv_catpvs(inc, " ");
                        sv_catsv(inc, *av_fetch(ar, i, TRUE));
                    }
-                   if (e > name && _memEQs(e, ".pm")) {
+                   if (memENDPs(name, len, ".pm")) {
+                        const char *e = name + len - (sizeof(".pm") - 1);
                        const char *c;
                         bool utf8 = cBOOL(SvUTF8(sv));