summaryrefslogtreecommitdiffstats
path: root/fortran/src/H5Sf.c
diff options
context:
space:
mode:
Diffstat (limited to 'fortran/src/H5Sf.c')
-rw-r--r--fortran/src/H5Sf.c874
1 files changed, 874 insertions, 0 deletions
diff --git a/fortran/src/H5Sf.c b/fortran/src/H5Sf.c
new file mode 100644
index 0000000..af9c4a5
--- /dev/null
+++ b/fortran/src/H5Sf.c
@@ -0,0 +1,874 @@
+#include "H5f90.h"
+
+/*----------------------------------------------------------------------------
+ * Name: h5screate_simple_c
+ * Purpose: Call H5Screate_simple to create a dataspace
+ * Inputs: rank - number of dimensions of dataspace
+ * dims - array of the size of each dimension
+ maxdims - an array of the maximum size of each dimension
+ * Outputs: space_id - identifier of the created dataspace
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Wednesday, August 4, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5screate_simple_c ( int_f *rank, hsize_t_f *dims, hsize_t_f *maxdims, hid_t_f *space_id )
+{
+ int ret_value = -1;
+ hsize_t *c_dims;
+ hsize_t *c_maxdims;
+ hid_t c_space_id;
+ int i;
+
+ c_dims = malloc(sizeof(hsize_t) * (*rank ));
+ if (!c_dims) return ret_value;
+ c_maxdims = malloc(sizeof(hsize_t) * (*rank ));
+ if (!c_maxdims) return ret_value;
+
+ /*
+ * Transpose dimension arrays because of C-FORTRAN storage order
+ */
+ for (i = 0; i < *rank ; i++) {
+ c_dims[i] = dims[*rank - i - 1];
+ c_maxdims[i] = maxdims[*rank - i - 1];
+ }
+
+ c_space_id = H5Screate_simple(*rank, c_dims, c_maxdims);
+ if (c_space_id < 0) return ret_value;
+
+ *space_id = (hid_t_f)c_space_id;
+ ret_value = 0;
+ HDfree (c_dims);
+ HDfree (c_maxdims);
+ return ret_value;
+}
+
+
+
+/*----------------------------------------------------------------------------
+ * Name: h5sclose_c
+ * Purpose: Call H5Sclose to close the dataspace
+ * Inputs: space_id - identifier of the dataspace to be closed
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Wednesday, August 4, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sclose_c ( hid_t_f *space_id )
+{
+ int ret_value = 0;
+ hid_t c_space_id;
+
+ c_space_id = *space_id;
+ if ( H5Sclose(c_space_id) < 0 ) ret_value = -1;
+ return ret_value;
+}
+
+
+/*----------------------------------------------------------------------------
+ * Name: h5screate_c
+ * Purpose: Call H5Screate to create a dataspace
+ * Inputs: classtype - type of the dataspace class
+ * Outputs: space_id - identifier of the created dataspace
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Tuesday, August 10, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5screate_c ( int_f *classtype, hid_t_f *space_id )
+{
+ H5S_class_t c_classtype;
+ int CASE;
+ int ret_value = 0;
+ hid_t c_space_id;
+ CASE = (int)*classtype;
+
+ switch (CASE) {
+
+ case (H5S_SCALAR_F):
+ c_classtype = H5S_SCALAR;
+ break;
+
+ case(H5S_SIMPLE_F):
+ c_classtype = H5S_SIMPLE;
+ break;
+
+ default:
+ ret_value = -1;
+ return ret_value;
+ }
+ c_space_id = H5Screate(c_classtype);
+
+ if ( c_space_id < 0 ) ret_value = -1;
+ *space_id = (hid_t_f) c_space_id;
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5scopy_c
+ * Purpose: Call H5Scopy to copy dataspace
+ * Inputs: space_id - identifier of the dataspace to be copied
+ * Outputs: new_space_id - identifier of the new datspace
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Tuesday, August 10, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5scopy_c( hid_t_f *space_id , hid_t_f *new_space_id)
+{
+ int ret_value = 0;
+ hid_t c_new_space_id;
+ hid_t c_space_id;
+
+ c_space_id = *space_id;
+ c_new_space_id = H5Scopy(c_space_id);
+ if ( c_new_space_id < 0 ) ret_value = -1;
+
+ *new_space_id = (hid_t_f)c_new_space_id;
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5sget_select_hyper_nblocks_c
+ * Purpose: Call H5SH5Sget_select_hyper_nblocks to
+ * get the the number of hyperslab blocks in
+ * the current dataspace selection if successful
+ * Inputs: space_id - identifier of the dataspace
+ * Outputs: num_blocks - number of hyperslab blocks in
+ * the current dataspace selection
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Xiangyang Su
+ * Friday, November 12, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sget_select_hyper_nblocks_c( hid_t_f *space_id , hssize_t_f * num_blocks)
+{
+ int ret_value = 0;
+ hid_t c_space_id;
+ hssize_t c_num_blocks;
+ hsize_t* buf;
+ int i, j;
+
+ c_space_id = *space_id;
+ c_num_blocks = H5Sget_select_hyper_nblocks(c_space_id);
+ if ( c_num_blocks < 0 ) ret_value = -1;
+
+ *num_blocks = (hssize_t_f)c_num_blocks;
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5sget_select_elem_npoints_c
+ * Purpose: Call H5Sget_select_elem_npoints to
+ * get the the number of element points in
+ * the current dataspace selection if successful
+ * Inputs: space_id - identifier of the dataspace
+ * Outputs: num_points - number of element points in
+ * the current dataspace selection
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Xiangyang Su
+ * Monday, November 15, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sget_select_elem_npoints_c( hid_t_f *space_id , hssize_t_f * num_points)
+{
+ int ret_value = 0;
+ hid_t c_space_id;
+ hssize_t c_num_points;
+
+ c_space_id = *space_id;
+ c_num_points = H5Sget_select_elem_npoints(c_space_id);
+ if ( c_num_points < 0 ) ret_value = -1;
+
+ *num_points = (hssize_t_f)c_num_points;
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5sget_select_hyper_blocklist_c
+ * Purpose: Call H5Sget_select_hyper_blocklist to
+ * get a list of the hyperslab blocks currently selected
+ * Starting with the startblock-th block in the
+ * list of blocks, num_blocks blocks are put into the user's
+ * buffer. If the user's buffer fills up before numblocks
+ * blocks are inserted, the buffer
+ * will contain only as many blocks as fit.
+ * Inputs: space_id - identifier of the dataspace
+ * startblock - Hyperslab block to start with
+ * num_blocks - number of hyperslab blocks in
+ * the current dataspace selection
+ * Outputs: buf - List of hyperslab blocks selected
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Xiangyang Su
+ * Monday, November 15, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sget_select_hyper_blocklist_c( hid_t_f *space_id ,hsize_t_f * startblock,
+ hsize_t_f * num_blocks, hsize_t_f * buf)
+{
+ int ret_value = -1;
+ hid_t c_space_id;
+ hsize_t c_num_blocks;
+
+ int i, rank;
+ hsize_t* c_startblock,* c_buf;
+
+ c_space_id = *space_id;
+ c_num_blocks = * num_blocks;
+
+ rank = H5Sget_simple_extent_ndims(c_space_id);
+ if (rank < 0 ) return ret_value;
+
+ c_startblock = (hsize_t*)malloc(sizeof(hsize_t)*rank);
+ if (!c_startblock) return ret_value;
+ for (i = 0; i < rank; i++)
+ {
+ c_startblock[i] = (hsize_t)startblock[i];
+ }
+
+ c_buf = (hsize_t*)malloc(sizeof(hsize_t)*c_num_blocks*2*rank);
+ if (!c_buf) return ret_value;
+
+ ret_value = H5Sget_select_hyper_blocklist(c_space_id, *c_startblock,
+ c_num_blocks, c_buf);
+ for(i = 0; i < c_num_blocks*2*rank; i++)
+ {
+ buf[i] = (hsize_t_f)c_buf[i] +1;
+ }
+ HDfree(c_buf);
+ HDfree(c_startblock);
+ if (ret_value >= 0 ) ret_value = 0;
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5sget_select_bounds_c
+ * Purpose: Call H5Sget_select_bounds to retrieve the coordinates
+ * of the bounding box containing the current selection
+ * and places them into user-supplied buffers
+ * Inputs: space_id - identifier of the dataspace
+ * Outputs: start - Starting coordinates of the bounding box
+ * end - Ending coordinates of the bounding box,
+ * i.e., the coordinates of the diagonally opposite corne
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Xiangyang Su
+ * Wednesday, November 17, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sget_select_bounds_c( hid_t_f *space_id , hsize_t_f * start, hsize_t_f * end)
+{
+ int ret_value = -1;
+ hid_t c_space_id;
+ hsize_t* c_start, *c_end;
+ int i, rank;
+
+ c_space_id = *space_id;
+ rank = H5Sget_simple_extent_ndims(c_space_id);
+ if (rank < 0 ) return ret_value;
+
+ c_start =(hsize_t*) malloc(sizeof(hsize_t)*rank);
+ if (!c_start) return ret_value;
+
+ c_end = (hsize_t*)malloc(sizeof(hsize_t)*rank);
+ if(!c_end) return ret_value;
+
+ ret_value = H5Sget_select_bounds(c_space_id, c_start, c_end);
+ for(i = 0; i < rank; i++)
+ {
+ start[i] = (hsize_t_f)(c_start[i]+1);
+ end[i] = (hsize_t_f)(c_end[i]+1);
+ }
+ if (ret_value >= 0 ) ret_value = 0;
+
+ HDfree(c_start);
+ HDfree(c_end);
+
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5sget_select_elem_pointlist_c
+ * Purpose: Call H5Sget_select_elem_pointlist
+ * get a list of element points in the
+ * current dataspace selectin.
+ * Starting with the startpoint-th point in the
+ * list of points, numpoints points are put into the user's
+ * buffer. If the user's buffer fills up before numpoints
+ * points are inserted, the buffer
+ * will contain only as many points as fit.
+ * Inputs: space_id - identifier of the dataspace
+ * startpoint - Element point to start with
+ * numpoints - Number of element points to get
+ * Outputs: buf - List of element points selected
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Xiangyang Su
+ * Wednesday, November 17, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sget_select_elem_pointlist_c( hid_t_f *space_id ,hsize_t_f * startpoint,
+ hsize_t_f * numpoints, hsize_t_f * buf)
+{
+ int ret_value = -1;
+ hid_t c_space_id;
+ hsize_t c_num_points;
+ hsize_t* c_startpoint,* c_buf;
+ int i,j, rank;
+
+ c_space_id = *space_id;
+ c_num_points = (hsize_t)* numpoints;
+
+ rank = H5Sget_simple_extent_ndims(c_space_id);
+ if (rank < 0 ) return ret_value;
+
+ c_startpoint = (hsize_t *)HDmalloc(sizeof(hsize_t)*rank);
+ if (!c_startpoint) return ret_value;
+ for (i =0; i < rank; i++)
+ c_startpoint[i] = (hsize_t)startpoint[i];
+
+ c_buf = (hsize_t*)malloc(sizeof(hsize_t)*c_num_points*rank);
+ if (!c_buf) return ret_value;
+ ret_value = H5Sget_select_elem_pointlist(c_space_id, *startpoint,
+ c_num_points, c_buf);
+ for (i = c_num_points*rank-1; i >= 0; i--) {
+ buf[i] = (hsize_t_f)(c_buf[i]+1);
+ }
+
+ if (ret_value >= 0 ) ret_value = 0;
+
+ HDfree(c_startpoint);
+ HDfree(c_buf);
+
+ return ret_value;
+}
+
+
+
+/*----------------------------------------------------------------------------
+ * Name: h5sselect_all_c
+ * Purpose: Call H5Sselect_all to select entire dataspace
+ * Inputs: space_id - identifier of the dataspace
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Tuesday, August 10, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sselect_all_c ( hid_t_f *space_id )
+{
+ int ret_value = 0;
+ hid_t c_space_id;
+
+ c_space_id = *space_id;
+ if ( H5Sselect_all(c_space_id) < 0 ) ret_value = -1;
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5sselect_none_c
+ * Purpose: Call H5Sselect_none to reset the selection region
+ * Inputs: space_id - identifier of the dataspace
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Tuesday, August 10, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sselect_none_c ( hid_t_f *space_id )
+{
+ int ret_value = 0;
+ hid_t c_space_id;
+
+ c_space_id = *space_id;
+ if ( H5Sselect_none(c_space_id) < 0 ) ret_value = -1;
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5sselect_valid_c
+ * Purpose: Call H5Sselect_valid to verify that selection
+ * is within dataspace extent.
+ * Inputs: space_id - identifier of the dataspace
+ * Outputs: flag - 0 if not valid selection, 1 if is valid selection,
+ * and negative on failure.
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Tuesday, August 10, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sselect_valid_c ( hid_t_f *space_id , int_f *flag )
+{
+ int ret_value = 0;
+ hid_t c_space_id;
+ htri_t status;
+
+ c_space_id = *space_id;
+ status = H5Sselect_valid(c_space_id);
+ *flag = (int_f)status;
+ if ( status < 0 ) ret_value = -1;
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5sget_simple_extent_npoints_c
+ * Purpose: Call H5Sget_simple_extent_npoints to determine the number
+ * of elements in a dataspace
+ * Inputs: space_id - identifier of the dataspace
+ * Outputs: npoints - number of points in a dataspace
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Wednesday, August 11, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sget_simple_extent_npoints_c ( hid_t_f *space_id , hsize_t_f *npoints )
+{
+ int ret_value = 0;
+ hid_t c_space_id;
+ hsize_t c_npoints;
+
+ c_space_id = *space_id;
+ c_npoints = H5Sget_simple_extent_npoints(c_space_id);
+ if ( c_npoints == 0 ) ret_value = -1;
+ *npoints = (hsize_t_f)c_npoints;
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5sget_select_npoints_c
+ * Purpose: Call H5Sget_select_npoints to determine the number
+ * of elements in a dataspace selection
+ * Inputs: space_id - identifier of the dataspace
+ * Outputs: npoints - number of points in a dataspace selection
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Wednesday, August 11, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sget_select_npoints_c ( hid_t_f *space_id , hssize_t_f *npoints )
+{
+ int ret_value = 0;
+ hssize_t c_npoints;
+ hid_t c_space_id;
+
+ c_space_id = *space_id;
+ c_npoints = H5Sget_select_npoints(c_space_id);
+ if ( c_npoints == 0 ) ret_value = -1;
+ *npoints = (hssize_t_f)c_npoints;
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5sget_simple_extent_ndims_c
+ * Purpose: Call H5Sget_simple_extent_ndims to determine the number
+ * dimensions
+ * Inputs: space_id - identifier of the dataspace
+ * Outputs: rank - number of dataspace dimensions
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Wednesday, August 11, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sget_simple_extent_ndims_c ( hid_t_f *space_id , int_f *ndims )
+{
+ int ret_value = 0;
+ hid_t c_space_id;
+ int c_ndims;
+
+ c_space_id = *space_id;
+ c_ndims = H5Sget_simple_extent_ndims(c_space_id);
+ if ( c_ndims < 0 ) ret_value = -1;
+ *ndims = (int_f)c_ndims;
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5sget_simple_extent_type_c
+ * Purpose: Call H5Sget_simple_extent_type to determine the class type
+ * of a dataspace
+ * Inputs: space_id - identifier of the dataspace
+ * Outputs: classtype - class type; possible values are:
+ * H5S_SCALAR_F (0), H5S_SIMPLE_F (1)
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Wednesday, August 11, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sget_simple_extent_type_c ( hid_t_f *space_id , int_f *classtype)
+{
+ int ret_value = 0;
+ hid_t c_space_id;
+ H5S_class_t c_classtype;
+
+ c_space_id = *space_id;
+ c_classtype = H5Sget_simple_extent_type(c_space_id);
+ if ( c_classtype < 0 ) ret_value = -1;
+ if (c_classtype == H5S_SCALAR) *classtype = H5S_SCALAR_F;
+ if (c_classtype == H5S_SIMPLE) *classtype = H5S_SIMPLE_F;
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5soffset_simple_c
+ * Purpose: Call H5Soffset_simple to set the offset of a simple
+ * dataspace
+ * Inputs: space_id - identifier of the dataspace
+ * offset - offset array
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Wednesday, August 11, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5soffset_simple_c ( hid_t_f *space_id , hssize_t_f *offset)
+{
+ int ret_value = -1;
+ hid_t c_space_id;
+ int rank;
+ hssize_t *c_offset;
+ herr_t status;
+ int i;
+
+ c_space_id = *space_id;
+ rank = H5Sget_simple_extent_ndims(c_space_id);
+ if (rank < 0) return ret_value;
+
+ c_offset = malloc(sizeof(hssize_t)*rank);
+ if (!c_offset) return ret_value;
+
+ /*
+ * Reverse dimensions due to C-FORTRAN storage order.
+ */
+ for (i=0; i < rank; i++) c_offset[i] = offset[rank - i - 1];
+
+ status = H5Soffset_simple(c_space_id, c_offset);
+ if ( status >= 0 ) ret_value = 0;
+ HDfree(c_offset);
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5sset_extent_simple_c
+ * Purpose: Call H5Sset_extent_simple to set or reset size of
+ * existing dataspace
+ * Inputs: space_id - identifier of the dataspace
+ * rank - dataspace rank
+ * current_size - array with the new dimension sizes
+ * maximum_size - aray with maximum sizes of dimensions
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Wednesday, August 11, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sset_extent_simple_c ( hid_t_f *space_id , int_f *rank, hsize_t_f *current_size, hsize_t_f *maximum_size)
+{
+ int ret_value = -1;
+ hid_t c_space_id;
+ int c_rank;
+ hsize_t *c_current_size;
+ hsize_t *c_maximum_size;
+ herr_t status;
+ int i;
+
+ c_current_size = malloc(sizeof(hsize_t)*(*rank));
+ if (!c_current_size) return ret_value;
+
+ c_maximum_size = malloc(sizeof(hsize_t)*(*rank));
+ if (!c_maximum_size) return ret_value;
+
+ /*
+ * Reverse dimensions due to C-FORTRAN storage order.
+ */
+ for (i=0; i < *rank; i++) {
+ c_current_size[i] = (hsize_t)current_size[*rank - i - 1];
+ c_maximum_size[i] = (hsize_t)maximum_size[*rank - i - 1];
+ }
+
+ c_space_id = *space_id;
+ c_rank = *rank;
+ status = H5Sset_extent_simple(c_space_id, c_rank, c_current_size, c_maximum_size);
+ if ( status >= 0 ) ret_value = 0;
+ HDfree(c_current_size);
+ HDfree(c_maximum_size);
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5sget_simple_extent_dims_c
+ * Purpose: Call H5Sget_simple_extent_dims to retrieve sizes of an
+ * existing dataspace
+ * Inputs: space_id - identifier of the dataspace
+ * Outputs: dims - array with the dimension sizes
+ * maxdims - aray with maximum sizes of dimensions
+ * Returns: number of dataspace dimensions (rank) on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Wednesday, August 11, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sget_simple_extent_dims_c ( hid_t_f *space_id , hsize_t_f *dims, hsize_t_f *maxdims)
+{
+ int ret_value = -1;
+ hid_t c_space_id;
+ hsize_t *c_dims;
+ hsize_t *c_maxdims;
+ int status;
+ int rank;
+ int i;
+
+ c_space_id = *space_id;
+ rank = H5Sget_simple_extent_ndims(c_space_id);
+ if (rank < 0) return ret_value;
+
+ c_dims = malloc(sizeof(hsize_t)*rank);
+ if (!c_dims) return ret_value;
+
+ c_maxdims = malloc(sizeof(hsize_t)*rank);
+ if (!c_maxdims) return ret_value;
+
+ status = H5Sget_simple_extent_dims(c_space_id, c_dims, c_maxdims);
+ /*
+ * Reverse dimensions due to C-FORTRAN storage order.
+ */
+ for (i=0; i < rank; i++) {
+ dims[rank - i - 1] = (hsize_t_f)c_dims[i];
+ maxdims[rank - i - 1] = (hsize_t_f)c_maxdims[i];
+ }
+
+ if ( status >= 0 ) ret_value = rank;
+ HDfree(c_dims);
+ HDfree(c_maxdims);
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5sis_simple_c
+ * Purpose: Call H5Sis_simple to detrmine if the dataspace
+ * is simple.
+ * Inputs: space_id - identifier of the dataspace
+ * Outputs: flag - 0 if not simple, 1 if is simple,
+ * and negative on failure.
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Wednesday, August 11, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sis_simple_c ( hid_t_f *space_id , int_f *flag )
+{
+ int ret_value = 0;
+ hid_t c_space_id;
+ htri_t status;
+
+ c_space_id = *space_id;
+ status = H5Sis_simple(c_space_id);
+ *flag = (int_f)status;
+ if ( status < 0 ) ret_value = -1;
+ return ret_value;
+}
+
+
+/*----------------------------------------------------------------------------
+ * Name: h5sextent_copy_c
+ * Purpose: Call H5Sextent_copy to copy an extent of dataspace
+ * Inputs: dest_space_id - identifier of the destination dataspace
+ * source_space_id - identifier of the source dataspace
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Wednesday, August 11, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sextent_copy_c ( hid_t_f *dest_space_id , hid_t_f *source_space_id)
+{
+ int ret_value = 0;
+ hid_t c_dest_space_id, c_source_space_id;
+ herr_t status;
+
+ c_dest_space_id = *dest_space_id;
+ c_source_space_id = *source_space_id;
+ status = H5Sextent_copy(c_dest_space_id, c_source_space_id);
+ if ( status < 0 ) ret_value = -1;
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5sset_extent_none_c
+ * Purpose: Call H5Sset_extent_none to remove extent from a dataspace
+ * Inputs: space_id - dataspace identifier
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Wednesday, August 11, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sset_extent_none_c ( hid_t_f *space_id )
+{
+ int ret_value = 0;
+ hid_t c_space_id;
+ herr_t status;
+
+ c_space_id = *space_id;
+ status = H5Sset_extent_none(c_space_id);
+ if ( status < 0 ) ret_value = -1;
+ return ret_value;
+}
+
+/*----------------------------------------------------------------------------
+ * Name: h5sselect_hyperslab_c
+ * Purpose: Call H5Sselect_hyperslab to select a hyperslab
+ * Inputs: space_id - identifier of the dataspace
+ * operator - defines how the new selection is combined
+ * with the previous one; current values are
+ * H5S_SELECT_SET_F (0) and H5S_SELECT_OR_F (1)
+ * start - offset of start of hyperslab
+ * count - number of blocks included in the hyperslab
+ * stride - hyperslab stride (interval between blocks)
+ * block - size of block in the hyperslab
+ * maximum_size - aray with maximum sizes of dimensions
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Wednesday, August 11, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sselect_hyperslab_c ( hid_t_f *space_id , int_f *op, hssize_t_f *start, hsize_t_f *count, hsize_t_f *stride, hsize_t_f *block)
+{
+ int ret_value = -1;
+ hid_t c_space_id;
+ hssize_t *c_start;
+ hsize_t *c_count;
+ hsize_t *c_stride;
+ hsize_t *c_block;
+
+ H5S_seloper_t c_op;
+ herr_t status;
+ int rank;
+ int i;
+
+ rank = H5Sget_simple_extent_ndims(*space_id);
+ if (rank < 0 ) return ret_value;
+ c_start = (hssize_t *)HDmalloc(sizeof(hssize_t)*rank);
+ if (!c_start) return ret_value;
+
+ c_count = (hsize_t *)HDmalloc(sizeof(hsize_t)*rank);
+ if (!c_count) return ret_value;
+
+ c_stride = (hsize_t *)HDmalloc(sizeof(hsize_t)*rank);
+ if (!c_stride) return ret_value;
+
+ c_block = (hsize_t *)HDmalloc(sizeof(hsize_t)*rank);
+ if (!c_block) return ret_value;
+
+
+ /*
+ * Reverse dimensions due to C-FORTRAN storage order.
+ */
+
+ for (i=0; i < rank; i++) {
+ int t= (rank - i) - 1;
+ c_start[i] = (hssize_t)start[t];
+ c_count[i] = (hsize_t)count[t];
+ c_stride[i] = (hsize_t)stride[t];
+ c_block[i] = (hsize_t)block[t];
+ }
+
+ if (*op == H5S_SELECT_SET_F) c_op = H5S_SELECT_SET;
+ if (*op == H5S_SELECT_OR_F) c_op = H5S_SELECT_OR;
+
+
+ c_space_id = *space_id;
+ status = H5Sselect_hyperslab(c_space_id, c_op, c_start, c_stride, c_count, c_block);
+ if ( status >= 0 ) ret_value = 0;
+ HDfree(c_start);
+ HDfree(c_count);
+ HDfree(c_stride);
+ HDfree(c_block);
+ return ret_value;
+}
+
+
+/*----------------------------------------------------------------------------
+ * Name: h5sselect_elements_c
+ * Purpose: Call H5Sselect_elements to select elements of a dataspace
+ * Inputs: space_id - identifier of the dataspace
+ * operator - defines how the new selection is combined
+ * with the previous one; current values are
+ * H5S_SELECT_SET_F (0)
+ * nelements - number of elements in the selection
+ * coord - arrays with the elements coordinates
+ * Returns: 0 on success, -1 on failure
+ * Programmer: Elena Pourmal
+ * Wednesday, August 11, 1999
+ * Modifications:
+ *---------------------------------------------------------------------------*/
+
+int_f
+nh5sselect_elements_c ( hid_t_f *space_id , int_f *op, size_t_f *nelements, hssize_t_f *coord)
+{
+ int ret_value = -1;
+ hid_t c_space_id;
+ H5S_seloper_t c_op;
+ herr_t status;
+ int rank;
+ int i, j;
+ hssize_t *c_coord;
+ size_t c_nelements;
+
+ if (*op != H5S_SELECT_SET_F) return ret_value;
+ c_op = H5S_SELECT_SET;
+
+ c_space_id = *space_id;
+ rank = H5Sget_simple_extent_ndims(c_space_id);
+
+ c_coord = malloc(sizeof(hssize_t)*rank*(*nelements));
+ if(!c_coord) return ret_value;
+ for (i=0; i< *nelements; i++) {
+ for (j = 0; j < rank; j++) {
+ c_coord[j+i*rank] = (hssize_t)coord[j + i*rank];
+ }
+ }
+
+ c_nelements = *nelements;
+ status = H5Sselect_elements(c_space_id, c_op, c_nelements, (const hssize_t **)c_coord);
+ if ( status >= 0 ) ret_value = 0;
+ HDfree(c_coord);
+ return ret_value;
+}
+