1997-12-11 06:41:56 +08:00
|
|
|
|
/*
|
|
|
|
|
* Copyright (C) 1997 NCSA
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* All rights reserved.
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Programmer: Robb Matzke <matzke@llnl.gov>
|
|
|
|
|
* Tuesday, December 9, 1997
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Purpose: Tests the dataset interface (H5D)
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*/
|
1998-11-03 01:58:28 +08:00
|
|
|
|
|
2001-04-04 02:09:16 +08:00
|
|
|
|
#include "h5test.h"
|
1998-04-07 23:34:16 +08:00
|
|
|
|
|
1998-11-21 11:36:51 +08:00
|
|
|
|
const char *FILENAME[] = {
|
|
|
|
|
"dataset",
|
|
|
|
|
NULL
|
|
|
|
|
};
|
1998-03-06 05:27:38 +08:00
|
|
|
|
|
|
|
|
|
#define DSET_DEFAULT_NAME "default"
|
|
|
|
|
#define DSET_CHUNKED_NAME "chunked"
|
|
|
|
|
#define DSET_SIMPLE_IO_NAME "simple_io"
|
|
|
|
|
#define DSET_TCONV_NAME "tconv"
|
1998-04-18 05:29:43 +08:00
|
|
|
|
#define DSET_COMPRESS_NAME "compressed"
|
1998-04-22 04:32:07 +08:00
|
|
|
|
#define DSET_BOGUS_NAME "bogus"
|
|
|
|
|
|
1998-08-06 06:22:59 +08:00
|
|
|
|
#define H5Z_BOGUS 305
|
1998-03-06 05:27:38 +08:00
|
|
|
|
|
2001-04-01 11:27:34 +08:00
|
|
|
|
/* Shared global arrays */
|
|
|
|
|
int points[100][200], check[100][200];
|
|
|
|
|
|
1997-12-11 06:41:56 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Function: test_create
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Purpose: Attempts to create a dataset.
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Return: Success: 0
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Failure: -1
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Tuesday, December 9, 1997
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static herr_t
|
1998-01-17 06:23:43 +08:00
|
|
|
|
test_create(hid_t file)
|
1997-12-11 06:41:56 +08:00
|
|
|
|
{
|
1998-03-06 05:27:38 +08:00
|
|
|
|
hid_t dataset, space, create_parms;
|
1998-04-09 05:43:02 +08:00
|
|
|
|
hsize_t dims[2];
|
1998-03-06 05:27:38 +08:00
|
|
|
|
herr_t status;
|
1998-04-09 05:43:02 +08:00
|
|
|
|
hsize_t csize[2];
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
1998-11-21 11:36:51 +08:00
|
|
|
|
TESTING("create, open, close");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
/* Create the data space */
|
|
|
|
|
dims[0] = 256;
|
|
|
|
|
dims[1] = 512;
|
1998-02-26 02:48:33 +08:00
|
|
|
|
space = H5Screate_simple(2, dims, NULL);
|
1998-03-05 00:20:23 +08:00
|
|
|
|
assert(space>=0);
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
/*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Create a dataset using the default dataset creation properties. We're
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* not sure what they are, so we won't check.
|
|
|
|
|
*/
|
|
|
|
|
dataset = H5Dcreate(file, DSET_DEFAULT_NAME, H5T_NATIVE_DOUBLE, space,
|
1998-03-06 05:27:38 +08:00
|
|
|
|
H5P_DEFAULT);
|
|
|
|
|
if (dataset<0) goto error;
|
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/* Close the dataset */
|
1998-03-06 05:27:38 +08:00
|
|
|
|
if (H5Dclose(dataset) < 0) goto error;
|
1998-03-01 02:19:05 +08:00
|
|
|
|
|
1998-07-21 05:01:32 +08:00
|
|
|
|
/* Add a comment to the dataset */
|
|
|
|
|
status = H5Gset_comment(file, DSET_DEFAULT_NAME, "This is a dataset");
|
|
|
|
|
if (status<0) goto error;
|
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/*
|
|
|
|
|
* Try creating a dataset that already exists. This should fail since a
|
1998-03-01 02:19:05 +08:00
|
|
|
|
* dataset can only be created once. Temporarily turn off error
|
|
|
|
|
* reporting.
|
1998-01-17 06:23:43 +08:00
|
|
|
|
*/
|
1998-11-21 11:36:51 +08:00
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
dataset = H5Dcreate(file, DSET_DEFAULT_NAME, H5T_NATIVE_DOUBLE, space,
|
|
|
|
|
H5P_DEFAULT);
|
|
|
|
|
} H5E_END_TRY;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
if (dataset >= 0) {
|
2001-01-26 01:03:29 +08:00
|
|
|
|
H5_FAILED();
|
1998-11-21 11:36:51 +08:00
|
|
|
|
puts(" Library allowed overwrite of existing dataset.");
|
1998-03-06 05:27:38 +08:00
|
|
|
|
goto error;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
1998-03-01 02:19:05 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/*
|
|
|
|
|
* Open the dataset we created above and then close it. This is how
|
|
|
|
|
* existing datasets are accessed.
|
|
|
|
|
*/
|
1998-03-06 05:27:38 +08:00
|
|
|
|
if ((dataset = H5Dopen(file, DSET_DEFAULT_NAME))<0) goto error;
|
|
|
|
|
if (H5Dclose(dataset) < 0) goto error;
|
1998-03-01 02:19:05 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/*
|
|
|
|
|
* Try opening a non-existent dataset. This should fail since new datasets
|
1998-03-01 02:19:05 +08:00
|
|
|
|
* cannot be created with this function. Temporarily turn off error
|
|
|
|
|
* reporting.
|
1998-01-17 06:23:43 +08:00
|
|
|
|
*/
|
1998-11-21 11:36:51 +08:00
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
dataset = H5Dopen(file, "does_not_exist");
|
|
|
|
|
} H5E_END_TRY;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
if (dataset >= 0) {
|
2001-01-26 01:03:29 +08:00
|
|
|
|
H5_FAILED();
|
1998-11-21 11:36:51 +08:00
|
|
|
|
puts(" Opened a non-existent dataset.");
|
1998-03-06 05:27:38 +08:00
|
|
|
|
goto error;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
1998-03-06 05:27:38 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/*
|
|
|
|
|
* Create a new dataset that uses chunked storage instead of the default
|
|
|
|
|
* layout.
|
|
|
|
|
*/
|
1998-02-26 03:13:49 +08:00
|
|
|
|
create_parms = H5Pcreate(H5P_DATASET_CREATE);
|
1998-01-17 06:23:43 +08:00
|
|
|
|
assert(create_parms >= 0);
|
2001-01-13 03:57:33 +08:00
|
|
|
|
|
|
|
|
|
/* Attempt to create a dataset with invalid chunk sizes */
|
|
|
|
|
csize[0] = dims[0]*2;
|
|
|
|
|
csize[1] = dims[1]*2;
|
|
|
|
|
status = H5Pset_chunk(create_parms, 2, csize);
|
|
|
|
|
assert(status >= 0);
|
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
dataset = H5Dcreate(file, DSET_CHUNKED_NAME, H5T_NATIVE_DOUBLE, space,
|
|
|
|
|
create_parms);
|
|
|
|
|
} H5E_END_TRY;
|
|
|
|
|
if (dataset >= 0) {
|
2001-01-26 01:03:29 +08:00
|
|
|
|
H5_FAILED();
|
2001-01-13 03:57:33 +08:00
|
|
|
|
puts(" Opened a dataset with incorrect chunking parameters.");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
csize[0] = 5;
|
|
|
|
|
csize[1] = 100;
|
1998-02-26 03:13:49 +08:00
|
|
|
|
status = H5Pset_chunk(create_parms, 2, csize);
|
1998-01-17 06:23:43 +08:00
|
|
|
|
assert(status >= 0);
|
|
|
|
|
|
|
|
|
|
dataset = H5Dcreate(file, DSET_CHUNKED_NAME, H5T_NATIVE_DOUBLE, space,
|
1998-03-06 05:27:38 +08:00
|
|
|
|
create_parms);
|
|
|
|
|
if (dataset < 0) goto error;
|
1998-05-01 13:16:50 +08:00
|
|
|
|
H5Pclose (create_parms);
|
1998-03-06 05:27:38 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/*
|
|
|
|
|
* Close the chunked dataset.
|
|
|
|
|
*/
|
1998-03-06 05:27:38 +08:00
|
|
|
|
if (H5Dclose(dataset) < 0) goto error;
|
|
|
|
|
|
1998-11-21 11:36:51 +08:00
|
|
|
|
PASSED();
|
1998-03-05 00:20:23 +08:00
|
|
|
|
return 0;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
1998-03-06 05:27:38 +08:00
|
|
|
|
error:
|
1998-03-05 00:20:23 +08:00
|
|
|
|
return -1;
|
1997-12-11 06:41:56 +08:00
|
|
|
|
}
|
1998-03-06 05:27:38 +08:00
|
|
|
|
|
1997-12-11 06:41:56 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Function: test_simple_io
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Purpose: Tests simple I/O. That is, reading and writing a complete
|
|
|
|
|
* multi-dimensional array without data type or data space
|
|
|
|
|
* conversions, without compression, and stored contiguously.
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Return: Success: 0
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Failure: -1
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Wednesday, December 10, 1997
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static herr_t
|
1998-01-17 06:23:43 +08:00
|
|
|
|
test_simple_io(hid_t file)
|
1997-12-11 06:41:56 +08:00
|
|
|
|
{
|
1998-03-17 09:29:54 +08:00
|
|
|
|
hid_t dataset, space, xfer;
|
|
|
|
|
int i, j, n;
|
1998-04-09 05:43:02 +08:00
|
|
|
|
hsize_t dims[2];
|
1998-03-17 09:29:54 +08:00
|
|
|
|
void *tconv_buf = NULL;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
1998-11-21 11:36:51 +08:00
|
|
|
|
TESTING("simple I/O");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
/* Initialize the dataset */
|
|
|
|
|
for (i = n = 0; i < 100; i++) {
|
1999-07-18 08:00:22 +08:00
|
|
|
|
for (j = 0; j < 200; j++) {
|
1998-03-06 05:27:38 +08:00
|
|
|
|
points[i][j] = n++;
|
|
|
|
|
}
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Create the data space */
|
|
|
|
|
dims[0] = 100;
|
|
|
|
|
dims[1] = 200;
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if ((space = H5Screate_simple(2, dims, NULL))<0) goto error;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
1998-03-17 09:29:54 +08:00
|
|
|
|
/* Create a small conversion buffer to test strip mining */
|
|
|
|
|
tconv_buf = malloc (1000);
|
2001-09-27 04:29:35 +08:00
|
|
|
|
xfer = H5Pcreate (H5P_DATASET_XFER);
|
1998-03-17 09:29:54 +08:00
|
|
|
|
assert (xfer>=0);
|
2001-07-11 05:19:18 +08:00
|
|
|
|
if (H5Pset_buffer (xfer, 1000, tconv_buf, NULL)<0) goto error;
|
1998-03-17 09:29:54 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/* Create the dataset */
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if ((dataset = H5Dcreate(file, DSET_SIMPLE_IO_NAME, H5T_NATIVE_INT, space,
|
|
|
|
|
H5P_DEFAULT))<0) goto error;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
/* Write the data to the dataset */
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer, points)<0)
|
|
|
|
|
goto error;
|
1998-03-06 05:27:38 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/* Read the dataset back */
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer, check)<0)
|
|
|
|
|
goto error;
|
1998-03-06 05:27:38 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/* Check that the values read are the same as the values written */
|
|
|
|
|
for (i = 0; i < 100; i++) {
|
1998-03-06 05:27:38 +08:00
|
|
|
|
for (j = 0; j < 200; j++) {
|
|
|
|
|
if (points[i][j] != check[i][j]) {
|
2001-01-26 01:03:29 +08:00
|
|
|
|
H5_FAILED();
|
1998-11-21 11:36:51 +08:00
|
|
|
|
printf(" Read different values than written.\n");
|
|
|
|
|
printf(" At index %d,%d\n", i, j);
|
1998-03-06 05:27:38 +08:00
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
}
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
2001-09-27 04:29:35 +08:00
|
|
|
|
i=H5Pclose (xfer);
|
1998-01-17 06:23:43 +08:00
|
|
|
|
H5Dclose(dataset);
|
1998-05-01 13:16:50 +08:00
|
|
|
|
free (tconv_buf);
|
1998-11-21 11:36:51 +08:00
|
|
|
|
PASSED();
|
1998-03-05 00:20:23 +08:00
|
|
|
|
return 0;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
error:
|
1998-03-05 00:20:23 +08:00
|
|
|
|
return -1;
|
1997-12-11 06:41:56 +08:00
|
|
|
|
}
|
1998-01-15 03:42:59 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Function: test_tconv
|
1998-01-15 03:42:59 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Purpose: Test some simple data type conversion stuff.
|
1998-01-15 03:42:59 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Return: Success: 0
|
1998-01-15 03:42:59 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Failure: -1
|
1998-01-15 03:42:59 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Wednesday, January 14, 1998
|
1998-01-15 03:42:59 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static herr_t
|
1998-01-17 06:23:43 +08:00
|
|
|
|
test_tconv(hid_t file)
|
1998-01-15 03:42:59 +08:00
|
|
|
|
{
|
1998-03-05 00:20:23 +08:00
|
|
|
|
char *out=NULL, *in=NULL;
|
|
|
|
|
int i;
|
1998-04-09 05:43:02 +08:00
|
|
|
|
hsize_t dims[1];
|
1998-06-19 05:03:30 +08:00
|
|
|
|
hid_t space, dataset;
|
1998-02-13 00:39:09 +08:00
|
|
|
|
|
|
|
|
|
out = malloc (4*1000000);
|
|
|
|
|
assert (out);
|
|
|
|
|
in = malloc (4*1000000);
|
|
|
|
|
assert (in);
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
1998-11-21 11:36:51 +08:00
|
|
|
|
TESTING("data type conversion");
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/* Initialize the dataset */
|
1998-03-05 00:20:23 +08:00
|
|
|
|
for (i = 0; i < 1000000; i++) {
|
|
|
|
|
out[i*4+0] = 0x11;
|
|
|
|
|
out[i*4+1] = 0x22;
|
|
|
|
|
out[i*4+2] = 0x33;
|
|
|
|
|
out[i*4+3] = 0x44;
|
|
|
|
|
}
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
/* Create the data space */
|
|
|
|
|
dims[0] = 1000000;
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if ((space = H5Screate_simple (1, dims, NULL))<0) goto error;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
/* Create the data set */
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if ((dataset = H5Dcreate(file, DSET_TCONV_NAME, H5T_STD_I32LE, space,
|
|
|
|
|
H5P_DEFAULT))<0) goto error;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
/* Write the data to the dataset */
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (H5Dwrite(dataset, H5T_STD_I32LE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
|
|
|
|
|
out)<0) goto error;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
/* Read data with byte order conversion */
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (H5Dread(dataset, H5T_STD_I32BE, H5S_ALL, H5S_ALL, H5P_DEFAULT, in)<0)
|
|
|
|
|
goto error;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
/* Check */
|
|
|
|
|
for (i = 0; i < 1000000; i++) {
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (in[4*i+0]!=out[4*i+3] ||
|
|
|
|
|
in[4*i+1]!=out[4*i+2] ||
|
|
|
|
|
in[4*i+2]!=out[4*i+1] ||
|
|
|
|
|
in[4*i+3]!=out[4*i+0]) {
|
2001-01-26 01:03:29 +08:00
|
|
|
|
H5_FAILED();
|
1998-11-21 11:36:51 +08:00
|
|
|
|
puts(" Read with byte order conversion failed.");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (H5Dclose(dataset)<0) goto error;
|
1998-05-01 13:16:50 +08:00
|
|
|
|
free (out);
|
|
|
|
|
free (in);
|
1998-01-17 06:23:43 +08:00
|
|
|
|
puts(" PASSED");
|
1998-03-05 00:20:23 +08:00
|
|
|
|
return 0;
|
1998-11-21 11:36:51 +08:00
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
return -1;
|
1998-01-15 03:42:59 +08:00
|
|
|
|
}
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
1998-04-22 04:32:07 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: bogus
|
|
|
|
|
*
|
1998-08-06 06:22:59 +08:00
|
|
|
|
* Purpose: A bogus compression method that doesn't do anything.
|
1998-04-22 04:32:07 +08:00
|
|
|
|
*
|
1998-08-06 06:22:59 +08:00
|
|
|
|
* Return: Success: Data chunk size
|
1998-04-22 04:32:07 +08:00
|
|
|
|
*
|
|
|
|
|
* Failure: 0
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Tuesday, April 21, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static size_t
|
1999-04-16 03:57:50 +08:00
|
|
|
|
bogus(unsigned int UNUSED flags, size_t UNUSED cd_nelmts,
|
2001-09-26 01:46:32 +08:00
|
|
|
|
const unsigned int * UNUSED cd_values, size_t nbytes,
|
|
|
|
|
size_t * UNUSED buf_size, void ** UNUSED buf)
|
1998-04-22 04:32:07 +08:00
|
|
|
|
{
|
1998-08-06 06:22:59 +08:00
|
|
|
|
return nbytes;
|
1998-04-22 04:32:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: test_compression
|
|
|
|
|
*
|
1999-01-19 01:54:16 +08:00
|
|
|
|
* Purpose: Tests dataset compression. If compression is requested when
|
|
|
|
|
* it hasn't been compiled into the library (such as when
|
|
|
|
|
* updating an existing compressed dataset) then data is sent to
|
|
|
|
|
* the file uncompressed but no errors are returned.
|
1998-04-18 05:29:43 +08:00
|
|
|
|
*
|
|
|
|
|
* Return: Success: 0
|
|
|
|
|
*
|
|
|
|
|
* Failure: -1
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Wednesday, April 15, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static herr_t
|
|
|
|
|
test_compression(hid_t file)
|
|
|
|
|
{
|
|
|
|
|
hid_t dataset, space, xfer, dc;
|
1998-04-22 04:32:07 +08:00
|
|
|
|
const hsize_t size[2] = {100, 200};
|
|
|
|
|
const hsize_t chunk_size[2] = {2, 25};
|
|
|
|
|
const hssize_t hs_offset[2] = {7, 30};
|
|
|
|
|
const hsize_t hs_size[2] = {4, 50};
|
1999-01-19 01:54:16 +08:00
|
|
|
|
const char *not_supported;
|
1998-04-22 04:32:07 +08:00
|
|
|
|
|
|
|
|
|
hsize_t i, j, n;
|
1998-04-18 05:29:43 +08:00
|
|
|
|
void *tconv_buf = NULL;
|
|
|
|
|
|
1999-01-19 01:54:16 +08:00
|
|
|
|
not_supported = " Deflate compression is not supported.\n"
|
|
|
|
|
" The zlib was not found when hdf5 was configured.";
|
|
|
|
|
|
1998-11-21 11:36:51 +08:00
|
|
|
|
TESTING("compression (setup)");
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
|
|
|
|
/* Create the data space */
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if ((space = H5Screate_simple(2, size, NULL))<0) goto error;
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
1998-04-23 01:26:01 +08:00
|
|
|
|
/*
|
|
|
|
|
* Create a small conversion buffer to test strip mining. We
|
|
|
|
|
* might as well test all we can!
|
|
|
|
|
*/
|
2001-09-27 04:29:35 +08:00
|
|
|
|
if ((xfer = H5Pcreate (H5P_DATASET_XFER))<0) goto error;
|
1998-04-22 04:32:07 +08:00
|
|
|
|
tconv_buf = malloc (1000);
|
2001-07-11 05:19:18 +08:00
|
|
|
|
if (H5Pset_buffer (xfer, 1000, tconv_buf, NULL)<0) goto error;
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
|
|
|
|
/* Use chunked storage with compression */
|
2001-10-04 01:57:56 +08:00
|
|
|
|
if((dc = H5Pcreate(H5P_DATASET_CREATE))<0) goto error;
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (H5Pset_chunk (dc, 2, chunk_size)<0) goto error;
|
|
|
|
|
if (H5Pset_deflate (dc, 6)<0) goto error;
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
|
|
|
|
/* Create the dataset */
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if ((dataset = H5Dcreate(file, DSET_COMPRESS_NAME, H5T_NATIVE_INT, space,
|
|
|
|
|
dc))<0) goto error;
|
2001-01-04 09:32:22 +08:00
|
|
|
|
#if defined(H5_HAVE_COMPRESS2) && defined(H5_HAVE_ZLIB_H) && defined(H5_HAVE_LIBZ)
|
1998-11-21 11:36:51 +08:00
|
|
|
|
PASSED();
|
1999-01-19 01:54:16 +08:00
|
|
|
|
#else
|
|
|
|
|
SKIPPED();
|
|
|
|
|
puts(not_supported);
|
|
|
|
|
#endif
|
1998-04-22 04:32:07 +08:00
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------
|
|
|
|
|
* STEP 1: Read uninitialized data. It should be zero.
|
|
|
|
|
*----------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-11-21 11:36:51 +08:00
|
|
|
|
TESTING("compression (uninitialized read)");
|
1998-04-22 04:32:07 +08:00
|
|
|
|
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (H5Dread (dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer, check)<0)
|
|
|
|
|
goto error;
|
1998-04-22 04:32:07 +08:00
|
|
|
|
|
|
|
|
|
for (i=0; i<size[0]; i++) {
|
|
|
|
|
for (j=0; j<size[1]; j++) {
|
|
|
|
|
if (0!=check[i][j]) {
|
2001-01-26 01:03:29 +08:00
|
|
|
|
H5_FAILED();
|
1998-11-21 11:36:51 +08:00
|
|
|
|
printf(" Read a non-zero value.\n");
|
|
|
|
|
printf(" At index %lu,%lu\n",
|
1998-04-22 04:32:07 +08:00
|
|
|
|
(unsigned long)i, (unsigned long)j);
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-01-04 09:32:22 +08:00
|
|
|
|
#if defined(H5_HAVE_COMPRESS2) && defined(H5_HAVE_ZLIB_H) && defined(H5_HAVE_LIBZ)
|
1998-11-21 11:36:51 +08:00
|
|
|
|
PASSED();
|
1999-01-19 01:54:16 +08:00
|
|
|
|
#else
|
|
|
|
|
SKIPPED();
|
|
|
|
|
puts(not_supported);
|
|
|
|
|
#endif
|
1998-04-22 04:32:07 +08:00
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------
|
|
|
|
|
* STEP 2: Test compression by setting up a chunked dataset and writing
|
|
|
|
|
* to it.
|
|
|
|
|
*----------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-11-21 11:36:51 +08:00
|
|
|
|
TESTING("compression (write)");
|
1998-04-22 04:32:07 +08:00
|
|
|
|
|
|
|
|
|
for (i=n=0; i<size[0]; i++) {
|
|
|
|
|
for (j=0; j<size[1]; j++) {
|
2001-11-28 00:29:13 +08:00
|
|
|
|
points[i][j] = (int)(n++);
|
1998-04-22 04:32:07 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer, points)<0)
|
|
|
|
|
goto error;
|
2001-01-04 09:32:22 +08:00
|
|
|
|
#if defined(H5_HAVE_COMPRESS2) && defined(H5_HAVE_ZLIB_H) && defined(H5_HAVE_LIBZ)
|
1998-11-21 11:36:51 +08:00
|
|
|
|
PASSED();
|
1999-01-19 01:54:16 +08:00
|
|
|
|
#else
|
|
|
|
|
SKIPPED();
|
|
|
|
|
puts(not_supported);
|
|
|
|
|
#endif
|
1998-04-22 04:32:07 +08:00
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------
|
|
|
|
|
* STEP 3: Try to read the data we just wrote.
|
|
|
|
|
*----------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-11-21 11:36:51 +08:00
|
|
|
|
TESTING("compression (read)");
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
|
|
|
|
/* Read the dataset back */
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer, check)<0)
|
|
|
|
|
goto error;
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
|
|
|
|
/* Check that the values read are the same as the values written */
|
1998-04-22 04:32:07 +08:00
|
|
|
|
for (i=0; i<size[0]; i++) {
|
|
|
|
|
for (j=0; j<size[1]; j++) {
|
1998-04-18 05:29:43 +08:00
|
|
|
|
if (points[i][j] != check[i][j]) {
|
2001-01-26 01:03:29 +08:00
|
|
|
|
H5_FAILED();
|
1998-11-21 11:36:51 +08:00
|
|
|
|
printf(" Read different values than written.\n");
|
|
|
|
|
printf(" At index %lu,%lu\n",
|
1998-04-22 04:32:07 +08:00
|
|
|
|
(unsigned long)i, (unsigned long)j);
|
1998-04-18 05:29:43 +08:00
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-01-04 09:32:22 +08:00
|
|
|
|
#if defined(H5_HAVE_COMPRESS2) && defined(H5_HAVE_ZLIB_H) && defined(H5_HAVE_LIBZ)
|
1998-11-21 11:36:51 +08:00
|
|
|
|
PASSED();
|
1999-01-19 01:54:16 +08:00
|
|
|
|
#else
|
|
|
|
|
SKIPPED();
|
|
|
|
|
puts(not_supported);
|
|
|
|
|
#endif
|
1998-04-22 04:32:07 +08:00
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------
|
|
|
|
|
* STEP 4: Write new data over the top of the old data. The new data is
|
|
|
|
|
* random thus not very compressible, and will cause the chunks to move
|
|
|
|
|
* around as they grow. We only change values for the left half of the
|
|
|
|
|
* dataset although we rewrite the whole thing.
|
|
|
|
|
*----------------------------------------------------------------------
|
1998-04-18 05:29:43 +08:00
|
|
|
|
*/
|
1998-11-21 11:36:51 +08:00
|
|
|
|
TESTING("compression (modify)");
|
1998-04-22 04:32:07 +08:00
|
|
|
|
|
|
|
|
|
for (i=0; i<size[0]; i++) {
|
|
|
|
|
for (j=0; j<size[1]/2; j++) {
|
1998-04-18 05:29:43 +08:00
|
|
|
|
points[i][j] = rand ();
|
|
|
|
|
}
|
|
|
|
|
}
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (H5Dwrite (dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer, points)<0)
|
|
|
|
|
goto error;
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
|
|
|
|
/* Read the dataset back and check it */
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer, check)<0)
|
|
|
|
|
goto error;
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
|
|
|
|
/* Check that the values read are the same as the values written */
|
1998-04-22 04:32:07 +08:00
|
|
|
|
for (i=0; i<size[0]; i++) {
|
|
|
|
|
for (j=0; j<size[1]; j++) {
|
1998-04-18 05:29:43 +08:00
|
|
|
|
if (points[i][j] != check[i][j]) {
|
2001-01-26 01:03:29 +08:00
|
|
|
|
H5_FAILED();
|
1998-11-21 11:36:51 +08:00
|
|
|
|
printf(" Read different values than written.\n");
|
|
|
|
|
printf(" At index %lu,%lu\n",
|
1998-04-22 04:32:07 +08:00
|
|
|
|
(unsigned long)i, (unsigned long)j);
|
1998-04-18 05:29:43 +08:00
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-01-04 09:32:22 +08:00
|
|
|
|
#if defined(H5_HAVE_COMPRESS2) && defined(H5_HAVE_ZLIB_H) && defined(H5_HAVE_LIBZ)
|
1998-11-21 11:36:51 +08:00
|
|
|
|
PASSED();
|
1999-01-19 01:54:16 +08:00
|
|
|
|
#else
|
|
|
|
|
SKIPPED();
|
|
|
|
|
puts(not_supported);
|
|
|
|
|
#endif
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
1998-04-22 04:32:07 +08:00
|
|
|
|
/*----------------------------------------------------------------------
|
|
|
|
|
* STEP 5: Close the dataset and then open it and read it again. This
|
|
|
|
|
* insures that the compression message is picked up properly from the
|
|
|
|
|
* object header.
|
|
|
|
|
*----------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-11-21 11:36:51 +08:00
|
|
|
|
TESTING("compression (re-open)");
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (H5Dclose (dataset)<0) goto error;
|
|
|
|
|
if ((dataset = H5Dopen (file, DSET_COMPRESS_NAME))<0) goto error;
|
|
|
|
|
if (H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer, check)<0)
|
|
|
|
|
goto error;
|
1998-04-22 04:32:07 +08:00
|
|
|
|
|
|
|
|
|
/* Check that the values read are the same as the values written */
|
|
|
|
|
for (i=0; i<size[0]; i++) {
|
|
|
|
|
for (j=0; j<size[1]; j++) {
|
|
|
|
|
if (points[i][j] != check[i][j]) {
|
2001-01-26 01:03:29 +08:00
|
|
|
|
H5_FAILED();
|
1998-11-21 11:36:51 +08:00
|
|
|
|
printf(" Read different values than written.\n");
|
|
|
|
|
printf(" At index %lu,%lu\n",
|
1998-04-22 04:32:07 +08:00
|
|
|
|
(unsigned long)i, (unsigned long)j);
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-01-04 09:32:22 +08:00
|
|
|
|
#if defined(H5_HAVE_COMPRESS2) && defined(H5_HAVE_ZLIB_H) && defined(H5_HAVE_LIBZ)
|
1998-11-21 11:36:51 +08:00
|
|
|
|
PASSED();
|
1999-01-19 01:54:16 +08:00
|
|
|
|
#else
|
|
|
|
|
SKIPPED();
|
|
|
|
|
puts(not_supported);
|
|
|
|
|
#endif
|
|
|
|
|
|
1998-04-22 04:32:07 +08:00
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------
|
|
|
|
|
* STEP 6: Test partial I/O by writing to and then reading from a
|
|
|
|
|
* hyperslab of the dataset. The hyperslab does not line up on chunk
|
|
|
|
|
* boundaries (we know that case already works from above tests).
|
|
|
|
|
*----------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-11-21 11:36:51 +08:00
|
|
|
|
TESTING("compression (partial I/O)");
|
1998-04-22 04:32:07 +08:00
|
|
|
|
|
|
|
|
|
for (i=0; i<hs_size[0]; i++) {
|
|
|
|
|
for (j=0; j<hs_size[1]; j++) {
|
|
|
|
|
points[hs_offset[0]+i][hs_offset[1]+j] = rand ();
|
|
|
|
|
}
|
|
|
|
|
}
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (H5Sselect_hyperslab(space, H5S_SELECT_SET, hs_offset, NULL, hs_size,
|
|
|
|
|
NULL)<0) goto error;
|
|
|
|
|
if (H5Dwrite (dataset, H5T_NATIVE_INT, space, space, xfer, points)<0)
|
|
|
|
|
goto error;
|
|
|
|
|
if (H5Dread (dataset, H5T_NATIVE_INT, space, space, xfer, check)<0)
|
|
|
|
|
goto error;
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
1998-04-22 04:32:07 +08:00
|
|
|
|
/* Check that the values read are the same as the values written */
|
|
|
|
|
for (i=0; i<hs_size[0]; i++) {
|
|
|
|
|
for (j=0; j<hs_size[1]; j++) {
|
|
|
|
|
if (points[hs_offset[0]+i][hs_offset[1]+j] !=
|
|
|
|
|
check[hs_offset[0]+i][hs_offset[1]+j]) {
|
2001-01-26 01:03:29 +08:00
|
|
|
|
H5_FAILED();
|
1998-11-21 11:36:51 +08:00
|
|
|
|
printf(" Read different values than written.\n");
|
|
|
|
|
printf(" At index %lu,%lu\n",
|
1998-04-22 04:32:07 +08:00
|
|
|
|
(unsigned long)(hs_offset[0]+i),
|
|
|
|
|
(unsigned long)(hs_offset[1]+j));
|
1998-11-21 11:36:51 +08:00
|
|
|
|
printf(" At original: %d\n",
|
1998-08-06 06:22:59 +08:00
|
|
|
|
(int)points[hs_offset[0]+i][hs_offset[1]+j]);
|
1998-11-21 11:36:51 +08:00
|
|
|
|
printf(" At returned: %d\n",
|
1998-08-06 06:22:59 +08:00
|
|
|
|
(int)check[hs_offset[0]+i][hs_offset[1]+j]);
|
1998-04-22 04:32:07 +08:00
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-01-04 09:32:22 +08:00
|
|
|
|
#if defined(H5_HAVE_COMPRESS2) && defined(H5_HAVE_ZLIB_H) && defined(H5_HAVE_LIBZ)
|
1998-11-21 11:36:51 +08:00
|
|
|
|
PASSED();
|
1999-01-19 01:54:16 +08:00
|
|
|
|
#else
|
|
|
|
|
SKIPPED();
|
|
|
|
|
puts(not_supported);
|
|
|
|
|
#endif
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
1998-04-22 04:32:07 +08:00
|
|
|
|
/*----------------------------------------------------------------------
|
|
|
|
|
* STEP 7: Register an application-defined compression method and use it
|
|
|
|
|
* to write and then read the dataset.
|
|
|
|
|
*----------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-11-21 11:36:51 +08:00
|
|
|
|
TESTING("compression (app-defined method)");
|
1998-04-18 05:29:43 +08:00
|
|
|
|
|
1998-08-06 06:22:59 +08:00
|
|
|
|
if (H5Zregister (H5Z_BOGUS, "bogus", bogus)<0) goto error;
|
|
|
|
|
if (H5Pset_filter (dc, H5Z_BOGUS, 0, 0, NULL)<0) goto error;
|
|
|
|
|
if (H5Dclose (dataset)<0) goto error;
|
|
|
|
|
if (H5Sclose (space)<0) goto error;
|
|
|
|
|
if ((space = H5Screate_simple (2, size, NULL))<0) goto error;
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if ((dataset=H5Dcreate (file, DSET_BOGUS_NAME, H5T_NATIVE_INT, space,
|
|
|
|
|
dc))<0) goto error;
|
1998-04-22 04:32:07 +08:00
|
|
|
|
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (H5Dwrite (dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer, points)<0)
|
|
|
|
|
goto error;
|
|
|
|
|
if (H5Dread (dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer, check)<0)
|
|
|
|
|
goto error;
|
1998-04-22 04:32:07 +08:00
|
|
|
|
|
|
|
|
|
for (i=0; i<size[0]; i++) {
|
|
|
|
|
for (j=0; j<size[1]; j++) {
|
|
|
|
|
if (points[i][j] != check[i][j]) {
|
2001-01-26 01:03:29 +08:00
|
|
|
|
H5_FAILED();
|
1998-11-21 11:36:51 +08:00
|
|
|
|
printf(" Read different values than written.\n");
|
|
|
|
|
printf(" At index %lu,%lu\n",
|
1998-04-22 04:32:07 +08:00
|
|
|
|
(unsigned long)i, (unsigned long)j);
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
1998-11-21 11:36:51 +08:00
|
|
|
|
PASSED();
|
1998-04-22 04:32:07 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------
|
|
|
|
|
* Cleanup
|
|
|
|
|
*----------------------------------------------------------------------
|
|
|
|
|
*/
|
2001-09-27 04:29:35 +08:00
|
|
|
|
if (H5Pclose (xfer)<0) goto error;
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (H5Pclose (dc)<0) goto error;
|
|
|
|
|
if (H5Dclose(dataset)<0) goto error;
|
1998-05-01 13:16:50 +08:00
|
|
|
|
free (tconv_buf);
|
1998-04-18 05:29:43 +08:00
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
1998-06-10 22:43:15 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: test_multiopen
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Tests that a bug no longer exists. If a dataset is opened
|
|
|
|
|
* twice and one of the handles is used to extend the dataset,
|
|
|
|
|
* then the other handle should return the new size when
|
|
|
|
|
* queried.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: 0
|
|
|
|
|
*
|
|
|
|
|
* Failure: -1
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Tuesday, June 9, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static herr_t
|
|
|
|
|
test_multiopen (hid_t file)
|
|
|
|
|
{
|
[svn-r429] Changes since 19980616
----------------------
./html/tracing.html NEW
This entire update is to make it possible for the library to
print the name, arguments, and return value of every API call
without requiring any extra work from developers or app
programmers. This file describes how this all works.
./configure.in
Added the `--enable-tracing' switch. If you use it then the
library will include code to print API function names,
argument names and values, and function return values.
However, you must then turn on the tracing by setting the
HDF5_TRACE environment variable to a file descriptor number.
The default is `--disable-tracing' since enabling it causes a
slight increase in library size and a slowdown resulting from
an extra function call for each API function call (I couldn't
even measure the slowdown :-)
./bin/trace NEW
A perl script that synchronizes the H5TRACE() macro calls in
the *.c files with the function return type and formal
argument names and types. If you use GNU make and gcc then
this will be done automatically, otherwise just invoke this
script with the names of one or more .c files. You could do
it by hand to, but encoding argument types is a little tricky
at first.
./config/commence.in
Added the $(TRACE) macro, which defaults to the no-op.
Added -D_POSIX_SOURCE to the compiler command line.
./src/Makefile.in
Override the default for $(TRACE).
./config/depend.in
Automatically calls $(TRACE) to synchronize the H5TRACE()
macros in any source file that changed. As with makefile
dependencies, one way to force synchronization of all files is
to remove the `.depend' file.
./MANIFEST
Added new files.
./src/H5Eprivate.h
Modified HRETURN_ERROR() and HRETURN() for tracing.
./src/H5.c
./src/H5private.h
This is where the real tracing work really happens, in
H5_trace().
./src/H5A.c
./src/H5D.c
./src/H5G.c
./src/H5P.c
./src/H5S.c
./src/H5Z.c
Added H5TRACE() calls to all API functions. You don't really
need these changes if you don't want to merge your stuff
because they can be generated automatically by going to the
hdf5/src directory and saying ../bin/trace *.c
./src/H5T.c
Added H5TRACE() calls. Other stuff below.
./src/H5E.c
./src/H5Epublic.h
Added H5TRACE() calls. Created a type H5E_auto_t for the
`func' argument of H5Eset_auto() and H5Eget_auto() to make
those arguments easier to parse for tracing. It should also
make it clearer for users that don't know how to read
complicated ANSI data types.
./src/H5F.c
Added H5TRACE() calls. Changed a couple `uintn' argument
types in API functions to `unsigned int' since `uintn' part of
the API. Changed a few "can't" and "cant" error messages to
"unable to".
./src/H5Ipublic.h
Removed H5_DIRECTORY from the H5I_group_t enum. It wasn't
used anywhere.
./src/H5Tconv.c
Removed an unused label.
./src/H5Fistore.c
./src/H5Oattr.c
./src/H5Odtype.c
./src/H5T.c
./test/dsets.c
./test/dtypes.c
Fixed a warning about a variable possibly used before it's
initialized. Added __unused__ to turn off some unused
argument warnings that pop up when debugging is turned off and
optimizations are turned on.
1998-06-18 04:46:29 +08:00
|
|
|
|
hid_t dcpl=-1, space=-1, dset1=-1, dset2=-1;
|
1998-06-10 22:43:15 +08:00
|
|
|
|
hsize_t cur_size[1] = {10};
|
|
|
|
|
static hsize_t max_size[1] = {H5S_UNLIMITED};
|
|
|
|
|
hsize_t tmp_size[1];
|
|
|
|
|
|
1998-11-21 11:36:51 +08:00
|
|
|
|
TESTING("multi-open with extending");
|
1998-06-10 22:43:15 +08:00
|
|
|
|
|
|
|
|
|
/* Create the dataset and open it twice */
|
2001-10-04 01:57:56 +08:00
|
|
|
|
if((dcpl=H5Pcreate(H5P_DATASET_CREATE))<0) goto error;
|
1998-06-10 22:43:15 +08:00
|
|
|
|
if (H5Pset_chunk (dcpl, 1, cur_size)<0) goto error;
|
|
|
|
|
if ((space=H5Screate_simple (1, cur_size, max_size))<0) goto error;
|
|
|
|
|
if ((dset1=H5Dcreate (file, "multiopen", H5T_NATIVE_INT, space,
|
|
|
|
|
dcpl))<0) goto error;
|
1998-09-11 23:39:28 +08:00
|
|
|
|
if ((dset2=H5Dopen (dset1, "."))<0) goto error;
|
1998-06-10 22:43:15 +08:00
|
|
|
|
if (H5Sclose (space)<0) goto error;
|
|
|
|
|
|
|
|
|
|
/* Extend with the first handle */
|
|
|
|
|
cur_size[0] = 20;
|
|
|
|
|
if (H5Dextend (dset1, cur_size)<0) goto error;
|
|
|
|
|
|
|
|
|
|
/* Get the size from the second handle */
|
|
|
|
|
if ((space = H5Dget_space (dset2))<0) goto error;
|
1998-09-01 11:35:23 +08:00
|
|
|
|
if (H5Sget_simple_extent_dims (space, tmp_size, NULL)<0) goto error;
|
1998-06-10 22:43:15 +08:00
|
|
|
|
if (cur_size[0]!=tmp_size[0]) {
|
2001-01-26 01:03:29 +08:00
|
|
|
|
H5_FAILED();
|
1998-11-21 11:36:51 +08:00
|
|
|
|
printf (" Got %d instead of %d!\n",
|
1998-06-10 22:43:15 +08:00
|
|
|
|
(int)tmp_size[0], (int)cur_size[0]);
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (H5Dclose (dset1)<0) goto error;
|
|
|
|
|
if (H5Dclose (dset2)<0) goto error;
|
|
|
|
|
if (H5Sclose (space)<0) goto error;
|
|
|
|
|
if (H5Pclose (dcpl)<0) goto error;
|
1998-11-21 11:36:51 +08:00
|
|
|
|
PASSED();
|
1998-06-10 22:43:15 +08:00
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
H5Dclose (dset1);
|
|
|
|
|
H5Dclose (dset2);
|
|
|
|
|
H5Sclose (space);
|
|
|
|
|
H5Pclose (dcpl);
|
|
|
|
|
} H5E_END_TRY;
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
1999-06-08 04:20:32 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: test_types
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Make some datasets with various types so we can test h5ls.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: 0
|
|
|
|
|
*
|
|
|
|
|
* Failure: -1
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, June 7, 1999
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static herr_t
|
|
|
|
|
test_types(hid_t file)
|
|
|
|
|
{
|
|
|
|
|
hid_t grp=-1, type=-1, space=-1, dset=-1;
|
|
|
|
|
size_t i;
|
|
|
|
|
hsize_t nelmts;
|
|
|
|
|
unsigned char buf[32];
|
|
|
|
|
|
|
|
|
|
TESTING("various datatypes");
|
|
|
|
|
if ((grp=H5Gcreate(file, "typetests", 0))<0) goto error;
|
|
|
|
|
|
|
|
|
|
/* bitfield_1 */
|
|
|
|
|
nelmts = sizeof(buf);
|
|
|
|
|
if ((type=H5Tcopy(H5T_STD_B8LE))<0 ||
|
|
|
|
|
(space=H5Screate_simple(1, &nelmts, NULL))<0 ||
|
|
|
|
|
(dset=H5Dcreate(grp, "bitfield_1", type, space, H5P_DEFAULT))<0)
|
|
|
|
|
goto error;
|
1999-11-18 06:00:15 +08:00
|
|
|
|
for (i=0; i<sizeof buf; i++) buf[i] = (unsigned char)0xff ^ (unsigned char)i;
|
1999-06-08 04:20:32 +08:00
|
|
|
|
if (H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf)<0)
|
|
|
|
|
goto error;
|
2001-12-12 03:53:44 +08:00
|
|
|
|
|
1999-06-08 04:20:32 +08:00
|
|
|
|
if (H5Sclose(space)<0) goto error;
|
|
|
|
|
if (H5Tclose(type)<0) goto error;
|
|
|
|
|
if (H5Dclose(dset)<0) goto error;
|
|
|
|
|
|
|
|
|
|
/* bitfield_2 */
|
|
|
|
|
nelmts = sizeof(buf)/2;
|
|
|
|
|
if ((type=H5Tcopy(H5T_STD_B16LE))<0 ||
|
|
|
|
|
(space=H5Screate_simple(1, &nelmts, NULL))<0 ||
|
|
|
|
|
(dset=H5Dcreate(grp, "bitfield_2", type, space, H5P_DEFAULT))<0)
|
|
|
|
|
goto error;
|
1999-11-18 06:00:15 +08:00
|
|
|
|
for (i=0; i<sizeof buf; i++) buf[i] = (unsigned char)0xff ^ (unsigned char)i;
|
1999-06-08 04:20:32 +08:00
|
|
|
|
if (H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf)<0)
|
|
|
|
|
goto error;
|
|
|
|
|
if (H5Sclose(space)<0) goto error;
|
|
|
|
|
if (H5Tclose(type)<0) goto error;
|
|
|
|
|
if (H5Dclose(dset)<0) goto error;
|
|
|
|
|
|
|
|
|
|
/* opaque_1 */
|
|
|
|
|
nelmts = sizeof(buf);
|
|
|
|
|
if ((type=H5Tcreate(H5T_OPAQUE, 1))<0 ||
|
|
|
|
|
H5Tset_tag(type, "testing 1-byte opaque type")<0 ||
|
|
|
|
|
(space=H5Screate_simple(1, &nelmts, NULL))<0 ||
|
|
|
|
|
(dset=H5Dcreate(grp, "opaque_1", type, space, H5P_DEFAULT))<0)
|
|
|
|
|
goto error;
|
1999-11-18 06:00:15 +08:00
|
|
|
|
for (i=0; i<sizeof buf; i++) buf[i] = (unsigned char)0xff ^ (unsigned char)i;
|
1999-06-08 04:20:32 +08:00
|
|
|
|
if (H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf)<0)
|
|
|
|
|
goto error;
|
|
|
|
|
if (H5Sclose(space)<0) goto error;
|
|
|
|
|
if (H5Tclose(type)<0) goto error;
|
|
|
|
|
if (H5Dclose(dset)<0) goto error;
|
|
|
|
|
|
|
|
|
|
/* opaque_2 */
|
|
|
|
|
nelmts = sizeof(buf)/4;
|
|
|
|
|
if ((type=H5Tcreate(H5T_OPAQUE, 4))<0 ||
|
|
|
|
|
H5Tset_tag(type, "testing 4-byte opaque type")<0 ||
|
|
|
|
|
(space=H5Screate_simple(1, &nelmts, NULL))<0 ||
|
|
|
|
|
(dset=H5Dcreate(grp, "opaque_2", type, space, H5P_DEFAULT))<0)
|
|
|
|
|
goto error;
|
1999-11-18 06:00:15 +08:00
|
|
|
|
for (i=0; i<sizeof buf; i++) buf[i] = (unsigned char)0xff ^ (unsigned char)i;
|
1999-06-08 04:20:32 +08:00
|
|
|
|
if (H5Dwrite(dset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf)<0)
|
|
|
|
|
goto error;
|
|
|
|
|
if (H5Sclose(space)<0) goto error;
|
|
|
|
|
if (H5Tclose(type)<0) goto error;
|
|
|
|
|
if (H5Dclose(dset)<0) goto error;
|
|
|
|
|
|
|
|
|
|
/* Cleanup */
|
|
|
|
|
if (H5Gclose(grp)<0) goto error;
|
|
|
|
|
PASSED();
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
H5Gclose(grp);
|
|
|
|
|
H5Tclose(type);
|
|
|
|
|
H5Sclose(space);
|
|
|
|
|
H5Dclose(dset);
|
|
|
|
|
} H5E_END_TRY;
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
1998-05-29 07:02:29 +08:00
|
|
|
|
|
1997-12-11 06:41:56 +08:00
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Function: main
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Purpose: Tests the dataset interface (H5D)
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Return: Success: exit(0)
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Failure: exit(1)
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-03-06 05:27:38 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Tuesday, December 9, 1997
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
int
|
1998-01-17 06:23:43 +08:00
|
|
|
|
main(void)
|
1997-12-11 06:41:56 +08:00
|
|
|
|
{
|
1998-08-19 01:14:43 +08:00
|
|
|
|
hid_t file, grp, fapl;
|
1999-02-25 23:40:27 +08:00
|
|
|
|
int nerrors=0;
|
1998-11-21 11:36:51 +08:00
|
|
|
|
char filename[1024];
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
1998-11-21 11:36:51 +08:00
|
|
|
|
h5_reset();
|
|
|
|
|
fapl = h5_fileaccess();
|
|
|
|
|
|
1999-01-19 01:54:16 +08:00
|
|
|
|
#if 0
|
1999-02-25 23:40:27 +08:00
|
|
|
|
{
|
|
|
|
|
/* Turn off raw data cache */
|
|
|
|
|
int mdc_nelmts;
|
|
|
|
|
if (H5Pget_cache(fapl, &mdc_nelmts, NULL, NULL, NULL)<0) goto error;
|
|
|
|
|
if (H5Pset_cache(fapl, mdc_nelmts, 0, 0, 0.0)<0) goto error;
|
|
|
|
|
}
|
1998-08-19 01:14:43 +08:00
|
|
|
|
#endif
|
|
|
|
|
|
1998-11-21 11:36:51 +08:00
|
|
|
|
h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
|
1999-08-18 03:12:59 +08:00
|
|
|
|
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) {
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
1998-04-18 05:29:43 +08:00
|
|
|
|
/* Cause the library to emit initial messages */
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if ((grp = H5Gcreate (file, "emit diagnostics", 0))<0) goto error;
|
|
|
|
|
if (H5Gset_comment(grp, ".", "Causes diagnostic messages to be emitted")<0)
|
|
|
|
|
goto error;
|
|
|
|
|
if (H5Gclose (grp)<0) goto error;
|
1998-06-10 22:43:15 +08:00
|
|
|
|
|
1998-11-21 11:36:51 +08:00
|
|
|
|
nerrors += test_create(file)<0 ?1:0;
|
|
|
|
|
nerrors += test_simple_io(file)<0 ?1:0;
|
|
|
|
|
nerrors += test_tconv(file)<0 ?1:0;
|
|
|
|
|
nerrors += test_compression(file)<0 ?1:0;
|
|
|
|
|
nerrors += test_multiopen (file)<0 ?1:0;
|
1999-06-08 04:20:32 +08:00
|
|
|
|
nerrors += test_types(file)<0 ?1:0;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
1998-11-21 11:36:51 +08:00
|
|
|
|
if (H5Fclose(file)<0) goto error;
|
|
|
|
|
if (nerrors) goto error;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
printf("All dataset tests passed.\n");
|
2000-09-10 08:08:27 +08:00
|
|
|
|
h5_cleanup(FILENAME, fapl);
|
1998-02-10 03:37:40 +08:00
|
|
|
|
return 0;
|
1998-11-21 11:36:51 +08:00
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
nerrors = MAX(1, nerrors);
|
|
|
|
|
printf("***** %d DATASET TEST%s FAILED! *****\n",
|
|
|
|
|
nerrors, 1 == nerrors ? "" : "S");
|
|
|
|
|
return 1;
|
1997-12-11 06:41:56 +08:00
|
|
|
|
}
|