summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRaymond Lu <songyulu@hdfgroup.org>2005-02-08 18:30:29 (GMT)
committerRaymond Lu <songyulu@hdfgroup.org>2005-02-08 18:30:29 (GMT)
commit70c0ba03cec20ad3c353fcf776f4b48f2ac8da9f (patch)
tree437db9a19b864616d6888a9d184e8a8e2714630e /src
parente31f8dfdc830cfc71a84ae36f2f69a0d432576db (diff)
downloadhdf5-70c0ba03cec20ad3c353fcf776f4b48f2ac8da9f.zip
hdf5-70c0ba03cec20ad3c353fcf776f4b48f2ac8da9f.tar.gz
hdf5-70c0ba03cec20ad3c353fcf776f4b48f2ac8da9f.tar.bz2
[svn-r9959] Purpose: Bug fix
Description: For variable-length string, H5Tget_class returned H5T_STRING as its class. But H5Tdetect_class and H5Tget_member_class considered it as H5T_VLEN. This is fixed to let all these 3 functions treat it as H5T_STRING. Some test cases have been added to dtypes.c Platforms tested: heping - already tested for v1.6 with h5committest Misc. update: RELEASE.txt
Diffstat (limited to 'src')
-rw-r--r--src/H5Dio.c2
-rw-r--r--src/H5T.c22
-rw-r--r--src/H5Tcompound.c5
-rw-r--r--src/H5Tnative.c2
-rw-r--r--src/H5Tprivate.h2
5 files changed, 24 insertions, 9 deletions
diff --git a/src/H5Dio.c b/src/H5Dio.c
index 7fda7b1..62afb22 100644
--- a/src/H5Dio.c
+++ b/src/H5Dio.c
@@ -919,7 +919,7 @@ H5D_write(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
* to detect the type of the reference if it is nested... -QAK
*/
if (IS_H5FD_MPI(dataset->ent.file) &&
- H5T_get_class(mem_type)==H5T_REFERENCE &&
+ H5T_get_class(mem_type, TRUE)==H5T_REFERENCE &&
H5T_get_ref_type(mem_type)==H5R_DATASET_REGION)
HGOTO_ERROR (H5E_DATASET, H5E_UNSUPPORTED, FAIL, "Parallel IO does not support writing region reference datatypes yet")
diff --git a/src/H5T.c b/src/H5T.c
index 42c6714..69cf02b 100644
--- a/src/H5T.c
+++ b/src/H5T.c
@@ -1752,7 +1752,7 @@ H5Tget_class(hid_t type_id)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_NO_CLASS, "not a data type");
/* Set return value */
- ret_value= H5T_get_class(dt);
+ ret_value= H5T_get_class(dt, FALSE);
done:
FUNC_LEAVE_API(ret_value);
@@ -1778,7 +1778,7 @@ done:
*-------------------------------------------------------------------------
*/
H5T_class_t
-H5T_get_class(const H5T_t *dt)
+H5T_get_class(const H5T_t *dt, htri_t internal)
{
H5T_class_t ret_value;
@@ -1792,6 +1792,16 @@ H5T_get_class(const H5T_t *dt)
else
ret_value=dt->shared->type;
+ /* Externally, a VL string is a string; internally, a VL string is a VL. */
+ if(internal) {
+ ret_value=dt->shared->type;
+ } else {
+ if(H5T_IS_VL_STRING(dt->shared))
+ ret_value=H5T_STRING;
+ else
+ ret_value=dt->shared->type;
+ }
+
done:
FUNC_LEAVE_NOAPI(ret_value);
} /* end H5T_get_class() */
@@ -1827,8 +1837,12 @@ H5Tdetect_class(hid_t type, H5T_class_t cls)
if (!(cls>H5T_NO_CLASS && cls<H5T_NCLASSES))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_NO_CLASS, "not a data type class");
- /* Set return value */
- ret_value=H5T_detect_class(dt,cls);
+ /* Set return value. Consider VL string as a string for API, as a VL for
+ * internal use. */
+ if(H5T_IS_VL_STRING(dt->shared))
+ ret_value = (H5T_STRING==cls);
+ else
+ ret_value=H5T_detect_class(dt,cls);
done:
FUNC_LEAVE_API(ret_value);
diff --git a/src/H5Tcompound.c b/src/H5Tcompound.c
index 46b1773..37c79ed 100644
--- a/src/H5Tcompound.c
+++ b/src/H5Tcompound.c
@@ -170,8 +170,9 @@ H5Tget_member_class(hid_t type_id, unsigned membno)
if (membno >= dt->shared->u.compnd.nmembs)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5T_NO_CLASS, "invalid member number")
- /* Value */
- ret_value = dt->shared->u.compnd.memb[membno].type->shared->type;
+ /* Get the type's class. We have to use this function to get type class
+ * because of the concern of variable-length string. */
+ ret_value = H5T_get_class(dt->shared->u.compnd.memb[membno].type, FALSE);
done:
FUNC_LEAVE_API(ret_value)
diff --git a/src/H5Tnative.c b/src/H5Tnative.c
index 1ffa45b..686e1e3 100644
--- a/src/H5Tnative.c
+++ b/src/H5Tnative.c
@@ -167,7 +167,7 @@ H5T_get_native_type(H5T_t *dtype, H5T_direction_t direction, size_t *struct_alig
assert(dtype);
- if((h5_class = H5T_get_class(dtype))==H5T_NO_CLASS)
+ if((h5_class = H5T_get_class(dtype, FALSE))==H5T_NO_CLASS)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a valid class")
if((size = H5T_get_size(dtype))==0)
diff --git a/src/H5Tprivate.h b/src/H5Tprivate.h
index e09be78..be4110c 100644
--- a/src/H5Tprivate.h
+++ b/src/H5Tprivate.h
@@ -71,7 +71,7 @@ H5_DLL H5T_t *H5T_open(H5G_entry_t *ent, hid_t dxpl_id);
H5_DLL H5T_t *H5T_copy(const H5T_t *old_dt, H5T_copy_t method);
H5_DLL herr_t H5T_lock(H5T_t *dt, hbool_t immutable);
H5_DLL herr_t H5T_close(H5T_t *dt);
-H5_DLL H5T_class_t H5T_get_class(const H5T_t *dt);
+H5_DLL H5T_class_t H5T_get_class(const H5T_t *dt, htri_t internal);
H5_DLL htri_t H5T_detect_class (const H5T_t *dt, H5T_class_t cls);
H5_DLL size_t H5T_get_size(const H5T_t *dt);
H5_DLL int H5T_cmp(const H5T_t *dt1, const H5T_t *dt2);