memmem.c (7d4b968b0fa6afc6bca132c27e2041c979ee6101) memmem.c (16150352f592cc00900ab9eefbfd248a975230d2)
1/*-
2 * Copyright (c) 2005 Pascal Gloor <pascal.gloor@spale.com>
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.

--- 28 unchanged lines hidden (view full) ---

37
38void *
39memmem(const void *l, size_t l_len, const void *s, size_t s_len)
40{
41 register char *cur, *last;
42 const char *cl = (const char *)l;
43 const char *cs = (const char *)s;
44
1/*-
2 * Copyright (c) 2005 Pascal Gloor <pascal.gloor@spale.com>
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.

--- 28 unchanged lines hidden (view full) ---

37
38void *
39memmem(const void *l, size_t l_len, const void *s, size_t s_len)
40{
41 register char *cur, *last;
42 const char *cl = (const char *)l;
43 const char *cs = (const char *)s;
44
45 /* we need something to compare */
46 if (l_len == 0 || s_len == 0)
47 return NULL;
45 /* empty "s" matches the beginning of "l" */
46 if (s_len == 0)
47 return (void *)cl;
48
49 /* "s" must be smaller or equal to "l" */
50 if (l_len < s_len)
51 return NULL;
52
53 /* special case where s_len == 1 */
54 if (s_len == 1)
55 return memchr(l, (int)*cs, l_len);
56
57 /* the last position where its possible to find "s" in "l" */
58 last = (char *)cl + l_len - s_len;
59
60 for (cur = (char *)cl; cur <= last; cur++)
61 if (cur[0] == cs[0] && memcmp(cur, cs, s_len) == 0)
62 return cur;
63
64 return NULL;
65}
48
49 /* "s" must be smaller or equal to "l" */
50 if (l_len < s_len)
51 return NULL;
52
53 /* special case where s_len == 1 */
54 if (s_len == 1)
55 return memchr(l, (int)*cs, l_len);
56
57 /* the last position where its possible to find "s" in "l" */
58 last = (char *)cl + l_len - s_len;
59
60 for (cur = (char *)cl; cur <= last; cur++)
61 if (cur[0] == cs[0] && memcmp(cur, cs, s_len) == 0)
62 return cur;
63
64 return NULL;
65}