cosmopolitan/libc/str/tinymemmem.internal.h

27 lines
840 B
C

#ifndef COSMOPOLITAN_LIBC_STR_TINYSTRSTR_H_
#define COSMOPOLITAN_LIBC_STR_TINYSTRSTR_H_
#ifndef __STRICT_ANSI__
#include "libc/str/str.h"
#if !(__ASSEMBLER__ + __LINKER__ + 0)
forceinline void *tinymemmemi(const void *haystk, size_t haystksize,
const void *needle, size_t needlesize) {
const char *p = (const char *)haystk;
const char *pe = (const char *)haystk + haystksize;
while (p < pe) {
size_t i = 0;
++p;
for (;;) {
++i;
if (i > needlesize) return (/*unconst*/ char *)(p - 1);
if (p == pe) break;
if (((const char *)needle)[i - 1] != (p - 1)[i - 1]) break;
}
}
return (/*unconst*/ char *)(!haystksize && !needlesize ? haystk : NULL);
}
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* !ANSI */
#endif /* COSMOPOLITAN_LIBC_STR_TINYMEMMEM_H_ */