aboutsummaryrefslogtreecommitdiffstats
path: root/com32/lib/memmem.c
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@linux.intel.com>2010-10-15 16:41:02 -0700
committerH. Peter Anvin <hpa@linux.intel.com>2010-10-15 16:41:02 -0700
commit94fbd0b8d206102757cecd3dbd67cd701fb70470 (patch)
tree985134a429fc1bd82d9036dc1400140271ae7639 /com32/lib/memmem.c
parent7634709500bc97448244a46a06621273d0cac9cc (diff)
parenta66a47e168804aa0a62a3a5810d7f8dd9b647dab (diff)
downloadsyslinux-94fbd0b8d206102757cecd3dbd67cd701fb70470.tar.gz
syslinux-94fbd0b8d206102757cecd3dbd67cd701fb70470.tar.xz
syslinux-94fbd0b8d206102757cecd3dbd67cd701fb70470.zip
Merge remote branch 'liu/master'
Diffstat (limited to 'com32/lib/memmem.c')
-rw-r--r--com32/lib/memmem.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/com32/lib/memmem.c b/com32/lib/memmem.c
index 8558a80d..7c42f1c3 100644
--- a/com32/lib/memmem.c
+++ b/com32/lib/memmem.c
@@ -18,26 +18,35 @@ void *memmem(const void *haystack, size_t n, const void *needle, size_t m)
size_t j, k, l;
- if (m > n)
- return NULL;
+ if (m > n || !m || !n)
+ return NULL;
- if (x[0] == x[1]) {
- k = 2;
- l = 1;
- } else {
- k = 1;
- l = 2;
- }
+ if (1 != m) {
+ if (x[0] == x[1]) {
+ k = 2;
+ l = 1;
+ } else {
+ k = 1;
+ l = 2;
+ }
- j = 0;
- while (j <= n - m) {
- if (x[1] != y[j + 1]) {
- j += k;
- } else {
- if (!memcmp(x + 2, y + j + 2, m - 2) && x[0] == y[j])
- return (void *)&y[j];
- j += l;
- }
+ j = 0;
+ while (j <= n - m) {
+ if (x[1] != y[j + 1]) {
+ j += k;
+ } else {
+ if (!memcmp(x + 2, y + j + 2, m - 2)
+ && x[0] == y[j])
+ return (void *)&y[j];
+ j += l;
+ }
+ }
+ } else {
+ do {
+ if (*y == *x)
+ return (void *)y;
+ y++;
+ } while (--n);
}
return NULL;