diff options
author | cvs2svn <no_author@cvs2svn> | 2004-01-06 17:53:16 (GMT) |
---|---|---|
committer | cvs2svn <no_author@cvs2svn> | 2004-01-06 17:53:16 (GMT) |
commit | 64e365a48fece102cf43ed19634e36a53647ed4e (patch) | |
tree | 77bcff546cf7bfd0a401e5427f10e74e1436e922 /tools | |
parent | 83c7a8dfaa7a83b462a92f8b449ed73a92d26610 (diff) | |
download | hdf5-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.c | 498 | ||||
-rw-r--r-- | tools/h5diff/testh5diff_main.c | 36 | ||||
-rw-r--r-- | tools/h5diff/testh5diff_util.c | 99 | ||||
-rw-r--r-- | tools/h5repack/h5repack_layout.c | 175 | ||||
-rw-r--r-- | tools/lib/h5diff.h | 199 | ||||
-rw-r--r-- | tools/lib/h5trav.h | 139 | ||||
-rw-r--r-- | tools/lib/h5trav_table.c | 256 |
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); +} + + |