Last change
on this file was
e16e8f2,
checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago
|
bootstuff
|
-
Property mode set to
100644
|
File size:
1.1 KB
|
Line | |
---|
1 | /* |
---|
2 | * memmem.c |
---|
3 | * |
---|
4 | * Find a byte string inside a longer byte string |
---|
5 | * |
---|
6 | * This uses the "Not So Naive" algorithm, a very simple but |
---|
7 | * usually effective algorithm, see: |
---|
8 | * |
---|
9 | * http://www-igm.univ-mlv.fr/~lecroq/string/ |
---|
10 | */ |
---|
11 | |
---|
12 | #include <string.h> |
---|
13 | |
---|
14 | void *memmem(const void *haystack, size_t n, const void *needle, size_t m) |
---|
15 | { |
---|
16 | const unsigned char *y = (const unsigned char *)haystack; |
---|
17 | const unsigned char *x = (const unsigned char *)needle; |
---|
18 | |
---|
19 | size_t j, k, l; |
---|
20 | |
---|
21 | if (m > n || !m || !n) |
---|
22 | return NULL; |
---|
23 | |
---|
24 | if (1 != m) { |
---|
25 | if (x[0] == x[1]) { |
---|
26 | k = 2; |
---|
27 | l = 1; |
---|
28 | } else { |
---|
29 | k = 1; |
---|
30 | l = 2; |
---|
31 | } |
---|
32 | |
---|
33 | j = 0; |
---|
34 | while (j <= n - m) { |
---|
35 | if (x[1] != y[j + 1]) { |
---|
36 | j += k; |
---|
37 | } else { |
---|
38 | if (!memcmp(x + 2, y + j + 2, m - 2) |
---|
39 | && x[0] == y[j]) |
---|
40 | return (void *)&y[j]; |
---|
41 | j += l; |
---|
42 | } |
---|
43 | } |
---|
44 | } else { |
---|
45 | do { |
---|
46 | if (*y == *x) |
---|
47 | return (void *)y; |
---|
48 | y++; |
---|
49 | } while (--n); |
---|
50 | } |
---|
51 | |
---|
52 | return NULL; |
---|
53 | } |
---|
Note: See
TracBrowser
for help on using the repository browser.