summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBinh-Minh Ribler <bmribler@hdfgroup.org>2016-03-04 19:49:14 (GMT)
committerBinh-Minh Ribler <bmribler@hdfgroup.org>2016-03-04 19:49:14 (GMT)
commit9592119ffd4b87b3cdb08f1ad8eaf7f3d221554c (patch)
tree7cf325e26c3422dadb5d2e0e73e73ab4a0cf583c
parent6e7e6bb3aa3b0106d44d7b50e79d1c6281940257 (diff)
downloadhdf5-9592119ffd4b87b3cdb08f1ad8eaf7f3d221554c.zip
hdf5-9592119ffd4b87b3cdb08f1ad8eaf7f3d221554c.tar.gz
hdf5-9592119ffd4b87b3cdb08f1ad8eaf7f3d221554c.tar.bz2
[svn-r29269] Purpose: Improve Packet Table library
Description: The Packet Table API used to have fixed-length and variable-length functions (i.e., H5PTcreate_fl and H5PTcreate_vl), but in 2006, the vlen functions were ifdef'ed out with VLPT_REMOVED, see HDFFV-442. The majority of this revision includes removing unused vlen stuff, adding various vlen tests, initial code cleanup, and first pass of commenting. Details: - Removed the VLPT_REMOVED ifdef, but keep H5PTis_varlen and the free function because they are useful or even needed, but the free function's name is changed to be more appropriate for both read/write buffers, i.e., H5PTfree_vlen_buff. - The new test file, test_packet_vlen.c, contains tests showing packet tables, containing various types of vlen data, can be created with the fixed-length function - Two accessor functions were added per HDFFV-8623/patch 003. /* Returns the ID of the dataset associated with the packet table */ hid_t H5PTget_dataset(hid_t table_id); /* Returns the ID of the datatype the packet table uses */ hid_t H5PTget_type(hid_t table_id); - Various cleanup: replacing 0/-1 with SUCCEED/FAIL and H5I_BADID with H5I_INVALID_HID, and removing many warnings. Platforms tested: Linux/32 2.6 (jam) Linux/64 (platypus) Darwin (osx1010test)
-rw-r--r--hl/src/H5PT.c528
-rw-r--r--hl/src/H5PTpublic.h68
-rw-r--r--hl/test/Makefile.am3
-rw-r--r--hl/test/h5hltest.h2
-rw-r--r--hl/test/test_packet.c520
-rw-r--r--hl/test/test_packet_vlen.c1098
6 files changed, 1643 insertions, 576 deletions
diff --git a/hl/src/H5PT.c b/hl/src/H5PT.c
index 6ed1ac0..e2d6a3d 100644
--- a/hl/src/H5PT.c
+++ b/hl/src/H5PT.c
@@ -48,15 +48,15 @@ static herr_t H5PT_get_index(htbl_t *table_id, hsize_t *pt_index);
*/
/*-------------------------------------------------------------------------
- * Function: H5PTcreate_fl
+ * Function: H5PTcreate
*
* Purpose: Creates a dataset containing a table and returns the Identifier
- * of the table.
+ * of the table. (Copied mostly from H5PTcreate_fl)
*
- * Return: Success: table ID, Failure: Negative
+ * Return: Success: table ID, Failure: FAIL
*
- * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
- * James Laird, jlaird@ncsa.uiuc.edu
+ * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu (Author of H5PTcreate_fl)
+ * James Laird, jlaird@ncsa.uiuc.edu (Author of H5PTcreate_fl)
*
* Date: March 12, 2004
*
@@ -65,80 +65,93 @@ static herr_t H5PT_get_index(htbl_t *table_id, hsize_t *pt_index);
* table is initially of size 0.
*
* Modifications:
+ * Mar 1, 2016
+ * This function is added to replace H5PTcreate_fl and it differs
+ * from H5PTcreate_fl only because its last argument is plist_id
+ * instead of compression; this is to allow flexible compression.
+ * -BMR
*
*-------------------------------------------------------------------------
*/
-
-hid_t H5PTcreate_fl ( hid_t loc_id,
- const char *dset_name,
- hid_t dtype_id,
- hsize_t chunk_size,
- int compression )
+hid_t H5PTcreate(hid_t loc_id,
+ const char *dset_name,
+ hid_t dtype_id,
+ hsize_t chunk_size,
+ hid_t plist_id)
{
htbl_t * table = NULL;
- hid_t dset_id = H5I_BADID;
- hid_t space_id = H5I_BADID;
- hid_t plist_id = H5I_BADID;
+ hid_t dset_id = H5I_INVALID_HID;
+ hid_t space_id = H5I_INVALID_HID;
+ hid_t plistcopy_id = H5I_INVALID_HID;
hsize_t dims[1];
hsize_t dims_chunk[1];
hsize_t maxdims[1];
- hid_t ret_value;
+ hid_t ret_value = H5I_INVALID_HID;
/* check the arguments */
if (dset_name == NULL) {
- goto out;
+ goto error;
}
/* Register the packet table ID type if this is the first table created */
if(H5PT_ptable_id_type < 0)
if((H5PT_ptable_id_type = H5Iregister_type((size_t)H5PT_HASH_TABLE_SIZE, 0, (H5I_free_t)H5PT_free_id)) < 0)
- goto out;
+ goto error;
/* Get memory for the table identifier */
table = (htbl_t *)HDmalloc(sizeof(htbl_t));
+ if ( table == NULL ) {
+ goto error;
+ }
+ table->dset_id = H5I_INVALID_HID;
+ table->type_id = H5I_INVALID_HID;
/* Create a simple data space with unlimited size */
dims[0] = 0;
dims_chunk[0] = chunk_size;
maxdims[0] = H5S_UNLIMITED;
if((space_id = H5Screate_simple(1, dims, maxdims)) < 0)
- goto out;
+ goto error;
/* Modify dataset creation properties to enable chunking */
- plist_id = H5Pcreate(H5P_DATASET_CREATE);
- if(H5Pset_chunk(plist_id, 1, dims_chunk) < 0)
- goto out;
- if(compression >= 0 && compression <= 9)
- if(H5Pset_deflate(plist_id, (unsigned)compression) < 0)
- goto out;
+ if (plist_id == H5P_DEFAULT) {
+ plistcopy_id = H5Pcreate(H5P_DATASET_CREATE);
+ }
+ else {
+ plistcopy_id = H5Pcopy(plist_id);
+ }
+ if (chunk_size > 0)
+ {
+ if(H5Pset_chunk(plistcopy_id, 1, dims_chunk) < 0)
+ goto error;
+ }
/* Create the dataset. */
- if((dset_id = H5Dcreate2(loc_id, dset_name, dtype_id, space_id, H5P_DEFAULT, plist_id, H5P_DEFAULT)) < 0)
- goto out;
+ if((dset_id = H5Dcreate2(loc_id, dset_name, dtype_id, space_id, H5P_DEFAULT, plistcopy_id, H5P_DEFAULT)) < 0)
+ goto error;
+
+ /* Create the table identifier */
+ table->dset_id = dset_id;
/* Terminate access to the data space. */
if(H5Sclose(space_id) < 0)
- goto out;
+ goto error;
/* End access to the property list */
- if(H5Pclose(plist_id) < 0)
- goto out;
-
- /* Create the table identifier */
- table->dset_id = dset_id;
+ if(H5Pclose(plistcopy_id) < 0)
+ goto error;
if((table->type_id = H5Tcopy(dtype_id)) < 0)
- goto out;
+ goto error;
if((table->type_id = H5Tget_native_type(table->type_id, H5T_DIR_DEFAULT)) < 0)
- goto out;
+ goto error;
H5PT_create_index(table);
table->size = 0;
/* Get an ID for this table */
ret_value = H5Iregister(H5PT_ptable_id_type, table);
-
if(ret_value != H5I_INVALID_HID)
H5PT_ptable_count++;
else
@@ -146,32 +159,38 @@ hid_t H5PTcreate_fl ( hid_t loc_id,
return ret_value;
- out:
- H5E_BEGIN_TRY
- H5Sclose(space_id);
- H5Pclose(plist_id);
- H5Dclose(dset_id);
- if(table)
- HDfree(table);
- H5E_END_TRY
- return H5I_INVALID_HID;
-}
+error:
+ if (space_id != H5I_INVALID_HID)
+ H5Sclose(space_id);
+ if (plistcopy_id != H5I_INVALID_HID)
+ H5Pclose(plistcopy_id);
+ if (dset_id != H5I_INVALID_HID)
+ H5Dclose(dset_id);
+ if (table)
+ {
+ if (table->type_id != H5I_INVALID_HID)
+ H5Tclose(table->type_id);
+ HDfree(table);
+ }
+
+ return ret_value;
+} /* H5PTcreate */
+
-#ifdef H5_VLPT_ENABLED
/*-------------------------------------------------------------------------
- * Function: H5PTcreate_vl
+ * Function: H5PTcreate_fl
*
- * Purpose: Creates a dataset containing a table of variable length records
- * and returns the Identifier of the table.
+ * Purpose: Creates a dataset containing a table and returns the Identifier
+ * of the table.
*
* Return: Success: table ID, Failure: Negative
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
*
- * Date: April 12, 2004
+ * Date: March 12, 2004
*
- * Comments: This function does not handle compression or fill data
+ * Comments: This function does not handle fill data
* currently. Fill data is not necessary because the
* table is initially of size 0.
*
@@ -179,38 +198,104 @@ hid_t H5PTcreate_fl ( hid_t loc_id,
*
*-------------------------------------------------------------------------
*/
-hid_t H5PTcreate_vl ( hid_t loc_id,
- const char*dset_name,
- hsize_t chunk_size)
+
+hid_t H5PTcreate_fl ( hid_t loc_id,
+ const char *dset_name,
+ hid_t dtype_id,
+ hsize_t chunk_size,
+ int compression )
{
- hid_t ret_value=H5I_BADID;
- hid_t vltype;
+ htbl_t * table = NULL;
+ hid_t dset_id = H5I_INVALID_HID;
+ hid_t space_id = H5I_INVALID_HID;
+ hid_t plist_id = H5I_INVALID_HID;
+ hsize_t dims[1];
+ hsize_t dims_chunk[1];
+ hsize_t maxdims[1];
+ hid_t ret_value = H5I_INVALID_HID;
/* check the arguments */
if (dset_name == NULL) {
- goto out;
+ goto error;
+ }
+
+ /* Register the packet table ID type if this is the first table created */
+ if(H5PT_ptable_id_type < 0)
+ if((H5PT_ptable_id_type = H5Iregister_type((size_t)H5PT_HASH_TABLE_SIZE, 0, (H5I_free_t)H5PT_free_id)) < 0)
+ goto error;
+
+ /* Get memory for the table identifier */
+ table = (htbl_t *)HDmalloc(sizeof(htbl_t));
+ if ( table == NULL ) {
+ goto error;
}
+ table->dset_id = H5I_INVALID_HID;
+ table->type_id = H5I_INVALID_HID;
+
+ /* Create a simple data space with unlimited size */
+ dims[0] = 0;
+ dims_chunk[0] = chunk_size;
+ maxdims[0] = H5S_UNLIMITED;
+ if((space_id = H5Screate_simple(1, dims, maxdims)) < 0)
+ goto error;
+
+ /* Modify dataset creation properties to enable chunking */
+ plist_id = H5Pcreate(H5P_DATASET_CREATE);
+ if(H5Pset_chunk(plist_id, 1, dims_chunk) < 0)
+ goto error;
+ if(compression >= 0 && compression <= 9)
+ if(H5Pset_deflate(plist_id, (unsigned)compression) < 0)
+ goto error;
+
+ /* Create the dataset. */
+ if((dset_id = H5Dcreate2(loc_id, dset_name, dtype_id, space_id, H5P_DEFAULT, plist_id, H5P_DEFAULT)) < 0)
+ goto error;
- /* Create a variable length type that uses single bytes as its base type */
- vltype = H5Tvlen_create(H5T_NATIVE_UCHAR);
- if(vltype < 0)
- goto out;
+ /* Create the table identifier */
+ table->dset_id = dset_id;
- if((ret_value=H5PTcreate_fl(loc_id, dset_name, vltype, chunk_size, 0)) < 0)
- goto out;
+ /* Terminate access to the data space. */
+ if(H5Sclose(space_id) < 0)
+ goto error;
- /* close the vltype */
- if(H5Tclose(vltype) < 0)
- goto out;
+ /* End access to the property list */
+ if(H5Pclose(plist_id) < 0)
+ goto error;
+
+ if((table->type_id = H5Tcopy(dtype_id)) < 0)
+ goto error;
+
+ if((table->type_id = H5Tget_native_type(table->type_id, H5T_DIR_DEFAULT)) < 0)
+ goto error;
+
+ H5PT_create_index(table);
+ table->size = 0;
+
+ /* Get an ID for this table */
+ ret_value = H5Iregister(H5PT_ptable_id_type, table);
+ if(ret_value != H5I_INVALID_HID)
+ H5PT_ptable_count++;
+ else
+ H5PT_close(table);
return ret_value;
-out:
- if(ret_value != H5I_BADID)
- H5PTclose(ret_value);
- return H5I_BADID;
-}
-#endif /* H%_VLPT_ENABLED */
+error:
+ if (space_id != H5I_INVALID_HID)
+ H5Sclose(space_id);
+ if (plist_id != H5I_INVALID_HID)
+ H5Pclose(plist_id);
+ if (dset_id != H5I_INVALID_HID)
+ H5Dclose(dset_id);
+ if (table)
+ {
+ if (table->type_id != H5I_INVALID_HID)
+ H5Tclose(table->type_id);
+ HDfree(table);
+ }
+
+ return ret_value;
+} /* H5PTcreate_fl */
/*-------------------------------------------------------------------------
* Function: H5PTopen
@@ -239,58 +324,59 @@ out:
hid_t H5PTopen( hid_t loc_id,
const char *dset_name )
{
- hid_t type_id=H5I_BADID;
- hid_t space_id=H5I_BADID;
+ hid_t type_id=H5I_INVALID_HID;
+ hid_t space_id=H5I_INVALID_HID;
htbl_t * table = NULL;
- hid_t ret_value;
hsize_t dims[1];
+ hid_t ret_value = H5I_INVALID_HID;
/* check the arguments */
if (dset_name == NULL) {
- goto out;
+ goto error;
}
/* Register the packet table ID type if this is the first table created */
if( H5PT_ptable_id_type < 0)
if((H5PT_ptable_id_type = H5Iregister_type((size_t)H5PT_HASH_TABLE_SIZE, 0, (H5I_free_t)H5PT_free_id)) < 0)
- goto out;
+ goto error;
table = (htbl_t *)HDmalloc(sizeof(htbl_t));
-
if ( table == NULL ) {
- goto out;
+ goto error;
}
- table->dset_id = H5I_BADID;
- table->type_id = H5I_BADID;
+ table->dset_id = H5I_INVALID_HID;
+ table->type_id = H5I_INVALID_HID;
/* Open the dataset */
if((table->dset_id = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
- goto out;
- if(table->dset_id < 0)
- goto out;
+ goto error;
/* Get the dataset's disk datatype */
if((type_id = H5Dget_type(table->dset_id)) < 0)
- goto out;
+ goto error;
/* Get the table's native datatype */
if((table->type_id = H5Tget_native_type(type_id, H5T_DIR_ASCEND)) < 0)
- goto out;
+ goto error;
+ /* Close the disk datatype */
if(H5Tclose(type_id) < 0)
- goto out;
+ goto error;
+ type_id = H5I_INVALID_HID;
/* Initialize the current record pointer */
if((H5PT_create_index(table)) < 0)
- goto out;
+ goto error;
/* Get number of records in table */
if((space_id=H5Dget_space(table->dset_id)) < 0)
- goto out;
- if( H5Sget_simple_extent_dims( space_id, dims, NULL) < 0)
- goto out;
+ goto error;
+ if(H5Sget_simple_extent_dims(space_id, dims, NULL) < 0)
+ goto error;
if(H5Sclose(space_id) < 0)
- goto out;
+ goto error;
+ space_id = H5I_INVALID_HID;
+
table->size = dims[0];
/* Get an ID for this table */
@@ -303,33 +389,36 @@ hid_t H5PTopen( hid_t loc_id,
return ret_value;
-out:
- H5E_BEGIN_TRY
- H5Tclose(type_id);
- H5Sclose(space_id);
- if(table)
- {
- H5Dclose(table->dset_id);
- H5Tclose(table->type_id);
- HDfree(table);
- }
- H5E_END_TRY
- return H5I_INVALID_HID;
-}
+error:
+ if (type_id != H5I_INVALID_HID)
+ H5Dclose(type_id);
+ if (space_id != H5I_INVALID_HID)
+ H5Sclose(space_id);
+ if(table)
+ {
+ if (table->type_id != H5I_INVALID_HID)
+ H5Tclose(table->type_id);
+ if (table->dset_id != H5I_INVALID_HID)
+ H5Dclose(table->dset_id);
+ HDfree(table);
+ }
+
+ return ret_value;
+} /* H5PTopen */
/*-------------------------------------------------------------------------
* Function: H5PT_free_id
*
* Purpose: Free an id. Callback for H5Iregister_type.
*
- * Return: Success: 0, Failure: N/A
+ * Return: Success: SUCCEED, Failure: N/A
*-------------------------------------------------------------------------
*/
static herr_t
H5PT_free_id(void *id)
{
HDfree(id);
- return 0;
+ return SUCCEED;
}
/*-------------------------------------------------------------------------
@@ -338,7 +427,7 @@ H5PT_free_id(void *id)
* Purpose: Closes a table (i.e. cleans up all open resources used by a
* table).
*
- * Return: Success: 0, Failure: -1
+ * Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@@ -355,21 +444,21 @@ static herr_t
H5PT_close( htbl_t* table)
{
if(table == NULL)
- goto out;
+ goto error;
/* Close the dataset */
if(H5Dclose(table->dset_id) < 0)
- goto out;
+ goto error;
/* Close the memory datatype */
if(H5Tclose(table->type_id) < 0)
- goto out;
+ goto error;
HDfree(table);
- return 0;
+ return SUCCEED;
-out:
+error:
if(table)
{
H5E_BEGIN_TRY
@@ -378,7 +467,7 @@ out:
H5E_END_TRY
HDfree(table);
}
- return -1;
+ return FAIL;
}
/*-------------------------------------------------------------------------
@@ -387,7 +476,7 @@ out:
* Purpose: Closes a table (i.e. cleans up all open resources used by a
* table).
*
- * Return: Success: 0, Failure: -1
+ * Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@@ -406,11 +495,11 @@ herr_t H5PTclose( hid_t table_id )
/* Remove the ID from the library */
if((table = (htbl_t *)H5Iremove_verify(table_id, H5PT_ptable_id_type)) ==NULL)
- goto out;
+ goto error;
/* If the library found the table, remove it */
if( H5PT_close(table) < 0)
- goto out;
+ goto error;
/* One less packet table open */
H5PT_ptable_count--;
@@ -423,10 +512,10 @@ herr_t H5PTclose( hid_t table_id )
H5PT_ptable_id_type = H5I_UNINIT;
}
- return 0;
+ return SUCCEED;
-out:
- return -1;
+error:
+ return FAIL;
}
@@ -442,7 +531,7 @@ out:
*
* Purpose: Appends packets to the end of a packet table
*
- * Return: Success: 0, Failure: -1
+ * Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@@ -463,22 +552,22 @@ herr_t H5PTappend( hid_t table_id,
/* Find the table struct from its ID */
if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
- goto out;
+ goto error;
/* If we are asked to write 0 records, just do nothing */
if(nrecords == 0)
- return 0;
+ return SUCCEED;
if((H5TB_common_append_records(table->dset_id, table->type_id,
nrecords, table->size, data)) < 0)
- goto out;
+ goto error;
/* Update table size */
table->size += nrecords;
- return 0;
+ return SUCCEED;
-out:
- return -1;
+error:
+ return FAIL;
}
/*-------------------------------------------------------------------------
@@ -495,7 +584,7 @@ out:
* Purpose: Reads packets starting at the current index and updates
* that index
*
- * Return: Success: 0, Failure: -1
+ * Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@@ -517,22 +606,22 @@ herr_t H5PTget_next( hid_t table_id,
/* Find the table struct from its ID */
if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
- goto out;
+ goto error;
/* If nrecords == 0, do nothing */
if(nrecords == 0)
- return 0;
+ return SUCCEED;
if((H5TB_common_read_records(table->dset_id, table->type_id,
table->current_index, nrecords, table->size, data)) < 0)
- goto out;
+ goto error;
/* Update the current index */
table->current_index += nrecords;
- return 0;
+ return SUCCEED;
-out:
- return -1;
+error:
+ return FAIL;
}
/*-------------------------------------------------------------------------
@@ -540,7 +629,7 @@ out:
*
* Purpose: Reads packets from anywhere in a packet table
*
- * Return: Success: 0, Failure: -1
+ * Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@@ -564,20 +653,20 @@ herr_t H5PTread_packets( hid_t table_id,
/* find the table struct from its ID */
table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type);
if(table == NULL)
- goto out;
+ goto error;
/* If nrecords == 0, do nothing */
if(nrecords == 0)
- return 0;
+ return SUCCEED;
if( H5TB_common_read_records(table->dset_id, table->type_id,
start, nrecords, table->size, data) < 0)
- goto out;
+ goto error;
- return 0;
+ return SUCCEED;
-out:
- return -1;
+error:
+ return FAIL;
}
/*-------------------------------------------------------------------------
@@ -592,7 +681,7 @@ out:
*
* Purpose: Resets, sets, and gets the current record index for a packet table
*
- * Return: Success: 0, Failure: -1
+ * Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@@ -611,37 +700,37 @@ H5PT_create_index(htbl_t *table)
if( table != NULL)
{
table->current_index = 0;
- return 0;
+ return SUCCEED;
}
- return -1;
+ return FAIL;
}
static herr_t
-H5PT_set_index(htbl_t *table, hsize_t index)
+H5PT_set_index(htbl_t *table, hsize_t pt_index)
{
/* Ensure index is valid */
if( table != NULL )
{
- if( index < table->size )
+ if( pt_index < table->size )
{
- table->current_index = index;
- return 0;
+ table->current_index = pt_index;
+ return SUCCEED;
}
}
- return -1;
+ return FAIL;
}
static herr_t
-H5PT_get_index(htbl_t *table, hsize_t *index)
+H5PT_get_index(htbl_t *table, hsize_t *pt_index)
{
/* Ensure index is valid */
if( table != NULL )
{
- if(index)
- *index = table->current_index;
- return 0;
+ if(pt_index)
+ *pt_index = table->current_index;
+ return SUCCEED;
}
- return -1;
+ return FAIL;
}
/*-------------------------------------------------------------------------
@@ -649,7 +738,7 @@ H5PT_get_index(htbl_t *table, hsize_t *index)
*
* Purpose: Resets, sets, and gets the current record index for a packet table
*
- * Return: Success: 0, Failure: -1
+ * Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@@ -668,7 +757,7 @@ herr_t H5PTcreate_index(hid_t table_id)
/* find the table struct from its ID */
if((table = (htbl_t *) (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
- return -1;
+ return FAIL;
return H5PT_create_index(table);
}
@@ -679,7 +768,7 @@ herr_t H5PTset_index(hid_t table_id, hsize_t pt_index)
/* find the table struct from its ID */
if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
- return -1;
+ return FAIL;
return H5PT_set_index(table, pt_index);
}
@@ -690,7 +779,7 @@ herr_t H5PTget_index(hid_t table_id, hsize_t *pt_index)
/* find the table struct from its ID */
if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
- return -1;
+ return FAIL;
return H5PT_get_index(table, pt_index);
}
@@ -705,9 +794,9 @@ herr_t H5PTget_index(hid_t table_id, hsize_t *pt_index)
/*-------------------------------------------------------------------------
* Function: H5PTget_num_packets
*
- * Purpose: Returns by reference the number of packets in the dataset
+ * Purpose: Returns by reference the number of packets in the packet table
*
- * Return: Success: 0, Failure: -1
+ * Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@@ -727,14 +816,15 @@ herr_t H5PTget_num_packets( hid_t table_id, hsize_t *nrecords)
/* find the table struct from its ID */
if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
- goto out;
+ goto error;
if(nrecords)
*nrecords = table->size;
- return 0;
-out:
- return -1;
+ return SUCCEED;
+
+error:
+ return FAIL;
}
@@ -743,7 +833,7 @@ out:
*
* Purpose: Validates a table identifier
*
- * Return: Success: 0, Failure: -1
+ * Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@@ -761,19 +851,18 @@ herr_t H5PTis_valid(hid_t table_id)
{
/* find the table struct from its ID */
if(H5Iobject_verify(table_id, H5PT_ptable_id_type) ==NULL)
- return -1;
+ return FAIL;
- return 0;
+ return SUCCEED;
}
-#ifdef H5_VLPT_ENABLED
/*-------------------------------------------------------------------------
* Function: H5PTis_varlen
*
* Purpose: Returns 1 if a table_id corresponds to a packet table of variable-
* length records or 0 for fixed-length records.
*
- * Return: True: 1, False: 0, Failure: -1
+ * Return: True: 1, False: 0, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@@ -794,17 +883,18 @@ herr_t H5PTis_varlen(hid_t table_id)
/* find the table struct from its ID */
if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
- goto out;
+ goto error;
if((type = H5Tget_class( table->type_id )) == H5T_NO_CLASS)
- goto out;
+ goto error;
if( type == H5T_VLEN )
return 1;
else
return 0;
-out:
- return -1;
+
+error:
+ return FAIL;
}
/*-------------------------------------------------------------------------
@@ -815,12 +905,12 @@ out:
*/
/*-------------------------------------------------------------------------
- * Function: H5PTfree_vlen_readbuff
+ * Function: H5PTfree_vlen_buff
*
* Purpose: Frees memory used when reading from a variable length packet
* table.
*
- * Return: Success: 0, Failure: -1
+ * Return: Success: SUCCEED, Failure: FAIL
* -2 if memory was reclaimed but another error occurred
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
@@ -836,25 +926,25 @@ out:
*-------------------------------------------------------------------------
*/
-herr_t H5PTfree_vlen_readbuff( hid_t table_id,
+herr_t H5PTfree_vlen_buff( hid_t table_id,
size_t _bufflen,
void * buff )
{
- hid_t space_id = H5I_BADID;
+ hid_t space_id = H5I_INVALID_HID;
htbl_t * table;
hsize_t bufflen = _bufflen;
herr_t ret_value;
/* find the table struct from its ID */
if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
- goto out;
+ goto error;
if((space_id = H5Screate_simple(1, &bufflen, NULL)) < 0)
- goto out;
+ goto error;
/* Free the memory. If this succeeds, ret_value should be 0. */
if((ret_value = H5Dvlen_reclaim(table->type_id, space_id, H5P_DEFAULT, buff)) < 0)
- goto out;
+ goto error;
/* If the dataspace cannot be closed, return -2 to indicate that memory */
/* was freed successfully but an error still occurred. */
@@ -863,11 +953,83 @@ herr_t H5PTfree_vlen_readbuff( hid_t table_id,
return ret_value;
-out:
+error:
H5E_BEGIN_TRY
H5Sclose(space_id);
H5E_END_TRY
- return -1;
+ return FAIL;
+} /* H5PTfree_vlen_buff */
+
+/*-------------------------------------------------------------------------
+ *
+ * Accessor functions
+ *
+ *-------------------------------------------------------------------------
+ */
+/*-------------------------------------------------------------------------
+ * Function: H5PTget_dataset
+ *
+ * Purpose: Returns the backend dataset of this packet table
+ *
+ * Return: Success: SUCCEED, Failure: FAIL
+ *
+ * Programmer: User's patch 0003, HDFFV-8623. -BMR
+ *
+ * Date: Feb 10, 2016
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t H5PTget_dataset(hid_t table_id)
+{
+ htbl_t * table;
+ hid_t ret_value = H5I_INVALID_HID;
+
+ /* find the table struct from its ID */
+ if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
+ goto error;
+
+ ret_value = table->dset_id;
+
+error:
+
+ return ret_value;
}
-#endif /* H5_VLPT_ENABLED */
+/*-------------------------------------------------------------------------
+ * Function: H5PTget_type
+ *
+ * Purpose: Returns the backend type of this packet table
+ *
+ * Return: Success: datatype ID, Failure: H5I_INVALID_HID
+ *
+ * Programmer: User's patch 0003, HDFFV-8623. -BMR
+ *
+ * Date: Feb 10, 2016
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t H5PTget_type( hid_t table_id)
+{
+ htbl_t * table;
+ hid_t ret_value = H5I_INVALID_HID;
+
+ /* find the table struct from its ID */
+ if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
+ goto error;
+
+ ret_value = table->type_id;
+
+error:
+
+ return ret_value;
+}
diff --git a/hl/src/H5PTpublic.h b/hl/src/H5PTpublic.h
index f919010..420275a 100644
--- a/hl/src/H5PTpublic.h
+++ b/hl/src/H5PTpublic.h
@@ -22,74 +22,58 @@ extern "C" {
#endif
/*-------------------------------------------------------------------------
- *
* Create/Open/Close functions
- *
*-------------------------------------------------------------------------
*/
+/* NOTE: H5PTcreate is replacing H5PTcreate_fl for better name due to the
+ removal of H5PTcreate_vl. H5PTcreate_fl may be retired in 1.8.19. */
+H5_HLDLL hid_t H5PTcreate(hid_t loc_id, const char *dset_name,
+ hid_t dtype_id, hsize_t chunk_size, hid_t plist_id);
-H5_HLDLL hid_t H5PTcreate_fl ( hid_t loc_id,
- const char *dset_name,
- hid_t dtype_id,
- hsize_t chunk_size,
- int compression );
+H5_HLDLL hid_t H5PTopen(hid_t loc_id, const char *dset_name);
-#ifdef VLPT_REMOVED
-H5_HLDLL hid_t H5PTcreate_vl ( hid_t loc_id,
- const char *dset_name,
- hsize_t chunk_size );
-#endif /* VLPT_REMOVED */
+H5_HLDLL herr_t H5PTclose(hid_t table_id);
-H5_HLDLL hid_t H5PTopen( hid_t loc_id,
- const char *dset_name );
-
-H5_HLDLL herr_t H5PTclose( hid_t table_id );
+/* This function may be removed from the packet table in release 1.8.19. */
+H5_HLDLL hid_t H5PTcreate_fl(hid_t loc_id, const char *dset_name,
+ hid_t dtype_id, hsize_t chunk_size, int compression);
/*-------------------------------------------------------------------------
- *
* Write functions
- *
*-------------------------------------------------------------------------
*/
-
-H5_HLDLL herr_t H5PTappend( hid_t table_id,
- size_t nrecords,
- const void * data );
+H5_HLDLL herr_t H5PTappend(hid_t table_id, size_t nrecords, const void *data);
/*-------------------------------------------------------------------------
- *
* Read functions
- *
*-------------------------------------------------------------------------
*/
+H5_HLDLL herr_t H5PTget_next(hid_t table_id, size_t nrecords, void * data);
+H5_HLDLL herr_t H5PTread_packets(hid_t table_id, hsize_t start,
+ size_t nrecords, void *data);
-H5_HLDLL herr_t H5PTget_next( hid_t table_id,
- size_t nrecords,
- void * data );
+/*-------------------------------------------------------------------------
+ * Inquiry functions
+ *-------------------------------------------------------------------------
+ */
+H5_HLDLL herr_t H5PTget_num_packets(hid_t table_id, hsize_t *nrecords);
-H5_HLDLL herr_t H5PTread_packets( hid_t table_id,
- hsize_t start,
- size_t nrecords,
- void *data );
+H5_HLDLL herr_t H5PTis_valid(hid_t table_id);
+
+H5_HLDLL herr_t H5PTis_varlen(hid_t table_id);
/*-------------------------------------------------------------------------
*
- * Inquiry functions
+ * Accessor functions
*
*-------------------------------------------------------------------------
*/
+H5_HLDLL hid_t H5PTget_dataset(hid_t table_id);
-H5_HLDLL herr_t H5PTget_num_packets( hid_t table_id,
- hsize_t *nrecords );
-
-H5_HLDLL herr_t H5PTis_valid( hid_t table_id );
-
-#ifdef VLPT_REMOVED
-H5_HLDLL herr_t H5PTis_varlen( hid_t table_id );
-#endif /* VLPT_REMOVED */
+H5_HLDLL hid_t H5PTget_type(hid_t table_id);
/*-------------------------------------------------------------------------
*
@@ -113,11 +97,9 @@ H5_HLDLL herr_t H5PTget_index( hid_t table_id,
*-------------------------------------------------------------------------
*/
-#ifdef VLPT_REMOVED
-H5_HLDLL herr_t H5PTfree_vlen_readbuff( hid_t table_id,
+H5_HLDLL herr_t H5PTfree_vlen_buff( hid_t table_id,
size_t bufflen,
void * buff );
-#endif /* VLPT_REMOVED */
#ifdef __cplusplus
}
diff --git a/hl/test/Makefile.am b/hl/test/Makefile.am
index 0809deb..32d14b6 100644
--- a/hl/test/Makefile.am
+++ b/hl/test/Makefile.am
@@ -49,4 +49,7 @@ CHECK_CLEANFILES+=combine_tables[1-2].h5 test_ds[1-9].h5 test_ds10.h5 \
test_packet_table.h5 test_packet_compress.h5 test_detach.h5 \
test_dectris.h5
+# Sources for test_packet executable
+test_packet_SOURCES=test_packet.c test_packet_vlen.c
+
include $(top_srcdir)/config/conclude.am
diff --git a/hl/test/h5hltest.h b/hl/test/h5hltest.h
index e8292d2..9a5e702 100644
--- a/hl/test/h5hltest.h
+++ b/hl/test/h5hltest.h
@@ -36,5 +36,7 @@
/* Implements verbose 'assert' with 'goto error' exit */
#define VERIFY(condition, string) do { if (!(condition)) FAIL_PUTS_ERROR(string) } while(0)
+int test_packet_table_with_varlen(void);
+
#endif /* _H5HLTEST_H */
diff --git a/hl/test/test_packet.c b/hl/test/test_packet.c
index 345aecb..e2ca2b5 100644
--- a/hl/test/test_packet.c
+++ b/hl/test/test_packet.c
@@ -31,9 +31,6 @@
#define TEST_FILE_NAME "test_packet_table.h5"
#define TEST_COMPRESS_FILE "test_packet_compress.h5"
#define PT_NAME "Test Packet Table"
-#ifdef VLPT_REMOVED
-#define VL_TABLE_NAME "Varlen Test Table"
-#endif /* VLPT_REMOVED */
#define H5TB_TABLE_NAME "Table1"
/*-------------------------------------------------------------------------
@@ -77,9 +74,9 @@ static int cmp_par(size_t i, size_t j, particle_t *rbuf, particle_t *wbuf )
rbuf[i].longi != wbuf[j].longi ||
!H5_FLT_ABS_EQUAL(rbuf[i].pressure,wbuf[j].pressure) ||
!H5_DBL_ABS_EQUAL(rbuf[i].temperature,wbuf[j].temperature) ) {
- return -1;
+ return FAIL;
}
- return 0;
+ return SUCCEED;
}
/*-------------------------------------------------------------------------
@@ -95,22 +92,22 @@ make_particle_type(void)
/* Create the memory data type. */
if ((type_id = H5Tcreate (H5T_COMPOUND, type_size )) < 0 )
- return -1;
+ return FAIL;
/* Insert fields. */
string_type = H5Tcopy( H5T_C_S1 );
H5Tset_size( string_type, (size_t)16 );
if ( H5Tinsert(type_id, "Name", HOFFSET(particle_t, name) , string_type ) < 0 )
- return -1;
+ return FAIL;
if ( H5Tinsert(type_id, "Lat", HOFFSET(particle_t, lati) , H5T_NATIVE_INT ) < 0 )
- return -1;
+ return FAIL;
if ( H5Tinsert(type_id, "Long", HOFFSET(particle_t, longi) , H5T_NATIVE_INT ) < 0 )
- return -1;
+ return FAIL;
if ( H5Tinsert(type_id, "Pressure", HOFFSET(particle_t, pressure) , H5T_NATIVE_FLOAT ) < 0 )
- return -1;
+ return FAIL;
if ( H5Tinsert(type_id, "Temperature", HOFFSET(particle_t, temperature) , H5T_NATIVE_DOUBLE ) < 0 )
- return -1;
+ return FAIL;
return type_id;
}
@@ -156,9 +153,9 @@ static int create_hl_table(hid_t fid)
chunk_size, fill_data, compress, testPart );
if(status<0)
- return -1;
+ return FAIL;
else
- return 0;
+ return SUCCEED;
}
@@ -188,23 +185,21 @@ static int test_create_close(hid_t fid)
table = H5PTcreate_fl(fid, PT_NAME, part_t, (hsize_t)100, -1);
H5Tclose(part_t);
if( H5PTis_valid(table) < 0)
- goto out;
-#ifdef VLPT_REMOVED
+ goto error;
if( H5PTis_varlen(table) != 0)
- goto out;
-#endif /* VLPT_REMOVED */
+ goto error;
/* Close the table */
err = H5PTclose(table);
if( err < 0)
- goto out;
+ goto error;
PASSED();
- return 0;
+ return SUCCEED;
- out:
+error:
H5_FAILED();
- return -1;
+ return FAIL;
}
/*-------------------------------------------------------------------------
@@ -224,23 +219,22 @@ static int test_open(hid_t fid)
/* Open the table */
table = H5PTopen(fid, PT_NAME);
if( H5PTis_valid(table) < 0)
- goto out;
-#ifdef VLPT_REMOVED
+ goto error;
if( H5PTis_varlen(table) != 0)
- goto out;
-#endif /* VLPT_REMOVED */
+ goto error;
/* Close the table */
err = H5PTclose(table);
if( err < 0)
- goto out;
+ goto error;
PASSED();
- return 0;
+ return SUCCEED;
- out:
+error:
+ if (table > 0) H5PTclose(table);
H5_FAILED();
- return -1;
+ return FAIL;
}
/*-------------------------------------------------------------------------
@@ -261,52 +255,52 @@ static int test_append(hid_t fid)
/* Open the table */
table = H5PTopen(fid, PT_NAME);
if( H5PTis_valid(table) < 0)
- goto out;
+ goto error;
/* Count the number of packets in the table */
err = H5PTget_num_packets(table, &count);
if( err < 0)
- goto out;
+ goto error;
/* There should be 0 records in the table */
if( count != 0 )
- goto out;
+ goto error;
/* Append one particle */
err = H5PTappend(table, (size_t)1, &(testPart[0]));
if( err < 0)
- goto out;
+ goto error;
/* Append several particles */
err = H5PTappend(table, (size_t)6, &(testPart[1]));
if( err < 0)
- goto out;
+ goto error;
/* Append one more particle */
err = H5PTappend(table, (size_t)1, &(testPart[7]));
if( err < 0)
- goto out;
+ goto error;
/* Count the number of packets in the table */
err = H5PTget_num_packets(table, &count);
if( err < 0)
- goto out;
+ goto error;
/* There should be 8 records in the table now */
if( count != 8 )
- goto out;
+ goto error;
/* Close the table */
err = H5PTclose(table);
if( err < 0)
- goto out;
+ goto error;
PASSED();
- return 0;
+ return SUCCEED;
- out:
+error:
H5_FAILED();
- if( H5PTis_valid(table) < 0)
+ if( H5PTis_valid(table) > 0)
H5PTclose(table);
- return -1;
+ return FAIL;
}
/*-------------------------------------------------------------------------
@@ -328,44 +322,44 @@ static int test_read(hid_t fid)
/* Open the table */
table = H5PTopen(fid, PT_NAME);
if( H5PTis_valid(table) < 0)
- goto out;
+ goto error;
/* Read several particles */
err = H5PTread_packets(table, (hsize_t)0, 3, &(readBuf[0]));
if( err < 0)
- goto out;
+ goto error;
/* Read one particle */
err = H5PTread_packets(table, (hsize_t)3, 1, &(readBuf[3]));
if( err < 0)
- goto out;
+ goto error;
/* Read several particles */
err = H5PTread_packets(table, (hsize_t)4, (NRECORDS - 4 ), &(readBuf[4]));
if( err < 0)
- goto out;
+ goto error;
/* Ensure that particles were read correctly */
for(c=0; c<NRECORDS; c++)
{
if( cmp_par(c%8, c, testPart, readBuf) != 0)
- goto out;
+ goto error;
}
/* Close the table */
err = H5PTclose(table);
if( err < 0)
- goto out;
+ goto error;
PASSED();
- return 0;
+ return SUCCEED;
- out:
+error:
H5_FAILED();
- if( H5PTis_valid(table) < 0)
+ if( H5PTis_valid(table) > 0)
H5PTclose(table);
- return -1;
+ return FAIL;
}
/*-------------------------------------------------------------------------
@@ -389,21 +383,21 @@ static int test_get_next(hid_t fid)
/* Open the table */
table = H5PTopen(fid, PT_NAME);
if( H5PTis_valid(table) < 0)
- goto out;
+ goto error;
/* Read several particles consecutively */
for(c=0; c < NRECORDS; c++)
{
- err = H5PTget_next(table, 1, &readBuf[c]);
+ err = H5PTget_next(table, (size_t)1, &readBuf[c]);
if(err < 0)
- goto out;
+ goto error;
}
/* Ensure that particles were read correctly */
for(c=0; c<NRECORDS; c++)
{
if( cmp_par(c, c, testPart, readBuf) != 0)
- goto out;
+ goto error;
}
H5PTcreate_index(table);
@@ -411,31 +405,31 @@ static int test_get_next(hid_t fid)
/* Read particles two by two */
for(c=0; c < NRECORDS / 2; c++)
{
- err = H5PTget_next(table, 2, &readBuf2[c * 2]);
+ err = H5PTget_next(table, (size_t)2, &readBuf2[c * 2]);
if(err < 0)
- goto out;
+ goto error;
}
/* Ensure that particles were read correctly */
for(c=0; c<NRECORDS; c++)
{
if( cmp_par(c, c, testPart, readBuf2) != 0)
- goto out;
+ goto error;
}
/* Close the table */
err = H5PTclose(table);
if( err < 0)
- goto out;
+ goto error;
PASSED();
- return 0;
+ return SUCCEED;
- out:
+error:
H5_FAILED();
- if( H5PTis_valid(table) < 0)
+ if( H5PTis_valid(table) > 0)
H5PTclose(table);
- return -1;
+ return FAIL;
}
/*-------------------------------------------------------------------------
@@ -466,7 +460,7 @@ static int test_big_table(hid_t fid)
table = H5PTcreate_fl(fid, "Packet Test Dataset2", part_t, (hsize_t)33, -1);
H5Tclose(part_t);
if( H5PTis_valid(table) < 0)
- goto out;
+ goto error;
/* Add many particles */
for(c = 0; c < BIG_TABLE_SIZE ; c+=8)
@@ -474,222 +468,44 @@ static int test_big_table(hid_t fid)
/* Append eight particles at once*/
err = H5PTappend(table, (size_t)8, &(testPart[0]));
if( err < 0)
- goto out;
+ goto error;
}
/* Count the number of packets in the table */
err = H5PTget_num_packets(table, &count);
if( err < 0)
- goto out;
+ goto error;
if( count != BIG_TABLE_SIZE )
- goto out;
+ goto error;
/* Read particles to ensure that all of them were written correctly */
/* Also, ensure that H5PTcreate_fl set the current packet to */
/* the first packet in the table */
for(c = 0; c < BIG_TABLE_SIZE; c++)
{
- err = H5PTget_next(table, 1, &readPart);
+ err = H5PTget_next(table, (size_t)1, &readPart);
if(err < 0)
- goto out;
+ goto error;
/* Ensure that particles were read correctly */
if( cmp_par(c % 8, 0, testPart, &readPart) != 0)
- goto out;
+ goto error;
}
/* Close the table */
err = H5PTclose(table);
if( err < 0)
- goto out;
+ goto error;
PASSED();
- return 0;
+ return SUCCEED;
- out:
+error:
H5_FAILED();
- if( H5PTis_valid(table) < 0)
+ if( H5PTis_valid(table) > 0)
H5PTclose(table);
- return -1;
-}
-
-#ifdef VLPT_REMOVED
-/*-------------------------------------------------------------------------
- * test_varlen
- *
- * Tests creation, opening, closing, writing, reading, etc. on a
- * variable-length packet table.
- *
- *-------------------------------------------------------------------------
- */
-static int test_varlen(hid_t fid)
-{
- herr_t err;
- hid_t table=H5I_BADID;
- hsize_t count;
-
- /* Buffers to hold data */
- hvl_t writeBuffer[NRECORDS];
- hvl_t readBuffer[NRECORDS];
-
- /* This example has three different sizes of "record": longs, shorts, and particles */
- long longBuffer[NRECORDS];
- short shortBuffer[NRECORDS];
- int x;
-
- TESTING("variable-length packet tables");
-
- /* Initialize buffers */
- for(x=0; x<NRECORDS; x++)
- {
- longBuffer[x] = -x;
- shortBuffer[x] = x;
- }
-
- /* Fill the write buffer with a mix of variable types */
- for(x=0; x<8; x+=4)
- {
- writeBuffer[x].len = sizeof(long);
- writeBuffer[x].p = &(longBuffer[x]);
- writeBuffer[x+1].len = sizeof(short);
- writeBuffer[x+1].p = &(shortBuffer[x+1]);
- writeBuffer[x+2].len = sizeof(long);
- writeBuffer[x+2].p = &(longBuffer[x+2]);
- writeBuffer[x+3].len = sizeof(particle_t);
- writeBuffer[x+3].p = &(testPart[x+3]);
- }
-
- /* Create the table */
- table = H5PTcreate_vl(fid, VL_TABLE_NAME, (hsize_t)1001);
- if( H5PTis_valid(table) < 0)
- goto out;
- if( H5PTis_varlen(table) != 1)
- goto out;
-
- /* Count the number of packets in the table */
- err = H5PTget_num_packets(table, &count);
- if( err < 0)
- goto out;
- if( count != 0 )
- goto out;
-
- /* Close the table */
- err = H5PTclose(table);
- if( err < 0)
- goto out;
-
- /* Re-open the table */
- table = H5PTopen(fid, VL_TABLE_NAME);
- if( H5PTis_valid(table) < 0)
- goto out;
- if( H5PTis_varlen(table) != 1)
- goto out;
-
- /* Count the number of packets in the table */
- err = H5PTget_num_packets(table, &count);
- if( err < 0)
- goto out;
- if( count != 0 )
- goto out;
-
- /* Add several variable-length packets */
- err = H5PTappend(table, (size_t)8, writeBuffer );
- if(err < 0)
- goto out;
-
- /* Read them back */
- err = H5PTread_packets(table, (hsize_t)0, 4, &(readBuffer[0]));
- if( err < 0)
- goto out;
- err = H5PTread_packets(table, (hsize_t)4, 1, &(readBuffer[4]));
- if( err < 0)
- goto out;
- err = H5PTread_packets(table, (hsize_t)5, (NRECORDS - 5 ), &(readBuffer[5]));
- if( err < 0)
- goto out;
-
- /* Ensure that packets were read correctly */
- for(x=0; x<NRECORDS; x++)
- {
- if( readBuffer[x].len != writeBuffer[x%4].len)
- goto out;
- switch(x%4)
- {
- case 0:
- case 2:
- if( *((long*)(readBuffer[x].p)) != *((long*)(writeBuffer[x].p)))
- goto out;
- break;
- case 1:
- if( *((short*)(readBuffer[x].p)) != *((short*)(writeBuffer[x].p)))
- goto out;
- break;
- case 3:
- if( cmp_par(0, 0, readBuffer[x].p, writeBuffer[x].p) < 0)
- goto out;
- break;
- default:
- goto out;
- }
- }
-
- /* Free memory used by read buffer */
- if(H5PTfree_vlen_readbuff(table, NRECORDS, readBuffer) <0)
- goto out;
-
- /* Read packets back using get_next */
- for(x=0; x < NRECORDS; x++)
- {
- err = H5PTget_next(table, 1, &readBuffer[x]);
- if(err < 0)
- goto out;
- }
-
- /* Ensure that packets were read correctly */
- for(x=0; x<NRECORDS; x++)
- {
- if( readBuffer[x].len != writeBuffer[x%4].len)
- goto out;
- switch(x%4)
- {
- case 0:
- case 2:
- if( *((long*)(readBuffer[x].p)) != *((long*)(writeBuffer[x].p)))
- goto out;
- break;
- case 1:
- if( *((short*)(readBuffer[x].p)) != *((short*)(writeBuffer[x].p)))
- goto out;
- break;
- case 3:
- if( cmp_par(0, 0, readBuffer[x].p, writeBuffer[x].p) < 0)
- goto out;
- break;
- default:
- goto out;
- }
- }
-
- /* Free memory used by read buffer */
- if(H5PTfree_vlen_readbuff(table, NRECORDS, readBuffer) <0)
- goto out;
-
- /* Close the table */
- err = H5PTclose(table);
- if( err < 0)
- goto out;
-
- PASSED();
- return 0;
-
- out:
- H5_FAILED();
- H5E_BEGIN_TRY
- H5PTclose(table);
- H5E_END_TRY
- return -1;
+ return FAIL;
}
-#endif /* VLPT_REMOVED */
/*-------------------------------------------------------------------------
* test_opaque
@@ -710,50 +526,50 @@ static int test_opaque(hid_t fid)
/* Create an opaque datatype for the particle struct */
if ((part_t = H5Tcreate (H5T_OPAQUE, sizeof(particle_t) )) < 0 )
- return -1;
+ return FAIL;
HDassert(part_t != -1);
/* Tag the opaque datatype */
if ( H5Tset_tag(part_t, "Opaque Particle" ) < 0)
- return -1;
+ return FAIL;
/* Create a new table */
table = H5PTcreate_fl(fid, "Packet Test Dataset3", part_t, (hsize_t)100, -1);
H5Tclose(part_t);
if( H5PTis_valid(table) < 0)
- goto out;
+ goto error;
/* Append several particles, starting at particle 1 */
err = H5PTappend(table, (size_t)(NRECORDS - 1), &(testPart[1]));
if( err < 0)
- goto out;
+ goto error;
/* Read the particles back */
err = H5PTread_packets(table, (hsize_t)0, 7, &(readBuf[0]));
if( err < 0)
- goto out;
+ goto error;
/* Ensure that particles were read correctly */
for(c=0; c<NRECORDS - 1; c++)
{
if( cmp_par(c+1, c, testPart, readBuf) != 0)
- goto out;
+ goto error;
}
/* Close the table */
err = H5PTclose(table);
if( err < 0)
- goto out;
+ goto error;
PASSED();
- return 0;
+ return SUCCEED;
- out:
+error:
H5_FAILED();
- if( H5PTis_valid(table) < 0)
+ if( H5PTis_valid(table) > 0)
H5PTclose(table);
- return -1;
+ return FAIL;
}
/*-------------------------------------------------------------------------
@@ -767,12 +583,12 @@ static int test_opaque(hid_t fid)
static int
test_compress(void)
{
- hid_t fid1 = -1;
+ hid_t fid1 = H5I_INVALID_HID;
herr_t err;
- hid_t table = -1;
- hid_t part_t = -1;
- hid_t dset_id = -1;
- hid_t plist_id = -1;
+ hid_t table = H5I_INVALID_HID;
+ hid_t part_t = H5I_INVALID_HID;
+ hid_t dset_id = H5I_INVALID_HID;
+ hid_t plist_id = H5I_INVALID_HID;
size_t c;
size_t num_elems = 1;
unsigned filter_vals[1];
@@ -812,7 +628,7 @@ test_compress(void)
HDmemset(readPart, 0, sizeof(readPart));
for(c = 0; c < BIG_TABLE_SIZE; c++)
{
- err = H5PTget_next(table, 1, readPart);
+ err = H5PTget_next(table, (size_t)1, readPart);
if(err < 0) TEST_ERROR;
/* Ensure that particles were read correctly */
@@ -881,7 +697,7 @@ test_compress(void)
if( err < 0) TEST_ERROR;
PASSED();
- return 0;
+ return SUCCEED;
error:
H5E_BEGIN_TRY {
@@ -892,7 +708,7 @@ error:
H5Fclose(fid1);
} H5E_END_TRY
H5_FAILED();
- return -1;
+ return FAIL;
}
/*-------------------------------------------------------------------------
@@ -932,54 +748,54 @@ static int test_rw_nonnative_dt(hid_t fid)
ptable = H5PTcreate_fl(fid, "Packet Test Dataset, Non-native", H5T_STD_I32LE, (hsize_t)100, -1);
}
if(ptable == H5I_INVALID_HID)
- goto out;
+ goto error;
/* Write one packet to the packet table */
- if( (err = H5PTappend(ptable, (hsize_t)1, &(writeBuffer[0]))) < 0 )
- goto out;
+ if( (err = H5PTappend(ptable, (size_t)1, &(writeBuffer[0]))) < 0 )
+ goto error;
/* Write several packets to the packet table */
- if( (err = H5PTappend(ptable, (hsize_t)4, &(writeBuffer[1]))) < 0)
- goto out;
+ if( (err = H5PTappend(ptable, (size_t)4, &(writeBuffer[1]))) < 0)
+ goto error;
if( (err = H5PTclose(ptable)) < 0)
- goto out;
+ goto error;
/* Open the Packet table */
if( (ptable = H5PTopen(fid, "Packet Test Dataset, Non-native")) < 0)
- goto out;
+ goto error;
/* Get the number of packets in the packet table. This should be five. */
if( (err = H5PTget_num_packets(ptable, &count)) < 0)
- goto out;
+ goto error;
if( (int)count != 5 )
- goto out;
+ goto error;
/* Initialize packet table's "current record" */
if( (err = H5PTcreate_index(ptable)) < 0)
- goto out;
+ goto error;
/* Iterate through packets, read each one back */
for(x=0; x<5; x++) {
- if( (err = H5PTget_next(ptable, (hsize_t)1, &(readBuffer[x]))) < 0)
- goto out;
+ if( (err = H5PTget_next(ptable, (size_t)1, &(readBuffer[x]))) < 0)
+ goto error;
if( x != readBuffer[x])
- goto out;
+ goto error;
}
/* Close the packet table */
if( (err = H5PTclose(ptable)) < 0)
- goto out;
+ goto error;
PASSED();
- return 0;
+ return SUCCEED;
- out:
+error:
H5_FAILED();
- if( H5PTis_valid(ptable) < 0)
+ if( H5PTis_valid(ptable) > 0)
H5PTclose(ptable);
- return -1;
+ return FAIL;
}
/*-------------------------------------------------------------------------
@@ -992,7 +808,7 @@ static int test_rw_nonnative_dt(hid_t fid)
*/
static int test_error(hid_t fid)
{
- hid_t id = H5I_BADID;
+ hid_t id = H5I_INVALID_HID;
int id_open=0;
particle_t readBuf[1];
@@ -1000,121 +816,121 @@ static int test_error(hid_t fid)
/* Create a HL table */
if(create_hl_table(fid) < 0)
- goto out;
+ goto error;
/* Try to open things that are not packet tables */
H5E_BEGIN_TRY
if(H5PTopen(fid, "Bogus_name") >= 0)
- goto out;
+ goto error;
if(H5PTopen(fid, "group1") >= 0)
- goto out;
+ goto error;
H5E_END_TRY
/* Try to execute packet table commands on an invalid ID */
H5E_BEGIN_TRY
if(H5PTis_valid(id) >= 0)
- goto out;
-#ifdef VLPT_REMOVED
+ goto error;
if(H5PTis_varlen(id) >= 0)
- goto out;
-#endif /* VLPT_REMOVED */
+ goto error;
if(H5PTclose(id) >= 0)
- goto out;
+ goto error;
if(H5PTappend(id, (size_t)1, testPart) >= 0)
- goto out;
+ goto error;
if(H5PTread_packets(id, (hsize_t)0, 1, readBuf) >= 0)
- goto out;
+ goto error;
if(H5PTcreate_index(id) >= 0)
- goto out;
+ goto error;
if(H5PTset_index(id, (hsize_t)1) >= 0)
- goto out;
+ goto error;
if(H5PTget_index(id, NULL) >= 0)
- goto out;
+ goto error;
H5E_END_TRY
/* Open a high-level non-packet (H5TB) table and try to */
/* execute commands on it. */
if((id=H5Dopen2(fid, H5TB_TABLE_NAME, H5P_DEFAULT)) <0)
- goto out;
+ goto error;
id_open = 1;
H5E_BEGIN_TRY
if(H5PTis_valid(id) >= 0)
- goto out;
-#ifdef VLPT_REMOVED
+ goto error;
if(H5PTis_varlen(id) >= 0)
- goto out;
-#endif /* VLPT_REMOVED */
+ goto error;
if(H5PTclose(id) >= 0)
- goto out;
+ goto error;
if(H5PTappend(id, (size_t)1, testPart) >= 0)
- goto out;
+ goto error;
if(H5PTread_packets(id, (hsize_t)0, 1, readBuf) >= 0)
- goto out;
+ goto error;
if(H5PTcreate_index(id) >= 0)
- goto out;
+ goto error;
if(H5PTset_index(id, (hsize_t)1) >= 0)
- goto out;
+ goto error;
if(H5PTget_index(id, NULL) >= 0)
- goto out;
+ goto error;
H5E_END_TRY
id_open=0;
if(H5Dclose(id) <0)
- goto out;
+ goto error;
/* Open and close a packet table. Try to execute */
/* commands on the closed ID. */
if((id=H5PTopen(fid, PT_NAME))<0)
- goto out;
+ goto error;
if(H5PTclose(id) <0)
- goto out;
+ goto error;
H5E_BEGIN_TRY
if(H5PTis_valid(id) >= 0)
- goto out;
-#ifdef VLPT_REMOVED
+ goto error;
if(H5PTis_varlen(id) >= 0)
- goto out;
-#endif /* VLPT_REMOVED */
+ goto error;
if(H5PTclose(id) >= 0)
- goto out;
+ goto error;
if(H5PTappend(id, (size_t)1, testPart) >= 0)
- goto out;
+ goto error;
if(H5PTread_packets(id, (hsize_t)0, 1, readBuf) >= 0)
- goto out;
+ goto error;
if(H5PTcreate_index(id) >= 0)
- goto out;
+ goto error;
if(H5PTset_index(id, (hsize_t)1) >= 0)
- goto out;
+ goto error;
if(H5PTget_index(id, NULL) >= 0)
- goto out;
+ goto error;
H5E_END_TRY
PASSED();
- return 0;
+ return SUCCEED;
-out:
+error:
H5_FAILED();
if(id_open)
H5Dclose(id);
- return -1;
+ return FAIL;
}
-
+/*-------------------------------------------------------------------------
+ * test_packet_table(): Invokes individual tests to ensure that all
+ * functions work correctly, except for the variable-length related
+ * functions, which are tested in "test_packet_vlen.c".
+ *
+ *-------------------------------------------------------------------------
+ */
static int test_packet_table(hid_t fid)
{
if( test_create_close(fid) < 0 )
- return -1;
+ return FAIL;
if( test_open(fid) < 0 )
- return -1;
+ return FAIL;
/* test_append must be run before test_count and test_read, as it */
/* creates the packet table they use. */
if( test_append(fid) < 0 )
- return -1;
+ return FAIL;
/* These tests will not necessarily cause failures in each other,
so we don't abort the other tests if one fails. */
@@ -1122,24 +938,24 @@ static int test_packet_table(hid_t fid)
test_get_next(fid);
test_big_table(fid);
test_rw_nonnative_dt(fid);
-#ifdef VLPT_REMOVED
- test_varlen(fid);
-#endif /* VLPT_REMOVED */
test_opaque(fid);
test_compress();
test_error(fid);
- return 0;
+ return SUCCEED;
}
+/*
+ *
+*/
int main(void)
{
- /* identifier for the file */
- hid_t fid;
- int status = 0;
+ /* identifier for the file that is used in FL PT tests */
+ hid_t fid;
+ int status = 0;
/*-------------------------------------------------------------------------
- * Packet test: test each function of the packet table
+ * Packet test: test each function of the packet table library
*-------------------------------------------------------------------------
*/
@@ -1148,12 +964,16 @@ int main(void)
HDputs("Testing packet table");
- /* run tests */
- if ( test_packet_table(fid) < 0)
- status = 1;
+ /* Test packet table with fixed length */
+ if (test_packet_table(fid) < 0)
+ status = 1;
+
+ /* Test packet table with variable length, using separate data file */
+ if (test_packet_table_with_varlen() < 0)
+ status = 1;
- /* close */
- H5Fclose(fid);
+ /* Close the file */
+ H5Fclose(fid);
- return status;
+ return status;
}
diff --git a/hl/test/test_packet_vlen.c b/hl/test/test_packet_vlen.c
new file mode 100644
index 0000000..4d55226
--- /dev/null
+++ b/hl/test/test_packet_vlen.c
@@ -0,0 +1,1098 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group. *
+ * Copyright by the Board of Trustees of the University of Illinois. *
+ * All rights reserved. *
+ * *
+ * This file is part of HDF5. The full HDF5 copyright notice, including *
+ * terms governing use, modification, and redistribution, is contained in *
+ * the 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://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+ * access to either file, you may request a copy from help@hdfgroup.org. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "h5hltest.h"
+
+/*-------------------------------------------------------------------------
+ * Packet Table with Variable-Length test
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define NRECORDS 5
+#define TEST_FILE_NAME "test_packet_table_vlen.h5"
+#define PT_VLEN_ATOMIC "Dataset with VL of Atomic types"
+#define PT_VLEN_COMP "Dataset with VL of Compound Types"
+#define PT_COMP_VLEN "Dataset with Compound Type of VL types"
+#define PT_VLEN_VLEN "Dataset with VL of VL types"
+#define PT_FIXED_LEN "Fixed-length Packet Table"
+#define SPACE3_RANK 1
+#define L1_INCM 16
+#define L2_INCM 8
+#define NAME_BUF_SIZE 80
+
+/*-------------------------------------------------------------------------
+ * Local functions
+ *-------------------------------------------------------------------------
+ */
+
+/* Verifies that the packet table is a variable- or fixed-length */
+static int verify_ptlengthtype(hid_t fid, const char *table_name, herr_t checked_value);
+
+/* Adds an attribute to the named packet table */
+static int adding_attribute(hid_t fid, const char *table_name, const char *attr_name);
+
+/* Verifies that the named attribute was written and is read correctly */
+static int verify_attribute(hid_t fid, const char *table_name, const char *attr_name);
+
+/*-------------------------------------------------------------------------
+ * test_VLof_atomic(): Test that a packet table with VL datatypes of atomic
+ * datatypes can be created and written correctly. (HDFFV-442)
+ *
+ * 2016/01/27 -BMR
+ *-------------------------------------------------------------------------
+ */
+static int test_VLof_atomic(void)
+{
+ hid_t fid=H5I_INVALID_HID; /* Test file identifier */
+ hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */
+ hid_t vltype=H5I_INVALID_HID; /* Variable length datatype */
+ hsize_t count; /* Number of records in the table */
+ int ii, jj; /* Loop variables */
+ hvl_t writeBuf[NRECORDS]; /* Buffer to hold data to be written */
+ hvl_t readBuf[NRECORDS]; /* Buffer to hold read data */
+ char msg[80]; /* For error message */
+ herr_t ret; /* Returned status from a callee */
+
+ TESTING3(" with vlen of atomic");
+
+ /* Allocate and initialize VL data to write (copied from C test) */
+ for (ii=0; ii<NRECORDS; ii++) {
+ writeBuf[ii].p = HDmalloc((ii+1)*sizeof(unsigned int));
+ if (writeBuf[ii].p == NULL) {
+ fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii);
+ goto error;
+ }
+ writeBuf[ii].len = ii+1;
+ for (jj=0; jj<(ii+1); jj++)
+ ((unsigned int *)writeBuf[ii].p)[jj] = ii * 10 + jj;
+ } /* end for */
+
+ /* Open the file */
+ fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT);
+ if (fid < 0)
+ goto error;
+
+ /* Create a vlen type that uses an atomic datatype as its base type */
+ vltype = H5Tvlen_create (H5T_NATIVE_UINT);
+ if (vltype < 0)
+ goto error;
+
+ /* Create a packet table that uses a vlen datatype of an atomic type */
+ ptable = H5PTcreate_fl(fid, PT_VLEN_ATOMIC, vltype, (hsize_t)1, 0);
+
+ /* Ensure that PT is created successfully */
+ if (ptable == H5I_INVALID_HID)
+ goto error;
+
+ /* Close the vlen datatype */
+ if (H5Tclose(vltype) < 0)
+ goto error;
+
+ /* Write the entire buffer to the packet table */
+ ret = H5PTappend(ptable, (size_t)NRECORDS, writeBuf);
+ if (ret < 0)
+ goto error;
+
+ /* Get the number of packets in the packet table, should be NRECORDS. */
+ ret = H5PTget_num_packets(ptable, &count);
+ if (ret < 0)
+ goto error;
+
+ sprintf(msg, "The number of packets in the packet table must be %u\n", NRECORDS);
+ VERIFY(count == NRECORDS, msg);
+
+ /* Read all five packets back */
+ ret = H5PTread_packets(ptable, (hsize_t)0, (size_t)NRECORDS, (void*)readBuf );
+ if (ret < 0)
+ goto error;
+
+ for (ii = 0; ii < NRECORDS; ii++)
+ for (jj=0; jj<(ii+1); jj++)
+ {
+ if (((unsigned int *)readBuf[ii].p)[jj] != ((unsigned int *)writeBuf[ii].p)[jj]) {
+ printf("Packet %d's value should be %d\n", ii, ((unsigned int *)writeBuf[ii].p)[jj]);
+ printf("Packet %d's value in readBuf is %d\n", ii, ((unsigned int *)readBuf[ii].p)[jj]);
+ }
+ }
+
+ /* Free the buffers */
+ ret = H5PTfree_vlen_buff(ptable, NRECORDS, readBuf );
+ if (ret < 0)
+ goto error;
+ ret = H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf);
+ if (ret < 0)
+ goto error;
+
+ /* Close the packet table */
+ ret = H5PTclose(ptable);
+ if (ret < 0)
+ goto error;
+
+ /* Close the file */
+ if (H5Fclose(fid) < 0)
+ goto error;
+
+ PASSED();
+ return SUCCEED;
+
+error: /* An error has occurred. Clean up and exit. */
+ if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
+ if (fid > 0) H5Fclose(fid);
+ H5PTfree_vlen_buff(ptable, NRECORDS, readBuf);
+ H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf);
+ H5_FAILED();
+ return FAIL;
+} /* test_VLof_atomic */
+
+/*-------------------------------------------------------------------------
+ * test_VLof_comptype(): Test that a packet table with VL datatypes of
+ * compound datatypes can be created and written correctly. (HDFFV-442)
+ *
+ * 2016/01/27 -BMR
+ *-------------------------------------------------------------------------
+ */
+static int test_VLof_comptype(void)
+{
+ /* Struct that the VL sequences are composed of */
+ typedef struct {
+ int i;
+ float f;
+ } VLcomp_t;
+ hid_t fid=H5I_INVALID_HID; /* Test file identifier */
+ hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */
+ hid_t vltype=H5I_INVALID_HID; /* Variable length datatype */
+ hid_t cmptype=H5I_INVALID_HID; /* Compound datatype */
+ hvl_t writeBuf[NRECORDS]; /* Buffer to hold data to be written */
+ hvl_t readBuf[NRECORDS]; /* Buffer to hold read data */
+ hsize_t count; /* Number of records in the table */
+ int ii, jj; /* Loop variables */
+ char msg[80]; /* For error message */
+ herr_t ret;
+
+ TESTING3(" with vlen of compound datatypes");
+
+ /* Allocate and initialize VL data to write (copied from C test) */
+ for (ii=0; ii<NRECORDS; ii++) {
+ writeBuf[ii].p = HDmalloc((ii+1)*sizeof(VLcomp_t));
+ if(writeBuf[ii].p == NULL) {
+ fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii);
+ goto error;
+ }
+ writeBuf[ii].len = ii+1;
+ for (jj=0; jj<(ii+1); jj++) {
+ ((VLcomp_t *)writeBuf[ii].p)[jj].i = ii+jj;
+ ((VLcomp_t *)writeBuf[ii].p)[jj].f = (float)((ii+jj)/3.0F);
+ } /* end for */
+ } /* end for */
+
+ /* Open the file */
+ fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT);
+ if (fid < 0)
+ goto error;
+
+ /* Create the base compound type */
+ cmptype = H5Tcreate(H5T_COMPOUND, sizeof(VLcomp_t));
+ if (cmptype < 0)
+ goto error;
+
+ /* Insert fields */
+ ret = H5Tinsert(cmptype, "i", HOFFSET(VLcomp_t, i), H5T_NATIVE_INT);
+ if (ret < 0)
+ goto error;
+ ret = H5Tinsert(cmptype, "f", HOFFSET(VLcomp_t, f), H5T_NATIVE_FLOAT);
+ if (ret < 0)
+ goto error;
+
+ /* Create a variable length type that uses the VLcomp_t as its base type */
+ vltype = H5Tvlen_create(cmptype);
+ if (vltype < 0)
+ goto error;
+
+ /* Create a packet table that uses a vlen datatype of compound datatype */
+ ptable = H5PTcreate_fl(fid, PT_VLEN_COMP, vltype, (hsize_t)1, 0);
+
+ /* Ensure that PT is created successfully */
+ if (ptable == H5I_INVALID_HID)
+ goto error;
+
+ /* Close the vlen datatype */
+ if (H5Tclose(vltype) < 0)
+ goto error;
+
+ /* Write the entire buffer to the packet table */
+ ret = H5PTappend(ptable, (size_t)5, writeBuf );
+ if (ret < 0)
+ goto error;
+
+ /* Get the number of packets in the packet table, should be NRECORDS. */
+ ret = H5PTget_num_packets(ptable, &count);
+ if (ret < 0)
+ goto error;
+
+ sprintf(msg, "The number of packets in the packet table must be %u\n", NRECORDS);
+ VERIFY(count == NRECORDS, msg);
+
+ /* Read all five packets back */
+ ret = H5PTread_packets(ptable, (hsize_t)0, (size_t)5, (void*)readBuf );
+ if (ret < 0)
+ goto error;
+
+ /* Compare data read in */
+ for (ii = 0; ii < NRECORDS; ii++) {
+ if (writeBuf[ii].len != readBuf[ii].len) {
+ fprintf(stderr, "%d: VL data length don't match!, writeBuf[%d].len=%d, readBuf[%d].len=%d\n",__LINE__,(int)ii,(int)writeBuf[ii].len,(int)ii,(int)readBuf[ii].len);
+ continue;
+ } /* write len != read len */
+
+ for (jj=0; jj<(ii+1); jj++) {
+ if (((unsigned int *)writeBuf[ii].p)[jj] != ((unsigned int *)readBuf[ii].p)[jj] ) {
+ fprintf(stderr, "VL data values don't match!, writeBuf[ii].p[%d]=%d, readBuf[ii].p[%d]=%d\n",(int)jj, (int)((unsigned int *)writeBuf[ii].p)[jj], (int)jj, (int)((unsigned int *)readBuf[ii].p)[jj]);
+ continue;
+ } /* write value != read value */
+ }
+ } /* end for */
+
+ /* Free the buffers */
+ ret = H5PTfree_vlen_buff(ptable, NRECORDS, readBuf);
+ if (ret < 0)
+ goto error;
+ ret = H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf);
+ if (ret < 0)
+ goto error;
+
+ /* Close the packet table */
+ ret = H5PTclose(ptable);
+ if (ret < 0)
+ goto error;
+
+ /* Close the file */
+ if (H5Fclose(fid) < 0)
+ goto error;
+
+ PASSED();
+ return SUCCEED;
+
+error: /* An error has occurred. Clean up and exit. */
+ if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
+ if (fid > 0) H5Fclose(fid);
+ H5PTfree_vlen_buff(ptable, NRECORDS, readBuf);
+ H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf);
+ H5_FAILED();
+ return FAIL;
+} /* test_VLof_comptype */
+
+/*-------------------------------------------------------------------------
+ * test_compound_VL_VL(): Test that a packet table of compound datatypes
+ * containing VL datatypes can be created and written
+ * correctly. (HDFFV-442)
+ *
+ * 2016/01/27 -BMR
+ *-------------------------------------------------------------------------
+ */
+static int test_compound_VL_VLtype(void)
+{
+ /* Struct that the VL sequences are composed of */
+ typedef struct {
+ int i;
+ float f;
+ hvl_t v;
+ } compVLVL_t;
+ hid_t fid=H5I_INVALID_HID; /* Test file identifier */
+ hid_t space=H5I_INVALID_HID; /* Dataspace identifier */
+ hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */
+ hid_t vlatomic=H5I_INVALID_HID; /* Variable length datatype */
+ hid_t vlofvl=H5I_INVALID_HID; /* Variable length datatype */
+ hid_t comp_vlvl=H5I_INVALID_HID; /* ID of a compound datatype containing
+ a VL of VL of atomic datatype */
+ hsize_t dims1[] = {NRECORDS};
+ hsize_t count; /* Number of records in the table */
+ compVLVL_t writeBuf[NRECORDS];/* Buffer to hold data to be written */
+ compVLVL_t readBuf[NRECORDS]; /* Buffer to hold read data */
+ hvl_t *t1, *t2;
+ int ii, jj, kk; /* Loop variables */
+ char msg[80]; /* For error message */
+ herr_t ret; /* Returned status from a callee */
+
+ TESTING3(" with compound datatype containing vlen datatype");
+
+ /* Allocate and initialize VL data to write (copied from C test) */
+ for (ii=0; ii<NRECORDS; ii++) {
+ writeBuf[ii].i = ii*10;
+ writeBuf[ii].f = (float)((ii*20)/3.0F);
+ writeBuf[ii].v.p = HDmalloc((ii+L1_INCM)*sizeof(hvl_t));
+ if (writeBuf[ii].v.p == NULL) {
+ fprintf(stderr, "Cannot allocate memory for VL data! ii=%d\n",ii);
+ goto error;
+ }
+ writeBuf[ii].v.len=ii+L1_INCM;
+ for (t1=(hvl_t *)((writeBuf[ii].v).p), jj=0; jj<(ii+L1_INCM); jj++, t1++)
+ {
+ t1->p = HDmalloc((jj+L2_INCM)*sizeof(unsigned int));
+ if (t1->p == NULL) {
+ fprintf(stderr, "Cannot allocate memory for VL data! ii=%d\n",ii);
+ goto error;
+ }
+ t1->len = jj+L2_INCM;
+ for (kk=0; kk<jj+L2_INCM; kk++)
+ ((unsigned int*)t1->p)[kk] = ii*100 + jj*10 + kk;
+ }
+ } /* end for */
+
+ /* Open the file */
+ fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT);
+ if (fid < 0)
+ goto error;
+
+ /* Create dataspace for datasets */
+ space = H5Screate_simple(SPACE3_RANK, dims1, NULL);
+ if (space < 0)
+ goto error;
+
+ /* Create a VL datatype of an atomic type */
+ vlatomic = H5Tvlen_create (H5T_NATIVE_UINT);
+ if (vlatomic < 0)
+ goto error;
+
+ /* Create a VL datatype of the VL of atomic datatype */
+ vlofvl = H5Tvlen_create (vlatomic);
+ if (vlofvl < 0)
+ goto error;
+
+ /* Create the base compound type */
+ comp_vlvl = H5Tcreate(H5T_COMPOUND, sizeof(compVLVL_t));
+ if (comp_vlvl < 0)
+ goto error;
+
+ /* Insert fields: atomic, atomic, vlen */
+ ret = H5Tinsert(comp_vlvl, "i", HOFFSET(compVLVL_t, i), H5T_NATIVE_INT);
+ if (ret < 0)
+ goto error;
+ ret = H5Tinsert(comp_vlvl, "f", HOFFSET(compVLVL_t, f), H5T_NATIVE_FLOAT);
+ if (ret < 0)
+ goto error;
+ ret = H5Tinsert(comp_vlvl, "v", HOFFSET(compVLVL_t, v), vlofvl);
+ if (ret < 0)
+ goto error;
+
+ /* Create a packet table that uses a compound datatype of vlen datatype */
+ ptable = H5PTcreate_fl(fid, PT_COMP_VLEN, comp_vlvl, (hsize_t)1, 0);
+
+ /* Ensure that PT is created successfully */
+ if (ptable == H5I_INVALID_HID)
+ goto error;
+
+ /* Close the vlen datatype */
+ if (H5Tclose(comp_vlvl) < 0)
+ goto error;
+
+ /* Write the entire buffer to the packet table */
+ ret = H5PTappend(ptable, (size_t)NRECORDS, writeBuf );
+ if (ret < 0)
+ goto error;
+
+ /* Get the number of packets in the packet table, should be NRECORDS. */
+ ret = H5PTget_num_packets(ptable, &count);
+ if (ret < 0)
+ goto error;
+
+ sprintf(msg, "The number of packets in the packet table must be %u\n", NRECORDS);
+ VERIFY(count == NRECORDS, msg);
+
+ /* Read all five packets back */
+ ret = H5PTread_packets(ptable, (hsize_t)0, (size_t)NRECORDS, (void*)readBuf );
+ if (ret < 0)
+ goto error;
+
+ /* Compare data read in */
+ for (ii = 0; ii < NRECORDS; ii++) {
+ if (writeBuf[ii].i != readBuf[ii].i) {
+ fprintf(stderr, "Integer components don't match!, writeBuf[%d].i=%d, readBuf[%d].i=%d\n",(int)ii,(int)writeBuf[ii].i,(int)ii,(int)readBuf[ii].i);
+ continue;
+ } /* end if */
+ if (!H5_FLT_ABS_EQUAL(writeBuf[ii].f,readBuf[ii].f)) {
+ fprintf(stderr, "Float components don't match!, writeBuf[%d].f=%f, readBuf[%d].f=%f\n",(int)ii,(double)writeBuf[ii].f,(int)ii,(double)readBuf[ii].f);
+ continue;
+ } /* end if */
+
+ if (writeBuf[ii].v.len != readBuf[ii].v.len) {
+ fprintf(stderr, "%d: VL data length don't match!, writeBuf[%d].v.len=%d, readBuf[%d].v.len=%d\n",__LINE__,(int)ii,(int)writeBuf[ii].v.len,(int)ii,(int)readBuf[ii].v.len);
+ continue;
+ } /* end if */
+
+ for (t1=(hvl_t *)(writeBuf[ii].v.p), t2=(hvl_t *)(readBuf[ii].v.p), jj=0; (size_t)jj<readBuf[ii].v.len; jj++, t1++, t2++) {
+ if (t1->len != t2->len) {
+ fprintf(stderr, "%d: VL data length don't match!, ii=%d, jj=%d, t1->len=%d, t2->len=%d\n",__LINE__,(int)ii,(int)jj,(int)t1->len,(int)t2->len);
+ continue;
+ } /* end if */
+ for (kk=0; (size_t)kk<t2->len; kk++) {
+ if (((unsigned int *)t1->p)[kk] != ((unsigned int *)t2->p)[kk] ) {
+ fprintf(stderr, "VL data values don't match!, t1->p[%d]=%d, t2->p[%d]=%d\n",(int)kk, (int)((unsigned int *)t1->p)[kk], (int)kk, (int)((unsigned int *)t2->p)[kk]);
+ continue;
+ } /* end if */
+ } /* end for */
+ } /* end for */
+ } /* end for */
+
+ /* Free the buffers */
+ ret = H5PTfree_vlen_buff(ptable, NRECORDS, readBuf);
+ if (ret < 0)
+ goto error;
+ ret = H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf);
+ if (ret < 0)
+ goto error;
+
+ /* Close the packet table */
+ ret = H5PTclose(ptable);
+ if (ret < 0)
+ goto error;
+
+ /* Release datatypes */
+ if (H5Tclose(vlatomic) < 0)
+ goto error;
+ if (H5Tclose(vlofvl) < 0)
+ goto error;
+
+ /* Close the file */
+ if (H5Fclose(fid) < 0)
+ goto error;
+
+ PASSED();
+ return SUCCEED;
+
+error: /* An error has occurred. Clean up and exit. */
+ if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
+ if (fid > 0) H5Fclose(fid);
+ H5PTfree_vlen_buff(ptable, NRECORDS, readBuf);
+ H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf);
+ H5_FAILED();
+ return FAIL;
+} /* test_compound_VL_VLtype */
+
+/*-------------------------------------------------------------------------
+ * test_VLof_VLtype(): Test that a packet table of VL datatype with VL
+ * datatypes of atomic datatypes can be created and written
+ * correctly. (HDFFV-442)
+ *
+ * 2016/01/27 -BMR
+ *-------------------------------------------------------------------------
+ */
+static int test_VLof_VLtype(void)
+{
+ hid_t fid=H5I_INVALID_HID; /* Test file identifier */
+ hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */
+ hid_t vlatomic=H5I_INVALID_HID; /* Variable length datatype */
+ hid_t vlofvl=H5I_INVALID_HID; /* VL datatype of VL datatypes */
+ hsize_t count; /* Number of records in the table */
+ hvl_t *t1; /* pointer to advance */
+ int ii, jj, kk; /* Loop variables */
+ hvl_t writeBuf[NRECORDS]; /* Buffer to hold data to be written */
+ hvl_t readBuf[NRECORDS]; /* Buffer to hold read data */
+ char msg[80]; /* For error message */
+ herr_t ret; /* Returned status from a callee */
+
+ TESTING3(" with vlen datatype of vlen datatype");
+
+ /* Allocate and initialize VL data to write (copied from C test) */
+ for (ii=0; ii< NRECORDS; ii++) {
+ writeBuf[ii].p = HDmalloc((ii+1)*sizeof(hvl_t));
+ if (writeBuf[ii].p == NULL) {
+ fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii);
+ goto error;
+ } /* end if */
+ writeBuf[ii].len = ii+1;
+ for (t1=(hvl_t *)(writeBuf[ii].p), jj=0; jj<(ii+1); jj++, t1++)
+ {
+ t1->p = HDmalloc((jj+1)*sizeof(unsigned int));
+ if (t1->p == NULL) {
+ fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii);
+ goto error;
+ }
+ t1->len = jj+1;
+ for (kk=0; kk<(jj+1); kk++)
+ ((unsigned int *)t1->p)[kk] = ii*100+jj*10+kk;
+ } /* end for */
+ } /* end for */
+
+ /* Open the file */
+ fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT);
+ if (fid < 0)
+ goto error;
+
+ /* Create a VL datatype of an atomic type */
+ vlatomic = H5Tvlen_create (H5T_NATIVE_UINT);
+ if (vlatomic < 0)
+ goto error;
+
+ vlofvl = H5Tvlen_create (vlatomic);
+ if (vlofvl < 0)
+ goto error;
+
+ /* Create a packet table that uses a vlen datatype of vlen datatype */
+ ptable = H5PTcreate_fl(fid, PT_VLEN_VLEN, vlofvl, (hsize_t)1, 0);
+
+ /* Ensure that PT is created successfully */
+ if (ptable == H5I_INVALID_HID)
+ goto error;
+
+ /* Close the vlen datatype */
+ if (H5Tclose(vlofvl) < 0)
+ goto error;
+
+ /* Write the entire buffer to the packet table */
+ ret = H5PTappend(ptable, (size_t)5, writeBuf );
+ if (ret < 0)
+ goto error;
+
+ /* Get the number of packets in the packet table, should be NRECORDS. */
+ ret = H5PTget_num_packets(ptable, &count);
+ if (ret < 0)
+ goto error;
+
+ sprintf(msg, "The number of packets in the packet table must be %u\n", NRECORDS);
+ VERIFY(count == NRECORDS, msg);
+
+ /* Read all five packets back */
+ ret = H5PTread_packets(ptable, (hsize_t)0, (size_t)5, (void*)readBuf );
+ if (ret < 0)
+ goto error;
+
+ /* Free the buffers */
+ ret = H5PTfree_vlen_buff(ptable, NRECORDS, readBuf);
+ if (ret < 0)
+ goto error;
+ ret = H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf);
+ if (ret < 0)
+ goto error;
+
+ /* Close the packet table */
+ ret = H5PTclose(ptable);
+ if (ret < 0)
+ goto error;
+
+ /* Close the file */
+ if (H5Fclose(fid) < 0)
+ goto error;
+
+ PASSED();
+ return SUCCEED;
+
+error: /* An error has occurred. Clean up and exit. */
+ if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
+ if (fid > 0) H5Fclose(fid);
+ H5PTfree_vlen_buff(ptable, NRECORDS, readBuf);
+ H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf);
+ H5_FAILED();
+ return FAIL;
+} /* test_VLof_VLtype */
+
+/*-------------------------------------------------------------------------
+ * verify_ptlengthtype() - helper function, verifies that the named packet
+ * table is a fixed-length or variable-length as indicated by the last
+ * argument.
+ *
+ * 2016/01/27 -BMR
+ *-------------------------------------------------------------------------
+ */
+static int verify_ptlengthtype(hid_t fid, const char *table_name, herr_t expected_value)
+{
+ hid_t ptable = H5I_INVALID_HID; /* Packet table identifier */
+ herr_t is_varlen = 0;
+ herr_t ret = FAIL;
+
+ /* Open the named packet table */
+ if( (ptable = H5PTopen(fid, table_name)) < 0)
+ goto error;
+
+ /* Verify the value returned from H5PTis_varlen is as expected */
+ is_varlen = H5PTis_varlen(ptable);
+ if (is_varlen == FAIL)
+ goto error;
+ else if (is_varlen == expected_value)
+ ret = SUCCEED;
+ else
+ {
+ char lenthtype[20];
+ HDstrcpy(lenthtype, "fixed-length");
+ if (expected_value == 1)
+ HDstrcpy(lenthtype, "variable-length");
+ fprintf(stderr, "\nPacket table '%s' should be %s but is not\n", table_name, lenthtype);
+ ret = FAIL;
+ }
+
+ /* Close the packet table */
+ if (H5PTclose(ptable) < 0)
+ goto error;
+
+ return ret;
+
+error: /* An error has occurred. Clean up and exit. */
+ if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
+ return ret;
+} /* verify_ptlengthtype */
+
+/*-------------------------------------------------------------------------
+ * test_H5PTis_varlen(): Test that H5PTis_varlen works correctly on both
+ * fixed- and variable-length packet tables.
+ *
+ * Description:
+ * - Added a fixed-length packet table to the file for variety
+ * - Use the helper funtion verify_ptlengthtype to test H5PTis_varlen
+ * on each packet table.
+ *
+ * 2016/01/27 -BMR
+ *-------------------------------------------------------------------------
+ */
+static int test_H5PTis_varlen(void)
+{
+ hid_t fid=H5I_INVALID_HID; /* Test file identifier */
+ hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */
+ herr_t ret; /* Returned status from a callee */
+
+ TESTING("H5PTis_varlen");
+
+ /* Open the file */
+ fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT);
+ if (fid < 0)
+ goto error;
+
+ /* Create a new table */
+ ptable = H5PTcreate_fl(fid, "Fixed-length Packet Table", H5T_STD_I32BE, (hsize_t)100, -1);
+
+ /* Ensure that PT is created successfully */
+ if (ptable == H5I_INVALID_HID)
+ goto error;
+
+ /* Close the packet table */
+ ret = H5PTclose(ptable);
+ if (ret < 0)
+ goto error;
+
+ /* Close the file */
+ if (H5Fclose(fid) < 0)
+ goto error;
+
+ /* Open the file */
+ fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT);
+ if (fid < 0)
+ goto error;
+
+ /* Open each packet table, and verify that H5PTis_varlen returns correct
+ type for each table */
+ ret = verify_ptlengthtype(fid, PT_VLEN_ATOMIC, 1); /* vlen of atomic */
+ if (ret < 0)
+ goto error;
+ ret = verify_ptlengthtype(fid, PT_VLEN_COMP, 1); /* vlen of compound */
+ if (ret < 0)
+ goto error;
+ ret = verify_ptlengthtype(fid, PT_COMP_VLEN, 0); /* compound of vlen, no vlen */
+ if (ret < 0)
+ goto error;
+ ret = verify_ptlengthtype(fid, PT_VLEN_VLEN, 1); /* vlen of vlen */
+ if (ret < 0)
+ goto error;
+ ret = verify_ptlengthtype(fid, PT_FIXED_LEN, 0); /* no vlen */
+ if (ret < 0)
+ goto error;
+
+ /* Close the file */
+ if (H5Fclose(fid) < 0)
+ goto error;
+
+ PASSED();
+ return SUCCEED;
+
+error: /* An error has occurred. Clean up and exit. */
+ if (fid > 0) H5Fclose(fid);
+ H5_FAILED();
+ return FAIL;
+} /* test_H5PTis_varlen */
+
+/*-------------------------------------------------------------------------
+ * adding_attribute() - helper function, adds an attribute to the named
+ * packet table.
+ * Note:
+ * For simplicity, the attributes that are added to the packet tables
+ * have the same characteristics except their names. They have the
+ * same type, space, and values.
+ *
+ * 2016/01/27 -BMR
+ *-------------------------------------------------------------------------
+ */
+#define ATTR_RANK 1
+#define ATTR_DIM 3
+int attr_data[ATTR_DIM]={256,11945,-22107}; /* values to be written to attr */
+
+static int adding_attribute(hid_t fid, const char *table_name, const char *attr_name)
+{
+ hid_t ptable = H5I_INVALID_HID; /* Packet table identifier */
+ hid_t space_id = H5I_INVALID_HID; /* Dataspace for the attribute */
+ hid_t attr_id = H5I_INVALID_HID; /* Attribute identifier */
+ hid_t dset_id = H5I_INVALID_HID; /* Dataset identifier */
+ hsize_t dims[] = {ATTR_DIM}; /* Dimension for dataspace */
+ int ret = FAIL; /* Returned status from a callee */
+
+ /* Create dataspace for attribute */
+ space_id = H5Screate_simple(ATTR_RANK, dims, NULL);
+ if (space_id < 0)
+ goto error;
+
+ /* Open the named packet table */
+ if( (ptable = H5PTopen(fid, table_name)) < 0)
+ goto error;
+
+ dset_id = H5PTget_dataset(ptable);
+ if (dset_id < 0)
+ goto error;
+
+ /* Add the specified attribute to it */
+ attr_id = H5Acreate(dset_id, attr_name, H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT);
+ if (attr_id < 0)
+ goto error;
+
+ /* Write attribute values */
+ ret = H5Awrite(attr_id, H5T_NATIVE_INT, attr_data);
+ if (ret < 0)
+ goto error;
+
+ /* Close the attribute */
+ if (H5Aclose(attr_id) < 0)
+ goto error;
+
+ /* Close the packet table */
+ if (H5PTclose(ptable) < 0)
+ goto error;
+
+ return SUCCEED;
+
+error: /* An error has occurred. Clean up and exit. */
+ if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
+ return ret;
+} /* adding_attribute */
+
+/*-------------------------------------------------------------------------
+ * verify_attribute() - helper function, verifies the named attribute can
+ * be read correctly.
+ *
+ * 2016/01/27 -BMR
+ *-------------------------------------------------------------------------
+ */
+static herr_t verify_attribute(hid_t fid, const char *table_name, const char *attr_name)
+{
+ hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */
+ hid_t space_id=H5I_INVALID_HID; /* Dataspace for the attribute */
+ hid_t attr_id=H5I_INVALID_HID; /* Attribute identifier */
+ hid_t dset_id=H5I_INVALID_HID; /* Dataset associated with the pt */
+ hsize_t dims[] = {ATTR_DIM}; /* Dimensions for dataspace */
+ int read_data[ATTR_DIM]; /* Output buffer */
+ int ii;
+ herr_t ret = FAIL; /* Returned status from a callee */
+
+ /* Create dataspace for attribute */
+ space_id = H5Screate_simple(ATTR_RANK, dims, NULL);
+ if (space_id < 0)
+ goto error;
+
+ /* Open the named packet table */
+ ptable = H5PTopen(fid, table_name);
+ if (ptable < 0)
+ goto error;
+
+ /* Get the dataset id of this packet table */
+ dset_id = H5PTget_dataset(ptable);
+ if (dset_id < 0)
+ goto error;
+
+ /* Open first attribute for the dataset */
+ attr_id = H5Aopen(dset_id, attr_name, H5P_DEFAULT);
+ if (attr_id < 0)
+ goto error;
+
+ /* Read attribute values */
+ ret = H5Aread(attr_id, H5T_NATIVE_INT, read_data);
+ if (ret < 0)
+ goto error;
+
+ /* Verify values read in */
+ for (ii = 0; ii < ATTR_DIM; ii++)
+ if (attr_data[ii] != read_data[ii])
+ TestErrPrintf("%d: attribute data different: attr_data[%d]=%d, read_data[%d]=%d\n", __LINE__, ii, attr_data[ii], ii, read_data[ii]);
+
+ /* Close the attribute */
+ if (H5Aclose(attr_id) < 0)
+ goto error;
+
+ /* Close the packet table */
+ if (H5PTclose(ptable) < 0)
+ goto error;
+
+ return SUCCEED;
+
+error: /* An error has occurred. Clean up and exit. */
+ if (attr_id > 0) H5Aclose(attr_id);
+ if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
+ return ret;
+} /* verify_attribute */
+
+/*-------------------------------------------------------------------------
+ * test_attributes(): Test adding attributes to packet tables
+ *
+ * Description:
+ * Added attributes to some random packet tables in the file.
+ *
+ * 2016/01/27 -BMR
+ *-------------------------------------------------------------------------
+ */
+static int test_attributes(void)
+{
+ hid_t fid=H5I_INVALID_HID; /* File identifier */
+ hid_t attr_id=H5I_INVALID_HID; /* Attribute identifier */
+ herr_t ret = FAIL; /* Returned status from a callee */
+
+ TESTING("adding attributes to packet tables");
+
+ /* Open the file */
+ fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT);
+ if (fid < 0)
+ goto error;
+
+ /* Add an arbitrary attribute to a few packet tables, using helper func */
+ attr_id = adding_attribute(fid, PT_VLEN_ATOMIC, "Attribute 1");
+ if (attr_id < 0)
+ goto error;
+ attr_id = adding_attribute(fid, PT_VLEN_COMP, "Attribute 2");
+ if (attr_id < 0)
+ goto error;
+ attr_id = adding_attribute(fid, PT_COMP_VLEN, "Attribute 3");
+ if (attr_id < 0)
+ goto error;
+
+ /* Close the file */
+ if (H5Fclose(fid) < 0)
+ goto error;
+
+ /* Open the file again */
+ fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT);
+ if (fid < 0)
+ goto error;
+
+ /* Read each attribute and verify the values, using helper function */
+ ret = verify_attribute(fid, PT_VLEN_ATOMIC, "Attribute 1");
+ if (ret < 0)
+ goto error;
+ ret = verify_attribute(fid, PT_VLEN_COMP, "Attribute 2");
+ if (ret < 0)
+ goto error;
+ ret = verify_attribute(fid, PT_COMP_VLEN, "Attribute 3");
+ if (ret < 0)
+ goto error;
+
+ /* Close the file */
+ if (H5Fclose(fid) < 0)
+ goto error;
+
+ PASSED();
+ return(ret);
+
+error: /* An error has occurred. Clean up and exit. */
+ H5Fclose(fid);
+ H5_FAILED();
+ return FAIL;
+} /* test_attributes */
+
+/*-------------------------------------------------------------------------
+ * verify_accessors() - helper function, verifies that various info can be
+ * retrieved correctly using the info returned by the accessor functions.
+ *
+ * Description:
+ * Testing functions H5PTget_dataset and H5PTget_type
+ *
+ * - Opens the named packet table
+ * - Gets its associated dataset ID then calls a C function on that ID
+ * to verify the dataset name
+ * - Gets its associated datatype ID then calls a C function on that ID
+ * to verify that the packet table is variable- or fixed-length as
+ * indicated by the expected_value argument
+ *
+ * 2016/01/27 -BMR
+ *-------------------------------------------------------------------------
+ */
+static herr_t verify_accessors(const char *table_name, herr_t expected_value)
+{
+ hid_t fid=H5I_INVALID_HID; /* File identifier */
+ hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */
+ hid_t dset_id=H5I_INVALID_HID; /* Dataset associated with the pt */
+ hid_t dtype_id=H5I_INVALID_HID; /* Dataset identifier */
+ char buf[NAME_BUF_SIZE];
+ ssize_t name_size;
+ herr_t is_varlen = 0;
+ herr_t ret = FAIL; /* Returned status from a callee */
+
+ /* Open the file. */
+ fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT);
+ if (fid < 0)
+ goto error;
+
+ /* Open the named packet table. */
+ ptable = H5PTopen(fid, table_name);
+ if (ptable < 0)
+ goto error;
+
+ /* Get the associated dataset ID. */
+ dset_id = H5PTget_dataset(ptable);
+ if (dset_id < 0)
+ goto error;
+
+ /* Check if the packet table's name matches its associated dataset's. */
+ *buf = '\0';
+ name_size = H5Iget_name(dset_id, (char*)buf, NAME_BUF_SIZE);
+ VERIFY(HDstrcmp(buf, table_name), "Names of dataset and packet table don't match");
+
+ /* Get the packet table's datatype ID */
+ dtype_id = H5PTget_type(ptable);
+ if (dtype_id < 0)
+ goto error;
+
+ /* Check if the type class matches that of the packet table. */
+ is_varlen = H5Tdetect_class(dtype_id, H5T_VLEN);
+ if (is_varlen == FAIL) /* failure occurred */
+ goto error;
+ else if (is_varlen == expected_value) /* length types match */
+ ret = SUCCEED;
+ else /* length types don't match */
+ {
+ /* Give lengthtype "fixed-length" or "variable-length" depending on the
+ expected_value passed in, then print the error message. */
+ char lenthtype[20];
+ HDstrcpy(lenthtype, "fixed-length");
+ if (expected_value == 1)
+ HDstrcpy(lenthtype, "variable-length");
+ fprintf(stderr, "\nThe dataset '%s' should be %s but is not\n", table_name, lenthtype);
+ ret = FAIL;
+ }
+
+ /* Close the packet table */
+ if (H5PTclose(ptable) < 0)
+ goto error;
+
+ return SUCCEED;
+
+error: /* An error has occurred. Clean up and exit. */
+ if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
+ return ret;
+} /* verify_accessors */
+
+/*-------------------------------------------------------------------------
+ * test_accessors(): Test the accessor functions
+ *
+ * Description:
+ * Retrieves the dataset and datatype IDs and verifies various info
+ * to ensure these IDs are correct.
+ *
+ * 2016/01/27 -BMR
+ *-------------------------------------------------------------------------
+ */
+static int test_accessors(void)
+{
+ hid_t fid=H5I_INVALID_HID; /* File identifier */
+ hid_t ptable=H5I_INVALID_HID; /* File identifier */
+ herr_t ret = FAIL; /* Returned status from a callee */
+
+ TESTING("accessor functions");
+
+ /* Open the file */
+ fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT);
+ if (fid < 0)
+ goto error;
+
+ ret = verify_accessors(PT_VLEN_ATOMIC, TRUE);
+ if (ret < 0)
+ goto error;
+
+ ret = verify_accessors(PT_FIXED_LEN, FALSE);
+ if (ret < 0)
+ goto error;
+
+ /* Close the file */
+ if (H5Fclose(fid) < 0)
+ goto error;
+
+ PASSED();
+ return SUCCEED;
+
+error: /* An error has occurred. Clean up and exit. */
+ if (H5PTis_valid(ptable) > 0) H5PTclose(ptable);
+ if (fid > 0) H5Fclose(fid);
+ H5_FAILED();
+ return FAIL;
+} /* test_accessors */
+
+/*-------------------------------------------------------------------------
+ * test_packet_table_with_varlen(): Invokes individual tests to ensure that
+ * packet tables with variable length are created and written correctly
+ * without the specific VL PT functionality. (HDFFV-442)
+ *
+ * 2016/01/27 -BMR
+ *-------------------------------------------------------------------------
+ */
+int test_packet_table_with_varlen(void)
+{
+ hid_t fid=H5I_INVALID_HID; /* File identifier */
+ int status = SUCCEED;
+
+ /* Create a file using default properties */
+ fid = H5Fcreate(TEST_FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ if (fid < 0)
+ return FAIL;
+
+ /* Close the file. The file will be opened by each test function below */
+ if (H5Fclose(fid) < 0)
+ return FAIL;
+
+ HDputs("Testing packet table with various variable-length datatypes");
+
+ /* If any test fails, move on to subsequent test, but status will indicate
+ there is a failure. */
+
+ /* Test variable length of a simple type */
+ if (test_VLof_atomic() < 0)
+ status = FAIL;
+
+ /* Test variable length of a compound type */
+ if (test_VLof_comptype() < 0)
+ status = FAIL;
+
+ /* Test compound type with variable length */
+ if (test_compound_VL_VLtype() < 0)
+ status = FAIL;
+
+ /* Test variable length of a variable length */
+ if (test_VLof_VLtype() < 0)
+ status = FAIL;
+
+ /* Test variable length of a variable length */
+ if (test_H5PTis_varlen() < 0)
+ status = FAIL;
+
+ /* Test adding attributes to packet table */
+ if (test_attributes() < 0)
+ status = FAIL;
+
+ /* Test accessor functions */
+ if (test_accessors() < 0)
+ status = FAIL;
+
+ return(status);
+}