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};
|
[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 file=-1, type=-1, space=-1, dset=-1, t2=-1;
|
1998-06-05 06:28:11 +08:00
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
{
|
[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 file=-1, type=-1, space=-1, dset=-1, t2=-1, attr1=-1;
|
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)
|
|
|
|
|
{
|
1998-06-17 03:38:26 +08:00
|
|
|
|
const size_t ntests=100;
|
|
|
|
|
const size_t nelmts=2000;
|
1998-06-13 01:31:06 +08:00
|
|
|
|
|
|
|
|
|
size_t i, j;
|
|
|
|
|
void *buf=NULL, *saved=NULL;
|
1998-06-17 03:38:26 +08:00
|
|
|
|
unsigned char byte[4];
|
1998-06-13 01:31:06 +08:00
|
|
|
|
|
1998-06-17 03:38:26 +08:00
|
|
|
|
/*---------------------------------------------------------------------
|
|
|
|
|
* Test some specific overflow/underflow cases.
|
|
|
|
|
*---------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
printf ("%-70s", "Testing atomic number overflow conversions");
|
|
|
|
|
fflush (stdout);
|
|
|
|
|
|
|
|
|
|
/* (unsigned)0x80000000 -> (unsigned)0xffff */
|
|
|
|
|
byte[0] = byte[1] = byte[2] = 0;
|
|
|
|
|
byte[3] = 0x80;
|
1998-06-19 05:03:30 +08:00
|
|
|
|
if (H5Tconvert (H5T_STD_U32LE, H5T_STD_U16LE, 1, byte, NULL)<0) {
|
1998-06-17 03:38:26 +08:00
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
if (byte[0]!=0xff || byte[1]!=0xff) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" (unsigned)0x80000000 -> (unsigned)0xffff");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* (unsigned)0xffffffff -> (signed)0x7fff */
|
|
|
|
|
byte[0] = byte[1] = byte[2] = byte[3] = 0xff;
|
1998-06-19 05:03:30 +08:00
|
|
|
|
if (H5Tconvert (H5T_STD_U32LE, H5T_STD_I16LE, 1, byte, NULL)<0) {
|
1998-06-17 03:38:26 +08:00
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
if (byte[0]!=0xff || byte[1]!=0x7f) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" (unsigned)0xffffffff -> (signed)0x7f");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
1998-06-13 01:31:06 +08:00
|
|
|
|
|
1998-06-17 03:38:26 +08:00
|
|
|
|
/* (signed)0xffffffff -> (unsigned)0x0000 */
|
|
|
|
|
byte[0] = byte[1] = byte[2] = byte[3] = 0xff;
|
1998-06-19 05:03:30 +08:00
|
|
|
|
if (H5Tconvert (H5T_STD_I32LE, H5T_STD_U16LE, 1, byte, NULL)<0) {
|
1998-06-17 03:38:26 +08:00
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
if (byte[0]!=0x00 || byte[1]!=0x00) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" (signed)0xffffffff -> (unsigned)0x00");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* (signed)0x7fffffff -> (unsigned)0xffff */
|
|
|
|
|
byte[0] = byte[1] = byte[2] = 0xff;
|
|
|
|
|
byte[3] = 0x7f;
|
1998-06-19 05:03:30 +08:00
|
|
|
|
if (H5Tconvert (H5T_STD_I32LE, H5T_STD_U16LE, 1, byte, NULL)<0) {
|
1998-06-17 03:38:26 +08:00
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
if (byte[0]!=0xff || byte[1]!=0xff) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" (signed)0x7fffffff -> (unsigned)0xffff");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* (signed)0x7fffffff -> (signed)0x7fff */
|
|
|
|
|
byte[0] = byte[1] = byte[2] = 0xff;
|
|
|
|
|
byte[3] = 0x7f;
|
1998-06-19 05:03:30 +08:00
|
|
|
|
if (H5Tconvert (H5T_STD_I32LE, H5T_STD_I16LE, 1, byte, NULL)<0) {
|
1998-06-17 03:38:26 +08:00
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
if (byte[0]!=0xff || byte[1]!=0x7f) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" (signed)0x7fffffff -> (signed)0x7fff");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* (signed)0xbfffffff -> (signed)0x8000 */
|
|
|
|
|
byte[0] = byte[1] = byte[2] = 0xff;
|
|
|
|
|
byte[3] = 0xbf;
|
1998-06-19 05:03:30 +08:00
|
|
|
|
if (H5Tconvert (H5T_STD_I32LE, H5T_STD_I16LE, 1, byte, NULL)<0) {
|
1998-06-17 03:38:26 +08:00
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
if (byte[0]!=0x00 || byte[1]!=0x80) {
|
|
|
|
|
puts ("*FAILED*");
|
|
|
|
|
puts (" (signed)0xbfffffff -> (signed)0x8000");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
puts (" PASSED");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------
|
|
|
|
|
* Test random cases.
|
|
|
|
|
*-----------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
printf ("%-70s", "Testing atomic number random conversions");
|
|
|
|
|
fflush (stdout);
|
|
|
|
|
|
1998-06-13 01:31:06 +08:00
|
|
|
|
/* 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 */
|
1998-06-19 05:03:30 +08:00
|
|
|
|
if (H5Tconvert (H5T_NATIVE_INT, H5T_STD_I64LE, nelmts, buf,
|
1998-06-13 01:31:06 +08:00
|
|
|
|
NULL)<0) goto error;
|
1998-06-19 05:03:30 +08:00
|
|
|
|
if (H5Tconvert (H5T_STD_I64LE, H5T_NATIVE_INT, nelmts, buf,
|
1998-06-13 01:31:06 +08:00
|
|
|
|
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
|
|
|
|
nerrors += test_conv_num ()<0 ? 1 : 0;
|
|
|
|
|
|
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
|
|
|
|
}
|