summaryrefslogtreecommitdiffstats
path: root/hl
diff options
context:
space:
mode:
authorMohamad Chaarawi <chaarawi@hdfgroup.org>2016-05-09 18:55:46 (GMT)
committerMohamad Chaarawi <chaarawi@hdfgroup.org>2016-05-09 18:55:46 (GMT)
commit44640ecf685cfbd15fe176a1b96c6a7105288678 (patch)
treed812c113ba801562f0e9a607456bf8daa14a5c9e /hl
parent45b57227d47476490cd720dc65e9c2fbfc94cd9f (diff)
parent57b7130acf69256ddaee7c6295a65c6ba16e3096 (diff)
downloadhdf5-44640ecf685cfbd15fe176a1b96c6a7105288678.zip
hdf5-44640ecf685cfbd15fe176a1b96c6a7105288678.tar.gz
hdf5-44640ecf685cfbd15fe176a1b96c6a7105288678.tar.bz2
[svn-r29903] merge from trunk.
Diffstat (limited to 'hl')
-rw-r--r--hl/c++/src/CMakeLists.txt2
-rw-r--r--hl/c++/src/H5PacketTable.cpp204
-rw-r--r--hl/c++/src/H5PacketTable.h131
-rw-r--r--hl/c++/src/Makefile.am2
-rw-r--r--hl/c++/test/ptableTest.cpp53
-rw-r--r--hl/fortran/src/CMakeLists.txt4
-rw-r--r--hl/fortran/src/H5HL_buildiface.F907
-rw-r--r--hl/fortran/src/H5LTf90proto.h32
-rw-r--r--hl/fortran/src/H5LTff.F9028
-rw-r--r--hl/fortran/src/H5TBfc.c276
-rw-r--r--hl/fortran/src/H5TBff.F90182
-rw-r--r--hl/fortran/src/Makefile.am2
-rw-r--r--hl/fortran/src/hdf5_hl_fortrandll.def.in4
-rw-r--r--hl/fortran/test/Makefile.am2
-rw-r--r--hl/fortran/test/tstlite.F9078
-rw-r--r--hl/fortran/test/tsttable.F90242
-rw-r--r--hl/src/CMakeLists.txt2
-rw-r--r--hl/src/H5DOpublic.h10
-rw-r--r--hl/src/H5PT.c528
-rw-r--r--hl/src/H5PTpublic.h68
-rw-r--r--hl/src/H5TB.c2
-rw-r--r--hl/src/Makefile.am2
-rw-r--r--hl/test/CMakeLists.txt12
-rw-r--r--hl/test/Makefile.am4
-rw-r--r--hl/test/h5hltest.h2
-rw-r--r--hl/test/test_dset_opt.c2
-rw-r--r--hl/test/test_lite.c23
-rw-r--r--hl/test/test_packet.c520
-rw-r--r--hl/test/test_packet_vlen.c1693
-rw-r--r--hl/tools/gif2h5/h52giftest.sh.in2
30 files changed, 3147 insertions, 972 deletions
diff --git a/hl/c++/src/CMakeLists.txt b/hl/c++/src/CMakeLists.txt
index e37c5ba..425a2fe 100644
--- a/hl/c++/src/CMakeLists.txt
+++ b/hl/c++/src/CMakeLists.txt
@@ -34,7 +34,7 @@ if (BUILD_SHARED_LIBS)
${HDF5_LIBSH_TARGET}
)
set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_HL_CPP_LIBSH_TARGET}")
- H5_SET_LIB_OPTIONS (${HDF5_HL_CPP_LIBSH_TARGET} ${HDF5_HL_CPP_LIB_NAME} SHARED)
+ H5_SET_LIB_OPTIONS (${HDF5_HL_CPP_LIBSH_TARGET} ${HDF5_HL_CPP_LIB_NAME} SHARED ${HDF5_HL_CXX_PACKAGE_SOVERSION})
set_target_properties (${HDF5_HL_CPP_LIBSH_TARGET} PROPERTIES
FOLDER libraries/hl
COMPILE_DEFINITIONS "H5_BUILT_AS_DYNAMIC_LIB"
diff --git a/hl/c++/src/H5PacketTable.cpp b/hl/c++/src/H5PacketTable.cpp
index 74b8029..50e11f6 100644
--- a/hl/c++/src/H5PacketTable.cpp
+++ b/hl/c++/src/H5PacketTable.cpp
@@ -34,6 +34,12 @@
* Opens an existing packet table, which can contain either fixed-length or
* variable-length packets.
*/
+ PacketTable::PacketTable(hid_t fileID, const char* name)
+ {
+ table_id = H5PTopen( fileID, name);
+ }
+
+ /* "Open" Constructor - will be deprecated because of char* name */
PacketTable::PacketTable(hid_t fileID, char* name)
{
table_id = H5PTopen( fileID, name);
@@ -60,17 +66,14 @@
return false;
}
-#ifdef VLPT_REMOVED
/* IsVariableLength
- * Return 1 if this packet table is a Variable Length packet table,
- * return 0 if it is Fixed Length. Returns -1 if the table is
- * invalid (not open).
+ * Return 1 if this packet table uses variable-length datatype,
+ * and 0, otherwise. Returns -1 if the table is invalid (not open).
*/
int PacketTable::IsVariableLength()
{
return H5PTis_varlen(table_id);
}
-#endif /* VLPT_REMOVED */
/* ResetIndex
* Sets the index to point to the first packet in the packet table
@@ -113,39 +116,87 @@
{
hsize_t npackets;
- error = H5PTget_num_packets( table_id, (hsize_t *)&npackets);
+ error = H5PTget_num_packets(table_id, &npackets);
return npackets;
}
+ /* GetTableId
+ * Returns the identifier of the packet table
+ */
+ hid_t PacketTable::GetTableId()
+ {
+ return table_id;
+ }
+
+ /* GetDatatype
+ * Returns the datatype identifier used by the packet table, on success,
+ * or FAIL, on failure.
+ * Note: it is best to avoid using this identifier in applications, unless
+ * the desired functionality cannot be performed via the packet table ID.
+ */
+ hid_t PacketTable::GetDatatype()
+ {
+ return H5PTget_type(table_id);
+ }
+
+ /* GetDataset
+ * Returns the dataset identifier associated with the packet table, on
+ * success, or FAIL, on failure.
+ * Note: it is best to avoid using this identifier in applications, unless
+ * the desired functionality cannot be performed via the packet table ID.
+ */
+ hid_t PacketTable::GetDataset()
+ {
+ return H5PTget_dataset(table_id);
+ }
+
+ /* FreeBuff
+ * Frees the buffers created when variable-length packets are read.
+ * Takes the number of hvl_t structs to be freed and a pointer to their
+ * location in memory.
+ * Returns 0 on success, negative on error.
+ */
+ int PacketTable::FreeBuff(size_t numStructs, hvl_t * buffer)
+ {
+ return H5PTfree_vlen_buff( table_id, numStructs, buffer);
+ }
+
+
/********************************/
/* Fixed-Length Packet Table */
/********************************/
/* Constructor
- * Creates a packet table in which to store fixed length packets.
+ * Creates a packet table to store either fixed- or variable-length packets.
+ * Takes the ID of the file the packet table will be created in, the ID of
+ * the property list to specify compression, the name of the packet table,
+ * the ID of the datatype, and the size of a memory chunk used in chunking.
+ */
+ FL_PacketTable::FL_PacketTable(hid_t fileID, hid_t plist_id, const char* name, hid_t dtypeID, hsize_t chunkSize)
+ {
+ table_id = H5PTcreate(fileID, name, dtypeID, chunkSize, plist_id);
+ }
+
+ /* Constructor
+ * Creates a packet table to store either fixed- or variable-length packets.
* Takes the ID of the file the packet table will be created in, the name of
* the packet table, the ID of the datatype of the set, and the size
* of a memory chunk used in chunking.
+ * Note: this overload will be deprecated in favor of the constructor above.
*/
FL_PacketTable::FL_PacketTable(hid_t fileID, char* name, hid_t dtypeID, hsize_t chunkSize, int compression)
{
- table_id = H5PTcreate_fl ( fileID, name, dtypeID, chunkSize, compression);
+ table_id = H5PTcreate_fl(fileID, name, dtypeID, chunkSize, compression);
}
/* "Open" Constructor
* Opens an existing fixed-length packet table.
* Fails if the packet table specified is variable-length.
*/
- FL_PacketTable::FL_PacketTable(hid_t fileID, char* name) : PacketTable(fileID, name)
- {
-#ifdef VLPT_REMOVED
- if( H5PTis_varlen(table_id) != 0 ) // If this is not a fixed-length table
- {
- H5PTclose(table_id);
- table_id = -1;
- }
-#endif /* VLPT_REMOVED */
- }
+ FL_PacketTable::FL_PacketTable(hid_t fileID, const char* name) : PacketTable(fileID, name) {}
+
+ /* "Open" Constructor - will be deprecated because of char* name */
+ FL_PacketTable::FL_PacketTable(hid_t fileID, char* name) : PacketTable(fileID, name) {}
/* AppendPacket
* Adds a single packet to the packet table. Takes a pointer
@@ -215,119 +266,4 @@
return H5PTget_next(table_id, numPackets, data);
}
-
-#ifdef VLPT_REMOVED
- /********************************/
- /* Variable-Length Packet Table */
- /********************************/
-
- /* Constructor
- * Creates a packet table in which to store variable length packets.
- * Takes the ID of the file the packet table will be created in, the name of
- * the packet table, and the size of a memory chunk used in chunking.
- */
- VL_PacketTable::VL_PacketTable(hid_t fileID, char* name, hsize_t chunkSize)
- {
- table_id = H5PTcreate_vl ( fileID, name, chunkSize);
- }
-
- /* "Open" Constructor
- * Opens an existing variable-length packet table.
- * Fails if the packet table specified is fixed-length.
- */
- VL_PacketTable::VL_PacketTable(hid_t fileID, char* name) : PacketTable(fileID, name)
- {
- if( H5PTis_varlen(table_id) != 1 ) // If this is not a variable-length table
- {
- H5PTclose(table_id);
- table_id = -1;
- }
- }
-
- /* AppendPacket (variable-length)
- * Adds a single variable-length packet to the packet table.
- * Takes a pointer to the location of the data in memory and the length of the data
- * in bytes.
- * Returns 0 on success, negative on failure.
- */
- int VL_PacketTable::AppendPacket(void * data, size_t length)
- {
- hvl_t packet;
-
- packet.len = length;
- packet.p = data;
-
- return H5PTappend(table_id, 1, &packet);
- }
-
- /* AppendPackets (multiple packets)
- * Adds multiple variable-length packets to the packet table. Takes the
- * number of
- * packets to be added and a pointer to an array of hvl_t structs in memory.
- * Returns 0 on success, negative on failure.
- */
- int VL_PacketTable::AppendPackets(size_t numPackets, hvl_t * data)
- {
- return H5PTappend(table_id, numPackets, data);
- }
-
- /* GetPacket (indexed)
- * Gets a single variable-length packet from the packet table. Takes the
- * index of the packet (with 0 being the first packet) and a pointer
- * to a hvl_t struct in which to store the packet's size and location.
- * Returns 0 on success, negative on failure.
- */
- int VL_PacketTable::GetPacket(hsize_t index, hvl_t * data)
- {
- return H5PTread_packets(table_id, index, 1, data);
- }
-
- /* GetPackets (multiple packets)
- * Gets multiple variable-length packets at once, all packets between
- * startIndex and endIndex inclusive. Takes a pointer to an array
- * of hvl_t structs in memory in which to store pointers to the packets.
- * Returns 0 on success, negative on failure.
- */
- int VL_PacketTable::GetPackets(hsize_t startIndex, hsize_t endIndex, hvl_t * data)
- {
- // Make sure the range of indexes is valid
- if (startIndex > endIndex)
- return -1;
-
- return H5PTread_packets(table_id, startIndex, endIndex-startIndex+1, data);
- }
-
- /* GetNextPacket (single packet)
- * Gets the next packet in the packet table. Takes a pointer to
- * an hvl_t struct where the packet should be stored.
- * Returns 0 on success, negative on failure. Index
- * is not advanced to the next packet on failure.
- */
- int VL_PacketTable::GetNextPacket(hvl_t * data)
- {
- return H5PTget_next(table_id, 1, data);
- }
-
- /* GetNextPackets (multiple packets)
- * Gets the next numPackets packets in the packet table. Takes a
- * pointer to an array of hvl_t structs where pointers to the packets
- * should be stored.
- * Returns 0 on success, negative on failure. Index
- * is not advanced on failure.
- */
- int VL_PacketTable::GetNextPackets(size_t numPackets, hvl_t * data)
- {
- return H5PTget_next(table_id, numPackets, data);
- }
-
- /* FreeReadbuff
- * Frees the buffers created when variable-length packets are read.
- * Takes the number of hvl_t structs to be freed and a pointer to their
- * location in memory.
- * Returns 0 on success, negative on error.
- */
- int VL_PacketTable::FreeReadbuff(size_t numStructs, hvl_t * buffer)
- {
- return H5PTfree_vlen_readbuff( table_id, numStructs, buffer);
- }
-#endif /* VLPT_REMOVED */
+/* Removed "ifdef VLPT_REMOVED" block. 03/08/2016, -BMR */
diff --git a/hl/c++/src/H5PacketTable.h b/hl/c++/src/H5PacketTable.h
index 5f9a213..bdd669d 100644
--- a/hl/c++/src/H5PacketTable.h
+++ b/hl/c++/src/H5PacketTable.h
@@ -42,12 +42,15 @@ public:
* Opens an existing packet table, which can contain either fixed-length or
* variable-length packets.
*/
+ PacketTable(hid_t fileID, const char* name);
+
+ /* "Open" Constructor - will be deprecated because of char* name */
PacketTable(hid_t fileID, char* name);
/* Destructor
* Cleans up the packet table
*/
- ~PacketTable();
+ virtual ~PacketTable();
/* IsValid
* Returns true if this packet table is valid, false otherwise.
@@ -56,14 +59,12 @@ public:
*/
bool IsValid();
-#ifdef VLPT_REMOVED
/* IsVariableLength
- * Return 1 if this packet table is a Variable Length packet table,
+ * Return 1 if this packet table uses variable-length datatype,
* return 0 if it is Fixed Length. Returns -1 if the table is
* invalid (not open).
*/
int IsVariableLength();
-#endif /* VLPT_REMOVED */
/* ResetIndex
* Sets the "current packet" index to point to the first packet in the
@@ -96,6 +97,35 @@ public:
return GetPacketCount(ignoreError);
}
+ /* GetTableId
+ * Returns the identifier of the packet table.
+ */
+ hid_t GetTableId();
+
+ /* GetDatatype
+ * Returns the datatype identifier used by the packet table, on success,
+ * or FAIL, on failure.
+ * Note: it is best to avoid using this identifier in applications, unless
+ * the desired functionality cannot be performed via the packet table ID.
+ */
+ hid_t GetDatatype();
+
+ /* GetDataset
+ * Returns the dataset identifier associated with the packet table, on
+ * success, or FAIL, on failure.
+ * Note: it is best to avoid using this identifier in applications, unless
+ * the desired functionality cannot be performed via the packet table ID.
+ */
+ hid_t GetDataset();
+
+ /* FreeBuff
+ * Frees the buffers created when variable-length packets are read.
+ * Takes the number of hvl_t structs to be freed and a pointer to their
+ * location in memory.
+ * Returns 0 on success, negative on error.
+ */
+ int FreeBuff(size_t numStructs, hvl_t * buffer);
+
protected:
hid_t table_id;
};
@@ -104,11 +134,20 @@ class H5_HLCPPDLL FL_PacketTable : virtual public PacketTable
{
public:
/* Constructor
+ * Creates a packet table to store either fixed- or variable-length packets.
+ * Takes the ID of the file the packet table will be created in, the ID of
+ * the property list to specify compression, the name of the packet table,
+ * the ID of the datatype, and the size of a memory chunk used in chunking.
+ */
+ FL_PacketTable(hid_t fileID, hid_t plist_id, const char* name, hid_t dtypeID, hsize_t chunkSize);
+
+ /* Constructor
* Creates a packet table in which to store fixed length packets.
* Takes the ID of the file the packet table will be created in, the name of
* the packet table, the ID of the datatype of the set, the size
* of a memory chunk used in chunking, and the desired compression level
* (0-9, or -1 for no compression).
+ * Note: this overload will be deprecated in favor of the constructor above.
*/
FL_PacketTable(hid_t fileID, char* name, hid_t dtypeID, hsize_t chunkSize, int compression = -1);
@@ -116,8 +155,16 @@ public:
* Opens an existing fixed-length packet table.
* Fails if the packet table specified is variable-length.
*/
+ FL_PacketTable(hid_t fileID, const char* name);
+
+ /* "Open" Constructor - will be deprecated because of char* name */
FL_PacketTable(hid_t fileID, char* name);
+ /* Destructor
+ * Cleans up the packet table
+ */
+ virtual ~FL_PacketTable() {};
+
/* AppendPacket
* Adds a single packet to the packet table. Takes a pointer
* to the location of the data in memory.
@@ -165,80 +212,6 @@ public:
int GetNextPackets(size_t numPackets, void * data);
};
-#ifdef VLPT_REMOVED
-class H5_HLCPPDLL VL_PacketTable : virtual public PacketTable
-{
-public:
- /* Constructor
- * Creates a packet table in which to store variable length packets.
- * Takes the ID of the file the packet table will be created in, the name of
- * the packet table, and the size of a memory chunk used in chunking.
- */
- VL_PacketTable(hid_t fileID, char* name, hsize_t chunkSize);
-
- /* "Open" Constructor
- * Opens an existing variable-length packet table.
- * Fails if the packet table specified is fixed-length.
- */
- VL_PacketTable(hid_t fileID, char* name);
-
- /* AppendPacket
- * Adds a single packet of any length to the packet table.
- * Takes a pointer to the location of the data in memory and the length of the data
- * in bytes.
- * Returns 0 on success, negative on failure.
- */
- int AppendPacket(void * data, size_t length);
-
- /* AppendPackets (multiple packets)
- * Adds multiple variable-length packets to the packet table. Takes the
- * number of packets to be added and a pointer to an array of
- * hvl_t structs in memory.
- * Returns 0 on success, negative on failure.
- */
- int AppendPackets(size_t numPackets, hvl_t * data);
-
- /* GetPacket (indexed)
- * Gets a single variable-length packet from the packet table. Takes
- * the index of the packet (with 0 being the first packet) and a pointer
- * to a hvl_t struct in which to store the packet's size and location.
- * Returns 0 on success, negative on failure.
- */
- int GetPacket(hsize_t index, hvl_t * data);
-
- /* GetPackets (multiple packets)
- * Gets multiple variable-length packets at once, all packets between
- * startIndex and endIndex inclusive. Takes a pointer to an array
- * of hvl_t structs in memory in which to store pointers to the packets.
- * Returns 0 on success, negative on failure.
- */
- int GetPackets(hsize_t startIndex, hsize_t endIndex, hvl_t * data);
-
- /* GetNextPacket (single packet)
- * Gets the next packet in the packet table. Takes a pointer to
- * an hvl_t struct where the packet should be stored.
- * Returns 0 on success, negative on failure. Index
- * is not advanced to the next packet on failure.
- */
- int GetNextPacket(hvl_t * data);
-
- /* GetNextPackets (multiple packets)
- * Gets the next numPackets packets in the packet table. Takes a
- * pointer to an array of hvl_t structs where pointers to the packets
- * should be stored.
- * Returns 0 on success, negative on failure. Index
- * is not advanced on failure.
- */
- int GetNextPackets(size_t numPackets, hvl_t * data);
-
- /* FreeReadbuff
- * Frees the buffers created when variable-length packets are read.
- * Takes the number of hvl_t structs to be freed and a pointer to their
- * location in memory.
- * Returns 0 on success, negative on error.
- */
- int FreeReadbuff(size_t numStructs, hvl_t * buffer);
-};
-#endif /* VLPT_REMOVED */
+/* Removed "#ifdef VLPT_REMOVED" block. 03/08/2016, -BMR */
#endif /* H5PTWRAP_H */
diff --git a/hl/c++/src/Makefile.am b/hl/c++/src/Makefile.am
index b268948..c78f5fa 100644
--- a/hl/c++/src/Makefile.am
+++ b/hl/c++/src/Makefile.am
@@ -28,7 +28,7 @@ AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/hl/src
lib_LTLIBRARIES=libhdf5_hl_cpp.la
# Add libtool numbers to the HDF5 HL C++ library (from config/lt_vers.am)
-libhdf5_hl_cpp_la_LDFLAGS= -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
+libhdf5_hl_cpp_la_LDFLAGS= -version-info $(LT_HL_CXX_VERS_INTERFACE):$(LT_HL_CXX_VERS_REVISION):$(LT_HL_CXX_VERS_AGE) $(AM_LDFLAGS)
# Source files for the library
# At the moment, only the H5PT Packet Table has a C++ API.
diff --git a/hl/c++/test/ptableTest.cpp b/hl/c++/test/ptableTest.cpp
index 929058d..ff99285 100644
--- a/hl/c++/test/ptableTest.cpp
+++ b/hl/c++/test/ptableTest.cpp
@@ -15,9 +15,11 @@
/* ptableTest.cpp */
+#include <iostream>
#include "ptableTest.h"
using namespace H5;
+using namespace std;
#define TEST_FILE "packettest.h5"
@@ -74,7 +76,7 @@ int main(void)
return -1;
}
-
+const char* BASICTEST_PT("/basicTest");
int BasicTest()
{
herr_t err;
@@ -82,9 +84,9 @@ int BasicTest()
hsize_t count;
int error;
- TESTING("basic funtionality")
+ TESTING("basic functionality")
- FL_PacketTable wrapper(fileID, "/basicTest", H5T_NATIVE_INT, 1);
+ FL_PacketTable wrapper(fileID, H5P_DEFAULT, BASICTEST_PT, H5T_NATIVE_INT, 1);
if(! wrapper.IsValid())
goto out;
@@ -131,6 +133,7 @@ out:
return 1;
}
+const char* CMPDTEST_PT("/compoundTest");
int TestCompoundDatatype()
{
hid_t dtypeID;
@@ -153,8 +156,8 @@ int TestCompoundDatatype()
H5Tinsert(dtypeID, "charlie", HOFFSET( compoundType, c ), H5T_NATIVE_SHORT);
H5Tinsert(dtypeID, "ebert", HOFFSET( compoundType, e ), H5T_NATIVE_INT);
- /* Create packet table. Explicitly specify no compression */
- FL_PacketTable wrapper(fileID, "/compoundTest", dtypeID, 1, -1);
+ /* Create packet table using default property list. */
+ FL_PacketTable wrapper(fileID, H5P_DEFAULT, CMPDTEST_PT, dtypeID, 1);
if(! wrapper.IsValid())
goto out;
@@ -198,6 +201,7 @@ out:
return 1;
}
+const char* GETNEXT_PT("/TestGetNext");
int TestGetNext()
{
int error;
@@ -208,7 +212,7 @@ int TestGetNext()
TESTING("GetNextPacket")
/* Create a dataset */
- FL_PacketTable wrapper(fileID, "/TestGetNext", H5T_NATIVE_INT, 500);
+ FL_PacketTable wrapper(fileID, H5P_DEFAULT, GETNEXT_PT, H5T_NATIVE_INT, 500);
if(! wrapper.IsValid())
goto out;
@@ -260,18 +264,27 @@ out:
return 1;
}
+const char* COMPRESS_PT("/compressTest");
int TestCompress()
{
-
- unsigned int flags = 0;
+ unsigned int flags = 0;
unsigned int config = 0;
size_t cd_nelemts = 0;
TESTING("compression")
#ifdef H5_HAVE_FILTER_DEFLATE
try {
+ /* Prepare property list to set compression, randomly use deflate */
+ DSetCreatPropList dscreatplist;
+ dscreatplist.setDeflate(6);
+
/* Create packet table with compression. */
- FL_PacketTable wrapper(fileID, "/compressTest", H5T_NATIVE_CHAR, 100, 8);
+ FL_PacketTable wrapper(fileID, dscreatplist.getId(), COMPRESS_PT, H5T_NATIVE_CHAR, 100);
+
+ /* Close the property list */
+ dscreatplist.close();
+
+ /* Verify that the deflate filter is set */
/* Create an HDF5 C++ file object */
H5File file;
@@ -279,11 +292,14 @@ int TestCompress()
/* Make sure that the deflate filter is set by opening the packet table
* as a dataset and getting its creation property list */
- DataSet dsetID = file.openDataSet("/compressTest");
+ DataSet dset = file.openDataSet(COMPRESS_PT);
- DSetCreatPropList dcplID = dsetID.getCreatePlist();
+ DSetCreatPropList dcpl = dset.getCreatePlist();
- dcplID.getFilterById(H5Z_FILTER_DEFLATE, flags, cd_nelemts, NULL, 0, NULL, config);
+ char filter_name[8];
+ dcpl.getFilterById(H5Z_FILTER_DEFLATE, flags, cd_nelemts, NULL, 8, filter_name, config);
+ if (HDstrncmp(filter_name, "deflate", 7) != 0)
+ H5_FAILED()
} catch (Exception e) {
H5_FAILED();
return 1;
@@ -296,6 +312,7 @@ int TestCompress()
return 0;
}
+const char* PT_TESTGETPT = "/TestGetPacket";
int TestGetPacket()
{
int record;
@@ -304,7 +321,7 @@ int TestGetPacket()
TESTING("GetPacket")
/* Create a dataset. Explicitly specify no compression */
- FL_PacketTable wrapper(fileID, "/TestGetPacket", H5T_NATIVE_INT, 1, -1);
+ FL_PacketTable wrapper(fileID, H5P_DEFAULT, PT_TESTGETPT, H5T_NATIVE_INT, 1);
if(! wrapper.IsValid())
goto out;
@@ -334,12 +351,14 @@ out:
return 1;
}
+const char* PT_TESTERROR = "/TestErrors";
+
int TestErrors()
{
TESTING("error conditions")
/* Create a dataset */
- FL_PacketTable wrapper(fileID, "/TestErrors", H5T_NATIVE_INT, 1);
+ FL_PacketTable wrapper(fileID, H5P_DEFAULT, PT_TESTERROR, H5T_NATIVE_INT, 1);
if(! wrapper.IsValid())
goto out;
@@ -443,6 +462,8 @@ out:
return 1;
}
+const char* PT_SYSTEMTST1 = "/SystemTest1";
+const char* PT_SYSTEMTST2 = "/SystemTest2";
int SystemTest()
{
TESTING("multiple datatypes")
@@ -485,8 +506,8 @@ int SystemTest()
ct2[0].g.e = 3000;
/* Create the packet table datasets. Make one of them compressed. */
- FL_PacketTable wrapper1(fileID, "/SystemTest1", dtypeID1, 1);
- FL_PacketTable wrapper2(fileID, "/SystemTest2", dtypeID2, 1, 5);
+ FL_PacketTable wrapper1(fileID, H5P_DEFAULT, PT_SYSTEMTST1, dtypeID1, 1);
+ FL_PacketTable wrapper2(fileID, H5P_DEFAULT, PT_SYSTEMTST2, dtypeID2, 1);
if(! wrapper1.IsValid())
goto out;
diff --git a/hl/fortran/src/CMakeLists.txt b/hl/fortran/src/CMakeLists.txt
index ead21be..a566314 100644
--- a/hl/fortran/src/CMakeLists.txt
+++ b/hl/fortran/src/CMakeLists.txt
@@ -91,7 +91,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
TARGET_C_PROPERTIES (${HDF5_HL_F90_C_LIBSH_TARGET} SHARED " " " ")
target_link_libraries (${HDF5_HL_F90_C_LIBSH_TARGET} ${HDF5_F90_C_LIBSH_TARGET} ${HDF5_HL_LIBSH_TARGET})
set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_HL_F90_C_LIBSH_TARGET}")
- H5_SET_LIB_OPTIONS (${HDF5_HL_F90_C_LIBSH_TARGET} ${HDF5_HL_F90_C_LIB_NAME} SHARED)
+ H5_SET_LIB_OPTIONS (${HDF5_HL_F90_C_LIBSH_TARGET} ${HDF5_HL_F90_C_LIB_NAME} SHARED ${HDF5_HL_F_PACKAGE_SOVERSION})
set_target_properties (${HDF5_HL_F90_C_LIBSH_TARGET} PROPERTIES
FOLDER libraries/hl/fortran
LINKER_LANGUAGE C
@@ -163,7 +163,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
TARGET_FORTRAN_PROPERTIES (${HDF5_HL_F90_LIBSH_TARGET} SHARED " " ${SHARED_LINK_FLAGS})
target_link_libraries (${HDF5_HL_F90_LIBSH_TARGET} ${HDF5_HL_F90_C_LIBSH_TARGET} ${HDF5_F90_LIBSH_TARGET})
set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_HL_F90_LIBSH_TARGET}")
- H5_SET_LIB_OPTIONS (${HDF5_HL_F90_LIBSH_TARGET} ${HDF5_HL_F90_LIB_NAME} SHARED)
+ H5_SET_LIB_OPTIONS (${HDF5_HL_F90_LIBSH_TARGET} ${HDF5_HL_F90_LIB_NAME} SHARED ${HDF5_HL_F_PACKAGE_SOVERSION})
set_target_properties (${HDF5_HL_F90_LIBSH_TARGET} PROPERTIES
FOLDER libraries/hl/fortran
LINKER_LANGUAGE Fortran
diff --git a/hl/fortran/src/H5HL_buildiface.F90 b/hl/fortran/src/H5HL_buildiface.F90
index 9dd879c..15897c3 100644
--- a/hl/fortran/src/H5HL_buildiface.F90
+++ b/hl/fortran/src/H5HL_buildiface.F90
@@ -60,13 +60,6 @@ PROGRAM H5HL_buildiface
H5_H5CONFIG_F_IKIND
INTEGER :: i, j, k
- INTEGER :: ji, jr, jd
-#ifdef H5_FORTRAN_HAVE_C_LONG_DOUBLE
- REAL(KIND=C_LONG_DOUBLE) :: c_longdble
-#endif
- REAL(KIND=C_DOUBLE) :: c_dble
- REAL(KIND=C_FLOAT) :: c_flt
- INTEGER :: sizeof_var
CHARACTER(LEN=2) :: chr2
! subroutine rank of array being passed in
CHARACTER(LEN=2), DIMENSION(1:8), PARAMETER :: chr_rank=(/"_0","_1","_2","_3","_4","_5","_6","_7"/)
diff --git a/hl/fortran/src/H5LTf90proto.h b/hl/fortran/src/H5LTf90proto.h
index 20d043e..77f941e 100644
--- a/hl/fortran/src/H5LTf90proto.h
+++ b/hl/fortran/src/H5LTf90proto.h
@@ -311,6 +311,38 @@ h5tbmake_table_c(size_t_f *namelen1,
HDF5_HL_F90CSTUBDLL
int_f
+h5tbread_table_c(hid_t_f *loc_id,
+ _fcd name,
+ size_t_f *namelen,
+ hsize_t_f *nfields,
+ size_t_f *dst_size,
+ size_t_f *dst_offset,
+ size_t_f *dst_sizes,
+ void *dst_buf);
+
+
+HDF5_HL_F90CSTUBDLL
+int_f
+h5tbmake_table_ptr_c(size_t_f *namelen1,
+ _fcd name1,
+ hid_t_f *loc_id,
+ size_t_f *namelen,
+ _fcd name,
+ hsize_t_f *nfields,
+ hsize_t_f *nrecords,
+ size_t_f *type_size,
+ size_t_f *field_offset,
+ hid_t_f *field_types,
+ hsize_t_f *chunk_size,
+ void *fill_data,
+ int_f *compress,
+ size_t_f *char_len_field_names, /* field_names lenghts */
+ size_t_f *max_char_size_field_names, /* char len of fields */
+ char *field_names, /* field_names */
+ void *data);
+
+HDF5_HL_F90CSTUBDLL
+int_f
h5tbwrite_field_name_c(hid_t_f *loc_id,
size_t_f *namelen,
_fcd name,
diff --git a/hl/fortran/src/H5LTff.F90 b/hl/fortran/src/H5LTff.F90
index d36d92c..18c36f0 100644
--- a/hl/fortran/src/H5LTff.F90
+++ b/hl/fortran/src/H5LTff.F90
@@ -110,7 +110,7 @@ MODULE H5LT_CONST
CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dtype ! flag indicating the datatype of the
! the buffer:
! R=Real, D=DOUBLE, I=Interger
- INTEGER(size_t) :: SizeOf_buf ! Sizeof the buf datatype
+ INTEGER(size_t), INTENT(in) :: SizeOf_buf ! Sizeof the buf data type
END FUNCTION h5ltget_attribute_c
END INTERFACE
@@ -1059,14 +1059,16 @@ CONTAINS
CHARACTER(LEN=*), INTENT(in) :: dset_name ! name of the dataset
CHARACTER(LEN=*), INTENT(in) :: attr_name ! name of the attribute
TYPE(C_PTR) :: buf ! data buffer
- CHARACTER(LEN=*), INTENT(in) :: buf_type !
+ CHARACTER(LEN=*), INTENT(in) :: buf_type ! valid data types are:
+ ! CHARACTER, INTEGER or REAL
+ ! NOTE: only the first character matters and is case insensitive
INTEGER(size_t), INTENT(in) :: size ! size of attribute array
- INTEGER :: errcode ! error code
- INTEGER(size_t) :: namelen ! name length
- INTEGER(size_t) :: attrlen ! name length
+ INTEGER(size_t), INTENT(in) :: SizeOf_buf_type ! size of buf's data type
+ INTEGER, INTENT(out) :: errcode ! error code
- CHARACTER(KIND=C_CHAR) :: buf_type_uppercase
- INTEGER(size_t) :: SizeOf_buf_type
+ INTEGER(size_t) :: namelen ! name length
+ INTEGER(size_t) :: attrlen ! name length
+ CHARACTER(KIND=C_CHAR) :: buf_type_uppercase
namelen = LEN(dset_name)
attrlen = LEN(attr_name)
@@ -1316,13 +1318,15 @@ CONTAINS
INTEGER(hid_t), INTENT(in) :: loc_id ! file or group identifier
CHARACTER(LEN=*), INTENT(in) :: dset_name ! name of the dataset
CHARACTER(LEN=*), INTENT(in) :: attr_name ! name of the attribute
- INTEGER, INTENT(out) :: errcode ! error code
- CHARACTER(LEN=*), INTENT(in) :: buf_type
- TYPE(C_PTR) :: buf! data buffer
+ TYPE(C_PTR) :: buf ! data buffer
+ CHARACTER(LEN=*), INTENT(in) :: buf_type ! valid data types are:
+ ! CHARACTER, INTEGER or REAL
+ ! NOTE: only the first character matters and is case insensitive
+ INTEGER(size_t), INTENT(in) :: SizeOf_buf_type ! size of buf's data type
+ INTEGER, INTENT(out) :: errcode ! error code
INTEGER(size_t) :: namelen ! name length
- INTEGER(size_t) :: attrlen ! name length
+ INTEGER(size_t) :: attrlen ! attr length
CHARACTER(KIND=C_CHAR) :: buf_type_uppercase
- INTEGER(size_t) :: SizeOf_buf_type
namelen = LEN(dset_name)
attrlen = LEN(attr_name)
diff --git a/hl/fortran/src/H5TBfc.c b/hl/fortran/src/H5TBfc.c
index 99a7800..2bb7c3b 100644
--- a/hl/fortran/src/H5TBfc.c
+++ b/hl/fortran/src/H5TBfc.c
@@ -37,21 +37,12 @@
*-------------------------------------------------------------------------
*/
int_f
-h5tbmake_table_c(size_t_f *namelen1,
- _fcd name1,
- hid_t_f *loc_id,
- size_t_f *namelen,
- _fcd name,
- hsize_t_f *nfields,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- size_t_f *field_offset,
- hid_t_f *field_types,
- hsize_t_f *chunk_size,
- int_f *compress,
- size_t_f *char_len_field_names, /* field_names lenghts */
- size_t_f *max_char_size_field_names, /* char len of fields */
- char *field_names) /* field_names */
+h5tbmake_table_c(size_t_f *namelen1, _fcd name1, hid_t_f *loc_id, size_t_f *namelen, _fcd name,
+ hsize_t_f *nfields, hsize_t_f *nrecords, size_t_f *type_size, size_t_f *field_offset,
+ hid_t_f *field_types, hsize_t_f *chunk_size, int_f *compress,
+ size_t_f *char_len_field_names, /* field_names lenghts */
+ size_t_f *max_char_size_field_names, /* char len of fields */
+ char *field_names) /* field_names */
{
char *c_name = NULL;
char *c_name1 = NULL;
@@ -101,7 +92,6 @@ h5tbmake_table_c(size_t_f *namelen1,
HGOTO_DONE(FAIL)
HDmemcpy(c_field_names[i], tmp_p, (size_t)char_len_field_names[i]);
c_field_names[i][char_len_field_names[i]] = '\0';
-
tmp_p = tmp_p + *max_char_size_field_names;
} /* end for */
@@ -136,6 +126,177 @@ done:
} /* end h5tbmake_table_c() */
/*-------------------------------------------------------------------------
+* Function: h5tbmake_table_ptr_c
+*
+* Purpose: Call H5TBmake_table using F2003 features
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: M. Scot Breitenfeld
+*
+* Date: Sept. 10, 2015
+*
+* Comments:
+*
+*-------------------------------------------------------------------------
+*/
+int_f
+h5tbmake_table_ptr_c(size_t_f *namelen1, _fcd name1, hid_t_f *loc_id, size_t_f *namelen,
+ _fcd name, hsize_t_f *nfields, hsize_t_f *nrecords, size_t_f *type_size,
+ size_t_f *field_offset, hid_t_f *field_types, hsize_t_f *chunk_size,
+ void *fill_data, int_f *compress,
+ size_t_f *char_len_field_names, /* field_names lenghts */
+ size_t_f *max_char_size_field_names, /* char len of fields */
+ char *field_names,
+ void *data) /* field_names */
+{
+ char *c_name = NULL;
+ char *c_name1 = NULL;
+ hsize_t num_elem;
+ hsize_t i;
+ hsize_t c_nfields = (hsize_t)*nfields;
+ size_t *c_field_offset = NULL;
+ hid_t *c_field_types = NULL;
+ char **c_field_names = NULL;
+ char *tmp = NULL, *tmp_p;
+ int_f ret_value = 0;
+
+ num_elem = (hsize_t)*nfields;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ if(NULL == (c_name = (char *)HD5f2cstring(name, (size_t)*namelen)))
+ HGOTO_DONE(FAIL)
+ if(NULL == (c_name1 = (char *)HD5f2cstring(name1, (size_t)*namelen1)))
+ HGOTO_DONE(FAIL)
+ if(NULL == (c_field_offset = (size_t *)HDmalloc(sizeof(size_t) * (size_t)c_nfields)))
+ HGOTO_DONE(FAIL)
+ if(NULL == (c_field_types = (hid_t *)HDmalloc(sizeof(hid_t) * (size_t)c_nfields)))
+ HGOTO_DONE(FAIL)
+
+ for(i = 0; i < num_elem; i++) {
+ c_field_offset[i] = (size_t)field_offset[i];
+ c_field_types[i] = field_types[i];
+ } /* end for */
+
+ /*
+ * allocate array of character pointers
+ */
+ if(NULL == (c_field_names = (char **)HDcalloc((size_t)num_elem, sizeof(char *))))
+ HGOTO_DONE(FAIL)
+
+ /* copy data to long C string */
+ if(NULL == (tmp = (char *)HD5f2cstring(field_names, (size_t)*(max_char_size_field_names)*(size_t)num_elem)))
+ HGOTO_DONE(FAIL)
+ /*
+ * move data from temorary buffer
+ */
+ tmp_p = tmp;
+ for(i = 0; i < num_elem; i++) {
+ if(NULL == (c_field_names[i] = (char *)HDmalloc((size_t)char_len_field_names[i] + 1)))
+ HGOTO_DONE(FAIL)
+ HDmemcpy(c_field_names[i], tmp_p, (size_t)char_len_field_names[i]);
+ c_field_names[i][char_len_field_names[i]] = '\0';
+ tmp_p = tmp_p + *max_char_size_field_names;
+ } /* end for */
+
+ /*
+ * call H5TBmake_table function.
+ */
+ if(H5TBmake_table(c_name1, (hid_t)*loc_id, c_name, c_nfields, (hsize_t)*nrecords,
+ (size_t)*type_size, (const char **)c_field_names, c_field_offset, c_field_types,
+ (hsize_t)*chunk_size, fill_data, *compress, data) < 0)
+ HGOTO_DONE(FAIL)
+
+done:
+ if(c_name)
+ HDfree(c_name);
+ if(c_name1)
+ HDfree(c_name1);
+ if(c_field_names) {
+ for(i = 0; i < num_elem; i++) {
+ if(c_field_names[i])
+ HDfree(c_field_names[i]);
+ } /* end for */
+ HDfree(c_field_names);
+ } /* end if */
+ if(tmp)
+ HDfree(tmp);
+ if(c_field_offset)
+ HDfree(c_field_offset);
+ if(c_field_types)
+ HDfree(c_field_types);
+
+ return ret_value;
+} /* end h5tbmake_table_c() */
+
+
+/*-------------------------------------------------------------------------
+* Function: h5tbread_table_c
+*
+* Purpose: Call H5TBread_table using F2003 features
+*
+* Return: Success: 0, Failure: -1
+*
+* Programmer: M. Scot Breitenfeld
+*
+* Date: Sept. 14, 2015
+*
+* Comments:
+*
+*-------------------------------------------------------------------------
+*/
+int_f
+h5tbread_table_c(hid_t_f *loc_id, _fcd name, size_t_f *namelen, hsize_t_f *nfields,
+ size_t_f *dst_size, size_t_f *dst_offset, size_t_f *dst_sizes, void *dst_buf)
+{
+ char *c_name = NULL;
+ size_t *c_dst_offset = NULL;
+ size_t *c_dst_sizes = NULL;
+ hsize_t c_nfields = (hsize_t)*nfields;
+ int_f ret_value = 0;
+ hsize_t i;
+
+ /*
+ * convert FORTRAN name to C name
+ */
+ if(NULL == (c_name = (char *)HD5f2cstring(name, (size_t)*namelen)))
+ HGOTO_DONE(FAIL)
+
+ if(NULL == (c_dst_offset = (size_t *)HDmalloc(sizeof(size_t) * (size_t)c_nfields)))
+ HGOTO_DONE(FAIL)
+ if(NULL == (c_dst_sizes = (size_t *)HDmalloc(sizeof(size_t) * (size_t)c_nfields)))
+ HGOTO_DONE(FAIL)
+
+ for(i = 0; i < c_nfields; i++) {
+ c_dst_offset[i] = (size_t)dst_offset[i];
+ c_dst_sizes[i] = (size_t)dst_sizes[i];
+ } /* end for */
+
+ /*
+ * call H5TBread_table function.
+ */
+ if(H5TBread_table( (hid_t)*loc_id, c_name, (size_t)*dst_size, c_dst_offset,
+ c_dst_sizes, dst_buf) < 0)
+ HGOTO_DONE(FAIL)
+
+done:
+ if(c_name)
+ HDfree(c_name);
+
+ if(c_dst_offset)
+ HDfree(c_dst_offset);
+ if(c_dst_sizes)
+ HDfree(c_dst_sizes);
+
+ return ret_value;
+} /* end h5tbmake_table_c() */
+
+
+
+
+/*-------------------------------------------------------------------------
* Function: h5tbwrite_field_name_c
*
* Purpose: Call H5TBwrite_fields_name
@@ -151,15 +312,8 @@ done:
*-------------------------------------------------------------------------
*/
int_f
-h5tbwrite_field_name_c(hid_t_f *loc_id,
- size_t_f *namelen,
- _fcd name,
- size_t_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+h5tbwrite_field_name_c(hid_t_f *loc_id, size_t_f *namelen, _fcd name, size_t_f *namelen1, _fcd field_name,
+ hsize_t_f *start, hsize_t_f *nrecords, size_t_f *type_size, void *buf)
{
char *c_name = NULL;
char *c_name1 = NULL;
@@ -207,15 +361,8 @@ done:
*-------------------------------------------------------------------------
*/
int_f
-h5tbread_field_name_c(hid_t_f *loc_id,
- size_t_f *namelen,
- _fcd name,
- size_t_f *namelen1,
- _fcd field_name,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+h5tbread_field_name_c(hid_t_f *loc_id, size_t_f *namelen, _fcd name, size_t_f *namelen1, _fcd field_name,
+ hsize_t_f *start, hsize_t_f *nrecords, size_t_f *type_size, void *buf)
{
char *c_name = NULL;
char *c_name1 = NULL;
@@ -262,14 +409,8 @@ done:
*-------------------------------------------------------------------------
*/
int_f
-h5tbwrite_field_index_c(hid_t_f *loc_id,
- size_t_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+h5tbwrite_field_index_c(hid_t_f *loc_id, size_t_f *namelen, _fcd name, int_f *field_index, hsize_t_f *start,
+ hsize_t_f *nrecords, size_t_f *type_size, void *buf)
{
char *c_name = NULL;
size_t c_type_size = *type_size;
@@ -313,14 +454,8 @@ done:
*-------------------------------------------------------------------------
*/
int_f
-h5tbread_field_index_c(hid_t_f *loc_id,
- size_t_f *namelen,
- _fcd name,
- int_f *field_index,
- hsize_t_f *start,
- hsize_t_f *nrecords,
- size_t_f *type_size,
- void *buf)
+h5tbread_field_index_c(hid_t_f *loc_id, size_t_f *namelen, _fcd name, int_f *field_index, hsize_t_f *start,
+ hsize_t_f *nrecords, size_t_f *type_size, void *buf)
{
char *c_name = NULL;
size_t c_type_size = *type_size;
@@ -363,14 +498,8 @@ done:
*-------------------------------------------------------------------------
*/
int_f
-h5tbinsert_field_c(hid_t_f *loc_id,
- size_t_f *namelen,
- _fcd name,
- size_t_f *namelen1,
- _fcd field_name,
- hid_t_f *field_type,
- int_f *position,
- void *buf)
+h5tbinsert_field_c(hid_t_f *loc_id, size_t_f *namelen, _fcd name, size_t_f *namelen1,
+ _fcd field_name, hid_t_f *field_type, int_f *position, void *buf)
{
char *c_name = NULL;
char *c_name1 = NULL;
@@ -416,11 +545,8 @@ done:
*-------------------------------------------------------------------------
*/
int_f
-h5tbdelete_field_c(hid_t_f *loc_id,
- size_t_f *namelen,
- _fcd name,
- size_t_f *namelen1,
- _fcd field_name)
+h5tbdelete_field_c(hid_t_f *loc_id, size_t_f *namelen, _fcd name,
+ size_t_f *namelen1, _fcd field_name)
{
char *c_name = NULL;
char *c_name1 = NULL;
@@ -465,11 +591,8 @@ done:
*-------------------------------------------------------------------------
*/
int_f
-h5tbget_table_info_c(hid_t_f *loc_id,
- size_t_f *namelen,
- _fcd name,
- hsize_t_f *nfields,
- hsize_t_f *nrecords)
+h5tbget_table_info_c(hid_t_f *loc_id, size_t_f *namelen,
+ _fcd name, hsize_t_f *nfields, hsize_t_f *nrecords)
{
char *c_name = NULL;
hsize_t c_nfields;
@@ -515,17 +638,12 @@ done:
*-------------------------------------------------------------------------
*/
int_f
-h5tbget_field_info_c(hid_t_f *loc_id,
- size_t_f *namelen,
- _fcd name,
- hsize_t_f *nfields,
- size_t_f *field_sizes,
- size_t_f *field_offsets,
- size_t_f *type_size,
- size_t_f *namelen2, /* field_names lenghts */
- size_t_f *lenmax, /* character len max */
- _fcd field_names, /* field_names */
- size_t_f *maxlen_out)
+h5tbget_field_info_c(hid_t_f *loc_id, size_t_f *namelen, _fcd name, hsize_t_f *nfields,
+ size_t_f *field_sizes, size_t_f *field_offsets, size_t_f *type_size,
+ size_t_f *namelen2, /* field_names lenghts */
+ size_t_f *lenmax, /* character len max */
+ _fcd field_names, /* field_names */
+ size_t_f *maxlen_out)
{
char *c_name = NULL;
diff --git a/hl/fortran/src/H5TBff.F90 b/hl/fortran/src/H5TBff.F90
index 448d607..266f74a 100644
--- a/hl/fortran/src/H5TBff.F90
+++ b/hl/fortran/src/H5TBff.F90
@@ -63,6 +63,11 @@ MODULE h5tb_CONST
MODULE PROCEDURE h5tbinsert_field_f_string
END INTERFACE
+ INTERFACE h5tbmake_table_f
+ MODULE PROCEDURE h5tbmake_table_f90
+ MODULE PROCEDURE h5tbmake_table_ptr_f
+ END INTERFACE
+
INTERFACE
INTEGER FUNCTION h5tbwrite_field_name_c(loc_id,namelen,dset_name,namelen1,field_name,&
start,nrecords,type_size,buf) &
@@ -163,7 +168,7 @@ MODULE h5tb_CONST
CONTAINS
!-------------------------------------------------------------------------
-! Function: h5tbmake_table_f
+! Function: h5tbmake_table_f90
!
! Purpose: Make a table
!
@@ -179,7 +184,7 @@ CONTAINS
!
!-------------------------------------------------------------------------
- SUBROUTINE h5tbmake_table_f(table_title,&
+ SUBROUTINE h5tbmake_table_f90(table_title,&
loc_id,&
dset_name,&
nfields,&
@@ -259,23 +264,162 @@ CONTAINS
max_char_size_field_names = LEN(field_names(1))
- errcode = h5tbmake_table_c(namelen1,&
- table_title,&
- loc_id,&
- namelen,&
- dset_name,&
- nfields,&
- nrecords,&
- type_size,&
- field_offset,&
- field_types,&
- chunk_size,&
- compress,&
- char_len_field_names, &
- max_char_size_field_names, &
- field_names)
-
- END SUBROUTINE h5tbmake_table_f
+ errcode = h5tbmake_table_c(namelen1, table_title, loc_id, namelen, dset_name, nfields, nrecords,&
+ type_size, field_offset, field_types, chunk_size, compress, char_len_field_names, &
+ max_char_size_field_names, field_names)
+
+ END SUBROUTINE h5tbmake_table_f90
+
+ SUBROUTINE h5tbmake_table_ptr_f(table_title,&
+ loc_id,&
+ dset_name,&
+ nfields,&
+ nrecords,&
+ type_size,&
+ field_names,&
+ field_offset,&
+ field_types,&
+ chunk_size,&
+ fill_data,&
+ compress,&
+ data,&
+ errcode )
+
+ USE ISO_C_BINDING
+ IMPLICIT NONE
+ CHARACTER(LEN=*), INTENT(in) :: table_title ! name of the dataset
+ INTEGER(hid_t), INTENT(in) :: loc_id ! file or group identifier
+ CHARACTER(LEN=*), INTENT(in) :: dset_name ! name of the dataset
+ INTEGER(hsize_t), INTENT(in) :: nfields ! fields
+ INTEGER(hsize_t), INTENT(in) :: nrecords ! records
+ INTEGER(size_t), INTENT(in) :: type_size ! type size
+ CHARACTER(LEN=*), DIMENSION(1:nfields), INTENT(in) :: field_names ! field names
+ INTEGER(size_t), DIMENSION(1:nfields), INTENT(in) :: field_offset ! field offset
+ INTEGER(hid_t), DIMENSION(1:nfields), INTENT(in) :: field_types ! field types
+ INTEGER(hsize_t), INTENT(in) :: chunk_size ! chunk size
+ TYPE(C_PTR), INTENT(in) :: fill_data ! Fill values data
+ INTEGER, INTENT(in) :: compress ! compress
+ TYPE(C_PTR), INTENT(in) :: data ! Buffer with data to be written to the table
+ INTEGER(size_t) :: namelen ! name length
+ INTEGER(size_t) :: namelen1 ! name length
+ INTEGER :: errcode ! error code
+ INTEGER(size_t), DIMENSION(1:nfields) :: char_len_field_names ! field name lengths
+ INTEGER(size_t) :: max_char_size_field_names ! character len of field names
+ INTEGER(hsize_t) :: i ! general purpose integer
+
+ INTERFACE
+ INTEGER FUNCTION h5tbmake_table_ptr_c(namelen1,&
+ table_title,&
+ loc_id,&
+ namelen,&
+ dset_name,&
+ nfields,&
+ nrecords,&
+ type_size,&
+ field_offset,&
+ field_types,&
+ chunk_size,&
+ fill_data,&
+ compress,&
+ char_len_field_names,&
+ max_char_size_field_names,&
+ field_names,&
+ data) &
+ BIND(C,NAME='h5tbmake_table_ptr_c')
+ IMPORT :: C_CHAR, C_PTR
+ IMPORT :: HID_T, SIZE_T, HSIZE_T
+ IMPLICIT NONE
+ CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: table_title ! name of the dataset
+ INTEGER(hid_t), INTENT(in) :: loc_id ! file or group identifier
+ CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name ! name of the dataset
+ INTEGER(hsize_t), INTENT(in) :: nfields ! fields
+ INTEGER(hsize_t), INTENT(in) :: nrecords ! records
+ INTEGER(size_t), INTENT(in) :: type_size ! type size
+ CHARACTER(KIND=C_CHAR), DIMENSION(nfields), INTENT(in) :: field_names ! field names
+ INTEGER(size_t), DIMENSION(nfields), INTENT(in) :: field_offset ! field offset
+ INTEGER(hid_t), DIMENSION(nfields), INTENT(in) :: field_types ! field types
+ INTEGER(hsize_t), INTENT(in) :: chunk_size ! chunk size
+ TYPE(C_PTR), INTENT(in), VALUE :: fill_data ! Fill values data
+ INTEGER, INTENT(in) :: compress ! compress
+ INTEGER(size_t) :: namelen ! name length
+ INTEGER(size_t) :: namelen1 ! name length
+ INTEGER(size_t), DIMENSION(nfields) :: char_len_field_names ! field name's lengths
+ INTEGER(size_t) :: max_char_size_field_names ! character len of field names
+ TYPE(C_PTR), INTENT(in), VALUE :: data
+ END FUNCTION h5tbmake_table_ptr_c
+ END INTERFACE
+
+ namelen = LEN(dset_name)
+ namelen1 = LEN(table_title)
+
+ ! Find the size of each character string in the array
+ DO i = 1, nfields
+ char_len_field_names(i) = LEN_TRIM(field_names(i))
+ END DO
+
+ max_char_size_field_names = LEN(field_names(1))
+
+ errcode = h5tbmake_table_ptr_c(namelen1, table_title, loc_id, namelen, dset_name, nfields, nrecords,&
+ type_size, field_offset, field_types, chunk_size, fill_data, compress, char_len_field_names, &
+ max_char_size_field_names, field_names, data)
+
+ END SUBROUTINE h5tbmake_table_ptr_f
+
+ SUBROUTINE h5tbread_table_f(loc_id, table_name, nfields, dst_size, dst_offset, &
+ dst_sizes, dst_buf, errcode)
+
+ USE ISO_C_BINDING
+ IMPLICIT NONE
+ INTEGER(hid_t), INTENT(in) :: loc_id ! An array containing the sizes of the fields
+ CHARACTER(LEN=*), INTENT(in) :: table_name ! The name of the dataset to read
+ INTEGER(hsize_t), INTENT(in) :: nfields ! number of fields
+ INTEGER(size_t), INTENT(in) :: dst_size ! The size of the structure type
+ INTEGER(size_t), DIMENSION(1:nfields), INTENT(in) :: dst_offset ! An array containing the offsets of the fields
+ INTEGER(size_t), DIMENSION(1:nfields), INTENT(in) :: dst_sizes ! An array containing the sizes of the fields
+ TYPE(C_PTR), INTENT(OUT) :: dst_buf ! Buffer with data
+ INTEGER :: errcode ! error code
+
+ INTEGER(size_t) :: namelen ! name length
+ INTEGER(hsize_t) :: i ! general purpose integer
+
+ INTERFACE
+ INTEGER FUNCTION h5tbread_table_c(loc_id,&
+ table_name,&
+ namelen,&
+ nfields,&
+ dst_size,&
+ dst_offset, &
+ dst_sizes, &
+ dst_buf) &
+ BIND(C,NAME='h5tbread_table_c')
+ IMPORT :: C_PTR
+ IMPORT :: HID_T, SIZE_T, HSIZE_T
+ IMPLICIT NONE
+ INTEGER(hid_t), INTENT(in) :: loc_id ! file or group identifier
+ CHARACTER(LEN=1), INTENT(in) :: table_name ! name of the dataset
+ INTEGER(hsize_t), INTENT(in) :: nfields
+ INTEGER(size_t), INTENT(in) :: dst_size ! type size
+ INTEGER(size_t), DIMENSION(1:nfields), INTENT(in) :: dst_offset ! An array containing the sizes of the fields
+ INTEGER(size_t), DIMENSION(1:nfields), INTENT(in) :: dst_sizes ! An array containing the sizes of the fields
+ INTEGER(size_t) :: namelen ! name length
+ TYPE(C_PTR), VALUE :: dst_buf
+
+ END FUNCTION h5tbread_table_c
+ END INTERFACE
+
+ namelen = LEN(table_name)
+
+ errcode = h5tbread_table_c(loc_id,&
+ table_name,&
+ namelen, &
+ nfields, &
+ dst_size,&
+ dst_offset, &
+ dst_sizes, &
+ dst_buf)
+
+
+ END SUBROUTINE h5tbread_table_f
!-------------------------------------------------------------------------
! Function: h5tbwrite_field_name_f_int
diff --git a/hl/fortran/src/Makefile.am b/hl/fortran/src/Makefile.am
index d190ed1..571ca45 100644
--- a/hl/fortran/src/Makefile.am
+++ b/hl/fortran/src/Makefile.am
@@ -30,7 +30,7 @@ AM_FCFLAGS+=-I$(top_builddir)/fortran/src $(F9XMODFLAG)$(top_builddir)/fortran/s
lib_LTLIBRARIES=libhdf5hl_fortran.la
# Add libtool numbers to the HDF5 HL Fortran library (from config/lt_vers.am)
-libhdf5hl_fortran_la_LDFLAGS= -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
+libhdf5hl_fortran_la_LDFLAGS= -version-info $(LT_HL_F_VERS_INTERFACE):$(LT_HL_F_VERS_REVISION):$(LT_HL_F_VERS_AGE) $(AM_LDFLAGS)
# Some Fortran compilers can't build shared libraries, so sometimes we
# want to build a shared C library and a static Fortran library. If so,
diff --git a/hl/fortran/src/hdf5_hl_fortrandll.def.in b/hl/fortran/src/hdf5_hl_fortrandll.def.in
index 9a1231a..b48cae3 100644
--- a/hl/fortran/src/hdf5_hl_fortrandll.def.in
+++ b/hl/fortran/src/hdf5_hl_fortrandll.def.in
@@ -72,7 +72,9 @@ H5LT_CONST_mp_H5LTGET_ATTRIBUTE_NDIMS_F
H5LT_CONST_mp_H5LTGET_ATTRIBUTE_INFO_F
H5LT_CONST_mp_H5LTPATH_VALID_F
; H5TB
-H5TB_CONST_mp_H5TBMAKE_TABLE_F
+H5TB_CONST_mp_H5TBREAD_TABLE_F
+H5TB_CONST_mp_H5TBMAKE_TABLE_F90
+H5TB_CONST_mp_H5TBMAKE_TABLE_PTR_F
H5TB_CONST_mp_H5TBWRITE_FIELD_NAME_F_INT
H5TB_CONST_mp_H5TBWRITE_FIELD_NAME_F_STRING
H5TB_CONST_mp_H5TBREAD_FIELD_NAME_F_INT
diff --git a/hl/fortran/test/Makefile.am b/hl/fortran/test/Makefile.am
index ca49817..32d367c 100644
--- a/hl/fortran/test/Makefile.am
+++ b/hl/fortran/test/Makefile.am
@@ -45,7 +45,7 @@ tstimage_SOURCES=tstimage.F90
tsttable_SOURCES=tsttable.F90
# Temporary files.
-CHECK_CLEANFILES+=dsetf[1-5].h5 f1img.h5 f1tab.h5 tstds.h5
+CHECK_CLEANFILES+=dsetf[1-5].h5 f1img.h5 f[1-2]tab.h5 tstds.h5
# Mark this directory as part of the Fortran API (this affects output
# from tests in conclude.am)
diff --git a/hl/fortran/test/tstlite.F90 b/hl/fortran/test/tstlite.F90
index 0ba7815..3937c3c 100644
--- a/hl/fortran/test/tstlite.F90
+++ b/hl/fortran/test/tstlite.F90
@@ -418,7 +418,6 @@ SUBROUTINE test_dataset3D()
#if H5_HAVE_Fortran_INTEGER_SIZEOF_16!=0
INTEGER, PARAMETER :: int_kind_32 = SELECTED_INT_KIND(36) !should map to INTEGER*16 on most modern processors
INTEGER(int_kind_32), DIMENSION(DIM1,DIM2,DIM3), TARGET :: dset_data_i32, data_out_i32
- INTEGER(HID_T) :: dset_id32 ! Dataset identifier
CHARACTER(LEN=7), PARAMETER :: dsetname16a = "dset16a" ! Dataset name
CHARACTER(LEN=7), PARAMETER :: dsetname16b = "dset16b" ! Dataset name
CHARACTER(LEN=7), PARAMETER :: dsetname16c = "dset16c" ! Dataset name
@@ -760,7 +759,6 @@ SUBROUTINE test_datasetND(rank)
INTEGER :: type_class
INTEGER(SIZE_T) :: type_size
CHARACTER(LEN=1) :: ichr1
- CHARACTER(LEN=3) :: ichr3
TYPE(C_PTR) :: f_ptr
INTEGER(HID_T) :: type_id
@@ -1302,11 +1300,14 @@ SUBROUTINE test_datasets()
INTEGER(HID_T) :: file_id ! File identifier
INTEGER :: errcode ! Error flag
INTEGER, PARAMETER :: DIM1 = 10 ! Dimension of array
+ INTEGER, PARAMETER :: LEN0 = 3
+ INTEGER, PARAMETER :: LEN1 = 12
CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1" ! Dataset name
CHARACTER(LEN=5), PARAMETER :: dsetname2 = "dset2" ! Dataset name
CHARACTER(LEN=5), PARAMETER :: dsetname3 = "dset3" ! Dataset name
CHARACTER(LEN=5), PARAMETER :: dsetname4 = "dset4" ! Dataset name
CHARACTER(LEN=5), PARAMETER :: dsetname5 = "dset5" ! Dataset name
+ CHARACTER(LEN=5), PARAMETER :: dsetname6 = "dset6" ! Dataset name
INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/DIM1/) ! Dataset dimensions
INTEGER(HSIZE_T), DIMENSION(1) :: dimsr ! Dataset dimensions
INTEGER :: rank = 1 ! Dataset rank
@@ -1319,7 +1320,7 @@ SUBROUTINE test_datasets()
REAL, DIMENSION(DIM1) , TARGET :: bufr3 ! Data buffer
DOUBLE PRECISION, DIMENSION(DIM1), TARGET :: buf4 ! Data buffer
DOUBLE PRECISION, DIMENSION(DIM1), TARGET :: bufr4 ! Data buffer
- INTEGER :: i, n ! general purpose integer
+ INTEGER :: i, j, n ! general purpose integer
INTEGER :: has ! general purpose integer
INTEGER :: type_class
INTEGER(SIZE_T) :: type_size
@@ -1328,6 +1329,17 @@ SUBROUTINE test_datasets()
CHARACTER(LEN=8) :: chr_lg
TYPE(C_PTR) :: f_ptr
+ ! vl data
+ TYPE vl
+ INTEGER, DIMENSION(:), POINTER :: DATA
+ END TYPE vl
+ TYPE(vl), DIMENSION(:), ALLOCATABLE, TARGET :: ptr
+ TYPE(hvl_t), DIMENSION(1:2), TARGET :: wdata ! Array of vlen structures
+ TYPE(hvl_t), DIMENSION(1:2), TARGET :: rdata ! Pointer to vlen structures
+ INTEGER(hsize_t), DIMENSION(1:1) :: dims_vl = (/2/)
+ INTEGER, DIMENSION(:), POINTER :: ptr_r
+ INTEGER(HID_T) :: type_id
+
!
! Initialize FORTRAN predefined datatypes.
!
@@ -1349,6 +1361,28 @@ SUBROUTINE test_datasets()
n = n + 1
END DO
+ !
+ ! Initialize variable-length data. wdata(1) is a countdown of
+ ! length LEN0, wdata(2) is a Fibonacci sequence of length LEN1.
+ !
+ wdata(1)%len = LEN0
+ wdata(2)%len = LEN1
+
+ ALLOCATE( ptr(1:2) )
+ ALLOCATE( ptr(1)%data(1:wdata(1)%len) )
+ ALLOCATE( ptr(2)%data(1:wdata(2)%len) )
+
+ DO i=1, wdata(1)%len
+ ptr(1)%data(i) = wdata(1)%len - i + 1 ! 3 2 1
+ ENDDO
+ wdata(1)%p = C_LOC(ptr(1)%data(1))
+
+ ptr(2)%data(1:2) = 1
+ DO i = 3, wdata(2)%len
+ ptr(2)%data(i) = ptr(2)%data(i-1) + ptr(2)%data(i-2) ! (1 1 2 3 5 8 etc.)
+ ENDDO
+ wdata(2)%p = C_LOC(ptr(2)%data(1))
+
!-------------------------------------------------------------------------
! int
!-------------------------------------------------------------------------
@@ -1432,7 +1466,6 @@ SUBROUTINE test_datasets()
!CALL h5ltread_dataset_f(file_id, dsetname4, H5T_NATIVE_DOUBLE, f_ptr, errcode)
CALL h5ltread_dataset_double_f(file_id, dsetname4, bufr4, dims, errcode)
-
!
! compare read and write buffers.
!
@@ -1475,6 +1508,38 @@ SUBROUTINE test_datasets()
CALL passed()
+
+ !-------------------------------------------------------------------------
+ ! variable-length dataset
+ !-------------------------------------------------------------------------
+ CALL test_begin(' Make/Read datasets (vl) ')
+ !
+ ! Create variable-length datatype.
+ !
+ CALL H5Tvlen_create_f(H5T_NATIVE_INTEGER, type_id, errcode)
+
+ f_ptr = C_LOC(wdata(1))
+ CALL h5ltmake_dataset_f(file_id, dsetname6, 1, dims_vl, type_id, f_ptr, errcode)
+
+ ! Read the variable-length datatype
+ f_ptr = C_LOC(rdata(1))
+ CALL h5ltread_dataset_f(file_id, dsetname6, type_id, f_ptr, errcode)
+
+ DO i = 1, INT(dims_vl(1))
+ CALL c_f_pointer(rdata(i)%p, ptr_r, [rdata(i)%len] )
+ DO j = 1, rdata(i)%len
+ IF(ptr_r(j).NE.ptr(i)%data(j))THEN
+ PRINT *, 'Writing/Reading variable-length dataset failed'
+ STOP
+ ENDIF
+ ENDDO
+ ENDDO
+
+ CALL H5Tclose_f(type_id, errcode)
+ DEALLOCATE(ptr)
+
+ CALL passed()
+
CALL test_begin(' Test h5ltpath_valid_f ')
!
! test function h5ltpath_valid_f
@@ -1530,7 +1595,6 @@ SUBROUTINE test_datasets()
CALL passed()
-
CALL test_begin(' Get dataset dimensions/info ')
!-------------------------------------------------------------------------
@@ -1575,6 +1639,8 @@ SUBROUTINE test_datasets()
STOP
ENDIF
+ CALL passed()
+
!
! Close the file.
!
@@ -1584,14 +1650,12 @@ SUBROUTINE test_datasets()
!
CALL h5close_f(errcode)
- CALL passed()
!
! end function.
!
END SUBROUTINE test_datasets
-
!-------------------------------------------------------------------------
! test_attributes
!-------------------------------------------------------------------------
diff --git a/hl/fortran/test/tsttable.F90 b/hl/fortran/test/tsttable.F90
index 74029a5..5c55a66 100644
--- a/hl/fortran/test/tsttable.F90
+++ b/hl/fortran/test/tsttable.F90
@@ -20,7 +20,24 @@
PROGRAM table_test
+ USE H5TB ! module of H5TB
+ USE HDF5 ! module of HDF5 library
+
+ IMPLICIT NONE
+ INTEGER :: errcode = 0
+
+ !
+ ! Initialize FORTRAN predefined datatypes.
+ !
+ CALL h5open_f(errcode)
+
CALL test_table1()
+ CALL test_table2()
+
+ !
+ ! Close FORTRAN predefined datatypes.
+ !
+ CALL h5close_f(errcode)
END PROGRAM table_test
@@ -35,13 +52,13 @@ SUBROUTINE test_table1()
USE HDF5 ! module of HDF5 library
IMPLICIT NONE
-
+
CHARACTER(len=8), PARAMETER :: filename = "f1tab.h5" ! File name
CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1" ! Dataset name
INTEGER(HID_T) :: file_id ! File identifier
INTEGER(HSIZE_T), PARAMETER :: nfields = 4 ! nfields
INTEGER(HSIZE_T), PARAMETER :: nrecords = 5 ! nrecords
- CHARACTER(LEN=10),DIMENSION(1:nfields) :: field_names ! field names
+ CHARACTER(LEN=9),DIMENSION(1:nfields) :: field_names ! field names
INTEGER(SIZE_T), DIMENSION(1:nfields) :: field_offset ! field offset
INTEGER(HID_T), DIMENSION(1:nfields) :: field_types ! field types
INTEGER(HSIZE_T), PARAMETER :: chunk_size = 5 ! chunk size
@@ -74,6 +91,7 @@ SUBROUTINE test_table1()
INTEGER :: Cs_sizeof_double = H5_SIZEOF_DOUBLE ! C's sizeof double
INTEGER :: SIZEOF_X
LOGICAL :: Exclude_double
+ CHARACTER(LEN=62) :: test_txt
! Find size of DOUBLE PRECISION
#ifdef H5_FORTRAN_HAVE_STORAGE_SIZE
@@ -100,11 +118,6 @@ SUBROUTINE test_table1()
END DO
!
- ! Initialize FORTRAN predefined datatypes.
- !
- CALL h5open_f(errcode)
-
- !
! Create a new file using default properties.
!
CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
@@ -164,7 +177,8 @@ SUBROUTINE test_table1()
! make table
!-------------------------------------------------------------------------
- CALL test_begin(' Make table ')
+ test_txt = " Make table"
+ CALL test_begin(test_txt)
CALL h5tbmake_table_f(dsetname1,&
file_id,&
@@ -186,7 +200,8 @@ SUBROUTINE test_table1()
! write field
!-------------------------------------------------------------------------
- CALL test_begin(' Read/Write field by name ')
+ test_txt = "Read/Write field by name"
+ CALL test_begin(test_txt)
CALL h5tbwrite_field_name_f(file_id,dsetname1,field_names(1),start,nrecords,type_sizec,&
bufs,errcode)
@@ -309,7 +324,8 @@ SUBROUTINE test_table1()
! write field
!-------------------------------------------------------------------------
- CALL test_begin(' Read/Write field by index ')
+ test_txt = "Read/Write field by index"
+ CALL test_begin(test_txt)
CALL h5tbwrite_field_index_f(file_id,dsetname1,1,start,nrecords,type_sizec,&
bufs,errcode)
@@ -413,8 +429,8 @@ SUBROUTINE test_table1()
! Insert field
! we insert a field callsed "field5" with the same type and buffer as field 4 (Real)
!-------------------------------------------------------------------------
-
- CALL test_begin(' Insert field ')
+ test_txt = "Insert field"
+ CALL test_begin(test_txt)
CALL h5tbinsert_field_f(file_id,dsetname1,"field5",field_types(4),4,bufr,errcode)
CALL h5tbread_field_index_f(file_id,dsetname1,5,start,nrecords,type_sizer,&
@@ -437,7 +453,8 @@ SUBROUTINE test_table1()
! Delete field
!-------------------------------------------------------------------------
- CALL test_begin(' Delete field ')
+ test_txt = "Delete field"
+ CALL test_begin(test_txt)
CALL h5tbdelete_field_f(file_id,dsetname1,"field4abc",errcode)
@@ -448,7 +465,8 @@ SUBROUTINE test_table1()
! Gets the number of records and fields
!-------------------------------------------------------------------------
- CALL test_begin(' Get table info ')
+ test_txt = "Get table info"
+ CALL test_begin(test_txt)
CALL h5tbget_table_info_f(file_id,dsetname1,nfieldsr,nrecordsr,errcode )
@@ -463,7 +481,8 @@ SUBROUTINE test_table1()
! Get information about fields
!-------------------------------------------------------------------------
- CALL test_begin(' Get fields info ')
+ test_txt = "Get fields info"
+ CALL test_begin(test_txt)
CALL h5tbget_field_info_f(file_id, dsetname1, nfields, field_namesr, field_sizesr,&
field_offsetr, type_sizeout, errcode, maxlen )
@@ -502,16 +521,196 @@ SUBROUTINE test_table1()
!
CALL h5fclose_f(file_id, errcode)
- !
- ! Close FORTRAN predefined datatypes.
- !
- CALL h5close_f(errcode)
!
! end function.
!
END SUBROUTINE test_table1
+!-------------------------------------------------------------------------
+! test_table2
+! Tests F2003 versions of H5TBread_table_f and H5TBmake_table_f
+!-------------------------------------------------------------------------
+
+SUBROUTINE test_table2()
+
+ USE H5TB ! module of H5TB
+ USE HDF5 ! module of HDF5 library
+
+ IMPLICIT NONE
+
+ INTEGER, PARAMETER :: int_kind_8 = SELECTED_INT_KIND(9) !should map to INTEGER*4 on most modern processors
+ INTEGER, PARAMETER :: int_kind_16 = SELECTED_INT_KIND(9) ! (18) !should map to INTEGER*8 on most modern processors
+ INTEGER, PARAMETER :: sp = SELECTED_REAL_KIND(5) ! This should map to REAL*4 on most modern processors
+ INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(10) ! This should map to REAL*8 on most modern processors
+
+ TYPE particle_t
+ CHARACTER(LEN=11) :: name
+ INTEGER(KIND=int_kind_8) :: lati
+ INTEGER(KIND=int_kind_16) :: long
+ REAL(KIND=sp) :: pressure
+ REAL(KIND=dp) :: temperature
+ END TYPE particle_t
+
+ INTEGER(HSIZE_T), PARAMETER :: nfields = 5 ! nfields
+ INTEGER(HSIZE_T), PARAMETER :: nrecords = 8 ! nrecords
+
+ CHARACTER(len=8), PARAMETER :: filename = "f2tab.h5" ! File name
+ CHARACTER(LEN=5), PARAMETER :: table_name = "tabel" ! table name
+ CHARACTER(LEN=10), PARAMETER :: table_name_fill = "tabel_fill" ! table name
+
+ ! Define field information
+ CHARACTER(LEN=11), DIMENSION(1:NFIELDS), PARAMETER :: field_names = (/&
+ "Name ", &
+ "Latitude ", &
+ "Longitude ", &
+ "Pressure ", &
+ "Temperature" &
+ /)
+
+ INTEGER(hid_t), DIMENSION(1:nfields) :: field_type
+ INTEGER(hid_t) :: string_type
+ INTEGER(hid_t) :: file_id
+ INTEGER(hsize_t), PARAMETER :: chunk_size = 10
+ TYPE(particle_t), DIMENSION(1:nrecords), TARGET :: fill_data
+ INTEGER :: compress
+ INTEGER :: status
+ INTEGER :: i
+ INTEGER(SIZE_T) :: dst_size
+ TYPE(particle_t), DIMENSION(1:nrecords), TARGET :: dst_buf
+ INTEGER(SIZE_T), DIMENSION(1:nfields) :: dst_offset
+ INTEGER(SIZE_T), DIMENSION(1:nfields) :: dst_sizes
+ TYPE(particle_t), DIMENSION(1:nrecords), TARGET :: p_data
+ TYPE(particle_t), DIMENSION(1:nrecords), TARGET :: r_data
+
+ TYPE(C_PTR) :: f_ptr1, f_ptr2, f_ptr3
+
+ INTEGER :: errcode
+ CHARACTER(LEN=62) :: test_txt
+
+ test_txt = "Testing H5TBread_table_f and H5TBmake_table_f (F2003)"
+ CALL test_begin(test_txt)
+
+ ! Define an array of Particles
+ p_data(1:nrecords) = (/ &
+ particle_t("zero ",0_int_kind_8,0_int_kind_16,0.0_sp,0.0_dp), &
+ particle_t("one ",10_int_kind_8,10_int_kind_16,10.0_sp,10.0_dp), &
+ particle_t("two ",20_int_kind_8,20_int_kind_16,20.0_sp,20.0_dp), &
+ particle_t("three ",30_int_kind_8,30_int_kind_16,30.0_sp,30.0_dp),&
+ particle_t("four ",40_int_kind_8,40_int_kind_16,40.0_sp,40.0_dp), &
+ particle_t("five ",50_int_kind_8,50_int_kind_16,50.0_sp,50.0_dp), &
+ particle_t("six ",60_int_kind_8,60_int_kind_16,60.0_sp,60.0_dp), &
+ particle_t("seven ",70_int_kind_8,70_int_kind_16,70.0_sp,70.0_dp) &
+ /)
+
+ fill_data(1:nrecords) = particle_t("no data",-1_int_kind_8, -2_int_kind_16, -99.0_sp, -100.0_dp)
+
+ compress = 0
+
+ dst_size = H5OFFSETOF(C_LOC(dst_buf(1)), C_LOC(dst_buf(2)))
+
+#ifdef H5_FORTRAN_HAVE_STORAGE_SIZE
+ dst_sizes(1:nfields) = (/ &
+ storage_size(dst_buf(1)%name)/storage_size(c_char_'a'), &
+ storage_size(dst_buf(1)%lati)/storage_size(c_char_'a'), &
+ storage_size(dst_buf(1)%long)/storage_size(c_char_'a'), &
+ storage_size(dst_buf(1)%pressure)/storage_size(c_char_'a'), &
+ storage_size(dst_buf(1)%temperature)/storage_size(c_char_'a') &
+ /)
+#else
+ dst_sizes(1:nfields) = (/ &
+ sizeof(dst_buf(1)%name), &
+ sizeof(dst_buf(1)%lati), &
+ sizeof(dst_buf(1)%long), &
+ sizeof(dst_buf(1)%pressure), &
+ sizeof(dst_buf(1)%temperature) &
+ /)
+#endif
+
+ dst_offset(1:nfields) = (/ &
+ H5OFFSETOF(C_LOC(dst_buf(1)), C_LOC(dst_buf(1)%name(1:1))), &
+ H5OFFSETOF(C_LOC(dst_buf(1)), C_LOC(dst_buf(1)%lati)), &
+ H5OFFSETOF(C_LOC(dst_buf(1)), C_LOC(dst_buf(1)%long)), &
+ H5OFFSETOF(C_LOC(dst_buf(1)), C_LOC(dst_buf(1)%pressure)), &
+ H5OFFSETOF(C_LOC(dst_buf(1)), C_LOC(dst_buf(1)%temperature)) &
+ /)
+
+ ! Initialize field_type
+ CALL H5Tcopy_f(H5T_FORTRAN_S1, string_type, errcode)
+ CALL H5Tset_size_f(string_type, INT(11,size_t), errcode)
+
+ field_type(1:5) = (/ &
+ string_type,&
+ h5kind_to_type(KIND(dst_buf(1)%lati), H5_INTEGER_KIND),&
+ h5kind_to_type(KIND(dst_buf(1)%long), H5_INTEGER_KIND),&
+ h5kind_to_type(KIND(dst_buf(1)%pressure), H5_REAL_KIND),&
+ h5kind_to_type(KIND(dst_buf(1)%temperature), H5_REAL_KIND) &
+ /)
+
+ !
+ ! Create a new file using default properties.
+ !
+ CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
+
+ ! Check setting the fill values
+
+ f_ptr1 = C_NULL_PTR
+ f_ptr2 = C_LOC(fill_data(1)%name(1:1))
+
+ CALL h5tbmake_table_f("Table Title Fill", file_id, table_name_fill, nfields, nrecords, &
+ dst_size, field_names, dst_offset, field_type, &
+ chunk_size, f_ptr2, compress, f_ptr1, errcode )
+
+ f_ptr3 = C_LOC(r_data(1)%name(1:1))
+ CALL h5tbread_table_f(file_id, table_name_fill, nfields, dst_size, dst_offset, dst_sizes, f_ptr3, errcode)
+
+ DO i = 1, nfields
+ IF(r_data(i)%name.NE.fill_data(i)%name.OR. &
+ r_data(i)%lati.NE.fill_data(i)%lati.OR. &
+ r_data(i)%long.NE.fill_data(i)%long.OR. &
+ r_data(i)%pressure.NE.fill_data(i)%pressure.OR. &
+ r_data(i)%temperature.NE.fill_data(i)%temperature)THEN
+ PRINT*,'H5TBmake/read_table_f --filled-- FAILED'
+ STOP
+ ENDIF
+ ENDDO
+
+ ! Check setting the table values
+
+ f_ptr1 = C_LOC(p_data(1)%name(1:1))
+ f_ptr2 = C_NULL_PTR
+
+ CALL h5tbmake_table_f("Table Title",file_id, table_name, nfields, nrecords, &
+ dst_size, field_names, dst_offset, field_type, &
+ chunk_size, f_ptr2, compress, f_ptr1, errcode )
+
+ f_ptr3 = C_LOC(r_data(1)%name(1:1))
+ CALL h5tbread_table_f(file_id, table_name, nfields, dst_size, dst_offset, dst_sizes, f_ptr3, errcode)
+
+ DO i = 1, nfields
+ IF(r_data(i)%name.NE.p_data(i)%name.OR. &
+ r_data(i)%lati.NE.p_data(i)%lati.OR. &
+ r_data(i)%long.NE.p_data(i)%long.OR. &
+ r_data(i)%pressure.NE.p_data(i)%pressure.OR. &
+ r_data(i)%temperature.NE.p_data(i)%temperature)THEN
+ PRINT*,'H5TBmake/read_table_f FAILED'
+ STOP
+ ENDIF
+ ENDDO
+
+ CALL passed()
+
+ !-------------------------------------------------------------------------
+ ! end
+ !-------------------------------------------------------------------------
+
+ !
+ ! Close the file.
+ !
+ CALL h5fclose_f(file_id, errcode)
+
+END SUBROUTINE test_table2
+
!-------------------------------------------------------------------------
! test_begin
@@ -519,8 +718,7 @@ END SUBROUTINE test_table1
SUBROUTINE test_begin(string)
CHARACTER(LEN=*), INTENT(IN) :: string
- WRITE(*, fmt = '(14a)', advance = 'no') string
- WRITE(*, fmt = '(40x,a)', advance = 'no') ' '
+ WRITE(*, fmt = '(A)', ADVANCE = 'no') string
END SUBROUTINE test_begin
!-------------------------------------------------------------------------
@@ -528,7 +726,7 @@ END SUBROUTINE test_begin
!-------------------------------------------------------------------------
SUBROUTINE passed()
- WRITE(*, fmt = '(6a)') 'PASSED'
+ WRITE(*, fmt = '(T12,A6)') 'PASSED'
END SUBROUTINE passed
diff --git a/hl/src/CMakeLists.txt b/hl/src/CMakeLists.txt
index 472f1ee..a86bf4f 100644
--- a/hl/src/CMakeLists.txt
+++ b/hl/src/CMakeLists.txt
@@ -42,7 +42,7 @@ if (BUILD_SHARED_LIBS)
add_library (${HDF5_HL_LIBSH_TARGET} SHARED ${HL_SRCS} ${HL_HEADERS})
TARGET_C_PROPERTIES (${HDF5_HL_LIBSH_TARGET} SHARED " " " ")
target_link_libraries (${HDF5_HL_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
- H5_SET_LIB_OPTIONS (${HDF5_HL_LIBSH_TARGET} ${HDF5_HL_LIB_NAME} SHARED)
+ H5_SET_LIB_OPTIONS (${HDF5_HL_LIBSH_TARGET} ${HDF5_HL_LIB_NAME} SHARED ${HDF5_HL_PACKAGE_SOVERSION})
set_target_properties (${HDF5_HL_LIBSH_TARGET} PROPERTIES
FOLDER libraries/hl
COMPILE_DEFINITIONS "H5_BUILT_AS_DYNAMIC_LIB"
diff --git a/hl/src/H5DOpublic.h b/hl/src/H5DOpublic.h
index 774709e..9cf6921 100644
--- a/hl/src/H5DOpublic.h
+++ b/hl/src/H5DOpublic.h
@@ -22,17 +22,13 @@ extern "C" {
/*-------------------------------------------------------------------------
*
- * Direct chunk write function
+ * "Optimized dataset" routines.
*
*-------------------------------------------------------------------------
*/
-H5_HLDLL herr_t H5DOwrite_chunk(hid_t dset_id,
- hid_t dxpl_id,
- uint32_t filters,
- const hsize_t *offset,
- size_t data_size,
- const void *buf);
+H5_HLDLL herr_t H5DOwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters,
+ const hsize_t *offset, size_t data_size, const void *buf);
#ifdef __cplusplus
}
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/src/H5TB.c b/hl/src/H5TB.c
index 0f90393..bcd3339 100644
--- a/hl/src/H5TB.c
+++ b/hl/src/H5TB.c
@@ -3248,7 +3248,7 @@ out:
*
*-------------------------------------------------------------------------
*/
-static
+H5_ATTR_PURE static
hbool_t H5TB_find_field(const char *field, const char *field_list)
{
const char *start = field_list;
diff --git a/hl/src/Makefile.am b/hl/src/Makefile.am
index 1e781a9..e772233 100644
--- a/hl/src/Makefile.am
+++ b/hl/src/Makefile.am
@@ -28,7 +28,7 @@ AM_CPPFLAGS+=-I$(top_srcdir)/src
lib_LTLIBRARIES=libhdf5_hl.la
# Add libtool numbers to the HDF5 hl library (from config/lt_vers.am)
-libhdf5_hl_la_LDFLAGS= -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
+libhdf5_hl_la_LDFLAGS= -version-info $(LT_HL_VERS_INTERFACE):$(LT_HL_VERS_REVISION):$(LT_HL_VERS_AGE) $(AM_LDFLAGS)
# List sources to include in the HDF5 HL Library.
libhdf5_hl_la_SOURCES=H5DO.c H5DS.c H5IM.c H5LT.c H5LTanalyze.c H5LTparse.c H5PT.c H5TB.c
diff --git a/hl/test/CMakeLists.txt b/hl/test/CMakeLists.txt
index 916dcf3..bf598c4 100644
--- a/hl/test/CMakeLists.txt
+++ b/hl/test/CMakeLists.txt
@@ -48,9 +48,19 @@ HL_ADD_EXE (test_ds)
HL_ADD_EXE (test_dset_opt)
HL_ADD_EXE (test_image)
HL_ADD_EXE (test_lite)
-HL_ADD_EXE (test_packet)
HL_ADD_EXE (test_table)
+# test_packet has two source files
+add_executable (hl_test_packet test_packet.c test_packet_vlen.c)
+TARGET_NAMING (hl_test_packet STATIC)
+TARGET_C_PROPERTIES (hl_test_packet STATIC " " " ")
+target_link_libraries (hl_test_packet
+ ${HDF5_HL_LIB_TARGET}
+ ${HDF5_LIB_TARGET}
+ ${HDF5_TEST_LIB_TARGET}
+)
+set_target_properties (hl_test_packet PROPERTIES FOLDER test/hl)
+
# --------------------------------------------------------------------
# This executable is used to generate test files for the test_ds test.
# It should only be run during development when new test files are needed
diff --git a/hl/test/Makefile.am b/hl/test/Makefile.am
index 0809deb..bea760e 100644
--- a/hl/test/Makefile.am
+++ b/hl/test/Makefile.am
@@ -1,4 +1,3 @@
-#
# Copyright by The HDF Group.
# Copyright by the Board of Trustees of the University of Illinois.
# All rights reserved.
@@ -49,4 +48,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_dset_opt.c b/hl/test/test_dset_opt.c
index a8ffa44..c1e369e 100644
--- a/hl/test/test_dset_opt.c
+++ b/hl/test/test_dset_opt.c
@@ -41,7 +41,7 @@
#define CHUNK_NX 4
#define CHUNK_NY 4
-#define DEFLATE_SIZE_ADJUST(s) (ceil(((double)(s))*1.001F)+12)
+#define DEFLATE_SIZE_ADJUST(s) (ceil(((double)(s))*(double)1.001F)+12)
/* Temporary filter IDs used for testing */
#define H5Z_FILTER_BOGUS1 305
diff --git a/hl/test/test_lite.c b/hl/test/test_lite.c
index f3258d6..6cadd95 100644
--- a/hl/test/test_lite.c
+++ b/hl/test/test_lite.c
@@ -2066,6 +2066,15 @@ static int test_valid_path(void)
/**************************************
* CHECK ABSOLUTE PATHS
**************************************/
+
+ if( (path_valid = H5LTpath_valid(file_id, "/", TRUE)) != TRUE) {
+ goto out;
+ }
+
+ if( (path_valid = H5LTpath_valid(file_id, "/", FALSE)) != TRUE) {
+ goto out;
+ }
+
if( (path_valid = H5LTpath_valid(file_id, "/G1", TRUE)) != TRUE) {
goto out;
}
@@ -2112,6 +2121,20 @@ static int test_valid_path(void)
* CHECK RELATIVE PATHS
***************************************/
+ if( (group = H5Gopen2(file_id, "/", H5P_DEFAULT)) < 0)
+ goto out;
+
+ if( (path_valid = H5LTpath_valid(group, "/", TRUE)) != TRUE) {
+ goto out;
+ }
+
+ if( (path_valid = H5LTpath_valid(group, "/", FALSE)) != TRUE) {
+ goto out;
+ }
+
+ if(H5Gclose(group)<0)
+ goto out;
+
if( (group = H5Gopen2(file_id, "/G1", H5P_DEFAULT)) < 0)
goto out;
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..82c8d1c
--- /dev/null
+++ b/hl/test/test_packet_vlen.c
@@ -0,0 +1,1693 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group. *
+ * 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 TESTFL_FILE_NAME "testfl_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(fid, PT_VLEN_ATOMIC, vltype, (hsize_t)1, H5P_DEFAULT);
+
+ /* 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(fid, PT_VLEN_COMP, vltype, (hsize_t)1, H5P_DEFAULT);
+
+ /* 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(fid, PT_COMP_VLEN, comp_vlvl, (hsize_t)1, H5P_DEFAULT);
+
+ /* 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(fid, PT_VLEN_VLEN, vlofvl, (hsize_t)1, H5P_DEFAULT);
+
+ /* 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(fid, PT_FIXED_LEN, H5T_STD_I32BE, (hsize_t)100, H5P_DEFAULT);
+
+ /* 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 = H5Acreate2(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 set for deprecated function H5PTcreate_fl
+ Each test in this set is the same as the corresponding one in the
+ set for H5PTcreate, as of Mar 2016
+
+**************************************************************************/
+
+/*-------------------------------------------------------------------------
+ * testfl_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 testfl_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(TESTFL_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;
+} /* testfl_VLof_atomic */
+
+/*-------------------------------------------------------------------------
+ * testfl_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 testfl_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(TESTFL_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;
+} /* testfl_VLof_comptype */
+
+/*-------------------------------------------------------------------------
+ * testfl_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 testfl_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(TESTFL_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;
+} /* testfl_compound_VL_VLtype */
+
+/*-------------------------------------------------------------------------
+ * testfl_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 testfl_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(TESTFL_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;
+} /* testfl_VLof_VLtype */
+
+/*-------------------------------------------------------------------------
+ * 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;
+
+
+/**************************************************************************
+ Calling test functions for deprecated function H5PTcreate_fl
+ Mar 2016, -BMR
+
+**************************************************************************/
+
+ /* Create a file using default properties */
+ fid = H5Fcreate(TESTFL_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 - H5PTcreate_fl");
+
+ /* 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 (testfl_VLof_atomic() < 0)
+ status = FAIL;
+
+ /* Test variable length of a compound type */
+ if (testfl_VLof_comptype() < 0)
+ status = FAIL;
+
+ /* Test compound type with variable length */
+ if (testfl_compound_VL_VLtype() < 0)
+ status = FAIL;
+
+ /* Test variable length of a variable length */
+ if (testfl_VLof_VLtype() < 0)
+ status = FAIL;
+
+ return(status);
+}
diff --git a/hl/tools/gif2h5/h52giftest.sh.in b/hl/tools/gif2h5/h52giftest.sh.in
index 7aec219..90931f2 100644
--- a/hl/tools/gif2h5/h52giftest.sh.in
+++ b/hl/tools/gif2h5/h52giftest.sh.in
@@ -77,7 +77,7 @@ TOOLTEST ./h52gif $TESTFILE1 image1.gif -i image
echo ""
# Negative tests.
-echo "**verify the the h52gif tool handle error conditions correctly..."
+echo "**verify that the h52gif tool handles error conditions correctly..."
# nonexisting dataset name
TESTING "./h52gif h52giftst.h5 image.gif -i nosuch_image"
TOOLTESTFAIL "./h52gif $TESTFILE1 image.gif -i nosuch_image"