X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;ds=sidebyside;f=ccan%2Fmem%2Fmem.c;h=af41f9e011edbc6738667c3fc89d9d043b1dbcf6;hb=b967dac8c71a2313c39910ef8ca0e1644fe178c0;hp=853f975db15c1e0c096387c53973a7bdf3b14095;hpb=40b45c4cfbf110a8e790366302ff43fa94dc8daa;p=ccan diff --git a/ccan/mem/mem.c b/ccan/mem/mem.c index 853f975d..af41f9e0 100644 --- a/ccan/mem/mem.c +++ b/ccan/mem/mem.c @@ -2,6 +2,7 @@ #include "config.h" +#include #include #include @@ -40,3 +41,64 @@ void *memrchr(const void *s, int c, size_t n) return NULL; } #endif + +void *mempbrkm(const void *data_, size_t len, const void *accept_, size_t accept_len) +{ + const char *data = data_, *accept = accept_; + size_t i, j; + + for (i = 0; i < len; i++) + for (j = 0; j < accept_len; j++) + if (accept[j] == data[i]) + return (void *)&data[i]; + return NULL; +} + +void *memcchr(void const *data, int c, size_t data_len) +{ + char const *p = data; + size_t i; + + for (i = 0; i < data_len; i++) + if (p[i] != c) + return (void *)&p[i]; + + return NULL; +} + +#define MEMSWAP_TMP_SIZE 256 + +void memswap(void *a, void *b, size_t n) +{ + char *ap = a; + char *bp = b; + char tmp[MEMSWAP_TMP_SIZE]; + + assert(!memoverlaps(a, n, b, n)); + + while (n) { + size_t m = n > MEMSWAP_TMP_SIZE ? MEMSWAP_TMP_SIZE : n; + + memcpy(tmp, bp, m); + memcpy(bp, ap, m); + memcpy(ap, tmp, m); + + ap += m; + bp += m; + n -= m; + } +} + +bool memeqzero(const void *data, size_t length) +{ + const unsigned char *p = data; + static unsigned long zeroes[16]; + + while (length > sizeof(zeroes)) { + if (memcmp(zeroes, p, sizeof(zeroes))) + return false; + p += sizeof(zeroes); + length -= sizeof(zeroes); + } + return memcmp(zeroes, p, length) == 0; +}