summaryrefslogtreecommitdiff
path: root/src/H5Omtime.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Omtime.c')
-rw-r--r--src/H5Omtime.c500
1 files changed, 500 insertions, 0 deletions
diff --git a/src/H5Omtime.c b/src/H5Omtime.c
new file mode 100644
index 0000000..7e7baea
--- /dev/null
+++ b/src/H5Omtime.c
@@ -0,0 +1,500 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group. *
+ * 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 COPYING file, which can be found at the root of the source code *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. *
+ * If you do not have access to either file, you may request a copy from *
+ * help@hdfgroup.org. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer: Robb Matzke <matzke@llnl.gov>
+ * Friday, July 24, 1998
+ *
+ * Purpose: The object modification time message.
+ */
+
+#include "H5Omodule.h" /* This source code file is part of the H5O module */
+
+
+#include "H5private.h" /* Generic Functions */
+#include "H5Eprivate.h" /* Error handling */
+#include "H5FLprivate.h" /* Free lists */
+#include "H5MMprivate.h" /* Memory management */
+#include "H5Opkg.h" /* Object headers */
+
+
+static void *H5O_mtime_new_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+ unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_mtime_new_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static size_t H5O_mtime_new_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+
+static void *H5O_mtime_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+ unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_mtime_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static void *H5O_mtime_copy(const void *_mesg, void *_dest);
+static size_t H5O_mtime_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_mtime_reset(void *_mesg);
+static herr_t H5O_mtime_free(void *_mesg);
+static herr_t H5O_mtime_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *stream,
+ int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_MTIME[1] = {{
+ H5O_MTIME_ID, /*message id number */
+ "mtime", /*message name for debugging */
+ sizeof(time_t), /*native message size */
+ 0, /* messages are sharable? */
+ H5O_mtime_decode, /*decode message */
+ H5O_mtime_encode, /*encode message */
+ H5O_mtime_copy, /*copy the native value */
+ H5O_mtime_size, /*raw message size */
+ H5O_mtime_reset, /* reset method */
+ H5O_mtime_free, /* free method */
+ NULL, /* file delete method */
+ NULL, /* link method */
+ NULL, /*set share method */
+ NULL, /*can share method */
+ NULL, /* pre copy native value to file */
+ NULL, /* copy native value to file */
+ NULL, /* post copy native value to file */
+ NULL, /* get creation index */
+ NULL, /* set creation index */
+ H5O_mtime_debug /*debug the message */
+}};
+
+/* This message derives from H5O message class */
+/* (Only encode, decode & size routines are different from old mtime routines) */
+const H5O_msg_class_t H5O_MSG_MTIME_NEW[1] = {{
+ H5O_MTIME_NEW_ID, /*message id number */
+ "mtime_new", /*message name for debugging */
+ sizeof(time_t), /*native message size */
+ 0, /* messages are sharable? */
+ H5O_mtime_new_decode, /*decode message */
+ H5O_mtime_new_encode, /*encode message */
+ H5O_mtime_copy, /*copy the native value */
+ H5O_mtime_new_size, /*raw message size */
+ H5O_mtime_reset, /* reset method */
+ H5O_mtime_free, /* free method */
+ NULL, /* file delete method */
+ NULL, /* link method */
+ NULL, /*set share method */
+ NULL, /*can share method */
+ NULL, /* pre copy native value to file */
+ NULL, /* copy native value to file */
+ NULL, /* post copy native value to file */
+ NULL, /* get creation index */
+ NULL, /* set creation index */
+ H5O_mtime_debug /*debug the message */
+}};
+
+/* Current version of new mtime information */
+#define H5O_MTIME_VERSION 1
+
+/* Declare a free list to manage the time_t struct */
+H5FL_DEFINE(time_t);
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_mtime_new_decode
+ *
+ * Purpose: Decode a new modification time message and return a pointer to
+ * a new time_t value.
+ *
+ * The new modification time message format was added due to the
+ * performance overhead of the old format.
+ *
+ * Return: Success: Ptr to new message in native struct.
+ *
+ * Failure: NULL
+ *
+ * Programmer: Quincey Koziol
+ * koziol@ncsa.uiuc.edu
+ * Jan 3 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_mtime_new_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+ unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+ time_t *mesg;
+ uint32_t tmp_time; /* Temporary copy of the time */
+ void *ret_value = NULL; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT
+
+ /* check args */
+ HDassert(f);
+ HDassert(p);
+
+ /* decode */
+ if(*p++ != H5O_MTIME_VERSION)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for mtime message");
+
+ /* Skip reserved bytes */
+ p+=3;
+
+ /* Get the time_t from the file */
+ UINT32DECODE(p, tmp_time);
+
+ /* The return value */
+ if (NULL==(mesg = H5FL_MALLOC(time_t)))
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+ *mesg = (time_t)tmp_time;
+
+ /* Set return value */
+ ret_value=mesg;
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_mtime_new_decode() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_mtime_decode
+ *
+ * Purpose: Decode a modification time message and return a pointer to a
+ * new time_t value.
+ *
+ * The new modification time message format was added due to the
+ * performance overhead of the old format.
+ *
+ * Return: Success: Ptr to new message in native struct.
+ *
+ * Failure: NULL
+ *
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jul 24 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_mtime_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+ unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+ time_t *mesg, the_time;
+ struct tm tm;
+ int i; /* Local index variable */
+ void *ret_value = NULL; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT
+
+ /* check args */
+ HDassert(f);
+ HDassert(p);
+
+ /* decode */
+ for(i = 0; i < 14; i++)
+ if(!HDisdigit(p[i]))
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "badly formatted modification time message")
+
+ /* Convert YYYYMMDDhhmmss UTC to a time_t. */
+ HDmemset(&tm, 0, sizeof tm);
+ tm.tm_year = (p[0]-'0')*1000 + (p[1]-'0')*100 + (p[2]-'0')*10 + (p[3]-'0') - 1900;
+ tm.tm_mon = (p[4]-'0')*10 + (p[5]-'0') - 1;
+ tm.tm_mday = (p[6]-'0')*10 + (p[7]-'0');
+ tm.tm_hour = (p[8]-'0')*10 + (p[9]-'0');
+ tm.tm_min = (p[10]-'0')*10 + (p[11]-'0');
+ tm.tm_sec = (p[12]-'0')*10 + (p[13]-'0');
+ tm.tm_isdst = -1; /* (figure it out) */
+ if((time_t)-1 == (the_time = H5_make_time(&tm)))
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't construct time info")
+
+ /* The return value */
+ if(NULL == (mesg = H5FL_MALLOC(time_t)))
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+ *mesg = the_time;
+
+ /* Set return value */
+ ret_value = mesg;
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_mtime_decode() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_mtime_new_encode
+ *
+ * Purpose: Encodes a new modification time message.
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ * koziol@ncsa.uiuc.edu
+ * Jan 3 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_mtime_new_encode(H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+ const time_t *mesg = (const time_t *) _mesg;
+
+ FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+ /* check args */
+ HDassert(f);
+ HDassert(p);
+ HDassert(mesg);
+
+ /* Version */
+ *p++ = H5O_MTIME_VERSION;
+
+ /* Reserved bytes */
+ *p++ = 0;
+ *p++ = 0;
+ *p++ = 0;
+
+ /* Encode time */
+ UINT32ENCODE(p, *mesg);
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_mtime_new_encode() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_mtime_encode
+ *
+ * Purpose: Encodes a modification time message.
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jul 24 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_mtime_encode(H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+ const time_t *mesg = (const time_t *) _mesg;
+ struct tm *tm;
+
+ FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+ /* check args */
+ HDassert(f);
+ HDassert(p);
+ HDassert(mesg);
+
+ /* encode */
+ tm = HDgmtime(mesg);
+ sprintf((char*)p, "%04d%02d%02d%02d%02d%02d",
+ 1900+tm->tm_year, 1+tm->tm_mon, tm->tm_mday,
+ tm->tm_hour, tm->tm_min, tm->tm_sec);
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_mtime_copy
+ *
+ * Purpose: Copies a message from _MESG to _DEST, allocating _DEST if
+ * necessary.
+ *
+ * Return: Success: Ptr to _DEST
+ *
+ * Failure: NULL
+ *
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jul 24 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_mtime_copy(const void *_mesg, void *_dest)
+{
+ const time_t *mesg = (const time_t *) _mesg;
+ time_t *dest = (time_t *) _dest;
+ void *ret_value = NULL; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT
+
+ /* check args */
+ HDassert(mesg);
+ if (!dest && NULL==(dest = H5FL_MALLOC(time_t)))
+ HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+
+ /* copy */
+ *dest = *mesg;
+
+ /* Set return value */
+ ret_value=dest;
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_mtime_new_size
+ *
+ * Purpose: Returns the size of the raw message in bytes not
+ * counting the message type or size fields, but only the data
+ * fields. This function doesn't take into account
+ * alignment.
+ *
+ * Return: Success: Message data size in bytes w/o alignment.
+ *
+ * Failure: 0
+ *
+ * Programmer: Quincey Koziol
+ * koziol@ncsa.uiuc.edu
+ * Jan 3 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_mtime_new_size(const H5F_t H5_ATTR_UNUSED * f, hbool_t H5_ATTR_UNUSED disable_shared, const void H5_ATTR_UNUSED * mesg)
+{
+ FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+ /* check args */
+ HDassert(f);
+ HDassert(mesg);
+
+ FUNC_LEAVE_NOAPI(8)
+} /* end H5O_mtime_new_size() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_mtime_size
+ *
+ * Purpose: Returns the size of the raw message in bytes not
+ * counting the message type or size fields, but only the data
+ * fields. This function doesn't take into account
+ * alignment.
+ *
+ * Return: Success: Message data size in bytes w/o alignment.
+ *
+ * Failure: 0
+ *
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jul 14 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_mtime_size(const H5F_t H5_ATTR_UNUSED * f, hbool_t H5_ATTR_UNUSED disable_shared, const void H5_ATTR_UNUSED * mesg)
+{
+ FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+ /* check args */
+ HDassert(f);
+ HDassert(mesg);
+
+ FUNC_LEAVE_NOAPI(16)
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_mtime_reset
+ *
+ * Purpose: Frees resources within a modification time message, but doesn't free
+ * the message itself.
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ * Mondey, December 23, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_mtime_reset(void H5_ATTR_UNUSED *_mesg)
+{
+ FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_mtime_free
+ *
+ * Purpose: Free's the message
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ * Thursday, March 30, 2000
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_mtime_free(void *mesg)
+{
+ FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+ HDassert(mesg);
+
+ mesg = H5FL_FREE(time_t, mesg);
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_mtime_free() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_mtime_debug
+ *
+ * Purpose: Prints debugging info for the message.
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Robb Matzke
+ * matzke@llnl.gov
+ * Jul 24 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_mtime_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE *stream,
+ int indent, int fwidth)
+{
+ const time_t *mesg = (const time_t *)_mesg;
+ struct tm *tm;
+ char buf[128];
+
+ FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+ /* check args */
+ HDassert(f);
+ HDassert(mesg);
+ HDassert(stream);
+ HDassert(indent >= 0);
+ HDassert(fwidth >= 0);
+
+ /* debug */
+ tm = HDlocaltime(mesg);
+
+ HDstrftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
+ HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+ "Time:", buf);
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+}
+