You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
426 lines
12 KiB
426 lines
12 KiB
2 years ago
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||
|
* Copyright by The HDF Group. *
|
||
|
* 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 COPYING file, which can be found at the root of the source code *
|
||
|
* distribution tree, or in https://www.hdfgroup.org/licenses. *
|
||
|
* If you do not have access to either file, you may request a copy from *
|
||
|
* help@hdfgroup.org. *
|
||
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||
|
|
||
|
/*
|
||
|
* Generate the binary hdf5 files and user block data for the jam/unjam tests.
|
||
|
* Usage: just execute the program without any arguments will
|
||
|
* generate all the files in the local directory.
|
||
|
*
|
||
|
* If you regenerate the test files (e.g., changing some code,
|
||
|
* trying it on a new platform, ...), you need to verify the correctness
|
||
|
* of the expected output and update the corresponding *.ddl files.
|
||
|
*/
|
||
|
|
||
|
#include "hdf5.h"
|
||
|
#include "H5private.h"
|
||
|
|
||
|
/* not used yet
|
||
|
#define UBTXT1 "u0.txt"
|
||
|
*/
|
||
|
#define UBTXT2 "u10.txt"
|
||
|
#define UBTXT3 "u511.txt"
|
||
|
#define UBTXT4 "u512.txt"
|
||
|
#define UBTXT5 "u513.txt"
|
||
|
|
||
|
/* tall is same as dumper test */
|
||
|
#define FILE7 "tall.h5"
|
||
|
#define FILE8 "twithub.h5"
|
||
|
#define FILE9 "twithub513.h5"
|
||
|
|
||
|
/*
|
||
|
* This pattern is used to fill text files
|
||
|
*/
|
||
|
char pattern[11] = "abcdefghij";
|
||
|
|
||
|
/*-------------------------------------------------------------------------
|
||
|
* prototypes
|
||
|
*-------------------------------------------------------------------------
|
||
|
*/
|
||
|
|
||
|
#define BUF_SIZE 1024
|
||
|
|
||
|
/* A UD link traversal function. Shouldn't actually be called. */
|
||
|
static hid_t
|
||
|
UD_traverse(const char H5_ATTR_UNUSED *link_name, hid_t H5_ATTR_UNUSED cur_group,
|
||
|
const void H5_ATTR_UNUSED *udata, size_t H5_ATTR_UNUSED udata_size, hid_t H5_ATTR_UNUSED lapl_id,
|
||
|
hid_t H5_ATTR_UNUSED dxpl_id)
|
||
|
{
|
||
|
return H5I_INVALID_HID;
|
||
|
}
|
||
|
|
||
|
#define MY_LINKCLASS 187
|
||
|
const H5L_class_t UD_link_class[1] = {{
|
||
|
H5L_LINK_CLASS_T_VERS, /* H5L_class_t version */
|
||
|
(H5L_type_t)MY_LINKCLASS, /* Link type id number */
|
||
|
"UD link class", /* name for debugging */
|
||
|
NULL, /* Creation callback */
|
||
|
NULL, /* Move/rename callback */
|
||
|
NULL, /* Copy callback */
|
||
|
UD_traverse, /* The actual traversal function */
|
||
|
NULL, /* Deletion callback */
|
||
|
NULL /* Query callback */
|
||
|
}};
|
||
|
|
||
|
/* gent_ub
|
||
|
with no ub, identical to gent_all from h5dumpgentest.c
|
||
|
|
||
|
FILENAME is the name of the file to create
|
||
|
UB_SIZE is the size the buffer should be
|
||
|
UB_FILL characters will be set to the PATTERN array,
|
||
|
the rest of the user block will be NULL.
|
||
|
|
||
|
/ : g1 g2 attr1 attr2
|
||
|
g1 : g1.1 g1.2
|
||
|
g1.1 : dset1.1.1(attr1, attr2) dset1.1.2
|
||
|
g1.2 : g1.2.1 extlink
|
||
|
g1.2.1 : slink
|
||
|
g2 : dset2.1 dset2.2 udlink
|
||
|
|
||
|
*/
|
||
|
static herr_t
|
||
|
gent_ub(const char *filename, size_t ub_size, size_t ub_fill)
|
||
|
{
|
||
|
hid_t fid = H5I_INVALID_HID;
|
||
|
hid_t group = H5I_INVALID_HID;
|
||
|
hid_t attr = H5I_INVALID_HID;
|
||
|
hid_t dataset = H5I_INVALID_HID;
|
||
|
hid_t space = H5I_INVALID_HID;
|
||
|
hid_t create_plist = H5I_INVALID_HID;
|
||
|
hsize_t dims[2];
|
||
|
int data[2][2], dset1[10][10], dset2[20];
|
||
|
char buf[BUF_SIZE];
|
||
|
int i, j;
|
||
|
size_t u;
|
||
|
float dset2_1[10], dset2_2[3][5];
|
||
|
int fd = -1;
|
||
|
|
||
|
if (ub_size > 0) {
|
||
|
if ((create_plist = H5Pcreate(H5P_FILE_CREATE)) < 0)
|
||
|
goto error;
|
||
|
if (H5Pset_userblock(create_plist, (hsize_t)ub_size) < 0)
|
||
|
goto error;
|
||
|
if ((fid = H5Fcreate(filename, H5F_ACC_TRUNC, create_plist, H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
}
|
||
|
else {
|
||
|
if ((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
/* Create groups */
|
||
|
if ((group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
if (H5Gclose(group) < 0)
|
||
|
goto error;
|
||
|
|
||
|
if ((group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
if (H5Gclose(group) < 0)
|
||
|
goto error;
|
||
|
|
||
|
if ((group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
if (H5Gclose(group) < 0)
|
||
|
goto error;
|
||
|
|
||
|
if ((group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
if (H5Gclose(group) < 0)
|
||
|
goto error;
|
||
|
|
||
|
if ((group = H5Gcreate2(fid, "/g1/g1.2/g1.2.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
if (H5Gclose(group) < 0)
|
||
|
goto error;
|
||
|
|
||
|
/* Root attributes */
|
||
|
if ((group = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
|
||
|
dims[0] = 10;
|
||
|
if ((space = H5Screate_simple(1, dims, NULL)) < 0)
|
||
|
goto error;
|
||
|
if ((attr = H5Acreate2(group, "attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
if (HDsnprintf(buf, sizeof(buf), "abcdefghi") < 0)
|
||
|
goto error;
|
||
|
if (H5Awrite(attr, H5T_NATIVE_SCHAR, buf) < 0)
|
||
|
goto error;
|
||
|
if (H5Sclose(space) < 0)
|
||
|
goto error;
|
||
|
if (H5Aclose(attr) < 0)
|
||
|
goto error;
|
||
|
|
||
|
dims[0] = 2;
|
||
|
dims[1] = 2;
|
||
|
if ((space = H5Screate_simple(2, dims, NULL)) < 0)
|
||
|
goto error;
|
||
|
if ((attr = H5Acreate2(group, "attr2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
data[0][0] = 0;
|
||
|
data[0][1] = 1;
|
||
|
data[1][0] = 2;
|
||
|
data[1][1] = 3;
|
||
|
if (H5Awrite(attr, H5T_NATIVE_INT, data) < 0)
|
||
|
goto error;
|
||
|
if (H5Sclose(space) < 0)
|
||
|
goto error;
|
||
|
if (H5Aclose(attr) < 0)
|
||
|
goto error;
|
||
|
|
||
|
if (H5Gclose(group) < 0)
|
||
|
goto error;
|
||
|
|
||
|
if ((group = H5Gopen2(fid, "/g1/g1.1", H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
|
||
|
/* Dataset 1.1.1 */
|
||
|
dims[0] = 10;
|
||
|
dims[1] = 10;
|
||
|
if ((space = H5Screate_simple(2, dims, NULL)) < 0)
|
||
|
goto error;
|
||
|
if ((dataset =
|
||
|
H5Dcreate2(group, "dset1.1.1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
for (i = 0; i < 10; i++)
|
||
|
for (j = 0; j < 10; j++)
|
||
|
dset1[i][j] = j * i;
|
||
|
if (H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1) < 0)
|
||
|
goto error;
|
||
|
if (H5Sclose(space) < 0)
|
||
|
goto error;
|
||
|
|
||
|
/* Attributes of dset1.1.1 */
|
||
|
dims[0] = 27;
|
||
|
if ((space = H5Screate_simple(1, dims, NULL)) < 0)
|
||
|
goto error;
|
||
|
if ((attr = H5Acreate2(dataset, "attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
if (HDsnprintf(buf, sizeof(buf), "1st attribute of dset1.1.1") < 0)
|
||
|
goto error;
|
||
|
if (H5Awrite(attr, H5T_NATIVE_SCHAR, buf) < 0)
|
||
|
goto error;
|
||
|
if (H5Sclose(space) < 0)
|
||
|
goto error;
|
||
|
if (H5Aclose(attr) < 0)
|
||
|
goto error;
|
||
|
|
||
|
dims[0] = 27;
|
||
|
if ((space = H5Screate_simple(1, dims, NULL)) < 0)
|
||
|
goto error;
|
||
|
if ((attr = H5Acreate2(dataset, "attr2", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
if (HDsnprintf(buf, sizeof(buf), "2nd attribute of dset1.1.1") < 0)
|
||
|
goto error;
|
||
|
if (H5Awrite(attr, H5T_NATIVE_SCHAR, buf) < 0)
|
||
|
goto error;
|
||
|
if (H5Sclose(space) < 0)
|
||
|
goto error;
|
||
|
if (H5Aclose(attr) < 0)
|
||
|
goto error;
|
||
|
|
||
|
if (H5Dclose(dataset) < 0)
|
||
|
goto error;
|
||
|
|
||
|
/* Dataset 1.1.2 */
|
||
|
dims[0] = 20;
|
||
|
if ((space = H5Screate_simple(1, dims, NULL)) < 0)
|
||
|
goto error;
|
||
|
if ((dataset =
|
||
|
H5Dcreate2(group, "dset1.1.2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
for (i = 0; i < 20; i++)
|
||
|
dset2[i] = i;
|
||
|
if (H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2) < 0)
|
||
|
goto error;
|
||
|
if (H5Sclose(space) < 0)
|
||
|
goto error;
|
||
|
if (H5Dclose(dataset) < 0)
|
||
|
goto error;
|
||
|
|
||
|
if (H5Gclose(group) < 0)
|
||
|
goto error;
|
||
|
|
||
|
/* External link */
|
||
|
if (H5Lcreate_external("somefile", "somepath", fid, "/g1/g1.2/extlink", H5P_DEFAULT, H5P_DEFAULT) < 0)
|
||
|
goto error;
|
||
|
|
||
|
/* Soft link */
|
||
|
if ((group = H5Gopen2(fid, "/g1/g1.2/g1.2.1", H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
if (H5Lcreate_soft("somevalue", group, "slink", H5P_DEFAULT, H5P_DEFAULT) < 0)
|
||
|
goto error;
|
||
|
if (H5Gclose(group) < 0)
|
||
|
goto error;
|
||
|
|
||
|
if ((group = H5Gopen2(fid, "/g2", H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
|
||
|
/* Dataset 2.1 */
|
||
|
dims[0] = 10;
|
||
|
if ((space = H5Screate_simple(1, dims, NULL)) < 0)
|
||
|
goto error;
|
||
|
if ((dataset =
|
||
|
H5Dcreate2(group, "dset2.1", H5T_IEEE_F32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
for (i = 0; i < 10; i++)
|
||
|
dset2_1[i] = (float)((float)i * 0.1F + 1.0F);
|
||
|
if (H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_1) < 0)
|
||
|
goto error;
|
||
|
if (H5Sclose(space) < 0)
|
||
|
goto error;
|
||
|
if (H5Dclose(dataset) < 0)
|
||
|
goto error;
|
||
|
|
||
|
/* Dataset 2.2 */
|
||
|
dims[0] = 3;
|
||
|
dims[1] = 5;
|
||
|
if ((space = H5Screate_simple(2, dims, NULL)) < 0)
|
||
|
goto error;
|
||
|
if ((dataset =
|
||
|
H5Dcreate2(group, "dset2.2", H5T_IEEE_F32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
|
||
|
goto error;
|
||
|
for (i = 0; i < 3; i++)
|
||
|
for (j = 0; j < 5; j++)
|
||
|
dset2_2[i][j] = (float)(((float)i + 1.0F) * (float)j * 0.1F);
|
||
|
if (H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_2) < 0)
|
||
|
goto error;
|
||
|
if (H5Sclose(space) < 0)
|
||
|
goto error;
|
||
|
if (H5Dclose(dataset) < 0)
|
||
|
goto error;
|
||
|
|
||
|
if (H5Gclose(group) < 0)
|
||
|
goto error;
|
||
|
|
||
|
/* User-defined link */
|
||
|
if (H5Lregister(UD_link_class) < 0)
|
||
|
goto error;
|
||
|
if (H5Lcreate_ud(fid, "/g2/udlink", (H5L_type_t)MY_LINKCLASS, NULL, (size_t)0, H5P_DEFAULT, H5P_DEFAULT) <
|
||
|
0)
|
||
|
goto error;
|
||
|
|
||
|
/* MUST close the file ID before the user block code or you risk tripping
|
||
|
* over file locking issues.
|
||
|
*/
|
||
|
if (H5Fclose(fid) < 0)
|
||
|
goto error;
|
||
|
|
||
|
/* If a user block is being used, write to it here */
|
||
|
if (ub_size > 0) {
|
||
|
char *bp;
|
||
|
|
||
|
if (ub_size > BUF_SIZE)
|
||
|
goto error;
|
||
|
|
||
|
if ((fd = HDopen(filename, O_RDWR)) < 0)
|
||
|
goto error;
|
||
|
|
||
|
/* Fill buf with pattern */
|
||
|
HDmemset(buf, '\0', ub_size);
|
||
|
bp = buf;
|
||
|
for (u = 0; u < ub_fill; u++)
|
||
|
*bp++ = pattern[u % 10];
|
||
|
|
||
|
if (HDwrite(fd, buf, ub_size) < 0)
|
||
|
goto error;
|
||
|
|
||
|
if (HDclose(fd) < 0)
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
return SUCCEED;
|
||
|
|
||
|
error:
|
||
|
if (fd >= 0)
|
||
|
HDclose(fd);
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Fclose(fid);
|
||
|
H5Gclose(group);
|
||
|
H5Aclose(attr);
|
||
|
H5Dclose(dataset);
|
||
|
H5Sclose(space);
|
||
|
H5Pclose(create_plist);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return FAIL;
|
||
|
}
|
||
|
|
||
|
/* Creates a simple (i.e., not HDF5) text file and fills it with a pattern */
|
||
|
static herr_t
|
||
|
create_textfile(const char *name, size_t size)
|
||
|
{
|
||
|
char *buf = NULL;
|
||
|
int fd = -1;
|
||
|
size_t i;
|
||
|
char *bp = NULL;
|
||
|
|
||
|
if ((fd = HDcreat(name, 0777)) < 0)
|
||
|
goto error;
|
||
|
if (NULL == (buf = (char *)HDcalloc(size, 1)))
|
||
|
goto error;
|
||
|
|
||
|
/* Fill buf with pattern */
|
||
|
bp = buf;
|
||
|
for (i = 0; i < size; i++)
|
||
|
*bp++ = pattern[i % 10];
|
||
|
|
||
|
if (HDwrite(fd, buf, size) < 0)
|
||
|
goto error;
|
||
|
|
||
|
HDfree(buf);
|
||
|
HDclose(fd);
|
||
|
|
||
|
return SUCCEED;
|
||
|
|
||
|
error:
|
||
|
HDfree(buf);
|
||
|
if (fd >= 0)
|
||
|
HDclose(fd);
|
||
|
|
||
|
return FAIL;
|
||
|
}
|
||
|
|
||
|
/*-------------------------------------------------------------------------
|
||
|
* Function: main
|
||
|
*
|
||
|
*-------------------------------------------------------------------------
|
||
|
*/
|
||
|
int
|
||
|
main(void)
|
||
|
{
|
||
|
if (create_textfile(UBTXT2, 10) < 0)
|
||
|
goto error;
|
||
|
if (create_textfile(UBTXT3, 511) < 0)
|
||
|
goto error;
|
||
|
if (create_textfile(UBTXT4, 512) < 0)
|
||
|
goto error;
|
||
|
if (create_textfile(UBTXT5, 513) < 0)
|
||
|
goto error;
|
||
|
|
||
|
if (gent_ub(FILE7, 0, 0) < 0)
|
||
|
goto error;
|
||
|
if (gent_ub(FILE8, 512, HDstrlen(pattern)) < 0)
|
||
|
goto error;
|
||
|
if (gent_ub(FILE9, 1024, 513) < 0)
|
||
|
goto error;
|
||
|
|
||
|
return EXIT_SUCCESS;
|
||
|
|
||
|
error:
|
||
|
HDfprintf(stderr, "h5jam test generator FAILED\n");
|
||
|
return EXIT_FAILURE;
|
||
|
}
|