summaryrefslogtreecommitdiffstats
path: root/tools/h5diff/h5diffgentest.c
diff options
context:
space:
mode:
authorPedro Vicente Nunes <pvn@hdfgroup.org>2006-10-25 20:38:28 (GMT)
committerPedro Vicente Nunes <pvn@hdfgroup.org>2006-10-25 20:38:28 (GMT)
commit9d94440384d20ab09297b8c451dfbda051ed6b17 (patch)
tree83c66c31c30c19b0935e3f70d90cacbe027d3bd1 /tools/h5diff/h5diffgentest.c
parentea1047de515e12e651e65c1b88c40b1c713f0b06 (diff)
downloadhdf5-9d94440384d20ab09297b8c451dfbda051ed6b17.zip
hdf5-9d94440384d20ab09297b8c451dfbda051ed6b17.tar.gz
hdf5-9d94440384d20ab09297b8c451dfbda051ed6b17.tar.bz2
[svn-r12815]
1) added a new parameter to the h5diff function diff_array that contains the beginning position of the hyperslab, so that the total position in the array is printed correctly when reading by hyperslabs. 2) added a new test to h5diff that reads and diffs by hyperslabs. The test reads a 1GB dataset, from which a 1KB hyperslab was written with differences . 3) added the generation of 2 files to the generator program to test the h5diff hyperslab read. 4) changed the h5diff binary pre-generated file names to be more descriptive (e.g, instead of file1.h5, made it h5diff_basic1.h5) 5) changed the name of the h5repack options text file to info.h5repack
Diffstat (limited to 'tools/h5diff/h5diffgentest.c')
-rw-r--r--tools/h5diff/h5diffgentest.c2131
1 files changed, 1080 insertions, 1051 deletions
diff --git a/tools/h5diff/h5diffgentest.c b/tools/h5diff/h5diffgentest.c
index 1f78b68..e283043 100644
--- a/tools/h5diff/h5diffgentest.c
+++ b/tools/h5diff/h5diffgentest.c
@@ -20,7 +20,7 @@
/*-------------------------------------------------------------------------
* Program: h5diffgentest
*
- * Purpose: generate files for h5diff testting
+ * Purpose: generate files for h5diff testing
*
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
*
@@ -29,17 +29,19 @@
*-------------------------------------------------------------------------
*/
-
+#define FILE1 "h5diff_basic1.h5"
+#define FILE2 "h5diff_basic2.h5"
+#define FILE3 "h5diff_types.h5"
+#define FILE4 "h5diff_dtypes.h5"
+#define FILE5 "h5diff_attr1.h5"
+#define FILE6 "h5diff_attr2.h5"
+#define FILE7 "h5diff_dset1.h5"
+#define FILE8 "h5diff_dset2.h5"
+#define FILE9 "h5diff_hyper1.h5"
+#define FILE10 "h5diff_hyper2.h5"
#define UIMAX 4294967295u /*Maximum value for a variable of type unsigned int */
#define STR_SIZE 3
-#define FILE1 "file1.h5"
-#define FILE2 "file2.h5"
-#define FILE3 "file3.h5"
-#define FILE4 "file4.h5"
-#define FILE5 "file5.h5"
-#define FILE6 "file6.h5"
-#define FILE7 "file7.h5"
-#define FILE8 "file8.h5"
+#define GBLL ((unsigned long_long) 1024 * 1024 *1024 )
#define MY_LINKCLASS 187
@@ -63,77 +65,119 @@ const H5L_class_t UD_link_class[1] = {{
/*-------------------------------------------------------------------------
- * Function: write_attr
+ * prototypes
+ *-------------------------------------------------------------------------
+ */
+
+/* tests called in main() */
+static int test_basic(const char *fname1,const char *fname2);
+static int test_types(const char *fname);
+static int test_datatypes(const char *fname);
+static int test_attributes(const char *fname,int make_diffs);
+static int test_datasets(const char *fname,int make_diffs);
+static int test_hyperslab(char *fname,int make_diffs);
+/* called by test_attributes() and test_datasets() */
+static void write_attr_in(hid_t loc_id,const char* dset_name,hid_t fid,int make_diffs);
+static void write_dset_in(hid_t loc_id,const char* dset_name,hid_t fid,int make_diffs);
+static void gen_datareg(hid_t fid,int make_diffs);
+/* utilities */
+static int write_attr(hid_t loc_id,int rank,hsize_t *dims,const char *name,hid_t tid,void *buf);
+static int write_dset(hid_t loc_id,int rank,hsize_t *dims,const char *name,hid_t tid,void *buf);
+
+
+/*-------------------------------------------------------------------------
+ * Function: main
*
- * Purpose: utility function to write an attribute in LOC_ID
+ * Purpose: main program
*
*-------------------------------------------------------------------------
*/
-static
-int write_attr(hid_t loc_id,
- int rank,
- hsize_t *dims,
- const char *attr_name,
- hid_t tid,
- void *buf)
-{
- hid_t aid;
- hid_t sid;
- herr_t status;
- /* Create a buf space */
- sid = H5Screate_simple(rank,dims,NULL);
+int main(void)
+{
+ test_basic (FILE1,FILE2);
+ test_types (FILE3);
+ test_datatypes(FILE4);
- /* Create the attribute */
- aid = H5Acreate(loc_id,attr_name,tid,sid,H5P_DEFAULT);
+ /* generate 2 files, the second call creates a similar file with differences */
+ test_attributes(FILE5,0);
+ test_attributes(FILE6,1);
- /* Write the buf */
- if ( buf )
- status = H5Awrite(aid,tid,buf);
+ /* generate 2 files, the second call creates a similar file with differences */
+ test_datasets(FILE7,0);
+ test_datasets(FILE8,1);
- /* Close */
- status = H5Aclose(aid);
- status = H5Sclose(sid);
- return status;
+ /* generate 2 files, the second call creates a similar file with differences */
+ test_hyperslab(FILE9,0);
+ test_hyperslab(FILE10,1);
+ return 0;
}
/*-------------------------------------------------------------------------
- * Function: write_dset
+ * Function: test_basic
*
- * Purpose: utility function to create and write a dataset in LOC_ID
+ * Purpose: basic tests
*
*-------------------------------------------------------------------------
*/
+
static
-int write_dset( hid_t loc_id,
- int rank,
- hsize_t *dims,
- const char *dset_name,
- hid_t tid,
- void *buf )
+int test_basic(const char *fname1,
+ const char *fname2)
{
- hid_t did;
- hid_t sid;
+
+ hid_t fid1, fid2;
+ hid_t gid1, gid2, gid3;
herr_t status;
+ hsize_t dims[2] = { 3,2 };
- /* Create a buf space */
- sid = H5Screate_simple(rank,dims,NULL);
+ /* 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}};
+ int data5[3][2] = {{100,100},{100,100},{100,100}};
+ int data6[3][2] = {{101,102},{103,104},{150,200}};
+ unsigned long_long data7[3][2] = {{100,100},{100,100},{100,100}};
+ unsigned long_long data8[3][2] = {{101,102},{103,104},{150,200}};
- /* Create a dataset */
- did = H5Dcreate(loc_id,dset_name,tid,sid,H5P_DEFAULT);
+/*-------------------------------------------------------------------------
+ * Create two files
+ *-------------------------------------------------------------------------
+ */
- /* Write the buf */
- if ( buf )
- status = H5Dwrite(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf);
+ fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
- /* Close */
- status = H5Dclose(did);
- status = H5Sclose(sid);
+ /* Create groups */
+ gid1 = H5Gcreate(fid1, "g1", 0);
+ gid2 = H5Gcreate(fid2, "g1", 0);
+ gid3 = H5Gcreate(fid2, "g2", 0);
- return status;
-}
+ write_dset(gid1,2,dims,"dset1",H5T_NATIVE_DOUBLE,data1);
+ write_dset(gid2,2,dims,"dset2",H5T_NATIVE_DOUBLE,data2);
+ write_dset(gid1,2,dims,"dset3",H5T_NATIVE_DOUBLE,data3);
+ write_dset(gid2,2,dims,"dset4",H5T_NATIVE_DOUBLE,data4);
+ write_dset(gid2,2,dims,"dset1",H5T_NATIVE_DOUBLE,data2);
+ /* relative (int) */
+ write_dset(gid1,2,dims,"dset5",H5T_NATIVE_INT,data5);
+ write_dset(gid1,2,dims,"dset6",H5T_NATIVE_INT,data6);
+ /* relative (unsigned long_long) */
+ write_dset(gid1,2,dims,"dset7",H5T_NATIVE_ULLONG,data7);
+ write_dset(gid1,2,dims,"dset8",H5T_NATIVE_ULLONG,data8);
+/*-------------------------------------------------------------------------
+ * Close
+ *-------------------------------------------------------------------------
+ */
+ status = H5Gclose(gid1);
+ status = H5Gclose(gid2);
+ status = H5Gclose(gid3);
+ status = H5Fclose(fid1);
+ status = H5Fclose(fid2);
+ return status;
+}
/*
@@ -141,902 +185,463 @@ int write_dset( hid_t loc_id,
# # 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
+TOOLTEST h5diff_10.txt -h
-# 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
-# ##############################################################################
+# 1.1 normal mode
+TOOLTEST h5diff_11.txt file1.h5 file2.h5
+# 1.2 normal mode with objects
+TOOLTEST h5diff_12.txt file1.h5 file2.h5 g1/dset1 g1/dset2
-# 6.11: no value
- file1.h5 file2.h5 -p g1/dset3 g1/dset4
+# 1.3 report mode
+TOOLTEST h5diff_13.txt file1.h5 file2.h5 -r
-# 6.12: negative value
- file1.h5 file2.h5 -p -4 g1/dset3 g1/dset4
+# 1.4 report mode with objects
+TOOLTEST h5diff_14.txt file1.h5 file2.h5 -r g1/dset1 g1/dset2
-# 6.13: zero
- file1.h5 file2.h5 -p 0 g1/dset3 g1/dset4
+# 1.5 with -d
+TOOLTEST h5diff_15.txt file1.h5 file2.h5 -r -d 5 g1/dset3 g1/dset4
-# 6.14: non number
- file1.h5 file2.h5 -p u g1/dset3 g1/dset4
+# 1.6 with -p
+TOOLTEST h5diff_16.txt file1.h5 file2.h5 -r -p 0.05 g1/dset3 g1/dset4
-# 6.15: hexadecimal
- file1.h5 file2.h5 -p 0x1 g1/dset3 g1/dset4
+# 1.7 verbose mode
+TOOLTEST h5diff_17.txt file1.h5 file2.h5 -v
-# 6.16: string
- file1.h5 file2.h5 -p "0.21" g1/dset3 g1/dset4
+# 1.8 quiet mode
+TOOLTEST h5diff_18.txt file1.h5 file2.h5 -q
-# 6.17: repeated option
- file1.h5 file2.h5 -p 0.21 -p 0.22 g1/dset3 g1/dset4
+# 1.9.1 with -p (int)
+TOOLTEST h5diff_191.txt file1.h5 file1.h5 -v -p 0.02 g1/dset5 g1/dset6
-# 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
+# 1.9.2 with -p (unsigned long_long)
+TOOLTEST h5diff_192.txt file1.h5 file1.h5 -v -p 0.02 g1/dset7 g1/dset8
*/
-
/*-------------------------------------------------------------------------
- * Function: gen_datareg
- *
- * Purpose: generate a dataset region and its reference
+ * Function: test_types
*
- * Date: April 19, 2006
+ * Purpose: Compare different HDF5 types (H5G_obj_t):
+ * H5G_DATASET, H5G_TYPE, H5G_GROUP, H5G_LINK, H5G_UDLINK
*
*-------------------------------------------------------------------------
*/
-
static
-void gen_datareg(hid_t fid,
- int make_diffs /* flag to modify data buffers */)
+int test_types(const char *fname)
{
- /* data dataset */
- hid_t did1; /* dataset ID */
- hid_t sid1; /* dataspace ID */
- hsize_t dims1[2] = {10,10};/* dimensions */
- int *buf; /* dataset buffer */
- /* reference dataset */
- hid_t did2; /* dataset ID */
- hid_t sid2; /* dataspace ID */
- hsize_t dims2[] = {2}; /* 2 references */
- hdset_reg_ref_t *rbuf; /* buffer for write the references */
- hsize_t start[10]; /* starting location of hyperslab */
- hsize_t count[10]; /* element count of hyperslab */
- hsize_t coord[5][2]; /* coordinates for point selection */
- herr_t status;
- int i;
-
- /* allocate the buffer for write the references */
- rbuf=calloc(2,sizeof(hdset_reg_ref_t));
-
- /* allocate the buffer for write the data dataset */
- buf=malloc(10*10*sizeof(int));
-
- for (i=0; i<10*10; i++)
- {
- buf[i]=i;
- }
- /* create the data dataset */
- sid1 = H5Screate_simple(2,dims1,NULL);
- did1 = H5Dcreate(fid,"dsetref",H5T_NATIVE_INT,sid1,H5P_DEFAULT);
- status = H5Dwrite(did1,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf);
-
- /* create the reference dataset */
- sid2 = H5Screate_simple(1,dims2,NULL);
- did2 = H5Dcreate(fid,"refreg",H5T_STD_REF_DSETREG,sid2,H5P_DEFAULT);
-
- /* create the references */
- /* select hyperslab for first reference */
-
- start[0]=2; start[1]=2;
- count[0]=6; count[1]=6;
- if (make_diffs)
+ hid_t fid1;
+ hid_t gid1;
+ hid_t gid2;
+ hid_t tid1;
+ hid_t tid2;
+ herr_t status;
+ hsize_t dims[1]={1};
+ typedef struct s1_t
{
- start[0]=0; start[1]=0;
- count[0]=3; count[1]=3;
- }
-
- status = H5Sselect_hyperslab(sid1,H5S_SELECT_SET,start,NULL,count,NULL);
- H5Sget_select_npoints(sid1);
-
- /* store first dataset region */
- status = H5Rcreate(&rbuf[0],fid,"dsetref",H5R_DATASET_REGION,sid1);
-
- /* select sequence of five points for second reference */
- coord[0][0]=6; coord[0][1]=9;
- coord[1][0]=2; coord[1][1]=2;
- coord[2][0]=8; coord[2][1]=4;
- coord[3][0]=1; coord[3][1]=6;
- coord[4][0]=2; coord[4][1]=8;
- if (make_diffs)
+ int a;
+ float b;
+ } s1_t;
+ typedef struct s2_t
{
- coord[1][0]=3; coord[1][1]=3;
- coord[3][0]=2; coord[3][1]=5;
- coord[4][0]=1; coord[4][1]=7;
- }
- H5Sselect_elements(sid1,H5S_SELECT_SET,5,(const hsize_t **)coord);
- H5Sget_select_npoints(sid1);
-
- /* store second dataset region */
- H5Rcreate(&rbuf[1],fid,"dsetref",H5R_DATASET_REGION,sid1);
-
- /* write */
- status = H5Dwrite(did2,H5T_STD_REF_DSETREG,H5S_ALL,H5S_ALL,H5P_DEFAULT,rbuf);
-
- /* close, free memory buffers */
- status = H5Dclose(did1);
- status = H5Sclose(sid1);
- status = H5Dclose(did2);
- status = H5Sclose(sid2);
- free(rbuf);
- free(buf);
-
-}
+ int a;
+ } s2_t;
/*-------------------------------------------------------------------------
- * Function: write_dset_in
- *
- * Purpose: write datasets in LOC_ID
- *
+ * Create one file
*-------------------------------------------------------------------------
*/
-static
-void write_dset_in(hid_t loc_id,
- const char* dset_name, /* for saving reference to dataset*/
- hid_t fid,
- int make_diffs /* flag to modify data buffers */)
-{
- /* Compound datatype */
- typedef struct s_t
- {
- char a;
- double b;
- } s_t;
-
- typedef enum
- {
- RED,
- GREEN
- } e_t;
-
- hid_t did;
- hid_t sid;
- hid_t tid;
- hid_t dcpl;
- herr_t status;
- int val, i, j, k, n;
- float f;
- int fillvalue=2;
-
- /* create 1D attributes with dimension [2], 2 elements */
- hsize_t dims[1]={2};
- char buf1[2][STR_SIZE]= {"ab","de"}; /* string */
- char buf2[2]= {1,2}; /* bitfield, opaque */
- s_t buf3[2]= {{1,2},{3,4}}; /* compound */
- hobj_ref_t buf4[2]; /* reference */
- e_t buf45[2]= {RED,GREEN}; /* enum */
- hvl_t buf5[2]; /* vlen */
- hsize_t dimarray[1]={3}; /* array dimension */
- int buf6[2][3]= {{1,2,3},{4,5,6}}; /* array */
- int buf7[2]= {1,2}; /* integer */
- float buf8[2]= {1,2}; /* float */
-
- /* create 2D attributes with dimension [3][2], 6 elements */
- hsize_t dims2[2]={3,2};
- char buf12[6][STR_SIZE]= {"ab","cd","ef","gh","ij","kl"}; /* string */
- char buf22[3][2]= {{1,2},{3,4},{5,6}}; /* bitfield, opaque */
- s_t buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}}; /* compound */
- hobj_ref_t buf42[3][2]; /* reference */
- hvl_t buf52[3][2]; /* vlen */
- int buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}}; /* array */
- int buf72[3][2]= {{1,2},{3,4},{5,6}}; /* integer */
- float buf82[3][2]= {{1,2},{3,4},{5,6}}; /* float */
-
- /* create 3D attributes with dimension [4][3][2], 24 elements */
- hsize_t dims3[3]={4,3,2};
- char buf13[24][STR_SIZE]= {"ab","cd","ef","gh","ij","kl","mn","pq",
- "rs","tu","vw","xz","AB","CD","EF","GH",
- "IJ","KL","MN","PQ","RS","TU","VW","XZ"}; /* string */
- char buf23[4][3][2]; /* bitfield, opaque */
- s_t buf33[4][3][2]; /* compound */
- hobj_ref_t buf43[4][3][2]; /* reference */
- hvl_t buf53[4][3][2]; /* vlen */
- int buf63[24][3]; /* array */
- int buf73[4][3][2]; /* integer */
- float buf83[4][3][2]; /* float */
-
+ fid1 = H5Fcreate (fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
/*-------------------------------------------------------------------------
- * 1D
+ * H5G_DATASET
*-------------------------------------------------------------------------
*/
+ write_dset(fid1,1,dims,"dset",H5T_NATIVE_INT,0);
/*-------------------------------------------------------------------------
- * H5T_STRING
+ * H5G_GROUP
*-------------------------------------------------------------------------
*/
-
-
- if (make_diffs)
- {
- for (i=0; i<2; i++)
- for (j=0; j<2; j++)
- {
- buf1[i][j]='z';
- }
- }
-
-
- tid = H5Tcopy(H5T_C_S1);
- status = H5Tset_size(tid,STR_SIZE);
- write_dset(loc_id,1,dims,"string",tid,buf1);
- status = H5Tclose(tid);
+ gid1 = H5Gcreate(fid1, "g1", 0);
+ status = H5Gclose(gid1);
+ gid2 = H5Gcreate(fid1, "g2", 0);
+ status = H5Gclose(gid2);
/*-------------------------------------------------------------------------
- * H5T_BITFIELD
+ * H5G_TYPE
*-------------------------------------------------------------------------
*/
- if (make_diffs)
- {
- for (i=0; i<2; i++)
- buf2[i]=buf2[1]=0;
- }
-
- tid = H5Tcopy(H5T_STD_B8LE);
- write_dset(loc_id,1,dims,"bitfield",tid,buf2);
- status = H5Tclose(tid);
+ /* create and commit datatype 1 */
+ tid1 = H5Tcreate (H5T_COMPOUND, sizeof(s1_t));
+ H5Tinsert(tid1, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT);
+ H5Tinsert(tid1, "b", HOFFSET(s1_t, b), H5T_NATIVE_FLOAT);
+ H5Tcommit(fid1, "t1", tid1);
+ H5Tclose(tid1);
+ /* create and commit datatype 2 */
+ tid2 = H5Tcreate (H5T_COMPOUND, sizeof(s2_t));
+ H5Tinsert(tid2, "a", HOFFSET(s2_t, a), H5T_NATIVE_INT);
+ H5Tcommit(fid1, "t2", tid2);
+ H5Tclose(tid2);
/*-------------------------------------------------------------------------
- * H5T_OPAQUE
+ * H5G_LINK
*-------------------------------------------------------------------------
*/
- if (make_diffs)
- {
- for (i=0; i<2; i++)
- {
- buf3[i].a=0; buf3[i].b=0;
- }
- }
-
- tid = H5Tcreate(H5T_OPAQUE, 1);
- status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
- write_dset(loc_id,1,dims,"opaque",tid,buf2);
- status = H5Tclose(tid);
+ status = H5Glink(fid1, H5L_TYPE_SOFT, "g1", "l1");
+ status = H5Glink(fid1, H5L_TYPE_SOFT, "g2", "l2");
/*-------------------------------------------------------------------------
- * H5T_COMPOUND
+ * H5G_UDLINK
*-------------------------------------------------------------------------
*/
-
-
- if (make_diffs)
- {
- for (i=0; i<2; i++)
- {
- buf45[i]=GREEN;
- }
- }
-
- tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
- H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
- H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
- write_dset(loc_id,1,dims,"compound",tid,buf3);
- status = H5Tclose(tid);
+ H5Lcreate_external("filename", "objname", fid1, "ext_link", H5P_DEFAULT, H5P_DEFAULT);
+ H5Lregister(UD_link_class);
+ H5Lcreate_ud(fid1, "ud_link", MY_LINKCLASS, NULL, 0, H5P_DEFAULT, H5P_DEFAULT);
/*-------------------------------------------------------------------------
- * H5T_REFERENCE (H5R_OBJECT object reference)
+ * Close
*-------------------------------------------------------------------------
*/
- /* Create references to dataset */
- if (dset_name)
- {
- status=H5Rcreate(&buf4[0],fid,dset_name,H5R_OBJECT,-1);
- status=H5Rcreate(&buf4[1],fid,dset_name,H5R_OBJECT,-1);
- write_dset(loc_id,1,dims,"reference",H5T_STD_REF_OBJ,buf4);
- }
+ status = H5Fclose(fid1);
+ return status;
+}
-/*-------------------------------------------------------------------------
- * H5T_REFERENCE (H5R_DATASET_REGION dataset region reference)
- *-------------------------------------------------------------------------
- */
- gen_datareg(fid,make_diffs);
+/*
-/*-------------------------------------------------------------------------
- * H5T_ENUM
- *-------------------------------------------------------------------------
- */
- tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
- H5Tenum_insert(tid, "RED", (val = 0, &val));
- H5Tenum_insert(tid, "GREEN", (val = 1, &val));
- write_dset(loc_id,1,dims,"enum",tid,buf45);
- status = H5Tclose(tid);
+# ##############################################################################
+# # not comparable types
+# ##############################################################################
-/*-------------------------------------------------------------------------
- * H5T_VLEN
- *-------------------------------------------------------------------------
- */
+# 2.0
+TOOLTEST h5diff_20.txt file3.h5 file3.h5 -v dset g1
- /* Allocate and initialize VL dataset to write */
+# 2.1
+TOOLTEST h5diff_21.txt file3.h5 file3.h5 -v dset l1
- buf5[0].len = 1;
- buf5[0].p = malloc( 1 * sizeof(int));
- ((int *)buf5[0].p)[0]=1;
- buf5[1].len = 2;
- buf5[1].p = malloc( 2 * sizeof(int));
- ((int *)buf5[1].p)[0]=2;
- ((int *)buf5[1].p)[1]=3;
+# 2.2
+TOOLTEST h5diff_22.txt file3.h5 file3.h5 -v dset t1
- if (make_diffs)
- {
- ((int *)buf5[0].p)[0]=0;
- ((int *)buf5[1].p)[0]=0;
- ((int *)buf5[1].p)[1]=0;
- }
+# ##############################################################################
+# # compare groups, types, links (no differences and differences)
+# ##############################################################################
- sid = H5Screate_simple(1,dims,NULL);
- tid = H5Tvlen_create(H5T_NATIVE_INT);
- did = H5Dcreate(loc_id,"vlen",tid,sid,H5P_DEFAULT);
- status = H5Dwrite(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf5);
- assert(status>=0);
- status = H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf5);
- assert(status>=0);
- status = H5Dclose(did);
- status = H5Tclose(tid);
- status = H5Sclose(sid);
+# 2.3
+TOOLTEST h5diff_23.txt file3.h5 file3.h5 -v g1 g1
-/*-------------------------------------------------------------------------
- * H5T_ARRAY
- *-------------------------------------------------------------------------
- */
+# 2.4
+TOOLTEST h5diff_24.txt file3.h5 file3.h5 -v t1 t1
- if (make_diffs)
- {
- for (i=0; i<2; i++)
- for (j=0; j<3; j++)
- {
- buf6[i][j]=0;
- }
- }
+# 2.5
+TOOLTEST h5diff_25.txt file3.h5 file3.h5 -v l1 l1
- tid = H5Tarray_create(H5T_NATIVE_INT, 1, dimarray, NULL);
- write_dset(loc_id,1,dims,"array",tid,buf6);
- status = H5Tclose(tid);
+# 2.6
+TOOLTEST h5diff_26.txt file3.h5 file3.h5 -v g1 g2
+
+# 2.7
+TOOLTEST h5diff_27.txt file3.h5 file3.h5 -v t1 t2
+
+# 2.8
+TOOLTEST h5diff_28.txt file3.h5 file3.h5 -v l1 l2
+*/
/*-------------------------------------------------------------------------
- * H5T_INTEGER and H5T_FLOAT
+ * Function: test_datatypes
+ *
+ * Purpose: test dataset datatypes
+ *
*-------------------------------------------------------------------------
*/
+static
+int test_datatypes(const char *fname)
+{
- if (make_diffs)
- {
- for (i=0; i<2; i++)
- {
- buf7[i]=0;
- buf8[i]=0;
- }
- }
+ hid_t fid1;
+ 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}};
- write_dset(loc_id,1,dims,"integer",H5T_NATIVE_INT,buf7);
- write_dset(loc_id,1,dims,"float",H5T_NATIVE_FLOAT,buf8);
+ /*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}};
-/*-------------------------------------------------------------------------
- * 2D
- *-------------------------------------------------------------------------
- */
/*-------------------------------------------------------------------------
- * H5T_STRING
+ * Create a file
*-------------------------------------------------------------------------
*/
-
- if (make_diffs)
- {
- memset(buf12, 'z', sizeof buf12);
- }
-
-
- tid = H5Tcopy(H5T_C_S1);
- status = H5Tset_size(tid,STR_SIZE);
- write_dset(loc_id,2,dims2,"string2D",tid,buf12);
- status = H5Tclose(tid);
+ fid1 = H5Fcreate (fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
/*-------------------------------------------------------------------------
- * H5T_BITFIELD
+ * Check for different storage order. Give a warning if they are different
*-------------------------------------------------------------------------
*/
-
- if (make_diffs)
- {
- memset(buf22,0,sizeof buf22);
- }
-
- tid = H5Tcopy(H5T_STD_B8LE);
- write_dset(loc_id,2,dims2,"bitfield2D",tid,buf22);
- status = H5Tclose(tid);
+ write_dset(fid1,2,dims,"dset0a",H5T_STD_I16LE,buf2a);
+ write_dset(fid1,2,dims,"dset0b",H5T_STD_I32LE,buf3b);
/*-------------------------------------------------------------------------
- * H5T_OPAQUE
+ * Check H5T_NATIVE_CHAR
*-------------------------------------------------------------------------
*/
- tid = H5Tcreate(H5T_OPAQUE, 1);
- status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
- write_dset(loc_id,2,dims2,"opaque2D",tid,buf22);
- status = H5Tclose(tid);
+ write_dset(fid1,2,dims,"dset1a",H5T_NATIVE_CHAR,buf1a);
+ write_dset(fid1,2,dims,"dset1b",H5T_NATIVE_CHAR,buf1b);
/*-------------------------------------------------------------------------
- * H5T_COMPOUND
+ * Check H5T_NATIVE_SHORT
*-------------------------------------------------------------------------
*/
-
- if (make_diffs)
- {
- memset(buf32,0,sizeof buf32);
- }
-
- tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
- H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
- H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
- write_dset(loc_id,2,dims2,"compound2D",tid,buf32);
- status = H5Tclose(tid);
+ write_dset(fid1,2,dims,"dset2a",H5T_NATIVE_SHORT,buf2a);
+ write_dset(fid1,2,dims,"dset2b",H5T_NATIVE_SHORT,buf2b);
/*-------------------------------------------------------------------------
- * H5T_REFERENCE (H5R_OBJECT object reference)
+ * Check H5T_NATIVE_INT
*-------------------------------------------------------------------------
*/
- /* Create references to dataset */
- if (dset_name)
- {
- for (i = 0; i < 3; i++) {
- for (j = 0; j < 2; j++) {
- status=H5Rcreate(&buf42[i][j],fid,dset_name,H5R_OBJECT,-1);
- }
- }
- write_dset(loc_id,2,dims2,"reference2D",H5T_STD_REF_OBJ,buf42);
- }
+ write_dset(fid1,2,dims,"dset3a",H5T_NATIVE_INT,buf3a);
+ write_dset(fid1,2,dims,"dset3b",H5T_NATIVE_INT,buf3b);
/*-------------------------------------------------------------------------
- * H5T_ENUM
+ * Check H5T_NATIVE_LONG
*-------------------------------------------------------------------------
*/
-
- tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
- H5Tenum_insert(tid, "RED", (val = 0, &val));
- H5Tenum_insert(tid, "GREEN", (val = 1, &val));
- write_dset(loc_id,2,dims2,"enum2D",tid,0);
- status = H5Tclose(tid);
+ write_dset(fid1,2,dims,"dset4a",H5T_NATIVE_LONG,buf4a);
+ write_dset(fid1,2,dims,"dset4b",H5T_NATIVE_LONG,buf4b);
/*-------------------------------------------------------------------------
- * H5T_VLEN
+ * Check H5T_NATIVE_FLOAT
*-------------------------------------------------------------------------
*/
-
-/* Allocate and initialize VL dataset to write */
- n=0;
- for (i = 0; i < 3; i++) {
- for (j = 0; j < 2; j++) {
- int l;
- buf52[i][j].p = malloc((i + 1) * sizeof(int));
- buf52[i][j].len = i + 1;
- for (l = 0; l < i + 1; l++)
- if (make_diffs)((int *)buf52[i][j].p)[l] = 0;
- else ((int *)buf52[i][j].p)[l] = n++;
- }
- }
-
- sid = H5Screate_simple(2,dims2,NULL);
- tid = H5Tvlen_create(H5T_NATIVE_INT);
- did = H5Dcreate(loc_id,"vlen2D",tid,sid,H5P_DEFAULT);
- status = H5Dwrite(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf52);
- assert(status>=0);
- status = H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf52);
- assert(status>=0);
- status = H5Dclose(did);
- status = H5Tclose(tid);
- status = H5Sclose(sid);
+ write_dset(fid1,2,dims,"dset5a",H5T_NATIVE_FLOAT,buf5a);
+ write_dset(fid1,2,dims,"dset5b",H5T_NATIVE_FLOAT,buf5b);
/*-------------------------------------------------------------------------
- * H5T_ARRAY
+ * Check H5T_NATIVE_DOUBLE
*-------------------------------------------------------------------------
*/
- if (make_diffs)
- {
- memset(buf62,0,sizeof buf62);
- }
-
-
- tid = H5Tarray_create(H5T_NATIVE_INT, 1, dimarray, NULL);
- write_dset(loc_id,2,dims2,"array2D",tid,buf62);
- status = H5Tclose(tid);
+ write_dset(fid1,2,dims,"dset6a",H5T_NATIVE_DOUBLE,buf6a);
+ write_dset(fid1,2,dims,"dset6b",H5T_NATIVE_DOUBLE,buf6b);
/*-------------------------------------------------------------------------
- * H5T_INTEGER, write a fill value
+ * H5T_NATIVE_CHAR and H5T_NATIVE_UCHAR
*-------------------------------------------------------------------------
*/
-
- if (make_diffs)
- {
- memset(buf72,0,sizeof buf72);
- memset(buf82,0,sizeof buf82);
- }
-
-
- dcpl = H5Pcreate(H5P_DATASET_CREATE);
- status = H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillvalue);
- sid = H5Screate_simple(2,dims2,NULL);
- did = H5Dcreate(loc_id,"integer2D",H5T_NATIVE_INT,sid,dcpl);
- status = H5Dwrite(did,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf72);
- status = H5Pclose(dcpl);
- status = H5Dclose(did);
- status = H5Sclose(sid);
+ write_dset(fid1,2,dims,"dset7a",H5T_NATIVE_CHAR,buf7a);
+ write_dset(fid1,2,dims,"dset7b",H5T_NATIVE_UCHAR,buf7b);
/*-------------------------------------------------------------------------
- * H5T_FLOAT
+ * H5T_NATIVE_LLONG
*-------------------------------------------------------------------------
*/
- write_dset(loc_id,2,dims2,"float2D",H5T_NATIVE_FLOAT,buf82);
-
+ write_dset(fid1,2,dims,"dset8a",H5T_NATIVE_LLONG,buf8a);
+ write_dset(fid1,2,dims,"dset8b",H5T_NATIVE_LLONG,buf8b);
/*-------------------------------------------------------------------------
- * 3D
+ * H5T_NATIVE_ULLONG
*-------------------------------------------------------------------------
*/
+ write_dset(fid1,2,dims,"dset9a",H5T_NATIVE_ULLONG,buf9a);
+ write_dset(fid1,2,dims,"dset9b",H5T_NATIVE_ULLONG,buf9b);
+
/*-------------------------------------------------------------------------
- * H5T_STRING
+ * H5T_NATIVE_INT
*-------------------------------------------------------------------------
*/
- if (make_diffs)
- {
- memset(buf13,'z',sizeof buf13);
- }
+ write_dset(fid1,2,dims,"dset10a",H5T_NATIVE_UINT,buf10a);
+ write_dset(fid1,2,dims,"dset10b",H5T_NATIVE_UINT,buf10b);
- tid = H5Tcopy(H5T_C_S1);
- status = H5Tset_size(tid,STR_SIZE);
- write_dset(loc_id,3,dims3,"string3D",tid,buf13);
- status = H5Tclose(tid);
/*-------------------------------------------------------------------------
- * H5T_BITFIELD
+ * Close
*-------------------------------------------------------------------------
*/
+ status = H5Fclose(fid1);
+ return status;
+}
+/*
+# ##############################################################################
+# # Dataset datatypes
+# ##############################################################################
- n=1;
- for (i = 0; i < 4; i++) {
- for (j = 0; j < 3; j++) {
- for (k = 0; k < 2; k++) {
- if (make_diffs) buf23[i][j][k]=0;
- else buf23[i][j][k]=n++;
- }
- }
- }
+# 5.0
+TOOLTEST h5diff_50.txt file4.h5 file4.h5 -v dset0a dset0b
+# 5.1
+TOOLTEST h5diff_51.txt file4.h5 file4.h5 -v dset1a dset1b
- tid = H5Tcopy(H5T_STD_B8LE);
- write_dset(loc_id,3,dims3,"bitfield3D",tid,buf23);
- status = H5Tclose(tid);
+# 5.2
+TOOLTEST h5diff_52.txt file4.h5 file4.h5 -v dset2a dset2b
-/*-------------------------------------------------------------------------
- * H5T_OPAQUE
- *-------------------------------------------------------------------------
- */
- tid = H5Tcreate(H5T_OPAQUE, 1);
- status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
- write_dset(loc_id,3,dims3,"opaque3D",tid,buf23);
- status = H5Tclose(tid);
+# 5.3
+TOOLTEST h5diff_53.txt file4.h5 file4.h5 -v dset3a dset4b
-/*-------------------------------------------------------------------------
- * H5T_COMPOUND
- *-------------------------------------------------------------------------
- */
+# 5.4
+TOOLTEST h5diff_54.txt file4.h5 file4.h5 -v dset4a dset4b
- n=1;
- for (i = 0; i < 4; i++) {
- for (j = 0; j < 3; j++) {
- for (k = 0; k < 2; k++) {
- if (make_diffs) {
- buf33[i][j][k].a=0;
- buf33[i][j][k].b=0;
- }
- else {
- buf33[i][j][k].a=n++;
- buf33[i][j][k].b=n++;
- }
- }
- }
- }
+# 5.5
+TOOLTEST h5diff_55.txt file4.h5 file4.h5 -v dset5a dset5b
+# 5.6
+TOOLTEST h5diff_56.txt file4.h5 file4.h5 -v dset6a dset6b
- tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
- H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
- H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
- write_dset(loc_id,3,dims3,"compound3D",tid,buf33);
- status = H5Tclose(tid);
+# 5.7
+TOOLTEST h5diff_57.txt file4.h5 file4.h5 -v dset7a dset7b
-/*-------------------------------------------------------------------------
- * H5T_REFERENCE (H5R_OBJECT object reference)
- *-------------------------------------------------------------------------
- */
- /* Create references to dataset */
- if (dset_name)
- {
- for (i = 0; i < 4; i++) {
- for (j = 0; j < 3; j++) {
- for (k = 0; k < 2; k++)
- status=H5Rcreate(&buf43[i][j][k],fid,dset_name,H5R_OBJECT,-1);
- }
- }
- write_dset(loc_id,3,dims3,"reference3D",H5T_STD_REF_OBJ,buf43);
- }
+# 5.8 (region reference)
+TOOLTEST h5diff_58.txt file7.h5 file8.h5 -v refreg
+*/
/*-------------------------------------------------------------------------
- * H5T_ENUM
+ * Function: test_attributes
+ *
+ * Purpose: test attributes
+ *
*-------------------------------------------------------------------------
*/
+static
+int test_attributes(const char *file,
+ int make_diffs /* flag to modify data buffers */)
+{
+ hid_t fid;
+ hid_t did;
+ hid_t gid;
+ hid_t root_id;
+ hid_t sid;
+ hsize_t dims[1]={2};
+ herr_t status;
- tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
- H5Tenum_insert(tid, "RED", (val = 0, &val));
- H5Tenum_insert(tid, "GREEN", (val = 1, &val));
- write_dset(loc_id,3,dims3,"enum3D",tid,0);
- status = H5Tclose(tid);
+ /* Create a file */
+ if ((fid = H5Fcreate(file, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0)
+ return -1;
+
+ /* Create a 1D dataset */
+ sid = H5Screate_simple(1,dims,NULL);
+ did = H5Dcreate(fid,"dset",H5T_NATIVE_INT,sid,H5P_DEFAULT);
+ status = H5Sclose(sid);
+ assert(status>=0);
+
+ /* Create groups */
+ gid = H5Gcreate(fid,"g1",0);
+ root_id = H5Gopen(fid, "/");
/*-------------------------------------------------------------------------
- * H5T_VLEN
+ * write a series of attributes on the dataset, group, and root group
*-------------------------------------------------------------------------
*/
- /* Allocate and initialize VL dataset to write */
- n=0;
- for (i = 0; i < 4; i++) {
- for (j = 0; j < 3; j++) {
- for (k = 0; k < 2; k++) {
- int l;
- buf53[i][j][k].p = malloc((i + 1) * sizeof(int));
- buf53[i][j][k].len = i + 1;
- for (l = 0; l < i + 1; l++)
- if (make_diffs)((int *)buf53[i][j][k].p)[l] = 0;
- else ((int *)buf53[i][j][k].p)[l] = n++;
- }
- }
- }
+ write_attr_in(did,"dset",fid,make_diffs);
+ write_attr_in(gid,NULL,0,make_diffs);
+ write_attr_in(root_id,NULL,0,make_diffs);
- sid = H5Screate_simple(3,dims3,NULL);
- tid = H5Tvlen_create(H5T_NATIVE_INT);
- did = H5Dcreate(loc_id,"vlen3D",tid,sid,H5P_DEFAULT);
- status = H5Dwrite(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf53);
+
+ /* Close */
+ status = H5Dclose(did);
assert(status>=0);
- status = H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf53);
+ status = H5Gclose(gid);
assert(status>=0);
- status = H5Dclose(did);
- status = H5Tclose(tid);
- status = H5Sclose(sid);
+ status = H5Gclose(root_id);
+ assert(status>=0);
+
+ /* Close file */
+ status = H5Fclose(fid);
+ assert(status>=0);
+ return status;
+}
+
/*-------------------------------------------------------------------------
- * H5T_ARRAY
+ * Function: test_datasets
+ *
+ * Purpose: Check all HDF5 classes
+ * H5T_INTEGER, H5T_FLOAT
+ * H5T_TIME, H5T_STRING, H5T_BITFIELD, H5T_OPAQUE, H5T_COMPOUND, H5T_REFERENCE,
+ * H5T_ENUM, H5T_VLEN, H5T_ARRAY
+ *
*-------------------------------------------------------------------------
*/
+static
+int test_datasets(const char *file,
+ int make_diffs /* flag to modify data buffers */)
+{
+ hid_t fid;
+ hid_t did;
+ hid_t gid;
+ hid_t sid;
+ hsize_t dims[1]={2};
+ herr_t status;
+ int buf[2]={1,2};
-
- n=1;
- for (i = 0; i < 24; i++) {
- for (j = 0; j < (int)dimarray[0]; j++) {
- if (make_diffs) buf63[i][j]=0;
- else buf63[i][j]=n++;
- }
+ if (make_diffs)
+ {
+ memset(buf,0,sizeof buf);
}
- tid = H5Tarray_create(H5T_NATIVE_INT, 1, dimarray, NULL);
- write_dset(loc_id,3,dims3,"array3D",tid,buf63);
- status = H5Tclose(tid);
+ /* Create a file */
+ if ((fid = H5Fcreate(file, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0)
+ return -1;
+
+ /* Create a 1D dataset */
+ sid = H5Screate_simple(1,dims,NULL);
+ did = H5Dcreate(fid,"dset",H5T_NATIVE_INT,sid,H5P_DEFAULT);
+ status = H5Dwrite(did,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf);
+ status = H5Sclose(sid);
+ assert(status>=0);
+
+ /* Create a group */
+ gid = H5Gcreate(fid,"g1",0);
/*-------------------------------------------------------------------------
- * H5T_INTEGER and H5T_FLOAT
+ * write a series of datasets on the group
*-------------------------------------------------------------------------
*/
- n=1; f=1;
- for (i = 0; i < 4; i++) {
- for (j = 0; j < 3; j++) {
- for (k = 0; k < 2; k++) {
- if (make_diffs) {
- buf73[i][j][k]=0;
- buf83[i][j][k]=0;
- }
- else {
- buf73[i][j][k]=n++;
- buf83[i][j][k]=f++;
- }
- }
- }
- }
- write_dset(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73);
- write_dset(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83);
-}
+ write_dset_in(gid,"/dset",fid,make_diffs);
+ /* Close */
+ status = H5Dclose(did);
+ assert(status>=0);
+ status = H5Gclose(gid);
+ assert(status>=0);
+ /* Close file */
+ status = H5Fclose(fid);
+ assert(status>=0);
+ return status;
+}
/*-------------------------------------------------------------------------
* Function: write_attr_in
@@ -1859,8 +1464,6 @@ position bitfield3D of </g1> bitfield3D of </g1> difference
[ 3 2 1 ] 48 0 48
*/
-
-
tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
@@ -2044,446 +1647,872 @@ etc
write_attr(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83);
}
+
+
/*-------------------------------------------------------------------------
- * Function: test_dsetall
+ * Function: write_dset_in
*
- * Purpose: Check all HDF5 classes
- * H5T_INTEGER, H5T_FLOAT
- * H5T_TIME, H5T_STRING, H5T_BITFIELD, H5T_OPAQUE, H5T_COMPOUND, H5T_REFERENCE,
- * H5T_ENUM, H5T_VLEN, H5T_ARRAY
+ * Purpose: write datasets in LOC_ID
*
*-------------------------------------------------------------------------
*/
static
-int test_dsetall(const char *file,
- int make_diffs /* flag to modify data buffers */)
+void write_dset_in(hid_t loc_id,
+ const char* dset_name, /* for saving reference to dataset*/
+ hid_t fid,
+ int make_diffs /* flag to modify data buffers */)
{
- hid_t fid;
+ /* Compound datatype */
+ typedef struct s_t
+ {
+ char a;
+ double b;
+ } s_t;
+
+ typedef enum
+ {
+ RED,
+ GREEN
+ } e_t;
+
hid_t did;
- hid_t gid;
hid_t sid;
- hsize_t dims[1]={2};
+ hid_t tid;
+ hid_t dcpl;
herr_t status;
- int buf[2]={1,2};
+ int val, i, j, k, n;
+ float f;
+ int fillvalue=2;
+
+ /* create 1D attributes with dimension [2], 2 elements */
+ hsize_t dims[1]={2};
+ char buf1[2][STR_SIZE]= {"ab","de"}; /* string */
+ char buf2[2]= {1,2}; /* bitfield, opaque */
+ s_t buf3[2]= {{1,2},{3,4}}; /* compound */
+ hobj_ref_t buf4[2]; /* reference */
+ e_t buf45[2]= {RED,GREEN}; /* enum */
+ hvl_t buf5[2]; /* vlen */
+ hsize_t dimarray[1]={3}; /* array dimension */
+ int buf6[2][3]= {{1,2,3},{4,5,6}}; /* array */
+ int buf7[2]= {1,2}; /* integer */
+ float buf8[2]= {1,2}; /* float */
+
+ /* create 2D attributes with dimension [3][2], 6 elements */
+ hsize_t dims2[2]={3,2};
+ char buf12[6][STR_SIZE]= {"ab","cd","ef","gh","ij","kl"}; /* string */
+ char buf22[3][2]= {{1,2},{3,4},{5,6}}; /* bitfield, opaque */
+ s_t buf32[6]= {{1,2},{3,4},{5,6},{7,8},{9,10},{11,12}}; /* compound */
+ hobj_ref_t buf42[3][2]; /* reference */
+ hvl_t buf52[3][2]; /* vlen */
+ int buf62[6][3]= {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15},{16,17,18}}; /* array */
+ int buf72[3][2]= {{1,2},{3,4},{5,6}}; /* integer */
+ float buf82[3][2]= {{1,2},{3,4},{5,6}}; /* float */
+
+ /* create 3D attributes with dimension [4][3][2], 24 elements */
+ hsize_t dims3[3]={4,3,2};
+ char buf13[24][STR_SIZE]= {"ab","cd","ef","gh","ij","kl","mn","pq",
+ "rs","tu","vw","xz","AB","CD","EF","GH",
+ "IJ","KL","MN","PQ","RS","TU","VW","XZ"}; /* string */
+ char buf23[4][3][2]; /* bitfield, opaque */
+ s_t buf33[4][3][2]; /* compound */
+ hobj_ref_t buf43[4][3][2]; /* reference */
+ hvl_t buf53[4][3][2]; /* vlen */
+ int buf63[24][3]; /* array */
+ int buf73[4][3][2]; /* integer */
+ float buf83[4][3][2]; /* float */
+
+
+/*-------------------------------------------------------------------------
+ * 1D
+ *-------------------------------------------------------------------------
+ */
+
+/*-------------------------------------------------------------------------
+ * H5T_STRING
+ *-------------------------------------------------------------------------
+ */
+
if (make_diffs)
{
- memset(buf,0,sizeof buf);
+ for (i=0; i<2; i++)
+ for (j=0; j<2; j++)
+ {
+ buf1[i][j]='z';
+ }
}
- /* Create a file */
- if ((fid = H5Fcreate(file, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0)
- return -1;
-
- /* Create a 1D dataset */
- sid = H5Screate_simple(1,dims,NULL);
- did = H5Dcreate(fid,"dset",H5T_NATIVE_INT,sid,H5P_DEFAULT);
- status = H5Dwrite(did,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf);
- status = H5Sclose(sid);
- assert(status>=0);
- /* Create a group */
- gid = H5Gcreate(fid,"g1",0);
+ tid = H5Tcopy(H5T_C_S1);
+ status = H5Tset_size(tid,STR_SIZE);
+ write_dset(loc_id,1,dims,"string",tid,buf1);
+ status = H5Tclose(tid);
/*-------------------------------------------------------------------------
- * write a series of datasets on the group
+ * H5T_BITFIELD
*-------------------------------------------------------------------------
*/
- write_dset_in(gid,"/dset",fid,make_diffs);
-
- /* Close */
- status = H5Dclose(did);
- assert(status>=0);
- status = H5Gclose(gid);
- assert(status>=0);
+ if (make_diffs)
+ {
+ for (i=0; i<2; i++)
+ buf2[i]=buf2[1]=0;
+ }
- /* Close file */
- status = H5Fclose(fid);
- assert(status>=0);
- return status;
-}
+ tid = H5Tcopy(H5T_STD_B8LE);
+ write_dset(loc_id,1,dims,"bitfield",tid,buf2);
+ status = H5Tclose(tid);
/*-------------------------------------------------------------------------
- * Function: test_basic
- *
- * Purpose: Basic review tests
- *
+ * H5T_OPAQUE
*-------------------------------------------------------------------------
*/
-static
-int test_basic(const char *file1,
- const char *file2)
-{
- hid_t fid1, fid2;
- hid_t gid1, gid2, gid3;
- herr_t status;
- hsize_t dims[2] = { 3,2 };
+ if (make_diffs)
+ {
+ for (i=0; i<2; i++)
+ {
+ buf3[i].a=0; buf3[i].b=0;
+ }
+ }
- /* 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}};
- int data5[3][2] = {{100,100},{100,100},{100,100}};
- int data6[3][2] = {{101,102},{103,104},{150,200}};
- unsigned long_long data7[3][2] = {{100,100},{100,100},{100,100}};
- unsigned long_long data8[3][2] = {{101,102},{103,104},{150,200}};
+ tid = H5Tcreate(H5T_OPAQUE, 1);
+ status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+ write_dset(loc_id,1,dims,"opaque",tid,buf2);
+ status = H5Tclose(tid);
/*-------------------------------------------------------------------------
- * Create two files
+ * H5T_COMPOUND
*-------------------------------------------------------------------------
*/
- fid1 = H5Fcreate (file1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
- fid2 = H5Fcreate (file2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
- /* Create groups */
- gid1 = H5Gcreate(fid1, "g1", 0);
- gid2 = H5Gcreate(fid2, "g1", 0);
- gid3 = H5Gcreate(fid2, "g2", 0);
+ if (make_diffs)
+ {
+ for (i=0; i<2; i++)
+ {
+ buf45[i]=GREEN;
+ }
+ }
- write_dset(gid1,2,dims,"dset1",H5T_NATIVE_DOUBLE,data1);
- write_dset(gid2,2,dims,"dset2",H5T_NATIVE_DOUBLE,data2);
- write_dset(gid1,2,dims,"dset3",H5T_NATIVE_DOUBLE,data3);
- write_dset(gid2,2,dims,"dset4",H5T_NATIVE_DOUBLE,data4);
- write_dset(gid2,2,dims,"dset1",H5T_NATIVE_DOUBLE,data2);
+ tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+ H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+ H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+ write_dset(loc_id,1,dims,"compound",tid,buf3);
+ status = H5Tclose(tid);
- /* relative (int) */
- write_dset(gid1,2,dims,"dset5",H5T_NATIVE_INT,data5);
- write_dset(gid1,2,dims,"dset6",H5T_NATIVE_INT,data6);
- /* relative (unsigned long_long) */
- write_dset(gid1,2,dims,"dset7",H5T_NATIVE_ULLONG,data7);
- write_dset(gid1,2,dims,"dset8",H5T_NATIVE_ULLONG,data8);
+/*-------------------------------------------------------------------------
+ * H5T_REFERENCE (H5R_OBJECT object reference)
+ *-------------------------------------------------------------------------
+ */
+ /* Create references to dataset */
+ if (dset_name)
+ {
+ status=H5Rcreate(&buf4[0],fid,dset_name,H5R_OBJECT,-1);
+ status=H5Rcreate(&buf4[1],fid,dset_name,H5R_OBJECT,-1);
+ write_dset(loc_id,1,dims,"reference",H5T_STD_REF_OBJ,buf4);
+ }
/*-------------------------------------------------------------------------
- * Close
+ * H5T_REFERENCE (H5R_DATASET_REGION dataset region reference)
*-------------------------------------------------------------------------
*/
- status = H5Gclose(gid1);
- status = H5Gclose(gid2);
- status = H5Gclose(gid3);
- status = H5Fclose(fid1);
- status = H5Fclose(fid2);
- return status;
-}
+
+ gen_datareg(fid,make_diffs);
/*-------------------------------------------------------------------------
- * Function: test_basic
- *
- * Purpose: Compare different HDF5 types (H5G_obj_t):
- * H5G_DATASET, H5G_TYPE, H5G_GROUP, H5G_LINK, H5G_UDLINK
- *
+ * H5T_ENUM
*-------------------------------------------------------------------------
*/
-static
-int test_types(const char *file1,
- const char UNUSED *file2)
-{
+ tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+ H5Tenum_insert(tid, "RED", (val = 0, &val));
+ H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+ write_dset(loc_id,1,dims,"enum",tid,buf45);
+ status = H5Tclose(tid);
- hid_t fid1;
- hid_t gid1;
- hid_t gid2;
- hid_t tid1;
- hid_t tid2;
- herr_t status;
- hsize_t dims[1]={1};
- typedef struct s1_t
- {
- int a;
- float b;
- } s1_t;
- typedef struct s2_t
+/*-------------------------------------------------------------------------
+ * H5T_VLEN
+ *-------------------------------------------------------------------------
+ */
+
+ /* Allocate and initialize VL dataset to write */
+
+ buf5[0].len = 1;
+ buf5[0].p = malloc( 1 * sizeof(int));
+ ((int *)buf5[0].p)[0]=1;
+ buf5[1].len = 2;
+ buf5[1].p = malloc( 2 * sizeof(int));
+ ((int *)buf5[1].p)[0]=2;
+ ((int *)buf5[1].p)[1]=3;
+
+ if (make_diffs)
{
- int a;
- } s2_t;
+ ((int *)buf5[0].p)[0]=0;
+ ((int *)buf5[1].p)[0]=0;
+ ((int *)buf5[1].p)[1]=0;
+ }
+
+ sid = H5Screate_simple(1,dims,NULL);
+ tid = H5Tvlen_create(H5T_NATIVE_INT);
+ did = H5Dcreate(loc_id,"vlen",tid,sid,H5P_DEFAULT);
+ status = H5Dwrite(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf5);
+ assert(status>=0);
+ status = H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf5);
+ assert(status>=0);
+ status = H5Dclose(did);
+ status = H5Tclose(tid);
+ status = H5Sclose(sid);
/*-------------------------------------------------------------------------
- * Create one file
+ * H5T_ARRAY
*-------------------------------------------------------------------------
*/
- fid1 = H5Fcreate (file1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+ if (make_diffs)
+ {
+ for (i=0; i<2; i++)
+ for (j=0; j<3; j++)
+ {
+ buf6[i][j]=0;
+ }
+ }
+
+ tid = H5Tarray_create(H5T_NATIVE_INT, 1, dimarray, NULL);
+ write_dset(loc_id,1,dims,"array",tid,buf6);
+ status = H5Tclose(tid);
/*-------------------------------------------------------------------------
- * H5G_DATASET
+ * H5T_INTEGER and H5T_FLOAT
*-------------------------------------------------------------------------
*/
- write_dset(fid1,1,dims,"dset",H5T_NATIVE_INT,0);
+
+ if (make_diffs)
+ {
+ for (i=0; i<2; i++)
+ {
+ buf7[i]=0;
+ buf8[i]=0;
+ }
+ }
+
+ write_dset(loc_id,1,dims,"integer",H5T_NATIVE_INT,buf7);
+ write_dset(loc_id,1,dims,"float",H5T_NATIVE_FLOAT,buf8);
+
/*-------------------------------------------------------------------------
- * H5G_GROUP
+ * 2D
*-------------------------------------------------------------------------
*/
- gid1 = H5Gcreate(fid1, "g1", 0);
- status = H5Gclose(gid1);
- gid2 = H5Gcreate(fid1, "g2", 0);
- status = H5Gclose(gid2);
/*-------------------------------------------------------------------------
- * H5G_TYPE
+ * H5T_STRING
*-------------------------------------------------------------------------
*/
- /* create and commit datatype 1 */
- tid1 = H5Tcreate (H5T_COMPOUND, sizeof(s1_t));
- H5Tinsert(tid1, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT);
- H5Tinsert(tid1, "b", HOFFSET(s1_t, b), H5T_NATIVE_FLOAT);
- H5Tcommit(fid1, "t1", tid1);
- H5Tclose(tid1);
- /* create and commit datatype 2 */
- tid2 = H5Tcreate (H5T_COMPOUND, sizeof(s2_t));
- H5Tinsert(tid2, "a", HOFFSET(s2_t, a), H5T_NATIVE_INT);
- H5Tcommit(fid1, "t2", tid2);
- H5Tclose(tid2);
+ if (make_diffs)
+ {
+ memset(buf12, 'z', sizeof buf12);
+ }
+
+
+ tid = H5Tcopy(H5T_C_S1);
+ status = H5Tset_size(tid,STR_SIZE);
+ write_dset(loc_id,2,dims2,"string2D",tid,buf12);
+ status = H5Tclose(tid);
/*-------------------------------------------------------------------------
- * H5G_LINK
+ * H5T_BITFIELD
*-------------------------------------------------------------------------
*/
- status = H5Glink(fid1, H5L_TYPE_SOFT, "g1", "l1");
- status = H5Glink(fid1, H5L_TYPE_SOFT, "g2", "l2");
+
+ if (make_diffs)
+ {
+ memset(buf22,0,sizeof buf22);
+ }
+
+ tid = H5Tcopy(H5T_STD_B8LE);
+ write_dset(loc_id,2,dims2,"bitfield2D",tid,buf22);
+ status = H5Tclose(tid);
/*-------------------------------------------------------------------------
- * H5G_UDLINK
+ * H5T_OPAQUE
*-------------------------------------------------------------------------
*/
- H5Lcreate_external("filename", "objname", fid1, "ext_link", H5P_DEFAULT, H5P_DEFAULT);
- H5Lregister(UD_link_class);
- H5Lcreate_ud(fid1, "ud_link", MY_LINKCLASS, NULL, 0, H5P_DEFAULT, H5P_DEFAULT);
+ tid = H5Tcreate(H5T_OPAQUE, 1);
+ status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+ write_dset(loc_id,2,dims2,"opaque2D",tid,buf22);
+ status = H5Tclose(tid);
/*-------------------------------------------------------------------------
- * Close
+ * H5T_COMPOUND
*-------------------------------------------------------------------------
*/
- status = H5Fclose(fid1);
- return status;
-}
+
+ if (make_diffs)
+ {
+ memset(buf32,0,sizeof buf32);
+ }
+
+ tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+ H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+ H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+ write_dset(loc_id,2,dims2,"compound2D",tid,buf32);
+ status = H5Tclose(tid);
/*-------------------------------------------------------------------------
- * Function: test_native
- *
- * Purpose: test datasets datatypes
- *
+ * H5T_REFERENCE (H5R_OBJECT object reference)
*-------------------------------------------------------------------------
*/
-static
-int test_native(const char *file1,
- const char UNUSED *file2)
-{
+ /* Create references to dataset */
+ if (dset_name)
+ {
+ for (i = 0; i < 3; i++) {
+ for (j = 0; j < 2; j++) {
+ status=H5Rcreate(&buf42[i][j],fid,dset_name,H5R_OBJECT,-1);
+ }
+ }
+ write_dset(loc_id,2,dims2,"reference2D",H5T_STD_REF_OBJ,buf42);
+ }
- hid_t fid1;
- 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}};
+/*-------------------------------------------------------------------------
+ * H5T_ENUM
+ *-------------------------------------------------------------------------
+ */
- /*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}};
+ tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+ H5Tenum_insert(tid, "RED", (val = 0, &val));
+ H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+ write_dset(loc_id,2,dims2,"enum2D",tid,0);
+ status = H5Tclose(tid);
- /* 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}};
+/*-------------------------------------------------------------------------
+ * H5T_VLEN
+ *-------------------------------------------------------------------------
+ */
- unsigned int buf10a[3][2] = {{UIMAX,1},{1,1},{1,1}};
- unsigned int buf10b[3][2] = {{UIMAX-1,1},{3,4},{5,6}};
+/* Allocate and initialize VL dataset to write */
+ n=0;
+ for (i = 0; i < 3; i++) {
+ for (j = 0; j < 2; j++) {
+ int l;
+ buf52[i][j].p = malloc((i + 1) * sizeof(int));
+ buf52[i][j].len = i + 1;
+ for (l = 0; l < i + 1; l++)
+ if (make_diffs)((int *)buf52[i][j].p)[l] = 0;
+ else ((int *)buf52[i][j].p)[l] = n++;
+ }
+ }
+ sid = H5Screate_simple(2,dims2,NULL);
+ tid = H5Tvlen_create(H5T_NATIVE_INT);
+ did = H5Dcreate(loc_id,"vlen2D",tid,sid,H5P_DEFAULT);
+ status = H5Dwrite(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf52);
+ assert(status>=0);
+ status = H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf52);
+ assert(status>=0);
+ status = H5Dclose(did);
+ status = H5Tclose(tid);
+ status = H5Sclose(sid);
/*-------------------------------------------------------------------------
- * Create a file
+ * H5T_ARRAY
*-------------------------------------------------------------------------
*/
- fid1 = H5Fcreate (file1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+ if (make_diffs)
+ {
+ memset(buf62,0,sizeof buf62);
+ }
+
+
+ tid = H5Tarray_create(H5T_NATIVE_INT, 1, dimarray, NULL);
+ write_dset(loc_id,2,dims2,"array2D",tid,buf62);
+ status = H5Tclose(tid);
/*-------------------------------------------------------------------------
- * Check for different storage order. Give a warning if they are different
+ * H5T_INTEGER, write a fill value
*-------------------------------------------------------------------------
*/
- write_dset(fid1,2,dims,"dset0a",H5T_STD_I16LE,buf2a);
- write_dset(fid1,2,dims,"dset0b",H5T_STD_I32LE,buf3b);
+
+ if (make_diffs)
+ {
+ memset(buf72,0,sizeof buf72);
+ memset(buf82,0,sizeof buf82);
+ }
+
+
+ dcpl = H5Pcreate(H5P_DATASET_CREATE);
+ status = H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillvalue);
+ sid = H5Screate_simple(2,dims2,NULL);
+ did = H5Dcreate(loc_id,"integer2D",H5T_NATIVE_INT,sid,dcpl);
+ status = H5Dwrite(did,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf72);
+ status = H5Pclose(dcpl);
+ status = H5Dclose(did);
+ status = H5Sclose(sid);
/*-------------------------------------------------------------------------
- * Check H5T_NATIVE_CHAR
+ * H5T_FLOAT
*-------------------------------------------------------------------------
*/
- write_dset(fid1,2,dims,"dset1a",H5T_NATIVE_CHAR,buf1a);
- write_dset(fid1,2,dims,"dset1b",H5T_NATIVE_CHAR,buf1b);
+
+ write_dset(loc_id,2,dims2,"float2D",H5T_NATIVE_FLOAT,buf82);
+
/*-------------------------------------------------------------------------
- * Check H5T_NATIVE_SHORT
+ * 3D
*-------------------------------------------------------------------------
*/
- write_dset(fid1,2,dims,"dset2a",H5T_NATIVE_SHORT,buf2a);
- write_dset(fid1,2,dims,"dset2b",H5T_NATIVE_SHORT,buf2b);
/*-------------------------------------------------------------------------
- * Check H5T_NATIVE_INT
+ * H5T_STRING
*-------------------------------------------------------------------------
*/
- write_dset(fid1,2,dims,"dset3a",H5T_NATIVE_INT,buf3a);
- write_dset(fid1,2,dims,"dset3b",H5T_NATIVE_INT,buf3b);
+
+ if (make_diffs)
+ {
+ memset(buf13,'z',sizeof buf13);
+ }
+
+ tid = H5Tcopy(H5T_C_S1);
+ status = H5Tset_size(tid,STR_SIZE);
+ write_dset(loc_id,3,dims3,"string3D",tid,buf13);
+ status = H5Tclose(tid);
/*-------------------------------------------------------------------------
- * Check H5T_NATIVE_LONG
+ * H5T_BITFIELD
*-------------------------------------------------------------------------
*/
- write_dset(fid1,2,dims,"dset4a",H5T_NATIVE_LONG,buf4a);
- write_dset(fid1,2,dims,"dset4b",H5T_NATIVE_LONG,buf4b);
+
+
+ n=1;
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < 3; j++) {
+ for (k = 0; k < 2; k++) {
+ if (make_diffs) buf23[i][j][k]=0;
+ else buf23[i][j][k]=n++;
+ }
+ }
+ }
+
+
+ tid = H5Tcopy(H5T_STD_B8LE);
+ write_dset(loc_id,3,dims3,"bitfield3D",tid,buf23);
+ status = H5Tclose(tid);
/*-------------------------------------------------------------------------
- * Check H5T_NATIVE_FLOAT
+ * H5T_OPAQUE
*-------------------------------------------------------------------------
*/
- write_dset(fid1,2,dims,"dset5a",H5T_NATIVE_FLOAT,buf5a);
- write_dset(fid1,2,dims,"dset5b",H5T_NATIVE_FLOAT,buf5b);
+ tid = H5Tcreate(H5T_OPAQUE, 1);
+ status = H5Tset_tag(tid, "1-byte opaque type"); /* must set this */
+ write_dset(loc_id,3,dims3,"opaque3D",tid,buf23);
+ status = H5Tclose(tid);
/*-------------------------------------------------------------------------
- * Check H5T_NATIVE_DOUBLE
+ * H5T_COMPOUND
*-------------------------------------------------------------------------
*/
- write_dset(fid1,2,dims,"dset6a",H5T_NATIVE_DOUBLE,buf6a);
- write_dset(fid1,2,dims,"dset6b",H5T_NATIVE_DOUBLE,buf6b);
+ n=1;
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < 3; j++) {
+ for (k = 0; k < 2; k++) {
+ if (make_diffs) {
+ buf33[i][j][k].a=0;
+ buf33[i][j][k].b=0;
+ }
+ else {
+ buf33[i][j][k].a=n++;
+ buf33[i][j][k].b=n++;
+ }
+ }
+ }
+ }
+
+
+ tid = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+ H5Tinsert(tid, "a", HOFFSET(s_t, a), H5T_NATIVE_CHAR);
+ H5Tinsert(tid, "b", HOFFSET(s_t, b), H5T_NATIVE_DOUBLE);
+ write_dset(loc_id,3,dims3,"compound3D",tid,buf33);
+ status = H5Tclose(tid);
/*-------------------------------------------------------------------------
- * H5T_NATIVE_CHAR and H5T_NATIVE_UCHAR
+ * H5T_REFERENCE (H5R_OBJECT object reference)
*-------------------------------------------------------------------------
*/
-
- write_dset(fid1,2,dims,"dset7a",H5T_NATIVE_CHAR,buf7a);
- write_dset(fid1,2,dims,"dset7b",H5T_NATIVE_UCHAR,buf7b);
+ /* Create references to dataset */
+ if (dset_name)
+ {
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < 3; j++) {
+ for (k = 0; k < 2; k++)
+ status=H5Rcreate(&buf43[i][j][k],fid,dset_name,H5R_OBJECT,-1);
+ }
+ }
+ write_dset(loc_id,3,dims3,"reference3D",H5T_STD_REF_OBJ,buf43);
+ }
/*-------------------------------------------------------------------------
- * H5T_NATIVE_LLONG
+ * H5T_ENUM
*-------------------------------------------------------------------------
*/
- write_dset(fid1,2,dims,"dset8a",H5T_NATIVE_LLONG,buf8a);
- write_dset(fid1,2,dims,"dset8b",H5T_NATIVE_LLONG,buf8b);
+ tid = H5Tcreate(H5T_ENUM, sizeof(e_t));
+ H5Tenum_insert(tid, "RED", (val = 0, &val));
+ H5Tenum_insert(tid, "GREEN", (val = 1, &val));
+ write_dset(loc_id,3,dims3,"enum3D",tid,0);
+ status = H5Tclose(tid);
/*-------------------------------------------------------------------------
- * H5T_NATIVE_ULLONG
+ * H5T_VLEN
*-------------------------------------------------------------------------
*/
- write_dset(fid1,2,dims,"dset9a",H5T_NATIVE_ULLONG,buf9a);
- write_dset(fid1,2,dims,"dset9b",H5T_NATIVE_ULLONG,buf9b);
+ /* Allocate and initialize VL dataset to write */
+ n=0;
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < 3; j++) {
+ for (k = 0; k < 2; k++) {
+ int l;
+ buf53[i][j][k].p = malloc((i + 1) * sizeof(int));
+ buf53[i][j][k].len = i + 1;
+ for (l = 0; l < i + 1; l++)
+ if (make_diffs)((int *)buf53[i][j][k].p)[l] = 0;
+ else ((int *)buf53[i][j][k].p)[l] = n++;
+ }
+ }
+ }
+
+ sid = H5Screate_simple(3,dims3,NULL);
+ tid = H5Tvlen_create(H5T_NATIVE_INT);
+ did = H5Dcreate(loc_id,"vlen3D",tid,sid,H5P_DEFAULT);
+ status = H5Dwrite(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf53);
+ assert(status>=0);
+ status = H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf53);
+ assert(status>=0);
+ status = H5Dclose(did);
+ status = H5Tclose(tid);
+ status = H5Sclose(sid);
/*-------------------------------------------------------------------------
- * H5T_NATIVE_INT
+ * H5T_ARRAY
*-------------------------------------------------------------------------
*/
- write_dset(fid1,2,dims,"dset10a",H5T_NATIVE_UINT,buf10a);
- write_dset(fid1,2,dims,"dset10b",H5T_NATIVE_UINT,buf10b);
+ n=1;
+ for (i = 0; i < 24; i++) {
+ for (j = 0; j < (int)dimarray[0]; j++) {
+ if (make_diffs) buf63[i][j]=0;
+ else buf63[i][j]=n++;
+ }
+ }
+
+ tid = H5Tarray_create(H5T_NATIVE_INT, 1, dimarray, NULL);
+ write_dset(loc_id,3,dims3,"array3D",tid,buf63);
+ status = H5Tclose(tid);
/*-------------------------------------------------------------------------
- * Close
+ * H5T_INTEGER and H5T_FLOAT
*-------------------------------------------------------------------------
*/
- status = H5Fclose(fid1);
- return status;
+ n=1; f=1;
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < 3; j++) {
+ for (k = 0; k < 2; k++) {
+ if (make_diffs) {
+ buf73[i][j][k]=0;
+ buf83[i][j][k]=0;
+ }
+ else {
+ buf73[i][j][k]=n++;
+ buf83[i][j][k]=f++;
+ }
+ }
+ }
+ }
+ write_dset(loc_id,3,dims3,"integer3D",H5T_NATIVE_INT,buf73);
+ write_dset(loc_id,3,dims3,"float3D",H5T_NATIVE_FLOAT,buf83);
}
/*-------------------------------------------------------------------------
- * Function: test_attr
+ * Function: gen_datareg
*
- * Purpose: test attributes
+ * Purpose: generate a dataset region and its reference
+ *
+ * Date: April 19, 2006
*
*-------------------------------------------------------------------------
*/
+
static
-int test_attr(const char *file,
- int make_diffs /* flag to modify data buffers */)
+void gen_datareg(hid_t fid,
+ int make_diffs /* flag to modify data buffers */)
{
- hid_t fid;
- hid_t did;
- hid_t gid;
- hid_t root_id;
- hid_t sid;
- hsize_t dims[1]={2};
- herr_t status;
+ /* data dataset */
+ hid_t did1; /* dataset ID */
+ hid_t sid1; /* dataspace ID */
+ hsize_t dims1[2] = {10,10};/* dimensions */
+ int *buf; /* dataset buffer */
+ /* reference dataset */
+ hid_t did2; /* dataset ID */
+ hid_t sid2; /* dataspace ID */
+ hsize_t dims2[] = {2}; /* 2 references */
+ hdset_reg_ref_t *rbuf; /* buffer for write the references */
+ hsize_t start[10]; /* starting location of hyperslab */
+ hsize_t count[10]; /* element count of hyperslab */
+ hsize_t coord[5][2]; /* coordinates for point selection */
+ herr_t status;
+ int i;
- /* Create a file */
- if ((fid = H5Fcreate(file, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0)
- return -1;
+ /* allocate the buffer for write the references */
+ rbuf=calloc(2,sizeof(hdset_reg_ref_t));
- /* Create a 1D dataset */
- sid = H5Screate_simple(1,dims,NULL);
- did = H5Dcreate(fid,"dset",H5T_NATIVE_INT,sid,H5P_DEFAULT);
- status = H5Sclose(sid);
- assert(status>=0);
+ /* allocate the buffer for write the data dataset */
+ buf=malloc(10*10*sizeof(int));
+
+ for (i=0; i<10*10; i++)
+ {
+ buf[i]=i;
+ }
+
+ /* create the data dataset */
+ sid1 = H5Screate_simple(2,dims1,NULL);
+ did1 = H5Dcreate(fid,"dsetref",H5T_NATIVE_INT,sid1,H5P_DEFAULT);
+ status = H5Dwrite(did1,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf);
+
+ /* create the reference dataset */
+ sid2 = H5Screate_simple(1,dims2,NULL);
+ did2 = H5Dcreate(fid,"refreg",H5T_STD_REF_DSETREG,sid2,H5P_DEFAULT);
+
+ /* create the references */
+ /* select hyperslab for first reference */
+
+ start[0]=2; start[1]=2;
+ count[0]=6; count[1]=6;
+ if (make_diffs)
+ {
+ start[0]=0; start[1]=0;
+ count[0]=3; count[1]=3;
+ }
+
+ status = H5Sselect_hyperslab(sid1,H5S_SELECT_SET,start,NULL,count,NULL);
+ H5Sget_select_npoints(sid1);
+
+ /* store first dataset region */
+ status = H5Rcreate(&rbuf[0],fid,"dsetref",H5R_DATASET_REGION,sid1);
+
+ /* select sequence of five points for second reference */
+ coord[0][0]=6; coord[0][1]=9;
+ coord[1][0]=2; coord[1][1]=2;
+ coord[2][0]=8; coord[2][1]=4;
+ coord[3][0]=1; coord[3][1]=6;
+ coord[4][0]=2; coord[4][1]=8;
+ if (make_diffs)
+ {
+ coord[1][0]=3; coord[1][1]=3;
+ coord[3][0]=2; coord[3][1]=5;
+ coord[4][0]=1; coord[4][1]=7;
+ }
+ H5Sselect_elements(sid1,H5S_SELECT_SET,5,(const hsize_t **)coord);
+ H5Sget_select_npoints(sid1);
+
+ /* store second dataset region */
+ H5Rcreate(&rbuf[1],fid,"dsetref",H5R_DATASET_REGION,sid1);
+
+ /* write */
+ status = H5Dwrite(did2,H5T_STD_REF_DSETREG,H5S_ALL,H5S_ALL,H5P_DEFAULT,rbuf);
+
+ /* close, free memory buffers */
+ status = H5Dclose(did1);
+ status = H5Sclose(sid1);
+ status = H5Dclose(did2);
+ status = H5Sclose(sid2);
+ free(rbuf);
+ free(buf);
+
+}
- /* Create groups */
- gid = H5Gcreate(fid,"g1",0);
- root_id = H5Gopen(fid, "/");
/*-------------------------------------------------------------------------
- * write a series of attributes on the dataset, group, and root group
+ * Function: test_hyperslab
+ *
+ * Purpose: test diff by hyperslabs. create a dataset with 1GB dimensions
+ * by iterating trough 1KB hyperslabs
+ *
*-------------------------------------------------------------------------
*/
+static
+int test_hyperslab(char *fname,
+ int make_diffs /* flag to modify data buffers */)
+{
+ hid_t did;
+ hid_t fid;
+ hid_t f_sid;
+ hid_t m_sid;
+ hid_t tid;
+ hid_t dcpl;
+ hsize_t dims[1]={GBLL}; /* dataset dimensions */
+ hsize_t hs_size[1]={GBLL/(1024*1024)}; /* hyperslab dimensions */
+ hsize_t chunk_dims[1]={GBLL/1024}; /* chunk dimensions */
+ hsize_t hs_start[1];
+ size_t size;
+ size_t nelmts=(size_t)GBLL/(1024*1024); /* elements in each hyperslab */
+ char fillvalue=-1;
+ char *buf=NULL;
+ int i, j, s;
+ char c;
+
+ /* create */
+ fid = H5Fcreate (fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ if ((dcpl = H5Pcreate(H5P_DATASET_CREATE))<0)
+ goto out;
+ if (H5Pset_fill_value(dcpl, H5T_NATIVE_CHAR, &fillvalue)<0)
+ goto out;
+ if(H5Pset_chunk(dcpl, 1, chunk_dims)<0)
+ goto out;
+ if ((f_sid = H5Screate_simple(1,dims,NULL))<0)
+ goto out;
+ if ((did = H5Dcreate(fid,"big",H5T_NATIVE_CHAR,f_sid,dcpl))<0)
+ goto out;
+ if ((m_sid = H5Screate_simple(1, hs_size, hs_size))<0)
+ goto out;
+ if ((tid = H5Dget_type(did))<0)
+ goto out;
+ if ((size = H5Tget_size(tid))<=0)
+ goto out;
+
+ /* create a evenly divided buffer from 0 to 127 */
+ buf=(char *) HDmalloc((unsigned)(nelmts*size));
+ s = 1024*1024 / 127;
+ for (i=0, j=0, c=0; i<1024*1024; j++, i++)
+ {
+ if ( j==s)
+ {
+ c++;
+ j=0;
+ };
- write_attr_in(did,"dset",fid,make_diffs);
- write_attr_in(gid,NULL,0,make_diffs);
- write_attr_in(root_id,NULL,0,make_diffs);
+ /* set the hyperslab values */
+ HDmemset(buf, c, nelmts);
+ /* make a different hyperslab at this position */
+ if (make_diffs && i==512*512)
+ {
+ HDmemset(buf, 0, nelmts);
+ }
+
+ hs_start[0] = i * GBLL/(1024*1024);
+ if (H5Sselect_hyperslab (f_sid,H5S_SELECT_SET,hs_start,NULL,hs_size, NULL)<0)
+ goto out;
- /* Close */
- status = H5Dclose(did);
- assert(status>=0);
- status = H5Gclose(gid);
- assert(status>=0);
- status = H5Gclose(root_id);
- assert(status>=0);
+ /* write only one hyperslab */
+ if ( i==512*512)
+ {
+ if (H5Dwrite (did,H5T_NATIVE_CHAR,m_sid,f_sid,H5P_DEFAULT,buf)<0)
+ goto out;
+ }
+
+ }
+ free(buf);
+ buf=NULL;
+
+ /* close */
+ if(H5Sclose(f_sid)<0)
+ goto out;
+ if(H5Sclose(m_sid)<0)
+ goto out;
+ if(H5Pclose(dcpl)<0)
+ goto out;
+ if(H5Dclose(did)<0)
+ goto out;
+ H5Fclose(fid);
+
+ return 0;
+
+out:
+ H5E_BEGIN_TRY {
+ H5Pclose(dcpl);
+ H5Sclose(f_sid);
+ H5Sclose(m_sid);
+ H5Dclose(did);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+ return -1;
- /* Close file */
- status = H5Fclose(fid);
- assert(status>=0);
- return status;
}
/*-------------------------------------------------------------------------
- * Function: main
+ * Function: write_attr
*
- * Purpose: main program
+ * Purpose: utility function to write an attribute in LOC_ID
*
*-------------------------------------------------------------------------
*/
+static
+int write_attr(hid_t loc_id,
+ int rank,
+ hsize_t *dims,
+ const char *name,
+ hid_t tid,
+ void *buf)
+{
+ hid_t aid;
+ hid_t sid;
+ herr_t status;
+
+ /* Create a buf space */
+ sid = H5Screate_simple(rank,dims,NULL);
-int main(int UNUSED argc, const UNUSED char *argv[])
+ /* Create the attribute */
+ aid = H5Acreate(loc_id,name,tid,sid,H5P_DEFAULT);
+
+ /* Write the buf */
+ if ( buf )
+ status = H5Awrite(aid,tid,buf);
+
+ /* Close */
+ status = H5Aclose(aid);
+ status = H5Sclose(sid);
+ return status;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: write_dset
+ *
+ * Purpose: utility function to create and write a dataset in LOC_ID
+ *
+ *-------------------------------------------------------------------------
+ */
+static
+int write_dset( hid_t loc_id,
+ int rank,
+ hsize_t *dims,
+ const char *name,
+ hid_t tid,
+ void *buf )
{
+ hid_t did;
+ hid_t sid;
+ herr_t status;
- test_basic (FILE1,FILE2);
- test_types (FILE3,NULL);
- test_native(FILE4,NULL);
+ /* Create a buf space */
+ sid = H5Screate_simple(rank,dims,NULL);
- /* generate 2 files with attribute differences */
- test_attr(FILE5,0);
- test_attr(FILE6,1);
+ /* Create a dataset */
+ did = H5Dcreate(loc_id,name,tid,sid,H5P_DEFAULT);
- /* generate 2 files with all datatype differences */
- test_dsetall(FILE7,0);
- test_dsetall(FILE8,1);
- return 0;
+ /* Write the buf */
+ if ( buf )
+ status = H5Dwrite(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf);
+
+ /* Close */
+ status = H5Dclose(did);
+ status = H5Sclose(sid);
+
+ return status;
}