summaryrefslogtreecommitdiffstats
path: root/src/H5Ocomp.c
diff options
context:
space:
mode:
authorRobb Matzke <matzke@llnl.gov>1998-04-17 21:29:43 (GMT)
committerRobb Matzke <matzke@llnl.gov>1998-04-17 21:29:43 (GMT)
commit011457075e41d587c47f89250514b3393a78d329 (patch)
treed9b12f2ffc87b12575607102d207a60cd52214b9 /src/H5Ocomp.c
parentb59ab36893949af14c403ab46cbdb397f0a24f5b (diff)
downloadhdf5-011457075e41d587c47f89250514b3393a78d329.zip
hdf5-011457075e41d587c47f89250514b3393a78d329.tar.gz
hdf5-011457075e41d587c47f89250514b3393a78d329.tar.bz2
[svn-r353] Changes since 19980414
---------------------- ./html/Compression.html [NEW] ./html/Datasets.html ./html/H5.format.html ./html/H5.user.html Documented compression. A couple of the H5P functions aren't quite implemented yet but they're coming soon... ./src/H5Dprivate.h ./src/H5E.c ./src/H5Epublic.h ./src/H5Farray.c ./src/H5Fistore.c ./src/H5Fprivate.h ./src/H5MF.c ./src/H5MFprivate.h ./src/H5O.c ./src/H5Ocomp.c [NEW] ./src/H5Oprivate.h ./src/H5P.c ./src/H5Ppublic.h ./src/H5Sprivate.h ./src/H5Ssimp.c ./src/H5Z.c [NEW] ./src/H5Zprivate.h [NEW] ./src/H5Zpublic.h [NEW] ./src/Makefile.in ./src/hdf5.h ./test/dsets.c ./test/istore.c Compression is now mostly working. Don't try to open a compressed dataset though because the compression message won't be read. ./html/Datatypes.html ./html/H5.api.html ./src/H5.c ./src/H5private.h ./src/H5D.c ./src/H5T.c ./src/H5Tconv.c ./src/H5Tpkg.h ./src/H5Tprivate.h ./src/H5Tpublic.h Added timing support. When compiled with H5T_DEBUG defined the library will print conversion bandwidths when the library closes. The H5Tregister functions take a string as the first argument so the statistics output is meaningful. ./MANIFEST Added new files. ./configure.in ./src/H5config.h.in Check for getrusage(). Check for compress2() in libz.a and the zlib.h header file. Added `z' to the debug list. ./src/H5B.c ./src/H5Bprivate.h ./src/H5Gnode.c ./src/debug.c Cleaned up some indentation and added support to print istore B-trees. From the debugger, give the B-tree address and the dimensionality from the layout message of the object header. ./src/h5ls.c The oid is printed as w:x:y:z where w and x are the file ID and y and z are the OID within the file. You can give z or y*2^32+z as an argument to the debugger to print the object header for the object. ./src/H5AC.c Cleaned up statistics and made them match those reported by H5T and H5Z. ./src/H5MM.c ./src/H5MMprivate.h ./src/H5Fistore.c Finally got rid of a couple of long-standing const cast warnings.
Diffstat (limited to 'src/H5Ocomp.c')
-rw-r--r--src/H5Ocomp.c291
1 files changed, 291 insertions, 0 deletions
diff --git a/src/H5Ocomp.c b/src/H5Ocomp.c
new file mode 100644
index 0000000..6b6c2e7
--- /dev/null
+++ b/src/H5Ocomp.c
@@ -0,0 +1,291 @@
+/*
+ * Copyright (C) 1998 NCSA
+ * All rights reserved.
+ *
+ * Programmer: Robb Matzke <matzke@llnl.gov>
+ * Wednesday, April 15, 1998
+ *
+ * Purpose: Data compression message.
+ */
+#include <H5private.h>
+#include <H5Eprivate.h>
+#include <H5MMprivate.h>
+#include <H5Oprivate.h>
+
+#define PABLO_MASK H5O_comp_mask
+
+/* PRIVATE PROTOTYPES */
+static herr_t H5O_comp_encode (H5F_t *f, uint8 *p, const void *mesg);
+static void *H5O_comp_decode (H5F_t *f, const uint8 *p, H5HG_t *hobj);
+static void *H5O_comp_copy (const void *_mesg, void *_dest);
+static size_t H5O_comp_size (H5F_t *f, const void *_mesg);
+static herr_t H5O_comp_reset (void *_mesg);
+static herr_t H5O_comp_debug (H5F_t *f, const void *_mesg,
+ FILE * stream, intn indent, intn fwidth);
+
+/* This message derives from H5O */
+const H5O_class_t H5O_COMPRESS[1] = {{
+ H5O_COMPRESS_ID, /* message id number */
+ "compression", /* message name for debugging */
+ sizeof(H5O_compress_t), /* native message size */
+ H5O_comp_decode, /* decode message */
+ H5O_comp_encode, /* encode message */
+ H5O_comp_copy, /* copy the native value */
+ H5O_comp_size, /* size of raw message */
+ H5O_comp_reset, /* reset method */
+ NULL, /* share method */
+ H5O_comp_debug, /* debug the message */
+}};
+
+/* Interface initialization */
+static hbool_t interface_initialize_g = FALSE;
+#define INTERFACE_INIT NULL
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_comp_decode
+ *
+ * Purpose: Decodes a compression message.
+ *
+ * Return: Success: Ptr to the native message.
+ *
+ * Failure: NULL
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, April 15, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_comp_decode(H5F_t __unused__ *f, const uint8 *p, H5HG_t __unused__ *hobj)
+{
+ H5O_compress_t *comp = NULL;
+
+ FUNC_ENTER(H5O_comp_decode, NULL);
+
+ /* check args */
+ assert(p);
+
+ /* Decode */
+ comp = H5MM_xcalloc(1, sizeof *comp);
+ comp->method = *p++;
+ comp->flags = *p++;
+ UINT16DECODE (p, comp->cd_size);
+
+ if (comp->cd_size>0) {
+ comp->client_data = H5MM_xmalloc (comp->cd_size);
+ HDmemcpy (comp->client_data, p, comp->cd_size);
+ }
+
+ FUNC_LEAVE(comp);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_comp_encode
+ *
+ * Purpose: Encodes message MESG into buffer P.
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, April 15, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_comp_encode (H5F_t __unused__ *f, uint8 *p/*out*/, const void *mesg)
+{
+ const H5O_compress_t *comp = (const H5O_compress_t*)mesg;
+
+ FUNC_ENTER (H5O_comp_encode, FAIL);
+
+ /* Check args */
+ assert (p);
+ assert (mesg);
+
+ *p++ = comp->method;
+ *p++ = comp->flags;
+ UINT16ENCODE (p, comp->cd_size);
+ if (comp->cd_size) {
+ HDmemcpy (p, comp->client_data, comp->cd_size);
+ }
+
+ FUNC_LEAVE (SUCCEED);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_comp_copy
+ *
+ * Purpose: Copies a compression message from SRC to DST allocating DST
+ * if necessary. If DST is already allocated then we assume
+ * that it isn't initialized.
+ *
+ * Return: Success: Ptr to DST or allocated result.
+ *
+ * Failure: NULL
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, April 15, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_comp_copy (const void *_src, void *_dst/*out*/)
+{
+ const H5O_compress_t *src = (const H5O_compress_t *)_src;
+ H5O_compress_t *dst = (H5O_compress_t *)_dst;
+
+ FUNC_ENTER (H5O_comp_copy, NULL);
+
+ if (!dst) dst = H5MM_xmalloc (sizeof *dst);
+ *dst = *src;
+ if (src->cd_size>0) {
+ dst->client_data = H5MM_xmalloc (src->cd_size);
+ HDmemcpy (dst->client_data, src->client_data, src->cd_size);
+ }
+
+ FUNC_LEAVE (dst);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_comp_size
+ *
+ * Purpose: Determines the size of a raw compression message.
+ *
+ * Return: Success: Size of message.
+ *
+ * Failure: zero
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, April 15, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_comp_size (H5F_t __unused__ *f, const void *mesg)
+{
+ const H5O_compress_t *comp = (const H5O_compress_t*)mesg;
+
+ FUNC_ENTER (H5O_comp_size, 0);
+ FUNC_LEAVE (4+comp->cd_size);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_comp_reset
+ *
+ * Purpose: Resets a compression message by freeing the client data and
+ * setting all fields to zero. The MESG buffer is not freed.
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, April 15, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_comp_reset (void *mesg)
+{
+ H5O_compress_t *comp = (H5O_compress_t*)mesg;
+
+ FUNC_ENTER (H5O_comp_reset, FAIL);
+
+ assert (comp);
+ H5MM_xfree (comp->client_data);
+ HDmemset (comp, 0, sizeof *comp);
+
+ FUNC_LEAVE (SUCCEED);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5O_comp_debug
+ *
+ * Purpose: Prints debugging information for compression message MESG on
+ * output stream STREAM. Each line is indented INDENT
+ * characters and the field name takes up FWIDTH characters.
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, April 15, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_comp_debug (H5F_t __unused__ *f, const void *mesg, FILE *stream,
+ intn indent, intn fwidth)
+{
+ const H5O_compress_t *comp = (const H5O_compress_t *)mesg;
+ size_t i, j;
+
+ FUNC_ENTER(H5O_comp_debug, FAIL);
+
+ /* check args */
+ assert(f);
+ assert(comp);
+ assert(stream);
+ assert(indent >= 0);
+ assert(fwidth >= 0);
+
+ fprintf (stream, "%*s%-*s %d\n", indent, "", fwidth,
+ "Method:",
+ (int)(comp->method));
+ fprintf (stream, "%*s%-*s 0x%02x\n", indent, "", fwidth,
+ "Flags:",
+ (unsigned)(comp->flags));
+ fprintf (stream, "%*s%-*s %lu\n", indent, "", fwidth,
+ "Size of client data:",
+ (unsigned long)(comp->cd_size));
+
+ if (comp->cd_size>0) {
+ fprintf (stream, "%*s%s\n", indent, "", "Client Data:");
+ for (i=0; i<comp->cd_size; i+=16) {
+ fprintf (stream, "%*s%04d: ", indent+3, "", i);
+ for (j=0; j<16; j++) {
+ if (8==j) putc (' ', stream);
+ if (i+j<comp->cd_size) {
+ fprintf (stream, "%02x ", comp->client_data[i+j]);
+ } else {
+ fputs (" ", stream);
+ }
+ }
+ for (j=0; j<16 && i+j<comp->cd_size; j++) {
+ if (8==j) putc (' ', stream);
+ if (comp->client_data[i+j]>' ' &&
+ comp->client_data[i+j]<='~') {
+ putc (comp->client_data[i+j], stream);
+ } else {
+ putc ('.', stream);
+ }
+ putc ('\n', stream);
+ }
+ }
+ } else {
+ fprintf (stream, "%*s%-*s None\n", indent, "", fwidth, "Client Data:");
+ }
+
+ FUNC_LEAVE(SUCCEED);
+}