2003-04-01 01:59:04 +08:00
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
2007-02-07 22:56:24 +08:00
|
|
|
|
* Copyright by The HDF Group. *
|
2003-04-01 01:59:04 +08:00
|
|
|
|
* Copyright by the Board of Trustees of the University of Illinois. *
|
|
|
|
|
* All rights reserved. *
|
|
|
|
|
* *
|
|
|
|
|
* This file is part of HDF5. The full HDF5 copyright notice, including *
|
|
|
|
|
* terms governing use, modification, and redistribution, is contained in *
|
|
|
|
|
* the files COPYING and Copyright.html. COPYING can be found at the root *
|
|
|
|
|
* of the source code distribution tree; Copyright.html can be found at the *
|
|
|
|
|
* root level of an installed copy of the electronic HDF5 document set and *
|
|
|
|
|
* is linked from the top-level documents page. It can also be found at *
|
2007-02-07 22:56:24 +08:00
|
|
|
|
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
|
|
|
|
|
* access to either file, you may request a copy from help@hdfgroup.org. *
|
2003-04-01 01:59:04 +08:00
|
|
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
/***********************************************************
|
|
|
|
|
*
|
|
|
|
|
* Test program: titerate
|
|
|
|
|
*
|
|
|
|
|
* Test the Group & Attribute functionality
|
|
|
|
|
*
|
|
|
|
|
*************************************************************/
|
|
|
|
|
|
2001-04-04 02:09:16 +08:00
|
|
|
|
#include "testhdf5.h"
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
2001-04-04 02:09:16 +08:00
|
|
|
|
#include "hdf5.h"
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
2001-04-01 11:25:53 +08:00
|
|
|
|
#define DATAFILE "titerate.h5"
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
/* Number of datasets for group iteration test */
|
|
|
|
|
#define NDATASETS 50
|
|
|
|
|
|
2003-06-23 21:25:06 +08:00
|
|
|
|
/* Number of attributes for attribute iteration test */
|
2000-04-06 04:51:44 +08:00
|
|
|
|
#define NATTR 50
|
|
|
|
|
|
2000-04-12 23:44:48 +08:00
|
|
|
|
/* Number of groups for second group iteration test */
|
2002-08-10 05:55:44 +08:00
|
|
|
|
#define ITER_NGROUPS 150
|
2000-04-12 23:44:48 +08:00
|
|
|
|
|
2000-04-06 04:51:44 +08:00
|
|
|
|
/* General maximum length of names used */
|
|
|
|
|
#define NAMELEN 80
|
|
|
|
|
|
2000-04-12 23:44:48 +08:00
|
|
|
|
/* 1-D dataset with fixed dimensions */
|
|
|
|
|
#define SPACE1_NAME "Space1"
|
|
|
|
|
#define SPACE1_RANK 1
|
|
|
|
|
#define SPACE1_DIM1 4
|
|
|
|
|
|
2001-09-26 01:46:32 +08:00
|
|
|
|
typedef enum {
|
|
|
|
|
RET_ZERO,
|
2003-06-23 21:25:06 +08:00
|
|
|
|
RET_TWO,
|
2006-10-02 18:24:03 +08:00
|
|
|
|
RET_CHANGE,
|
|
|
|
|
RET_CHANGE2
|
2001-09-26 01:46:32 +08:00
|
|
|
|
} iter_enum;
|
|
|
|
|
|
2000-04-06 04:51:44 +08:00
|
|
|
|
/* Custom group iteration callback data */
|
|
|
|
|
typedef struct {
|
2000-04-12 23:44:48 +08:00
|
|
|
|
char name[NAMELEN]; /* The name of the object */
|
2007-09-13 23:44:56 +08:00
|
|
|
|
H5O_type_t type; /* The type of the object */
|
2001-09-26 01:46:32 +08:00
|
|
|
|
iter_enum command; /* The type of return value */
|
2000-04-06 04:51:44 +08:00
|
|
|
|
} iter_info;
|
|
|
|
|
|
|
|
|
|
/* Local functions */
|
|
|
|
|
int iter_strcmp(const void *s1, const void *s2);
|
2000-04-12 23:44:48 +08:00
|
|
|
|
int iter_strcmp2(const void *s1, const void *s2);
|
2007-08-31 04:03:37 +08:00
|
|
|
|
static herr_t liter_cb(hid_t group, const char *name, const H5L_info_t *info,
|
|
|
|
|
void *op_data);
|
|
|
|
|
static herr_t liter_cb2(hid_t group, const char *name, const H5L_info_t *info,
|
|
|
|
|
void *op_data);
|
2007-10-04 23:06:28 +08:00
|
|
|
|
herr_t aiter_cb(hid_t group, const char *name, const H5A_info_t *ainfo,
|
|
|
|
|
void *op_data);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
/****************************************************************
|
|
|
|
|
**
|
|
|
|
|
** iter_strcmp(): String comparison routine for qsort
|
2005-08-14 04:53:35 +08:00
|
|
|
|
**
|
2000-04-06 04:51:44 +08:00
|
|
|
|
****************************************************************/
|
|
|
|
|
int iter_strcmp(const void *s1, const void *s2)
|
|
|
|
|
{
|
2006-10-02 18:24:03 +08:00
|
|
|
|
return(HDstrcmp(*(const char * const *)s1,*(const char * const *)s2));
|
2000-04-06 04:51:44 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/****************************************************************
|
|
|
|
|
**
|
2007-08-31 04:03:37 +08:00
|
|
|
|
** liter_cb(): Custom link iteration callback routine.
|
2005-08-14 04:53:35 +08:00
|
|
|
|
**
|
2000-04-06 04:51:44 +08:00
|
|
|
|
****************************************************************/
|
2007-08-31 04:03:37 +08:00
|
|
|
|
static herr_t
|
|
|
|
|
liter_cb(hid_t UNUSED group, const char *name, const H5L_info_t UNUSED *link_info,
|
|
|
|
|
void *op_data)
|
2000-04-06 04:51:44 +08:00
|
|
|
|
{
|
2006-10-02 18:24:03 +08:00
|
|
|
|
iter_info *info = (iter_info *)op_data;
|
|
|
|
|
static int count = 0;
|
|
|
|
|
static int count2 = 0;
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
HDstrcpy(info->name, name);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
switch(info->command) {
|
|
|
|
|
case RET_ZERO:
|
|
|
|
|
return(0);
|
|
|
|
|
|
2003-06-23 21:25:06 +08:00
|
|
|
|
case RET_TWO:
|
|
|
|
|
return(2);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
case RET_CHANGE:
|
|
|
|
|
count++;
|
2006-10-02 18:24:03 +08:00
|
|
|
|
return(count > 10 ? 1 : 0);
|
|
|
|
|
|
|
|
|
|
case RET_CHANGE2:
|
|
|
|
|
count2++;
|
|
|
|
|
return(count2 > 10 ? 1 : 0);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
printf("invalid iteration command");
|
|
|
|
|
return(-1);
|
|
|
|
|
} /* end switch */
|
2007-08-31 04:03:37 +08:00
|
|
|
|
} /* end liter_cb() */
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
/****************************************************************
|
|
|
|
|
**
|
|
|
|
|
** test_iter_group(): Test group iteration functionality
|
2005-08-14 04:53:35 +08:00
|
|
|
|
**
|
2000-04-06 04:51:44 +08:00
|
|
|
|
****************************************************************/
|
2007-08-31 04:03:37 +08:00
|
|
|
|
static void
|
|
|
|
|
test_iter_group(hid_t fapl, hbool_t new_format)
|
2000-04-06 04:51:44 +08:00
|
|
|
|
{
|
|
|
|
|
hid_t file; /* File ID */
|
|
|
|
|
hid_t dataset; /* Dataset ID */
|
|
|
|
|
hid_t datatype; /* Common datatype ID */
|
|
|
|
|
hid_t filespace; /* Common dataspace ID */
|
2002-11-26 01:59:14 +08:00
|
|
|
|
hid_t root_group,grp; /* Root group ID */
|
2000-04-06 04:51:44 +08:00
|
|
|
|
int i; /* counting variable */
|
2007-08-31 04:03:37 +08:00
|
|
|
|
hsize_t idx; /* Index in the group */
|
2000-04-06 04:51:44 +08:00
|
|
|
|
char name[NAMELEN]; /* temporary name buffer */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
char *lnames[NDATASETS + 2];/* Names of the links created */
|
2003-08-27 02:35:37 +08:00
|
|
|
|
char dataset_name[NAMELEN]; /* dataset name */
|
2000-04-06 04:51:44 +08:00
|
|
|
|
iter_info info; /* Custom iteration information */
|
2007-09-06 23:54:22 +08:00
|
|
|
|
H5G_info_t ginfo; /* Buffer for querying object's info */
|
2002-11-26 01:59:14 +08:00
|
|
|
|
herr_t ret; /* Generic return value */
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
/* Output message about test being performed */
|
|
|
|
|
MESSAGE(5, ("Testing Group Iteration Functionality\n"));
|
|
|
|
|
|
|
|
|
|
/* Create the test file with the datasets */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
file = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
CHECK(file, FAIL, "H5Fcreate");
|
|
|
|
|
|
2003-06-23 21:25:06 +08:00
|
|
|
|
/* Test iterating over empty group */
|
2007-08-31 04:03:37 +08:00
|
|
|
|
info.command = RET_ZERO;
|
|
|
|
|
idx = 0;
|
[svn-r14224] Description:
Change H5Literate -> H5Literate_by_name and add simpler form of
H5Literate, to bring this routine into alignment with the other new API
routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 06:56:15 +08:00
|
|
|
|
ret = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info);
|
2007-08-31 04:03:37 +08:00
|
|
|
|
VERIFY(ret, SUCCEED, "H5Literate");
|
2003-06-23 21:25:06 +08:00
|
|
|
|
|
2000-04-06 04:51:44 +08:00
|
|
|
|
datatype = H5Tcopy(H5T_NATIVE_INT);
|
|
|
|
|
CHECK(datatype, FAIL, "H5Tcopy");
|
|
|
|
|
|
|
|
|
|
filespace=H5Screate(H5S_SCALAR);
|
|
|
|
|
CHECK(filespace, FAIL, "H5Screate");
|
|
|
|
|
|
|
|
|
|
for(i=0; i< NDATASETS; i++) {
|
|
|
|
|
sprintf(name,"Dataset %d",i);
|
[svn-r14199] Description:
Add H5Dcreate to API versioned routines, replacing internal usage with
H5Dcreate2
Fix thread-safe error stack initialization for API versioned error
stack printing routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-12 00:24:11 +08:00
|
|
|
|
dataset = H5Dcreate2(file, name, datatype, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
CHECK(dataset, FAIL, "H5Dcreate2");
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
/* Keep a copy of the dataset names around for later */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
lnames[i] = HDstrdup(name);
|
|
|
|
|
CHECK(lnames[i], NULL, "strdup");
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
ret = H5Dclose(dataset);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Dclose");
|
2006-10-02 18:24:03 +08:00
|
|
|
|
} /* end for */
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
2007-09-14 02:26:12 +08:00
|
|
|
|
/* Create a group and named datatype under root group for testing */
|
2007-08-24 04:25:25 +08:00
|
|
|
|
grp = H5Gcreate2(file, "grp", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
CHECK(ret, FAIL, "H5Gcreate2");
|
2002-11-26 01:59:14 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
lnames[NDATASETS] = HDstrdup("grp");
|
|
|
|
|
CHECK(lnames[NDATASETS], NULL, "strdup");
|
|
|
|
|
|
[svn-r14156] Description:
Add API versioning to H5Tcommit()
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
AIX/32 5.3 (copper) w/FORTRAN, w/parallel, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-09-26 10:50:31 +08:00
|
|
|
|
ret = H5Tcommit2(file, "dtype", datatype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
CHECK(ret, FAIL, "H5Tcommit2");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
lnames[NDATASETS + 1] = HDstrdup("dtype");
|
|
|
|
|
CHECK(lnames[NDATASETS], NULL, "strdup");
|
|
|
|
|
|
2000-04-06 04:51:44 +08:00
|
|
|
|
/* Close everything up */
|
2007-09-14 02:26:12 +08:00
|
|
|
|
ret = H5Tclose(datatype);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Tclose");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2007-09-14 02:26:12 +08:00
|
|
|
|
ret = H5Gclose(grp);
|
2002-11-26 01:59:14 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Gclose");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2007-09-14 02:26:12 +08:00
|
|
|
|
ret = H5Sclose(filespace);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Sclose");
|
|
|
|
|
|
2007-09-14 02:26:12 +08:00
|
|
|
|
ret = H5Fclose(file);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Fclose");
|
|
|
|
|
|
|
|
|
|
/* Sort the dataset names */
|
2006-10-31 04:00:57 +08:00
|
|
|
|
HDqsort(lnames, (size_t)(NDATASETS + 2), sizeof(char *), iter_strcmp);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
2002-11-26 01:59:14 +08:00
|
|
|
|
|
2000-04-06 04:51:44 +08:00
|
|
|
|
/* Iterate through the datasets in the root group in various ways */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
file = H5Fopen(DATAFILE, H5F_ACC_RDONLY, fapl);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
CHECK(file, FAIL, "H5Fopen");
|
|
|
|
|
|
2007-09-14 02:26:12 +08:00
|
|
|
|
/* These two functions, H5Oget_info_by_idx and H5Lget_name_by_idx, actually
|
2002-11-26 01:59:14 +08:00
|
|
|
|
* iterate through B-tree for group members in internal library design.
|
|
|
|
|
*/
|
2007-09-14 01:04:36 +08:00
|
|
|
|
root_group = H5Gopen2(file, "/", H5P_DEFAULT);
|
|
|
|
|
CHECK(root_group, FAIL, "H5Gopen2");
|
2002-11-26 01:59:14 +08:00
|
|
|
|
|
[svn-r14223] Description:
Change existing H5Gget_info -> H5Gget_info_by_name and add new version
of H5Gget_info, with simpler parameters, to better match new API routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 05:57:50 +08:00
|
|
|
|
ret = H5Gget_info(root_group, &ginfo);
|
2007-09-14 01:04:36 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Gget_info");
|
|
|
|
|
VERIFY(ginfo.nlinks, (NDATASETS + 2), "H5Gget_info");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2007-09-14 01:04:36 +08:00
|
|
|
|
for(i = 0; i< (int)ginfo.nlinks; i++) {
|
2007-09-14 02:26:12 +08:00
|
|
|
|
H5O_info_t oinfo; /* Object info */
|
2003-07-08 03:02:46 +08:00
|
|
|
|
|
2007-09-14 01:04:36 +08:00
|
|
|
|
ret = (herr_t)H5Lget_name_by_idx(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, dataset_name, (size_t)NAMELEN, H5P_DEFAULT);
|
|
|
|
|
CHECK(ret, FAIL, "H5Lget_name_by_idx");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2007-09-14 02:26:12 +08:00
|
|
|
|
ret = H5Oget_info_by_idx(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, &oinfo, H5P_DEFAULT);
|
|
|
|
|
CHECK(ret, FAIL, "H5Oget_info_by_idx");
|
2007-09-14 01:04:36 +08:00
|
|
|
|
} /* end for */
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2007-09-14 01:04:36 +08:00
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
ret = (herr_t)H5Lget_name_by_idx(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)(NDATASETS+3), dataset_name, (size_t)NAMELEN, H5P_DEFAULT);
|
|
|
|
|
} H5E_END_TRY;
|
|
|
|
|
VERIFY(ret, FAIL, "H5Lget_name_by_idx");
|
2002-11-26 01:59:14 +08:00
|
|
|
|
|
2007-09-14 01:04:36 +08:00
|
|
|
|
ret = H5Gclose(root_group);
|
|
|
|
|
CHECK(ret, FAIL, "H5Gclose");
|
2002-11-26 01:59:14 +08:00
|
|
|
|
|
2007-09-14 02:26:12 +08:00
|
|
|
|
/* These two functions, H5Oget_info_by_idx and H5Lget_name_by_idx, actually
|
2003-08-22 21:50:01 +08:00
|
|
|
|
* iterate through B-tree for group members in internal library design.
|
|
|
|
|
* (Same as test above, but with the file ID instead of opening the root group)
|
|
|
|
|
*/
|
[svn-r14223] Description:
Change existing H5Gget_info -> H5Gget_info_by_name and add new version
of H5Gget_info, with simpler parameters, to better match new API routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 05:57:50 +08:00
|
|
|
|
ret = H5Gget_info(file, &ginfo);
|
2007-09-14 01:04:36 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Gget_info");
|
|
|
|
|
VERIFY(ginfo.nlinks, NDATASETS + 2, "H5Gget_info");
|
2003-08-22 21:50:01 +08:00
|
|
|
|
|
2007-09-14 01:04:36 +08:00
|
|
|
|
for(i = 0; i< (int)ginfo.nlinks; i++) {
|
2007-09-14 02:26:12 +08:00
|
|
|
|
H5O_info_t oinfo; /* Object info */
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2007-09-14 01:04:36 +08:00
|
|
|
|
ret = (herr_t)H5Lget_name_by_idx(file, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, dataset_name, (size_t)NAMELEN, H5P_DEFAULT);
|
|
|
|
|
CHECK(ret, FAIL, "H5Lget_name_by_idx");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2007-09-14 02:26:12 +08:00
|
|
|
|
ret = H5Oget_info_by_idx(file, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, &oinfo, H5P_DEFAULT);
|
|
|
|
|
CHECK(ret, FAIL, "H5Oget_info_by_idx");
|
|
|
|
|
} /* end for */
|
2003-08-22 21:50:01 +08:00
|
|
|
|
|
2007-09-14 01:04:36 +08:00
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
ret = (herr_t)H5Lget_name_by_idx(file, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)(NDATASETS + 3), dataset_name, (size_t)NAMELEN, H5P_DEFAULT);
|
|
|
|
|
} H5E_END_TRY;
|
|
|
|
|
VERIFY(ret, FAIL, "H5Lget_name_by_idx");
|
|
|
|
|
|
2003-06-23 21:25:06 +08:00
|
|
|
|
/* Test invalid indices for starting iteration */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
info.command = RET_ZERO;
|
2007-08-31 04:03:37 +08:00
|
|
|
|
idx = (hsize_t)-1;
|
2003-06-23 21:25:06 +08:00
|
|
|
|
H5E_BEGIN_TRY {
|
[svn-r14224] Description:
Change H5Literate -> H5Literate_by_name and add simpler form of
H5Literate, to bring this routine into alignment with the other new API
routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 06:56:15 +08:00
|
|
|
|
ret = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info);
|
2005-08-14 04:53:35 +08:00
|
|
|
|
} H5E_END_TRY;
|
2007-08-31 04:03:37 +08:00
|
|
|
|
VERIFY(ret, FAIL, "H5Literate");
|
2003-06-23 21:25:06 +08:00
|
|
|
|
|
|
|
|
|
/* Test skipping exactly as many entries as in the group */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
idx = NDATASETS + 2;
|
2003-06-23 21:25:06 +08:00
|
|
|
|
H5E_BEGIN_TRY {
|
[svn-r14224] Description:
Change H5Literate -> H5Literate_by_name and add simpler form of
H5Literate, to bring this routine into alignment with the other new API
routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 06:56:15 +08:00
|
|
|
|
ret = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info);
|
2005-08-14 04:53:35 +08:00
|
|
|
|
} H5E_END_TRY;
|
2007-08-31 04:03:37 +08:00
|
|
|
|
VERIFY(ret, FAIL, "H5Literate");
|
2003-06-23 21:25:06 +08:00
|
|
|
|
|
|
|
|
|
/* Test skipping more entries than are in the group */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
idx = NDATASETS + 3;
|
2003-06-23 21:25:06 +08:00
|
|
|
|
H5E_BEGIN_TRY {
|
[svn-r14224] Description:
Change H5Literate -> H5Literate_by_name and add simpler form of
H5Literate, to bring this routine into alignment with the other new API
routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 06:56:15 +08:00
|
|
|
|
ret = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info);
|
2005-08-14 04:53:35 +08:00
|
|
|
|
} H5E_END_TRY;
|
2007-08-31 04:03:37 +08:00
|
|
|
|
VERIFY(ret, FAIL, "H5Literate");
|
2003-06-23 21:25:06 +08:00
|
|
|
|
|
2000-04-06 04:51:44 +08:00
|
|
|
|
/* Test all objects in group, when callback always returns 0 */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
info.command = RET_ZERO;
|
|
|
|
|
idx = 0;
|
[svn-r14224] Description:
Change H5Literate -> H5Literate_by_name and add simpler form of
H5Literate, to bring this routine into alignment with the other new API
routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 06:56:15 +08:00
|
|
|
|
if((ret = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info)) > 0)
|
2004-01-10 09:41:13 +08:00
|
|
|
|
TestErrPrintf("Group iteration function didn't return zero correctly!\n");
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
/* Test all objects in group, when callback always returns 1 */
|
|
|
|
|
/* This also tests the "restarting" ability, because the index changes */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
info.command = RET_TWO;
|
|
|
|
|
idx = i = 0;
|
[svn-r14224] Description:
Change H5Literate -> H5Literate_by_name and add simpler form of
H5Literate, to bring this routine into alignment with the other new API
routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 06:56:15 +08:00
|
|
|
|
while((ret = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info)) > 0) {
|
2003-06-23 21:25:06 +08:00
|
|
|
|
/* Verify return value from iterator gets propagated correctly */
|
2007-08-31 04:03:37 +08:00
|
|
|
|
VERIFY(ret, 2, "H5Literate");
|
2003-06-23 21:25:06 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
/* Increment the number of times "2" is returned */
|
2000-04-06 04:51:44 +08:00
|
|
|
|
i++;
|
|
|
|
|
|
|
|
|
|
/* Verify that the index is the correct value */
|
2007-08-31 04:03:37 +08:00
|
|
|
|
VERIFY(idx, (hsize_t)i, "H5Literate");
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(idx > (NDATASETS + 2))
|
|
|
|
|
TestErrPrintf("Group iteration function walked too far!\n");
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
/* Verify that the correct name is retrieved */
|
2007-09-01 03:55:43 +08:00
|
|
|
|
if(HDstrcmp(info.name, lnames[(size_t)(idx - 1)]) != 0)
|
|
|
|
|
TestErrPrintf("Group iteration function didn't return name correctly for link - lnames[%u] = '%s'!\n", (unsigned)(idx - 1), lnames[(size_t)(idx - 1)]);
|
2006-10-02 18:24:03 +08:00
|
|
|
|
} /* end while */
|
2007-08-31 04:03:37 +08:00
|
|
|
|
VERIFY(ret, -1, "H5Literate");
|
2003-06-23 21:25:06 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(i != (NDATASETS + 2))
|
2007-02-13 22:50:48 +08:00
|
|
|
|
TestErrPrintf("%u: Group iteration function didn't perform multiple iterations correctly!\n", __LINE__);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
/* Test all objects in group, when callback changes return value */
|
|
|
|
|
/* This also tests the "restarting" ability, because the index changes */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
info.command = new_format ? RET_CHANGE2 : RET_CHANGE;
|
|
|
|
|
idx = i = 0;
|
[svn-r14224] Description:
Change H5Literate -> H5Literate_by_name and add simpler form of
H5Literate, to bring this routine into alignment with the other new API
routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 06:56:15 +08:00
|
|
|
|
while((ret = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info)) >= 0) {
|
2003-06-23 21:25:06 +08:00
|
|
|
|
/* Verify return value from iterator gets propagated correctly */
|
2007-08-31 04:03:37 +08:00
|
|
|
|
VERIFY(ret, 1, "H5Literate");
|
2003-06-23 21:25:06 +08:00
|
|
|
|
|
2000-04-06 04:51:44 +08:00
|
|
|
|
/* Increment the number of times "1" is returned */
|
|
|
|
|
i++;
|
|
|
|
|
|
|
|
|
|
/* Verify that the index is the correct value */
|
2007-08-31 04:03:37 +08:00
|
|
|
|
VERIFY(idx, (hsize_t)(i + 10), "H5Literate");
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(idx > (NDATASETS + 2))
|
|
|
|
|
TestErrPrintf("Group iteration function walked too far!\n");
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
/* Verify that the correct name is retrieved */
|
2007-09-01 03:55:43 +08:00
|
|
|
|
if(HDstrcmp(info.name, lnames[(size_t)(idx - 1)]) != 0)
|
|
|
|
|
TestErrPrintf("Group iteration function didn't return name correctly for link - lnames[%u] = '%s'!\n", (unsigned)(idx - 1), lnames[(size_t)(idx - 1)]);
|
2006-10-02 18:24:03 +08:00
|
|
|
|
} /* end while */
|
2007-08-31 04:03:37 +08:00
|
|
|
|
VERIFY(ret, -1, "H5Literate");
|
2003-06-23 21:25:06 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(i != 42 || idx != 52)
|
2007-02-13 22:50:48 +08:00
|
|
|
|
TestErrPrintf("%u: Group iteration function didn't perform multiple iterations correctly!\n", __LINE__);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
ret = H5Fclose(file);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Fclose");
|
|
|
|
|
|
|
|
|
|
/* Free the dataset names */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
for(i = 0; i< (NDATASETS + 2); i++)
|
|
|
|
|
HDfree(lnames[i]);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
} /* test_iter_group() */
|
|
|
|
|
|
|
|
|
|
/****************************************************************
|
|
|
|
|
**
|
|
|
|
|
** aiter_cb(): Custom group iteration callback routine.
|
2005-08-14 04:53:35 +08:00
|
|
|
|
**
|
2000-04-06 04:51:44 +08:00
|
|
|
|
****************************************************************/
|
2006-10-02 18:24:03 +08:00
|
|
|
|
herr_t
|
2007-10-04 23:06:28 +08:00
|
|
|
|
aiter_cb(hid_t UNUSED group, const char *name, const H5A_info_t UNUSED *ainfo,
|
|
|
|
|
void *op_data)
|
2000-04-06 04:51:44 +08:00
|
|
|
|
{
|
2006-10-02 18:24:03 +08:00
|
|
|
|
iter_info *info = (iter_info *)op_data;
|
|
|
|
|
static int count = 0;
|
|
|
|
|
static int count2 = 0;
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
HDstrcpy(info->name, name);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
switch(info->command) {
|
|
|
|
|
case RET_ZERO:
|
|
|
|
|
return(0);
|
|
|
|
|
|
2003-06-23 21:25:06 +08:00
|
|
|
|
case RET_TWO:
|
|
|
|
|
return(2);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
case RET_CHANGE:
|
|
|
|
|
count++;
|
2006-12-19 09:59:28 +08:00
|
|
|
|
return(count > 10 ? 1 : 0);
|
2006-10-02 18:24:03 +08:00
|
|
|
|
|
|
|
|
|
case RET_CHANGE2:
|
|
|
|
|
count2++;
|
2006-12-19 09:59:28 +08:00
|
|
|
|
return(count2 > 10 ? 1 : 0);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
printf("invalid iteration command");
|
|
|
|
|
return(-1);
|
|
|
|
|
} /* end switch */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
} /* end aiter_cb() */
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
/****************************************************************
|
|
|
|
|
**
|
|
|
|
|
** test_iter_attr(): Test attribute iteration functionality
|
2005-08-14 04:53:35 +08:00
|
|
|
|
**
|
2000-04-06 04:51:44 +08:00
|
|
|
|
****************************************************************/
|
2006-10-02 18:24:03 +08:00
|
|
|
|
static void test_iter_attr(hid_t fapl, hbool_t new_format)
|
2000-04-06 04:51:44 +08:00
|
|
|
|
{
|
|
|
|
|
hid_t file; /* File ID */
|
|
|
|
|
hid_t dataset; /* Common Dataset ID */
|
|
|
|
|
hid_t filespace; /* Common dataspace ID */
|
|
|
|
|
hid_t attribute; /* Attribute ID */
|
|
|
|
|
int i; /* counting variable */
|
2007-10-04 23:06:28 +08:00
|
|
|
|
hsize_t idx; /* Index in the attribute list */
|
2000-04-06 04:51:44 +08:00
|
|
|
|
char name[NAMELEN]; /* temporary name buffer */
|
|
|
|
|
char *anames[NATTR]; /* Names of the attributes created */
|
|
|
|
|
iter_info info; /* Custom iteration information */
|
|
|
|
|
herr_t ret; /* Generic return value */
|
|
|
|
|
|
|
|
|
|
/* Output message about test being performed */
|
|
|
|
|
MESSAGE(5, ("Testing Attribute Iteration Functionality\n"));
|
|
|
|
|
|
|
|
|
|
/* Create the test file with the datasets */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
file = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
CHECK(file, FAIL, "H5Fcreate");
|
|
|
|
|
|
2007-10-04 23:06:28 +08:00
|
|
|
|
filespace = H5Screate(H5S_SCALAR);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
CHECK(filespace, FAIL, "H5Screate");
|
|
|
|
|
|
[svn-r14199] Description:
Add H5Dcreate to API versioned routines, replacing internal usage with
H5Dcreate2
Fix thread-safe error stack initialization for API versioned error
stack printing routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-12 00:24:11 +08:00
|
|
|
|
dataset = H5Dcreate2(file, "Dataset", H5T_NATIVE_INT, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
CHECK(dataset, FAIL, "H5Dcreate2");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2007-10-04 23:06:28 +08:00
|
|
|
|
for(i = 0; i < NATTR; i++) {
|
|
|
|
|
sprintf(name, "Attribute %02d", i);
|
[svn-r14218] Description:
Changed H5Acreate2 -> H5Acreate_by_name, to be more consistent with
other new API routines.
Re-added simpler form of H5Acreate2, which creates attributes directly
on an object.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 02:13:48 +08:00
|
|
|
|
attribute = H5Acreate2(dataset, name, H5T_NATIVE_INT, filespace, H5P_DEFAULT, H5P_DEFAULT);
|
[svn-r14187] Description:
Put H5Acreate() under API versioning, with all internal usage shifted
to H5Acreate2().
Add regression tests for H5Acreate1().
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-05 06:19:07 +08:00
|
|
|
|
CHECK(attribute, FAIL, "H5Acreate2");
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
/* Keep a copy of the attribute names around for later */
|
2007-10-04 23:06:28 +08:00
|
|
|
|
anames[i] = HDstrdup(name);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
CHECK(anames[i], NULL, "strdup");
|
|
|
|
|
|
2007-10-04 23:06:28 +08:00
|
|
|
|
ret = H5Aclose(attribute);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Aclose");
|
2007-10-04 23:06:28 +08:00
|
|
|
|
} /* end for */
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
/* Close everything up */
|
2007-10-04 23:06:28 +08:00
|
|
|
|
ret = H5Dclose(dataset);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Dclose");
|
|
|
|
|
|
2007-10-04 23:06:28 +08:00
|
|
|
|
ret = H5Sclose(filespace);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Sclose");
|
|
|
|
|
|
2007-10-04 23:06:28 +08:00
|
|
|
|
ret = H5Fclose(file);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Fclose");
|
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
2000-04-06 04:51:44 +08:00
|
|
|
|
/* Iterate through the attributes on the dataset in various ways */
|
2007-10-04 23:06:28 +08:00
|
|
|
|
file = H5Fopen(DATAFILE, H5F_ACC_RDONLY, fapl);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
CHECK(file, FAIL, "H5Fopen");
|
|
|
|
|
|
[svn-r14193] Description:
Make H5Dopen versioned and change all internal usage to use H5Dopen2
Add simple regression test for H5Dopen1
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-09 03:59:36 +08:00
|
|
|
|
dataset = H5Dopen2(file, "Dataset", H5P_DEFAULT);
|
|
|
|
|
CHECK(dataset, FAIL, "H5Dopen2");
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
2003-06-23 21:25:06 +08:00
|
|
|
|
/* Test invalid indices for starting iteration */
|
2007-10-04 23:06:28 +08:00
|
|
|
|
info.command = RET_ZERO;
|
2003-06-23 21:25:06 +08:00
|
|
|
|
|
|
|
|
|
/* Test skipping exactly as many attributes as there are */
|
2007-10-04 23:06:28 +08:00
|
|
|
|
idx = NATTR;
|
2003-06-23 21:25:06 +08:00
|
|
|
|
H5E_BEGIN_TRY {
|
[svn-r14220] Description:
Change H5Aiterate2 -> H5Aiterate_by_name to be more consistent with
other new API routine names
Re-add H5Aiterate2, to operate on a particular object
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 03:52:05 +08:00
|
|
|
|
ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, &idx, aiter_cb, &info);
|
2005-08-14 04:53:35 +08:00
|
|
|
|
} H5E_END_TRY;
|
2007-10-04 23:06:28 +08:00
|
|
|
|
VERIFY(ret, FAIL, "H5Aiterate2");
|
2003-06-23 21:25:06 +08:00
|
|
|
|
|
|
|
|
|
/* Test skipping more attributes than there are */
|
2007-10-04 23:06:28 +08:00
|
|
|
|
idx = NATTR + 1;
|
2003-06-23 21:25:06 +08:00
|
|
|
|
H5E_BEGIN_TRY {
|
[svn-r14220] Description:
Change H5Aiterate2 -> H5Aiterate_by_name to be more consistent with
other new API routine names
Re-add H5Aiterate2, to operate on a particular object
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 03:52:05 +08:00
|
|
|
|
ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, &idx, aiter_cb, &info);
|
2005-08-14 04:53:35 +08:00
|
|
|
|
} H5E_END_TRY;
|
2007-10-04 23:06:28 +08:00
|
|
|
|
VERIFY(ret, FAIL, "H5Aiterate2");
|
2003-06-23 21:25:06 +08:00
|
|
|
|
|
2000-04-06 04:51:44 +08:00
|
|
|
|
/* Test all attributes on dataset, when callback always returns 0 */
|
2007-02-13 22:50:48 +08:00
|
|
|
|
info.command = RET_ZERO;
|
|
|
|
|
idx = 0;
|
[svn-r14220] Description:
Change H5Aiterate2 -> H5Aiterate_by_name to be more consistent with
other new API routine names
Re-add H5Aiterate2, to operate on a particular object
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 03:52:05 +08:00
|
|
|
|
if((ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, &idx, aiter_cb, &info)) > 0)
|
2004-01-10 09:41:13 +08:00
|
|
|
|
TestErrPrintf("Attribute iteration function didn't return zero correctly!\n");
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
/* Test all attributes on dataset, when callback always returns 1 */
|
|
|
|
|
/* This also tests the "restarting" ability, because the index changes */
|
2007-02-13 22:50:48 +08:00
|
|
|
|
info.command = RET_TWO;
|
|
|
|
|
idx = i = 0;
|
[svn-r14220] Description:
Change H5Aiterate2 -> H5Aiterate_by_name to be more consistent with
other new API routine names
Re-add H5Aiterate2, to operate on a particular object
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 03:52:05 +08:00
|
|
|
|
while((ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, &idx, aiter_cb, &info)) > 0) {
|
2003-06-23 21:25:06 +08:00
|
|
|
|
/* Verify return value from iterator gets propagated correctly */
|
2007-10-04 23:06:28 +08:00
|
|
|
|
VERIFY(ret, 2, "H5Aiterate2");
|
2003-06-23 21:25:06 +08:00
|
|
|
|
|
2006-12-07 06:19:52 +08:00
|
|
|
|
/* Increment the number of times "2" is returned */
|
2000-04-06 04:51:44 +08:00
|
|
|
|
i++;
|
|
|
|
|
|
|
|
|
|
/* Verify that the index is the correct value */
|
2007-10-04 23:06:28 +08:00
|
|
|
|
VERIFY(idx, (unsigned)i, "H5Aiterate2");
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
2007-03-09 04:10:12 +08:00
|
|
|
|
/* Don't check name when new format is used */
|
|
|
|
|
if(!new_format) {
|
|
|
|
|
/* Verify that the correct name is retrieved */
|
2007-10-04 23:06:28 +08:00
|
|
|
|
if(HDstrcmp(info.name, anames[(size_t)idx - 1]) != 0)
|
|
|
|
|
TestErrPrintf("%u: Attribute iteration function didn't set names correctly, info.name = '%s', anames[%u] = '%s'!\n", __LINE__, info.name, (unsigned)(idx - 1), anames[(size_t)idx - 1]);
|
2007-03-09 04:10:12 +08:00
|
|
|
|
} /* end if */
|
2007-02-13 22:50:48 +08:00
|
|
|
|
} /* end while */
|
2007-10-04 23:06:28 +08:00
|
|
|
|
VERIFY(ret, -1, "H5Aiterate2");
|
2007-02-13 22:50:48 +08:00
|
|
|
|
if(i != 50 || idx != 50)
|
|
|
|
|
TestErrPrintf("%u: Attribute iteration function didn't perform multiple iterations correctly!\n", __LINE__);
|
2003-06-23 21:25:06 +08:00
|
|
|
|
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
/* Test all attributes on dataset, when callback changes return value */
|
|
|
|
|
/* This also tests the "restarting" ability, because the index changes */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
info.command = new_format ? RET_CHANGE2 : RET_CHANGE;
|
2007-02-13 22:50:48 +08:00
|
|
|
|
idx = i = 0;
|
[svn-r14220] Description:
Change H5Aiterate2 -> H5Aiterate_by_name to be more consistent with
other new API routine names
Re-add H5Aiterate2, to operate on a particular object
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 03:52:05 +08:00
|
|
|
|
while((ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, &idx, aiter_cb, &info)) > 0) {
|
2003-06-23 21:25:06 +08:00
|
|
|
|
/* Verify return value from iterator gets propagated correctly */
|
2007-10-04 23:06:28 +08:00
|
|
|
|
VERIFY(ret, 1, "H5Aiterate2");
|
2003-06-23 21:25:06 +08:00
|
|
|
|
|
2000-04-06 04:51:44 +08:00
|
|
|
|
/* Increment the number of times "1" is returned */
|
|
|
|
|
i++;
|
|
|
|
|
|
|
|
|
|
/* Verify that the index is the correct value */
|
2007-10-04 23:06:28 +08:00
|
|
|
|
VERIFY(idx, (unsigned)i + 10, "H5Aiterate2");
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
2007-03-09 04:10:12 +08:00
|
|
|
|
/* Don't check name when new format is used */
|
|
|
|
|
if(!new_format) {
|
|
|
|
|
/* Verify that the correct name is retrieved */
|
2007-10-04 23:06:28 +08:00
|
|
|
|
if(HDstrcmp(info.name, anames[(size_t)idx - 1]) != 0)
|
|
|
|
|
TestErrPrintf("%u: Attribute iteration function didn't set names correctly, info.name = '%s', anames[%u] = '%s'!\n", __LINE__, info.name, (unsigned)(idx - 1), anames[(size_t)idx - 1]);
|
2007-03-09 04:10:12 +08:00
|
|
|
|
} /* end if */
|
2007-02-13 22:50:48 +08:00
|
|
|
|
} /* end while */
|
2007-10-04 23:06:28 +08:00
|
|
|
|
VERIFY(ret, -1, "H5Aiterate2");
|
2007-02-13 22:50:48 +08:00
|
|
|
|
if(i != 40 || idx != 50)
|
|
|
|
|
TestErrPrintf("%u: Attribute iteration function didn't perform multiple iterations correctly!\n", __LINE__);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
ret=H5Fclose(file);
|
|
|
|
|
CHECK(ret, FAIL, "H5Fclose");
|
|
|
|
|
|
|
|
|
|
ret=H5Dclose(dataset);
|
|
|
|
|
CHECK(ret, FAIL, "H5Dclose");
|
|
|
|
|
|
|
|
|
|
/* Free the attribute names */
|
|
|
|
|
for(i=0; i< NATTR; i++)
|
2004-01-10 09:41:13 +08:00
|
|
|
|
HDfree(anames[i]);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
|
|
|
|
|
} /* test_iter_attr() */
|
|
|
|
|
|
2000-04-12 23:44:48 +08:00
|
|
|
|
/****************************************************************
|
|
|
|
|
**
|
|
|
|
|
** iter_strcmp2(): String comparison routine for qsort
|
2005-08-14 04:53:35 +08:00
|
|
|
|
**
|
2000-04-12 23:44:48 +08:00
|
|
|
|
****************************************************************/
|
|
|
|
|
int iter_strcmp2(const void *s1, const void *s2)
|
|
|
|
|
{
|
2006-12-07 06:19:52 +08:00
|
|
|
|
return(HDstrcmp((const char *)s1, (const char *)s2));
|
2006-10-02 18:24:03 +08:00
|
|
|
|
} /* end iter_strcmp2() */
|
2000-04-12 23:44:48 +08:00
|
|
|
|
|
|
|
|
|
/****************************************************************
|
|
|
|
|
**
|
2007-08-31 04:03:37 +08:00
|
|
|
|
** liter_cb2(): Custom link iteration callback routine.
|
2005-08-14 04:53:35 +08:00
|
|
|
|
**
|
2000-04-12 23:44:48 +08:00
|
|
|
|
****************************************************************/
|
2007-08-31 04:03:37 +08:00
|
|
|
|
static herr_t
|
|
|
|
|
liter_cb2(hid_t loc_id, const char *name, const H5L_info_t UNUSED *link_info,
|
|
|
|
|
void *opdata)
|
2000-04-12 23:44:48 +08:00
|
|
|
|
{
|
2006-10-02 18:24:03 +08:00
|
|
|
|
const iter_info *test_info = (const iter_info *)opdata;
|
2007-09-13 23:44:56 +08:00
|
|
|
|
H5O_info_t oinfo;
|
2006-10-02 18:24:03 +08:00
|
|
|
|
herr_t ret; /* Generic return value */
|
2000-04-12 23:44:48 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(HDstrcmp(name, test_info->name)) {
|
|
|
|
|
TestErrPrintf("name = '%s', test_info = '%s'\n", name, test_info->name);
|
2007-08-31 04:03:37 +08:00
|
|
|
|
return(H5_ITER_ERROR);
|
2000-04-12 23:44:48 +08:00
|
|
|
|
} /* end if */
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Get type of the object and check it.
|
|
|
|
|
*/
|
[svn-r14225] Description:
Change H5Oget_info -> H5Oget_info_by_name and re-add H5Oget_info in a
simpler form for querying a particular object, to align with other new API
routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 21:13:40 +08:00
|
|
|
|
ret = H5Oget_info_by_name(loc_id, name, &oinfo, H5P_DEFAULT);
|
|
|
|
|
CHECK(ret, FAIL, "H5Oget_info_by_name");
|
2000-04-12 23:44:48 +08:00
|
|
|
|
|
2007-09-13 23:44:56 +08:00
|
|
|
|
if(test_info->type != oinfo.type) {
|
|
|
|
|
TestErrPrintf("test_info->type = %d, oinfo.type = %d\n", test_info->type, (int)oinfo.type);
|
2007-08-31 04:03:37 +08:00
|
|
|
|
return(H5_ITER_ERROR);
|
2000-04-12 23:44:48 +08:00
|
|
|
|
} /* end if */
|
|
|
|
|
|
2007-08-31 04:03:37 +08:00
|
|
|
|
return(H5_ITER_STOP);
|
|
|
|
|
} /* liter_cb2() */
|
2000-04-12 23:44:48 +08:00
|
|
|
|
|
|
|
|
|
/****************************************************************
|
|
|
|
|
**
|
|
|
|
|
** test_iter_group_large(): Test group iteration functionality
|
|
|
|
|
** for groups with large #'s of objects
|
2005-08-14 04:53:35 +08:00
|
|
|
|
**
|
2000-04-12 23:44:48 +08:00
|
|
|
|
****************************************************************/
|
2007-08-31 04:03:37 +08:00
|
|
|
|
static void
|
|
|
|
|
test_iter_group_large(hid_t fapl)
|
2000-04-12 23:44:48 +08:00
|
|
|
|
{
|
|
|
|
|
hid_t file; /* HDF5 File IDs */
|
|
|
|
|
hid_t dataset; /* Dataset ID */
|
|
|
|
|
hid_t group; /* Group ID */
|
|
|
|
|
hid_t sid; /* Dataspace ID */
|
|
|
|
|
hid_t tid; /* Datatype ID */
|
|
|
|
|
hsize_t dims[] = {SPACE1_DIM1};
|
|
|
|
|
herr_t ret; /* Generic return value */
|
|
|
|
|
char gname[20]; /* Temporary group name */
|
2002-08-10 05:55:44 +08:00
|
|
|
|
iter_info names[ITER_NGROUPS+2]; /* Names of objects in the root group */
|
2000-04-12 23:44:48 +08:00
|
|
|
|
iter_info *curr_name; /* Pointer to the current name in the root group */
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
/* Compound datatype */
|
|
|
|
|
typedef struct s1_t {
|
|
|
|
|
unsigned int a;
|
|
|
|
|
unsigned int b;
|
|
|
|
|
float c;
|
|
|
|
|
} s1_t;
|
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
HDmemset(names, 0, sizeof names);
|
2000-05-19 00:40:20 +08:00
|
|
|
|
|
2000-04-12 23:44:48 +08:00
|
|
|
|
/* Output message about test being performed */
|
|
|
|
|
MESSAGE(5, ("Testing Large Group Iteration Functionality\n"));
|
|
|
|
|
|
|
|
|
|
/* Create file */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
file = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
|
2000-04-12 23:44:48 +08:00
|
|
|
|
CHECK(file, FAIL, "H5Fcreate");
|
|
|
|
|
|
|
|
|
|
/* Create dataspace for datasets */
|
|
|
|
|
sid = H5Screate_simple(SPACE1_RANK, dims, NULL);
|
|
|
|
|
CHECK(sid, FAIL, "H5Screate_simple");
|
|
|
|
|
|
|
|
|
|
/* Create a bunch of groups */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
for(i = 0; i < ITER_NGROUPS; i++) {
|
2005-08-14 04:53:35 +08:00
|
|
|
|
sprintf(gname, "Group_%d", i);
|
2000-04-12 23:44:48 +08:00
|
|
|
|
|
|
|
|
|
/* Add the name to the list of objects in the root group */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
HDstrcpy(names[i].name, gname);
|
[svn-r14154] Description:
Finish deprecating last H5G symbol (H5G_obj_t) - yay!
Lots of misc. library fixes to remove confusion between links and
objects. The tools could still use another pass, to remove h5trav_type_t type
and make the correct distinction between links & objects.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
AIX/32 5.3 (copper) w/FORTRAN, w/parallel, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-09-26 06:18:33 +08:00
|
|
|
|
names[i].type = H5O_TYPE_GROUP;
|
2000-04-12 23:44:48 +08:00
|
|
|
|
|
|
|
|
|
/* Create a group */
|
2007-08-24 04:25:25 +08:00
|
|
|
|
group = H5Gcreate2(file, gname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
CHECK(group, FAIL, "H5Gcreate2");
|
2000-04-12 23:44:48 +08:00
|
|
|
|
|
|
|
|
|
/* Close a group */
|
|
|
|
|
ret = H5Gclose(group);
|
|
|
|
|
CHECK(ret, FAIL, "H5Gclose");
|
2006-10-02 18:24:03 +08:00
|
|
|
|
} /* end for */
|
2000-04-12 23:44:48 +08:00
|
|
|
|
|
|
|
|
|
/* Create a dataset */
|
[svn-r14199] Description:
Add H5Dcreate to API versioned routines, replacing internal usage with
H5Dcreate2
Fix thread-safe error stack initialization for API versioned error
stack printing routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-12 00:24:11 +08:00
|
|
|
|
dataset = H5Dcreate2(file, "Dataset1", H5T_STD_U32LE, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
CHECK(dataset, FAIL, "H5Dcreate2");
|
2000-04-12 23:44:48 +08:00
|
|
|
|
|
|
|
|
|
/* Add the name to the list of objects in the root group */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
HDstrcpy(names[ITER_NGROUPS].name, "Dataset1");
|
[svn-r14154] Description:
Finish deprecating last H5G symbol (H5G_obj_t) - yay!
Lots of misc. library fixes to remove confusion between links and
objects. The tools could still use another pass, to remove h5trav_type_t type
and make the correct distinction between links & objects.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
AIX/32 5.3 (copper) w/FORTRAN, w/parallel, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-09-26 06:18:33 +08:00
|
|
|
|
names[ITER_NGROUPS].type = H5O_TYPE_DATASET;
|
2000-04-12 23:44:48 +08:00
|
|
|
|
|
|
|
|
|
/* Close Dataset */
|
|
|
|
|
ret = H5Dclose(dataset);
|
|
|
|
|
CHECK(ret, FAIL, "H5Dclose");
|
|
|
|
|
|
|
|
|
|
/* Close Dataspace */
|
|
|
|
|
ret = H5Sclose(sid);
|
|
|
|
|
CHECK(ret, FAIL, "H5Sclose");
|
|
|
|
|
|
|
|
|
|
/* Create a datatype */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
tid = H5Tcreate(H5T_COMPOUND, sizeof(s1_t));
|
2000-04-12 23:44:48 +08:00
|
|
|
|
CHECK(tid, FAIL, "H5Tcreate");
|
|
|
|
|
|
|
|
|
|
/* Insert fields */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
ret = H5Tinsert(tid, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT);
|
2000-04-12 23:44:48 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Tinsert");
|
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
ret = H5Tinsert(tid, "b", HOFFSET(s1_t, b), H5T_NATIVE_INT);
|
2000-04-12 23:44:48 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Tinsert");
|
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
ret = H5Tinsert(tid, "c", HOFFSET(s1_t, c), H5T_NATIVE_FLOAT);
|
2000-04-12 23:44:48 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Tinsert");
|
|
|
|
|
|
|
|
|
|
/* Save datatype for later */
|
[svn-r14156] Description:
Add API versioning to H5Tcommit()
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
AIX/32 5.3 (copper) w/FORTRAN, w/parallel, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-09-26 10:50:31 +08:00
|
|
|
|
ret = H5Tcommit2(file, "Datatype1", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
CHECK(ret, FAIL, "H5Tcommit2");
|
2000-04-12 23:44:48 +08:00
|
|
|
|
|
|
|
|
|
/* Add the name to the list of objects in the root group */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
HDstrcpy(names[ITER_NGROUPS + 1].name, "Datatype1");
|
[svn-r14154] Description:
Finish deprecating last H5G symbol (H5G_obj_t) - yay!
Lots of misc. library fixes to remove confusion between links and
objects. The tools could still use another pass, to remove h5trav_type_t type
and make the correct distinction between links & objects.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
AIX/32 5.3 (copper) w/FORTRAN, w/parallel, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-09-26 06:18:33 +08:00
|
|
|
|
names[ITER_NGROUPS + 1].type = H5O_TYPE_NAMED_DATATYPE;
|
2000-04-12 23:44:48 +08:00
|
|
|
|
|
|
|
|
|
/* Close datatype */
|
|
|
|
|
ret = H5Tclose(tid);
|
|
|
|
|
CHECK(ret, FAIL, "H5Tclose");
|
|
|
|
|
|
|
|
|
|
/* Need to sort the names in the root group, cause that's what the library does */
|
2006-10-31 04:00:57 +08:00
|
|
|
|
HDqsort(names, (size_t)(ITER_NGROUPS + 2), sizeof(iter_info), iter_strcmp2);
|
2000-04-12 23:44:48 +08:00
|
|
|
|
|
|
|
|
|
/* Iterate through the file to see members of the root group */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
curr_name = &names[0];
|
[svn-r14224] Description:
Change H5Literate -> H5Literate_by_name and add simpler form of
H5Literate, to bring this routine into alignment with the other new API
routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 06:56:15 +08:00
|
|
|
|
ret = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, NULL, liter_cb2, curr_name);
|
2007-08-31 04:03:37 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Literate");
|
|
|
|
|
for(i = 1; i < 100; i++) {
|
|
|
|
|
hsize_t idx = i;
|
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
curr_name = &names[i];
|
[svn-r14224] Description:
Change H5Literate -> H5Literate_by_name and add simpler form of
H5Literate, to bring this routine into alignment with the other new API
routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 06:56:15 +08:00
|
|
|
|
ret = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb2, curr_name);
|
2007-08-31 04:03:37 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Literate");
|
2000-04-12 23:44:48 +08:00
|
|
|
|
} /* end for */
|
|
|
|
|
|
|
|
|
|
/* Close file */
|
|
|
|
|
ret = H5Fclose(file);
|
|
|
|
|
CHECK(ret, FAIL, "H5Fclose");
|
|
|
|
|
} /* test_iterate_group_large() */
|
|
|
|
|
|
2002-11-26 01:59:14 +08:00
|
|
|
|
/****************************************************************
|
|
|
|
|
**
|
2005-08-14 04:53:35 +08:00
|
|
|
|
** test_grp_memb_funcs(): Test group member information
|
2002-11-26 01:59:14 +08:00
|
|
|
|
** functionality
|
2005-08-14 04:53:35 +08:00
|
|
|
|
**
|
2002-11-26 01:59:14 +08:00
|
|
|
|
****************************************************************/
|
2006-10-02 18:24:03 +08:00
|
|
|
|
static void test_grp_memb_funcs(hid_t fapl)
|
2002-11-26 01:59:14 +08:00
|
|
|
|
{
|
|
|
|
|
hid_t file; /* File ID */
|
|
|
|
|
hid_t dataset; /* Dataset ID */
|
|
|
|
|
hid_t datatype; /* Common datatype ID */
|
|
|
|
|
hid_t filespace; /* Common dataspace ID */
|
|
|
|
|
hid_t root_group,grp; /* Root group ID */
|
|
|
|
|
int i; /* counting variable */
|
|
|
|
|
char name[NAMELEN]; /* temporary name buffer */
|
|
|
|
|
char *dnames[NDATASETS+2];/* Names of the datasets created */
|
|
|
|
|
char *obj_names[NDATASETS+2];/* Names of the objects in group */
|
2003-08-27 02:35:37 +08:00
|
|
|
|
char dataset_name[NAMELEN]; /* dataset name */
|
|
|
|
|
ssize_t name_len; /* Length of object's name */
|
2007-09-06 23:54:22 +08:00
|
|
|
|
H5G_info_t ginfo; /* Buffer for querying object's info */
|
2002-11-26 01:59:14 +08:00
|
|
|
|
herr_t ret; /* Generic return value */
|
|
|
|
|
|
|
|
|
|
/* Output message about test being performed */
|
|
|
|
|
MESSAGE(5, ("Testing Group Member Information Functionality\n"));
|
|
|
|
|
|
|
|
|
|
/* Create the test file with the datasets */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
file = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
|
2002-11-26 01:59:14 +08:00
|
|
|
|
CHECK(file, FAIL, "H5Fcreate");
|
|
|
|
|
|
|
|
|
|
datatype = H5Tcopy(H5T_NATIVE_INT);
|
|
|
|
|
CHECK(datatype, FAIL, "H5Tcopy");
|
|
|
|
|
|
[svn-r14199] Description:
Add H5Dcreate to API versioned routines, replacing internal usage with
H5Dcreate2
Fix thread-safe error stack initialization for API versioned error
stack printing routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-12 00:24:11 +08:00
|
|
|
|
filespace = H5Screate(H5S_SCALAR);
|
2002-11-26 01:59:14 +08:00
|
|
|
|
CHECK(filespace, FAIL, "H5Screate");
|
|
|
|
|
|
[svn-r14199] Description:
Add H5Dcreate to API versioned routines, replacing internal usage with
H5Dcreate2
Fix thread-safe error stack initialization for API versioned error
stack printing routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-12 00:24:11 +08:00
|
|
|
|
for(i = 0; i < NDATASETS; i++) {
|
|
|
|
|
sprintf(name, "Dataset %d", i);
|
|
|
|
|
dataset = H5Dcreate2(file, name, datatype, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
CHECK(dataset, FAIL, "H5Dcreate2");
|
2002-11-26 01:59:14 +08:00
|
|
|
|
|
|
|
|
|
/* Keep a copy of the dataset names around for later */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
dnames[i] = HDstrdup(name);
|
2002-11-26 01:59:14 +08:00
|
|
|
|
CHECK(dnames[i], NULL, "strdup");
|
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
ret = H5Dclose(dataset);
|
2002-11-26 01:59:14 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Dclose");
|
2006-10-02 18:24:03 +08:00
|
|
|
|
} /* end for */
|
2002-11-26 01:59:14 +08:00
|
|
|
|
|
2007-09-14 02:26:12 +08:00
|
|
|
|
/* Create a group and named datatype under root group for testing */
|
2007-08-24 04:25:25 +08:00
|
|
|
|
grp = H5Gcreate2(file, "grp", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
CHECK(ret, FAIL, "H5Gcreate2");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
dnames[NDATASETS] = HDstrdup("grp");
|
2002-11-26 01:59:14 +08:00
|
|
|
|
CHECK(dnames[NDATASETS], NULL, "strdup");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
[svn-r14156] Description:
Add API versioning to H5Tcommit()
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
AIX/32 5.3 (copper) w/FORTRAN, w/parallel, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-09-26 10:50:31 +08:00
|
|
|
|
ret = H5Tcommit2(file, "dtype", datatype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
CHECK(ret, FAIL, "H5Tcommit2");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
dnames[NDATASETS + 1] = HDstrdup("dtype");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
CHECK(dnames[NDATASETS], NULL, "strdup");
|
|
|
|
|
|
2002-11-26 01:59:14 +08:00
|
|
|
|
/* Close everything up */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
ret = H5Tclose(datatype);
|
2002-11-26 01:59:14 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Tclose");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
ret = H5Gclose(grp);
|
2002-11-26 01:59:14 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Gclose");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
ret = H5Sclose(filespace);
|
2002-11-26 01:59:14 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Sclose");
|
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
ret = H5Fclose(file);
|
2002-11-26 01:59:14 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Fclose");
|
|
|
|
|
|
|
|
|
|
/* Sort the dataset names */
|
2006-10-31 04:00:57 +08:00
|
|
|
|
HDqsort(dnames, (size_t)(NDATASETS + 2), sizeof(char *), iter_strcmp);
|
2002-11-26 01:59:14 +08:00
|
|
|
|
|
|
|
|
|
/* Iterate through the datasets in the root group in various ways */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
file = H5Fopen(DATAFILE, H5F_ACC_RDONLY, fapl);
|
2002-11-26 01:59:14 +08:00
|
|
|
|
CHECK(file, FAIL, "H5Fopen");
|
|
|
|
|
|
2007-09-14 02:26:12 +08:00
|
|
|
|
/* These two functions, H5Oget_info_by_idx and H5Lget_name_by_idx, actually
|
2002-11-26 01:59:14 +08:00
|
|
|
|
* iterate through B-tree for group members in internal library design.
|
|
|
|
|
*/
|
2007-08-28 23:02:54 +08:00
|
|
|
|
root_group = H5Gopen2(file, "/", H5P_DEFAULT);
|
|
|
|
|
CHECK(root_group, FAIL, "H5Gopen2");
|
2002-11-26 01:59:14 +08:00
|
|
|
|
|
[svn-r14223] Description:
Change existing H5Gget_info -> H5Gget_info_by_name and add new version
of H5Gget_info, with simpler parameters, to better match new API routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 05:57:50 +08:00
|
|
|
|
ret = H5Gget_info(root_group, &ginfo);
|
2007-09-06 23:54:22 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Gget_info");
|
|
|
|
|
VERIFY(ginfo.nlinks, (NDATASETS + 2), "H5Gget_info");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2007-09-14 02:26:12 +08:00
|
|
|
|
for(i = 0; i < (int)ginfo.nlinks; i++) {
|
|
|
|
|
H5O_info_t oinfo; /* Object info */
|
2003-07-08 03:02:46 +08:00
|
|
|
|
|
2003-08-27 02:35:37 +08:00
|
|
|
|
/* Test with NULL for name, to query length */
|
2007-09-14 01:04:36 +08:00
|
|
|
|
name_len = H5Lget_name_by_idx(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, NULL, (size_t)NAMELEN, H5P_DEFAULT);
|
|
|
|
|
CHECK(name_len, FAIL, "H5Lget_name_by_idx");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2007-09-14 01:04:36 +08:00
|
|
|
|
ret = (herr_t)H5Lget_name_by_idx(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, dataset_name, (size_t)(name_len + 1), H5P_DEFAULT);
|
|
|
|
|
CHECK(ret, FAIL, "H5Lget_name_by_idx");
|
2003-08-27 02:35:37 +08:00
|
|
|
|
|
|
|
|
|
/* Double-check that the length is the same */
|
2007-09-14 01:04:36 +08:00
|
|
|
|
VERIFY(ret, name_len, "H5Lget_name_by_idx");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2002-11-26 01:59:14 +08:00
|
|
|
|
/* Keep a copy of the dataset names around for later */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
obj_names[i] = HDstrdup(dataset_name);
|
2003-08-27 02:35:37 +08:00
|
|
|
|
CHECK(obj_names[i], NULL, "strdup");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2007-09-14 02:26:12 +08:00
|
|
|
|
ret = H5Oget_info_by_idx(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, &oinfo, H5P_DEFAULT);
|
|
|
|
|
CHECK(ret, FAIL, "H5Oget_info_by_idx");
|
2002-11-26 01:59:14 +08:00
|
|
|
|
|
|
|
|
|
if(!HDstrcmp(dataset_name, "grp"))
|
2007-09-14 02:26:12 +08:00
|
|
|
|
VERIFY(oinfo.type, H5O_TYPE_GROUP, "H5Lget_name_by_idx");
|
2002-11-26 01:59:14 +08:00
|
|
|
|
if(!HDstrcmp(dataset_name, "dtype"))
|
2007-09-14 02:26:12 +08:00
|
|
|
|
VERIFY(oinfo.type, H5O_TYPE_NAMED_DATATYPE, "H5Lget_name_by_idx");
|
2006-10-31 08:13:27 +08:00
|
|
|
|
if(!HDstrncmp(dataset_name, "Dataset", (size_t)7))
|
2007-09-14 02:26:12 +08:00
|
|
|
|
VERIFY(oinfo.type, H5O_TYPE_DATASET, "H5Lget_name_by_idx");
|
2006-10-02 18:24:03 +08:00
|
|
|
|
} /* end for */
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2002-11-26 01:59:14 +08:00
|
|
|
|
H5E_BEGIN_TRY {
|
2007-09-14 01:04:36 +08:00
|
|
|
|
ret = (herr_t)H5Lget_name_by_idx(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)(NDATASETS+3), dataset_name, (size_t)NAMELEN, H5P_DEFAULT);
|
2005-08-14 04:53:35 +08:00
|
|
|
|
} H5E_END_TRY;
|
2007-09-14 01:04:36 +08:00
|
|
|
|
VERIFY(ret, FAIL, "H5Lget_name_by_idx");
|
2002-11-26 01:59:14 +08:00
|
|
|
|
|
|
|
|
|
/* Sort the dataset names */
|
2006-10-31 04:00:57 +08:00
|
|
|
|
HDqsort(obj_names, (size_t)(NDATASETS + 2), sizeof(char *), iter_strcmp);
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2002-11-26 01:59:14 +08:00
|
|
|
|
/* Compare object names */
|
2007-09-06 23:54:22 +08:00
|
|
|
|
for(i = 0; i< (int)ginfo.nlinks; i++) {
|
2002-11-26 01:59:14 +08:00
|
|
|
|
ret = HDstrcmp(dnames[i], obj_names[i]);
|
|
|
|
|
VERIFY(ret, 0, "HDstrcmp");
|
2006-10-02 18:24:03 +08:00
|
|
|
|
} /* end for */
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2002-11-26 01:59:14 +08:00
|
|
|
|
ret = H5Gclose(root_group);
|
|
|
|
|
CHECK(ret, FAIL, "H5Gclose");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2002-11-26 01:59:14 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
ret = H5Fclose(file);
|
2002-11-26 01:59:14 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Fclose");
|
|
|
|
|
|
|
|
|
|
/* Free the dataset names */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
for(i = 0; i< (NDATASETS + 2); i++) {
|
|
|
|
|
HDfree(dnames[i]);
|
|
|
|
|
HDfree(obj_names[i]);
|
|
|
|
|
} /* end for */
|
2002-11-26 01:59:14 +08:00
|
|
|
|
} /* test_grp_memb_funcs() */
|
|
|
|
|
|
2004-06-23 05:08:56 +08:00
|
|
|
|
/****************************************************************
|
|
|
|
|
**
|
|
|
|
|
** test_links(): Test soft and hard link iteration
|
2005-08-14 04:53:35 +08:00
|
|
|
|
**
|
2004-06-23 05:08:56 +08:00
|
|
|
|
****************************************************************/
|
2006-10-02 18:24:03 +08:00
|
|
|
|
static void test_links(hid_t fapl)
|
2004-06-23 05:08:56 +08:00
|
|
|
|
{
|
|
|
|
|
hid_t file; /* File ID */
|
|
|
|
|
char obj_name[NAMELEN]; /* Names of the object in group */
|
|
|
|
|
ssize_t name_len; /* Length of object's name */
|
|
|
|
|
hid_t gid, gid1;
|
2007-09-06 23:54:22 +08:00
|
|
|
|
H5G_info_t ginfo; /* Buffer for querying object's info */
|
|
|
|
|
hsize_t i;
|
|
|
|
|
herr_t ret; /* Generic return value */
|
2004-06-23 05:08:56 +08:00
|
|
|
|
|
|
|
|
|
/* Output message about test being performed */
|
|
|
|
|
MESSAGE(5, ("Testing Soft and Hard Link Iteration Functionality\n"));
|
|
|
|
|
|
|
|
|
|
/* Create the test file with the datasets */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
file = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
|
2004-06-23 05:08:56 +08:00
|
|
|
|
CHECK(file, FAIL, "H5Fcreate");
|
|
|
|
|
|
|
|
|
|
/* create groups */
|
2007-08-24 04:25:25 +08:00
|
|
|
|
gid = H5Gcreate2(file, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
CHECK(gid, FAIL, "H5Gcreate2");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2007-08-24 04:25:25 +08:00
|
|
|
|
gid1 = H5Gcreate2(file, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
CHECK(gid1, FAIL, "H5Gcreate2");
|
2004-06-23 05:08:56 +08:00
|
|
|
|
|
|
|
|
|
/* create soft and hard links to the group "/g1". */
|
2007-08-29 05:31:57 +08:00
|
|
|
|
ret = H5Lcreate_soft("something", gid, "softlink", H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
CHECK(ret, FAIL, "H5Lcreate_soft");
|
2004-06-23 05:08:56 +08:00
|
|
|
|
|
2007-08-29 05:31:57 +08:00
|
|
|
|
ret = H5Lcreate_hard(gid, "/g1", H5L_SAME_LOC, "hardlink", H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
CHECK(ret, FAIL, "H5Lcreate_hard");
|
2004-06-23 05:08:56 +08:00
|
|
|
|
|
[svn-r14223] Description:
Change existing H5Gget_info -> H5Gget_info_by_name and add new version
of H5Gget_info, with simpler parameters, to better match new API routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 05:57:50 +08:00
|
|
|
|
ret = H5Gget_info(gid, &ginfo);
|
2007-09-06 23:54:22 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Gget_info");
|
|
|
|
|
VERIFY(ginfo.nlinks, 3, "H5Gget_info");
|
2004-06-23 05:08:56 +08:00
|
|
|
|
|
2007-09-14 02:26:12 +08:00
|
|
|
|
/* Test these two functions, H5Oget_info_by_idx and H5Lget_name_by_idx */
|
2007-09-06 23:54:22 +08:00
|
|
|
|
for(i = 0; i < ginfo.nlinks; i++) {
|
2007-09-14 02:26:12 +08:00
|
|
|
|
H5O_info_t oinfo; /* Object info */
|
|
|
|
|
H5L_info_t linfo; /* Link info */
|
|
|
|
|
|
|
|
|
|
/* Get link name */
|
2007-09-14 01:04:36 +08:00
|
|
|
|
name_len = H5Lget_name_by_idx(gid, ".", H5_INDEX_NAME, H5_ITER_INC, i, obj_name, (size_t)NAMELEN, H5P_DEFAULT);
|
|
|
|
|
CHECK(name_len, FAIL, "H5Lget_name_by_idx");
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2007-09-14 02:26:12 +08:00
|
|
|
|
/* Get link type */
|
|
|
|
|
ret = H5Lget_info_by_idx(gid, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, &linfo, H5P_DEFAULT);
|
|
|
|
|
CHECK(ret, FAIL, "H5Lget_info_by_idx");
|
|
|
|
|
|
|
|
|
|
/* Get object type */
|
|
|
|
|
if(linfo.type == H5L_TYPE_HARD) {
|
|
|
|
|
ret = H5Oget_info_by_idx(gid, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, &oinfo, H5P_DEFAULT);
|
|
|
|
|
CHECK(ret, FAIL, "H5Oget_info_by_idx");
|
|
|
|
|
} /* end if */
|
2004-06-23 05:08:56 +08:00
|
|
|
|
|
|
|
|
|
if(!HDstrcmp(obj_name, "g1.1"))
|
2007-09-14 02:26:12 +08:00
|
|
|
|
VERIFY(oinfo.type, H5O_TYPE_GROUP, "H5Lget_name_by_idx");
|
2004-06-23 05:08:56 +08:00
|
|
|
|
else if(!HDstrcmp(obj_name, "hardlink"))
|
2007-09-14 02:26:12 +08:00
|
|
|
|
VERIFY(oinfo.type, H5O_TYPE_GROUP, "H5Lget_name_by_idx");
|
2004-06-23 05:08:56 +08:00
|
|
|
|
else if(!HDstrcmp(obj_name, "softlink"))
|
2007-09-14 02:26:12 +08:00
|
|
|
|
VERIFY(linfo.type, H5L_TYPE_SOFT, "H5Lget_name_by_idx");
|
2004-06-23 05:08:56 +08:00
|
|
|
|
else
|
|
|
|
|
CHECK(0, 0, "unknown object name");
|
2007-09-14 02:26:12 +08:00
|
|
|
|
} /* end for */
|
2004-06-23 05:08:56 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
ret = H5Gclose(gid);
|
2004-06-23 05:08:56 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Gclose");
|
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
ret = H5Gclose(gid1);
|
2004-06-23 05:08:56 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Gclose");
|
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
ret = H5Fclose(file);
|
2004-06-23 05:08:56 +08:00
|
|
|
|
CHECK(ret, FAIL, "H5Fclose");
|
|
|
|
|
} /* test_links() */
|
2004-07-17 04:48:40 +08:00
|
|
|
|
|
2000-04-06 04:51:44 +08:00
|
|
|
|
/****************************************************************
|
|
|
|
|
**
|
|
|
|
|
** test_iterate(): Main iteration testing routine.
|
2005-08-14 04:53:35 +08:00
|
|
|
|
**
|
2000-04-06 04:51:44 +08:00
|
|
|
|
****************************************************************/
|
2005-08-14 04:53:35 +08:00
|
|
|
|
void
|
2000-04-06 04:51:44 +08:00
|
|
|
|
test_iterate(void)
|
|
|
|
|
{
|
2006-10-02 18:24:03 +08:00
|
|
|
|
hid_t fapl, fapl2; /* File access property lists */
|
|
|
|
|
hbool_t new_format; /* Whether to use the new format or not */
|
|
|
|
|
herr_t ret; /* Generic return value */
|
|
|
|
|
|
2000-04-06 04:51:44 +08:00
|
|
|
|
/* Output message about test being performed */
|
|
|
|
|
MESSAGE(5, ("Testing Iteration Operations\n"));
|
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
/* Get the default FAPL */
|
|
|
|
|
fapl = H5Pcreate(H5P_FILE_ACCESS);
|
|
|
|
|
CHECK(fapl, FAIL, "H5Pcreate");
|
|
|
|
|
|
|
|
|
|
/* Copy the file access property list */
|
|
|
|
|
fapl2 = H5Pcopy(fapl);
|
|
|
|
|
CHECK(fapl2, FAIL, "H5Pcopy");
|
|
|
|
|
|
[svn-r14362] Description:
Switched from "H5P[gs]et_latest_format" to "H5P[gs]et_format_bounds".
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
Linux/64-ia64 2.4 (tg-login3) w/parallel, w/FORTRAN, in production mode
2008-01-03 21:55:39 +08:00
|
|
|
|
/* Set the "use the latest version of the format" bounds for creating objects in the file */
|
[svn-r14413] Description:
Change H5P[gs]et_format_bounds() => H5P[gs]et_libver_bounds() and also
enumerated values H5F_FORMAT_{EARLIEST, LATEST} => H5F_LIBVER_{EARLIEST, LATEST}
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
Linux/64-ia64 2.4 (tg-login3) w/parallel, w/FORTRAN, in production mode
2008-01-15 07:49:12 +08:00
|
|
|
|
ret = H5Pset_libver_bounds(fapl2, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
|
|
|
|
|
CHECK(ret, FAIL, "H5Pset_libver_bounds");
|
2006-10-02 18:24:03 +08:00
|
|
|
|
|
2000-04-06 04:51:44 +08:00
|
|
|
|
/* These next tests use the same file */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
for(new_format = FALSE; new_format <= TRUE; new_format++) {
|
|
|
|
|
test_iter_group(new_format ? fapl2 : fapl, new_format); /* Test group iteration */
|
|
|
|
|
test_iter_group_large(new_format ? fapl2 : fapl); /* Test group iteration for large # of objects */
|
|
|
|
|
test_iter_attr(new_format ? fapl2 : fapl, new_format); /* Test attribute iteration */
|
|
|
|
|
test_grp_memb_funcs(new_format ? fapl2 : fapl); /* Test group member information functions */
|
|
|
|
|
test_links(new_format ? fapl2 : fapl); /* Test soft and hard link iteration */
|
|
|
|
|
} /* end for */
|
|
|
|
|
|
|
|
|
|
/* Close FAPLs */
|
|
|
|
|
ret = H5Pclose(fapl);
|
|
|
|
|
CHECK(ret, FAIL, "H5Pclose");
|
|
|
|
|
ret = H5Pclose(fapl2);
|
|
|
|
|
CHECK(ret, FAIL, "H5Pclose");
|
2000-04-06 04:51:44 +08:00
|
|
|
|
} /* test_iterate() */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: cleanup_iterate
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Cleanup temporary test files
|
|
|
|
|
*
|
|
|
|
|
* Return: none
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Quincey Koziol
|
|
|
|
|
* April 5, 2000
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
cleanup_iterate(void)
|
|
|
|
|
{
|
2001-04-01 11:25:53 +08:00
|
|
|
|
remove(DATAFILE);
|
2000-04-06 04:51:44 +08:00
|
|
|
|
}
|
|
|
|
|
|