diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 1997-09-15 19:05:44 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 1997-09-15 19:05:44 (GMT) |
commit | dcdc0d7dfff8359ef5bdb65551b23a166a75a116 (patch) | |
tree | 9732b0776c261848e58257bd8e815c8b67c3863f /src | |
parent | fa71cbdf8e52e9efcd93bcdf3ce3814ce22f2df1 (diff) | |
download | hdf5-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.c | 131 |
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() */ |