summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Williamson <khw@cpan.org>2016-05-10 22:17:22 -0600
committerKarl Williamson <khw@cpan.org>2016-05-12 20:24:55 -0600
commitb8070b0795640313148acfe846c5f9320bec5745 (patch)
treeefdf6391485e5c57c05afc70e0e0bc16e4e054bf
parent5f81fa4069cb15ccd77b1c4253c870df84c1788a (diff)
downloadperl-b8070b0795640313148acfe846c5f9320bec5745.tar.gz
Use memmem() if available on the platform for Perl_ninstr()
-rw-r--r--embed.fnc5
-rw-r--r--embed.h4
-rw-r--r--proto.h19
-rw-r--r--util.c8
-rw-r--r--util.h5
5 files changed, 35 insertions, 6 deletions
diff --git a/embed.fnc b/embed.fnc
index da809efc34..bf3b8c5c72 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -1093,8 +1093,13 @@ Apd |SV* |vstringify |NN SV *vs
Apd |int |vcmp |NN SV *lhv|NN SV *rhv
: Used in pp_hot.c and pp_sys.c
p |PerlIO*|nextargv |NN GV* gv|bool nomagicopen
+#ifdef HAS_MEMMEM
+AdnopP |char* |ninstr |NN const char* big|NN const char* bigend \
+ |NN const char* little|NN const char* lend
+#else
AdnpP |char* |ninstr |NN const char* big|NN const char* bigend \
|NN const char* little|NN const char* lend
+#endif
Apd |void |op_free |NULLOK OP* arg
Mp |OP* |op_unscope |NULLOK OP* o
#ifdef PERL_CORE
diff --git a/embed.h b/embed.h
index 6028a3dc4a..6071c315a7 100644
--- a/embed.h
+++ b/embed.h
@@ -420,7 +420,6 @@
#define new_numeric(a) Perl_new_numeric(aTHX_ a)
#define new_stackinfo(a,b) Perl_new_stackinfo(aTHX_ a,b)
#define new_version(a) Perl_new_version(aTHX_ a)
-#define ninstr Perl_ninstr
#define nothreadhook() Perl_nothreadhook(aTHX)
#define op_append_elem(a,b,c) Perl_op_append_elem(aTHX_ a,b,c)
#define op_append_list(a,b,c) Perl_op_append_list(aTHX_ a,b,c)
@@ -760,6 +759,9 @@
#define whichsig_pvn(a,b) Perl_whichsig_pvn(aTHX_ a,b)
#define whichsig_sv(a) Perl_whichsig_sv(aTHX_ a)
#define wrap_op_checker(a,b,c) Perl_wrap_op_checker(aTHX_ a,b,c)
+#if !(defined(HAS_MEMMEM))
+#define ninstr Perl_ninstr
+#endif
#if !(defined(HAS_SIGACTION) && defined(SA_SIGINFO))
#define csighandler Perl_csighandler
#endif
diff --git a/proto.h b/proto.h
index 3751f4800c..d16dd07ede 100644
--- a/proto.h
+++ b/proto.h
@@ -2319,11 +2319,6 @@ PERL_CALLCONV STRLEN * Perl_new_warnings_bitfield(pTHX_ STRLEN *buffer, const ch
PERL_CALLCONV PerlIO* Perl_nextargv(pTHX_ GV* gv, bool nomagicopen);
#define PERL_ARGS_ASSERT_NEXTARGV \
assert(gv)
-PERL_CALLCONV char* Perl_ninstr(const char* big, const char* bigend, const char* little, const char* lend)
- __attribute__pure__;
-#define PERL_ARGS_ASSERT_NINSTR \
- assert(big); assert(bigend); assert(little); assert(lend)
-
PERL_CALLCONV_NO_RET void Perl_noperl_die(const char* pat, ...)
__attribute__noreturn__
__attribute__format__(__printf__,1,2);
@@ -3690,6 +3685,13 @@ STATIC int S_sv_2iuv_non_preserve(pTHX_ SV *const sv);
# endif
# endif
#endif
+#if !(defined(HAS_MEMMEM))
+PERL_CALLCONV char* Perl_ninstr(const char* big, const char* bigend, const char* little, const char* lend)
+ __attribute__pure__;
+#define PERL_ARGS_ASSERT_NINSTR \
+ assert(big); assert(bigend); assert(little); assert(lend)
+
+#endif
#if !(defined(HAS_SIGACTION) && defined(SA_SIGINFO))
PERL_CALLCONV Signal_t Perl_csighandler(int sig);
PERL_CALLCONV Signal_t Perl_sighandler(int sig);
@@ -4037,6 +4039,13 @@ PERL_CALLCONV void Perl_dump_sv_child(pTHX_ SV *sv);
#define PERL_ARGS_ASSERT_DUMP_SV_CHILD \
assert(sv)
#endif
+#if defined(HAS_MEMMEM)
+PERL_CALLCONV char* Perl_ninstr(const char* big, const char* bigend, const char* little, const char* lend)
+ __attribute__pure__;
+#define PERL_ARGS_ASSERT_NINSTR \
+ assert(big); assert(bigend); assert(little); assert(lend)
+
+#endif
#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
PERL_CALLCONV I32 Perl_do_ipcctl(pTHX_ I32 optype, SV** mark, SV** sp);
#define PERL_ARGS_ASSERT_DO_IPCCTL \
diff --git a/util.c b/util.c
index 447a19fc13..2f788251b4 100644
--- a/util.c
+++ b/util.c
@@ -584,6 +584,11 @@ char *
Perl_ninstr(const char *big, const char *bigend, const char *little, const char *lend)
{
PERL_ARGS_ASSERT_NINSTR;
+
+#ifdef HAS_MEMMEM
+ return ninstr(big, bigend, little, lend);
+#else
+
if (little >= lend)
return (char*)big;
{
@@ -602,6 +607,9 @@ Perl_ninstr(const char *big, const char *bigend, const char *little, const char
}
}
return NULL;
+
+#endif
+
}
/*
diff --git a/util.h b/util.h
index 3a74bd02bd..8f4171bebc 100644
--- a/util.h
+++ b/util.h
@@ -231,6 +231,11 @@ means arg not present, 1 is empty string/null byte */
#define instr(haystack, needle) strstr(haystack, needle)
+#ifdef HAS_MEMMEM
+# define ninstr(big, bigend, little, lend) \
+ ((char *) memmem(big, bigend - big, little, lend - little))
+#endif
+
/*
* ex: set ts=8 sts=4 sw=4 et:
*/