Root/
Source at commit 1146 created 12 years 10 months ago. By azimutz, Sync with trunk (r1145). Add nVidia dev id's, 0DF4 for "GeForce GT 450M" (issue 99) and 1251 for "GeForce GTX 560M" (thanks to oSxFr33k for testing). | |
---|---|
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 | ␉return NULL;␊ |
52 | }␊ |
53 |