summaryrefslogtreecommitdiffstats
path: root/src/H5Tconv.c
diff options
context:
space:
mode:
authorRobb Matzke <matzke@llnl.gov>1999-02-15 17:38:04 (GMT)
committerRobb Matzke <matzke@llnl.gov>1999-02-15 17:38:04 (GMT)
commitc22bac0d207abbdd81123c35681f0558f75de488 (patch)
tree98db51d9303724a07f13558a7490881e89c6e6ad /src/H5Tconv.c
parentf6272d42929093a81aa2da79f150333793de49e0 (diff)
downloadhdf5-c22bac0d207abbdd81123c35681f0558f75de488.zip
hdf5-c22bac0d207abbdd81123c35681f0558f75de488.tar.gz
hdf5-c22bac0d207abbdd81123c35681f0558f75de488.tar.bz2
[svn-r1065] Changes since 19990121
---------------------- ./configure.in ./acconfig.h ./configure [REGENERATED] ./src/H5config.h.in [REGENERATED] ./src/H5public.h ./src/H5Omtime.c Check for <stddef.h> Checks for `__tm_gmtoff' in `struct tm' because old versions of GNU libc are different than recent versions. This fixes the failing mtime test. ./bin/config.guess ./config/freebsd2.2.7 [REMOVED] ./config/freebsd [ADDED] Changed the name so it works with all versions of FreeBSD. ./src/H5.c Moved H5F after H5T and H5G in H5_term_library() to satisfy dependencies. ./src/H5G.c Fixed a bug that caused H5Gcreate() to fail if the group name had trailing slashes. ./src/H5Gpublic.h Changed `group_name' to `name' in a prototype. ./src/Makefile.in Dynamic library on Linux, but needs for work to be generally useful. ./src/H5HG.c ./src/H5HGprivate.h Fixed alignment problems when using old GCC compilers (like the one shipped with RedHad Linux). ./tools/h5ls.c Fixed a bug where the contents of the root group could be listed twice if there was a link back to the root group. Similarly for groups that are mentioned on the command line. Fixed a bug where unknown types were printed with a random type class number. ./src/H5T.c ./src/H5Tconv.c ./src/H5Tprivate.h Fixed O(log N) conversion bugs.
Diffstat (limited to 'src/H5Tconv.c')
-rw-r--r--src/H5Tconv.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/H5Tconv.c b/src/H5Tconv.c
index 86ccea3..8816894 100644
--- a/src/H5Tconv.c
+++ b/src/H5Tconv.c
@@ -550,8 +550,8 @@ H5T_conv_struct_init (H5T_t *src, H5T_t *dst, H5T_cdata_t *cdata)
/*
* Insure that members are sorted.
*/
- H5T_sort_value(src);
- H5T_sort_value(dst);
+ H5T_sort_value(src, NULL);
+ H5T_sort_value(dst, NULL);
/*
* Build a mapping from source member number to destination member
@@ -761,8 +761,8 @@ H5T_conv_struct(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
/*
* Insure that members are sorted.
*/
- H5T_sort_value(src);
- H5T_sort_value(dst);
+ H5T_sort_value(src, NULL);
+ H5T_sort_value(dst, NULL);
src2dst = priv->src2dst;
/*
@@ -910,8 +910,8 @@ H5T_conv_enum_init(H5T_t *src, H5T_t *dst, H5T_cdata_t *cdata)
* symbol names and build a map from source member index to destination
* member index.
*/
- H5T_sort_name(src);
- H5T_sort_name(dst);
+ H5T_sort_name(src, NULL);
+ H5T_sort_name(dst, NULL);
if (NULL==(priv->src2dst=H5MM_malloc(src->u.enumer.nmembs*sizeof(int)))) {
HRETURN_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
"memory allocation failed");;
@@ -994,6 +994,9 @@ H5T_conv_enum_init(H5T_t *src, H5T_t *dst, H5T_cdata_t *cdata)
H5MM_xfree(priv->src2dst);
priv->src2dst = map;
HGOTO_DONE(SUCCEED);
+ } else {
+ /* Sort source type by value and adjust src2dst[] appropriately */
+ H5T_sort_value(src, priv->src2dst);
}
}
ret_value = SUCCEED;
@@ -1082,9 +1085,17 @@ H5T_conv_enum(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
}
assert (H5T_ENUM==src->type);
assert (H5T_ENUM==dst->type);
- H5T_sort_name(src);
- H5T_sort_name(dst);
+ if (priv->length) {
+ /* Use O(1) lookup */
+ H5T_sort_name(src, NULL);
+ H5T_sort_name(dst, NULL);
+ } else {
+ /* Use O(log N) lookup */
+ H5T_sort_value(src, NULL); /*yes, by value*/
+ H5T_sort_name(dst, NULL); /*yes, by name*/
+ }
+
/*
* Direction of conversion.
*/
@@ -1109,6 +1120,7 @@ H5T_conv_enum(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
} else {
n = *((int*)s);
}
+ n -= priv->base;
if (n<0 || n>=priv->length || priv->src2dst[n]<0) {
if (!H5T_overflow_g ||
(H5T_overflow_g)(src_id, dst_id, s, d)<0) {