summaryrefslogtreecommitdiff
path: root/indra/llcommon/llendianswizzle.h
diff options
context:
space:
mode:
authorJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
committerJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
commit420b91db29485df39fd6e724e782c449158811cb (patch)
treeb471a94563af914d3ed3edd3e856d21cb1b69945 /indra/llcommon/llendianswizzle.h
Print done when done.
Diffstat (limited to 'indra/llcommon/llendianswizzle.h')
-rw-r--r--indra/llcommon/llendianswizzle.h76
1 files changed, 76 insertions, 0 deletions
diff --git a/indra/llcommon/llendianswizzle.h b/indra/llcommon/llendianswizzle.h
new file mode 100644
index 0000000000..1794620b46
--- /dev/null
+++ b/indra/llcommon/llendianswizzle.h
@@ -0,0 +1,76 @@
+/**
+ * @file llendianswizzle.h
+ * @brief Functions for in-place bit swizzling
+ *
+ * Copyright (c) 2002-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#ifndef LL_LLENDIANSWIZZLE_H
+#define LL_LLENDIANSWIZZLE_H
+
+/* This function is intended to be used for in-place swizzling, particularly after fread() of
+ binary values from a file. Such as:
+
+ numRead = fread(scale.mV, sizeof(float), 3, fp);
+ llendianswizzle(scale.mV, sizeof(float), 3);
+
+ It assumes that the values in the file are LITTLE endian, so it's a no-op on a little endian machine.
+
+ It keys off of typesize to do the correct swizzle, so make sure that typesize is the size of the native type.
+
+ 64-bit types are not yet handled.
+*/
+
+#ifdef LL_LITTLE_ENDIAN
+ // little endian is native for most things.
+ inline void llendianswizzle(void *,int,int)
+ {
+ // Nothing to do
+ }
+#endif
+
+#ifdef LL_BIG_ENDIAN
+ // big endian requires a bit of work.
+ inline void llendianswizzle(void *p,int typesize, int count)
+ {
+ int i;
+ switch(typesize)
+ {
+ case 2:
+ {
+ U16 temp;
+ for(i=count ;i!=0 ;i--)
+ {
+ temp = ((U16*)p)[0];
+ ((U16*)p)[0] = ((temp >> 8) & 0x000000FF) | ((temp << 8) & 0x0000FF00);
+ p = (void*)(((U16*)p) + 1);
+ }
+ }
+ break;
+
+ case 4:
+ {
+ U32 temp;
+ for(i=count; i!=0; i--)
+ {
+ temp = ((U32*)p)[0];
+ ((U32*)p)[0] =
+ ((temp >> 24) & 0x000000FF) |
+ ((temp >> 8) & 0x0000FF00) |
+ ((temp << 8) & 0x00FF0000) |
+ ((temp << 24) & 0xFF000000);
+ p = (void*)(((U32*)p) + 1);
+ }
+ }
+ break;
+ }
+
+ }
+#endif
+
+// Use this when working with a single integral value you want swizzled
+
+#define llendianswizzleone(x) llendianswizzle(&(x), sizeof(x), 1)
+
+#endif // LL_LLENDIANSWIZZLE_H