summaryrefslogtreecommitdiffstats
path: root/src/H5Ofphdf5.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Ofphdf5.c')
-rw-r--r--src/H5Ofphdf5.c519
1 files changed, 519 insertions, 0 deletions
diff --git a/src/H5Ofphdf5.c b/src/H5Ofphdf5.c
new file mode 100644
index 0000000..a93611b
--- /dev/null
+++ b/src/H5Ofphdf5.c
@@ -0,0 +1,519 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by the Board of Trustees of the University of Illinois. *
+ * All rights reserved. *
+ * *
+ * This file is part of HDF5. The full HDF5 copyright notice, including *
+ * terms governing use, modification, and redistribution, is contained in *
+ * the files COPYING and Copyright.html. COPYING can be found at the root *
+ * of the source code distribution tree; Copyright.html can be found at the *
+ * root level of an installed copy of the electronic HDF5 document set and *
+ * is linked from the top-level documents page. It can also be found at *
+ * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *
+ * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* $Id$ */
+
+#define H5P_PACKAGE /* prevent warning from including H5Ppkg.h */
+#define H5S_PACKAGE /* prevent warning from including H5Spkg.h */
+
+#include "H5private.h" /* Generic functions */
+#include "H5Eprivate.h" /* Error handling */
+#include "H5FLprivate.h" /* Free lists */
+#include "H5MMprivate.h" /* Memory management */
+#include "H5Oprivate.h" /* Object headers */
+#include "H5Rprivate.h"
+#include "H5Ppkg.h"
+#include "H5Spkg.h"
+
+#if defined (WIN32) && !defined (__MWERKS__)
+#include <sys/types.h>
+#include <sys/timeb.h>
+#endif
+
+#ifdef H5_HAVE_FPHDF5
+
+#define PABLO_MASK H5O_fphdf5_mask
+
+/* local prototypes */
+static void *H5O_fphdf5_decode(H5F_t *f, const uint8_t *p, H5O_shared_t *sh);
+static herr_t H5O_fphdf5_encode(H5F_t *f, uint8_t *p, const void *_mesg);
+static size_t H5O_fphdf5_size(H5F_t *f, const void *_mesg);
+static herr_t H5O_fphdf5_reset(void *_mesg);
+static herr_t H5O_fphdf5_free(void *_mesg);
+static herr_t H5O_fphdf5_debug(H5F_t *f, const void *_mesg,
+ FILE *stream, int indent, int fwidth);
+
+/* This message derives from H5O */
+const H5O_class_t H5O_FPHDF5[1] = {{
+ H5O_FPHDF5_ID, /* message id number */
+ "fphdf5", /* message name for debugging */
+ sizeof(H5O_fphdf5_t), /* native message size */
+ H5O_fphdf5_decode, /* decode message */
+ H5O_fphdf5_encode, /* encode message */
+ NULL, /* copy the native value */
+ H5O_fphdf5_size, /* size of symbol table entry */
+ H5O_fphdf5_reset, /* default reset method */
+ H5O_fphdf5_free, /* free method */
+ NULL, /* get share method */
+ NULL, /* set share method */
+ H5O_fphdf5_debug, /* debug the message */
+}};
+
+#define H5O_FPHDF5_VERSION 1
+
+/* Is the interface initialized? */
+static int interface_initialize_g = 0;
+
+#define INTERFACE_INIT NULL
+
+/* Define the free list for H5O_fphdf5_t's */
+H5FL_DEFINE_STATIC(H5O_fphdf5_t);
+
+/* Declare external the free list for hsize_t arrays */
+H5FL_ARR_EXTERN(hsize_t);
+
+/*
+ * Function: H5O_fphdf5_decode
+ * Purpose: Decode a metadata message from the SAP and return a pointer to
+ * a memory struct with the decoded information.
+ *
+ * This function decodes the "raw" form of a metadata message
+ * sent from the SAP into a struct in memory native format. The
+ * struct is allocated within this function using malloc() and is
+ * returned to the caller.
+ *
+ * H5F_t *f IN: pointer to the HDF5 file struct
+ * uint8 *p OUT: the raw information buffer
+ * H5O_shared_t *sh IN: not used; must be NULL
+ *
+ * Return: Success: Pointer to the new message in native order
+ * Failure: NULL
+ * Programmer: Bill Wendling, 20. August 2002
+ * Modifications:
+ */
+static void *
+H5O_fphdf5_decode(H5F_t *f, const uint8_t *p, H5O_shared_t UNUSED *sh)
+{
+ H5O_fphdf5_t *fmeta = NULL; /* New FPHDF5 metadata structure */
+ void *ret_value;
+ unsigned int i;
+
+ FUNC_ENTER_NOAPI(H5O_fphdf5_decode, NULL);
+
+ /* check args */
+ assert(f);
+ assert(p);
+ assert(!sh);
+
+ /* decode */
+ fmeta = H5FL_ALLOC(H5O_fphdf5_t, 1);
+
+ /* decode the OID first */
+ for (i = 0; i < sizeof(fmeta->oid); ++i)
+ fmeta->oid[i] = p[i];
+
+ /* jump past the OID part */
+ p += sizeof(fmeta->oid);
+
+ /* decode the dataspace dimensions next */
+ fmeta->sdim = H5O_SDSPACE[0].decode(f, p, NULL);
+
+ if (!fmeta->sdim)
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+
+ /* jump past the dataspace dimensions part */
+ p += H5O_SDSPACE[0].raw_size(f, fmeta->sdim);
+
+ /* decode the datatype next */
+ fmeta->dtype = H5O_DTYPE[0].decode(f, p, NULL);
+
+ if (!fmeta->dtype)
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+
+ /* jump past the datatype part */
+ p += H5O_DTYPE[0].raw_size(f, fmeta->dtype);
+
+ /* decode the modification time next */
+ fmeta->mtime = H5O_DTYPE[0].decode(f, p, NULL);
+
+ if (!fmeta->dtype)
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+
+ /* jump past the modification time part */
+ p += H5O_MTIME[0].raw_size(f, fmeta->mtime);
+
+ /* decode the group the modification took place in */
+ fmeta->group = H5O_NAME[0].decode(f, p, NULL);
+
+ if (!fmeta->group)
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+
+ /* jump past the group name part */
+ p += H5O_NAME[0].raw_size(f, fmeta->group);
+
+ /* decode the dataset the modification took place in */
+ fmeta->dset = H5O_NAME[0].decode(f, p, NULL);
+
+ if (!fmeta->dset)
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+
+ /* jump past the dataset name part */
+ p += H5O_NAME[0].raw_size(f, fmeta->dset);
+
+ /* decode the property list last */
+ fmeta->plist = H5O_PLIST[0].decode(f, p, NULL);
+
+ if (!fmeta->plist)
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+
+ /* Set return value */
+ ret_value = (void *)fmeta; /*success*/
+
+done:
+ if (!ret_value && fmeta) {
+ /* free up fmeta */
+ if (H5O_SDSPACE[0].free)
+ H5O_SDSPACE[0].free(fmeta->sdim);
+
+ if (H5O_DTYPE[0].free)
+ H5O_DTYPE[0].free(fmeta->dtype);
+
+ if (H5O_MTIME[0].free)
+ H5O_MTIME[0].free(fmeta->mtime);
+
+ if (H5O_PLIST[0].free)
+ H5O_PLIST[0].free(fmeta->plist);
+
+ H5FL_FREE(H5O_fphdf5_t, fmeta);
+ }
+
+ FUNC_LEAVE(ret_value);
+}
+
+/*
+ * Function: H5O_fphdf5_encode
+ * Purpose: Encode a metadata message for the SAP and return a pointer to
+ * a memory struct with the encoded information.
+ *
+ * This function encodes the "raw" form of a metadata message
+ * sent from the SAP into a struct in memory native format.
+ *
+ * H5F_t *f IN: pointer to the HDF5 file struct
+ * uint8 *p OUT: the raw information buffer
+ * const void *mesg IN: pointer to the metadata to encode
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ * Programmer: Bill Wendling, 21. August 2002
+ * Modifications:
+ */
+static herr_t
+H5O_fphdf5_encode(H5F_t *f, uint8_t *p, const void *mesg)
+{
+ const H5O_fphdf5_t *fmeta = (const H5O_fphdf5_t *)mesg;
+ herr_t ret_value = SUCCEED;
+ unsigned int i;
+
+ FUNC_ENTER_NOAPI(H5O_fphdf5_encode, FAIL);
+
+ /* check args */
+ assert(f);
+ assert(p);
+ assert(fmeta);
+
+ /* encode the OID first */
+ for (i = 0; i < sizeof(fmeta->oid); ++i)
+ p[i] = fmeta->oid[i];
+
+ /* jump past the OID part */
+ p += sizeof(fmeta->oid);
+
+ /* encode the dataspace dimensions next */
+ ret_value = H5O_SDSPACE[0].encode(f, p, fmeta->sdim);
+
+ if (ret_value < 0)
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed");
+
+ /* jump past the dataspace dimensions part */
+ p += H5O_SDSPACE[0].raw_size(f, fmeta->sdim);
+
+ /* encode the datatype next */
+ ret_value = H5O_DTYPE[0].encode(f, p, fmeta->dtype);
+
+ if (ret_value < 0)
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed");
+
+ /* jump past the datatype part */
+ p += H5O_DTYPE[0].raw_size(f, fmeta->dtype);
+
+ /* encode the modification time next */
+ ret_value = H5O_DTYPE[0].encode(f, p, fmeta->mtime);
+
+ if (ret_value < 0)
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed");
+
+ /* jump past the modification time part */
+ p += H5O_MTIME[0].raw_size(f, fmeta->mtime);
+
+ /* encode the group name next */
+ ret_value = H5O_NAME[0].encode(f, p, fmeta->group);
+
+ if (ret_value < 0)
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed");
+
+ /* jump past the group name part */
+ p += H5O_NAME[0].raw_size(f, fmeta->group);
+
+ /* encode the dataset name next */
+ ret_value = H5O_NAME[0].encode(f, p, fmeta->dset);
+
+ if (ret_value < 0)
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed");
+
+ /* jump past the dataset name part */
+ p += H5O_NAME[0].raw_size(f, fmeta->dset);
+
+ /* decode the property list last */
+ ret_value = H5O_PLIST[0].encode(f, p, fmeta->plist);
+
+ if (ret_value < 0)
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed");
+
+done:
+ FUNC_LEAVE(ret_value);
+}
+
+/*
+ * Function: H5O_fphdf5_copy
+ * Purpose: Copies a metadata object from MESG to DEST allocating DEST if
+ * necessary.
+ *
+ * const void *mesg IN: pointer to the metadata to copy
+ * const void *dest OUT: pointer to the destination metadata struct
+ *
+ * Return: Success: Pointer to DEST
+ * Failure: NULL
+ * Programmer: Bill Wendling, 21. August 2002
+ * Modifications:
+ */
+static void *
+H5O_fphdf5_copy(const void *mesg, void *dest)
+{
+ const H5O_fphdf5_t *src = (const H5O_fphdf5_t *)mesg;
+ H5O_fphdf5_t *dst = (H5O_fphdf5_t *)dest;
+ void *ret_value;
+ unsigned int i;
+
+ FUNC_ENTER_NOAPI(H5O_fphdf5_copy, NULL);
+
+ /* check args */
+ assert(src);
+
+ if (!dst && NULL == (dst = H5FL_ALLOC(H5O_fphdf5_t, 0)))
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+
+ /* copy the individual metadata*/
+ for (i = 0; i < sizeof(src->oid); ++i)
+ dst->oid[i] = src->oid[i];
+
+ H5O_SDSPACE[0].copy(src->sdim, dst->sdim);
+ H5O_DTYPE[0].copy(src->dtype, dst->dtype);
+ H5O_MTIME[0].copy(src->mtime, dst->mtime);
+ H5O_NAME[0].copy(src->group, dst->group);
+ H5O_NAME[0].copy(src->dset, dst->dset);
+
+ if (H5O_PLIST[0].copy)
+ H5O_PLIST[0].copy(src->plist, dst->plist);
+
+ /* Set return value */
+ ret_value = dst;
+
+done:
+ FUNC_LEAVE(ret_value);
+}
+
+/*
+ * Function: H5O_fphdf5_size
+ * Purpose: Return the raw message size in bytes.
+ *
+ * This function returns the size of hte raw simple
+ * dimensionality, datatype, and object path message on succes.
+ * (Not counting the message type or size fields, only the data
+ * portion of the message). It doesn't take into account
+ * alignment.
+ *
+ * H5F_t *f IN: pointer to the HDF5 file struct
+ * const void *mesg IN: pointer to the metadata structure
+ *
+ * Return: Success: Size of message
+ * Failure: 0
+ * Programmer: Bill Wendling, 21. August 2002
+ * Modifications:
+ */
+static size_t
+H5O_fphdf5_size(H5F_t *f, const void *mesg)
+{
+ const H5O_fphdf5_t *fmeta = (const H5O_fphdf5_t *)mesg;
+ size_t ret_value;
+
+ FUNC_ENTER_NOAPI(H5O_fphdf5_size, 0);
+
+ /* add in the metadata sizes */
+ ret_value = sizeof(fmeta->oid);
+ ret_value += H5O_SDSPACE[0].raw_size(f, fmeta->sdim);
+ ret_value += H5O_DTYPE[0].raw_size(f, fmeta->dtype);
+ ret_value += H5O_MTIME[0].raw_size(f, fmeta->mtime);
+ ret_value += H5O_NAME[0].raw_size(f, fmeta->group);
+ ret_value += H5O_NAME[0].raw_size(f, fmeta->dset);
+ ret_value += H5O_PLIST[0].raw_size(f, fmeta->plist);
+
+done:
+ FUNC_LEAVE(ret_value);
+}
+
+/*
+ * Function: H5O_fphdf5_reset
+ * Purpose: Frees the inside of a metadata message and resets it to some
+ * initial value.
+ *
+ * const void *mesg IN: pointer to the metadata to reset
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ * Programmer: Bill Wendling, 21. August 2002
+ * Modifications:
+ */
+static herr_t
+H5O_fphdf5_reset(void *mesg)
+{
+ H5O_fphdf5_t *fmeta = (H5O_fphdf5_t *)mesg;
+ herr_t ret_value = SUCCEED;
+ unsigned int i;
+
+ FUNC_ENTER_NOAPI(H5O_fphdf5_reset, FAIL);
+
+ /* reset the metadata */
+ for (i = 0; i < sizeof(fmeta->oid); ++i)
+ fmeta->oid[i] = '\0';
+
+ if (H5O_SDSPACE[0].reset)
+ ret_value = H5O_SDSPACE[0].reset(fmeta->sdim);
+
+ if (H5O_DTYPE[0].reset)
+ ret_value = H5O_DTYPE[0].reset(fmeta->dtype);
+
+ if (H5O_MTIME[0].reset)
+ ret_value = H5O_MTIME[0].reset(fmeta->mtime);
+
+ if (H5O_NAME[0].reset)
+ ret_value = H5O_NAME[0].reset(fmeta->group);
+
+ if (H5O_NAME[0].reset)
+ ret_value = H5O_NAME[0].reset(fmeta->dset);
+
+ if (H5O_PLIST[0].reset)
+ ret_value = H5O_PLIST[0].reset(fmeta->plist);
+
+done:
+ FUNC_LEAVE(ret_value);
+}
+
+/*
+ * Function: H5O_fphdf5_free
+ * Purpose: Free's the message
+ *
+ * const void *mesg IN: pointer to the metadata to free
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ * Programmer: Bill Wendling, 21. August 2002
+ * Modifications:
+ */
+static herr_t
+H5O_fphdf5_free(void *mesg)
+{
+ H5O_fphdf5_t *fmeta = (H5O_fphdf5_t *)mesg;
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_NOAPI(H5O_fphdf5_free, FAIL);
+ assert(fmeta);
+
+ /* reset the metadata */
+ if (H5O_SDSPACE[0].free)
+ ret_value = H5O_SDSPACE[0].free(fmeta->sdim);
+
+ if (H5O_DTYPE[0].free)
+ ret_value = H5O_DTYPE[0].free(fmeta->dtype);
+
+ if (H5O_MTIME[0].free)
+ ret_value = H5O_MTIME[0].free(fmeta->mtime);
+
+ if (H5O_NAME[0].free)
+ ret_value = H5O_NAME[0].free(fmeta->group);
+
+ if (H5O_NAME[0].free)
+ ret_value = H5O_NAME[0].free(fmeta->dset);
+
+ if (H5O_PLIST[0].free)
+ ret_value = H5O_PLIST[0].free(fmeta->plist);
+
+ H5FL_FREE(H5O_fphdf5_t, fmeta);
+
+done:
+ FUNC_LEAVE(ret_value);
+}
+
+/*
+ * Function: H5O_fphdf5_debug
+ * Purpose: Prints debugging information for the metadata message.
+ *
+ * H5F_t *f IN: pointer to the HDF5 file struct
+ * const void *mesg IN: Pointer to the source metadata struct
+ * FILE *stream IN: Pointer to the stream for output data
+ * int indent IN: Amount to indent information by
+ * int fwidth IN: Field width (?)
+ *
+ * Return: Success: Non-negative
+ * Failure: Negative
+ * Programmer: Bill Wendling, 22. August 2002
+ * Modifications:
+ */
+static herr_t
+H5O_fphdf5_debug(H5F_t UNUSED *f, const void *mesg,
+ FILE * stream, int indent, int fwidth)
+{
+ const H5O_fphdf5_t *fmeta = (const H5O_fphdf5_t *) mesg;
+ herr_t ret_value = SUCCEED;
+ unsigned int i;
+
+ FUNC_ENTER_NOAPI(H5O_fphdf5_debug, FAIL);
+
+ /* check args */
+ assert(f);
+ assert(fmeta);
+ assert(stream);
+ assert(indent >= 0);
+ assert(fwidth >= 0);
+
+ HDfprintf(stream, "%*s%-*s\n", indent, "", fwidth, "Metadata:");
+ HDfprintf(stream, "%*sOID: 0x", indent + 1, "");
+
+ for (i = 0; i < sizeof(fmeta->oid); ++i)
+ HDfprintf(stream, "%02x", fmeta->oid[i]);
+
+ HDfprintf(stream, "\n");
+ ret_value = H5O_SDSPACE[0].debug(f, fmeta->sdim, stream, indent + 1, fwidth);
+ ret_value = H5O_DTYPE[0].debug(f, fmeta->dtype, stream, indent + 1, fwidth);
+ ret_value = H5O_MTIME[0].debug(f, fmeta->mtime, stream, indent + 1, fwidth);
+ ret_value = H5O_NAME[0].debug(f, fmeta->group, stream, indent + 1, fwidth);
+ ret_value = H5O_NAME[0].debug(f, fmeta->dset, stream, indent + 1, fwidth);
+ ret_value = H5O_PLIST[0].debug(f, fmeta->plist, stream, indent + 1, fwidth);
+
+ HDfprintf(stream, "}\n");
+
+done:
+ FUNC_LEAVE(ret_value);
+}
+
+#endif /* H5_HAVE_FPHDF5 */