Browse files

encoding.c/h added, this new functions make sure that even our in mem…

…ory represenation of encoded types is endianess agnostic, so we can save this stuff directly on disk without problems when reloading on a different arch.
  • Loading branch information...
1 parent 1f84b06 commit e8852d782d086f66c4a4483e45e825600dc37672 @antirez committed Apr 20, 2011
Showing with 83 additions and 0 deletions.
  1. +63 −0 src/endian.c
  2. +20 −0 src/endian.h
View
63 src/endian.c
@@ -0,0 +1,63 @@
+/* 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;
+}
+
+#ifdef TESTMAIN
+#include <stdio.h>
+
+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
View
20 src/endian.h
@@ -0,0 +1,20 @@
+#ifndef __ENDIAN_H
+#define __ENDIAN_H
+
+void memrev16(void *p);
+void memrev32(void *p);
+void memrev64(void *p);
+
+/* 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)
+#else
+#define memrev16ifbe(p) memrev16(p)
+#define memrev32ifbe(p) memrev32(p)
+#define memrev64ifbe(p) memrev64(p)
+#endif
+
+#endif

0 comments on commit e8852d7

Please sign in to comment.