1997-12-11 06:41:56 +08:00
|
|
|
|
/*
|
|
|
|
|
* Copyright (C) 1997 NCSA
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke <matzke@llnl.gov>
|
|
|
|
|
* Tuesday, December 9, 1997
|
|
|
|
|
*
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* Purpose: Tests the data type interface (H5T)
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*/
|
|
|
|
|
#include <hdf5.h>
|
|
|
|
|
#include <stdio.h>
|
1998-06-06 05:03:49 +08:00
|
|
|
|
#include <stdlib.h>
|
1997-12-11 06:41:56 +08:00
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
1998-06-06 05:03:49 +08:00
|
|
|
|
#include <H5config.h>
|
|
|
|
|
#ifndef HAVE_ATTRIBUTE
|
|
|
|
|
# undef __attribute__
|
|
|
|
|
# define __attribute__(X) /*void*/
|
|
|
|
|
# define __unused__ /*void*/
|
|
|
|
|
#else
|
|
|
|
|
# define __unused__ __attribute__((unused))
|
|
|
|
|
#endif
|
|
|
|
|
|
1998-06-05 11:35:31 +08:00
|
|
|
|
#define FILE_NAME_1 "dtypes1.h5"
|
|
|
|
|
#define FILE_NAME_2 "dtypes2.h5"
|
1997-12-11 06:41:56 +08:00
|
|
|
|
|
1998-01-10 01:49:23 +08:00
|
|
|
|
typedef struct complex_t {
|
1998-01-17 06:23:43 +08:00
|
|
|
|
double re;
|
|
|
|
|
double im;
|
1998-01-10 01:49:23 +08:00
|
|
|
|
} complex_t;
|
1998-06-05 11:35:31 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-06-06 05:03:49 +08:00
|
|
|
|
* Function: cleanup
|
1998-06-05 11:35:31 +08:00
|
|
|
|
*
|
|
|
|
|
* Purpose: Removes test files
|
|
|
|
|
*
|
|
|
|
|
* Return: void
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Thursday, June 4, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static void
|
1998-06-06 05:03:49 +08:00
|
|
|
|
cleanup (void)
|
1998-06-05 11:35:31 +08:00
|
|
|
|
{
|
1998-06-06 05:03:49 +08:00
|
|
|
|
if (!getenv ("HDF5_NOCLEANUP")) {
|
|
|
|
|
remove (FILE_NAME_1);
|
|
|
|
|
remove (FILE_NAME_2);
|
|
|
|
|
}
|
1998-06-05 11:35:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: display_error_cb
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Displays the error stack after printing "*FAILED*".
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: 0
|
|
|
|
|
*
|
|
|
|
|
* Failure: -1
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Wednesday, March 4, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static herr_t
|
1998-06-06 05:03:49 +08:00
|
|
|
|
display_error_cb (void __unused__ *client_data)
|
1998-06-05 11:35:31 +08:00
|
|
|
|
{
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
H5Eprint (stdout);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
1997-12-11 06:41:56 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* Function: test_classes
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* Purpose: Test type classes
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-06-05 11:35:31 +08:00
|
|
|
|
* Return: Success: 0
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-06-05 11:35:31 +08:00
|
|
|
|
* Failure: -1
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
1997-12-11 06:41:56 +08:00
|
|
|
|
* Tuesday, December 9, 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static herr_t
|
1998-01-17 06:23:43 +08:00
|
|
|
|
test_classes(void)
|
1997-12-11 06:41:56 +08:00
|
|
|
|
{
|
1998-06-05 11:35:31 +08:00
|
|
|
|
H5T_class_t tcls;
|
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
printf("%-70s", "Testing H5Tget_class()");
|
|
|
|
|
|
1998-06-05 11:35:31 +08:00
|
|
|
|
if ((tcls=H5Tget_class(H5T_NATIVE_INT))<0) goto error;
|
|
|
|
|
if (H5T_INTEGER!=tcls) {
|
1998-01-17 06:23:43 +08:00
|
|
|
|
puts("*FAILED*");
|
1998-06-05 11:35:31 +08:00
|
|
|
|
puts(" Invalid type class for H5T_NATIVE_INT");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
goto error;
|
|
|
|
|
}
|
1998-06-05 11:35:31 +08:00
|
|
|
|
if ((tcls=H5Tget_class(H5T_NATIVE_DOUBLE))<0) goto error;
|
|
|
|
|
if (H5T_FLOAT!=tcls) {
|
1998-01-17 06:23:43 +08:00
|
|
|
|
puts("*FAILED*");
|
1998-06-05 11:35:31 +08:00
|
|
|
|
puts(" Invalid type class for H5T_NATIVE_DOUBLE");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
puts(" PASSED");
|
1998-06-05 11:35:31 +08:00
|
|
|
|
return 0;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
error:
|
1998-06-05 11:35:31 +08:00
|
|
|
|
return -1;
|
1997-12-11 06:41:56 +08:00
|
|
|
|
}
|
1998-06-05 11:35:31 +08:00
|
|
|
|
|
1997-12-11 06:41:56 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* Function: test_copy
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* Purpose: Are we able to copy a data type?
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-06-05 11:35:31 +08:00
|
|
|
|
* Return: Success: 0
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-06-05 11:35:31 +08:00
|
|
|
|
* Failure: -1
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
1997-12-11 06:41:56 +08:00
|
|
|
|
* Tuesday, December 9, 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static herr_t
|
1998-01-17 06:23:43 +08:00
|
|
|
|
test_copy(void)
|
1997-12-11 06:41:56 +08:00
|
|
|
|
{
|
1998-03-05 00:20:23 +08:00
|
|
|
|
hid_t a_copy;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
printf("%-70s", "Testing H5Tcopy()");
|
|
|
|
|
|
1998-06-05 11:35:31 +08:00
|
|
|
|
if ((a_copy = H5Tcopy(H5T_NATIVE_SHORT)) < 0) goto error;
|
|
|
|
|
if (H5Tclose(a_copy) < 0) goto error;
|
1998-03-05 00:20:23 +08:00
|
|
|
|
|
1998-06-05 11:35:31 +08:00
|
|
|
|
/* We should not be able to close a built-in byte */
|
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
if (H5Tclose (H5T_NATIVE_CHAR)>=0) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" Should not be able to close a predefined type!");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
} H5E_END_TRY;
|
1998-03-05 00:20:23 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
puts(" PASSED");
|
1998-06-05 11:35:31 +08:00
|
|
|
|
return 0;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
error:
|
1998-06-05 11:35:31 +08:00
|
|
|
|
return -1;
|
1997-12-11 06:41:56 +08:00
|
|
|
|
}
|
1998-06-05 11:35:31 +08:00
|
|
|
|
|
1998-01-10 01:49:23 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* Function: test_compound
|
1998-01-10 01:49:23 +08:00
|
|
|
|
*
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* Purpose: Tests various things about compound data types.
|
1998-01-10 01:49:23 +08:00
|
|
|
|
*
|
1998-06-05 11:35:31 +08:00
|
|
|
|
* Return: Success: 0
|
1998-01-10 01:49:23 +08:00
|
|
|
|
*
|
1998-06-05 11:35:31 +08:00
|
|
|
|
* Failure: -1
|
1998-01-10 01:49:23 +08:00
|
|
|
|
*
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
1998-01-10 01:49:23 +08:00
|
|
|
|
* Wednesday, January 7, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static herr_t
|
1998-01-17 06:23:43 +08:00
|
|
|
|
test_compound(void)
|
1998-01-10 01:49:23 +08:00
|
|
|
|
{
|
1998-01-17 06:23:43 +08:00
|
|
|
|
complex_t tmp;
|
|
|
|
|
hid_t complex_id;
|
|
|
|
|
|
|
|
|
|
printf("%-70s", "Testing compound data types");
|
|
|
|
|
|
|
|
|
|
/* Create the empty type */
|
1998-06-05 11:35:31 +08:00
|
|
|
|
if ((complex_id = H5Tcreate(H5T_COMPOUND, sizeof tmp))<0) goto error;
|
|
|
|
|
|
1998-03-05 00:20:23 +08:00
|
|
|
|
/* Add a couple fields */
|
1998-06-05 11:35:31 +08:00
|
|
|
|
if (H5Tinsert(complex_id, "real", HOFFSET(complex_t, re),
|
|
|
|
|
H5T_NATIVE_DOUBLE)<0) goto error;
|
|
|
|
|
if (H5Tinsert(complex_id, "imaginary", HOFFSET(complex_t, im),
|
|
|
|
|
H5T_NATIVE_DOUBLE)<0) goto error;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
1998-06-05 11:35:31 +08:00
|
|
|
|
if (H5Tclose (complex_id)<0) goto error;
|
|
|
|
|
puts(" PASSED");
|
|
|
|
|
return 0;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
error:
|
1998-06-05 11:35:31 +08:00
|
|
|
|
return -1;
|
1998-01-10 01:49:23 +08:00
|
|
|
|
}
|
1998-06-05 06:28:11 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: test_transient
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Tests transient data types.
|
|
|
|
|
*
|
1998-06-05 11:35:31 +08:00
|
|
|
|
* Return: Success: 0
|
1998-06-05 06:28:11 +08:00
|
|
|
|
*
|
1998-06-05 11:35:31 +08:00
|
|
|
|
* Failure: -1
|
1998-06-05 06:28:11 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Thursday, June 4, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static herr_t
|
|
|
|
|
test_transient (void)
|
|
|
|
|
{
|
1998-06-06 05:03:49 +08:00
|
|
|
|
static hsize_t ds_size[2] = {10, 20};
|
1998-06-05 06:28:11 +08:00
|
|
|
|
hid_t file, type, space, dset, t2;
|
|
|
|
|
|
|
|
|
|
printf ("%-70s", "Testing transient data types");
|
1998-06-05 11:35:31 +08:00
|
|
|
|
if ((file=H5Fcreate (FILE_NAME_1, H5F_ACC_TRUNC|H5F_ACC_DEBUG,
|
1998-06-05 06:28:11 +08:00
|
|
|
|
H5P_DEFAULT, H5P_DEFAULT))<0) goto error;
|
|
|
|
|
space = H5Screate_simple (2, ds_size, ds_size);
|
|
|
|
|
|
|
|
|
|
/* Predefined types cannot be modified or closed */
|
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
if (H5Tset_precision (H5T_NATIVE_INT, 256)>=0) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" Predefined types should not be modifiable!");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
if (H5Tclose (H5T_NATIVE_INT)>=0) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" Predefined types should not be closable!");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
} H5E_END_TRY;
|
|
|
|
|
|
|
|
|
|
/* Copying a predefined type results in a modifiable copy */
|
|
|
|
|
if ((type=H5Tcopy (H5T_NATIVE_INT))<0) goto error;
|
|
|
|
|
if (H5Tset_precision (type, 256)<0) goto error;
|
1998-06-06 05:03:49 +08:00
|
|
|
|
|
|
|
|
|
/* It should not be possible to create an attribute for a transient type */
|
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
if (H5Acreate (type, "attr1", H5T_NATIVE_INT, space, H5P_DEFAULT)>=0) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" Attributes should not be allowed for transient types!");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
} H5E_END_TRY;
|
1998-06-05 06:28:11 +08:00
|
|
|
|
|
|
|
|
|
/* Create a dataset from a transient data type */
|
1998-06-06 05:03:49 +08:00
|
|
|
|
if (H5Tclose (type)<0) goto error;
|
1998-06-05 06:28:11 +08:00
|
|
|
|
if ((type = H5Tcopy (H5T_NATIVE_INT))<0) goto error;
|
|
|
|
|
if ((dset=H5Dcreate (file, "dset1", type, space, H5P_DEFAULT))<0) {
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* The type returned from a dataset should not be modifiable */
|
|
|
|
|
if ((t2 = H5Dget_type (dset))<0) goto error;
|
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
if (H5Tset_precision (t2, 256)>=0) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" Dataset data types should not be modifiable!");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
} H5E_END_TRY;
|
|
|
|
|
if (H5Tclose (t2)<0) goto error;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Close the dataset and reopen it, testing that it's type is still
|
|
|
|
|
* read-only.
|
|
|
|
|
*/
|
|
|
|
|
if (H5Dclose (dset)<0) goto error;
|
|
|
|
|
if ((dset=H5Dopen (file, "dset1"))<0) goto error;
|
|
|
|
|
if ((t2 = H5Dget_type (dset))<0) goto error;
|
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
if (H5Tset_precision (t2, 256)>=0) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" Dataset data types should not be modifiable!");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
} H5E_END_TRY;
|
|
|
|
|
if (H5Tclose (t2)<0) goto error;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Get the dataset data type by applying H5Tcopy() to the dataset. The
|
|
|
|
|
* result should be modifiable.
|
|
|
|
|
*/
|
|
|
|
|
if ((t2=H5Tcopy (dset))<0) goto error;
|
|
|
|
|
if (H5Tset_precision (t2, 256)<0) goto error;
|
|
|
|
|
if (H5Tclose (t2)<0) goto error;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
H5Dclose (dset);
|
|
|
|
|
H5Fclose (file);
|
|
|
|
|
H5Tclose (type);
|
|
|
|
|
H5Sclose (space);
|
|
|
|
|
puts (" PASSED");
|
1998-06-05 11:35:31 +08:00
|
|
|
|
return 0;
|
1998-06-05 06:28:11 +08:00
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
H5Tclose (t2);
|
|
|
|
|
H5Tclose (type);
|
|
|
|
|
H5Sclose (space);
|
|
|
|
|
H5Dclose (dset);
|
|
|
|
|
H5Fclose (file);
|
|
|
|
|
} H5E_END_TRY;
|
1998-06-05 11:35:31 +08:00
|
|
|
|
return -1;
|
1998-06-05 06:28:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: test_named
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Tests named data types.
|
|
|
|
|
*
|
1998-06-05 11:35:31 +08:00
|
|
|
|
* Return: Success: 0
|
1998-06-05 06:28:11 +08:00
|
|
|
|
*
|
1998-06-05 11:35:31 +08:00
|
|
|
|
* Failure: -1
|
1998-06-05 06:28:11 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, June 1, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static herr_t
|
|
|
|
|
test_named (void)
|
|
|
|
|
{
|
1998-06-06 05:03:49 +08:00
|
|
|
|
hid_t file, type, space, dset, t2, attr1;
|
1998-06-05 06:28:11 +08:00
|
|
|
|
herr_t status;
|
1998-06-06 05:03:49 +08:00
|
|
|
|
static hsize_t ds_size[2] = {10, 20};
|
1998-06-05 06:28:11 +08:00
|
|
|
|
|
|
|
|
|
printf ("%-70s", "Testing named data types");
|
1998-06-05 11:35:31 +08:00
|
|
|
|
if ((file=H5Fcreate (FILE_NAME_2, H5F_ACC_TRUNC|H5F_ACC_DEBUG,
|
1998-06-05 06:28:11 +08:00
|
|
|
|
H5P_DEFAULT, H5P_DEFAULT))<0) goto error;
|
|
|
|
|
space = H5Screate_simple (2, ds_size, ds_size);
|
|
|
|
|
|
|
|
|
|
/* Predefined types cannot be committed */
|
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
if (H5Tcommit (file, "test_named_1 (should not exist)",
|
|
|
|
|
H5T_NATIVE_INT)>=0) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" Predefined types should not be committable!");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
} H5E_END_TRY;
|
|
|
|
|
|
|
|
|
|
/* Copy a predefined data type and commit the copy */
|
|
|
|
|
if ((type = H5Tcopy (H5T_NATIVE_INT))<0) goto error;
|
|
|
|
|
if (H5Tcommit (file, "native-int", type)<0) goto error;
|
|
|
|
|
if ((status=H5Tcommitted (type))<0) goto error;
|
|
|
|
|
if (0==status) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" H5Tcommitted() returned false!");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* We should not be able to modify a type after it has been committed. */
|
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
if (H5Tset_precision (type, 256)>=0) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" Committed type is not constant!");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
} H5E_END_TRY;
|
|
|
|
|
|
|
|
|
|
/* We should not be able to re-commit a committed type */
|
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
if (H5Tcommit (file, "test_named_2 (should not exist)", type)>=0) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" Committed types should not be recommitted!");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
} H5E_END_TRY;
|
|
|
|
|
|
1998-06-06 05:03:49 +08:00
|
|
|
|
/* It should be possible to define an attribute for the named type */
|
|
|
|
|
if ((attr1=H5Acreate (type, "attr1", H5T_NATIVE_INT, space,
|
|
|
|
|
H5P_DEFAULT))<0) goto error;
|
|
|
|
|
if (H5Aclose (attr1)<0) goto error;
|
|
|
|
|
|
1998-06-05 06:28:11 +08:00
|
|
|
|
/*
|
|
|
|
|
* Copying a committed type should result in a transient type which is
|
|
|
|
|
* not locked.
|
|
|
|
|
*/
|
|
|
|
|
if ((t2 = H5Tcopy (type))<0) goto error;
|
|
|
|
|
if ((status=H5Tcommitted (t2))<0) goto error;
|
|
|
|
|
if (status) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" Copying a named type should result in a transient type!");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
if (H5Tset_precision (t2, 256)<0) goto error;
|
|
|
|
|
if (H5Tclose (t2)<0) goto error;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Close the committed type and reopen it. It should return a named type.
|
|
|
|
|
*/
|
|
|
|
|
if (H5Tclose (type)<0) goto error;
|
|
|
|
|
if ((type=H5Topen (file, "native-int"))<0) goto error;
|
|
|
|
|
if ((status=H5Tcommitted (type))<0) goto error;
|
|
|
|
|
if (!status) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" Opened named types should be named types!");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Create a dataset that uses the named type */
|
|
|
|
|
if ((dset = H5Dcreate (file, "dset1", type, space, H5P_DEFAULT))<0) {
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Get the dataset's data type and make sure it's a named type */
|
|
|
|
|
if ((t2 = H5Dget_type (dset))<0) goto error;
|
|
|
|
|
if ((status=H5Tcommitted (t2))<0) goto error;
|
|
|
|
|
if (!status) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" Dataset type should be a named type!");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Close the dataset, then close its type, then reopen the dataset */
|
|
|
|
|
if (H5Dclose (dset)<0) goto error;
|
|
|
|
|
if (H5Tclose (t2)<0) goto error;
|
|
|
|
|
if ((dset = H5Dopen (file, "dset1"))<0) goto error;
|
|
|
|
|
|
|
|
|
|
/* Get the dataset's type and make sure it's named */
|
|
|
|
|
if ((t2 = H5Dget_type (dset))<0) goto error;
|
|
|
|
|
if ((status=H5Tcommitted (t2))<0) goto error;
|
|
|
|
|
if (!status) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" Dataset type should be a named type!");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Close the dataset and create another with the type returned from the
|
|
|
|
|
* first dataset.
|
|
|
|
|
*/
|
|
|
|
|
if (H5Dclose (dset)<0) goto error;
|
|
|
|
|
if ((dset=H5Dcreate (file, "dset2", t2, space, H5P_DEFAULT))<0) {
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Reopen the second dataset and make sure the type is shared */
|
|
|
|
|
if (H5Tclose (t2)<0) goto error;
|
|
|
|
|
if (H5Dclose (dset)<0) goto error;
|
|
|
|
|
if ((dset = H5Dopen (file, "dset2"))<0) goto error;
|
|
|
|
|
if ((t2 = H5Dget_type (dset))<0) goto error;
|
|
|
|
|
if ((status=H5Tcommitted (t2))<0) goto error;
|
|
|
|
|
if (!status) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" Dataset type should be a named type!");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
if (H5Tclose (t2)<0) goto error;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Get the dataset data type by applying H5Tcopy() to the dataset. The
|
|
|
|
|
* result should be modifiable.
|
|
|
|
|
*/
|
|
|
|
|
if ((t2=H5Tcopy (dset))<0) goto error;
|
|
|
|
|
if (H5Tset_precision (t2, 256)<0) goto error;
|
|
|
|
|
if (H5Tclose (t2)<0) goto error;
|
|
|
|
|
|
|
|
|
|
/* Clean up */
|
|
|
|
|
if (H5Dclose (dset)<0) goto error;
|
|
|
|
|
if (H5Tclose (type)<0) goto error;
|
|
|
|
|
if (H5Sclose (space)<0) goto error;
|
|
|
|
|
if (H5Fclose (file)<0) goto error;
|
|
|
|
|
puts (" PASSED");
|
1998-06-05 11:35:31 +08:00
|
|
|
|
return 0;
|
1998-06-05 06:28:11 +08:00
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
H5Tclose (t2);
|
|
|
|
|
H5Tclose (type);
|
|
|
|
|
H5Sclose (space);
|
|
|
|
|
H5Dclose (dset);
|
|
|
|
|
H5Fclose (file);
|
|
|
|
|
} H5E_END_TRY;
|
1998-06-05 11:35:31 +08:00
|
|
|
|
return -1;
|
1998-06-05 06:28:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
1998-06-13 01:31:06 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: test_conv_num
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Test atomic number conversions.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success:
|
|
|
|
|
*
|
|
|
|
|
* Failure:
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Wednesday, June 10, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static herr_t
|
|
|
|
|
test_conv_num (void)
|
|
|
|
|
{
|
|
|
|
|
const size_t ntests=1;
|
|
|
|
|
const size_t nelmts=1;
|
|
|
|
|
|
|
|
|
|
size_t i, j;
|
|
|
|
|
void *buf=NULL, *saved=NULL;
|
|
|
|
|
|
|
|
|
|
printf ("%-70s", "Testing atomic number conversions");
|
|
|
|
|
|
|
|
|
|
/* Allocate buffers */
|
|
|
|
|
buf = malloc (nelmts*8);
|
|
|
|
|
saved = malloc (nelmts*8);
|
|
|
|
|
|
|
|
|
|
for (i=0; i<ntests; i++) {
|
|
|
|
|
|
|
|
|
|
/* Start with NATIVE_INT */
|
|
|
|
|
for (j=0; j<nelmts; j++) ((int*)buf)[j] = rand();
|
|
|
|
|
memcpy (saved, buf, nelmts*sizeof(int));
|
|
|
|
|
|
|
|
|
|
/* Convert there and back */
|
|
|
|
|
if (H5Tconvert (H5T_NATIVE_INT, H5T_IEEE_S64LE, nelmts, buf,
|
|
|
|
|
NULL)<0) goto error;
|
|
|
|
|
if (H5Tconvert (H5T_IEEE_S64LE, H5T_NATIVE_INT, nelmts, buf,
|
|
|
|
|
NULL)<0) goto error;
|
|
|
|
|
|
|
|
|
|
/* Check results */
|
|
|
|
|
for (j=0; j<nelmts; j++) {
|
|
|
|
|
if (((int*)buf)[j]!=((int*)saved)[j]) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
printf (" Test %lu, elmt %lu, got %d instead of %d\n",
|
|
|
|
|
(unsigned long)i, (unsigned long)j,
|
|
|
|
|
((int*)buf)[j], ((int*)saved)[j]);
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
puts (" PASSED");
|
|
|
|
|
free (buf);
|
|
|
|
|
free (saved);
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
if (buf) free (buf);
|
|
|
|
|
if (saved) free (saved);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1997-12-11 06:41:56 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* Function: main
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* Purpose: Test the data type interface.
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* Return: Success:
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* Failure:
|
1997-12-11 06:41:56 +08:00
|
|
|
|
*
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
1997-12-11 06:41:56 +08:00
|
|
|
|
* Tuesday, December 9, 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
int
|
1998-01-17 06:23:43 +08:00
|
|
|
|
main(void)
|
1997-12-11 06:41:56 +08:00
|
|
|
|
{
|
1998-06-05 11:35:31 +08:00
|
|
|
|
int nerrors = 0;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
1998-06-05 11:35:31 +08:00
|
|
|
|
/* Set the error handler */
|
|
|
|
|
H5Eset_auto (display_error_cb, NULL);
|
1998-06-05 06:28:11 +08:00
|
|
|
|
|
1998-06-05 11:35:31 +08:00
|
|
|
|
/* Do the tests */
|
|
|
|
|
nerrors += test_classes()<0 ? 1 : 0;
|
|
|
|
|
nerrors += test_copy()<0 ? 1 : 0;
|
|
|
|
|
nerrors += test_compound()<0 ? 1 : 0;
|
|
|
|
|
nerrors += test_transient ()<0 ? 1 : 0;
|
|
|
|
|
nerrors += test_named ()<0 ? 1 : 0;
|
1998-06-13 01:31:06 +08:00
|
|
|
|
#if 0
|
|
|
|
|
nerrors += test_conv_num ()<0 ? 1 : 0;
|
|
|
|
|
#endif
|
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
if (nerrors) {
|
|
|
|
|
printf("***** %d DATA TYPE TEST%s FAILED! *****\n",
|
|
|
|
|
nerrors, 1 == nerrors ? "" : "S");
|
|
|
|
|
exit(1);
|
|
|
|
|
}
|
|
|
|
|
printf("All data type tests passed.\n");
|
1998-06-06 05:03:49 +08:00
|
|
|
|
cleanup ();
|
1998-02-10 03:37:40 +08:00
|
|
|
|
return 0;
|
1997-12-11 06:41:56 +08:00
|
|
|
|
}
|