summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>1997-09-15 19:05:44 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>1997-09-15 19:05:44 (GMT)
commitdcdc0d7dfff8359ef5bdb65551b23a166a75a116 (patch)
tree9732b0776c261848e58257bd8e815c8b67c3863f /src
parentfa71cbdf8e52e9efcd93bcdf3ce3814ce22f2df1 (diff)
downloadhdf5-dcdc0d7dfff8359ef5bdb65551b23a166a75a116.zip
hdf5-dcdc0d7dfff8359ef5bdb65551b23a166a75a116.tar.gz
hdf5-dcdc0d7dfff8359ef5bdb65551b23a166a75a116.tar.bz2
[svn-r80] Byte-swapping datatype conversion routine added for basic portability of
data files. Further enhancements will need to be made to support "weird" architectures.
Diffstat (limited to 'src')
-rw-r--r--src/H5Dconv.c131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/H5Dconv.c b/src/H5Dconv.c
new file mode 100644
index 0000000..63ff539
--- /dev/null
+++ b/src/H5Dconv.c
@@ -0,0 +1,131 @@
+/****************************************************************************
+* NCSA HDF *
+* Software Development Group *
+* National Center for Supercomputing Applications *
+* University of Illinois at Urbana-Champaign *
+* 605 E. Springfield, Champaign IL 61820 *
+* *
+* For conditions of distribution and use, see the accompanying *
+* hdf/COPYING file. *
+* *
+****************************************************************************/
+
+#ifdef RCSID
+static char RcsId[] = "@(#)$Revision$";
+#endif
+
+/* $Id$ */
+
+/*LINTLIBRARY */
+/*+
+ FILE
+ H5Dconv.c
+ HDF5 trivial datatype converion routines
+
+ EXPORTED ROUTINES
+
+ LIBRARY-SCOPED ROUTINES
+
+ LOCAL ROUTINES
+ + */
+
+#include <H5private.h> /* Generic Functions */
+#include <H5Dprivate.h> /* Dataset functions */
+#include <H5Eprivate.h> /* Error handling */
+
+#define PABLO_MASK H5D_mask
+
+/*--------------------- Locally scoped variables -----------------------------*/
+
+/* Whether we've installed the library termination function yet for this interface */
+static intn interface_initialize_g = FALSE;
+
+/*--------------------------------------------------------------------------
+ NAME
+ H5D_convert_buf
+ PURPOSE
+ Byte-Swap a buffer of data
+ USAGE
+ herr_t H5D_convert_buf(dst, src, len, size)
+ VOIDP dst; OUT: Buffer to fill with converted data
+ VOIDP src; IN: Buffer to converted data from
+ uintn len; IN: Number of bytes to convert
+ uintn size; IN: Size of quantity to byte-swap
+ RETURNS
+ SUCCEED/FAIL
+ DESCRIPTION
+ This function is a byte-swapping memcpy.
+--------------------------------------------------------------------------*/
+herr_t H5D_convert_buf(void *dst, const void *src, uintn len, uintn size)
+{
+ const char *s=(const char *)src;
+ char *d=(char *)dst;
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER(H5D_convert_buf, NULL, FAIL);
+
+ /* Clear errors and check args and all the boring stuff. */
+ H5ECLEAR;
+ assert(dst);
+ assert(src);
+ assert(len>0);
+ assert(size==8 || size==4 || size==2 || size==1);
+
+ switch(size)
+ {
+ case 1: /* straight memcpy() */
+ HDmemcpy(d,s,len);
+ break;
+
+ case 2: /* 2-byte swapping */
+ while(len>0)
+ {
+ *d++=*(s+1);
+ *d++=*s;
+ s+=2;
+ len-=2;
+ } /* end while */
+ break;
+
+ case 4: /* 4-byte swapping */
+ while(len>0)
+ {
+ *d++=*(s+3);
+ *d++=*(s+2);
+ *d++=*(s+1);
+ *d++=*s;
+ s+=4;
+ len-=4;
+ } /* end while */
+ break;
+
+ case 8: /* 8-byte swapping */
+ while(len>0)
+ {
+ *d++=*(s+7);
+ *d++=*(s+6);
+ *d++=*(s+5);
+ *d++=*(s+4);
+ *d++=*(s+3);
+ *d++=*(s+2);
+ *d++=*(s+1);
+ *d++=*s;
+ s+=8;
+ len-=8;
+ } /* end while */
+ break;
+
+ default:
+ HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL);
+ } /* end switch */
+
+done:
+ if(ret_value == FAIL)
+ { /* Error condition cleanup */
+
+ } /* end if */
+
+ /* Normal function cleanup */
+
+ FUNC_LEAVE(ret_value);
+} /* end H5D_convert_buf() */