From 7a3e372025b2a54486ce52d706b1da95be4b7e7e Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 14 Feb 2012 16:11:46 +0100 Subject: [PATCH] endian.c/h -> endianconv.c/h to avoid issues with broken libraries search paths. --- src/Makefile | 10 ++-- src/endian.c | 80 ------------------------------ src/endian.h | 29 ----------- src/endianconv.c | 124 +++++++++++++++++++++++++++++++++++++++++++++++ src/endianconv.h | 61 +++++++++++++++++++++++ src/intset.c | 2 +- src/ziplist.c | 2 +- src/zipmap.c | 2 +- 8 files changed, 193 insertions(+), 117 deletions(-) delete mode 100644 src/endian.c delete mode 100644 src/endian.h create mode 100644 src/endianconv.c create mode 100644 src/endianconv.h diff --git a/src/Makefile b/src/Makefile index a6515e61..e023a2a9 100644 --- a/src/Makefile +++ b/src/Makefile @@ -73,7 +73,7 @@ QUIET_CC = @printf ' %b %b\n' $(CCCOLOR)CC$(ENDCOLOR) $(SRCCOLOR)$@$(ENDCOLOR QUIET_LINK = @printf ' %b %b\n' $(LINKCOLOR)LINK$(ENDCOLOR) $(BINCOLOR)$@$(ENDCOLOR); endif -OBJ = adlist.o ae.o anet.o dict.o redis.o sds.o zmalloc.o lzf_c.o lzf_d.o pqsort.o zipmap.o sha1.o ziplist.o release.o networking.o util.o object.o db.o replication.o rdb.o t_string.o t_list.o t_set.o t_zset.o t_hash.o config.o aof.o pubsub.o multi.o debug.o sort.o intset.o syncio.o cluster.o crc16.o endian.o slowlog.o scripting.o bio.o rio.o rand.o +OBJ = adlist.o ae.o anet.o dict.o redis.o sds.o zmalloc.o lzf_c.o lzf_d.o pqsort.o zipmap.o sha1.o ziplist.o release.o networking.o util.o object.o db.o replication.o rdb.o t_string.o t_list.o t_set.o t_zset.o t_hash.o config.o aof.o pubsub.o multi.o debug.o sort.o intset.o syncio.o cluster.o crc16.o endianconv.o slowlog.o scripting.o bio.o rio.o rand.o BENCHOBJ = ae.o anet.o redis-benchmark.o sds.o adlist.o zmalloc.o CLIOBJ = anet.o sds.o adlist.o redis-cli.o zmalloc.o release.o CHECKDUMPOBJ = redis-check-dump.o lzf_c.o lzf_d.o @@ -112,8 +112,8 @@ db.o: db.c redis.h fmacros.h config.h ae.h sds.h dict.h adlist.h \ debug.o: debug.c redis.h fmacros.h config.h ae.h sds.h dict.h adlist.h \ zmalloc.h anet.h zipmap.h ziplist.h intset.h version.h util.h sha1.h dict.o: dict.c fmacros.h dict.h zmalloc.h -endian.o: endian.c -intset.o: intset.c intset.h zmalloc.h endian.h +endianconv.o: endianconv.c +intset.o: intset.c intset.h zmalloc.h endianconv.h lzf_c.o: lzf_c.c lzfP.h lzf_d.o: lzf_d.c lzfP.h multi.o: multi.c redis.h fmacros.h config.h ae.h sds.h dict.h adlist.h \ @@ -163,8 +163,8 @@ t_string.o: t_string.c redis.h fmacros.h config.h ae.h sds.h dict.h \ t_zset.o: t_zset.c redis.h fmacros.h config.h ae.h sds.h dict.h adlist.h \ zmalloc.h anet.h zipmap.h ziplist.h intset.h version.h util.h util.o: util.c fmacros.h util.h -ziplist.o: ziplist.c zmalloc.h util.h ziplist.h endian.h -zipmap.o: zipmap.c zmalloc.h endian.h +ziplist.o: ziplist.c zmalloc.h util.h ziplist.h endianconv.h +zipmap.o: zipmap.c zmalloc.h endianconv.h zmalloc.o: zmalloc.c config.h zmalloc.h # Clean local objects when ARCH is different diff --git a/src/endian.c b/src/endian.c deleted file mode 100644 index 741f8bf2..00000000 --- a/src/endian.c +++ /dev/null @@ -1,80 +0,0 @@ -#include - -/* Toggle the 16 bit unsigned integer pointed by *p from little endian to - * big endian */ -void memrev16(void *p) { - unsigned char *x = p, t; - - t = x[0]; - x[0] = x[1]; - x[1] = t; -} - -/* Toggle the 32 bit unsigned integer pointed by *p from little endian to - * big endian */ -void memrev32(void *p) { - unsigned char *x = p, t; - - t = x[0]; - x[0] = x[3]; - x[3] = t; - t = x[1]; - x[1] = x[2]; - x[2] = t; -} - -/* Toggle the 64 bit unsigned integer pointed by *p from little endian to - * big endian */ -void memrev64(void *p) { - unsigned char *x = p, t; - - t = x[0]; - x[0] = x[7]; - x[7] = t; - t = x[1]; - x[1] = x[6]; - x[6] = t; - t = x[2]; - x[2] = x[5]; - x[5] = t; - t = x[3]; - x[3] = x[4]; - x[4] = t; -} - -uint16_t intrev16(uint16_t v) { - memrev16(&v); - return v; -} - -uint32_t intrev32(uint32_t v) { - memrev32(&v); - return v; -} - -uint64_t intrev64(uint64_t v) { - memrev64(&v); - return v; -} - -#ifdef TESTMAIN -#include - -int main(void) { - char buf[32]; - - sprintf(buf,"ciaoroma"); - memrev16(buf); - printf("%s\n", buf); - - sprintf(buf,"ciaoroma"); - memrev32(buf); - printf("%s\n", buf); - - sprintf(buf,"ciaoroma"); - memrev64(buf); - printf("%s\n", buf); - - return 0; -} -#endif diff --git a/src/endian.h b/src/endian.h deleted file mode 100644 index 75b91728..00000000 --- a/src/endian.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef __ENDIAN_H -#define __ENDIAN_H - -void memrev16(void *p); -void memrev32(void *p); -void memrev64(void *p); -uint16_t intrev16(uint16_t v); -uint32_t intrev32(uint32_t v); -uint64_t intrev64(uint64_t v); - -/* variants of the function doing the actual convertion only if the target - * host is big endian */ -#if (BYTE_ORDER == LITTLE_ENDIAN) -#define memrev16ifbe(p) -#define memrev32ifbe(p) -#define memrev64ifbe(p) -#define intrev16ifbe(v) (v) -#define intrev32ifbe(v) (v) -#define intrev64ifbe(v) (v) -#else -#define memrev16ifbe(p) memrev16(p) -#define memrev32ifbe(p) memrev32(p) -#define memrev64ifbe(p) memrev64(p) -#define intrev16ifbe(v) intrev16(v) -#define intrev32ifbe(v) intrev32(v) -#define intrev64ifbe(v) intrev64(v) -#endif - -#endif diff --git a/src/endianconv.c b/src/endianconv.c new file mode 100644 index 00000000..9adf09c1 --- /dev/null +++ b/src/endianconv.c @@ -0,0 +1,124 @@ +/* endinconv.c -- Endian conversions utilities. + * + * This functions are never called directly, but always using the macros + * defined into endianconv.h, this way we define everything is a non-operation + * if the arch is already little endian. + * + * Redis tries to encode everything as little endian (but a few things that need + * to be backward compatible are still in big endian) because most of the + * production environments are little endian, and we have a lot of conversions + * in a few places because ziplists, intsets, zipmaps, need to be endian-neutral + * even in memory, since they are serialied on RDB files directly with a single + * write(2) without other additional steps. + * + * ---------------------------------------------------------------------------- + * + * Copyright (c) 2011-2012, Salvatore Sanfilippo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + + +#include + +/* Toggle the 16 bit unsigned integer pointed by *p from little endian to + * big endian */ +void memrev16(void *p) { + unsigned char *x = p, t; + + t = x[0]; + x[0] = x[1]; + x[1] = t; +} + +/* Toggle the 32 bit unsigned integer pointed by *p from little endian to + * big endian */ +void memrev32(void *p) { + unsigned char *x = p, t; + + t = x[0]; + x[0] = x[3]; + x[3] = t; + t = x[1]; + x[1] = x[2]; + x[2] = t; +} + +/* Toggle the 64 bit unsigned integer pointed by *p from little endian to + * big endian */ +void memrev64(void *p) { + unsigned char *x = p, t; + + t = x[0]; + x[0] = x[7]; + x[7] = t; + t = x[1]; + x[1] = x[6]; + x[6] = t; + t = x[2]; + x[2] = x[5]; + x[5] = t; + t = x[3]; + x[3] = x[4]; + x[4] = t; +} + +uint16_t intrev16(uint16_t v) { + memrev16(&v); + return v; +} + +uint32_t intrev32(uint32_t v) { + memrev32(&v); + return v; +} + +uint64_t intrev64(uint64_t v) { + memrev64(&v); + return v; +} + +#ifdef TESTMAIN +#include + +int main(void) { + char buf[32]; + + sprintf(buf,"ciaoroma"); + memrev16(buf); + printf("%s\n", buf); + + sprintf(buf,"ciaoroma"); + memrev32(buf); + printf("%s\n", buf); + + sprintf(buf,"ciaoroma"); + memrev64(buf); + printf("%s\n", buf); + + return 0; +} +#endif diff --git a/src/endianconv.h b/src/endianconv.h new file mode 100644 index 00000000..7ee8917a --- /dev/null +++ b/src/endianconv.h @@ -0,0 +1,61 @@ +/* See endianconv.c top comments for more information + * + * ---------------------------------------------------------------------------- + * + * Copyright (c) 2011-2012, Salvatore Sanfilippo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __ENDIANCONV_H +#define __ENDIANCONV_H + +void memrev16(void *p); +void memrev32(void *p); +void memrev64(void *p); +uint16_t intrev16(uint16_t v); +uint32_t intrev32(uint32_t v); +uint64_t intrev64(uint64_t v); + +/* variants of the function doing the actual convertion only if the target + * host is big endian */ +#if (BYTE_ORDER == LITTLE_ENDIAN) +#define memrev16ifbe(p) +#define memrev32ifbe(p) +#define memrev64ifbe(p) +#define intrev16ifbe(v) (v) +#define intrev32ifbe(v) (v) +#define intrev64ifbe(v) (v) +#else +#define memrev16ifbe(p) memrev16(p) +#define memrev32ifbe(p) memrev32(p) +#define memrev64ifbe(p) memrev64(p) +#define intrev16ifbe(v) intrev16(v) +#define intrev32ifbe(v) intrev32(v) +#define intrev64ifbe(v) intrev64(v) +#endif + +#endif diff --git a/src/intset.c b/src/intset.c index 9df7936b..225f0e92 100644 --- a/src/intset.c +++ b/src/intset.c @@ -3,7 +3,7 @@ #include #include "intset.h" #include "zmalloc.h" -#include "endian.h" +#include "endianconv.h" /* Note that these encodings are ordered, so: * INTSET_ENC_INT16 < INTSET_ENC_INT32 < INTSET_ENC_INT64. */ diff --git a/src/ziplist.c b/src/ziplist.c index 113e71d9..4ecd1885 100644 --- a/src/ziplist.c +++ b/src/ziplist.c @@ -69,7 +69,7 @@ #include "zmalloc.h" #include "util.h" #include "ziplist.h" -#include "endian.h" +#include "endianconv.h" #define ZIP_END 255 #define ZIP_BIGLEN 254 diff --git a/src/zipmap.c b/src/zipmap.c index 65ed29c8..1f11fd42 100644 --- a/src/zipmap.c +++ b/src/zipmap.c @@ -80,7 +80,7 @@ #include #include #include "zmalloc.h" -#include "endian.h" +#include "endianconv.h" #define ZIPMAP_BIGLEN 254 #define ZIPMAP_END 255 -- 2.47.2