1997-07-31 05:17:56 +08:00
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Copyright (C) 1997 National Center for Supercomputing Applications.
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* Created: H5G.c
|
|
|
|
|
* Jul 18 1997
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* Robb Matzke <matzke@llnl.gov>
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*
|
1997-08-10 00:45:59 +08:00
|
|
|
|
* Purpose: Symbol table functions. The functions that
|
|
|
|
|
* begin with `H5G_stab_' don't understand the
|
|
|
|
|
* directory hierarchy; they operate on a single
|
|
|
|
|
* symbol table at a time.
|
|
|
|
|
*
|
|
|
|
|
* The functions that begin with `H5G_node_' operate
|
|
|
|
|
* on the leaf nodes of a symbol table B-tree. They
|
|
|
|
|
* should be defined in the H5Gnode.c file.
|
|
|
|
|
*
|
|
|
|
|
* The remaining functions know about the directory
|
|
|
|
|
* hierarchy.
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
* Robb Matzke, 5 Aug 1997
|
|
|
|
|
* Added calls to H5E.
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Robb Matzke, 30 Aug 1997
|
|
|
|
|
* Added `Errors:' field to function prologues.
|
|
|
|
|
*
|
1997-09-20 00:36:59 +08:00
|
|
|
|
* Robb Matzke, 18 Sep 1997
|
|
|
|
|
* Added shadow entry support.
|
|
|
|
|
*
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1997-09-20 00:36:59 +08:00
|
|
|
|
#define H5G_PACKAGE /*suppress error message about including H5Gpkg.h*/
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
|
1997-07-31 05:17:56 +08:00
|
|
|
|
/* Packages needed by this file... */
|
1997-08-16 00:51:34 +08:00
|
|
|
|
#include <H5private.h>
|
|
|
|
|
#include <H5Bprivate.h>
|
|
|
|
|
#include <H5Eprivate.h>
|
1997-09-20 00:36:59 +08:00
|
|
|
|
#include <H5Gpkg.h>
|
1997-08-16 00:51:34 +08:00
|
|
|
|
#include <H5Hprivate.h>
|
|
|
|
|
#include <H5MMprivate.h>
|
|
|
|
|
#include <H5Oprivate.h>
|
1997-08-08 03:23:00 +08:00
|
|
|
|
|
1997-08-16 00:51:34 +08:00
|
|
|
|
#define H5G_INIT_HEAP 8192
|
1997-09-20 00:36:59 +08:00
|
|
|
|
#define PABLO_MASK H5G_mask
|
1997-08-08 03:23:00 +08:00
|
|
|
|
|
1997-08-29 00:37:58 +08:00
|
|
|
|
static herr_t H5G_mkroot (hdf5_file_t *f, size_t size_hint);
|
1997-08-08 03:23:00 +08:00
|
|
|
|
|
|
|
|
|
/* Is the interface initialized? */
|
1997-09-20 00:36:59 +08:00
|
|
|
|
static hbool_t interface_initialize_g = FALSE;
|
1997-07-31 05:17:56 +08:00
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_component
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Returns the pointer to the first component of the
|
|
|
|
|
* specified name by skipping leading slashes. Returns
|
|
|
|
|
* the size in characters of the component through SIZE_P not
|
|
|
|
|
* counting leading slashes or the null terminator.
|
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
*
|
1997-08-13 06:44:46 +08:00
|
|
|
|
* Return: Success: Ptr into NAME.
|
|
|
|
|
*
|
|
|
|
|
* Failure: Ptr to the null terminator of NAME.
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* robb@maya.nuance.com
|
|
|
|
|
* Aug 11 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static const char *
|
|
|
|
|
H5G_component (const char *name, size_t *size_p)
|
|
|
|
|
{
|
|
|
|
|
assert (name);
|
|
|
|
|
|
|
|
|
|
while ('/'==*name) name++;
|
1997-09-02 23:38:26 +08:00
|
|
|
|
if (size_p) *size_p = HDstrcspn (name, "/");
|
1997-08-13 06:44:46 +08:00
|
|
|
|
return name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_basename
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Returns a pointer into NAME for the start of the last
|
|
|
|
|
* component of NAME. On return, the optional SIZE_P is
|
|
|
|
|
* initialized to point to the size of the base name not
|
|
|
|
|
* counting trailing slashes or the null character.
|
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
*
|
1997-08-13 06:44:46 +08:00
|
|
|
|
* Return: Success: Ptr to base name within NAME with SIZE_P
|
|
|
|
|
* pointing to the number of characters in the
|
|
|
|
|
* base name.
|
|
|
|
|
*
|
|
|
|
|
* Failure: Ptr to the null terminator of NAME.
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* robb@maya.nuance.com
|
|
|
|
|
* Aug 11 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1997-08-30 00:58:58 +08:00
|
|
|
|
#if 0
|
1997-08-13 06:44:46 +08:00
|
|
|
|
static const char *
|
|
|
|
|
H5G_basename (const char *name, size_t *size_p)
|
|
|
|
|
{
|
|
|
|
|
const char *s;
|
|
|
|
|
|
|
|
|
|
assert (name);
|
|
|
|
|
|
1997-08-29 00:37:58 +08:00
|
|
|
|
s = name + HDstrlen(name);
|
1997-08-13 06:44:46 +08:00
|
|
|
|
while (s>name && '/'==s[-1]) --s; /*skip past trailing slashes*/
|
|
|
|
|
while (s>name && '/'!=s[-1]) --s; /*skip past base name*/
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* If the input was the name of the root directory `/' (or
|
|
|
|
|
* equivalent) then return the null string.
|
|
|
|
|
*/
|
|
|
|
|
if ('/'==*s) {
|
|
|
|
|
if (size_p) *size_p = 0;
|
1997-08-29 00:37:58 +08:00
|
|
|
|
return s + HDstrlen(s); /*null terminator*/
|
1997-08-13 06:44:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
1997-09-02 23:38:26 +08:00
|
|
|
|
if (size_p) *size_p = HDstrcspn (s, "/");
|
1997-08-13 06:44:46 +08:00
|
|
|
|
return s;
|
|
|
|
|
}
|
1997-08-30 00:58:58 +08:00
|
|
|
|
#endif
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_namei
|
|
|
|
|
*
|
1997-08-29 00:37:58 +08:00
|
|
|
|
* Purpose: (Partially) translates a name to a symbol table entry.
|
|
|
|
|
*
|
|
|
|
|
* Given a name (absolute or relative) return the symbol table
|
1997-08-13 06:44:46 +08:00
|
|
|
|
* entry for that name and for the directory that contains the
|
|
|
|
|
* base name. These entries (DIR_ENT and BASE_ENT) are returned
|
|
|
|
|
* through memory passed into the function by the caller. Either
|
|
|
|
|
* or both pointers may be null. Absolute names are looked up
|
|
|
|
|
* relative to the root directory of file F while relative
|
|
|
|
|
* names are traversed beginning at the CWD argument.
|
|
|
|
|
*
|
|
|
|
|
* Consecutive slash characters are treated like single
|
|
|
|
|
* slash characters. Trailing slashes are ignored. The
|
|
|
|
|
* component `.' is recognized as the current directory
|
|
|
|
|
* during the traversal (initially CWD), but the component
|
|
|
|
|
* `..' is not internally recognized (it is recognized if
|
|
|
|
|
* such a name appears in the symbol table).
|
|
|
|
|
*
|
|
|
|
|
* If the name cannot be fully resolved, then REST will
|
|
|
|
|
* point to the part of NAME where the traversal failed
|
1997-09-20 00:36:59 +08:00
|
|
|
|
* (REST will always point to a relative name) and this
|
|
|
|
|
* function will return null. DIR_ENT will be initialized with
|
1997-08-13 06:44:46 +08:00
|
|
|
|
* information about the directory (or other object) at which
|
|
|
|
|
* the traversal failed. However, if the name can be fully
|
|
|
|
|
* resolved, then REST points to the null terminator of NAME.
|
|
|
|
|
*
|
1997-08-29 00:37:58 +08:00
|
|
|
|
* As a special case, if the NAME is the name `/' (or
|
1997-09-20 00:36:59 +08:00
|
|
|
|
* equivalent) then DIR_ENT is initialized to all zero
|
|
|
|
|
* and a pointer to the root symbol table entry is returned.
|
1997-08-29 00:37:58 +08:00
|
|
|
|
*
|
|
|
|
|
* As a special case, if the NAME is the string `/foo' (or
|
|
|
|
|
* equivalent) and the root symbol table entry points to a
|
|
|
|
|
* non-directory object with a name message with the value
|
1997-09-20 00:36:59 +08:00
|
|
|
|
* `foo' then DIR_ENT is initialized to all zero and a pointer
|
|
|
|
|
* to the root symbol table entry is returned.
|
1997-08-29 00:37:58 +08:00
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
* DIRECTORY COMPLEN Component is too long.
|
|
|
|
|
* DIRECTORY NOTFOUND Component not found.
|
|
|
|
|
* DIRECTORY NOTFOUND Root not found.
|
|
|
|
|
*
|
1997-09-20 00:36:59 +08:00
|
|
|
|
* Return: Success: Pointer to a cached symbol table entry if the
|
|
|
|
|
* name can be fully resolved. The pointer is
|
|
|
|
|
* valid until one of the H5AC (cache) functions
|
|
|
|
|
* is called.
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1997-09-20 00:36:59 +08:00
|
|
|
|
* Failure: Null if the name could not be fully resolved.
|
|
|
|
|
* REST and DIR_ENT are initialized (possibly to
|
|
|
|
|
* zero if the failure occurred soon enough).
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* robb@maya.nuance.com
|
|
|
|
|
* Aug 11 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1997-09-20 00:36:59 +08:00
|
|
|
|
static H5G_entry_t *
|
1997-08-13 06:44:46 +08:00
|
|
|
|
H5G_namei (hdf5_file_t *f, H5G_entry_t *cwd, const char *name,
|
1997-09-20 00:36:59 +08:00
|
|
|
|
const char **rest, H5G_entry_t *dir_ent)
|
1997-08-13 06:44:46 +08:00
|
|
|
|
{
|
1997-09-20 00:36:59 +08:00
|
|
|
|
H5G_entry_t dir; /*entry for current directory */
|
1997-08-13 06:44:46 +08:00
|
|
|
|
size_t nchars; /*component name length */
|
|
|
|
|
char comp[1024]; /*component name buffer */
|
1997-08-29 00:37:58 +08:00
|
|
|
|
hbool_t aside = FALSE; /*did we look at a name message?*/
|
1997-09-20 00:36:59 +08:00
|
|
|
|
H5G_entry_t *ret_value=NULL; /*return value */
|
|
|
|
|
|
|
|
|
|
/* clear output args before FUNC_ENTER() in case it fails */
|
|
|
|
|
if (rest) *rest = name;
|
|
|
|
|
if (dir_ent) memset (dir_ent, 0, sizeof(H5G_entry_t));
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
1997-09-20 00:36:59 +08:00
|
|
|
|
FUNC_ENTER (H5G_namei, NULL, NULL);
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
|
|
|
|
/* check args */
|
|
|
|
|
assert (f);
|
|
|
|
|
assert (f->root_sym);
|
|
|
|
|
assert (name && *name);
|
|
|
|
|
assert (cwd || '/'==*name);
|
|
|
|
|
|
|
|
|
|
/* starting point */
|
|
|
|
|
if ('/'==*name) {
|
1997-09-20 00:36:59 +08:00
|
|
|
|
if (f->root_sym->header<=0) {
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_NOTFOUND, NULL);
|
|
|
|
|
}
|
|
|
|
|
ret_value = f->root_sym;
|
|
|
|
|
dir = *(f->root_sym);
|
1997-08-13 06:44:46 +08:00
|
|
|
|
} else {
|
1997-09-20 00:36:59 +08:00
|
|
|
|
ret_value = cwd;
|
|
|
|
|
dir = *cwd;
|
1997-08-13 06:44:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* traverse the name */
|
|
|
|
|
while ((name=H5G_component (name, &nchars)) && *name) {
|
|
|
|
|
|
|
|
|
|
/*
|
1997-09-20 00:36:59 +08:00
|
|
|
|
* The special name `.' is a no-op.
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*/
|
|
|
|
|
if ('.'==name[0] && !name[1]) continue;
|
|
|
|
|
|
|
|
|
|
/*
|
1997-09-20 00:36:59 +08:00
|
|
|
|
* Advance to the next component of the name.
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*/
|
1997-09-20 00:36:59 +08:00
|
|
|
|
dir = *ret_value;
|
|
|
|
|
ret_value = NULL;
|
1997-08-13 06:44:46 +08:00
|
|
|
|
if (rest) *rest = name;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Copy the component name into a null-terminated buffer so
|
|
|
|
|
* we can pass it down to the other symbol table functions.
|
|
|
|
|
*/
|
|
|
|
|
if (nchars+1 > sizeof(comp)) {
|
1997-09-02 23:38:26 +08:00
|
|
|
|
/* component is too long */
|
1997-09-20 00:36:59 +08:00
|
|
|
|
if (dir_ent) *dir_ent = dir;
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_COMPLEN, NULL);
|
1997-08-13 06:44:46 +08:00
|
|
|
|
}
|
|
|
|
|
HDmemcpy (comp, name, nchars);
|
|
|
|
|
comp[nchars] = '\0';
|
|
|
|
|
|
1997-09-20 00:36:59 +08:00
|
|
|
|
if (NULL==(ret_value=H5G_stab_find (f, NO_ADDR, &dir, comp))) {
|
1997-08-29 00:37:58 +08:00
|
|
|
|
/*
|
1997-09-20 00:36:59 +08:00
|
|
|
|
* Component was not found in the current symbol table, possibly
|
|
|
|
|
* because DIR isn't a symbol table. If it is the root symbol then
|
1997-08-29 00:37:58 +08:00
|
|
|
|
* see if it has the appropriate name field. The ASIDE variable
|
|
|
|
|
* prevents us from saying `/foo/foo' where the root object has
|
|
|
|
|
* the name `foo'.
|
|
|
|
|
*/
|
1997-09-17 04:07:12 +08:00
|
|
|
|
H5O_name_t mesg={0};
|
1997-09-20 00:36:59 +08:00
|
|
|
|
if (!aside && dir.header==f->root_sym->header &&
|
|
|
|
|
H5O_read (f, dir.header, &dir, H5O_NAME, 0, &mesg) &&
|
|
|
|
|
!HDstrcmp (mesg.s, comp)) {
|
1997-08-29 00:37:58 +08:00
|
|
|
|
H5O_reset (H5O_NAME, &mesg);
|
1997-09-20 00:36:59 +08:00
|
|
|
|
ret_value = f->root_sym;
|
|
|
|
|
aside = TRUE;
|
1997-08-30 00:58:58 +08:00
|
|
|
|
} else {
|
|
|
|
|
/* component not found */
|
1997-09-20 00:36:59 +08:00
|
|
|
|
H5O_reset (H5O_NAME, &mesg);
|
|
|
|
|
if (dir_ent) *dir_ent = dir;
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_NOTFOUND, NULL);
|
1997-08-29 00:37:58 +08:00
|
|
|
|
}
|
1997-08-13 06:44:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* next component */
|
|
|
|
|
name += nchars;
|
|
|
|
|
}
|
1997-08-29 00:37:58 +08:00
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
/* output parameters */
|
|
|
|
|
if (rest) *rest = name; /*final null*/
|
1997-08-29 00:37:58 +08:00
|
|
|
|
if (dir_ent) {
|
1997-09-20 00:36:59 +08:00
|
|
|
|
if (ret_value->header == f->root_sym->header) {
|
1997-08-29 00:37:58 +08:00
|
|
|
|
HDmemset (dir_ent, 0, sizeof(H5G_entry_t)); /*root has no parent*/
|
|
|
|
|
} else {
|
1997-09-20 00:36:59 +08:00
|
|
|
|
*dir_ent = dir;
|
1997-08-29 00:37:58 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Perhaps the root object doesn't even exist! */
|
1997-09-20 00:36:59 +08:00
|
|
|
|
if (ret_value->header<=0) {
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_NOTFOUND, NULL); /*root not found*/
|
1997-08-29 00:37:58 +08:00
|
|
|
|
}
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
1997-09-20 00:36:59 +08:00
|
|
|
|
FUNC_LEAVE (ret_value);
|
1997-08-13 06:44:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_mkroot
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Creates the root directory if it doesn't exist; otherwise
|
1997-08-29 00:37:58 +08:00
|
|
|
|
* nothing happens. If the root symbol table entry previously
|
|
|
|
|
* pointed to something other than a directory, then that object
|
|
|
|
|
* is made a member of the root directory and is given a name
|
|
|
|
|
* corresponding to the object's name message (the name message
|
|
|
|
|
* is removed). If the root object doesn't have a name message
|
1997-08-13 06:44:46 +08:00
|
|
|
|
* then the name `Root Object' is used.
|
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
* DIRECTORY CANTINIT Can't create root.
|
|
|
|
|
* DIRECTORY CANTINIT Can't insert old root object in
|
|
|
|
|
* new root directory.
|
|
|
|
|
* DIRECTORY EXISTS Root directory already exists.
|
|
|
|
|
*
|
1997-08-13 06:44:46 +08:00
|
|
|
|
* Return: Success: SUCCEED
|
|
|
|
|
*
|
|
|
|
|
* Failure: FAIL
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* robb@maya.nuance.com
|
|
|
|
|
* Aug 11 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1997-08-29 00:37:58 +08:00
|
|
|
|
static herr_t
|
1997-08-13 06:44:46 +08:00
|
|
|
|
H5G_mkroot (hdf5_file_t *f, size_t size_hint)
|
|
|
|
|
{
|
|
|
|
|
H5O_stab_t stab; /*symbol table message */
|
1997-09-17 04:07:12 +08:00
|
|
|
|
H5O_name_t name={0}; /*object name message */
|
1997-08-13 06:44:46 +08:00
|
|
|
|
H5G_entry_t root; /*old root entry */
|
|
|
|
|
const char *root_name=NULL; /*name of old root object */
|
1997-08-13 23:36:47 +08:00
|
|
|
|
intn nlinks; /*number of links */
|
1997-09-20 00:36:59 +08:00
|
|
|
|
H5G_entry_t *handle; /*handle for open object */
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER (H5G_mkroot, NULL, FAIL);
|
|
|
|
|
|
1997-09-20 00:36:59 +08:00
|
|
|
|
/*
|
|
|
|
|
* Make sure we have the latest info since someone might have the root
|
|
|
|
|
* object open for modifications.
|
|
|
|
|
*/
|
|
|
|
|
H5G_shadow_sync (f->root_sym);
|
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
/*
|
|
|
|
|
* Is there already a root object that needs to move into the new
|
1997-08-29 00:37:58 +08:00
|
|
|
|
* root symbol table? The root object is a symbol table if we can
|
|
|
|
|
* read the H5O_STAB message.
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*/
|
|
|
|
|
if (f->root_sym->header>0) {
|
1997-09-20 00:36:59 +08:00
|
|
|
|
if (H5O_read (f, NO_ADDR, f->root_sym, H5O_STAB, 0, &stab)) {
|
1997-08-13 06:44:46 +08:00
|
|
|
|
/* root directory already exists */
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_EXISTS, FAIL);
|
1997-08-30 06:23:04 +08:00
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
} else if (H5O_read (f, f->root_sym->header, f->root_sym, H5O_NAME,
|
|
|
|
|
0, &name)) {
|
1997-09-20 00:36:59 +08:00
|
|
|
|
root_name = name.s; /*dont reset name until root_name is done!*/
|
1997-08-30 06:23:04 +08:00
|
|
|
|
root = *(f->root_sym);
|
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
} else {
|
|
|
|
|
root = *(f->root_sym);
|
|
|
|
|
root_name = "Root Object";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Create the root directory.
|
|
|
|
|
*/
|
|
|
|
|
if (H5G_stab_new (f, f->root_sym, size_hint)<0) {
|
|
|
|
|
H5O_reset (H5O_NAME, &name);
|
1997-09-02 23:38:26 +08:00
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_CANTINIT, FAIL); /*can't create root*/
|
1997-08-13 06:44:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
1997-08-13 23:36:47 +08:00
|
|
|
|
* Increase the link count for the root symbol table!
|
|
|
|
|
*/
|
|
|
|
|
nlinks = H5O_link (f, f->root_sym->header, f->root_sym, 1);
|
|
|
|
|
assert (1==nlinks);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Insert the old root object. It should already have a link count
|
|
|
|
|
* of 1.
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*/
|
|
|
|
|
if (root_name) {
|
1997-08-29 00:37:58 +08:00
|
|
|
|
|
|
|
|
|
#ifndef NDEBUG
|
1997-08-13 23:36:47 +08:00
|
|
|
|
nlinks = H5O_link (f, root.header, &root, 0);
|
|
|
|
|
assert (1==nlinks);
|
1997-08-29 00:37:58 +08:00
|
|
|
|
#endif
|
1997-09-20 00:36:59 +08:00
|
|
|
|
if (H5G_stab_insert (f, f->root_sym, root_name, &root)<0) {
|
|
|
|
|
/*
|
|
|
|
|
* This should never happen. If it does and the root object is
|
|
|
|
|
* open, then bad things are going to happen because we've just
|
|
|
|
|
* deleted the symbol table entry for the open root object!
|
|
|
|
|
*/
|
|
|
|
|
#ifndef NDEBUG
|
|
|
|
|
abort ();
|
|
|
|
|
#endif
|
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
/* can't insert old root object in new root directory */
|
|
|
|
|
H5O_reset (H5O_NAME, &name);
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_CANTINIT, FAIL);
|
|
|
|
|
}
|
1997-09-20 00:36:59 +08:00
|
|
|
|
|
|
|
|
|
/* remove all name messages -- don't care if it fails */
|
|
|
|
|
if ((handle = H5G_open (f, f->root_sym, root_name))) {
|
|
|
|
|
H5O_remove (f, NO_ADDR, handle, H5O_NAME, H5O_ALL);
|
|
|
|
|
H5G_shadow_close (f, handle);
|
|
|
|
|
handle = NULL;
|
|
|
|
|
}
|
|
|
|
|
H5ECLEAR;
|
1997-08-13 06:44:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
1997-09-20 00:36:59 +08:00
|
|
|
|
H5O_reset (H5O_NAME, &name);
|
1997-08-13 06:44:46 +08:00
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_new
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Creates a new empty directory with the specified name. The
|
|
|
|
|
* name is either an absolute name or is relative to the
|
|
|
|
|
* directory whose symbol table entry is CWD. On return, the
|
|
|
|
|
* optional DIR_ENT pointer is initialized with the symbol
|
|
|
|
|
* table entry for the new directory's parent and ENT will
|
|
|
|
|
* contain the symbol table entry for the new directory.
|
|
|
|
|
*
|
1997-08-29 00:37:58 +08:00
|
|
|
|
* A root directory is created implicitly by this function
|
|
|
|
|
* when necessary. Calling this function with the name "/"
|
|
|
|
|
* (or any equivalent name) will result in an H5E_EXISTS
|
|
|
|
|
* failure.
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
* DIRECTORY CANTINIT Can't create dir.
|
|
|
|
|
* DIRECTORY CANTINIT Can't insert.
|
|
|
|
|
* DIRECTORY CANTINIT Lookup failed.
|
|
|
|
|
* DIRECTORY COMPLEN Component is too long.
|
|
|
|
|
* DIRECTORY EXISTS Already exists.
|
|
|
|
|
* DIRECTORY NOTFOUND Missing component.
|
|
|
|
|
*
|
1997-08-13 06:44:46 +08:00
|
|
|
|
* Return: Success: SUCCEED, if DIR_ENT is not the null pointer
|
|
|
|
|
* then it will be initialized with the
|
|
|
|
|
* symbol table entry for the new directory.
|
|
|
|
|
*
|
|
|
|
|
* Failure: FAIL, the memory pointed to by CWD is
|
|
|
|
|
* not modified.
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* robb@maya.nuance.com
|
|
|
|
|
* Aug 11 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
|
|
|
|
H5G_new (hdf5_file_t *f, H5G_entry_t *cwd, H5G_entry_t *dir_ent,
|
|
|
|
|
const char *name, size_t size_hint, H5G_entry_t *ent)
|
|
|
|
|
{
|
|
|
|
|
const char *rest=NULL;
|
|
|
|
|
H5G_entry_t _parent, _child;
|
|
|
|
|
char _comp[1024];
|
|
|
|
|
size_t nchars;
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER (H5G_new, NULL, FAIL);
|
|
|
|
|
|
|
|
|
|
/* check args */
|
|
|
|
|
assert (f);
|
|
|
|
|
assert (name && *name);
|
|
|
|
|
assert (cwd || '/'==*name);
|
|
|
|
|
if (!dir_ent) dir_ent = &_parent;
|
|
|
|
|
if (!ent) ent = &_child;
|
|
|
|
|
|
1997-08-29 00:37:58 +08:00
|
|
|
|
/* Create root directory if necessary */
|
1997-09-11 03:57:56 +08:00
|
|
|
|
H5G_mkroot (f, H5G_SIZE_HINT);
|
1997-08-29 00:37:58 +08:00
|
|
|
|
H5ECLEAR;
|
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
/* lookup name */
|
1997-09-20 00:36:59 +08:00
|
|
|
|
if (H5G_namei (f, cwd, name, &rest, dir_ent)) {
|
1997-08-13 06:44:46 +08:00
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_EXISTS, FAIL); /*already exists*/
|
|
|
|
|
}
|
|
|
|
|
H5ECLEAR; /*it's OK that we didn't find it*/
|
|
|
|
|
|
|
|
|
|
/* should be one null-terminated component left */
|
|
|
|
|
rest = H5G_component (rest, &nchars);
|
|
|
|
|
assert (rest && *rest);
|
|
|
|
|
if (rest[nchars]) {
|
|
|
|
|
if (H5G_component (rest+nchars, NULL)) {
|
|
|
|
|
/* missing component */
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_NOTFOUND, FAIL);
|
|
|
|
|
} else if (nchars+1 > sizeof _comp) {
|
1997-09-02 23:38:26 +08:00
|
|
|
|
/* component is too long */
|
1997-08-13 06:44:46 +08:00
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_COMPLEN, FAIL);
|
|
|
|
|
} else {
|
|
|
|
|
/* null terminate */
|
1997-08-29 00:37:58 +08:00
|
|
|
|
HDmemcpy (_comp, rest, nchars);
|
1997-08-13 06:44:46 +08:00
|
|
|
|
_comp[nchars] = '\0';
|
|
|
|
|
rest = _comp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* create directory */
|
|
|
|
|
if (H5G_stab_new (f, ent, size_hint)<0) {
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_CANTINIT, FAIL); /*can't create dir*/
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* insert child name into parent */
|
|
|
|
|
if (H5G_stab_insert (f, dir_ent, rest, ent)<0) {
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_CANTINIT, FAIL); /*can't insert*/
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
|
|
|
|
}
|
|
|
|
|
|
1997-09-20 00:36:59 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_open
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Opens an object. That is, it prepares the object for
|
|
|
|
|
* modification by returning a handle to the object
|
|
|
|
|
* symbol table entry. Opening an object twice with the
|
|
|
|
|
* same name (or more precisely, through the same final
|
|
|
|
|
* symbol table entry) will return pointers to the same
|
|
|
|
|
* H5G_entry_t struct. But opening an object through
|
|
|
|
|
* different final H5G_entry_t structs (which implies
|
|
|
|
|
* different names) returns pointers to different
|
|
|
|
|
* structs. The structs that are returned should be
|
|
|
|
|
* released by calling H5G_close().
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: Ptr to a handle for the object.
|
|
|
|
|
*
|
|
|
|
|
* Failure: NULL
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Wednesday, September 17, 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
H5G_entry_t *
|
|
|
|
|
H5G_open (hdf5_file_t *f, H5G_entry_t *cwd, const char *name)
|
|
|
|
|
{
|
|
|
|
|
H5G_entry_t *ent=NULL;
|
|
|
|
|
H5G_entry_t *handle=NULL;
|
|
|
|
|
H5G_entry_t dir;
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER (H5G_open, NULL, NULL);
|
|
|
|
|
|
|
|
|
|
/* check args */
|
|
|
|
|
assert (f);
|
|
|
|
|
assert (name && *name);
|
|
|
|
|
assert (cwd || '/'==*name);
|
|
|
|
|
|
|
|
|
|
if (f->root_sym->header<=0) {
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_NOTFOUND, NULL); /*object not found*/
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (NULL==(ent=H5G_namei (f, cwd, name, NULL, &dir))) {
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_NOTFOUND, NULL); /*object not found*/
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (NULL==(handle=H5G_shadow_open (f, &dir, ent))) {
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_CANTOPENOBJ, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE (handle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_close
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Closes an object that was open for modification.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: SUCCEED
|
|
|
|
|
*
|
|
|
|
|
* Failure: FAIL
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Thursday, September 18, 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
|
|
|
|
H5G_close (hdf5_file_t *f, H5G_entry_t *ent)
|
|
|
|
|
{
|
|
|
|
|
FUNC_ENTER (H5G_close, NULL, FAIL);
|
|
|
|
|
|
|
|
|
|
if (H5G_shadow_close (f, ent)<0) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTFLUSH, FAIL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
|
|
|
|
}
|
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_find
|
|
|
|
|
*
|
1997-08-29 00:37:58 +08:00
|
|
|
|
* Purpose: Finds an object with the specified NAME in file F. If
|
|
|
|
|
* the name is relative then it is interpretted relative
|
|
|
|
|
* to CWD, a symbol table entry for a symbol table. On
|
|
|
|
|
* successful return, DIR_ENT (if non-null) will be
|
|
|
|
|
* initialized with the symbol table information for the
|
|
|
|
|
* directory in which the object appears (or all zero if
|
|
|
|
|
* the returned object is the root object) and ENT will
|
|
|
|
|
* be initialized with the symbol table entry for the
|
|
|
|
|
* object (ENT is optional when the caller is interested
|
|
|
|
|
* only in the existence of the object).
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1997-08-29 00:37:58 +08:00
|
|
|
|
* This function will fail if the root object is
|
|
|
|
|
* requested and there is none.
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
* DIRECTORY NOTFOUND Object not found.
|
|
|
|
|
*
|
1997-09-20 00:36:59 +08:00
|
|
|
|
* Return: Success: SUCCEED with DIR_ENT and ENT initialized. ENT
|
|
|
|
|
* is intended for immediate read-only access.
|
|
|
|
|
* If the object that ENT refers to is open
|
|
|
|
|
* through the ENT entry (see H5G_open()) then
|
|
|
|
|
* the returned ENT will contain the latest
|
|
|
|
|
* information. However, subsequent changes to
|
|
|
|
|
* the symbol table entry will not be reflected
|
|
|
|
|
* in ENT since it is a copy of the symbol table.
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
|
|
|
|
* Failure: FAIL
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* robb@maya.nuance.com
|
|
|
|
|
* Aug 12 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1997-08-13 06:44:46 +08:00
|
|
|
|
herr_t
|
|
|
|
|
H5G_find (hdf5_file_t *f, H5G_entry_t *cwd, H5G_entry_t *dir_ent,
|
|
|
|
|
const char *name, H5G_entry_t *ent)
|
|
|
|
|
{
|
1997-09-20 00:36:59 +08:00
|
|
|
|
H5G_entry_t *ent_p = NULL;
|
1997-08-13 06:44:46 +08:00
|
|
|
|
FUNC_ENTER (H5G_find, NULL, FAIL);
|
|
|
|
|
|
|
|
|
|
/* check args */
|
|
|
|
|
assert (f);
|
|
|
|
|
assert (name && *name);
|
|
|
|
|
assert (cwd || '/'==*name);
|
|
|
|
|
|
1997-08-29 00:37:58 +08:00
|
|
|
|
if (f->root_sym->header<=0) {
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_NOTFOUND, FAIL); /*object not found*/
|
|
|
|
|
}
|
|
|
|
|
|
1997-09-20 00:36:59 +08:00
|
|
|
|
if (NULL==(ent_p=H5G_namei (f, cwd, name, NULL, dir_ent))) {
|
1997-08-13 06:44:46 +08:00
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_NOTFOUND, FAIL); /*object not found*/
|
|
|
|
|
}
|
|
|
|
|
|
1997-09-20 00:36:59 +08:00
|
|
|
|
if (ent) *ent = *ent_p;
|
1997-08-13 06:44:46 +08:00
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_insert
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Inserts symbol table ENT into the directory hierarchy
|
|
|
|
|
* giving it the specified NAME. If NAME is relative then
|
|
|
|
|
* it is interpreted with respect to the CWD pointer. If
|
|
|
|
|
* non-null, DIR_ENT will be initialized with the symbol table
|
1997-08-29 00:37:58 +08:00
|
|
|
|
* entry for the directory which contains the new ENT (or all
|
|
|
|
|
* zero if the new ENT is the root object).
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1997-08-29 00:37:58 +08:00
|
|
|
|
* This function attempts to use a non-directory file if
|
|
|
|
|
* the file contains just one object. The one object
|
|
|
|
|
* will be the root object.
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1997-08-13 23:36:47 +08:00
|
|
|
|
* Inserting an object entry into the symbol table increments
|
|
|
|
|
* the link counter for that object.
|
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
* DIRECTORY CANTINIT Can't insert.
|
|
|
|
|
* DIRECTORY CANTINIT Cannot add/change name message.
|
|
|
|
|
* DIRECTORY CANTINIT Lookup failed.
|
|
|
|
|
* DIRECTORY COMPLEN Component is too long.
|
|
|
|
|
* DIRECTORY EXISTS Already exists.
|
|
|
|
|
* DIRECTORY EXISTS Root exists.
|
|
|
|
|
* DIRECTORY LINK Bad link count.
|
|
|
|
|
* DIRECTORY LINK Link inc failure.
|
|
|
|
|
* DIRECTORY NOTFOUND Component not found.
|
|
|
|
|
*
|
1997-08-13 06:44:46 +08:00
|
|
|
|
* Return: Success: SUCCEED with optional DIR_ENT initialized with
|
|
|
|
|
* the symbol table entry for the directory
|
|
|
|
|
* which contains the new ENT.
|
|
|
|
|
*
|
|
|
|
|
* Failure: FAIL (DIR_ENT is not modified).
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* robb@maya.nuance.com
|
|
|
|
|
* Aug 11 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1997-08-13 06:44:46 +08:00
|
|
|
|
herr_t
|
|
|
|
|
H5G_insert (hdf5_file_t *f, H5G_entry_t *cwd, H5G_entry_t *dir_ent,
|
|
|
|
|
const char *name, H5G_entry_t *ent)
|
|
|
|
|
{
|
|
|
|
|
const char *rest=NULL;
|
|
|
|
|
H5G_entry_t _parent;
|
|
|
|
|
size_t nchars;
|
|
|
|
|
char _comp[1024];
|
1997-08-29 00:37:58 +08:00
|
|
|
|
H5O_stab_t stab;
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER (H5G_insert, NULL, FAIL);
|
|
|
|
|
|
|
|
|
|
/* check args */
|
|
|
|
|
assert (f);
|
|
|
|
|
assert (name && *name);
|
|
|
|
|
assert (cwd || '/'==*name);
|
|
|
|
|
assert (ent);
|
1997-09-20 00:36:59 +08:00
|
|
|
|
assert (!ent->shadow);
|
1997-08-13 06:44:46 +08:00
|
|
|
|
if (!dir_ent) dir_ent = &_parent;
|
1997-09-20 00:36:59 +08:00
|
|
|
|
|
1997-08-29 00:37:58 +08:00
|
|
|
|
/*
|
|
|
|
|
* If there's already an object or if this object is a directory then
|
|
|
|
|
* create a root directory. The object is a directory if we can read
|
|
|
|
|
* the symbol table message from its header. H5G_mkroot() fails if
|
|
|
|
|
* the root object is already a directory, but we don't care.
|
|
|
|
|
*/
|
|
|
|
|
if (f->root_sym->header>0 ||
|
|
|
|
|
H5O_read (f, ent->header, ent, H5O_STAB, 0, &stab)) {
|
|
|
|
|
H5G_mkroot (f, H5G_SIZE_HINT);
|
|
|
|
|
H5ECLEAR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Look up the name -- it shouldn't exist yet.
|
|
|
|
|
*/
|
1997-09-20 00:36:59 +08:00
|
|
|
|
if (H5G_namei (f, cwd, name, &rest, dir_ent)) {
|
1997-08-13 06:44:46 +08:00
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_EXISTS, FAIL); /*already exists*/
|
|
|
|
|
}
|
|
|
|
|
H5ECLEAR; /*it's OK that we didn't find it*/
|
|
|
|
|
|
1997-08-29 00:37:58 +08:00
|
|
|
|
/*
|
|
|
|
|
* The caller may be attempting to insert a root object that either
|
|
|
|
|
* doesn't have a name or we shouldn't interfere with the name
|
|
|
|
|
* it already has.
|
|
|
|
|
*/
|
1997-08-13 06:44:46 +08:00
|
|
|
|
rest = H5G_component (rest, &nchars);
|
1997-08-29 00:37:58 +08:00
|
|
|
|
if (!rest || !*rest) {
|
|
|
|
|
if (f->root_sym->header>0) {
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_EXISTS, FAIL); /*root exists*/
|
|
|
|
|
}
|
|
|
|
|
HDmemset (dir_ent, 0, sizeof(H5G_entry_t));
|
|
|
|
|
if (1!=H5O_link (f, ent->header, ent, 1)) {
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_LINK, FAIL); /*bad link count*/
|
|
|
|
|
}
|
|
|
|
|
*(f->root_sym) = *ent;
|
|
|
|
|
HRETURN (SUCCEED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* There should be one component left. Make sure it's null
|
|
|
|
|
* terminated.
|
|
|
|
|
*/
|
1997-08-13 06:44:46 +08:00
|
|
|
|
if (rest[nchars]) {
|
|
|
|
|
if (H5G_component (rest+nchars, NULL)) {
|
1997-09-02 23:38:26 +08:00
|
|
|
|
/* component not found */
|
1997-08-13 06:44:46 +08:00
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_NOTFOUND, FAIL);
|
|
|
|
|
} else if (nchars+1 > sizeof _comp) {
|
1997-09-02 23:38:26 +08:00
|
|
|
|
/* component is too long */
|
1997-08-13 06:44:46 +08:00
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_COMPLEN, FAIL);
|
|
|
|
|
} else {
|
|
|
|
|
/* null terminate */
|
1997-08-29 00:37:58 +08:00
|
|
|
|
HDmemcpy (_comp, rest, nchars);
|
1997-08-13 06:44:46 +08:00
|
|
|
|
_comp[nchars] = '\0';
|
|
|
|
|
rest = _comp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1997-08-29 00:37:58 +08:00
|
|
|
|
/*
|
|
|
|
|
* If this is the only object then insert it as the root object. Add
|
|
|
|
|
* a name messaage to the object header (or modify the first one we
|
1997-09-20 00:36:59 +08:00
|
|
|
|
* find). We don't have to worry about it being open.
|
1997-08-29 00:37:58 +08:00
|
|
|
|
*/
|
|
|
|
|
if (f->root_sym->header<=0) {
|
|
|
|
|
H5O_name_t name_mesg;
|
|
|
|
|
name_mesg.s = rest;
|
1997-09-20 00:36:59 +08:00
|
|
|
|
if (H5O_modify (f, NO_ADDR, ent, H5O_NAME, 0, &name_mesg)<0) {
|
1997-08-29 00:37:58 +08:00
|
|
|
|
/* cannot add/change name message */
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_CANTINIT, FAIL);
|
|
|
|
|
}
|
|
|
|
|
if (1!=H5O_link (f, ent->header, ent, 1)) {
|
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_LINK, FAIL); /*bad link count*/
|
|
|
|
|
}
|
|
|
|
|
*(f->root_sym) = *ent;
|
|
|
|
|
HRETURN (SUCCEED);
|
|
|
|
|
}
|
|
|
|
|
|
1997-08-13 23:36:47 +08:00
|
|
|
|
/* increment the link count */
|
|
|
|
|
if (H5O_link (f, ent->header, ent, 1)<0) {
|
1997-08-29 00:37:58 +08:00
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_LINK, FAIL); /*link inc failure*/
|
1997-08-13 23:36:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
/* insert entry into parent */
|
|
|
|
|
if (H5G_stab_insert (f, dir_ent, rest, ent)<0) {
|
1997-08-29 00:37:58 +08:00
|
|
|
|
H5O_link (f, ent->header, ent, -1); /*don't care if it fails*/
|
1997-08-13 06:44:46 +08:00
|
|
|
|
HRETURN_ERROR (H5E_DIRECTORY, H5E_CANTINIT, FAIL); /*can't insert*/
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
|
|
|
|
}
|
|
|
|
|
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1997-08-10 00:45:59 +08:00
|
|
|
|
* Function: H5G_stab_new
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
*
|
|
|
|
|
* Purpose: Creates a new empty symbol table (object header, name heap,
|
|
|
|
|
* and B-tree). The caller can specify an initial size for the
|
1997-08-13 06:44:46 +08:00
|
|
|
|
* name heap.
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
*
|
|
|
|
|
* In order for the B-tree to operate correctly, the first
|
|
|
|
|
* item in the heap is the empty string, and must appear at
|
|
|
|
|
* heap offset zero.
|
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
* INTERNAL CANTINIT B-tree's won't work if the first
|
|
|
|
|
* name isn't at the beginning of the
|
|
|
|
|
* heap.
|
|
|
|
|
* SYM CANTINIT Can't create B-tree.
|
|
|
|
|
* SYM CANTINIT Can't create header.
|
|
|
|
|
* SYM CANTINIT Can't create heap.
|
|
|
|
|
* SYM CANTINIT Can't create message.
|
|
|
|
|
* SYM CANTINIT Can't initialize heap.
|
|
|
|
|
*
|
1997-08-10 00:45:59 +08:00
|
|
|
|
* Return: Success: Address of new symbol table header. If
|
|
|
|
|
* the caller supplies a symbol table entry
|
|
|
|
|
* SELF then it will be initialized to point to
|
|
|
|
|
* this symbol table.
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
*
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* Failure: FAIL
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* matzke@llnl.gov
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
* Aug 1 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
haddr_t
|
1997-08-10 00:45:59 +08:00
|
|
|
|
H5G_stab_new (hdf5_file_t *f, H5G_entry_t *self, size_t init)
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
{
|
|
|
|
|
off_t name; /*offset of "" name */
|
1997-08-08 03:23:00 +08:00
|
|
|
|
haddr_t addr; /*object header address */
|
|
|
|
|
H5O_stab_t stab; /*symbol table message */
|
|
|
|
|
|
1997-08-10 00:45:59 +08:00
|
|
|
|
FUNC_ENTER (H5G_stab_new, NULL, FAIL);
|
1997-08-08 03:23:00 +08:00
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Check arguments.
|
|
|
|
|
*/
|
|
|
|
|
assert (f);
|
1997-08-13 06:44:46 +08:00
|
|
|
|
init = MAX(init, H5H_SIZEOF_FREE(f)+2);
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
|
|
|
|
|
/* Create symbol table private heap */
|
1997-09-11 03:57:56 +08:00
|
|
|
|
if ((stab.heap_addr = H5H_new (f, H5H_LOCAL, init))<0) {
|
1997-09-02 23:38:26 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); /*can't create heap*/
|
1997-08-13 06:44:46 +08:00
|
|
|
|
}
|
1997-09-11 03:57:56 +08:00
|
|
|
|
if ((name = H5H_insert (f, stab.heap_addr, 1, "")<0)) {
|
1997-09-02 23:38:26 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); /*can't initialize heap*/
|
1997-08-13 06:44:46 +08:00
|
|
|
|
}
|
|
|
|
|
if (0!=name) {
|
|
|
|
|
/*
|
|
|
|
|
* B-tree's won't work if the first name isn't at the beginning
|
|
|
|
|
* of the heap.
|
|
|
|
|
*/
|
|
|
|
|
HRETURN_ERROR (H5E_INTERNAL, H5E_CANTINIT, FAIL);
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
/* Create the B-tree */
|
1997-09-11 03:57:56 +08:00
|
|
|
|
if ((stab.btree_addr = H5B_new (f, H5B_SNODE))<0) {
|
1997-09-02 23:38:26 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); /*can't create B-tree*/
|
1997-08-13 06:44:46 +08:00
|
|
|
|
}
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
|
1997-08-13 23:36:47 +08:00
|
|
|
|
/*
|
|
|
|
|
* Create symbol table object header. It has a zero link count
|
|
|
|
|
* since nothing refers to it yet. The link count will be
|
|
|
|
|
* incremented if the object is added to the directory hierarchy.
|
|
|
|
|
*/
|
|
|
|
|
if ((addr = H5O_new (f, 0, 4+2*H5F_SIZEOF_OFFSET(f)))<0) {
|
1997-09-02 23:38:26 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); /*can't create header*/
|
1997-08-08 03:23:00 +08:00
|
|
|
|
}
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
|
|
|
|
/* insert the symbol table message */
|
1997-08-10 00:45:59 +08:00
|
|
|
|
if (self) {
|
1997-09-20 00:36:59 +08:00
|
|
|
|
memset (self, 0, sizeof(H5G_entry_t));
|
1997-08-10 00:45:59 +08:00
|
|
|
|
self->header = addr;
|
|
|
|
|
}
|
1997-09-20 00:36:59 +08:00
|
|
|
|
if (H5O_modify(f, addr, self, H5O_STAB, H5O_NEW_MESG, &stab)<0) {
|
1997-09-02 23:38:26 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL); /*can't create message*/
|
1997-08-08 03:23:00 +08:00
|
|
|
|
}
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
|
1997-08-08 03:23:00 +08:00
|
|
|
|
FUNC_LEAVE (addr);
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1997-08-10 00:45:59 +08:00
|
|
|
|
* Function: H5G_stab_find
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
*
|
1997-08-10 00:45:59 +08:00
|
|
|
|
* Purpose: Finds a symbol named NAME in the symbol table whose
|
|
|
|
|
* description is stored in SELF in file F and returns a
|
1997-09-20 00:36:59 +08:00
|
|
|
|
* pointer to the symbol table entry. SELF is optional if the
|
|
|
|
|
* symbol table address is supplied through ADDR.
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
* SYM BADMESG Can't read message.
|
|
|
|
|
* SYM NOTFOUND Not found.
|
|
|
|
|
*
|
1997-09-20 00:36:59 +08:00
|
|
|
|
* Return: Success: Pointer to the symbol table entry.
|
|
|
|
|
* The pointer is intended for immediate
|
|
|
|
|
* read-only access since it points
|
|
|
|
|
* directly to an entry in a cached
|
|
|
|
|
* symbol table node. The pointer is
|
|
|
|
|
* guaranteed to be valid only until the
|
|
|
|
|
* next call to one of the H5AC functions.
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
*
|
1997-09-20 00:36:59 +08:00
|
|
|
|
* Failure: NULL
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* matzke@llnl.gov
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
* Aug 1 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1997-09-20 00:36:59 +08:00
|
|
|
|
H5G_entry_t *
|
|
|
|
|
H5G_stab_find (hdf5_file_t *f, haddr_t addr, H5G_entry_t *self,
|
|
|
|
|
const char *name)
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
{
|
1997-09-20 00:36:59 +08:00
|
|
|
|
H5G_bt_ud1_t udata; /*data to pass through B-tree */
|
1997-08-08 03:23:00 +08:00
|
|
|
|
H5O_stab_t stab; /*symbol table message */
|
|
|
|
|
|
1997-09-20 00:36:59 +08:00
|
|
|
|
FUNC_ENTER (H5G_stab_find, NULL, NULL);
|
1997-08-08 03:23:00 +08:00
|
|
|
|
|
|
|
|
|
/* Check arguments */
|
|
|
|
|
assert (f);
|
1997-09-20 00:36:59 +08:00
|
|
|
|
if (addr<=0 && (!self || self->header<=0)) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, NULL);
|
|
|
|
|
}
|
|
|
|
|
if (!name || !*name) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, NULL);
|
|
|
|
|
}
|
|
|
|
|
if (addr<=0) addr = self->header;
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
|
|
|
|
|
/* set up the udata */
|
1997-09-20 00:36:59 +08:00
|
|
|
|
if (NULL==H5O_read (f, addr, self, H5O_STAB, 0, &stab)) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_BADMESG, NULL); /*can't read message*/
|
1997-08-08 03:23:00 +08:00
|
|
|
|
}
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
udata.operation = H5G_OPER_FIND;
|
|
|
|
|
udata.name = name;
|
1997-09-11 03:57:56 +08:00
|
|
|
|
udata.heap_addr = stab.heap_addr;
|
1997-09-20 00:36:59 +08:00
|
|
|
|
udata.dir_addr = addr;
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
|
|
|
|
|
/* search the B-tree */
|
1997-09-11 03:57:56 +08:00
|
|
|
|
if (H5B_find (f, H5B_SNODE, stab.btree_addr, &udata)<0) {
|
1997-09-20 00:36:59 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, NULL); /*not found*/
|
1997-08-08 03:23:00 +08:00
|
|
|
|
}
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
|
|
|
|
|
/* return the result */
|
1997-09-20 00:36:59 +08:00
|
|
|
|
FUNC_LEAVE (udata.entry_ptr);
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1997-08-10 00:45:59 +08:00
|
|
|
|
* Function: H5G_stab_insert
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
*
|
1997-08-10 00:45:59 +08:00
|
|
|
|
* Purpose: Insert a new symbol into the table described by SELF in
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
* file F. The name of the new symbol is NAME and its symbol
|
1997-08-10 00:45:59 +08:00
|
|
|
|
* table entry is ENT.
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
* SYM BADMESG Can't read message.
|
|
|
|
|
* SYM CANTINSERT Can't insert entry.
|
|
|
|
|
*
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* Return: Success: SUCCEED
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
*
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* Failure: FAIL
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* matzke@llnl.gov
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
* Aug 1 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
1997-09-20 00:36:59 +08:00
|
|
|
|
* Robb Matzke, 18 Sep 1997
|
|
|
|
|
* If ENT has a shadow, then the shadow will be associated with the
|
|
|
|
|
* entry when it is added to the symbol table.
|
|
|
|
|
*
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
1997-08-10 00:45:59 +08:00
|
|
|
|
H5G_stab_insert (hdf5_file_t *f, H5G_entry_t *self, const char *name,
|
|
|
|
|
H5G_entry_t *ent)
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
{
|
1997-08-08 03:23:00 +08:00
|
|
|
|
H5O_stab_t stab; /*symbol table message */
|
1997-09-20 00:36:59 +08:00
|
|
|
|
H5G_bt_ud1_t udata; /*data to pass through B-tree */
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
|
1997-08-10 00:45:59 +08:00
|
|
|
|
FUNC_ENTER (H5G_stab_insert, NULL, FAIL);
|
1997-08-08 03:23:00 +08:00
|
|
|
|
|
|
|
|
|
/* check arguments */
|
|
|
|
|
assert (f);
|
1997-08-10 00:45:59 +08:00
|
|
|
|
assert (self && self->header>=0);
|
1997-08-08 03:23:00 +08:00
|
|
|
|
assert (name && *name);
|
1997-08-10 00:45:59 +08:00
|
|
|
|
assert (ent);
|
1997-08-08 03:23:00 +08:00
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
/* initialize data to pass through B-tree */
|
1997-08-10 00:45:59 +08:00
|
|
|
|
if (NULL==H5O_read (f, self->header, self, H5O_STAB, 0, &stab)) {
|
1997-09-02 23:38:26 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_BADMESG, FAIL); /*can't read message*/
|
1997-08-08 03:23:00 +08:00
|
|
|
|
}
|
1997-09-20 00:36:59 +08:00
|
|
|
|
|
|
|
|
|
udata.operation = H5G_OPER_INSERT;
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
udata.name = name;
|
1997-09-11 03:57:56 +08:00
|
|
|
|
udata.heap_addr = stab.heap_addr;
|
1997-09-20 00:36:59 +08:00
|
|
|
|
udata.dir_addr = self->header;
|
1997-08-10 00:45:59 +08:00
|
|
|
|
udata.entry = *ent;
|
1997-09-20 00:36:59 +08:00
|
|
|
|
udata.entry.name_off = -1;
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
|
|
|
|
/* insert */
|
1997-09-11 03:57:56 +08:00
|
|
|
|
if (H5B_insert (f, H5B_SNODE, stab.btree_addr, &udata)<0) {
|
1997-09-02 23:38:26 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTINSERT, FAIL); /*can't insert entry*/
|
1997-08-08 03:23:00 +08:00
|
|
|
|
}
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
|
1997-08-13 23:36:47 +08:00
|
|
|
|
/* update the name offset in the entry */
|
|
|
|
|
ent->name_off = udata.entry.name_off;
|
1997-08-08 03:23:00 +08:00
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1997-08-10 00:45:59 +08:00
|
|
|
|
* Function: H5G_stab_list
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
*
|
|
|
|
|
* Purpose: Returns a list of all the symbols in a symbol table.
|
|
|
|
|
* The caller allocates an array of pointers which this
|
|
|
|
|
* function will fill in with malloc'd names. The caller
|
|
|
|
|
* also allocates an array of symbol table entries which will
|
|
|
|
|
* be filled in with data from the symbol table. Each of these
|
|
|
|
|
* arrays should have at least MAXENTRIES elements.
|
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
* SYM BADMESG Not a symbol table.
|
|
|
|
|
* SYM CANTLIST B-tree list failure.
|
|
|
|
|
*
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
* Return: Success: The total number of symbols in the
|
|
|
|
|
* symbol table. This may exceed MAXENTRIES,
|
|
|
|
|
* but at most MAXENTRIES values are copied
|
|
|
|
|
* into the NAMES and ENTRIES arrays.
|
|
|
|
|
*
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* Failure: FAIL, the pointers in NAMES are undefined but
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
* no memory is allocated. The values in
|
|
|
|
|
* ENTRIES are undefined.
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* matzke@llnl.gov
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
* Aug 1 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
intn
|
1997-08-10 00:45:59 +08:00
|
|
|
|
H5G_stab_list (hdf5_file_t *f, H5G_entry_t *self, intn maxentries,
|
|
|
|
|
char *names[], H5G_entry_t entries[])
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
{
|
1997-09-20 00:36:59 +08:00
|
|
|
|
H5G_bt_ud2_t udata;
|
1997-08-08 03:23:00 +08:00
|
|
|
|
H5O_stab_t stab;
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
intn i;
|
1997-08-08 03:23:00 +08:00
|
|
|
|
|
1997-08-10 00:45:59 +08:00
|
|
|
|
FUNC_ENTER (H5G_stab_list, NULL, FAIL);
|
|
|
|
|
|
|
|
|
|
/* check args */
|
|
|
|
|
assert (f);
|
|
|
|
|
assert (self && self->header>=0);
|
|
|
|
|
assert (maxentries>=0);
|
1997-08-08 03:23:00 +08:00
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
/* initialize data to pass through B-tree */
|
1997-08-10 00:45:59 +08:00
|
|
|
|
if (NULL==H5O_read (f, self->header, self, H5O_STAB, 0, &stab)) {
|
1997-09-02 23:38:26 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_BADMESG, FAIL); /*not a symbol table*/
|
1997-08-08 03:23:00 +08:00
|
|
|
|
}
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
udata.entry = entries;
|
|
|
|
|
udata.name = names;
|
1997-09-20 00:36:59 +08:00
|
|
|
|
udata.dir_addr = self->header;
|
1997-09-11 03:57:56 +08:00
|
|
|
|
udata.heap_addr = stab.heap_addr;
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
udata.maxentries = maxentries;
|
|
|
|
|
udata.nsyms = 0;
|
|
|
|
|
if (names) HDmemset (names, 0, maxentries);
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
|
|
|
|
/* list */
|
1997-09-11 03:57:56 +08:00
|
|
|
|
if (H5B_list (f, H5B_SNODE, stab.btree_addr, &udata)<0) {
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
if (names) {
|
|
|
|
|
for (i=0; i<maxentries; i++) H5MM_xfree (names[i]);
|
|
|
|
|
}
|
1997-09-02 23:38:26 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTLIST, FAIL); /*B-tree list failure*/
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
1997-08-08 03:23:00 +08:00
|
|
|
|
FUNC_LEAVE (udata.nsyms);
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
1997-07-31 05:17:56 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_decode_vec
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Same as H5G_decode() except it does it for an array of
|
|
|
|
|
* symbol table entries.
|
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
* SYM CANTDECODE Can't decode.
|
|
|
|
|
*
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* Return: Success: SUCCEED, with *pp pointing to the first byte
|
1997-07-31 05:17:56 +08:00
|
|
|
|
* after the last symbol.
|
|
|
|
|
*
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* Failure: FAIL
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* matzke@llnl.gov
|
1997-07-31 05:17:56 +08:00
|
|
|
|
* Jul 18 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
|
|
|
|
H5G_decode_vec (hdf5_file_t *f, uint8 **pp, H5G_entry_t *ent, intn n)
|
|
|
|
|
{
|
|
|
|
|
intn i;
|
|
|
|
|
|
1997-08-08 03:23:00 +08:00
|
|
|
|
FUNC_ENTER (H5G_decode_vec, NULL, FAIL);
|
|
|
|
|
|
|
|
|
|
/* check arguments */
|
|
|
|
|
assert (f);
|
|
|
|
|
assert (pp);
|
|
|
|
|
assert (ent);
|
|
|
|
|
assert (n>=0);
|
|
|
|
|
|
|
|
|
|
/* decode entries */
|
1997-07-31 05:17:56 +08:00
|
|
|
|
for (i=0; i<n; i++) {
|
1997-08-08 03:23:00 +08:00
|
|
|
|
if (H5G_decode (f, pp, ent+i)<0) {
|
1997-09-02 23:38:26 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTDECODE, FAIL); /*can't decode*/
|
1997-08-08 03:23:00 +08:00
|
|
|
|
}
|
1997-07-31 05:17:56 +08:00
|
|
|
|
}
|
1997-08-08 03:23:00 +08:00
|
|
|
|
|
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
1997-07-31 05:17:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_decode
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Decodes a symbol table entry pointed to by `*pp'.
|
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
*
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* Return: Success: SUCCEED with *pp pointing to the first byte
|
1997-07-31 05:17:56 +08:00
|
|
|
|
* following the symbol table entry.
|
|
|
|
|
*
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* Failure: FAIL
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* matzke@llnl.gov
|
1997-07-31 05:17:56 +08:00
|
|
|
|
* Jul 18 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
|
|
|
|
H5G_decode (hdf5_file_t *f, uint8 **pp, H5G_entry_t *ent)
|
|
|
|
|
{
|
|
|
|
|
uint8 *p_ret = *pp;
|
1997-08-08 03:23:00 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER (H5G_decode, NULL, FAIL);
|
|
|
|
|
|
|
|
|
|
/* check arguments */
|
|
|
|
|
assert (f);
|
|
|
|
|
assert (pp);
|
|
|
|
|
assert (ent);
|
|
|
|
|
|
|
|
|
|
/* decode header */
|
1997-07-31 05:17:56 +08:00
|
|
|
|
H5F_decode_offset (f, *pp, ent->name_off);
|
|
|
|
|
H5F_decode_offset (f, *pp, ent->header);
|
|
|
|
|
UINT32DECODE (*pp, ent->type);
|
|
|
|
|
|
1997-08-08 03:23:00 +08:00
|
|
|
|
/* decode scratch-pad */
|
1997-07-31 05:17:56 +08:00
|
|
|
|
switch (ent->type) {
|
|
|
|
|
case H5G_NOTHING_CACHED:
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case H5G_CACHED_SDATA:
|
1997-08-29 01:14:35 +08:00
|
|
|
|
ent->cache.sdata.nt.length= *(*pp)++;
|
|
|
|
|
ent->cache.sdata.nt.arch= *(*pp)++;
|
|
|
|
|
UINT16DECODE (*pp, ent->cache.sdata.nt.type);
|
1997-07-31 05:17:56 +08:00
|
|
|
|
UINT32DECODE (*pp, ent->cache.sdata.ndim);
|
|
|
|
|
UINT32DECODE (*pp, ent->cache.sdata.dim[0]);
|
|
|
|
|
UINT32DECODE (*pp, ent->cache.sdata.dim[1]);
|
|
|
|
|
UINT32DECODE (*pp, ent->cache.sdata.dim[2]);
|
|
|
|
|
UINT32DECODE (*pp, ent->cache.sdata.dim[3]);
|
|
|
|
|
break;
|
|
|
|
|
|
1997-08-08 03:23:00 +08:00
|
|
|
|
case H5G_CACHED_STAB:
|
1997-09-11 03:57:56 +08:00
|
|
|
|
UINT32DECODE (*pp, ent->cache.stab.btree_addr);
|
|
|
|
|
UINT32DECODE (*pp, ent->cache.stab.heap_addr);
|
1997-07-31 05:17:56 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
1997-08-29 00:37:58 +08:00
|
|
|
|
HDabort();
|
1997-07-31 05:17:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
1997-08-05 00:19:57 +08:00
|
|
|
|
*pp = p_ret + H5G_SIZEOF_ENTRY(f);
|
1997-08-08 03:23:00 +08:00
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
1997-07-31 05:17:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_encode_vec
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Same as H5G_encode() except it does it for an array of
|
|
|
|
|
* symbol table entries.
|
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
* SYM CANTENCODE Can't encode.
|
|
|
|
|
*
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* Return: Success: SUCCEED, with *pp pointing to the first byte
|
1997-07-31 05:17:56 +08:00
|
|
|
|
* after the last symbol.
|
|
|
|
|
*
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* Failure: FAIL
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* matzke@llnl.gov
|
1997-07-31 05:17:56 +08:00
|
|
|
|
* Jul 18 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
|
|
|
|
H5G_encode_vec (hdf5_file_t *f, uint8 **pp, H5G_entry_t *ent, intn n)
|
|
|
|
|
{
|
|
|
|
|
intn i;
|
|
|
|
|
|
1997-08-08 03:23:00 +08:00
|
|
|
|
FUNC_ENTER (H5G_encode_vec, NULL, FAIL);
|
|
|
|
|
|
|
|
|
|
/* check arguments */
|
|
|
|
|
assert (f);
|
|
|
|
|
assert (pp);
|
|
|
|
|
assert (ent);
|
|
|
|
|
assert (n>=0);
|
|
|
|
|
|
|
|
|
|
/* encode entries */
|
1997-07-31 05:17:56 +08:00
|
|
|
|
for (i=0; i<n; i++) {
|
1997-08-08 03:23:00 +08:00
|
|
|
|
if (H5G_encode (f, pp, ent+i)<0) {
|
1997-09-02 23:38:26 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTENCODE, FAIL); /*can't encode*/
|
1997-08-08 03:23:00 +08:00
|
|
|
|
}
|
1997-07-31 05:17:56 +08:00
|
|
|
|
}
|
1997-08-08 03:23:00 +08:00
|
|
|
|
|
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
1997-07-31 05:17:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_encode
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Encodes the specified symbol table entry into the buffer
|
|
|
|
|
* pointed to by *pp.
|
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
*
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* Return: Success: SUCCEED, with *pp pointing to the first byte
|
1997-07-31 05:17:56 +08:00
|
|
|
|
* after the symbol table entry.
|
|
|
|
|
*
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* Failure: FAIL
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* matzke@llnl.gov
|
1997-07-31 05:17:56 +08:00
|
|
|
|
* Jul 18 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
1997-08-10 00:45:59 +08:00
|
|
|
|
* Robb Matzke, 8 Aug 1997
|
|
|
|
|
* Writes zeros for the bytes that aren't used so the file doesn't
|
|
|
|
|
* contain junk.
|
|
|
|
|
*
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
|
|
|
|
H5G_encode (hdf5_file_t *f, uint8 **pp, H5G_entry_t *ent)
|
|
|
|
|
{
|
1997-08-10 00:45:59 +08:00
|
|
|
|
uint8 *p_ret = *pp + H5G_SIZEOF_ENTRY(f);
|
1997-07-31 05:17:56 +08:00
|
|
|
|
|
1997-08-08 03:23:00 +08:00
|
|
|
|
FUNC_ENTER (H5G_encode, NULL, FAIL);
|
|
|
|
|
|
|
|
|
|
/* check arguments */
|
|
|
|
|
assert (f);
|
|
|
|
|
assert (pp);
|
|
|
|
|
assert (ent);
|
|
|
|
|
|
|
|
|
|
/* encode header */
|
1997-07-31 05:17:56 +08:00
|
|
|
|
H5F_encode_offset (f, *pp, ent->name_off);
|
|
|
|
|
H5F_encode_offset (f, *pp, ent->header);
|
|
|
|
|
UINT32ENCODE (*pp, ent->type);
|
|
|
|
|
|
1997-08-08 03:23:00 +08:00
|
|
|
|
/* encode scratch-pad */
|
1997-07-31 05:17:56 +08:00
|
|
|
|
switch (ent->type) {
|
|
|
|
|
case H5G_NOTHING_CACHED:
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case H5G_CACHED_SDATA:
|
1997-08-29 01:14:35 +08:00
|
|
|
|
*(*pp)++= ent->cache.sdata.nt.length;
|
|
|
|
|
*(*pp)++= ent->cache.sdata.nt.arch;
|
|
|
|
|
UINT16ENCODE (*pp, ent->cache.sdata.nt.type);
|
1997-07-31 05:17:56 +08:00
|
|
|
|
UINT32ENCODE (*pp, ent->cache.sdata.ndim);
|
|
|
|
|
UINT32ENCODE (*pp, ent->cache.sdata.dim[0]);
|
|
|
|
|
UINT32ENCODE (*pp, ent->cache.sdata.dim[1]);
|
|
|
|
|
UINT32ENCODE (*pp, ent->cache.sdata.dim[2]);
|
|
|
|
|
UINT32ENCODE (*pp, ent->cache.sdata.dim[3]);
|
|
|
|
|
break;
|
|
|
|
|
|
1997-08-08 03:23:00 +08:00
|
|
|
|
case H5G_CACHED_STAB:
|
1997-09-11 03:57:56 +08:00
|
|
|
|
UINT32ENCODE (*pp, ent->cache.stab.btree_addr);
|
|
|
|
|
UINT32ENCODE (*pp, ent->cache.stab.heap_addr);
|
1997-07-31 05:17:56 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
1997-08-29 00:37:58 +08:00
|
|
|
|
HDabort();
|
1997-07-31 05:17:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
1997-08-10 00:45:59 +08:00
|
|
|
|
/* fill with zero */
|
|
|
|
|
while (*pp<p_ret) *(*pp)++ = 0;
|
|
|
|
|
|
|
|
|
|
*pp = p_ret;
|
1997-08-08 03:23:00 +08:00
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
1997-07-31 05:17:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
1997-08-30 06:23:04 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_debug
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Prints debugging information about a symbol table entry.
|
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
*
|
1997-08-30 06:23:04 +08:00
|
|
|
|
* Return: Success: SUCCEED
|
|
|
|
|
*
|
|
|
|
|
* Failure: FAIL
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* robb@maya.nuance.com
|
|
|
|
|
* Aug 29 1997
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
|
|
|
|
H5G_debug (hdf5_file_t *f, H5G_entry_t *ent, FILE *stream, intn indent,
|
|
|
|
|
intn fwidth)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
char buf[64];
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER (H5G_debug, NULL, FAIL);
|
|
|
|
|
|
|
|
|
|
fprintf (stream, "%*s%-*s %lu\n", indent, "", fwidth,
|
|
|
|
|
"Name offset into private heap:",
|
|
|
|
|
(unsigned long)(ent->name_off));
|
|
|
|
|
fprintf (stream, "%*s%-*s %lu\n", indent, "", fwidth,
|
|
|
|
|
"Object header address:",
|
|
|
|
|
(unsigned long)(ent->header));
|
1997-09-20 00:36:59 +08:00
|
|
|
|
fprintf (stream, "%*s%-*s %s\n", indent, "", fwidth,
|
|
|
|
|
"Dirty:",
|
|
|
|
|
ent->dirty ? "Yes" : "No");
|
|
|
|
|
fprintf (stream, "%*s%-*s %s\n", indent, "", fwidth,
|
|
|
|
|
"Has a shadow:",
|
|
|
|
|
H5G_shadow_p (ent)?"This is a shadow!" :
|
|
|
|
|
(ent->shadow ? "Yes" : "No"));
|
1997-08-30 06:23:04 +08:00
|
|
|
|
|
|
|
|
|
fprintf (stream, "%*s%-*s ", indent, "", fwidth,
|
|
|
|
|
"Symbol type:");
|
|
|
|
|
switch (ent->type) {
|
|
|
|
|
case H5G_NOTHING_CACHED:
|
|
|
|
|
fprintf (stream, "Nothing Cached\n");
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case H5G_CACHED_SDATA:
|
|
|
|
|
fprintf (stream, "S-data\n");
|
|
|
|
|
fprintf (stream, "%*s%-*s %u\n", indent, "", fwidth,
|
|
|
|
|
"Number type length:",
|
|
|
|
|
(unsigned)(ent->cache.sdata.nt.length));
|
|
|
|
|
fprintf (stream, "%*s%-*s %u\n", indent, "", fwidth,
|
|
|
|
|
"Number type architecture:",
|
|
|
|
|
(unsigned)(ent->cache.sdata.nt.arch));
|
|
|
|
|
fprintf (stream, "%*s%-*s %u\n", indent, "", fwidth,
|
|
|
|
|
"Number type type:",
|
|
|
|
|
(unsigned)(ent->cache.sdata.nt.type));
|
|
|
|
|
fprintf (stream, "%*s%-*s %u\n", indent, "", fwidth,
|
|
|
|
|
"Dimensionality:",
|
|
|
|
|
(unsigned)(ent->cache.sdata.ndim));
|
|
|
|
|
for (i=0; i<ent->cache.sdata.ndim && i<4; i++) {
|
|
|
|
|
sprintf (buf, "Dimension %d", i);
|
|
|
|
|
fprintf (stream, "%*s%-*s %u\n", indent, "", fwidth,
|
|
|
|
|
buf,
|
|
|
|
|
(unsigned)(ent->cache.sdata.dim[i]));
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case H5G_CACHED_STAB:
|
|
|
|
|
fprintf (stream, "Symbol Table\n");
|
|
|
|
|
fprintf (stream, "%*s%-*s %lu\n", indent, "", fwidth,
|
|
|
|
|
"B-tree address:",
|
1997-09-11 03:57:56 +08:00
|
|
|
|
(unsigned long)(ent->cache.stab.btree_addr));
|
1997-08-30 06:23:04 +08:00
|
|
|
|
fprintf (stream, "%*s%-*s %lu\n", indent, "", fwidth,
|
|
|
|
|
"Heap address:",
|
1997-09-11 03:57:56 +08:00
|
|
|
|
(unsigned long)(ent->cache.stab.heap_addr));
|
1997-08-30 06:23:04 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
fprintf (stream, "*** Unknown symbol type %d\n", ent->type);
|
|
|
|
|
break;
|
|
|
|
|
}
|
[svn-r6] Added the next layer of symbol table functions. Given a symbol table
name, they operate to query or modify the corresponding symbol table entry.
They don't understand directory hierarchies (that's the next layer up).
Since the object header stuff isn't done yet, they call four stub functions
that all return failure:
not_implemented_yet__create_object_header()
not_implemented_yet__insert_symtab_message()
not_implemented_yet__get_symtab_message()
not_implemented_yet__update_symtab_message()
The interface is:
haddr_t H5G_new (file, initial_heap_size)
Creates a new symbol table.
haddr_t H5G_find (file, symtab_addr, symbol_name, *entry)
Returns a symbol table entry given the name.
herr_t H5G_modify (file, symtab_addr, symbol_name, *entry)
Modifies the symbol table entry for the specified name.
herr_t H5G_insert (file, symtab_addr, symbol_name, *entry)
Inserts a new name and symbol table entry pair.
intn H5G_list (file, symtab_addr, maxentries, names[], entries[])
Returns a list of all names and symbol table entries.
1997-08-02 04:20:33 +08:00
|
|
|
|
|
1997-08-30 06:23:04 +08:00
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
|
|
|
|
}
|