X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fmem%2Fmem.c;h=5eb15070ed3c3f9f5bf8d2dd8b0d0f060ffa1766;hb=6e5c2f3f55d4e537ccc69703cc41a4295afcd170;hp=91c9961a52ecd92d1372dae98b07f54902e25f22;hpb=1c9eb9fb3e8d3f44b03a621166058dbff25610d1;p=ccan diff --git a/ccan/mem/mem.c b/ccan/mem/mem.c index 91c9961a..5eb15070 100644 --- a/ccan/mem/mem.c +++ b/ccan/mem/mem.c @@ -2,6 +2,7 @@ #include "config.h" +#include #include #include @@ -64,3 +65,45 @@ void *memcchr(void const *data, int c, size_t data_len) 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; + size_t len; + + /* Check first 16 bytes manually */ + for (len = 0; len < 16; len++) { + if (!length) + return true; + if (*p) + return false; + p++; + length--; + } + + /* Now we know that's zero, memcmp with self. */ + return memcmp(data, p, length) == 0; +}