mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-01-18 15:15:56 +08:00
[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.
This commit is contained in:
parent
fa71cbdf8e
commit
dcdc0d7dff
131
src/H5Dconv.c
Normal file
131
src/H5Dconv.c
Normal file
@ -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() */
|
Loading…
Reference in New Issue
Block a user