summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorcvs2svn <no_author@cvs2svn>2004-01-06 17:53:16 (GMT)
committercvs2svn <no_author@cvs2svn>2004-01-06 17:53:16 (GMT)
commit64e365a48fece102cf43ed19634e36a53647ed4e (patch)
tree77bcff546cf7bfd0a401e5427f10e74e1436e922 /tools
parent83c7a8dfaa7a83b462a92f8b449ed73a92d26610 (diff)
downloadhdf5-64e365a48fece102cf43ed19634e36a53647ed4e.zip
hdf5-64e365a48fece102cf43ed19634e36a53647ed4e.tar.gz
hdf5-64e365a48fece102cf43ed19634e36a53647ed4e.tar.bz2
[svn-r8023] This commit was manufactured by cvs2svn to create branch 'hdf5_1_6'.
Diffstat (limited to 'tools')
-rw-r--r--tools/h5diff/testh5diff_basic.c498
-rw-r--r--tools/h5diff/testh5diff_main.c36
-rw-r--r--tools/h5diff/testh5diff_util.c99
-rw-r--r--tools/h5repack/h5repack_layout.c175
-rw-r--r--tools/lib/h5diff.h199
-rw-r--r--tools/lib/h5trav.h139
-rw-r--r--tools/lib/h5trav_table.c256
7 files changed, 1402 insertions, 0 deletions
diff --git a/tools/h5diff/testh5diff_basic.c b/tools/h5diff/testh5diff_basic.c
new file mode 100644
index 0000000..fe0282d
--- /dev/null
+++ b/tools/h5diff/testh5diff_basic.c
@@ -0,0 +1,498 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "testh5diff.h"
+
+
+/*UINT_MAX Maximum value for a variable of type unsigned int. 4294967295 */
+#define UIMAX 4294967295u
+
+
+
+/*
+
+# ##############################################################################
+# # Common usage
+# ##############################################################################
+
+
+# 1.0
+ -h
+
+# 1.1
+ file1.h5 file2.h5 g1/dset1 g1/dset2
+
+# 1.2
+ file1.h5 file2.h5 -n 2 g1/dset1 g1/dset2
+
+# 1.3
+ file1.h5 file2.h5 -d 5 g1/dset3 g1/dset4
+
+# 1.4
+ file1.h5 file2.h5 -p 0.05 g1/dset3 g1/dset4
+
+# 1.5
+ file1.h5 file2.h5 -r g1/dset1 g1/dset2
+
+# 1.6
+ file1.h5 file2.h5
+
+# ##############################################################################
+# # basic types
+# ##############################################################################
+
+# 2.0
+ file3.h5 file3.h5 dset group
+
+# 2.1
+ file3.h5 file3.h5 dset link
+
+# 2.2
+ file3.h5 file3.h5 dset type
+
+# 2.3
+ file3.h5 file3.h5 group group
+
+# 2.4
+ file3.h5 file3.h5 type type
+
+# 2.5
+ file3.h5 file3.h5 link link
+
+
+# ##############################################################################
+# # Dimensions
+# ##############################################################################
+
+# 4.0
+ file5.h5 file5.h5 dset1 dset2
+
+# 4.1
+ file5.h5 file5.h5 dset3 dset4
+
+# 4.2
+ file5.h5 file5.h5 dset5 dset6
+
+
+# ##############################################################################
+# # Dataset types
+# ##############################################################################
+
+# 5.0
+ file6.h5 file6.h5 dset0a dset0b
+
+# 5.1
+ file6.h5 file6.h5 dset1a dset1b
+
+# 5.2
+ file6.h5 file6.h5 dset2a dset2b
+
+# 5.3
+ file6.h5 file6.h5 dset3a dset4b
+
+# 5.4
+ file6.h5 file6.h5 dset4a dset4b
+
+# 5.5
+ file6.h5 file6.h5 dset5a dset5b
+
+# 5.6
+ file6.h5 file6.h5 dset6a dset6b
+
+# 5.7
+ file6.h5 file6.h5 dset7a dset7b
+
+# 5.8
+ file6.h5 file6.h5 dset8a dset8b
+
+# ##############################################################################
+# # Error messages
+# ##############################################################################
+
+
+# 6.0: Check if the command line number of arguments is less than 3
+ h5diff_test1.h5
+
+# 6.1: Check for invalid options
+ h5diff_test1.h5 h5diff_test2.h5 -x
+
+# ##############################################################################
+# # -d
+# ##############################################################################
+
+# 6.2: no value
+ file1.h5 file2.h5 -d g1/dset3 g1/dset4
+
+# 6.3: negative value
+ file1.h5 file2.h5 -d -4 g1/dset3 g1/dset4
+
+# 6.4: zero
+ file1.h5 file2.h5 -d 0 g1/dset3 g1/dset4
+
+# 6.5: non number
+ file1.h5 file2.h5 -d u g1/dset3 g1/dset4
+
+# 6.6: hexadecimal
+ file1.h5 file2.h5 -d 0x1 g1/dset3 g1/dset4
+
+# 6.7: string
+ file1.h5 file2.h5 -d "1" g1/dset3 g1/dset4
+
+# 6.8: repeated option
+ file1.h5 file2.h5 -d 1 -d 2 g1/dset3 g1/dset4
+
+# 6.9: number larger than biggest difference
+ file1.h5 file2.h5 -d 200 g1/dset3 g1/dset4
+
+# 6.10: number smaller than smallest difference
+ file1.h5 file2.h5 -d 1 g1/dset3 g1/dset4
+
+
+# ##############################################################################
+# # -p
+# ##############################################################################
+
+
+# 6.11: no value
+ file1.h5 file2.h5 -p g1/dset3 g1/dset4
+
+# 6.12: negative value
+ file1.h5 file2.h5 -p -4 g1/dset3 g1/dset4
+
+# 6.13: zero
+ file1.h5 file2.h5 -p 0 g1/dset3 g1/dset4
+
+# 6.14: non number
+ file1.h5 file2.h5 -p u g1/dset3 g1/dset4
+
+# 6.15: hexadecimal
+ file1.h5 file2.h5 -p 0x1 g1/dset3 g1/dset4
+
+# 6.16: string
+ file1.h5 file2.h5 -p "0.21" g1/dset3 g1/dset4
+
+# 6.17: repeated option
+ file1.h5 file2.h5 -p 0.21 -p 0.22 g1/dset3 g1/dset4
+
+# 6.18: number larger than biggest difference
+ file1.h5 file2.h5 -p 2 g1/dset3 g1/dset4
+
+# 6.19: number smaller than smallest difference
+ file1.h5 file2.h5 -p 0.005 g1/dset3 g1/dset4
+
+
+
+# ##############################################################################
+# # -n
+# ##############################################################################
+
+
+# 6.20: no value
+ file1.h5 file2.h5 -n g1/dset3 g1/dset4
+
+# 6.21: negative value
+ file1.h5 file2.h5 -n -4 g1/dset3 g1/dset4
+
+# 6.22: zero
+ file1.h5 file2.h5 -n 0 g1/dset3 g1/dset4
+
+# 6.23: non number
+ file1.h5 file2.h5 -n u g1/dset3 g1/dset4
+
+# 6.24: hexadecimal
+ file1.h5 file2.h5 -n 0x1 g1/dset3 g1/dset4
+
+# 6.25: string
+ file1.h5 file2.h5 -n "2" g1/dset3 g1/dset4
+
+# 6.26: repeated option
+ file1.h5 file2.h5 -n 2 -n 3 g1/dset3 g1/dset4
+
+# 6.27: number larger than biggest difference
+ file1.h5 file2.h5 -n 200 g1/dset3 g1/dset4
+
+# 6.28: number smaller than smallest difference
+ file1.h5 file2.h5 -n 1 g1/dset3 g1/dset4
+
+# ##############################################################################
+# # non valid files
+# ##############################################################################
+
+ file1.h6 file2.h6
+
+*/
+
+
+/*-------------------------------------------------------------------------
+ * Basic review tests
+ *-------------------------------------------------------------------------
+ */
+
+int test_basic(const char *file1, const char *file2)
+{
+
+ hid_t file1_id, file2_id;
+ hid_t group1_id, group2_id, group3_id;
+ herr_t status;
+ hsize_t dims[2] = { 3,2 };
+
+ /* Test */
+ double data1[3][2] = {{1,1},{1,1},{1,1}};
+ double data2[3][2] = {{1,1.1},{1.01,1.001},{1.0001,1}};
+ double data3[3][2] = {{100,110},{100,100},{100,100}};
+ double data4[3][2] = {{110,100},{90,80},{140,200}};
+
+/*-------------------------------------------------------------------------
+ * Create two files
+ *-------------------------------------------------------------------------
+ */
+
+ file1_id = H5Fcreate (file1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ file2_id = H5Fcreate (file2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+ /* Create groups */
+ group1_id = H5Gcreate(file1_id, "g1", 0);
+ group2_id = H5Gcreate(file2_id, "g1", 0);
+ group3_id = H5Gcreate(file2_id, "g2", 0);
+
+ write_dset(group1_id,2,dims,"dset1",H5T_NATIVE_DOUBLE,data1);
+ write_dset(group2_id,2,dims,"dset2",H5T_NATIVE_DOUBLE,data2);
+ write_dset(group1_id,2,dims,"dset3",H5T_NATIVE_DOUBLE,data3);
+ write_dset(group2_id,2,dims,"dset4",H5T_NATIVE_DOUBLE,data4);
+ write_dset(group2_id,2,dims,"dset1",H5T_NATIVE_DOUBLE,data2);
+
+/*-------------------------------------------------------------------------
+ * Close
+ *-------------------------------------------------------------------------
+ */
+ status = H5Gclose(group1_id);
+ status = H5Gclose(group2_id);
+ status = H5Gclose(group3_id);
+ status = H5Fclose(file1_id);
+ status = H5Fclose(file2_id);
+ return status;
+}
+
+/*-------------------------------------------------------------------------
+ * Compare different types: H5G_DATASET, H5G_TYPE, H5G_GROUP, H5G_LINK
+ *-------------------------------------------------------------------------
+ */
+
+int test_types(const char *file1, const char UNUSED *file2)
+{
+
+ hid_t file1_id;
+ hid_t group_id;
+ hid_t type_id;
+ herr_t status;
+ hsize_t dims[1]={1};
+ /* Compound datatype */
+ typedef struct s_t
+ {
+ int a;
+ float b;
+ } s_t;
+
+
+/*-------------------------------------------------------------------------
+ * Create one file
+ *-------------------------------------------------------------------------
+ */
+ file1_id = H5Fcreate (file1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+/*-------------------------------------------------------------------------
+ * H5G_DATASET
+ *-------------------------------------------------------------------------
+ */
+ write_dset(file1_id,1,dims,"dset",H5T_NATIVE_INT,0);
+
+/*-------------------------------------------------------------------------
+ * H5G_GROUP
+ *-------------------------------------------------------------------------
+ */
+ group_id = H5Gcreate(file1_id, "group", 0);
+ status = H5Gclose(group_id);
+
+/*-------------------------------------------------------------------------
+ * H5G_TYPE
+ *-------------------------------------------------------------------------
+ */
+
+ /* Create a memory compound datatype */
+ type_id = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+ H5Tinsert(type_id, "a", HOFFSET(s_t, a), H5T_NATIVE_INT);
+ H5Tinsert(type_id, "b", HOFFSET(s_t, b), H5T_NATIVE_FLOAT);
+ /* Commit compound datatype and close it */
+ H5Tcommit(file1_id, "type", type_id);
+ H5Tclose(type_id);
+
+/*-------------------------------------------------------------------------
+ * H5G_LINK
+ *-------------------------------------------------------------------------
+ */
+
+ status = H5Glink(file1_id, H5G_LINK_SOFT, "dset", "link");
+
+/*-------------------------------------------------------------------------
+ * Close
+ *-------------------------------------------------------------------------
+ */
+ status = H5Fclose(file1_id);
+ return status;
+}
+
+
+
+
+
+/*-------------------------------------------------------------------------
+ * Datasets datatypes
+ *-------------------------------------------------------------------------
+ */
+
+int test_native(const char *file1, const char UNUSED *file2)
+{
+
+ hid_t file1_id;
+ hsize_t dims[2]={3,2};
+ herr_t status;
+ char buf1a[3][2] = {{1,1},{1,1},{1,1}};
+ char buf1b[3][2] = {{1,1},{3,4},{5,6}};
+ short buf2a[3][2] = {{1,1},{1,1},{1,1}};
+ short buf2b[3][2] = {{1,1},{3,4},{5,6}};
+ int buf3a[3][2] = {{1,1},{1,1},{1,1}};
+ int buf3b[3][2] = {{1,1},{3,4},{5,6}};
+ long buf4a[3][2] = {{1,1},{1,1},{1,1}};
+ long buf4b[3][2] = {{1,1},{3,4},{5,6}};
+ float buf5a[3][2] = {{1,1},{1,1},{1,1}};
+ float buf5b[3][2] = {{1,1},{3,4},{5,6}};
+ double buf6a[3][2] = {{1,1},{1,1},{1,1}};
+ double buf6b[3][2] = {{1,1},{3,4},{5,6}};
+
+ /*unsigned/signed test
+ signed char -128 to 127
+ unsigned char 0 to 255
+ */
+ char buf7a[3][2] = {{-1,-128},{-1,-1},{-1,-1}};
+ unsigned char buf7b[3][2] = {{1,128},{1,1},{1,1}};
+
+ /* long_long test */
+ long_long buf8a[3][2] = {{1,1},{1,1},{1,1}};
+ long_long buf8b[3][2] = {{1,1},{3,4},{5,6}};
+ unsigned long_long buf9a[3][2] = {{1,1},{1,1},{1,1}};
+ unsigned long_long buf9b[3][2] = {{1,1},{3,4},{5,6}};
+
+ unsigned int buf10a[3][2] = {{UIMAX,1},{1,1},{1,1}};
+ unsigned int buf10b[3][2] = {{UIMAX-1,1},{3,4},{5,6}};
+
+
+/*-------------------------------------------------------------------------
+ * Create a file
+ *-------------------------------------------------------------------------
+ */
+ file1_id = H5Fcreate (file1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+/*-------------------------------------------------------------------------
+ * Check for different storage order. Give a warning if they are different
+ *-------------------------------------------------------------------------
+ */
+
+ write_dset(file1_id,2,dims,"dset0a",H5T_STD_I16LE,buf2a);
+ write_dset(file1_id,2,dims,"dset0b",H5T_STD_I32LE,buf3b);
+
+/*-------------------------------------------------------------------------
+ * Check H5T_NATIVE_CHAR
+ *-------------------------------------------------------------------------
+ */
+ write_dset(file1_id,2,dims,"dset1a",H5T_NATIVE_CHAR,buf1a);
+ write_dset(file1_id,2,dims,"dset1b",H5T_NATIVE_CHAR,buf1b);
+
+/*-------------------------------------------------------------------------
+ * Check H5T_NATIVE_SHORT
+ *-------------------------------------------------------------------------
+ */
+ write_dset(file1_id,2,dims,"dset2a",H5T_NATIVE_SHORT,buf2a);
+ write_dset(file1_id,2,dims,"dset2b",H5T_NATIVE_SHORT,buf2b);
+
+/*-------------------------------------------------------------------------
+ * Check H5T_NATIVE_INT
+ *-------------------------------------------------------------------------
+ */
+ write_dset(file1_id,2,dims,"dset3a",H5T_NATIVE_INT,buf3a);
+ write_dset(file1_id,2,dims,"dset3b",H5T_NATIVE_INT,buf3b);
+
+/*-------------------------------------------------------------------------
+ * Check H5T_NATIVE_LONG
+ *-------------------------------------------------------------------------
+ */
+ write_dset(file1_id,2,dims,"dset4a",H5T_NATIVE_LONG,buf4a);
+ write_dset(file1_id,2,dims,"dset4b",H5T_NATIVE_LONG,buf4b);
+
+/*-------------------------------------------------------------------------
+ * Check H5T_NATIVE_FLOAT
+ *-------------------------------------------------------------------------
+ */
+ write_dset(file1_id,2,dims,"dset5a",H5T_NATIVE_FLOAT,buf5a);
+ write_dset(file1_id,2,dims,"dset5b",H5T_NATIVE_FLOAT,buf5b);
+
+/*-------------------------------------------------------------------------
+ * Check H5T_NATIVE_DOUBLE
+ *-------------------------------------------------------------------------
+ */
+
+ write_dset(file1_id,2,dims,"dset6a",H5T_NATIVE_DOUBLE,buf6a);
+ write_dset(file1_id,2,dims,"dset6b",H5T_NATIVE_DOUBLE,buf6b);
+
+/*-------------------------------------------------------------------------
+ * H5T_NATIVE_CHAR and H5T_NATIVE_UCHAR
+ *-------------------------------------------------------------------------
+ */
+
+ write_dset(file1_id,2,dims,"dset7a",H5T_NATIVE_CHAR,buf7a);
+ write_dset(file1_id,2,dims,"dset7b",H5T_NATIVE_UCHAR,buf7b);
+
+/*-------------------------------------------------------------------------
+ * H5T_NATIVE_LLONG
+ *-------------------------------------------------------------------------
+ */
+
+ write_dset(file1_id,2,dims,"dset8a",H5T_NATIVE_LLONG,buf8a);
+ write_dset(file1_id,2,dims,"dset8b",H5T_NATIVE_LLONG,buf8b);
+
+/*-------------------------------------------------------------------------
+ * H5T_NATIVE_ULLONG
+ *-------------------------------------------------------------------------
+ */
+
+ write_dset(file1_id,2,dims,"dset9a",H5T_NATIVE_ULLONG,buf9a);
+ write_dset(file1_id,2,dims,"dset9b",H5T_NATIVE_ULLONG,buf9b);
+
+/*-------------------------------------------------------------------------
+ * H5T_NATIVE_INT
+ *-------------------------------------------------------------------------
+ */
+
+ write_dset(file1_id,2,dims,"dset10a",H5T_NATIVE_UINT,buf10a);
+ write_dset(file1_id,2,dims,"dset10b",H5T_NATIVE_UINT,buf10b);
+
+
+/*-------------------------------------------------------------------------
+ * Close
+ *-------------------------------------------------------------------------
+ */
+ status = H5Fclose(file1_id);
+ return status;
+}
+
+
diff --git a/tools/h5diff/testh5diff_main.c b/tools/h5diff/testh5diff_main.c
new file mode 100644
index 0000000..70a1ff1
--- /dev/null
+++ b/tools/h5diff/testh5diff_main.c
@@ -0,0 +1,36 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "testh5diff.h"
+
+
+
+
+int main(int UNUSED argc, const UNUSED char *argv[])
+{
+
+ test_basic ("file1.h5","file2.h5");
+ test_types ("file3.h5",NULL);
+ test_native("file4.h5",NULL);
+
+ /* generate 2 files with attribute differences */
+ test_attr("file5.h5",0);
+ test_attr("file6.h5",1);
+
+ /* generate 2 files with all datatype differences */
+ test_dsetall("file7.h5",0);
+ test_dsetall("file8.h5",1);
+ return 0;
+}
+
diff --git a/tools/h5diff/testh5diff_util.c b/tools/h5diff/testh5diff_util.c
new file mode 100644
index 0000000..b0abf81
--- /dev/null
+++ b/tools/h5diff/testh5diff_util.c
@@ -0,0 +1,99 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "testh5diff.h"
+
+
+/*-------------------------------------------------------------------------
+ * Function: write_attr
+ *
+ * Purpose: utility function to write an attribute in LOC_ID
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: November 12, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+int write_attr(hid_t loc_id,
+ int rank,
+ hsize_t *dims,
+ const char *attr_name,
+ hid_t type_id,
+ void *buf)
+{
+ hid_t attr_id;
+ hid_t space_id;
+ herr_t status;
+
+ /* Create a buf space */
+ space_id = H5Screate_simple(rank,dims,NULL);
+
+ /* Create the attribute */
+ attr_id = H5Acreate(loc_id,attr_name,type_id,space_id,H5P_DEFAULT);
+
+ /* Write the buf */
+ if ( buf )
+ status = H5Awrite(attr_id,type_id,buf);
+
+ /* Close */
+ status = H5Aclose(attr_id);
+ status = H5Sclose(space_id);
+ return status;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: write_dset
+ *
+ * Purpose: utility function to create and write a dataset in LOC_ID
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: November 12, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+int write_dset( hid_t loc_id,
+ int rank,
+ hsize_t *dims,
+ const char *dset_name,
+ hid_t type_id,
+ void *buf )
+{
+ hid_t dset_id;
+ hid_t space_id;
+ herr_t status;
+
+ /* Create a buf space */
+ space_id = H5Screate_simple(rank,dims,NULL);
+
+ /* Create a dataset */
+ dset_id = H5Dcreate(loc_id,dset_name,type_id,space_id,H5P_DEFAULT);
+
+ /* Write the buf */
+ if ( buf )
+ status = H5Dwrite(dset_id,type_id,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf);
+
+ /* Close */
+ status = H5Dclose(dset_id);
+ status = H5Sclose(space_id);
+
+ return status;
+
+}
+
diff --git a/tools/h5repack/h5repack_layout.c b/tools/h5repack/h5repack_layout.c
new file mode 100644
index 0000000..1cf1680
--- /dev/null
+++ b/tools/h5repack/h5repack_layout.c
@@ -0,0 +1,175 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "hdf5.h"
+#include "h5test.h"
+#include "h5repack.h"
+
+
+static void CANNOT_LAYOUT(pack_opt_t *options)
+{
+ if (options->verbose)
+ printf("Warning: This layout cannot be applied, this object\
+ requires chunked layout\n");
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: layout_this
+ *
+ * Purpose: check if the layout can be applied;
+ * find the object name NAME (got from the traverse list)
+ * in the repack options list; assign the layout information OBJ
+ *
+ * Return: 0 cannot apply, 1 can, -1 error
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: December 30, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int layout_this(hid_t dcpl_id, /* DCPL from input object */
+ const char* name, /* object name from traverse list */
+ pack_opt_t *options, /* repack options */
+ pack_info_t *pack /*OUT*/) /* object to apply layout */
+{
+ int nfilters; /* number of filters in the input object */
+ H5D_layout_t layout; /* layout */
+ char *pdest;
+ int result;
+ int i, ret=1;
+
+ /* check if we have filters in the input object */
+ if ((nfilters = H5Pget_nfilters(dcpl_id))<0)
+ return -1;
+
+ /* applying to all objects */
+ if (options->all_layout)
+ {
+ /* assign the global layout info to the OBJ info */
+ pack->layout=options->layout_g;
+
+ switch (options->layout_g)
+ {
+ case H5D_CHUNKED:
+ pack->chunk.rank=options->chunk_g.rank;
+ for ( i=0; i<pack->chunk.rank; i++)
+ pack->chunk.chunk_lengths[i]=options->chunk_g.chunk_lengths[i];
+ break;
+
+ case H5D_CONTIGUOUS:
+ case H5D_COMPACT:
+ if (nfilters)
+ {
+ CANNOT_LAYOUT(options);
+ ret=0;
+ }
+ break;
+
+ default:
+ ret=0;
+ break;
+ }/*switch*/
+ return ret;
+ }
+
+ /* find the object */
+ for ( i=0; i<options->op_tbl->nelems; i++)
+ {
+ layout=options->op_tbl->objs[i].layout;
+ if ( layout != -1 )
+ {
+ if (strcmp(options->op_tbl->objs[i].path,name)==0)
+ {
+ if (nfilters && layout!=H5D_CHUNKED)
+ {
+ CANNOT_LAYOUT(options);
+ return 0;
+ }
+ else
+ {
+ *pack=options->op_tbl->objs[i];
+ return 1;
+ }
+ }
+
+ pdest = strstr(name,options->op_tbl->objs[i].path);
+ result = (int)(pdest - name);
+
+ /* found at position 1, meaning without '/' */
+ if( pdest != NULL && result==1 )
+ {
+ if (nfilters && layout!=H5D_CHUNKED)
+ {
+ CANNOT_LAYOUT(options);
+ return 0;
+ }
+ else
+ {
+ *pack=options->op_tbl->objs[i];
+ return 1;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+/*-------------------------------------------------------------------------
+ * Function: apply_layout
+ *
+ * Purpose: apply a layout to the property list. Valid values for layout are:
+ *
+ * H5D_COMPACT
+ * Store raw data in the dataset object header in file.
+ * This should only be used for very small amounts of raw data.
+ * H5D_CONTIGUOUS
+ * Store raw data separately from the object header in one large chunk
+ * in the file.
+ * H5D_CHUNKED
+ * Store raw data separately from the object header as chunks of data in
+ * separate locations in the file.
+ *
+ * Return: 0, ok, -1 no
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: December 30, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int apply_layout(hid_t dcpl_id,
+ pack_info_t *obj) /* info about object */
+{
+
+
+ if (H5Pset_layout(dcpl_id, obj->layout)<0)
+ return -1;
+
+ if (H5D_CHUNKED==obj->layout) { /* set up chunk */
+ if(H5Pset_chunk(dcpl_id, obj->chunk.rank, obj->chunk.chunk_lengths)<0)
+ return -1;
+ }
+ else if (H5D_COMPACT==obj->layout) {
+ if (H5Pset_alloc_time(dcpl_id, H5D_ALLOC_TIME_EARLY)<0)
+ return -1;
+ }
+
+ return 0;
+}
+
diff --git a/tools/lib/h5diff.h b/tools/lib/h5diff.h
new file mode 100644
index 0000000..0c52f76
--- /dev/null
+++ b/tools/lib/h5diff.h
@@ -0,0 +1,199 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef H5DIFF_H__
+#define H5DIFF_H__
+
+#include "hdf5.h"
+#include "h5trav.h"
+
+
+#if 0
+#define H5DIFF_DEBUG
+#endif
+
+
+/*-------------------------------------------------------------------------
+ * printf formatting
+ *-------------------------------------------------------------------------
+ */
+
+#define FFORMAT "%-15f %-15f %-15f\n"
+#define IFORMAT "%-15d %-15d %-15d\n"
+#define CFORMAT "%-16c %-17c\n"
+#define SFORMAT "%-16s %-17s\n"
+#define UIFORMAT "%-15u %-15u %-15u\n"
+#define LIFORMAT "%-15ld %-15ld %-15ld\n"
+#define ULIFORMAT "%-15lu %-15lu %-15lu\n"
+/* with -p option */
+#define FPFORMAT "%-15.10g %-15.10g %-15.10g %-14.10g\n"
+#define IPFORMAT "%-15d %-15d %-15d %-14d\n"
+#define UIPFORMAT "%-15u %-15u %-15u %-14u\n"
+#define LPIFORMAT "%-15ld %-15ld %-15ld %-14ld\n"
+#define ULPIFORMAT "%-15lu %-15lu %-15lu %-14lu\n"
+#define SPACES " "
+
+
+/*-------------------------------------------------------------------------
+ * command line options
+ *-------------------------------------------------------------------------
+ */
+
+typedef struct {
+ int r; /* report only what objects differ */
+ int d; /* delta */
+ double delta; /* delta value */
+ int p; /* relative error */
+ double percent; /* relative error value */
+ int n; /* count */
+ int count; /* count value */
+ int verbose; /* print information */
+} diff_opt_t;
+
+
+
+/*-------------------------------------------------------------------------
+ * public functions
+ *-------------------------------------------------------------------------
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int h5diff(const char *fname1,
+ const char *fname2,
+ const char *objname1,
+ const char *objname2,
+ diff_opt_t *options);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+/*-------------------------------------------------------------------------
+ * private functions
+ *-------------------------------------------------------------------------
+ */
+
+
+int diff_dataset( hid_t file1_id,
+ hid_t file2_id,
+ const char *obj1_name,
+ const char *obj2_name,
+ diff_opt_t *options );
+
+int diff_datasetid( hid_t dset1_id,
+ hid_t dset2_id,
+ const char *obj1_name,
+ const char *obj2_name,
+ diff_opt_t *options );
+
+int diff( hid_t file1_id,
+ const char *path1,
+ hid_t file2_id,
+ const char *path2,
+ diff_opt_t *options,
+ H5G_obj_t type );
+
+int diff_compare( hid_t file1_id,
+ const char *file1_name,
+ const char *obj1_name,
+ int nobjects1,
+ trav_info_t *info1,
+ hid_t file2_id,
+ const char *file2_name,
+ const char *obj2_name,
+ int nobjects2,
+ trav_info_t *info2,
+ diff_opt_t *options );
+
+int diff_match( hid_t file1_id,
+ int nobjects1,
+ trav_info_t *info1,
+ hid_t file2_id,
+ int nobjects2,
+ trav_info_t *info2,
+ diff_opt_t *options );
+
+int diff_array( void *_mem1,
+ void *_mem2,
+ hsize_t nelmts,
+ int rank,
+ hsize_t *dims,
+ diff_opt_t *options,
+ const char *name1,
+ const char *name2,
+ hid_t m_type,
+ hid_t container1_id,
+ hid_t container2_id); /* dataset where the reference came from*/
+
+
+int diff_can_type( hid_t f_type1, /* file data type */
+ hid_t f_type2, /* file data type */
+ int rank1,
+ int rank2,
+ hsize_t *dims1,
+ hsize_t *dims2,
+ hsize_t *maxdim1,
+ hsize_t *maxdim2,
+ const char *obj1_name,
+ const char *obj2_name,
+ diff_opt_t *options );
+
+
+int diff_attr(hid_t loc1_id,
+ hid_t loc2_id,
+ const char *path1,
+ const char *path2,
+ diff_opt_t *options
+ );
+
+
+/*-------------------------------------------------------------------------
+ * utility functions
+ *-------------------------------------------------------------------------
+ */
+
+void print_type(hid_t type);
+const char* diff_basename(const char *name);
+const char* get_type(int type);
+const char* get_class(H5T_class_t tclass);
+const char* get_sign(H5T_sign_t sign);
+void print_dims( int r, hsize_t *d );
+void print_pos( int *ph,
+ int per,
+ hsize_t curr_pos,
+ hsize_t *acc,
+ hsize_t *pos,
+ int rank,
+ const char *obj1,
+ const char *obj2 );
+
+#if defined (H5DIFF_DEBUG)
+void print_sizes( const char *obj1, const char *obj2,
+ hid_t f_type1, hid_t f_type2,
+ hid_t m_type1, hid_t m_type2 );
+#endif
+
+#ifdef NOT_YET
+void diff_list( const char *filename, int nobjects, trav_info_t *info );
+#endif /* NOT_YET */
+
+
+
+#endif /* H5DIFF_H__ */
diff --git a/tools/lib/h5trav.h b/tools/lib/h5trav.h
new file mode 100644
index 0000000..5f68da4
--- /dev/null
+++ b/tools/lib/h5trav.h
@@ -0,0 +1,139 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef H5TRAV_H__
+#define H5TRAV_H__
+
+#include "hdf5.h"
+
+#if 0
+#define H5_TRAV_DEBUG
+#endif
+
+
+/*-------------------------------------------------------------------------
+ * public struct to store name and type of an object
+ * the TYPE can be:
+ * H5G_UNKNOWN = -1,
+ * H5G_LINK, Object is a symbolic link
+ * H5G_GROUP, Object is a group
+ * H5G_DATASET, Object is a dataset
+ * H5G_TYPE, Object is a named data type
+ *-------------------------------------------------------------------------
+ */
+
+typedef struct trav_info_t {
+ char *name;
+ H5G_obj_t type;
+} trav_info_t;
+
+
+/*-------------------------------------------------------------------------
+ * keep record of hard link information
+ *-------------------------------------------------------------------------
+ */
+typedef struct trav_link_t {
+ char *new_name;
+} trav_link_t;
+
+
+/*-------------------------------------------------------------------------
+ * struct to store basic info needed for the h5trav table traversal algorythm
+ *-------------------------------------------------------------------------
+ */
+
+typedef struct trav_obj_t {
+ haddr_t objno; /* object number from H5Gget_objinfo */
+ unsigned flags[2]; /* h5diff.object is present or not in both files*/
+ char *name; /* name */
+ int displayed; /* hard link already traversed once */
+ H5G_obj_t type; /* type of object */
+ trav_link_t *links; /* array of possible link names */
+ int sizelinks; /* size of links array */
+ int nlinks; /* number of links */
+} trav_obj_t;
+
+
+/*-------------------------------------------------------------------------
+ * private struct that stores all objects
+ *-------------------------------------------------------------------------
+ */
+
+typedef struct trav_table_t {
+ int size;
+ int nobjs;
+ trav_obj_t *objs;
+} trav_table_t;
+
+
+/*-------------------------------------------------------------------------
+ * public functions
+ *-------------------------------------------------------------------------
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-------------------------------------------------------------------------
+ * "h5trav info" public functions
+ *-------------------------------------------------------------------------
+ */
+int h5trav_getinfo( hid_t file_id, trav_info_t *info );
+int h5trav_getindex( const char *obj, int nobjs, trav_info_t *info );
+void h5trav_freeinfo( trav_info_t *info, int nobjs );
+void h5trav_printinfo(int nobjs, trav_info_t *info);
+
+/*-------------------------------------------------------------------------
+ * "h5trav table" public functions
+ *-------------------------------------------------------------------------
+ */
+
+int h5trav_getindext(const char *obj,trav_table_t *travt);
+int h5trav_gettable(hid_t fid, trav_table_t *travt);
+void h5trav_printtable(trav_table_t *table);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*-------------------------------------------------------------------------
+ * table private functions
+ *-------------------------------------------------------------------------
+ */
+
+void trav_table_init(trav_table_t **table);
+
+void trav_table_free(trav_table_t *table);
+
+int trav_table_search(haddr_t objno,
+ trav_table_t *table );
+
+void trav_table_add(haddr_t objno,
+ char *objname,
+ H5G_obj_t type,
+ trav_table_t *table);
+
+void trav_table_addflags(unsigned *flags,
+ char *objname,
+ H5G_obj_t type,
+ trav_table_t *table);
+
+
+void trav_table_addlink(trav_table_t *table,
+ int j /* the object index */,
+ char *path );
+
+
+#endif /* H5TRAV_H__ */
diff --git a/tools/lib/h5trav_table.c b/tools/lib/h5trav_table.c
new file mode 100644
index 0000000..8e794aa
--- /dev/null
+++ b/tools/lib/h5trav_table.c
@@ -0,0 +1,256 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * 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. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+#include "h5trav.h"
+#include "H5private.h"
+
+/*-------------------------------------------------------------------------
+ * Function: trav_table_search
+ *
+ * Purpose: Search in the table for OBJNO
+ *
+ * Return: index of object in table
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: November 4, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int trav_table_search(haddr_t objno, trav_table_t *table )
+{
+ int i;
+
+ for (i = 0; i < table->nobjs; i++)
+ if (table->objs[i].objno == objno)
+ return i;
+
+ return -1;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: trav_table_add
+ *
+ * Purpose: Add OBJNO, NAME and TYPE of object to table
+ *
+ * Return: void
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: November 4, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void trav_table_add(haddr_t objno,
+ char *name,
+ H5G_obj_t type,
+ trav_table_t *table)
+{
+ int i;
+
+ if (table->nobjs == table->size) {
+ table->size *= 2;
+ table->objs =
+ (trav_obj_t*)HDrealloc(table->objs, table->size * sizeof(trav_obj_t));
+
+ for (i = table->nobjs; i < table->size; i++) {
+ table->objs[i].objno = 0;
+ table->objs[i].flags[0] = table->objs[i].flags[1] = 0;
+ table->objs[i].displayed = 0;
+ table->objs[i].type = H5G_UNKNOWN;
+ table->objs[i].name = NULL;
+ table->objs[i].links = NULL;
+ table->objs[i].nlinks = 0;
+ table->objs[i].sizelinks = 0;
+ }
+ }
+
+ i = table->nobjs++;
+ table->objs[i].objno = objno;
+ table->objs[i].flags[0] = table->objs[i].flags[1] = 0;
+ HDfree(table->objs[i].name);
+ table->objs[i].name = (char *)HDstrdup(name);
+ table->objs[i].type = type;
+ table->objs[i].links = NULL;
+ table->objs[i].nlinks = 0;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: trav_table_addflags
+ *
+ * Purpose: Add FLAGS, NAME and TYPE of object to table
+ *
+ * Return: void
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: November 4, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void trav_table_addflags(unsigned *flags,
+ char *name,
+ H5G_obj_t type,
+ trav_table_t *table)
+{
+ int i;
+
+ if (table->nobjs == table->size) {
+ table->size *= 2;
+ table->objs =
+ (trav_obj_t*)HDrealloc(table->objs, table->size * sizeof(trav_obj_t));
+
+ for (i = table->nobjs; i < table->size; i++) {
+ table->objs[i].objno = 0;
+ table->objs[i].flags[0] = table->objs[i].flags[1] = 0;
+ table->objs[i].displayed = 0;
+ table->objs[i].type = H5G_UNKNOWN;
+ table->objs[i].name = NULL;
+ table->objs[i].links = NULL;
+ table->objs[i].nlinks = 0;
+ table->objs[i].sizelinks = 0;
+ }
+ }
+
+ i = table->nobjs++;
+ table->objs[i].objno = 0;
+ table->objs[i].flags[0] = flags[0];
+ table->objs[i].flags[1] = flags[1];
+ HDfree(table->objs[i].name);
+ table->objs[i].name = (char *)HDstrdup(name);
+ table->objs[i].type = type;
+ table->objs[i].links = NULL;
+ table->objs[i].nlinks = 0;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: trav_table_init
+ *
+ * Purpose: Initialize the table
+ *
+ * Return: void
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: November 4, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void trav_table_init( trav_table_t **tbl )
+{
+ int i;
+ trav_table_t* table = (trav_table_t*) HDmalloc(sizeof(trav_table_t));
+
+ table->size = 20;
+ table->nobjs = 0;
+ table->objs =
+ (trav_obj_t*)HDmalloc(table->size * sizeof(trav_obj_t));
+
+ for (i = 0; i < table->size; i++) {
+ table->objs[i].objno = 0;
+ table->objs[i].flags[0] = table->objs[i].flags[1] = 0;
+ table->objs[i].displayed = 0;
+ table->objs[i].type = H5G_UNKNOWN;
+ table->objs[i].name = NULL;
+ table->objs[i].links = NULL;
+ table->objs[i].nlinks = 0;
+ table->objs[i].sizelinks = 0;
+ }
+
+ *tbl = table;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: trav_table_free
+ *
+ * Purpose: free table memory
+ *
+ * Return: void
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: November 4, 2002
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void trav_table_free( trav_table_t *table )
+{
+ int i, j;
+
+ for ( i = 0; i < table->nobjs; i++)
+ {
+ HDfree( table->objs[i].name );
+ if (table->objs[i].nlinks)
+ {
+ for ( j=0; j<table->objs[i].nlinks; j++)
+ HDfree( table->objs[i].links[j].new_name );
+
+ HDfree(table->objs[i].links);
+ }
+ }
+ HDfree(table->objs);
+ HDfree(table);
+
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: trav_table_addlink
+ *
+ * Purpose: Add a hardlink name to the object
+ *
+ * Return: void
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: December 17, 2003
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void trav_table_addlink(trav_table_t *table,
+ int j /* the object index */,
+ char *path )
+{
+ int k;
+
+ /* already inserted */
+ if (strcmp(table->objs[j].name,path)==0)
+ return;
+
+ /* allocate space if necessary */
+ if (table->objs[j].nlinks == table->objs[j].sizelinks) {
+ table->objs[j].sizelinks += 2;
+ table->objs[j].links =
+ (trav_link_t*)HDrealloc(table->objs[j].links,
+ table->objs[j].sizelinks * sizeof(trav_link_t));
+ }
+
+ /* insert it */
+ k=table->objs[j].nlinks++;
+ table->objs[j].links[k].new_name = (char*)HDstrdup(path);
+}
+
+