hdf5/test/tstab.c
Robb Matzke cdeeb5553a [svn-r136] ./MANIFEST
./src/Makefile.in
	Added H5Ffamily.c and H5Fsplit.c

./src/H5B.c
./src/H5Bprivate.h
./src/H5Gnode.c
	Added `const' to sublass arguments.

./src/H5F.c
./src/H5Flow.c
./src/H5Fsec2.c
	Make sure file buffers get flushed during a call to
	H5Fflush().  Check for overflow in address encoding and decoding.

./src/H5Ffam.c
./src/H5Fprivate.c
./test/istore.c
	Implementation of file families so 32-bit machines can access
	64-bit files.

./src/H5Oprivate.h
	Removed H5O_NO_ADDR constant.

./config/freebsd2.2.1
./config/linux
	Added -DH5G_DEBUG and -DH5F_DEBUG to the list of debugging flags.

./html/H5.format.html
	Changed some <offset>-sized things to <length>-sized things.

./src/H5AC.c
./src/H5ACprivate.h
./src/H5B.c
./src/H5Bprivate.h
./src/H5C.c
./src/H5D.c
./src/H5F.c
./src/H5Fcore.c
./src/H5Fistore.c
./src/H5Flow.c
./src/H5Fprivate.h
./src/H5Fsec2.c
./src/H5Fstdio.c
./src/H5G.c
./src/H5Gent.c
./src/H5Gnode.c
./src/H5Gpkg.h
./src/H5Gprivate.h
./src/H5Gshad.c
./src/H5Gstab.c
./src/H5H.c
./src/H5Hprivate.h
./src/H5MF.c
./src/H5MFprivate.h
./src/H5O.c
./src/H5Ocont.c
./src/H5Oistore.c
./src/H5Oprivate.h
./src/H5Ostab.c
./src/H5Ostdst.c
./src/H5pivate.h
./src/debug.c
./test/istore.c
./test/theap.c
./test/tohdr.c
./test/tstab.c
	Lots of changes caused by generalizing addresses.  The haddr_t
	is now a struct, so you can no longer perform arithmetic on
	it. But since it's small, simple, and often used, storage is
	allocated like with an integer.  But we always pass them
	around by reference.  That is, when using an address in
	another struct, allocate space:

		struct my_struct {
		   char *name;
		   haddr_t address;
                } x;

	But when passing it to a function, pass by reference:

		H5F_addr_print (stderr, &(x.address));

	Addresses should be initialized with

		H5F_addr_undef (&(x.address));

	Functions for operating on addresses are in H5Flow.c and begin
	with H5F_addr_...  Functions never return haddr_t or haddr_t*;
	they always pass them through arguments instead. A function
	that returns an address through an argument does so with its
	last argument and it is marked with `/*out*/'.  Calls to such
	functions also mark output-only arguments with `/*out*/'

./src/H5Fsplit.c       (new)
	A two-member family where all meta data goes in the first
	member and all raw data goes in the second member.

./src/H5B.c
./src/H5D.c
./src/H5F.c
./src/H5Ffamily.c
./src/H5Fistore.c
./src/H5Flow.c
./src/H5Fprivate.h
./src/H5Fsec2.c
./src/H5Fstdio.c
./src/H5Gnode.c
./src/H5H.c
./src/H5MF.c
./src/H5MFprivate.h
./src/H5O.c
	Differentiate between meta data storage and raw data
	storage. Provide a mechanism so that the file driver can
	extend the file to allocate more memory.

./src/H5E.c
./src/H5Epublic.c
	Added the error H5E_TRUNCATED to be reported when the file is
	shorter than the length recorded in the boot block.

./src/H5F.c
	Added H5F_locate_signature() so we only do it in one place
	now.

./INSTALL
./INSTALL_MAINT
	Just a couple clarifications.

./html/ExternalFiles.html
./html/storage.html
	Documents how external files work.

./test/hyperslab.c
./test/istore.c
	Fixed printf's on 64-bit machines.

./test/istore.c
	Added ifdef's to test the split file driver.
1997-11-14 09:42:14 -05:00

289 lines
7.5 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*-------------------------------------------------------------------------
* Copyright (C) 1997 National Center for Supercomputing Applications.
* All rights reserved.
*
*-------------------------------------------------------------------------
*
* Created: tstab.c
* Aug 7 1997
* Robb Matzke <matzke@llnl.gov>
*
* Purpose:
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
#include <testhdf5.h>
#include <H5private.h>
#include <H5ACprivate.h>
#include <H5Fprivate.h>
#include <H5Gprivate.h>
#include <H5Oprivate.h>
/*
* This file needs to access private datatypes from the H5G package.
*/
#define H5G_PACKAGE
#include <H5Gpkg.h>
/*-------------------------------------------------------------------------
* Function: test_1
*
* Purpose: Tests the non-directory features of the HDF5 file. If the
* file has just one non-directory object, then that object
* should be the root object and there is no directory.
*
* Return: void
*
* Programmer: Robb Matzke
* robb@maya.nuance.com
* Aug 29 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static void
test_1 (void)
{
hid_t fid;
H5F_t *f;
H5G_entry_t *obj1=NULL, *obj2=NULL;
H5G_entry_t ent1, dir_ent;
herr_t status;
H5O_name_t name_mesg;
void *status_ptr;
hbool_t b;
MESSAGE (2, ("........non-directory files\n"));
/*
* Test 1A: Create an empty file and add a non-directory object
* to the file with the name `/'. The object should become the
* root object and should not have a name message.
*/
/* create the file */
fid = H5Fcreate ("tstab1.h5", H5ACC_OVERWRITE, 0, 0);
CHECK (fid, FAIL, "H5Fcreate");
f = H5Aatom_object (fid);
CHECK (f, NULL, "H5Aatom_object");
/* create the object */
obj1 = H5G_create (f, "/", 0);
CHECK_PTR (obj1, "H5G_new");
/* look for a name message -- it shouldn't be present */
status_ptr = H5O_read (f, NO_ADDR, obj1, H5O_NAME, 0, &name_mesg);
VERIFY (status_ptr, NULL, "H5O_read [didn't fail but should have]");
/*
* Test 1B: Attempt to read the root object using the name `/'.
*/
memset (&dir_ent, 0xff, sizeof(H5G_entry_t));
memset (&ent1, 0xff, sizeof(H5G_entry_t));
status = H5G_find (f, "/", &dir_ent, &ent1);
CHECK_I (status, "H5G_find");
/* Is it really the root object? */
b = H5F_addr_defined (&(dir_ent.header));
VERIFY (b, FALSE, "H5G_create");
b = H5F_addr_eq (&(ent1.header), &(obj1->header));
VERIFY (b, TRUE, "H5G_create");
/*
* Test 1C: Add a second object to the file to see if the first object
* gets moved into the new root directory along with the second object.
*/
/* create the object */
obj2 = H5G_create (f, "/second", 0);
CHECK_PTR (obj2, "H5G_new");
/* try to read the first object */
HDmemset (&ent1, 0xff, sizeof(H5G_entry_t));
status = H5G_find (f, "/Root Object", NULL, &ent1);
CHECK_I (status, "H5G_find");
b = H5F_addr_defined (&(ent1.header));
VERIFY (b, TRUE, "H5G_create");
b = H5F_addr_eq (&(ent1.header), &(obj1->header));
VERIFY (b, TRUE, "H5G_create");
/* close the objects */
H5G_close (f, obj1);
obj1 = NULL;
H5G_close (f, obj2);
obj2 = NULL;
/* close the file */
H5Fclose (fid);
/*
* Test 1D: Create an empty file and add a non-directory object
* to the file with the name `/foo'. The object should become the
* root object and should have a name message with the value `foo'.
*/
/* create the file */
fid = H5Fcreate ("tstab1.h5", H5ACC_OVERWRITE, 0, 0);
CHECK (fid, FAIL, "H5Fcreate");
f = H5Aatom_object (fid);
CHECK (f, NULL, "H5Aatom_object");
/* create the object */
obj1 = H5G_create (f, "/foo", 0);
CHECK_PTR (obj1, "H5G_create");
/* does it have the correct name message? */
status_ptr = H5O_read (f, NO_ADDR, obj1, H5O_NAME, 0, &name_mesg);
CHECK_PTR (status_ptr, "H5O_read");
CHECK_PTR (name_mesg.s, "H5O_read");
VERIFY (strcmp(name_mesg.s, "foo"), 0, "H5O_read");
if (status_ptr) H5O_reset (H5O_NAME, &name_mesg); /*free message data*/
/*
* Test 1E: Try to read the root object with the name `/' and `/foo'
*/
HDmemset (&dir_ent, 0, sizeof(H5G_entry_t));
HDmemset (&ent1, 0, sizeof(H5G_entry_t));
status = H5G_find (f, "/", &dir_ent, &ent1);
CHECK_I (status, "H5G_find");
b = H5F_addr_defined (&(dir_ent.header));
VERIFY (b, FALSE, "H5G_create");
b = H5F_addr_eq (&(ent1.header), &(obj1->header));
VERIFY (b, TRUE, "H5G_create");
/* now as `/foo' */
HDmemset (&dir_ent, 0, sizeof(H5G_entry_t));
HDmemset (&ent1, 0, sizeof(H5G_entry_t));
status = H5G_find (f, "/foo", &dir_ent, &ent1);
CHECK_I (status, "H5G_find");
b = H5F_addr_defined (&(dir_ent.header));
VERIFY (b, FALSE, "H5G_create");
b = H5F_addr_eq (&(ent1.header), &(obj1->header));
VERIFY (b, TRUE, "H5G_find");
/*
* Test 1F: Create another object. This should create a root directory
* and move the previous root object into that directory.
*/
/* create the object */
obj2 = H5G_create (f, "/second", 0);
CHECK_PTR (obj2, "H5G_new");
/* try to read the first object */
HDmemset (&ent1, 0, sizeof(H5G_entry_t));
status = H5G_find (f, "/foo", NULL, &ent1);
CHECK_I (status, "H5G_find");
b = H5F_addr_eq (&(ent1.header), &(obj1->header));
VERIFY (b, TRUE, "H5G_find");
/* the first object should not have a name message */
status_ptr = H5O_read (f, NO_ADDR, obj1, H5O_NAME, 0, &name_mesg);
VERIFY (status_ptr, NULL, "H5O_read [didn't fail but should have]");
/* close the objects */
H5G_close (f, obj1);
obj1 = NULL;
H5G_close (f, obj2);
obj2 = NULL;
/* close the file */
status = H5Fclose (fid);
CHECK_I (status, "H5Fclose");
}
/*-------------------------------------------------------------------------
* Function: test_2
*
* Purpose: Creates a really large directory.
*
* Return: void
*
* Programmer: Robb Matzke
* robb@maya.nuance.com
* Aug 29 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static void
test_2 (void)
{
hid_t fid;
H5F_t *f;
H5G_entry_t *obj1=NULL;
int i;
char name[256];
herr_t status;
int nsyms = 5000;
MESSAGE (2, ("........large directories\n"));
/* create the file */
fid = H5Fcreate ("tstab2.h5", H5ACC_OVERWRITE, 0, 0);
CHECK (fid, FAIL, "H5Fcreate");
f = H5Aatom_object (fid);
CHECK (f, NULL, "H5Aatom_object");
f->intent |= H5F_ACC_DEBUG;
/*
* Create a directory that has so many entries that the root
* of the B-tree ends up splitting.
*/
obj1 = H5G_new (f, "/big", nsyms*12+2);
CHECK_PTR (obj1, "H5G_mkdir");
H5G_close (f, obj1);
obj1 = NULL;
for (i=0; i<nsyms; i++) {
sprintf (name, "/big/%05d%05d", rand()%100000, i);
MESSAGE (8, ("%s\n", name));
obj1 = H5G_create (f, name, 0);
CHECK_PTR (obj1, "H5G_mkdir");
H5G_close (f, obj1);
obj1 = NULL;
}
/* close the file */
status = H5Fclose (fid);
CHECK_I (status, "H5Fclose");
}
/*-------------------------------------------------------------------------
* Function: test_stab
*
* Purpose: Test symbol tables
*
* Return: void
*
* Programmer: Robb Matzke
* matzke@viper.llnl.gov
* Aug 7 1997
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
void
test_stab (void)
{
test_1();
test_2();
}