summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/H5D.c137
-rw-r--r--src/H5Dprivate.h1
-rw-r--r--src/H5Dpublic.h1
-rw-r--r--src/H5S.c62
-rw-r--r--src/H5Sprivate.h1
5 files changed, 202 insertions, 0 deletions
diff --git a/src/H5D.c b/src/H5D.c
index 3b15bae..bb4ba39 100644
--- a/src/H5D.c
+++ b/src/H5D.c
@@ -1275,6 +1275,139 @@ H5Dextend(hid_t dset_id, const hsize_t *size)
FUNC_LEAVE (SUCCEED);
}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5Dset_extend
+ *
+ * Purpose: Modifies the dimensions of a dataset, based on H5Dextend
+ *
+ * Return: Success: 0, Failure: -1
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: November 26, 2001
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+herr_t
+H5Dset_extend(hid_t dset_id, const hsize_t *size)
+{
+ H5D_t *dset = NULL;
+
+ FUNC_ENTER (H5Dset_extend, FAIL);
+ H5TRACE2("e","i*h",dset_id,size);
+
+ /* Check args */
+ if (H5I_DATASET!=H5I_get_type(dset_id) ||
+ NULL==(dset=H5I_object(dset_id))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset");
+ }
+ if (!size) {
+ HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "no size specified");
+ }
+
+ /* Increase size */
+ if (H5D_set_extend (dset, size)<0) {
+ HRETURN_ERROR (H5E_DATASET, H5E_CANTINIT, FAIL,
+ "unable to extend dataset");
+ }
+
+ FUNC_LEAVE (SUCCEED);
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5D_set_extend
+ *
+ * Purpose: Same as H5D_extend, allows change to a lower dimension, calls H5S_modify
+ *
+ * Return: Success: 0, Failure: -1
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: November 26, 2001
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+
+herr_t
+H5D_set_extend (H5D_t *dataset, const hsize_t *size)
+{
+ herr_t changed, ret_value=FAIL;
+ H5S_t *space = NULL;
+ H5O_fill_t fill;
+ H5P_genplist_t *plist; /* Property list */
+
+ FUNC_ENTER (H5D_set_extend, FAIL);
+
+ /* Check args */
+ assert (dataset);
+ assert (size);
+
+ /*
+ * NOTE: Restrictions on extensions were checked when the dataset was
+ * created. All extensions are allowed here since none should be
+ * able to muck things up.
+ */
+
+ /* Increase the size of the data space */
+ if (NULL==(space=H5S_read (&(dataset->ent))))
+ HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, FAIL, "unable to read data space info from dataset header");
+ if ((changed = H5S_set_extend (space, size))<0)
+ HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, FAIL, "unable to increase size of data space");
+
+ if (changed>0){
+ /* Save the new dataspace in the file if necessary */
+ if (H5S_modify (&(dataset->ent), space)<0)
+ HGOTO_ERROR (H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update file with new dataspace");
+
+ /* Initialize the new parts of the dataset */
+#ifdef LATER
+ if (H5S_select_all(space)<0 ||
+ H5S_select_hyperslab(space, H5S_SELECT_DIFF, zero, NULL, old_dims, NULL)<0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to select new extents for fill value");
+#else
+ /*
+ * We don't have the H5S_SELECT_DIFF operator yet. We really only
+ * need it for contiguous datasets because the chunked datasets will
+ * either fill on demand during I/O or attempt a fill of all chunks.
+ */
+ if (NULL == (plist = H5I_object(dataset->dcpl_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list");
+ if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get fill value");
+ if(H5D_CONTIGUOUS == dataset->layout.type && fill.buf)
+ HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unable to select fill value region");
+#endif
+ if (H5D_init_storage(dataset, space)<0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize dataset with fill value");
+ } /* end if */
+
+ ret_value = SUCCEED;
+
+done:
+ H5S_close(space);
+ FUNC_LEAVE (ret_value);
+}
+
+
+
+
+
/*-------------------------------------------------------------------------
* Function: H5D_new
@@ -2938,6 +3071,10 @@ done:
H5S_close(space);
FUNC_LEAVE (ret_value);
}
+
+
+
+
/*-------------------------------------------------------------------------
diff --git a/src/H5Dprivate.h b/src/H5Dprivate.h
index b2fb668..1c7d940 100644
--- a/src/H5Dprivate.h
+++ b/src/H5Dprivate.h
@@ -155,6 +155,7 @@ __DLL__ herr_t H5D_write(H5D_t *dataset, const H5T_t *mem_type,
const H5S_t *mem_space, const H5S_t *file_space,
hid_t dset_xfer_plist, const void *buf);
__DLL__ herr_t H5D_extend(H5D_t *dataset, const hsize_t *size);
+__DLL__ herr_t H5D_set_extend(H5D_t *dataset, const hsize_t *size);
__DLL__ H5G_entry_t *H5D_entof(H5D_t *dataset);
__DLL__ H5T_t *H5D_typeof(H5D_t *dset);
__DLL__ H5S_t *H5D_get_space(H5D_t *dset);
diff --git a/src/H5Dpublic.h b/src/H5Dpublic.h
index 056fb43..b889c35 100644
--- a/src/H5Dpublic.h
+++ b/src/H5Dpublic.h
@@ -52,6 +52,7 @@ __DLL__ herr_t H5Dread (hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
__DLL__ herr_t H5Dwrite (hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t plist_id, const void *buf);
__DLL__ herr_t H5Dextend (hid_t dset_id, const hsize_t *size);
+__DLL__ herr_t H5Dset_extend (hid_t dset_id, const hsize_t *size);
__DLL__ herr_t H5Diterate(void *buf, hid_t type_id, hid_t space_id,
H5D_operator_t op, void *operator_data);
__DLL__ herr_t H5Dvlen_reclaim(hid_t type_id, hid_t space_id, hid_t plist_id, void *buf);
diff --git a/src/H5S.c b/src/H5S.c
index ffc29ef..288948e 100644
--- a/src/H5S.c
+++ b/src/H5S.c
@@ -1654,6 +1654,68 @@ H5S_extend (H5S_t *space, const hsize_t *size)
FUNC_LEAVE (ret_value);
}
+
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5S_set_extend
+ *
+ * Purpose: Modify the dimensions of a data space. Based on H5S_extend
+ *
+ * Return: Success: Number of dimensions whose size increased.
+ *
+ * Failure: Negative
+ *
+ * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
+ *
+ * Date: November 26, 2001
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int
+H5S_set_extend (H5S_t *space, const hsize_t *size)
+{
+ int ret_value=0;
+ unsigned u;
+
+ FUNC_ENTER (H5S_extend, FAIL);
+
+ /* Check args */
+ assert (space && H5S_SIMPLE==space->extent.type);
+ assert (size);
+
+ for (u=0; u<space->extent.u.simple.rank; u++)
+ {
+
+ if (space->extent.u.simple.max &&
+ H5S_UNLIMITED!=space->extent.u.simple.max[u] &&
+ space->extent.u.simple.max[u]<size[u])
+ {
+ HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL,"dimension cannot be increased");
+ }
+
+ ret_value++;
+
+ }
+
+ /* Update */
+ if (ret_value)
+ {
+ for (u=0; u<space->extent.u.simple.rank; u++)
+ {
+
+ space->extent.u.simple.size[u] = size[u];
+
+ }
+ }
+
+ FUNC_LEAVE (ret_value);
+}
+
+
+
/*-------------------------------------------------------------------------
* Function: H5Screate_simple
diff --git a/src/H5Sprivate.h b/src/H5Sprivate.h
index 0893d59..42986d7 100644
--- a/src/H5Sprivate.h
+++ b/src/H5Sprivate.h
@@ -209,6 +209,7 @@ __DLL__ herr_t H5S_extent_release(H5S_t *space);
__DLL__ herr_t H5S_select_release(H5S_t *space);
__DLL__ hssize_t H5S_get_select_npoints(const H5S_t *space);
__DLL__ int H5S_extend(H5S_t *space, const hsize_t *size);
+__DLL__ int H5S_set_extend(H5S_t *space, const hsize_t *size);
__DLL__ htri_t H5S_select_valid(const H5S_t *space);
__DLL__ herr_t H5S_debug(H5F_t *f, const void *_mesg, FILE *stream,
int indent, int fwidth);