diff options
Diffstat (limited to 'hl/src/H5DS.c')
-rw-r--r-- | hl/src/H5DS.c | 64 |
1 files changed, 34 insertions, 30 deletions
diff --git a/hl/src/H5DS.c b/hl/src/H5DS.c index 939a99f..de6e66c 100644 --- a/hl/src/H5DS.c +++ b/hl/src/H5DS.c @@ -1430,10 +1430,12 @@ herr_t H5DSset_label(hid_t did, unsigned int idx, const char *label) hid_t aid = -1; /* attribute ID */ int rank; /* rank of dataset */ hsize_t dims[1]; /* dimensions of dataset */ - const char **buf = NULL; /* buffer to store in the attribute */ H5I_type_t it; /* ID type */ unsigned int i; - + union { /* union is needed to eliminate compiler warnings about */ + char ** buf; /* discarding the 'const' qualifier in the free */ + char const ** const_buf; /* buf calls */ + } u; /*------------------------------------------------------------------------- * parameter checking *------------------------------------------------------------------------- @@ -1496,19 +1498,19 @@ herr_t H5DSset_label(hid_t did, unsigned int idx, const char *label) goto out; /* allocate and initialize */ - buf = (const char **) HDmalloc((size_t) rank * sizeof(char *)); + u.const_buf = (char const **) HDmalloc((size_t) rank * sizeof(char *)); - if (buf == NULL) + if (u.const_buf == NULL) goto out; for (i = 0; i < (unsigned int) rank; i++) - buf[i] = NULL; + u.const_buf[i] = NULL; /* store the label information in the required index */ - buf[idx] = label; + u.const_buf[idx] = label; /* write the attribute with the label */ - if (H5Awrite(aid, tid, buf) < 0) + if (H5Awrite(aid, tid, u.const_buf) < 0) goto out; /* close */ @@ -1518,10 +1520,10 @@ herr_t H5DSset_label(hid_t did, unsigned int idx, const char *label) goto out; if (H5Aclose(aid) < 0) goto out; - if (buf) + if (u.const_buf) { - HDfree(buf); - buf = NULL; + HDfree(u.const_buf); + u.const_buf = NULL; } } @@ -1532,6 +1534,7 @@ herr_t H5DSset_label(hid_t did, unsigned int idx, const char *label) else { + if ((aid = H5Aopen(did, DIMENSION_LABELS, H5P_DEFAULT)) < 0) goto out; @@ -1539,34 +1542,34 @@ herr_t H5DSset_label(hid_t did, unsigned int idx, const char *label) goto out; /* allocate and initialize */ - buf = (const char **) HDmalloc((size_t) rank * sizeof(char *)); - - if (buf == NULL) + u.buf = (char **) HDmalloc((size_t) rank * sizeof(char *)); + + if (u.buf == NULL) goto out; /* read */ - if (H5Aread(aid, tid, (void *) buf) < 0) + if (H5Aread(aid, tid, (void *)u.buf) < 0) goto out; /* free the ptr that will be replaced by label */ - if (buf[idx]) - HDfree(buf[idx]); + if (u.buf[idx]) + HDfree(u.buf[idx]); /* store the label information in the required index */ - buf[idx] = label; + u.const_buf[idx] = label; /* write the attribute with the new references */ - if (H5Awrite(aid, tid, buf) < 0) + if (H5Awrite(aid, tid, u.buf) < 0) goto out; /* label was brought in, so don't free */ - buf[idx] = NULL; + u.buf[idx] = NULL; /* free all the ptr's from the H5Aread() */ for (i = 0; i < (unsigned int) rank; i++) { - if (buf[i]) - HDfree(buf[i]); + if (u.buf[i]) + HDfree(u.buf[i]); } /* close */ @@ -1574,28 +1577,29 @@ herr_t H5DSset_label(hid_t did, unsigned int idx, const char *label) goto out; if (H5Aclose(aid) < 0) goto out; - if (buf) + if (u.buf) { - HDfree(buf); - buf = NULL; + HDfree(u.buf); + u.buf = NULL; } } return SUCCEED; /* error zone */ + out: - if (buf) + if (u.buf) { - if (buf[idx]) /* check if we errored during H5Awrite */ - buf[idx] = NULL; /* don't free label */ + if (u.buf[idx]) /* check if we errored during H5Awrite */ + u.buf[idx] = NULL; /* don't free label */ /* free all the ptr's from the H5Aread() */ for (i = 0; i < (unsigned int) rank; i++) { - if (buf[i]) - HDfree(buf[i]); + if (u.buf[i]) + HDfree(u.buf[i]); } - HDfree(buf); + HDfree(u.buf); } H5E_BEGIN_TRY { |