123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- #include <string.h>
- #undef memchr
- void *memchr(const void *s, int c, size_t count)
- {
- void *edi;
- int ecx;
- __asm__ __volatile__(
- " jecxz 1f\n"
- " repne; scasb\n"
- " leal -1(%%edi), %%edi\n"
- " je 2f\n"
- "1:\n"
- " xorl %%edi, %%edi\n"
- "2:\n"
- : "=&D" (edi), "=&c" (ecx)
- : "a" (c), "0" (s), "1" (count)
-
- );
- return edi;
- }
- #ifndef memchr
- libc_hidden_def(memchr)
- #else
- int main()
- {
- static const char str[] = "abc.def";
- printf((char*)memchr(str, '.',-2) - str == 3 ? "ok\n" : "BAD!\n");
- printf((char*)memchr(str, '.',-1) - str == 3 ? "ok\n" : "BAD!\n");
- printf((char*)memchr(str, '.', 0) == NULL ? "ok\n" : "BAD!\n");
- printf((char*)memchr(str, '.', 1) == NULL ? "ok\n" : "BAD!\n");
- printf((char*)memchr(str, '.', 2) == NULL ? "ok\n" : "BAD!\n");
- printf((char*)memchr(str, '.', 3) == NULL ? "ok\n" : "BAD!\n");
- printf((char*)memchr(str, '.', 4) - str == 3 ? "ok\n" : "BAD!\n");
- printf((char*)memchr(str, '.', 5) - str == 3 ? "ok\n" : "BAD!\n");
- printf((char*)memchr(str+3, '.', 0) == NULL ? "ok\n" : "BAD!\n");
- printf((char*)memchr(str+3, '.', 5) - str == 3 ? "ok\n" : "BAD!\n");
- }
- #endif
|