1997-07-31 05:17:56 +08:00
|
|
|
|
/*-------------------------------------------------------------------------
|
2002-04-28 16:34:17 +08:00
|
|
|
|
* Copyright (C) 1997-2002 National Center for Supercomputing Applications
|
2001-04-06 01:29:14 +08:00
|
|
|
|
* All rights reserved.
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*
|
1998-03-25 07:18:34 +08:00
|
|
|
|
* Created: H5G.c
|
|
|
|
|
* Jul 18 1997
|
|
|
|
|
* Robb Matzke <matzke@llnl.gov>
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Symbol table functions. The functions that begin with
|
|
|
|
|
* `H5G_stab_' don't understand the naming system; 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 how to traverse the group
|
|
|
|
|
* directed graph.
|
|
|
|
|
*
|
|
|
|
|
* Names: Object names are a slash-separated list of components. If
|
|
|
|
|
* the name begins with a slash then it's absolute, otherwise
|
|
|
|
|
* it's relative ("/foo/bar" is absolute while "foo/bar" is
|
|
|
|
|
* relative). Multiple consecutive slashes are treated as
|
|
|
|
|
* single slashes and trailing slashes are ignored. The special
|
|
|
|
|
* case `/' is the root group. Every file has a root group.
|
|
|
|
|
*
|
|
|
|
|
* API functions that look up names take a location ID and a
|
|
|
|
|
* name. The location ID can be a file ID or a group ID and the
|
|
|
|
|
* name can be relative or absolute.
|
|
|
|
|
*
|
|
|
|
|
* +--------------+----------- +--------------------------------+
|
|
|
|
|
* | Location ID | Name | Meaning |
|
|
|
|
|
* +--------------+------------+--------------------------------+
|
|
|
|
|
* | File ID | "/foo/bar" | Find `foo' within `bar' within |
|
|
|
|
|
* | | | the root group of the specified|
|
|
|
|
|
* | | | file. |
|
|
|
|
|
* +--------------+------------+--------------------------------+
|
|
|
|
|
* | File ID | "foo/bar" | Find `foo' within `bar' within |
|
|
|
|
|
* | | | the current working group of |
|
|
|
|
|
* | | | the specified file. |
|
|
|
|
|
* +--------------+------------+--------------------------------+
|
|
|
|
|
* | File ID | "/" | The root group of the specified|
|
|
|
|
|
* | | | file. |
|
|
|
|
|
* +--------------+------------+--------------------------------+
|
|
|
|
|
* | File ID | "." | The current working group of |
|
|
|
|
|
* | | | the specified file. |
|
|
|
|
|
* +--------------+------------+--------------------------------+
|
|
|
|
|
* | Group ID | "/foo/bar" | Find `foo' within `bar' within |
|
|
|
|
|
* | | | the root group of the file |
|
|
|
|
|
* | | | containing the specified group.|
|
|
|
|
|
* +--------------+------------+--------------------------------+
|
|
|
|
|
* | Group ID | "foo/bar" | File `foo' within `bar' within |
|
|
|
|
|
* | | | the specified group. |
|
|
|
|
|
* +--------------+------------+--------------------------------+
|
|
|
|
|
* | Group ID | "/" | The root group of the file |
|
|
|
|
|
* | | | containing the specified group.|
|
|
|
|
|
* +--------------+------------+--------------------------------+
|
|
|
|
|
* | Group ID | "." | The specified group. |
|
|
|
|
|
* +--------------+------------+--------------------------------+
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*
|
|
|
|
|
*
|
1997-08-08 03:23:00 +08:00
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Robb Matzke, 5 Aug 1997
|
|
|
|
|
* Added calls to H5E.
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Robb Matzke, 30 Aug 1997
|
|
|
|
|
* Added `Errors:' field to function prologues.
|
1997-09-02 23:38:26 +08:00
|
|
|
|
*
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
2000-10-10 15:43:38 +08:00
|
|
|
|
|
1998-03-25 07:18:34 +08:00
|
|
|
|
#define H5G_PACKAGE /*suppress error message about including H5Gpkg.h */
|
2000-10-10 15:43:38 +08:00
|
|
|
|
#define H5F_PACKAGE /*suppress error about including H5Fpkg */
|
|
|
|
|
|
[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... */
|
2001-04-06 01:29:14 +08:00
|
|
|
|
#include "H5private.h"
|
|
|
|
|
#include "H5Aprivate.h"
|
|
|
|
|
#include "H5Bprivate.h"
|
|
|
|
|
#include "H5Dprivate.h"
|
|
|
|
|
#include "H5Eprivate.h"
|
|
|
|
|
#include "H5Fpkg.h" /*file access */
|
|
|
|
|
#include "H5FLprivate.h" /*Free Lists */
|
|
|
|
|
#include "H5Gpkg.h"
|
|
|
|
|
#include "H5HLprivate.h"
|
|
|
|
|
#include "H5Iprivate.h"
|
|
|
|
|
#include "H5MMprivate.h"
|
|
|
|
|
#include "H5Oprivate.h"
|
1997-08-08 03:23:00 +08:00
|
|
|
|
|
1998-01-28 13:47:19 +08:00
|
|
|
|
#define H5G_INIT_HEAP 8192
|
|
|
|
|
#define H5G_RESERVED_ATOMS 0
|
|
|
|
|
#define PABLO_MASK H5G_mask
|
1997-08-08 03:23:00 +08:00
|
|
|
|
|
[svn-r139] ./src/*.[ch]
Removed the interface initialization argument from
FUNC_ENTER() and made it a locally-defined preprocessor
symbol, INTERFACE_INIT.
Changed `offset' to `address' and `length' to `size' in
documentation so it's more consistent. `Offset' still appears
occassionally when it refers to a byte offset within some
other data structure.
Moved interface termination function prototypes from public
header files to .c files and made them static.
./src/H5.c
./src/H5public.h
Added H5init() because it's possible that the predefined data
types are not initialized. This happens only if the first
call to the hdf5 library passes a predefined data type symbol
as an argument. There should be some way to fix this...
./src/H5A.c
./src/H5Aprivate.h
./src/H5Apublic.h
The free_func returns SUCCEED or FAIL, although the return
value is ignored by H5A. This is so we can use the various
H5*_close() functions to free things.
H5Ainc_ref() and H5Adec_ref() are no longer public. Many of
the other atom functions should also be made private, but I'll
save that for later...
Added additional template groups called H5_TEMPLATE_0 through
H5_TEMPLATE_7 that are used by the various template
subclasses.
Increased the number of bits used for atom groups to prevent
negative atoms.
./src/H5AC.c
./src/H5ACprivate.h
Changed H5AC_new() to H5AC_create() to make names more consistent.
./src/H5B.c
./src/H5Bprivate.h
Changed H5B_new() to H5B_create() to make names more consistent.
./src/H5C.c
./src/H5Cprivate.h
./src/H5Cpublic.h
Now supports multiple subclasses of templates, although it's
done with big switch statements. The default values for
templates are defined in the source file to which that
template belongs. This got rid of lots of needless
preprocessor constants.
Added H5Ccreate() to create a new template. Changed
H5C_release() to H5Cclose() to make the naming more
consistent.
./src/H5D.c
./src/H5Dprivate.h
./src/H5Dpublic.h
Enhanced to use the new dataset interface, and uses the enhanced
data type and data space interfaces, which haven't been
completely implemented. The dataset interface doesn't handle
non-contiguous storage, compression, or data type and space
conversions yet.
./src/H5F.c
./src/H5Fprivate.h
./src/H5Fpublic.h
Removed H5Fflush() since just calls H5F_flush(), which doesn't
do what the user would probably think it does, namely, flush
everything. It only flushes those things sitting in the H5AC
cache and the boot block.
Changed the `file_create_parms' field of H5F_low_t to just
`create_parms' since the `file' part is obvious.
./src/H5Fistore.c
Added some support for external files. Mostly just in the
file format and not supported much by the library yet. I need
to finish some dataset functions first.
Changed H5F_istore_new() to H5F_istore_create() to make names
more uniform across packages.
./src/H5Flow.c
Flushing a file causes the file to be physically extended to
the logical eof. This prevents H5F_open() from thinking a
file has been truncated. Most of the time the file will
already be that large, and when it isn't Unix will often just
allocate the final block anyway.
./src/H5G.c
./src/H5Gent.c
./src/H5Gnode.c
./src/H5Gpkg.h
./src/H5Gprivate.h
./src/H5Gstab.c
Removed H5G_basename()
Removed (temporarily) data type information from symbol table
entries and renamed H5G_CACHED_SDATA to H5G_CACHED_SDSPACE to
reflect that it's a simple data space and has nothing to do
with raw data.
Changed H5G_node_new() to H5G_node_create() and H5G_stab_new()
to H5G_stab_create() to make names more uniform across
packages.
Fixed an undefined address bug that happens when H5G_node_debug()
program doesn't pass enough info to H5G_node_load().
./src/H5H.c
./src/H5Hprivate.h
Changed H5H_new() to H5H_create() to make the names more
uniform across packages.
./src/H5M.c
./src/H5Mprivate.h
./src/H5Mpublic.h
Nulled all the create functions. Most of the other callbacks
are to public functions. Removed H5Mcreate().
Changed hobjtype_t to group_t since it has to be the same
thing anyway.
./src/H5O.c
./src/H5Oprivate.h
./src/H5Osdim.c
./src/H5Osdtyp.c
Changed H5O_SIM_DIM to H5O_SDSPACE (simple data space) since
`simple data space' is its official name, not `simple
dimensions'. Will eventually add H5O_CDSPACE for comples data
spaces. Changed _sim_dim_ to _dspace_.
Replaced H5O_SIM_DTYPE and the compound data type messages
with a single H5O_DTYPE message. Changed _sim_dtype_ to _dtype_.
Changed H5O_STD_STORE to H5O_CSTORE (contiguous storage) since
contiguous storage is not necessarily standard. Changed
_std_store_ to _cstore_ in H5Ocstore.c
Added the H5O_EFL (external file list) message.
Changed H5O_new() to H5O_create() to make names more uniform
across packages.
./src/H5Oefl.c NEW
External file list message for specifying which non-hdf5 files
contain raw data for a dataset.
./src/H5P.c
./src/H5Pprivate.h
./src/H5Ppublic.h
Renamed and moved data structures to make the names conform to
our naming scheme.
./src/H5T.c
./src/H5Tprivate.h
./src/H5Tpublic.h
./src/H5Tpkg.h NEW
Data structures redesigned to be more flexible. The interface
was redesigned to make it more regular and to make some names
more uniform across packages.
./src/H5detect.c
Output was changed to produce a file that conforms to the hdf5
coding standard.
./src/Makefile.in
Generates H5Tinit.c by running H5detect.
./src/debug.c
Moved command argument processing.
1997-12-11 06:41:07 +08:00
|
|
|
|
/* Interface initialization */
|
2001-08-15 06:09:56 +08:00
|
|
|
|
static int interface_initialize_g = 0;
|
1998-03-24 22:53:57 +08:00
|
|
|
|
#define INTERFACE_INIT H5G_init_interface
|
1998-03-25 07:18:34 +08:00
|
|
|
|
static herr_t H5G_init_interface(void);
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
static H5G_typeinfo_t *H5G_type_g = NULL; /*object typing info */
|
|
|
|
|
static size_t H5G_ntypes_g = 0; /*entries in type table */
|
|
|
|
|
static size_t H5G_atypes_g = 0; /*entries allocated */
|
2002-03-29 03:27:38 +08:00
|
|
|
|
static char *H5G_comp_g = NULL; /*component buffer */
|
|
|
|
|
static size_t H5G_comp_alloc_g = 0; /*sizeof component buffer */
|
1997-09-22 10:08:54 +08:00
|
|
|
|
|
2000-08-17 04:13:02 +08:00
|
|
|
|
/* Declare a free list to manage the H5G_t struct */
|
|
|
|
|
H5FL_DEFINE(H5G_t);
|
|
|
|
|
|
1997-10-21 07:14:35 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Function: H5Gcreate
|
1997-10-21 07:14:35 +08:00
|
|
|
|
*
|
1998-03-25 07:18:34 +08:00
|
|
|
|
* Purpose: Creates a new group relative to LOC_ID and gives it the
|
|
|
|
|
* specified NAME. The group is opened for write access
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* and it's object ID is returned.
|
1997-10-21 07:14:35 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* The optional SIZE_HINT specifies how much file space to
|
|
|
|
|
* reserve to store the names that will appear in this
|
|
|
|
|
* group. If a non-positive value is supplied for the SIZE_HINT
|
|
|
|
|
* then a default size is chosen.
|
1997-10-21 07:14:35 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* See also: H5Gset(), H5Gpush(), H5Gpop()
|
1997-10-21 07:14:35 +08:00
|
|
|
|
*
|
|
|
|
|
* Errors:
|
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Return: Success: The object ID of a new, empty group open for
|
|
|
|
|
* writing. Call H5Gclose() when finished with
|
|
|
|
|
* the group.
|
1997-10-21 07:14:35 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Failure: FAIL
|
1997-10-21 07:14:35 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Wednesday, September 24, 1997
|
1997-10-21 07:14:35 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-01-06 11:07:15 +08:00
|
|
|
|
hid_t
|
1998-08-28 00:48:50 +08:00
|
|
|
|
H5Gcreate(hid_t loc_id, const char *name, size_t size_hint)
|
1997-10-21 07:14:35 +08:00
|
|
|
|
{
|
1998-08-31 21:46:47 +08:00
|
|
|
|
H5G_entry_t *loc = NULL;
|
1998-03-25 07:18:34 +08:00
|
|
|
|
H5G_t *grp = NULL;
|
1998-01-28 13:47:19 +08:00
|
|
|
|
hid_t ret_value = FAIL;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5Gcreate, FAIL);
|
[svn-r429] Changes since 19980616
----------------------
./html/tracing.html NEW
This entire update is to make it possible for the library to
print the name, arguments, and return value of every API call
without requiring any extra work from developers or app
programmers. This file describes how this all works.
./configure.in
Added the `--enable-tracing' switch. If you use it then the
library will include code to print API function names,
argument names and values, and function return values.
However, you must then turn on the tracing by setting the
HDF5_TRACE environment variable to a file descriptor number.
The default is `--disable-tracing' since enabling it causes a
slight increase in library size and a slowdown resulting from
an extra function call for each API function call (I couldn't
even measure the slowdown :-)
./bin/trace NEW
A perl script that synchronizes the H5TRACE() macro calls in
the *.c files with the function return type and formal
argument names and types. If you use GNU make and gcc then
this will be done automatically, otherwise just invoke this
script with the names of one or more .c files. You could do
it by hand to, but encoding argument types is a little tricky
at first.
./config/commence.in
Added the $(TRACE) macro, which defaults to the no-op.
Added -D_POSIX_SOURCE to the compiler command line.
./src/Makefile.in
Override the default for $(TRACE).
./config/depend.in
Automatically calls $(TRACE) to synchronize the H5TRACE()
macros in any source file that changed. As with makefile
dependencies, one way to force synchronization of all files is
to remove the `.depend' file.
./MANIFEST
Added new files.
./src/H5Eprivate.h
Modified HRETURN_ERROR() and HRETURN() for tracing.
./src/H5.c
./src/H5private.h
This is where the real tracing work really happens, in
H5_trace().
./src/H5A.c
./src/H5D.c
./src/H5G.c
./src/H5P.c
./src/H5S.c
./src/H5Z.c
Added H5TRACE() calls to all API functions. You don't really
need these changes if you don't want to merge your stuff
because they can be generated automatically by going to the
hdf5/src directory and saying ../bin/trace *.c
./src/H5T.c
Added H5TRACE() calls. Other stuff below.
./src/H5E.c
./src/H5Epublic.h
Added H5TRACE() calls. Created a type H5E_auto_t for the
`func' argument of H5Eset_auto() and H5Eget_auto() to make
those arguments easier to parse for tracing. It should also
make it clearer for users that don't know how to read
complicated ANSI data types.
./src/H5F.c
Added H5TRACE() calls. Changed a couple `uintn' argument
types in API functions to `unsigned int' since `uintn' part of
the API. Changed a few "can't" and "cant" error messages to
"unable to".
./src/H5Ipublic.h
Removed H5_DIRECTORY from the H5I_group_t enum. It wasn't
used anywhere.
./src/H5Tconv.c
Removed an unused label.
./src/H5Fistore.c
./src/H5Oattr.c
./src/H5Odtype.c
./src/H5T.c
./test/dsets.c
./test/dtypes.c
Fixed a warning about a variable possibly used before it's
initialized. Added __unused__ to turn off some unused
argument warnings that pop up when debugging is turned off and
optimizations are turned on.
1998-06-18 04:46:29 +08:00
|
|
|
|
H5TRACE3("i","isz",loc_id,name,size_hint);
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
/* Check arguments */
|
1998-03-25 07:18:34 +08:00
|
|
|
|
if (NULL==(loc=H5G_loc (loc_id))) {
|
|
|
|
|
HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a location");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
if (!name || !*name) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name given");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/* Create the group */
|
1998-03-25 07:18:34 +08:00
|
|
|
|
if (NULL == (grp = H5G_create(loc, name, size_hint))) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create group");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
1998-10-06 07:41:30 +08:00
|
|
|
|
if ((ret_value = H5I_register(H5I_GROUP, grp)) < 0) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
H5G_close(grp);
|
|
|
|
|
HRETURN_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL,
|
|
|
|
|
"unable to register group");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
FUNC_LEAVE(ret_value);
|
1998-01-06 11:07:15 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
1998-01-06 11:07:15 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Function: H5Gopen
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Purpose: Opens an existing group for modification. When finished,
|
|
|
|
|
* call H5Gclose() to close it and release resources.
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
|
|
|
|
* Errors:
|
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Return: Success: Object ID of the group.
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Failure: FAIL
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Wednesday, December 31, 1997
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
hid_t
|
1998-08-28 00:48:50 +08:00
|
|
|
|
H5Gopen(hid_t loc_id, const char *name)
|
1998-01-06 11:07:15 +08:00
|
|
|
|
{
|
1998-03-25 07:18:34 +08:00
|
|
|
|
hid_t ret_value = FAIL;
|
|
|
|
|
H5G_t *grp = NULL;
|
1998-08-31 21:46:47 +08:00
|
|
|
|
H5G_entry_t *loc = NULL;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5Gopen, FAIL);
|
[svn-r429] Changes since 19980616
----------------------
./html/tracing.html NEW
This entire update is to make it possible for the library to
print the name, arguments, and return value of every API call
without requiring any extra work from developers or app
programmers. This file describes how this all works.
./configure.in
Added the `--enable-tracing' switch. If you use it then the
library will include code to print API function names,
argument names and values, and function return values.
However, you must then turn on the tracing by setting the
HDF5_TRACE environment variable to a file descriptor number.
The default is `--disable-tracing' since enabling it causes a
slight increase in library size and a slowdown resulting from
an extra function call for each API function call (I couldn't
even measure the slowdown :-)
./bin/trace NEW
A perl script that synchronizes the H5TRACE() macro calls in
the *.c files with the function return type and formal
argument names and types. If you use GNU make and gcc then
this will be done automatically, otherwise just invoke this
script with the names of one or more .c files. You could do
it by hand to, but encoding argument types is a little tricky
at first.
./config/commence.in
Added the $(TRACE) macro, which defaults to the no-op.
Added -D_POSIX_SOURCE to the compiler command line.
./src/Makefile.in
Override the default for $(TRACE).
./config/depend.in
Automatically calls $(TRACE) to synchronize the H5TRACE()
macros in any source file that changed. As with makefile
dependencies, one way to force synchronization of all files is
to remove the `.depend' file.
./MANIFEST
Added new files.
./src/H5Eprivate.h
Modified HRETURN_ERROR() and HRETURN() for tracing.
./src/H5.c
./src/H5private.h
This is where the real tracing work really happens, in
H5_trace().
./src/H5A.c
./src/H5D.c
./src/H5G.c
./src/H5P.c
./src/H5S.c
./src/H5Z.c
Added H5TRACE() calls to all API functions. You don't really
need these changes if you don't want to merge your stuff
because they can be generated automatically by going to the
hdf5/src directory and saying ../bin/trace *.c
./src/H5T.c
Added H5TRACE() calls. Other stuff below.
./src/H5E.c
./src/H5Epublic.h
Added H5TRACE() calls. Created a type H5E_auto_t for the
`func' argument of H5Eset_auto() and H5Eget_auto() to make
those arguments easier to parse for tracing. It should also
make it clearer for users that don't know how to read
complicated ANSI data types.
./src/H5F.c
Added H5TRACE() calls. Changed a couple `uintn' argument
types in API functions to `unsigned int' since `uintn' part of
the API. Changed a few "can't" and "cant" error messages to
"unable to".
./src/H5Ipublic.h
Removed H5_DIRECTORY from the H5I_group_t enum. It wasn't
used anywhere.
./src/H5Tconv.c
Removed an unused label.
./src/H5Fistore.c
./src/H5Oattr.c
./src/H5Odtype.c
./src/H5T.c
./test/dsets.c
./test/dtypes.c
Fixed a warning about a variable possibly used before it's
initialized. Added __unused__ to turn off some unused
argument warnings that pop up when debugging is turned off and
optimizations are turned on.
1998-06-18 04:46:29 +08:00
|
|
|
|
H5TRACE2("i","is",loc_id,name);
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
/* Check args */
|
1998-03-25 07:18:34 +08:00
|
|
|
|
if (NULL==(loc=H5G_loc(loc_id))) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
if (!name || !*name) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/* Open the group */
|
1998-03-25 07:18:34 +08:00
|
|
|
|
if (NULL == (grp = H5G_open(loc, name))) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
/* Register an atom for the group */
|
1998-10-06 07:41:30 +08:00
|
|
|
|
if ((ret_value = H5I_register(H5I_GROUP, grp)) < 0) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
H5G_close(grp);
|
|
|
|
|
HRETURN_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL,
|
|
|
|
|
"unable to register group");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
FUNC_LEAVE(ret_value);
|
1997-10-21 07:14:35 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
1998-01-06 11:07:15 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Function: H5Gclose
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Purpose: Closes the specified group. The group ID will no longer be
|
|
|
|
|
* valid for accessing the group.
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Wednesday, December 31, 1997
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
1998-08-28 00:48:50 +08:00
|
|
|
|
H5Gclose(hid_t group_id)
|
1998-01-06 11:07:15 +08:00
|
|
|
|
{
|
1998-01-17 06:23:43 +08:00
|
|
|
|
FUNC_ENTER(H5Gclose, FAIL);
|
[svn-r529] Changes since 19980722
----------------------
./src/H5.c
Handle hid_t of type H5_TEMPBUF, arguments usually called tbuf_id.
Added array tracing where the array rank is stored in a simple
data space. Just use the name of the data space argument when
declaring the array argument:
herr_t
H5Sselect_hyperslab (hid_t space_id, H5S_seloper_t op,
const hssize_t start[/*space_id*/],
const hsize_t _stride[/*space_id*/],
const hsize_t count[/*space_id*/],
const hsize_t _block[/*space_id*/])
and when the program runs you'll see array values printed:
H5Sselect_hyperslab(space=218103813, op=H5S_SELECT_SET,
start=0xbfffef4c {0}, _stride=NULL,
count=0xbfffef44 {64},
_block=NULL) = SUCCEED;
Added more symbolic data types to the tracing output.
./src/H5A.c
./src/H5Apublic.h
./src/H5D.c
./src/H5Dpublic.h
./src/H5F.c
./src/H5Fpublic.h
./src/H5G.c
./src/H5Gpublic.h
./src/H5P.c
./src/H5Ppublic.h
./src/H5S.c
./src/H5Sall.c
./src/H5Shyper.c
./src/H5Spoint.c
./src/H5Spublic.h
./src/H5Sselect.c
./src/H5Ssimp.c
./src/H5TB.c
./src/H5V.c
Changed some API argument names to be more consistent with
other API functions and to produce better tracing output.
Reformatted some long lines. Indented printf statements.
./tools/h5ls.c
Fixed warnings about unsigned vs. signed comparisons.
1998-07-23 02:45:46 +08:00
|
|
|
|
H5TRACE1("e","i",group_id);
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
/* Check args */
|
1998-10-06 07:41:30 +08:00
|
|
|
|
if (H5I_GROUP != H5I_get_type(group_id) ||
|
[svn-r529] Changes since 19980722
----------------------
./src/H5.c
Handle hid_t of type H5_TEMPBUF, arguments usually called tbuf_id.
Added array tracing where the array rank is stored in a simple
data space. Just use the name of the data space argument when
declaring the array argument:
herr_t
H5Sselect_hyperslab (hid_t space_id, H5S_seloper_t op,
const hssize_t start[/*space_id*/],
const hsize_t _stride[/*space_id*/],
const hsize_t count[/*space_id*/],
const hsize_t _block[/*space_id*/])
and when the program runs you'll see array values printed:
H5Sselect_hyperslab(space=218103813, op=H5S_SELECT_SET,
start=0xbfffef4c {0}, _stride=NULL,
count=0xbfffef44 {64},
_block=NULL) = SUCCEED;
Added more symbolic data types to the tracing output.
./src/H5A.c
./src/H5Apublic.h
./src/H5D.c
./src/H5Dpublic.h
./src/H5F.c
./src/H5Fpublic.h
./src/H5G.c
./src/H5Gpublic.h
./src/H5P.c
./src/H5Ppublic.h
./src/H5S.c
./src/H5Sall.c
./src/H5Shyper.c
./src/H5Spoint.c
./src/H5Spublic.h
./src/H5Sselect.c
./src/H5Ssimp.c
./src/H5TB.c
./src/H5V.c
Changed some API argument names to be more consistent with
other API functions and to produce better tracing output.
Reformatted some long lines. Indented printf statements.
./tools/h5ls.c
Fixed warnings about unsigned vs. signed comparisons.
1998-07-23 02:45:46 +08:00
|
|
|
|
NULL == H5I_object(group_id)) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
/*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Decrement the counter on the group atom. It will be freed if the count
|
1998-01-17 06:23:43 +08:00
|
|
|
|
* reaches zero.
|
|
|
|
|
*/
|
[svn-r529] Changes since 19980722
----------------------
./src/H5.c
Handle hid_t of type H5_TEMPBUF, arguments usually called tbuf_id.
Added array tracing where the array rank is stored in a simple
data space. Just use the name of the data space argument when
declaring the array argument:
herr_t
H5Sselect_hyperslab (hid_t space_id, H5S_seloper_t op,
const hssize_t start[/*space_id*/],
const hsize_t _stride[/*space_id*/],
const hsize_t count[/*space_id*/],
const hsize_t _block[/*space_id*/])
and when the program runs you'll see array values printed:
H5Sselect_hyperslab(space=218103813, op=H5S_SELECT_SET,
start=0xbfffef4c {0}, _stride=NULL,
count=0xbfffef44 {64},
_block=NULL) = SUCCEED;
Added more symbolic data types to the tracing output.
./src/H5A.c
./src/H5Apublic.h
./src/H5D.c
./src/H5Dpublic.h
./src/H5F.c
./src/H5Fpublic.h
./src/H5G.c
./src/H5Gpublic.h
./src/H5P.c
./src/H5Ppublic.h
./src/H5S.c
./src/H5Sall.c
./src/H5Shyper.c
./src/H5Spoint.c
./src/H5Spublic.h
./src/H5Sselect.c
./src/H5Ssimp.c
./src/H5TB.c
./src/H5V.c
Changed some API argument names to be more consistent with
other API functions and to produce better tracing output.
Reformatted some long lines. Indented printf statements.
./tools/h5ls.c
Fixed warnings about unsigned vs. signed comparisons.
1998-07-23 02:45:46 +08:00
|
|
|
|
if (H5I_dec_ref(group_id) < 0) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to close group");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
FUNC_LEAVE(SUCCEED);
|
1998-01-06 11:07:15 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
1998-03-24 22:53:57 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5Giterate
|
|
|
|
|
*
|
1998-03-25 07:18:34 +08:00
|
|
|
|
* Purpose: Iterates over the entries of a group. The LOC_ID and NAME
|
|
|
|
|
* identify the group over which to iterate and IDX indicates
|
1998-03-24 22:53:57 +08:00
|
|
|
|
* where to start iterating (zero means at the beginning). The
|
|
|
|
|
* OPERATOR is called for each member and the iteration
|
|
|
|
|
* continues until the operator returns non-zero or all members
|
|
|
|
|
* are processed. The operator is passed a group ID for the
|
|
|
|
|
* group being iterated, a member name, and OP_DATA for each
|
|
|
|
|
* member.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: The return value of the first operator that
|
|
|
|
|
* returns non-zero, or zero if all members were
|
|
|
|
|
* processed with no operator returning non-zero.
|
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Failure: Negative if something goes wrong within the
|
|
|
|
|
* library, or the negative value returned by one
|
1998-03-24 22:53:57 +08:00
|
|
|
|
* of the operators.
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, March 23, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
1998-08-28 00:48:50 +08:00
|
|
|
|
H5Giterate(hid_t loc_id, const char *name, int *idx,
|
1998-03-24 22:53:57 +08:00
|
|
|
|
H5G_iterate_t op, void *op_data)
|
|
|
|
|
{
|
1998-03-25 07:18:34 +08:00
|
|
|
|
int _idx = 0;
|
1998-03-24 22:53:57 +08:00
|
|
|
|
H5G_bt_ud2_t udata;
|
|
|
|
|
herr_t ret_value = FAIL;
|
1998-08-31 21:46:47 +08:00
|
|
|
|
H5G_entry_t *loc = NULL;
|
1998-03-24 22:53:57 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER (H5Giterate, FAIL);
|
[svn-r429] Changes since 19980616
----------------------
./html/tracing.html NEW
This entire update is to make it possible for the library to
print the name, arguments, and return value of every API call
without requiring any extra work from developers or app
programmers. This file describes how this all works.
./configure.in
Added the `--enable-tracing' switch. If you use it then the
library will include code to print API function names,
argument names and values, and function return values.
However, you must then turn on the tracing by setting the
HDF5_TRACE environment variable to a file descriptor number.
The default is `--disable-tracing' since enabling it causes a
slight increase in library size and a slowdown resulting from
an extra function call for each API function call (I couldn't
even measure the slowdown :-)
./bin/trace NEW
A perl script that synchronizes the H5TRACE() macro calls in
the *.c files with the function return type and formal
argument names and types. If you use GNU make and gcc then
this will be done automatically, otherwise just invoke this
script with the names of one or more .c files. You could do
it by hand to, but encoding argument types is a little tricky
at first.
./config/commence.in
Added the $(TRACE) macro, which defaults to the no-op.
Added -D_POSIX_SOURCE to the compiler command line.
./src/Makefile.in
Override the default for $(TRACE).
./config/depend.in
Automatically calls $(TRACE) to synchronize the H5TRACE()
macros in any source file that changed. As with makefile
dependencies, one way to force synchronization of all files is
to remove the `.depend' file.
./MANIFEST
Added new files.
./src/H5Eprivate.h
Modified HRETURN_ERROR() and HRETURN() for tracing.
./src/H5.c
./src/H5private.h
This is where the real tracing work really happens, in
H5_trace().
./src/H5A.c
./src/H5D.c
./src/H5G.c
./src/H5P.c
./src/H5S.c
./src/H5Z.c
Added H5TRACE() calls to all API functions. You don't really
need these changes if you don't want to merge your stuff
because they can be generated automatically by going to the
hdf5/src directory and saying ../bin/trace *.c
./src/H5T.c
Added H5TRACE() calls. Other stuff below.
./src/H5E.c
./src/H5Epublic.h
Added H5TRACE() calls. Created a type H5E_auto_t for the
`func' argument of H5Eset_auto() and H5Eget_auto() to make
those arguments easier to parse for tracing. It should also
make it clearer for users that don't know how to read
complicated ANSI data types.
./src/H5F.c
Added H5TRACE() calls. Changed a couple `uintn' argument
types in API functions to `unsigned int' since `uintn' part of
the API. Changed a few "can't" and "cant" error messages to
"unable to".
./src/H5Ipublic.h
Removed H5_DIRECTORY from the H5I_group_t enum. It wasn't
used anywhere.
./src/H5Tconv.c
Removed an unused label.
./src/H5Fistore.c
./src/H5Oattr.c
./src/H5Odtype.c
./src/H5T.c
./test/dsets.c
./test/dtypes.c
Fixed a warning about a variable possibly used before it's
initialized. Added __unused__ to turn off some unused
argument warnings that pop up when debugging is turned off and
optimizations are turned on.
1998-06-18 04:46:29 +08:00
|
|
|
|
H5TRACE5("e","is*Isxx",loc_id,name,idx,op,op_data);
|
1998-03-24 22:53:57 +08:00
|
|
|
|
|
|
|
|
|
/* Check args */
|
1998-03-25 07:18:34 +08:00
|
|
|
|
if (NULL==(loc=H5G_loc (loc_id))) {
|
|
|
|
|
HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a location");
|
1998-03-24 22:53:57 +08:00
|
|
|
|
}
|
|
|
|
|
if (!name || !*name) {
|
|
|
|
|
HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified");
|
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
if (!idx) idx = &_idx;
|
1998-03-24 22:53:57 +08:00
|
|
|
|
if (!op) {
|
|
|
|
|
HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "no operator specified");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Open the group on which to operate. We also create a group ID which
|
|
|
|
|
* we can pass to the application-defined operator.
|
|
|
|
|
*/
|
1998-03-25 07:18:34 +08:00
|
|
|
|
if (NULL==(udata.group = H5G_open (loc, name))) {
|
1998-03-24 22:53:57 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL, "unable to open group");
|
|
|
|
|
}
|
1998-10-06 07:41:30 +08:00
|
|
|
|
if ((udata.group_id=H5I_register (H5I_GROUP, udata.group))<0) {
|
1999-02-21 00:18:51 +08:00
|
|
|
|
H5G_close(udata.group);
|
1998-03-24 22:53:57 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to register group");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Build udata to pass through H5B_iterate() to H5G_node_iterate() */
|
1998-03-25 07:18:34 +08:00
|
|
|
|
udata.skip = *idx;
|
1998-03-24 22:53:57 +08:00
|
|
|
|
udata.op = op;
|
|
|
|
|
udata.op_data = op_data;
|
|
|
|
|
|
2000-04-06 04:51:27 +08:00
|
|
|
|
/* Set the number of entries looked at to zero */
|
|
|
|
|
udata.final_ent = 0;
|
|
|
|
|
|
1998-03-24 22:53:57 +08:00
|
|
|
|
/* Iterate over the group members */
|
1998-03-25 07:18:34 +08:00
|
|
|
|
if ((ret_value = H5B_iterate (H5G_fileof(udata.group), H5B_SNODE,
|
2002-04-24 00:01:43 +08:00
|
|
|
|
H5G_node_iterate, udata.group->ent.cache.stab.btree_addr, &udata))<0) {
|
2000-04-06 04:51:27 +08:00
|
|
|
|
HERROR (H5E_SYM, H5E_CANTINIT, "iteration operator failed");
|
1998-03-24 22:53:57 +08:00
|
|
|
|
}
|
2000-04-06 04:51:27 +08:00
|
|
|
|
|
|
|
|
|
/* Set the index we stopped at */
|
|
|
|
|
*idx=udata.final_ent;
|
|
|
|
|
|
1998-03-24 22:53:57 +08:00
|
|
|
|
H5I_dec_ref (udata.group_id); /*also closes udata.group*/
|
|
|
|
|
FUNC_LEAVE (ret_value);
|
|
|
|
|
}
|
|
|
|
|
|
1998-04-07 23:34:16 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
2002-04-27 04:34:46 +08:00
|
|
|
|
* Function: H5Gmove2
|
1998-04-07 23:34:16 +08:00
|
|
|
|
*
|
|
|
|
|
* Purpose: Renames an object within an HDF5 file. The original name SRC
|
|
|
|
|
* is unlinked from the group graph and the new name DST is
|
|
|
|
|
* inserted as an atomic operation. Both names are interpreted
|
2002-04-27 04:34:46 +08:00
|
|
|
|
* relative to SRC_LOC_ID and DST_LOC_ID, which are either a file
|
|
|
|
|
* ID or a group ID.
|
1998-04-07 23:34:16 +08:00
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
1998-04-07 23:34:16 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, April 6, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
2002-04-27 04:34:46 +08:00
|
|
|
|
* Raymond Lu
|
|
|
|
|
* Thursday, April 18, 2002
|
|
|
|
|
*
|
1998-04-07 23:34:16 +08:00
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
2002-04-27 04:34:46 +08:00
|
|
|
|
H5Gmove2(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
|
|
|
|
|
const char *dst_name)
|
1998-04-07 23:34:16 +08:00
|
|
|
|
{
|
2002-04-27 04:34:46 +08:00
|
|
|
|
H5G_entry_t *src_loc=NULL;
|
|
|
|
|
H5G_entry_t *dst_loc=NULL;
|
1998-04-07 23:34:16 +08:00
|
|
|
|
|
2002-04-27 04:34:46 +08:00
|
|
|
|
FUNC_ENTER (H5Gmove2, FAIL);
|
|
|
|
|
H5TRACE4("e","isis",src_loc_id,src_name,dst_loc_id,dst_name);
|
|
|
|
|
|
|
|
|
|
if (src_loc_id != H5G_SAME_LOC && NULL==(src_loc=H5G_loc(src_loc_id))) {
|
1998-09-28 22:20:21 +08:00
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location");
|
|
|
|
|
}
|
2002-04-27 04:34:46 +08:00
|
|
|
|
if (dst_loc_id != H5G_SAME_LOC && NULL==(dst_loc=H5G_loc(dst_loc_id))) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location");
|
|
|
|
|
}
|
|
|
|
|
if (!src_name || !*src_name) {
|
1998-09-28 22:20:21 +08:00
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
|
|
|
|
|
"no current name specified");
|
|
|
|
|
}
|
2002-04-27 04:34:46 +08:00
|
|
|
|
if (!dst_name || !*dst_name) {
|
1998-09-28 22:20:21 +08:00
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
|
|
|
|
|
"no new name specified");
|
|
|
|
|
}
|
|
|
|
|
|
2002-04-27 04:34:46 +08:00
|
|
|
|
if(src_loc_id == H5G_SAME_LOC && dst_loc_id == H5G_SAME_LOC) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
|
|
|
|
|
"source and destination should not be both H5G_SAME_LOC");
|
|
|
|
|
}
|
|
|
|
|
else if(src_loc_id == H5G_SAME_LOC) {
|
|
|
|
|
src_loc = dst_loc;
|
|
|
|
|
}
|
|
|
|
|
else if(dst_loc_id == H5G_SAME_LOC) {
|
|
|
|
|
dst_loc = src_loc;
|
|
|
|
|
}
|
|
|
|
|
else if(src_loc->file != dst_loc->file) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
|
|
|
|
|
"source and destination should be in the same file.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (H5G_move(src_loc, src_name, dst_loc, dst_name)<0) {
|
1998-09-28 22:20:21 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to change object name");
|
|
|
|
|
}
|
1998-04-07 23:34:16 +08:00
|
|
|
|
|
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
2002-04-27 04:34:46 +08:00
|
|
|
|
* Function: H5Glink2
|
1998-04-07 23:34:16 +08:00
|
|
|
|
*
|
|
|
|
|
* Purpose: Creates a link of the specified type from NEW_NAME to
|
|
|
|
|
* CUR_NAME.
|
|
|
|
|
*
|
|
|
|
|
* If TYPE is H5G_LINK_HARD then CUR_NAME must name an existing
|
2002-04-27 04:34:46 +08:00
|
|
|
|
* object. CUR_NAME and NEW_NAME are interpreted relative to
|
|
|
|
|
* CUR_LOC_ID and NEW_LOC_ID, which is either a file ID or a
|
|
|
|
|
* group ID.
|
1998-04-07 23:34:16 +08:00
|
|
|
|
*
|
|
|
|
|
* If TYPE is H5G_LINK_SOFT then CUR_NAME can be anything and is
|
|
|
|
|
* interpreted at lookup time relative to the group which
|
|
|
|
|
* contains the final component of NEW_NAME. For instance, if
|
|
|
|
|
* CUR_NAME is `./foo' and NEW_NAME is `./x/y/bar' and a request
|
|
|
|
|
* is made for `./x/y/bar' then the actual object looked up is
|
|
|
|
|
* `./x/y/./foo'.
|
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
1998-04-07 23:34:16 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, April 6, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
2002-04-27 04:34:46 +08:00
|
|
|
|
H5Glink2(hid_t cur_loc_id, const char *cur_name, H5G_link_t type,
|
|
|
|
|
hid_t new_loc_id, const char *new_name)
|
1998-04-07 23:34:16 +08:00
|
|
|
|
{
|
2002-04-27 04:34:46 +08:00
|
|
|
|
H5G_entry_t *cur_loc = NULL;
|
|
|
|
|
H5G_entry_t *new_loc = NULL;
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER (H5Glink2, FAIL);
|
|
|
|
|
H5TRACE5("e","isGlis",cur_loc_id,cur_name,type,new_loc_id,new_name);
|
1998-04-07 23:34:16 +08:00
|
|
|
|
|
1998-04-15 00:44:46 +08:00
|
|
|
|
/* Check arguments */
|
2002-04-27 04:34:46 +08:00
|
|
|
|
if (cur_loc_id != H5G_SAME_LOC && NULL==(cur_loc=H5G_loc(cur_loc_id))) {
|
1998-04-07 23:34:16 +08:00
|
|
|
|
HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a location");
|
|
|
|
|
}
|
2002-04-27 04:34:46 +08:00
|
|
|
|
if (new_loc_id != H5G_SAME_LOC && NULL==(new_loc=H5G_loc(new_loc_id))) {
|
|
|
|
|
HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a location");
|
|
|
|
|
}
|
1998-04-07 23:34:16 +08:00
|
|
|
|
if (type!=H5G_LINK_HARD && type!=H5G_LINK_SOFT) {
|
|
|
|
|
HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "unrecognized link type");
|
|
|
|
|
}
|
|
|
|
|
if (!cur_name || !*cur_name) {
|
|
|
|
|
HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL,
|
|
|
|
|
"no current name specified");
|
|
|
|
|
}
|
|
|
|
|
if (!new_name || !*new_name) {
|
|
|
|
|
HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL,
|
|
|
|
|
"no new name specified");
|
|
|
|
|
}
|
2002-04-27 04:34:46 +08:00
|
|
|
|
|
|
|
|
|
if(cur_loc_id == H5G_SAME_LOC && new_loc_id == H5G_SAME_LOC) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
|
|
|
|
|
"source and destination should not be both H5G_SAME_LOC");
|
|
|
|
|
}
|
|
|
|
|
else if(cur_loc_id == H5G_SAME_LOC) {
|
|
|
|
|
cur_loc = new_loc;
|
|
|
|
|
}
|
|
|
|
|
else if(new_loc_id == H5G_SAME_LOC) {
|
|
|
|
|
new_loc = cur_loc;
|
|
|
|
|
}
|
|
|
|
|
else if(cur_loc->file != new_loc->file) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
|
|
|
|
|
"source and destination should be in the same file.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (H5G_link(cur_loc, cur_name, new_loc, new_name, type, H5G_TARGET_NORMAL)
|
|
|
|
|
<0) {
|
1998-04-07 23:34:16 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_LINK, FAIL, "unable to create link");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5Gunlink
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Removes the specified NAME from the group graph and
|
|
|
|
|
* decrements the link count for the object to which NAME
|
|
|
|
|
* points. If the link count reaches zero then all file-space
|
|
|
|
|
* associated with the object will be reclaimed (but if the
|
|
|
|
|
* object is open, then the reclamation of the file space is
|
|
|
|
|
* delayed until all handles to the object are closed).
|
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
1998-04-07 23:34:16 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, April 6, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
1998-09-22 23:27:26 +08:00
|
|
|
|
H5Gunlink(hid_t loc_id, const char *name)
|
1998-04-07 23:34:16 +08:00
|
|
|
|
{
|
1998-09-22 23:27:26 +08:00
|
|
|
|
H5G_entry_t *loc = NULL;
|
|
|
|
|
|
1998-04-07 23:34:16 +08:00
|
|
|
|
FUNC_ENTER (H5Gunlink, FAIL);
|
[svn-r429] Changes since 19980616
----------------------
./html/tracing.html NEW
This entire update is to make it possible for the library to
print the name, arguments, and return value of every API call
without requiring any extra work from developers or app
programmers. This file describes how this all works.
./configure.in
Added the `--enable-tracing' switch. If you use it then the
library will include code to print API function names,
argument names and values, and function return values.
However, you must then turn on the tracing by setting the
HDF5_TRACE environment variable to a file descriptor number.
The default is `--disable-tracing' since enabling it causes a
slight increase in library size and a slowdown resulting from
an extra function call for each API function call (I couldn't
even measure the slowdown :-)
./bin/trace NEW
A perl script that synchronizes the H5TRACE() macro calls in
the *.c files with the function return type and formal
argument names and types. If you use GNU make and gcc then
this will be done automatically, otherwise just invoke this
script with the names of one or more .c files. You could do
it by hand to, but encoding argument types is a little tricky
at first.
./config/commence.in
Added the $(TRACE) macro, which defaults to the no-op.
Added -D_POSIX_SOURCE to the compiler command line.
./src/Makefile.in
Override the default for $(TRACE).
./config/depend.in
Automatically calls $(TRACE) to synchronize the H5TRACE()
macros in any source file that changed. As with makefile
dependencies, one way to force synchronization of all files is
to remove the `.depend' file.
./MANIFEST
Added new files.
./src/H5Eprivate.h
Modified HRETURN_ERROR() and HRETURN() for tracing.
./src/H5.c
./src/H5private.h
This is where the real tracing work really happens, in
H5_trace().
./src/H5A.c
./src/H5D.c
./src/H5G.c
./src/H5P.c
./src/H5S.c
./src/H5Z.c
Added H5TRACE() calls to all API functions. You don't really
need these changes if you don't want to merge your stuff
because they can be generated automatically by going to the
hdf5/src directory and saying ../bin/trace *.c
./src/H5T.c
Added H5TRACE() calls. Other stuff below.
./src/H5E.c
./src/H5Epublic.h
Added H5TRACE() calls. Created a type H5E_auto_t for the
`func' argument of H5Eset_auto() and H5Eget_auto() to make
those arguments easier to parse for tracing. It should also
make it clearer for users that don't know how to read
complicated ANSI data types.
./src/H5F.c
Added H5TRACE() calls. Changed a couple `uintn' argument
types in API functions to `unsigned int' since `uintn' part of
the API. Changed a few "can't" and "cant" error messages to
"unable to".
./src/H5Ipublic.h
Removed H5_DIRECTORY from the H5I_group_t enum. It wasn't
used anywhere.
./src/H5Tconv.c
Removed an unused label.
./src/H5Fistore.c
./src/H5Oattr.c
./src/H5Odtype.c
./src/H5T.c
./test/dsets.c
./test/dtypes.c
Fixed a warning about a variable possibly used before it's
initialized. Added __unused__ to turn off some unused
argument warnings that pop up when debugging is turned off and
optimizations are turned on.
1998-06-18 04:46:29 +08:00
|
|
|
|
H5TRACE2("e","is",loc_id,name);
|
1998-04-07 23:34:16 +08:00
|
|
|
|
|
1998-09-22 23:27:26 +08:00
|
|
|
|
/* Check arguments */
|
|
|
|
|
if (NULL==(loc=H5G_loc(loc_id))) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location");
|
|
|
|
|
}
|
|
|
|
|
if (!name || !*name) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Unlink */
|
|
|
|
|
if (H5G_unlink(loc, name)<0) {
|
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to unlink object");
|
|
|
|
|
}
|
1998-04-07 23:34:16 +08:00
|
|
|
|
|
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
|
|
|
|
}
|
|
|
|
|
|
1998-04-15 00:44:46 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-09-03 05:16:24 +08:00
|
|
|
|
* Function: H5Gget_objinfo
|
1998-04-15 00:44:46 +08:00
|
|
|
|
*
|
|
|
|
|
* Purpose: Returns information about an object. If FOLLOW_LINK is
|
|
|
|
|
* non-zero then all symbolic links are followed; otherwise all
|
|
|
|
|
* links except the last component of the name are followed.
|
|
|
|
|
*
|
1998-10-27 11:56:31 +08:00
|
|
|
|
* Return: Non-negative on success, with the fields of STATBUF (if
|
|
|
|
|
* non-null) initialized. Negative on failure.
|
1998-04-15 00:44:46 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, April 13, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
1998-09-03 05:16:24 +08:00
|
|
|
|
H5Gget_objinfo(hid_t loc_id, const char *name, hbool_t follow_link,
|
1998-10-01 04:17:26 +08:00
|
|
|
|
H5G_stat_t *statbuf/*out*/)
|
1998-04-15 00:44:46 +08:00
|
|
|
|
{
|
1998-08-31 21:46:47 +08:00
|
|
|
|
H5G_entry_t *loc = NULL;
|
1998-04-15 00:44:46 +08:00
|
|
|
|
|
1998-09-03 05:16:24 +08:00
|
|
|
|
FUNC_ENTER (H5Gget_objinfo, FAIL);
|
1998-07-08 04:13:31 +08:00
|
|
|
|
H5TRACE4("e","isbx",loc_id,name,follow_link,statbuf);
|
1998-04-15 00:44:46 +08:00
|
|
|
|
|
|
|
|
|
/* Check arguments */
|
|
|
|
|
if (NULL==(loc=H5G_loc (loc_id))) {
|
|
|
|
|
HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a location");
|
|
|
|
|
}
|
|
|
|
|
if (!name || !*name) {
|
|
|
|
|
HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Get info */
|
1998-09-03 05:16:24 +08:00
|
|
|
|
if (H5G_get_objinfo (loc, name, follow_link, statbuf)<0) {
|
1998-04-15 00:44:46 +08:00
|
|
|
|
HRETURN_ERROR (H5E_ARGS, H5E_CANTINIT, FAIL, "cannot stat object");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5Gget_linkval
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Returns the value of a symbolic link whose name is NAME. At
|
|
|
|
|
* most SIZE characters (counting the null terminator) are
|
|
|
|
|
* copied to the BUF result buffer.
|
|
|
|
|
*
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
* Return: Success: Non-negative with the link value in BUF.
|
|
|
|
|
*
|
|
|
|
|
* Failure: Negative
|
1998-04-15 00:44:46 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, April 13, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
1998-08-28 00:48:50 +08:00
|
|
|
|
H5Gget_linkval(hid_t loc_id, const char *name, size_t size, char *buf/*out*/)
|
1998-04-15 00:44:46 +08:00
|
|
|
|
{
|
1998-08-31 21:46:47 +08:00
|
|
|
|
H5G_entry_t *loc = NULL;
|
1998-04-15 00:44:46 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER (H5Gget_linkval, FAIL);
|
1998-07-08 04:13:31 +08:00
|
|
|
|
H5TRACE4("e","iszx",loc_id,name,size,buf);
|
1998-04-15 00:44:46 +08:00
|
|
|
|
|
|
|
|
|
/* Check arguments */
|
|
|
|
|
if (NULL==(loc=H5G_loc (loc_id))) {
|
|
|
|
|
HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a location");
|
|
|
|
|
}
|
|
|
|
|
if (!name || !*name) {
|
|
|
|
|
HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Get the link value */
|
|
|
|
|
if (H5G_linkval (loc, name, size, buf)<0) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL,
|
|
|
|
|
"unable to get link value");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
|
|
|
|
}
|
|
|
|
|
|
1998-07-21 05:01:32 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5Gset_comment
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Gives the specified object a comment. The COMMENT string
|
|
|
|
|
* should be a null terminated string. An object can have only
|
|
|
|
|
* one comment at a time. Passing NULL for the COMMENT argument
|
|
|
|
|
* will remove the comment property from the object.
|
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
1998-07-21 05:01:32 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, July 20, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
1998-08-28 00:48:50 +08:00
|
|
|
|
H5Gset_comment(hid_t loc_id, const char *name, const char *comment)
|
1998-07-21 05:01:32 +08:00
|
|
|
|
{
|
1998-08-31 21:46:47 +08:00
|
|
|
|
H5G_entry_t *loc = NULL;
|
1998-07-21 05:01:32 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5Gset_comment, FAIL);
|
|
|
|
|
H5TRACE3("e","iss",loc_id,name,comment);
|
|
|
|
|
|
|
|
|
|
if (NULL==(loc=H5G_loc(loc_id))) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location");
|
|
|
|
|
}
|
|
|
|
|
if (!name || !*name) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (H5G_set_comment(loc, name, comment)<0) {
|
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to set comment value");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE(SUCCEED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5Gget_comment
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Return at most BUFSIZE characters of the comment for the
|
|
|
|
|
* specified object. If BUFSIZE is large enough to hold the
|
|
|
|
|
* entire comment then the comment string will be null
|
|
|
|
|
* terminated, otherwise it will not. If the object does not
|
[svn-r537] Changes since 19980722
----------------------
./src/H5A.c
./src/H5Apublic.h
./test/tattr.c
Switched the order of the second and third argument of
H5Aget_name() to make it consistent with other functions that
take buffers and buffer sizes.
./src/H5G.c
./src/H5Gpublic.h
./src/H5Gprivate.h
The H5Gget_comment() function returns the size of the comment
including the null terminator. If the object has no comment
then zero is returned. If an error occurs then a negative
value is returned.
./MANIFEST
./tools/Makefile.in
./tools/h5tools.h [NEW]
./tools/h5dump.c [NEW]
Created a library for printing values of datasets in a way
that looks nice. It's not done yet, but I needed it for
debugging the contents of files from Jim Reus.
./tools/h5ls.c
Added the `-d' and `--dump' options which cause the contents
of a dataset to be printed. Added `-w N' and `--width=N'
options to control how wide the raw data output should be. If
you want single-column output then say `-w1'.
Printing dataset values can now handle datasets of any integer
or floating point atomic type. As a special case, integers
which are one byte wide are treated a character strings for
now.
Sample output:
$ h5ls --dump --width=60 banana.hdf
ARCHIVE 0:0:0:744 Dataset {52/Inf}
Data:
(0) "U struct complex { double R; double I; };\012V"
(43) " double;\012"
U 0:0:0:2500 Dataset {256/512}
Data: printing of compound data types is not implemented yet
V 0:0:0:3928 Dataset {256/512}
Data:
(0) 0, 0.015625, 0.03125, 0.046875, 0.0625,
(5) 0.078125, 0.09375, 0.109375, 0.125, 0.140625,
(10) 0.15625, 0.171875, 0.1875, 0.203125, 0.21875,
(15) 0.234375, 0.25, 0.265625, 0.28125, 0.296875,
...
1998-07-24 05:19:17 +08:00
|
|
|
|
* have a comment value then no bytes are copied to the BUF
|
|
|
|
|
* buffer.
|
1998-07-21 05:01:32 +08:00
|
|
|
|
*
|
[svn-r537] Changes since 19980722
----------------------
./src/H5A.c
./src/H5Apublic.h
./test/tattr.c
Switched the order of the second and third argument of
H5Aget_name() to make it consistent with other functions that
take buffers and buffer sizes.
./src/H5G.c
./src/H5Gpublic.h
./src/H5Gprivate.h
The H5Gget_comment() function returns the size of the comment
including the null terminator. If the object has no comment
then zero is returned. If an error occurs then a negative
value is returned.
./MANIFEST
./tools/Makefile.in
./tools/h5tools.h [NEW]
./tools/h5dump.c [NEW]
Created a library for printing values of datasets in a way
that looks nice. It's not done yet, but I needed it for
debugging the contents of files from Jim Reus.
./tools/h5ls.c
Added the `-d' and `--dump' options which cause the contents
of a dataset to be printed. Added `-w N' and `--width=N'
options to control how wide the raw data output should be. If
you want single-column output then say `-w1'.
Printing dataset values can now handle datasets of any integer
or floating point atomic type. As a special case, integers
which are one byte wide are treated a character strings for
now.
Sample output:
$ h5ls --dump --width=60 banana.hdf
ARCHIVE 0:0:0:744 Dataset {52/Inf}
Data:
(0) "U struct complex { double R; double I; };\012V"
(43) " double;\012"
U 0:0:0:2500 Dataset {256/512}
Data: printing of compound data types is not implemented yet
V 0:0:0:3928 Dataset {256/512}
Data:
(0) 0, 0.015625, 0.03125, 0.046875, 0.0625,
(5) 0.078125, 0.09375, 0.109375, 0.125, 0.140625,
(10) 0.15625, 0.171875, 0.1875, 0.203125, 0.21875,
(15) 0.234375, 0.25, 0.265625, 0.28125, 0.296875,
...
1998-07-24 05:19:17 +08:00
|
|
|
|
* Return: Success: Number of characters in the comment counting
|
|
|
|
|
* the null terminator. The value returned may
|
|
|
|
|
* be larger than the BUFSIZE argument.
|
1998-07-21 05:01:32 +08:00
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Failure: Negative
|
1998-07-21 05:01:32 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, July 20, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
[svn-r537] Changes since 19980722
----------------------
./src/H5A.c
./src/H5Apublic.h
./test/tattr.c
Switched the order of the second and third argument of
H5Aget_name() to make it consistent with other functions that
take buffers and buffer sizes.
./src/H5G.c
./src/H5Gpublic.h
./src/H5Gprivate.h
The H5Gget_comment() function returns the size of the comment
including the null terminator. If the object has no comment
then zero is returned. If an error occurs then a negative
value is returned.
./MANIFEST
./tools/Makefile.in
./tools/h5tools.h [NEW]
./tools/h5dump.c [NEW]
Created a library for printing values of datasets in a way
that looks nice. It's not done yet, but I needed it for
debugging the contents of files from Jim Reus.
./tools/h5ls.c
Added the `-d' and `--dump' options which cause the contents
of a dataset to be printed. Added `-w N' and `--width=N'
options to control how wide the raw data output should be. If
you want single-column output then say `-w1'.
Printing dataset values can now handle datasets of any integer
or floating point atomic type. As a special case, integers
which are one byte wide are treated a character strings for
now.
Sample output:
$ h5ls --dump --width=60 banana.hdf
ARCHIVE 0:0:0:744 Dataset {52/Inf}
Data:
(0) "U struct complex { double R; double I; };\012V"
(43) " double;\012"
U 0:0:0:2500 Dataset {256/512}
Data: printing of compound data types is not implemented yet
V 0:0:0:3928 Dataset {256/512}
Data:
(0) 0, 0.015625, 0.03125, 0.046875, 0.0625,
(5) 0.078125, 0.09375, 0.109375, 0.125, 0.140625,
(10) 0.15625, 0.171875, 0.1875, 0.203125, 0.21875,
(15) 0.234375, 0.25, 0.265625, 0.28125, 0.296875,
...
1998-07-24 05:19:17 +08:00
|
|
|
|
int
|
1998-08-28 00:48:50 +08:00
|
|
|
|
H5Gget_comment(hid_t loc_id, const char *name, size_t bufsize, char *buf)
|
1998-07-21 05:01:32 +08:00
|
|
|
|
{
|
1998-08-31 21:46:47 +08:00
|
|
|
|
H5G_entry_t *loc = NULL;
|
2001-08-15 06:09:56 +08:00
|
|
|
|
int retval = FAIL;
|
1998-07-21 05:01:32 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5Gget_comment, FAIL);
|
[svn-r537] Changes since 19980722
----------------------
./src/H5A.c
./src/H5Apublic.h
./test/tattr.c
Switched the order of the second and third argument of
H5Aget_name() to make it consistent with other functions that
take buffers and buffer sizes.
./src/H5G.c
./src/H5Gpublic.h
./src/H5Gprivate.h
The H5Gget_comment() function returns the size of the comment
including the null terminator. If the object has no comment
then zero is returned. If an error occurs then a negative
value is returned.
./MANIFEST
./tools/Makefile.in
./tools/h5tools.h [NEW]
./tools/h5dump.c [NEW]
Created a library for printing values of datasets in a way
that looks nice. It's not done yet, but I needed it for
debugging the contents of files from Jim Reus.
./tools/h5ls.c
Added the `-d' and `--dump' options which cause the contents
of a dataset to be printed. Added `-w N' and `--width=N'
options to control how wide the raw data output should be. If
you want single-column output then say `-w1'.
Printing dataset values can now handle datasets of any integer
or floating point atomic type. As a special case, integers
which are one byte wide are treated a character strings for
now.
Sample output:
$ h5ls --dump --width=60 banana.hdf
ARCHIVE 0:0:0:744 Dataset {52/Inf}
Data:
(0) "U struct complex { double R; double I; };\012V"
(43) " double;\012"
U 0:0:0:2500 Dataset {256/512}
Data: printing of compound data types is not implemented yet
V 0:0:0:3928 Dataset {256/512}
Data:
(0) 0, 0.015625, 0.03125, 0.046875, 0.0625,
(5) 0.078125, 0.09375, 0.109375, 0.125, 0.140625,
(10) 0.15625, 0.171875, 0.1875, 0.203125, 0.21875,
(15) 0.234375, 0.25, 0.265625, 0.28125, 0.296875,
...
1998-07-24 05:19:17 +08:00
|
|
|
|
H5TRACE4("Is","iszs",loc_id,name,bufsize,buf);
|
1998-07-21 05:01:32 +08:00
|
|
|
|
|
|
|
|
|
if (NULL==(loc=H5G_loc(loc_id))) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location");
|
|
|
|
|
}
|
|
|
|
|
if (!name || !*name) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified");
|
|
|
|
|
}
|
[svn-r537] Changes since 19980722
----------------------
./src/H5A.c
./src/H5Apublic.h
./test/tattr.c
Switched the order of the second and third argument of
H5Aget_name() to make it consistent with other functions that
take buffers and buffer sizes.
./src/H5G.c
./src/H5Gpublic.h
./src/H5Gprivate.h
The H5Gget_comment() function returns the size of the comment
including the null terminator. If the object has no comment
then zero is returned. If an error occurs then a negative
value is returned.
./MANIFEST
./tools/Makefile.in
./tools/h5tools.h [NEW]
./tools/h5dump.c [NEW]
Created a library for printing values of datasets in a way
that looks nice. It's not done yet, but I needed it for
debugging the contents of files from Jim Reus.
./tools/h5ls.c
Added the `-d' and `--dump' options which cause the contents
of a dataset to be printed. Added `-w N' and `--width=N'
options to control how wide the raw data output should be. If
you want single-column output then say `-w1'.
Printing dataset values can now handle datasets of any integer
or floating point atomic type. As a special case, integers
which are one byte wide are treated a character strings for
now.
Sample output:
$ h5ls --dump --width=60 banana.hdf
ARCHIVE 0:0:0:744 Dataset {52/Inf}
Data:
(0) "U struct complex { double R; double I; };\012V"
(43) " double;\012"
U 0:0:0:2500 Dataset {256/512}
Data: printing of compound data types is not implemented yet
V 0:0:0:3928 Dataset {256/512}
Data:
(0) 0, 0.015625, 0.03125, 0.046875, 0.0625,
(5) 0.078125, 0.09375, 0.109375, 0.125, 0.140625,
(10) 0.15625, 0.171875, 0.1875, 0.203125, 0.21875,
(15) 0.234375, 0.25, 0.265625, 0.28125, 0.296875,
...
1998-07-24 05:19:17 +08:00
|
|
|
|
if (bufsize>0 && !buf) {
|
1998-07-21 05:01:32 +08:00
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no buffer specified");
|
|
|
|
|
}
|
|
|
|
|
|
[svn-r537] Changes since 19980722
----------------------
./src/H5A.c
./src/H5Apublic.h
./test/tattr.c
Switched the order of the second and third argument of
H5Aget_name() to make it consistent with other functions that
take buffers and buffer sizes.
./src/H5G.c
./src/H5Gpublic.h
./src/H5Gprivate.h
The H5Gget_comment() function returns the size of the comment
including the null terminator. If the object has no comment
then zero is returned. If an error occurs then a negative
value is returned.
./MANIFEST
./tools/Makefile.in
./tools/h5tools.h [NEW]
./tools/h5dump.c [NEW]
Created a library for printing values of datasets in a way
that looks nice. It's not done yet, but I needed it for
debugging the contents of files from Jim Reus.
./tools/h5ls.c
Added the `-d' and `--dump' options which cause the contents
of a dataset to be printed. Added `-w N' and `--width=N'
options to control how wide the raw data output should be. If
you want single-column output then say `-w1'.
Printing dataset values can now handle datasets of any integer
or floating point atomic type. As a special case, integers
which are one byte wide are treated a character strings for
now.
Sample output:
$ h5ls --dump --width=60 banana.hdf
ARCHIVE 0:0:0:744 Dataset {52/Inf}
Data:
(0) "U struct complex { double R; double I; };\012V"
(43) " double;\012"
U 0:0:0:2500 Dataset {256/512}
Data: printing of compound data types is not implemented yet
V 0:0:0:3928 Dataset {256/512}
Data:
(0) 0, 0.015625, 0.03125, 0.046875, 0.0625,
(5) 0.078125, 0.09375, 0.109375, 0.125, 0.140625,
(10) 0.15625, 0.171875, 0.1875, 0.203125, 0.21875,
(15) 0.234375, 0.25, 0.265625, 0.28125, 0.296875,
...
1998-07-24 05:19:17 +08:00
|
|
|
|
if ((retval=H5G_get_comment(loc, name, bufsize, buf))<0) {
|
1998-07-21 05:01:32 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL,
|
2002-03-29 03:27:38 +08:00
|
|
|
|
"unable to get comment value");
|
1998-07-21 05:01:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
[svn-r537] Changes since 19980722
----------------------
./src/H5A.c
./src/H5Apublic.h
./test/tattr.c
Switched the order of the second and third argument of
H5Aget_name() to make it consistent with other functions that
take buffers and buffer sizes.
./src/H5G.c
./src/H5Gpublic.h
./src/H5Gprivate.h
The H5Gget_comment() function returns the size of the comment
including the null terminator. If the object has no comment
then zero is returned. If an error occurs then a negative
value is returned.
./MANIFEST
./tools/Makefile.in
./tools/h5tools.h [NEW]
./tools/h5dump.c [NEW]
Created a library for printing values of datasets in a way
that looks nice. It's not done yet, but I needed it for
debugging the contents of files from Jim Reus.
./tools/h5ls.c
Added the `-d' and `--dump' options which cause the contents
of a dataset to be printed. Added `-w N' and `--width=N'
options to control how wide the raw data output should be. If
you want single-column output then say `-w1'.
Printing dataset values can now handle datasets of any integer
or floating point atomic type. As a special case, integers
which are one byte wide are treated a character strings for
now.
Sample output:
$ h5ls --dump --width=60 banana.hdf
ARCHIVE 0:0:0:744 Dataset {52/Inf}
Data:
(0) "U struct complex { double R; double I; };\012V"
(43) " double;\012"
U 0:0:0:2500 Dataset {256/512}
Data: printing of compound data types is not implemented yet
V 0:0:0:3928 Dataset {256/512}
Data:
(0) 0, 0.015625, 0.03125, 0.046875, 0.0625,
(5) 0.078125, 0.09375, 0.109375, 0.125, 0.140625,
(10) 0.15625, 0.171875, 0.1875, 0.203125, 0.21875,
(15) 0.234375, 0.25, 0.265625, 0.28125, 0.296875,
...
1998-07-24 05:19:17 +08:00
|
|
|
|
FUNC_LEAVE(retval);
|
1998-07-21 05:01:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
1997-10-21 07:14:35 +08:00
|
|
|
|
/*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
* N O A P I F U N C T I O N S B E Y O N D T H I S P O I N T
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-01-06 11:07:15 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Function: H5G_init_interface
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Purpose: Initializes the H5G interface.
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, January 5, 1998
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static herr_t
|
1998-01-17 06:23:43 +08:00
|
|
|
|
H5G_init_interface(void)
|
1998-01-06 11:07:15 +08:00
|
|
|
|
{
|
1998-01-17 06:23:43 +08:00
|
|
|
|
FUNC_ENTER(H5G_init_interface, FAIL);
|
|
|
|
|
|
|
|
|
|
/* Initialize the atom group for the group IDs */
|
1998-10-06 07:41:30 +08:00
|
|
|
|
if (H5I_init_group(H5I_GROUP, H5I_GROUPID_HASHSIZE, H5G_RESERVED_ATOMS,
|
1999-02-21 00:18:51 +08:00
|
|
|
|
(H5I_free_t)H5G_close) < 0) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to initialize interface");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Initialize the type info table. Begin with the most general types and
|
|
|
|
|
* end with the most specific. For instance, any object that has a data
|
|
|
|
|
* type message is a data type but only some of them are datasets.
|
|
|
|
|
*/
|
|
|
|
|
H5G_register_type(H5G_TYPE, H5T_isa, "data type");
|
|
|
|
|
H5G_register_type(H5G_GROUP, H5G_isa, "group");
|
|
|
|
|
H5G_register_type(H5G_DATASET, H5D_isa, "dataset");
|
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
FUNC_LEAVE(SUCCEED);
|
1998-01-06 11:07:15 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
1998-01-06 11:07:15 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Function: H5G_term_interface
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Purpose: Terminates the H5G interface
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1999-03-30 19:38:34 +08:00
|
|
|
|
* Return: Success: Positive if anything is done that might
|
|
|
|
|
* affect other interfaces; zero otherwise.
|
|
|
|
|
*
|
|
|
|
|
* Failure: Negative.
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, January 5, 1998
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
2002-03-29 03:27:38 +08:00
|
|
|
|
* Robb Matzke, 2002-03-28
|
|
|
|
|
* Free the global component buffer.
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
2001-08-15 06:09:56 +08:00
|
|
|
|
int
|
1999-03-30 19:38:34 +08:00
|
|
|
|
H5G_term_interface(void)
|
1998-01-06 11:07:15 +08:00
|
|
|
|
{
|
1998-11-16 23:29:54 +08:00
|
|
|
|
size_t i;
|
2001-08-15 06:09:56 +08:00
|
|
|
|
int n=0;
|
1999-03-30 19:38:34 +08:00
|
|
|
|
|
|
|
|
|
if (interface_initialize_g) {
|
|
|
|
|
if ((n=H5I_nmembers(H5I_GROUP))) {
|
1999-04-27 22:47:54 +08:00
|
|
|
|
H5I_clear_group(H5I_GROUP, FALSE);
|
1999-03-30 19:38:34 +08:00
|
|
|
|
} else {
|
|
|
|
|
/* Empty the object type table */
|
|
|
|
|
for (i=0; i<H5G_ntypes_g; i++) {
|
|
|
|
|
H5MM_xfree(H5G_type_g[i].desc);
|
|
|
|
|
}
|
|
|
|
|
H5G_ntypes_g = H5G_atypes_g = 0;
|
|
|
|
|
H5G_type_g = H5MM_xfree(H5G_type_g);
|
|
|
|
|
|
|
|
|
|
/* Destroy the group object id group */
|
|
|
|
|
H5I_destroy_group(H5I_GROUP);
|
1998-11-21 11:36:51 +08:00
|
|
|
|
|
2002-03-29 03:27:38 +08:00
|
|
|
|
/* Free the global component buffer */
|
|
|
|
|
H5G_comp_g = H5MM_xfree(H5G_comp_g);
|
|
|
|
|
H5G_comp_alloc_g = 0;
|
|
|
|
|
|
1999-03-30 19:38:34 +08:00
|
|
|
|
/* Mark closed */
|
|
|
|
|
interface_initialize_g = 0;
|
|
|
|
|
n = 1; /*H5I*/
|
1998-11-21 11:36:51 +08:00
|
|
|
|
}
|
1998-11-16 23:29:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
1999-03-30 19:38:34 +08:00
|
|
|
|
return n;
|
1998-01-06 11:07:15 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_register_type
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Register a new object type so H5G_get_type() can detect it.
|
|
|
|
|
* One should always register a general type before a more
|
|
|
|
|
* specific type. For instance, any object that has a data type
|
|
|
|
|
* message is a data type, but only some of those objects are
|
|
|
|
|
* datasets.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: Non-negative
|
|
|
|
|
*
|
|
|
|
|
* Failure: Negative
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Wednesday, November 4, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
2001-08-15 06:09:56 +08:00
|
|
|
|
H5G_register_type(int type, htri_t(*isa)(H5G_entry_t*), const char *_desc)
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
{
|
|
|
|
|
char *desc = NULL;
|
|
|
|
|
size_t i;
|
|
|
|
|
herr_t ret_value = FAIL;
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5G_register_type, FAIL);
|
|
|
|
|
assert(type>=0);
|
|
|
|
|
assert(isa);
|
|
|
|
|
assert(_desc);
|
|
|
|
|
|
|
|
|
|
/* Copy the description */
|
|
|
|
|
if (NULL==(desc=H5MM_strdup(_desc))) {
|
|
|
|
|
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
|
|
|
|
|
"memory allocation failed for object type description");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* If the type is already registered then just update its entry without
|
|
|
|
|
* moving it to the end
|
|
|
|
|
*/
|
|
|
|
|
for (i=0; i<H5G_ntypes_g; i++) {
|
|
|
|
|
if (H5G_type_g[i].type==type) {
|
|
|
|
|
H5G_type_g[i].isa = isa;
|
|
|
|
|
H5MM_xfree(H5G_type_g[i].desc);
|
|
|
|
|
H5G_type_g[i].desc = desc;
|
2001-12-13 02:40:09 +08:00
|
|
|
|
HGOTO_DONE(SUCCEED);
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Increase table size */
|
|
|
|
|
if (H5G_ntypes_g>=H5G_atypes_g) {
|
|
|
|
|
size_t n = MAX(32, 2*H5G_atypes_g);
|
|
|
|
|
H5G_typeinfo_t *x = H5MM_realloc(H5G_type_g,
|
|
|
|
|
n*sizeof(H5G_typeinfo_t));
|
|
|
|
|
if (!x) {
|
|
|
|
|
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
|
|
|
|
|
"memory allocation failed for objec type table");
|
|
|
|
|
}
|
|
|
|
|
H5G_atypes_g = n;
|
|
|
|
|
H5G_type_g = x;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Add a new entry */
|
|
|
|
|
H5G_type_g[H5G_ntypes_g].type = type;
|
|
|
|
|
H5G_type_g[H5G_ntypes_g].isa = isa;
|
|
|
|
|
H5G_type_g[H5G_ntypes_g].desc = desc; /*already copied*/
|
|
|
|
|
H5G_ntypes_g++;
|
|
|
|
|
|
|
|
|
|
ret_value = SUCCEED;
|
|
|
|
|
|
|
|
|
|
done:
|
|
|
|
|
if (ret_value<0) H5MM_xfree(desc);
|
|
|
|
|
FUNC_LEAVE(ret_value);
|
|
|
|
|
}
|
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Function: H5G_component
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* 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-08-13 06:44:46 +08:00
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Return: Success: Ptr into NAME.
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Failure: Ptr to the null terminator of NAME.
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* matzke@llnl.gov
|
|
|
|
|
* Aug 11 1997
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-03-25 07:18:34 +08:00
|
|
|
|
static const char *
|
1998-01-17 06:23:43 +08:00
|
|
|
|
H5G_component(const char *name, size_t *size_p)
|
1997-08-13 06:44:46 +08:00
|
|
|
|
{
|
1998-01-17 06:23:43 +08:00
|
|
|
|
assert(name);
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
1998-03-25 07:18:34 +08:00
|
|
|
|
while ('/' == *name) name++;
|
|
|
|
|
if (size_p) *size_p = HDstrcspn(name, "/");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
return name;
|
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
1998-09-22 23:27:26 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_basename
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Returns a pointer to the last component of the specified
|
|
|
|
|
* name. The length of the component is returned through SIZE_P.
|
|
|
|
|
* The base name is followed by zero or more slashes and a null
|
|
|
|
|
* terminator, but SIZE_P does not count the slashes or the null
|
|
|
|
|
* terminator.
|
|
|
|
|
*
|
|
|
|
|
* Note: The base name of the root directory is a single slash.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: Ptr to base name.
|
|
|
|
|
*
|
|
|
|
|
* Failure: Ptr to the null terminator.
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Thursday, September 17, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static const char *
|
|
|
|
|
H5G_basename(const char *name, size_t *size_p)
|
|
|
|
|
{
|
1999-02-25 23:40:27 +08:00
|
|
|
|
size_t i;
|
1998-09-22 23:27:26 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5G_basename, NULL);
|
|
|
|
|
|
|
|
|
|
/* Find the end of the base name */
|
2001-06-20 05:49:01 +08:00
|
|
|
|
i = HDstrlen(name);
|
1998-09-22 23:27:26 +08:00
|
|
|
|
while (i>0 && '/'==name[i-1]) --i;
|
|
|
|
|
|
|
|
|
|
/* Skip backward over base name */
|
|
|
|
|
while (i>0 && '/'!=name[i-1]) --i;
|
|
|
|
|
|
|
|
|
|
/* Watch out for root special case */
|
|
|
|
|
if ('/'==name[i] && size_p) *size_p = 1;
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE(name+i);
|
|
|
|
|
}
|
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Function: H5G_namei
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Translates a name to a symbol table entry.
|
|
|
|
|
*
|
|
|
|
|
* If the specified name can be fully resolved, then this
|
|
|
|
|
* function returns the symbol table entry for the named object
|
|
|
|
|
* through the OBJ_ENT argument. The symbol table entry for the
|
|
|
|
|
* group containing the named object is returned through the
|
|
|
|
|
* GRP_ENT argument if it is non-null. However, if the name
|
|
|
|
|
* refers to the root object then the GRP_ENT will be
|
|
|
|
|
* initialized with an undefined object header address. The
|
|
|
|
|
* REST argument, if present, will point to the null terminator
|
|
|
|
|
* of NAME.
|
|
|
|
|
*
|
|
|
|
|
* If the specified name cannot be fully resolved, then OBJ_ENT
|
|
|
|
|
* is initialized with the undefined object header address. The
|
|
|
|
|
* REST argument will point into the NAME argument to the start
|
|
|
|
|
* of the component that could not be located. The GRP_ENT will
|
|
|
|
|
* contain the entry for the symbol table that was being
|
|
|
|
|
* searched at the time of the failure and will have an
|
|
|
|
|
* undefined object header address if the search failed at the
|
|
|
|
|
* root object. For instance, if NAME is `/foo/bar/baz' and the
|
|
|
|
|
* root directory exists and contains an entry for `foo', and
|
1998-09-22 23:27:26 +08:00
|
|
|
|
* foo is a group that contains an entry for bar, but bar is not
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* a group, then the results will be that REST points to `baz',
|
1998-09-22 23:27:26 +08:00
|
|
|
|
* OBJ_ENT has an undefined object header address, and GRP_ENT
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* is the symbol table entry for `bar' in `/foo'.
|
|
|
|
|
*
|
1998-03-25 07:18:34 +08:00
|
|
|
|
* Every file has a root group whose name is `/'. Components of
|
|
|
|
|
* a name are separated from one another by one or more slashes
|
|
|
|
|
* (/). Slashes at the end of a name are ignored. If the name
|
|
|
|
|
* begins with a slash then the search begins at the root group
|
|
|
|
|
* of the file containing LOC_ENT. Otherwise it begins at
|
|
|
|
|
* LOC_ENT. The component `.' is a no-op, but `..' is not
|
|
|
|
|
* understood by this function (unless it appears as an entry in
|
|
|
|
|
* the symbol table).
|
1998-04-15 00:44:46 +08:00
|
|
|
|
*
|
1998-10-15 03:35:08 +08:00
|
|
|
|
* Symbolic links are followed automatically, but if TARGET
|
|
|
|
|
* includes the H5G_TARGET_SLINK bit and the last component of
|
|
|
|
|
* the name is a symbolic link then that link is not followed.
|
|
|
|
|
* The *NLINKS value is decremented each time a link is followed
|
|
|
|
|
* and link traversal fails if the value would become negative.
|
|
|
|
|
* If NLINKS is the null pointer then a default value is used.
|
1998-10-09 01:13:14 +08:00
|
|
|
|
*
|
|
|
|
|
* Mounted files are handled by calling H5F_mountpoint() after
|
|
|
|
|
* each step of the translation. If the input argument to that
|
|
|
|
|
* function is a mount point then the argument shall be replaced
|
|
|
|
|
* with information about the root group of the mounted file.
|
1998-10-15 03:35:08 +08:00
|
|
|
|
* But if TARGET includes the H5G_TARGET_MOUNT bit and the last
|
|
|
|
|
* component of the name is a mount point then H5F_mountpoint()
|
|
|
|
|
* is not called and information about the mount point itself is
|
|
|
|
|
* returned.
|
1998-01-28 13:47:19 +08:00
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
*
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
* Return: Success: Non-negative if name can be fully resolved.
|
|
|
|
|
* See above for values of REST, GRP_ENT, and
|
1998-04-15 00:44:46 +08:00
|
|
|
|
* OBJ_ENT. NLINKS has been decremented for
|
|
|
|
|
* each symbolic link that was followed.
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
* Failure: Negative if the name could not be fully
|
|
|
|
|
* resolved. See above for values of REST,
|
|
|
|
|
* GRP_ENT, and OBJ_ENT.
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* matzke@llnl.gov
|
|
|
|
|
* Aug 11 1997
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
2002-03-29 03:27:38 +08:00
|
|
|
|
* Robb Matzke, 2002-03-28
|
|
|
|
|
* The component name buffer on the stack has been replaced by
|
|
|
|
|
* a dynamically allocated buffer on the heap in order to
|
|
|
|
|
* remove limitations on the length of a name component.
|
|
|
|
|
* There are two reasons that the buffer pointer is global:
|
|
|
|
|
* (1) We want to be able to reuse the buffer without
|
|
|
|
|
* allocating and freeing it each time this function is
|
|
|
|
|
* called.
|
|
|
|
|
* (2) We need to be able to free it from H5G_term_interface()
|
|
|
|
|
* when the library terminates.
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-01-06 11:07:15 +08:00
|
|
|
|
static herr_t
|
1998-03-25 07:18:34 +08:00
|
|
|
|
H5G_namei(H5G_entry_t *loc_ent, const char *name, const char **rest/*out*/,
|
1998-04-15 00:44:46 +08:00
|
|
|
|
H5G_entry_t *grp_ent/*out*/, H5G_entry_t *obj_ent/*out*/,
|
2001-08-15 06:09:56 +08:00
|
|
|
|
unsigned target, int *nlinks)
|
1997-08-13 06:44:46 +08:00
|
|
|
|
{
|
1998-03-24 22:53:57 +08:00
|
|
|
|
H5G_entry_t _grp_ent; /*entry for current group */
|
|
|
|
|
H5G_entry_t _obj_ent; /*entry found */
|
|
|
|
|
size_t nchars; /*component name length */
|
1998-04-15 00:44:46 +08:00
|
|
|
|
int _nlinks = H5G_NLINKS;
|
|
|
|
|
const char *s = NULL;
|
|
|
|
|
|
1998-03-24 22:53:57 +08:00
|
|
|
|
if (rest) *rest = name;
|
|
|
|
|
if (!grp_ent) grp_ent = &_grp_ent;
|
|
|
|
|
if (!obj_ent) obj_ent = &_obj_ent;
|
1998-04-15 00:44:46 +08:00
|
|
|
|
if (!nlinks) nlinks = &_nlinks;
|
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
FUNC_ENTER(H5G_namei, FAIL);
|
|
|
|
|
|
1998-03-25 07:18:34 +08:00
|
|
|
|
/*
|
|
|
|
|
* Where does the searching start? For absolute names it starts at the
|
|
|
|
|
* root of the file; for relative names it starts at CWG.
|
|
|
|
|
*/
|
|
|
|
|
if (!name || !*name) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL, "no name given");
|
|
|
|
|
} else if (!loc_ent) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL,
|
|
|
|
|
"no current working group");
|
|
|
|
|
} else if ('/' == *name) {
|
1998-10-14 01:17:50 +08:00
|
|
|
|
*obj_ent = H5G_rootof(loc_ent->file)->ent;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
} else {
|
1998-03-25 07:18:34 +08:00
|
|
|
|
*obj_ent = *loc_ent;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
1998-09-09 03:15:44 +08:00
|
|
|
|
HDmemset(grp_ent, 0, sizeof(H5G_entry_t));
|
1999-08-11 04:21:32 +08:00
|
|
|
|
grp_ent->header = HADDR_UNDEF;
|
1998-04-15 00:44:46 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/* traverse the name */
|
|
|
|
|
while ((name = H5G_component(name, &nchars)) && *name) {
|
1998-03-25 07:18:34 +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.
|
|
|
|
|
*/
|
2002-03-29 03:27:38 +08:00
|
|
|
|
if (nchars+1 > H5G_comp_alloc_g) {
|
|
|
|
|
H5G_comp_alloc_g = MAX3(1024, 2*H5G_comp_alloc_g, nchars+1);
|
|
|
|
|
H5G_comp_g = H5MM_realloc(H5G_comp_g, H5G_comp_alloc_g);
|
|
|
|
|
if (!H5G_comp_g) {
|
|
|
|
|
H5G_comp_alloc_g = 0;
|
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_NOSPACE, FAIL,
|
|
|
|
|
"unable to allocate component buffer");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
HDmemcpy(H5G_comp_g, name, nchars);
|
|
|
|
|
H5G_comp_g[nchars] = '\0';
|
1998-01-28 13:47:19 +08:00
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* The special name `.' is a no-op.
|
|
|
|
|
*/
|
2002-03-29 03:27:38 +08:00
|
|
|
|
if ('.' == H5G_comp_g[0] && !H5G_comp_g[1]) {
|
1998-03-25 07:18:34 +08:00
|
|
|
|
name += nchars;
|
1998-01-28 13:47:19 +08:00
|
|
|
|
continue;
|
1998-03-25 07:18:34 +08:00
|
|
|
|
}
|
1998-01-28 13:47:19 +08:00
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Advance to the next component of the name.
|
|
|
|
|
*/
|
|
|
|
|
*grp_ent = *obj_ent;
|
|
|
|
|
HDmemset(obj_ent, 0, sizeof(H5G_entry_t));
|
1999-08-11 04:21:32 +08:00
|
|
|
|
obj_ent->header = HADDR_UNDEF;
|
1998-01-28 13:47:19 +08:00
|
|
|
|
|
2002-03-29 03:27:38 +08:00
|
|
|
|
if (H5G_stab_find(grp_ent, H5G_comp_g, obj_ent/*out*/)<0) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
/*
|
|
|
|
|
* Component was not found in the current symbol table, possibly
|
1998-03-25 07:18:34 +08:00
|
|
|
|
* because GRP_ENT isn't a symbol table.
|
1998-01-28 13:47:19 +08:00
|
|
|
|
*/
|
1998-03-25 07:18:34 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "component not found");
|
1998-01-28 13:47:19 +08:00
|
|
|
|
}
|
1998-04-15 00:44:46 +08:00
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* If we found a symbolic link then we should follow it. But if this
|
1998-10-15 03:35:08 +08:00
|
|
|
|
* is the last component of the name and the H5G_TARGET_SLINK bit of
|
|
|
|
|
* TARGET is set then we don't follow it.
|
1998-04-15 00:44:46 +08:00
|
|
|
|
*/
|
|
|
|
|
if (H5G_CACHED_SLINK==obj_ent->type &&
|
1998-10-15 03:35:08 +08:00
|
|
|
|
(0==(target & H5G_TARGET_SLINK) ||
|
|
|
|
|
((s=H5G_component(name+nchars, NULL)) && *s))) {
|
1998-04-15 00:44:46 +08:00
|
|
|
|
if ((*nlinks)-- <= 0) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_SLINK, FAIL,
|
|
|
|
|
"too many symbolic links");
|
|
|
|
|
}
|
|
|
|
|
if (H5G_traverse_slink (grp_ent, obj_ent, nlinks)<0) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL,
|
|
|
|
|
"symbolic link traversal failed");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1998-10-15 03:35:08 +08:00
|
|
|
|
/*
|
|
|
|
|
* Resolve mount points to the mounted group. Do not do this step if
|
|
|
|
|
* the H5G_TARGET_MOUNT bit of TARGET is set and this is the last
|
|
|
|
|
* component of the name.
|
|
|
|
|
*/
|
|
|
|
|
if (0==(target & H5G_TARGET_MOUNT) ||
|
|
|
|
|
((s=H5G_component(name+nchars, NULL)) && *s)) {
|
|
|
|
|
H5F_mountpoint(obj_ent/*in,out*/);
|
|
|
|
|
}
|
|
|
|
|
|
1998-01-28 13:47:19 +08:00
|
|
|
|
/* next component */
|
|
|
|
|
name += nchars;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
if (rest) *rest = name; /*final null */
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
FUNC_LEAVE(SUCCEED);
|
1997-08-13 06:44:46 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
1998-04-15 00:44:46 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_traverse_slink
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Traverses symbolic link. The link head appears in the group
|
|
|
|
|
* whose entry is GRP_ENT and the link head entry is OBJ_ENT.
|
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Success: Non-negative, OBJ_ENT will contain information
|
1998-04-15 00:44:46 +08:00
|
|
|
|
* about the object to which the link points and
|
|
|
|
|
* GRP_ENT will contain the information about
|
|
|
|
|
* the group in which the link tail appears.
|
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Failure: Negative
|
1998-04-15 00:44:46 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Friday, April 10, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
|
|
|
|
H5G_traverse_slink (H5G_entry_t *grp_ent/*in,out*/,
|
|
|
|
|
H5G_entry_t *obj_ent/*in,out*/,
|
2001-08-15 06:09:56 +08:00
|
|
|
|
int *nlinks/*in,out*/)
|
1998-04-15 00:44:46 +08:00
|
|
|
|
{
|
|
|
|
|
H5O_stab_t stab_mesg; /*info about local heap */
|
|
|
|
|
const char *clv = NULL; /*cached link value */
|
|
|
|
|
char *linkval = NULL; /*the copied link value */
|
|
|
|
|
herr_t ret_value = FAIL; /*return value */
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER (H5G_traverse_slink, FAIL);
|
|
|
|
|
|
|
|
|
|
/* Get the link value */
|
|
|
|
|
if (NULL==H5O_read (grp_ent, H5O_STAB, 0, &stab_mesg)) {
|
|
|
|
|
HGOTO_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL,
|
|
|
|
|
"unable to determine local heap address");
|
|
|
|
|
}
|
1999-07-29 02:25:43 +08:00
|
|
|
|
if (NULL==(clv=H5HL_peek (grp_ent->file, stab_mesg.heap_addr,
|
1998-04-15 00:44:46 +08:00
|
|
|
|
obj_ent->cache.slink.lval_offset))) {
|
|
|
|
|
HGOTO_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL,
|
|
|
|
|
"unable to read symbolic link value");
|
|
|
|
|
}
|
|
|
|
|
linkval = H5MM_xstrdup (clv);
|
|
|
|
|
|
|
|
|
|
/* Traverse the link */
|
1998-10-15 03:35:08 +08:00
|
|
|
|
if (H5G_namei (grp_ent, linkval, NULL, grp_ent, obj_ent, H5G_TARGET_NORMAL,
|
|
|
|
|
nlinks)) {
|
1998-04-15 00:44:46 +08:00
|
|
|
|
HGOTO_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL,
|
|
|
|
|
"unable to follow symbolic link");
|
|
|
|
|
}
|
|
|
|
|
ret_value = SUCCEED;
|
|
|
|
|
|
|
|
|
|
done:
|
|
|
|
|
H5MM_xfree (linkval);
|
|
|
|
|
FUNC_LEAVE (ret_value);
|
|
|
|
|
}
|
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Function: H5G_mkroot
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1998-03-25 07:18:34 +08:00
|
|
|
|
* Purpose: Creates a root group in an empty file and opens it. If a
|
|
|
|
|
* root group is already open then this function immediately
|
1998-09-22 23:27:26 +08:00
|
|
|
|
* returns. If ENT is non-null then it's the symbol table
|
1998-03-25 07:18:34 +08:00
|
|
|
|
* entry for an existing group which will be opened as the root
|
|
|
|
|
* group. Otherwise a new root group is created and then
|
|
|
|
|
* opened.
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* matzke@llnl.gov
|
|
|
|
|
* Aug 11 1997
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-03-25 07:18:34 +08:00
|
|
|
|
herr_t
|
|
|
|
|
H5G_mkroot (H5F_t *f, H5G_entry_t *ent)
|
1997-08-13 06:44:46 +08:00
|
|
|
|
{
|
1998-03-25 07:18:34 +08:00
|
|
|
|
H5G_entry_t new_root; /*new root object */
|
|
|
|
|
H5O_stab_t stab; /*symbol table message */
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5G_mkroot, FAIL);
|
|
|
|
|
|
|
|
|
|
/* check args */
|
|
|
|
|
assert(f);
|
1998-09-22 23:27:26 +08:00
|
|
|
|
if (f->shared->root_grp) HRETURN(SUCCEED);
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
/*
|
1998-03-25 07:18:34 +08:00
|
|
|
|
* If there is no root object then create one. The root group always has
|
|
|
|
|
* a hard link count of one since it's pointed to by the boot block.
|
1998-01-17 06:23:43 +08:00
|
|
|
|
*/
|
1998-03-25 07:18:34 +08:00
|
|
|
|
if (!ent) {
|
|
|
|
|
ent = &new_root;
|
2000-09-01 03:25:10 +08:00
|
|
|
|
if (H5G_stab_create (f, 256, ent/*out*/)<0) {
|
1998-03-25 07:18:34 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to create root group");
|
1998-01-28 13:47:19 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
if (1 != H5O_link (ent, 1)) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_LINK, FAIL,
|
|
|
|
|
"internal error (wrong link count)");
|
1998-01-28 13:47:19 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
} else {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
/*
|
1998-03-25 07:18:34 +08:00
|
|
|
|
* Open the root object as a group.
|
1998-01-28 13:47:19 +08:00
|
|
|
|
*/
|
1998-03-25 07:18:34 +08:00
|
|
|
|
if (H5O_open (ent)<0) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTOPENOBJ, FAIL,
|
|
|
|
|
"unable to open root group");
|
|
|
|
|
}
|
|
|
|
|
if (NULL==H5O_read (ent, H5O_STAB, 0, &stab)) {
|
1999-02-21 00:18:51 +08:00
|
|
|
|
H5O_close(ent);
|
1998-03-25 07:18:34 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL,
|
|
|
|
|
"root object is not a group");
|
|
|
|
|
}
|
|
|
|
|
H5O_reset (H5O_STAB, &stab);
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
1998-03-25 07:18:34 +08:00
|
|
|
|
/*
|
|
|
|
|
* Create the group pointer. Also decrement the open object count so we
|
|
|
|
|
* don't count the root group as an open object. The root group will
|
|
|
|
|
* never be closed.
|
|
|
|
|
*/
|
2000-08-17 04:13:02 +08:00
|
|
|
|
if (NULL==(f->shared->root_grp = H5FL_ALLOC (H5G_t,1))) {
|
1998-06-23 11:41:22 +08:00
|
|
|
|
HRETURN_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL,
|
|
|
|
|
"memory allocation failed");
|
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
f->shared->root_grp->ent = *ent;
|
|
|
|
|
f->shared->root_grp->nref = 1;
|
1998-10-15 03:35:08 +08:00
|
|
|
|
assert (1==f->nopen_objs);
|
|
|
|
|
f->nopen_objs = 0;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
1998-03-25 07:18:34 +08:00
|
|
|
|
FUNC_LEAVE(SUCCEED);
|
1997-08-13 06:44:46 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Function: H5G_create
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Purpose: Creates a new empty group with the specified name. The name
|
1998-03-25 07:18:34 +08:00
|
|
|
|
* is either an absolute name or is relative to LOC.
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
1997-10-21 07:14:35 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Return: Success: A handle for the group. The group is opened
|
|
|
|
|
* and should eventually be close by calling
|
|
|
|
|
* H5G_close().
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Failure: NULL
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* matzke@llnl.gov
|
|
|
|
|
* Aug 11 1997
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-03-24 22:53:57 +08:00
|
|
|
|
H5G_t *
|
1998-08-31 21:46:47 +08:00
|
|
|
|
H5G_create(H5G_entry_t *loc, const char *name, size_t size_hint)
|
1997-08-13 06:44:46 +08:00
|
|
|
|
{
|
1998-03-24 22:53:57 +08:00
|
|
|
|
const char *rest = NULL; /*the base name */
|
|
|
|
|
H5G_entry_t grp_ent; /*group containing new group */
|
|
|
|
|
char _comp[1024]; /*name component */
|
|
|
|
|
size_t nchars; /*number of characters in compon*/
|
|
|
|
|
H5G_t *grp = NULL; /*new group */
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5G_create, NULL);
|
|
|
|
|
|
|
|
|
|
/* check args */
|
1998-03-25 07:18:34 +08:00
|
|
|
|
assert(loc);
|
1998-01-17 06:23:43 +08:00
|
|
|
|
assert(name && *name);
|
|
|
|
|
|
|
|
|
|
/* lookup name */
|
1998-10-15 03:35:08 +08:00
|
|
|
|
if (0 == H5G_namei(loc, name, &rest, &grp_ent, NULL, H5G_TARGET_NORMAL,
|
|
|
|
|
NULL)) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_EXISTS, NULL, "already exists");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
1998-03-01 02:19:05 +08:00
|
|
|
|
H5E_clear(); /*it's OK that we didn't find it */
|
1999-07-29 02:25:43 +08:00
|
|
|
|
assert(H5F_addr_defined(grp_ent.header));
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
/* should be one null-terminated component left */
|
|
|
|
|
rest = H5G_component(rest, &nchars);
|
|
|
|
|
assert(rest && *rest);
|
|
|
|
|
if (rest[nchars]) {
|
1999-02-16 01:38:04 +08:00
|
|
|
|
const char *t = H5G_component(rest+nchars, NULL);
|
|
|
|
|
if (t && *t) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_NOTFOUND, NULL, "missing component");
|
1999-02-16 01:38:04 +08:00
|
|
|
|
} else if (nchars+1 > sizeof _comp) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_COMPLEN, NULL, "component is too long");
|
|
|
|
|
} else {
|
|
|
|
|
/* null terminate */
|
|
|
|
|
HDmemcpy(_comp, rest, nchars);
|
|
|
|
|
_comp[nchars] = '\0';
|
|
|
|
|
rest = _comp;
|
|
|
|
|
}
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
1998-03-24 22:53:57 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/* create an open group */
|
2000-08-17 04:13:02 +08:00
|
|
|
|
if (NULL==(grp = H5FL_ALLOC(H5G_t,1))) {
|
1998-06-23 11:41:22 +08:00
|
|
|
|
HRETURN_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL,
|
|
|
|
|
"memory allocation failed");
|
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
if (H5G_stab_create(grp_ent.file, size_hint, &(grp->ent)/*out*/) < 0) {
|
2000-08-17 04:13:02 +08:00
|
|
|
|
grp = H5FL_FREE(H5G_t,grp);
|
1998-01-28 13:47:19 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "can't create grp");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
1998-03-24 22:53:57 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/* insert child name into parent */
|
1998-08-28 23:24:12 +08:00
|
|
|
|
if (1!=H5O_link(&(grp->ent), 1)) {
|
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_LINK, NULL, "link inc failure");
|
|
|
|
|
}
|
1998-01-17 06:23:43 +08:00
|
|
|
|
if (H5G_stab_insert(&grp_ent, rest, &(grp->ent)) < 0) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
H5O_close(&(grp->ent));
|
2000-08-17 04:13:02 +08:00
|
|
|
|
grp = H5FL_FREE(H5G_t,grp);
|
1998-01-28 13:47:19 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "can't insert");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
grp->nref = 1;
|
|
|
|
|
FUNC_LEAVE(grp);
|
1998-01-06 11:07:15 +08:00
|
|
|
|
}
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_isa
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Determines if an object has the requisite messages for being
|
|
|
|
|
* a group.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: TRUE if the required group messages are
|
|
|
|
|
* present; FALSE otherwise.
|
|
|
|
|
*
|
|
|
|
|
* Failure: FAIL if the existence of certain messages
|
|
|
|
|
* cannot be determined.
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, November 2, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
htri_t
|
|
|
|
|
H5G_isa(H5G_entry_t *ent)
|
|
|
|
|
{
|
|
|
|
|
htri_t exists;
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5G_isa, FAIL);
|
|
|
|
|
assert(ent);
|
|
|
|
|
|
|
|
|
|
if ((exists=H5O_exists(ent, H5O_STAB, 0))<0) {
|
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to read object header");
|
|
|
|
|
}
|
|
|
|
|
FUNC_LEAVE(exists);
|
|
|
|
|
}
|
|
|
|
|
|
1998-01-06 11:07:15 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Function: H5G_open
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Purpose: Opens an existing group. The group should eventually be
|
|
|
|
|
* closed by calling H5G_close().
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Return: Success: Ptr to a new group.
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Failure: NULL
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, January 5, 1998
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
1999-03-18 08:07:50 +08:00
|
|
|
|
* Modified to call H5G_open_oid - QAK - 3/17/99
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-02-27 02:05:27 +08:00
|
|
|
|
H5G_t *
|
1998-08-31 21:46:47 +08:00
|
|
|
|
H5G_open(H5G_entry_t *loc, const char *name)
|
1998-01-06 11:07:15 +08:00
|
|
|
|
{
|
1998-02-27 02:05:27 +08:00
|
|
|
|
H5G_t *grp = NULL;
|
|
|
|
|
H5G_t *ret_value = NULL;
|
1999-03-18 08:07:50 +08:00
|
|
|
|
H5G_entry_t ent; /*dataset symbol table entry */
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5G_open, NULL);
|
|
|
|
|
|
|
|
|
|
/* Check args */
|
1998-03-25 07:18:34 +08:00
|
|
|
|
assert(loc);
|
1998-01-17 06:23:43 +08:00
|
|
|
|
assert(name && *name);
|
|
|
|
|
|
1998-02-27 02:05:27 +08:00
|
|
|
|
/* Open the object, making sure it's a group */
|
1999-03-18 08:07:50 +08:00
|
|
|
|
if (H5G_find(loc, name, NULL, &ent/*out*/) < 0) {
|
|
|
|
|
HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, NULL, "group not found");
|
|
|
|
|
}
|
|
|
|
|
/* Open the group object */
|
|
|
|
|
if ((grp=H5G_open_oid(&ent)) ==NULL) {
|
|
|
|
|
HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, NULL, "not found");
|
1998-06-23 11:41:22 +08:00
|
|
|
|
}
|
1999-03-18 08:07:50 +08:00
|
|
|
|
ret_value = grp;
|
|
|
|
|
|
|
|
|
|
done:
|
|
|
|
|
if (!ret_value && grp) {
|
2000-08-17 04:13:02 +08:00
|
|
|
|
H5FL_FREE(H5G_t,grp);
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
1999-03-18 08:07:50 +08:00
|
|
|
|
FUNC_LEAVE(ret_value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_open_oid
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Opens an existing group. The group should eventually be
|
|
|
|
|
* closed by calling H5G_close().
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: Ptr to a new group.
|
|
|
|
|
*
|
|
|
|
|
* Failure: NULL
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Quincey Koziol
|
|
|
|
|
* Wednesday, March 17, 1999
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
H5G_t *
|
|
|
|
|
H5G_open_oid(H5G_entry_t *ent)
|
|
|
|
|
{
|
|
|
|
|
H5G_t *grp = NULL;
|
|
|
|
|
H5G_t *ret_value = NULL;
|
|
|
|
|
H5O_stab_t mesg;
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5G_open_oid, NULL);
|
|
|
|
|
|
|
|
|
|
/* Check args */
|
|
|
|
|
assert(ent);
|
|
|
|
|
|
|
|
|
|
/* Open the object, making sure it's a group */
|
2000-08-17 04:13:02 +08:00
|
|
|
|
if (NULL==(grp = H5FL_ALLOC(H5G_t,1))) {
|
1999-04-16 03:57:50 +08:00
|
|
|
|
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL,
|
|
|
|
|
"memory allocation failed");
|
1999-03-18 08:07:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Copy over the symbol table information if it's provided */
|
|
|
|
|
HDmemcpy(&(grp->ent),ent,sizeof(H5G_entry_t));
|
|
|
|
|
|
|
|
|
|
/* Grab the object header */
|
1998-03-25 07:18:34 +08:00
|
|
|
|
if (H5O_open(&(grp->ent)) < 0) {
|
1999-03-18 08:07:50 +08:00
|
|
|
|
HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, NULL, "unable to open group");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
1998-02-27 02:05:27 +08:00
|
|
|
|
if (NULL==H5O_read (&(grp->ent), H5O_STAB, 0, &mesg)) {
|
1999-03-18 08:07:50 +08:00
|
|
|
|
H5O_close(&(grp->ent));
|
|
|
|
|
HGOTO_ERROR (H5E_SYM, H5E_CANTOPENOBJ, NULL, "not a group");
|
1998-02-27 02:05:27 +08:00
|
|
|
|
}
|
1998-01-17 06:23:43 +08:00
|
|
|
|
grp->nref = 1;
|
|
|
|
|
ret_value = grp;
|
|
|
|
|
|
1999-04-16 03:57:50 +08:00
|
|
|
|
done:
|
1998-01-17 06:23:43 +08:00
|
|
|
|
if (!ret_value && grp) {
|
2000-08-17 04:13:02 +08:00
|
|
|
|
H5FL_FREE(H5G_t,grp);
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
FUNC_LEAVE(ret_value);
|
1999-04-16 03:57:50 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
1998-01-06 11:07:15 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Function: H5G_reopen
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Purpose: Reopens a group by incrementing the open count.
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Return: Success: The GRP argument.
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Failure: NULL
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, January 5, 1998
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-03-25 07:18:34 +08:00
|
|
|
|
H5G_t *
|
1998-01-17 06:23:43 +08:00
|
|
|
|
H5G_reopen(H5G_t *grp)
|
1998-01-06 11:07:15 +08:00
|
|
|
|
{
|
1998-01-17 06:23:43 +08:00
|
|
|
|
FUNC_ENTER(H5G_reopen, NULL);
|
1998-01-06 11:07:15 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
assert(grp);
|
|
|
|
|
assert(grp->nref > 0);
|
1998-01-06 11:07:15 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
grp->nref++;
|
1998-01-06 11:07:15 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
FUNC_LEAVE(grp);
|
1998-01-06 11:07:15 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
1998-01-06 11:07:15 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Function: H5G_close
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Purpose: Closes the specified group.
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, January 5, 1998
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
1998-01-17 06:23:43 +08:00
|
|
|
|
H5G_close(H5G_t *grp)
|
1998-01-06 11:07:15 +08:00
|
|
|
|
{
|
1998-01-17 06:23:43 +08:00
|
|
|
|
FUNC_ENTER(H5G_close, FAIL);
|
1998-01-06 11:07:15 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/* Check args */
|
|
|
|
|
assert(grp);
|
|
|
|
|
assert(grp->nref > 0);
|
1998-01-06 11:07:15 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
if (1 == grp->nref) {
|
1998-10-14 01:17:50 +08:00
|
|
|
|
assert (grp!=H5G_rootof(H5G_fileof(grp)));
|
1998-01-28 13:47:19 +08:00
|
|
|
|
if (H5O_close(&(grp->ent)) < 0) {
|
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to close");
|
|
|
|
|
}
|
1998-05-02 05:16:06 +08:00
|
|
|
|
grp->nref = 0;
|
2000-08-17 04:13:02 +08:00
|
|
|
|
H5FL_FREE (H5G_t,grp);
|
1998-05-02 05:16:06 +08:00
|
|
|
|
} else {
|
|
|
|
|
--grp->nref;
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
1998-01-06 11:07:15 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
FUNC_LEAVE(SUCCEED);
|
1998-01-06 11:07:15 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
1997-09-20 00:36:59 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-10-14 01:17:50 +08:00
|
|
|
|
* Function: H5G_rootof
|
1997-09-20 00:36:59 +08:00
|
|
|
|
*
|
1998-10-15 03:35:08 +08:00
|
|
|
|
* Purpose: Return a pointer to the root group of the file. If the file
|
|
|
|
|
* is part of a virtual file then the root group of the virtual
|
|
|
|
|
* file is returned.
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-10-15 03:35:08 +08:00
|
|
|
|
* Return: Success: Ptr to the root group of the file. Do not
|
|
|
|
|
* free the pointer -- it points directly into
|
|
|
|
|
* the file struct.
|
1997-10-21 07:14:35 +08:00
|
|
|
|
*
|
1998-10-15 03:35:08 +08:00
|
|
|
|
* Failure: NULL
|
1997-10-21 07:14:35 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
1998-10-14 01:17:50 +08:00
|
|
|
|
* Tuesday, October 13, 1998
|
1997-10-21 07:14:35 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-03-25 07:18:34 +08:00
|
|
|
|
H5G_t *
|
1998-10-14 01:17:50 +08:00
|
|
|
|
H5G_rootof(H5F_t *f)
|
1997-10-21 07:14:35 +08:00
|
|
|
|
{
|
1998-10-14 01:17:50 +08:00
|
|
|
|
FUNC_ENTER(H5G_rootof, NULL);
|
1998-10-15 03:35:08 +08:00
|
|
|
|
while (f->mtab.parent) f = f->mtab.parent;
|
1998-10-14 01:17:50 +08:00
|
|
|
|
FUNC_LEAVE(f->shared->root_grp);
|
1997-08-13 06:44:46 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
1997-08-13 06:44:46 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Function: H5G_insert
|
1997-08-13 23:36:47 +08:00
|
|
|
|
*
|
1998-03-25 07:18:34 +08:00
|
|
|
|
* Purpose: Inserts a symbol table entry into the group graph.
|
1997-09-02 23:38:26 +08:00
|
|
|
|
*
|
1997-10-21 07:14:35 +08:00
|
|
|
|
* Errors:
|
1998-01-06 11:07:15 +08:00
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Friday, September 19, 1997
|
1997-08-13 06:44:46 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-01-06 11:07:15 +08:00
|
|
|
|
herr_t
|
1998-08-31 21:46:47 +08:00
|
|
|
|
H5G_insert(H5G_entry_t *loc, const char *name, H5G_entry_t *ent)
|
1997-08-13 06:44:46 +08:00
|
|
|
|
{
|
1998-01-28 13:47:19 +08:00
|
|
|
|
const char *rest = NULL; /*part of name not existing yet */
|
|
|
|
|
H5G_entry_t grp; /*entry for group to contain obj */
|
|
|
|
|
size_t nchars; /*number of characters in name */
|
|
|
|
|
char _comp[1024]; /*name component */
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5G_insert, FAIL);
|
|
|
|
|
|
|
|
|
|
/* Check args. */
|
1998-03-25 07:18:34 +08:00
|
|
|
|
assert (loc);
|
|
|
|
|
assert (name && *name);
|
|
|
|
|
assert (ent);
|
1998-01-17 06:23:43 +08:00
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Look up the name -- it shouldn't exist yet.
|
|
|
|
|
*/
|
1998-10-15 03:35:08 +08:00
|
|
|
|
if (H5G_namei(loc, name, &rest, &grp, NULL, H5G_TARGET_NORMAL, NULL)>=0) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_EXISTS, FAIL, "already exists");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
1998-03-01 02:19:05 +08:00
|
|
|
|
H5E_clear(); /*it's OK that we didn't find it */
|
1998-01-17 06:23:43 +08:00
|
|
|
|
rest = H5G_component(rest, &nchars);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* There should be one component left. Make sure it's null
|
|
|
|
|
* terminated.
|
|
|
|
|
*/
|
|
|
|
|
if (rest[nchars]) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
if (H5G_component(rest + nchars, NULL)) {
|
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "component not found");
|
|
|
|
|
} else if (nchars + 1 > sizeof _comp) {
|
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_COMPLEN, FAIL, "component is too long");
|
|
|
|
|
} else {
|
|
|
|
|
/* null terminate */
|
|
|
|
|
HDmemcpy(_comp, rest, nchars);
|
|
|
|
|
_comp[nchars] = '\0';
|
|
|
|
|
rest = _comp;
|
|
|
|
|
}
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
1998-09-22 23:27:26 +08:00
|
|
|
|
* Insert the object into a symbol table.
|
1998-01-17 06:23:43 +08:00
|
|
|
|
*/
|
|
|
|
|
if (H5O_link(ent, 1) < 0) {
|
1998-10-09 01:13:14 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_LINK, FAIL,
|
|
|
|
|
"unable to increment hard link count");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
if (H5G_stab_insert(&grp, rest, ent) < 0) {
|
1998-10-15 03:35:08 +08:00
|
|
|
|
H5O_link(ent, -1);
|
1998-10-09 01:13:14 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to insert name");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
FUNC_LEAVE(SUCCEED);
|
1997-07-31 05:17:56 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
1997-07-31 05:17:56 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Function: H5G_find
|
|
|
|
|
*
|
1998-03-25 07:18:34 +08:00
|
|
|
|
* Purpose: Finds an object with the specified NAME at location LOC. On
|
|
|
|
|
* successful return, GRP_ENT (if non-null) will be initialized
|
|
|
|
|
* with the symbol table information for the group in which the
|
|
|
|
|
* object appears (it will have an undefined object header
|
|
|
|
|
* address if the object is the root object) and OBJ_ENT will be
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* initialized with the symbol table entry for the object
|
|
|
|
|
* (OBJ_ENT is optional when the caller is interested only in
|
1998-03-25 07:18:34 +08:00
|
|
|
|
* the existence of the object).
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*
|
1997-09-02 23:38:26 +08:00
|
|
|
|
* Errors:
|
|
|
|
|
*
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
* Return: Success: Non-negative, see above for values of GRP_ENT
|
|
|
|
|
* and OBJ_ENT.
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Failure: Negative
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*
|
1998-01-28 13:47:19 +08:00
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* matzke@llnl.gov
|
|
|
|
|
* Aug 12 1997
|
1997-07-31 05:17:56 +08:00
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
1998-08-31 21:46:47 +08:00
|
|
|
|
H5G_find(H5G_entry_t *loc, const char *name,
|
1998-03-25 07:18:34 +08:00
|
|
|
|
H5G_entry_t *grp_ent/*out*/, H5G_entry_t *obj_ent/*out*/)
|
1997-07-31 05:17:56 +08:00
|
|
|
|
{
|
1998-01-17 06:23:43 +08:00
|
|
|
|
FUNC_ENTER(H5G_find, FAIL);
|
1997-08-08 03:23:00 +08:00
|
|
|
|
|
1998-01-17 06:23:43 +08:00
|
|
|
|
/* check args */
|
1998-03-25 07:18:34 +08:00
|
|
|
|
assert (loc);
|
|
|
|
|
assert (name && *name);
|
1997-08-08 03:23:00 +08:00
|
|
|
|
|
1998-10-15 03:35:08 +08:00
|
|
|
|
if (H5G_namei(loc, name, NULL, grp_ent, obj_ent, H5G_TARGET_NORMAL,
|
|
|
|
|
NULL)<0) {
|
1998-01-28 13:47:19 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found");
|
1998-01-17 06:23:43 +08:00
|
|
|
|
}
|
|
|
|
|
FUNC_LEAVE(SUCCEED);
|
1997-07-31 05:17:56 +08:00
|
|
|
|
}
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_entof
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Returns a pointer to the entry for a group.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: Ptr to group entry
|
|
|
|
|
*
|
|
|
|
|
* Failure: NULL
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Tuesday, March 24, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
H5G_entry_t *
|
|
|
|
|
H5G_entof (H5G_t *grp)
|
|
|
|
|
{
|
|
|
|
|
return grp ? &(grp->ent) : NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_fileof
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Returns the file to which the specified group belongs.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: File pointer.
|
|
|
|
|
*
|
|
|
|
|
* Failure: NULL
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Tuesday, March 24, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
H5F_t *
|
|
|
|
|
H5G_fileof (H5G_t *grp)
|
|
|
|
|
{
|
|
|
|
|
assert (grp);
|
|
|
|
|
return grp->ent.file;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_loc
|
|
|
|
|
*
|
1998-08-31 21:46:47 +08:00
|
|
|
|
* Purpose: Given an object ID return a symbol table entry for the
|
|
|
|
|
* object.
|
1998-03-25 07:18:34 +08:00
|
|
|
|
*
|
|
|
|
|
* Return: Success: Group pointer.
|
|
|
|
|
*
|
|
|
|
|
* Failure: NULL
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Tuesday, March 24, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
1998-08-31 21:46:47 +08:00
|
|
|
|
H5G_entry_t *
|
1998-03-25 07:18:34 +08:00
|
|
|
|
H5G_loc (hid_t loc_id)
|
|
|
|
|
{
|
|
|
|
|
H5F_t *f;
|
1998-08-31 21:46:47 +08:00
|
|
|
|
H5G_entry_t *ret_value = NULL;
|
|
|
|
|
H5G_t *group=NULL;
|
|
|
|
|
H5T_t *dt=NULL;
|
|
|
|
|
H5D_t *dset=NULL;
|
|
|
|
|
H5A_t *attr=NULL;
|
1998-03-25 07:18:34 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER (H5G_loc, NULL);
|
1998-08-31 21:46:47 +08:00
|
|
|
|
|
1998-10-06 07:41:30 +08:00
|
|
|
|
switch (H5I_get_type(loc_id)) {
|
|
|
|
|
case H5I_FILE:
|
1998-03-25 07:18:34 +08:00
|
|
|
|
if (NULL==(f=H5I_object (loc_id))) {
|
|
|
|
|
HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, NULL, "invalid file ID");
|
|
|
|
|
}
|
1998-10-14 01:17:50 +08:00
|
|
|
|
if (NULL==(ret_value=H5G_entof(H5G_rootof(f)))) {
|
1998-08-31 21:46:47 +08:00
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, NULL,
|
1998-10-14 01:17:50 +08:00
|
|
|
|
"unable to get symbol table entry for root group");
|
1998-03-25 07:18:34 +08:00
|
|
|
|
}
|
1998-08-31 21:46:47 +08:00
|
|
|
|
break;
|
|
|
|
|
|
2000-11-14 01:36:33 +08:00
|
|
|
|
case H5I_GENPROP_CLS:
|
|
|
|
|
case H5I_GENPROP_LST:
|
1998-08-31 21:46:47 +08:00
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, NULL,
|
|
|
|
|
"unable to get symbol table entry of property list");
|
|
|
|
|
|
1998-10-06 07:41:30 +08:00
|
|
|
|
case H5I_GROUP:
|
1998-08-31 21:46:47 +08:00
|
|
|
|
if (NULL==(group=H5I_object (loc_id))) {
|
1998-03-25 07:18:34 +08:00
|
|
|
|
HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, NULL, "invalid group ID");
|
|
|
|
|
}
|
1998-08-31 21:46:47 +08:00
|
|
|
|
if (NULL==(ret_value=H5G_entof(group))) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, NULL,
|
|
|
|
|
"unable to get symbol table entry of group");
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
1998-10-06 07:41:30 +08:00
|
|
|
|
case H5I_DATATYPE:
|
1998-08-31 21:46:47 +08:00
|
|
|
|
if (NULL==(dt=H5I_object(loc_id))) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid type ID");
|
|
|
|
|
}
|
|
|
|
|
if (NULL==(ret_value=H5T_entof(dt))) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, NULL,
|
|
|
|
|
"unable to get symbol table entry of data type");
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
1998-10-06 07:41:30 +08:00
|
|
|
|
case H5I_DATASPACE:
|
1998-08-31 21:46:47 +08:00
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, NULL,
|
|
|
|
|
"unable to get symbol table entry of data space");
|
|
|
|
|
|
1998-10-06 07:41:30 +08:00
|
|
|
|
case H5I_DATASET:
|
1998-08-31 21:46:47 +08:00
|
|
|
|
if (NULL==(dset=H5I_object(loc_id))) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid data ID");
|
|
|
|
|
}
|
|
|
|
|
if (NULL==(ret_value=H5D_entof(dset))) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, NULL,
|
|
|
|
|
"unable to get symbol table entry of dataset");
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
1998-10-06 07:41:30 +08:00
|
|
|
|
case H5I_ATTR:
|
1998-08-31 21:46:47 +08:00
|
|
|
|
if (NULL==(attr=H5I_object(loc_id))) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, NULL,
|
|
|
|
|
"invalid attribute ID");
|
|
|
|
|
}
|
|
|
|
|
if (NULL==(ret_value=H5A_entof(attr))) {
|
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, NULL,
|
|
|
|
|
"unable to get symbol table entry of attribute");
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
1998-10-06 07:41:30 +08:00
|
|
|
|
case H5I_TEMPBUF:
|
1998-08-31 21:46:47 +08:00
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, NULL,
|
|
|
|
|
"unable to get symbol table entry of buffer");
|
|
|
|
|
|
1999-02-21 00:18:51 +08:00
|
|
|
|
case H5I_NGROUPS:
|
1998-10-06 07:41:30 +08:00
|
|
|
|
case H5I_BADID:
|
1999-02-21 00:18:51 +08:00
|
|
|
|
case H5I_FILE_CLOSING:
|
1999-02-25 23:40:27 +08:00
|
|
|
|
case H5I_REFERENCE:
|
1999-08-11 04:21:32 +08:00
|
|
|
|
case H5I_VFL:
|
1998-08-31 21:46:47 +08:00
|
|
|
|
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid object ID");
|
1998-03-25 07:18:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE (ret_value);
|
|
|
|
|
}
|
1998-04-07 23:34:16 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_link
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Creates a link from NEW_NAME to CUR_NAME. See H5Glink() for
|
|
|
|
|
* full documentation.
|
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
1998-04-07 23:34:16 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, April 6, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
2002-04-27 04:34:46 +08:00
|
|
|
|
H5G_link (H5G_entry_t *cur_loc, const char *cur_name, H5G_entry_t *new_loc,
|
|
|
|
|
const char *new_name, H5G_link_t type, unsigned namei_flags)
|
1998-04-07 23:34:16 +08:00
|
|
|
|
{
|
1998-04-15 00:44:46 +08:00
|
|
|
|
H5G_entry_t cur_obj; /*entry for the link tail */
|
|
|
|
|
H5G_entry_t grp_ent; /*ent for grp containing link hd*/
|
|
|
|
|
H5O_stab_t stab_mesg; /*symbol table message */
|
|
|
|
|
const char *rest = NULL; /*last component of new name */
|
|
|
|
|
char _comp[1024]; /*name component */
|
|
|
|
|
size_t nchars; /*characters in component */
|
|
|
|
|
size_t offset; /*offset to sym-link value */
|
1998-04-07 23:34:16 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER (H5G_link, FAIL);
|
|
|
|
|
|
|
|
|
|
/* Check args */
|
2002-04-27 04:34:46 +08:00
|
|
|
|
assert (cur_loc);
|
|
|
|
|
assert (new_loc);
|
1998-04-07 23:34:16 +08:00
|
|
|
|
assert (cur_name && *cur_name);
|
|
|
|
|
assert (new_name && *new_name);
|
|
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
|
case H5G_LINK_SOFT:
|
1998-04-15 00:44:46 +08:00
|
|
|
|
/*
|
|
|
|
|
* Lookup the the new_name so we can get the group which will contain
|
|
|
|
|
* the new entry. The entry shouldn't exist yet.
|
|
|
|
|
*/
|
2002-04-27 04:34:46 +08:00
|
|
|
|
if (H5G_namei (new_loc, new_name, &rest, &grp_ent, NULL,
|
|
|
|
|
H5G_TARGET_NORMAL, NULL)>=0) {
|
1998-04-15 00:44:46 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_EXISTS, FAIL, "already exists");
|
|
|
|
|
}
|
|
|
|
|
H5E_clear (); /*it's okay that we didn't find it*/
|
|
|
|
|
rest = H5G_component (rest, &nchars);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* There should be one component left. Make sure it's null
|
|
|
|
|
* terminated and that `rest' points to it.
|
|
|
|
|
*/
|
|
|
|
|
if (rest[nchars]) {
|
|
|
|
|
if (H5G_component (rest+nchars, NULL)) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL,
|
|
|
|
|
"component not found");
|
|
|
|
|
} else if (nchars+1 > sizeof _comp) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_COMPLEN, FAIL,
|
|
|
|
|
"name component is too long");
|
|
|
|
|
} else {
|
|
|
|
|
HDmemcpy (_comp, rest, nchars);
|
|
|
|
|
_comp[nchars] = '\0';
|
|
|
|
|
rest = _comp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Add the link-value to the local heap for the symbol table which
|
|
|
|
|
* will contain the link.
|
|
|
|
|
*/
|
|
|
|
|
if (NULL==H5O_read (&grp_ent, H5O_STAB, 0, &stab_mesg)) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to determine local heap address");
|
|
|
|
|
}
|
|
|
|
|
if ((size_t)(-1)==(offset=H5HL_insert (grp_ent.file,
|
1999-07-29 02:25:43 +08:00
|
|
|
|
stab_mesg.heap_addr,
|
1998-09-09 03:15:44 +08:00
|
|
|
|
HDstrlen(cur_name)+1,
|
1998-04-15 00:44:46 +08:00
|
|
|
|
cur_name))) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to write link value to local heap");
|
|
|
|
|
}
|
|
|
|
|
H5O_reset (H5O_STAB, &stab_mesg);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Create a symbol table entry for the link. The object header is
|
|
|
|
|
* undefined and the cache contains the link-value offset.
|
|
|
|
|
*/
|
|
|
|
|
HDmemset (&cur_obj, 0, sizeof cur_obj);
|
1999-08-11 04:21:32 +08:00
|
|
|
|
cur_obj.header = HADDR_UNDEF;
|
1998-04-15 00:44:46 +08:00
|
|
|
|
cur_obj.file = grp_ent.file;
|
|
|
|
|
cur_obj.type = H5G_CACHED_SLINK;
|
|
|
|
|
cur_obj.cache.slink.lval_offset = offset;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Insert the link head in the symbol table. This shouldn't ever
|
|
|
|
|
* fail because we've already checked that the link head doesn't
|
|
|
|
|
* exist and the file is writable (because the local heap is
|
|
|
|
|
* writable). But if it does, the only side effect is that the local
|
|
|
|
|
* heap has some extra garbage in it.
|
|
|
|
|
*/
|
|
|
|
|
if (H5G_stab_insert (&grp_ent, rest, &cur_obj)<0) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to create new name/link for object");
|
|
|
|
|
}
|
|
|
|
|
break;
|
1998-04-07 23:34:16 +08:00
|
|
|
|
|
|
|
|
|
case H5G_LINK_HARD:
|
2002-04-27 04:34:46 +08:00
|
|
|
|
if (H5G_namei(cur_loc, cur_name, NULL, NULL, &cur_obj, namei_flags,
|
1998-10-15 03:35:08 +08:00
|
|
|
|
NULL)<0) {
|
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL,
|
|
|
|
|
"source object not found");
|
1998-04-07 23:34:16 +08:00
|
|
|
|
}
|
2002-04-27 04:34:46 +08:00
|
|
|
|
if (H5G_insert (new_loc, new_name, &cur_obj)<0) {
|
1998-04-07 23:34:16 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to create new name/link for object");
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_BADVALUE, FAIL,
|
|
|
|
|
"unrecognized link type");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
|
|
|
|
}
|
1998-04-15 00:44:46 +08:00
|
|
|
|
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_get_type
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Returns the type of object pointed to by `ent'.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: An object type defined in H5Gpublic.h
|
|
|
|
|
*
|
|
|
|
|
* Failure: H5G_UNKNOWN
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Wednesday, November 4, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
2001-08-15 06:09:56 +08:00
|
|
|
|
int
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
H5G_get_type(H5G_entry_t *ent)
|
|
|
|
|
{
|
|
|
|
|
htri_t isa;
|
|
|
|
|
size_t i;
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5G_get_type, H5G_UNKNOWN);
|
|
|
|
|
|
|
|
|
|
for (i=H5G_ntypes_g; i>0; --i) {
|
|
|
|
|
if ((isa=(H5G_type_g[i-1].isa)(ent))<0) {
|
1999-04-26 22:43:53 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, H5G_UNKNOWN,
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
"unable to determine object type");
|
|
|
|
|
} else if (isa) {
|
|
|
|
|
HRETURN(H5G_type_g[i-1].type);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (0==i) {
|
1999-04-26 22:43:53 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, H5G_UNKNOWN,
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
"unable to determine object type");
|
|
|
|
|
}
|
|
|
|
|
FUNC_LEAVE(H5G_UNKNOWN);
|
|
|
|
|
}
|
|
|
|
|
|
1998-04-15 00:44:46 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
1998-09-03 05:16:24 +08:00
|
|
|
|
* Function: H5G_get_objinfo
|
1998-04-15 00:44:46 +08:00
|
|
|
|
*
|
|
|
|
|
* Purpose: Returns information about an object.
|
|
|
|
|
*
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
* Return: Success: Non-negative with info about the object
|
|
|
|
|
* returned through STATBUF if it isn't the null
|
|
|
|
|
* pointer.
|
1998-04-15 00:44:46 +08:00
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Failure: Negative
|
1998-04-15 00:44:46 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, April 13, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
1998-09-03 05:16:24 +08:00
|
|
|
|
H5G_get_objinfo (H5G_entry_t *loc, const char *name, hbool_t follow_link,
|
1998-10-01 04:17:26 +08:00
|
|
|
|
H5G_stat_t *statbuf/*out*/)
|
1998-04-15 00:44:46 +08:00
|
|
|
|
{
|
|
|
|
|
H5O_stab_t stab_mesg;
|
|
|
|
|
H5G_entry_t grp_ent, obj_ent;
|
|
|
|
|
const char *s = NULL;
|
|
|
|
|
|
1998-09-03 05:16:24 +08:00
|
|
|
|
FUNC_ENTER (H5G_get_objinfo, FAIL);
|
1998-04-15 00:44:46 +08:00
|
|
|
|
|
|
|
|
|
assert (loc);
|
|
|
|
|
assert (name && *name);
|
|
|
|
|
if (statbuf) HDmemset (statbuf, 0, sizeof *statbuf);
|
|
|
|
|
|
|
|
|
|
/* Find the object's symbol table entry */
|
1998-08-31 21:46:47 +08:00
|
|
|
|
if (H5G_namei (loc, name, NULL, &grp_ent/*out*/, &obj_ent/*out*/,
|
2001-08-15 06:09:56 +08:00
|
|
|
|
(unsigned)(follow_link?H5G_TARGET_NORMAL:H5G_TARGET_SLINK), NULL)<0) {
|
1998-04-15 00:44:46 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL, "unable to stat object");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Initialize the stat buf. Symbolic links aren't normal objects and
|
1998-07-01 05:30:28 +08:00
|
|
|
|
* therefore don't have much of the normal info. However, the link value
|
1998-04-15 00:44:46 +08:00
|
|
|
|
* length is specific to symbolic links.
|
|
|
|
|
*/
|
|
|
|
|
if (statbuf) {
|
1998-08-15 05:05:16 +08:00
|
|
|
|
if (H5G_CACHED_SLINK==obj_ent.type) {
|
|
|
|
|
/* Named object is a symbolic link */
|
|
|
|
|
if (NULL==H5O_read (&grp_ent, H5O_STAB, 0, &stab_mesg) ||
|
2002-03-29 03:27:38 +08:00
|
|
|
|
NULL==(s=H5HL_peek (grp_ent.file, stab_mesg.heap_addr,
|
1998-08-15 05:05:16 +08:00
|
|
|
|
obj_ent.cache.slink.lval_offset))) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to read symbolic link value");
|
|
|
|
|
}
|
1998-09-09 03:15:44 +08:00
|
|
|
|
statbuf->linklen = HDstrlen(s)+1; /*count the null terminator*/
|
1998-08-15 05:05:16 +08:00
|
|
|
|
statbuf->objno[0] = statbuf->objno[1] = 0;
|
|
|
|
|
statbuf->nlink = 0;
|
|
|
|
|
statbuf->type = H5G_LINK;
|
|
|
|
|
statbuf->mtime = 0;
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
/* Some other type of object */
|
1999-07-29 02:25:43 +08:00
|
|
|
|
statbuf->objno[0] = (unsigned long)(obj_ent.header);
|
2002-04-28 16:34:17 +08:00
|
|
|
|
#if H5_SIZEOF_UINT64_T>H5_SIZEOF_LONG
|
1999-07-29 02:25:43 +08:00
|
|
|
|
statbuf->objno[1] = (unsigned long)(obj_ent.header >>
|
1999-02-25 23:40:27 +08:00
|
|
|
|
8*sizeof(long));
|
|
|
|
|
#else
|
|
|
|
|
statbuf->objno[1] = 0;
|
|
|
|
|
#endif
|
1998-04-15 00:44:46 +08:00
|
|
|
|
statbuf->nlink = H5O_link (&obj_ent, 0);
|
|
|
|
|
statbuf->type = H5G_LINK;
|
1998-07-30 00:43:59 +08:00
|
|
|
|
if (NULL==H5O_read(&obj_ent, H5O_MTIME, 0, &(statbuf->mtime))) {
|
|
|
|
|
H5E_clear();
|
|
|
|
|
statbuf->mtime = 0;
|
2002-03-29 03:27:38 +08:00
|
|
|
|
}
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
statbuf->type = H5G_get_type(&obj_ent);
|
1998-04-15 00:44:46 +08:00
|
|
|
|
H5E_clear(); /*clear errors resulting from checking type*/
|
2002-03-29 03:27:38 +08:00
|
|
|
|
}
|
2002-03-28 04:25:03 +08:00
|
|
|
|
|
|
|
|
|
/* Common code to retrieve the file's fileno */
|
|
|
|
|
if(H5F_get_fileno(obj_ent.file,statbuf->fileno)<0)
|
|
|
|
|
HRETURN_ERROR (H5E_FILE, H5E_BADVALUE, FAIL, "unable to read fileno");
|
2002-03-29 03:27:38 +08:00
|
|
|
|
}
|
1998-04-15 00:44:46 +08:00
|
|
|
|
|
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_linkval
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Returns the value of a symbolic link.
|
|
|
|
|
*
|
[svn-r876] Changes since 19981102
----------------------
./bin/snapshot
Made same fix as for the release script yesterday.
./src/H5D.c
./src/H5Dprivate.h
./src/H5G.c
./src/H5Gprivate.h
./src/H5Gpublic.h
./src/H5O.c
./src/H5Oprivate.h
./src/H5RA.c
./src/H5RAprivate.h
./src/H5T.c
./src/H5Tprivate.h
Improved object type checking. Instead of determining the
object type by trying to open each of the possible types, we
keep a table of associations between object type number (like
H5G_GROUP, H5G_DATASET, H5D_TYPE, and H5D_RAGGED) and an `isa'
function that returns true if the object header has the right
messages to make the object a particular type. This mechanism
also allows specialization of object types by permitting an
object to satisfy more than one `isa' function.
Added `isa' functions for groups, datasets, ragged arrays, and
committed data types.
./src/H5config.h.in
Added HAVE_STAT_ST_BLOCKS. I thought this had already been
added, but apparently not.
./tools/h5ls.c
Removed system include files since they're already included by
H5private.h and since I wasn't including them portably anyway.
By default, 1-byte integer types are printed as integer values
instead of ASCII characters. However, the `-s' or `--string'
command-line switch causes the data to be interpretted as
ASCII. String data types are always printed as character
data.
Ragged arrays are now identified as ragged arrays and h5ls
doesn't descend into the group automatically. This uses the
new object type specialization stuff.
./tools/h5tools.c
./tools/h5tools.h
Added the ability to print 1-byte integer types as either
ASCII or numeric data instead of always ASCII. The default is
to print as numeric data.
1998-11-06 04:28:34 +08:00
|
|
|
|
* Return: Success: Non-negative, with at most SIZE bytes of the
|
|
|
|
|
* link value copied into the BUF buffer. If the
|
1998-04-15 00:44:46 +08:00
|
|
|
|
* link value is larger than SIZE characters
|
|
|
|
|
* counting the null terminator then the BUF
|
|
|
|
|
* result will not be null terminated.
|
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Failure: Negative
|
1998-04-15 00:44:46 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, April 13, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
1998-08-31 21:46:47 +08:00
|
|
|
|
H5G_linkval (H5G_entry_t *loc, const char *name, size_t size, char *buf/*out*/)
|
1998-04-15 00:44:46 +08:00
|
|
|
|
{
|
|
|
|
|
const char *s = NULL;
|
|
|
|
|
H5G_entry_t grp_ent, obj_ent;
|
|
|
|
|
H5O_stab_t stab_mesg;
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER (H5G_linkval, FAIL);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Get the symbol table entry for the link head and the symbol table
|
|
|
|
|
* entry for the group in which the link head appears.
|
|
|
|
|
*/
|
1998-10-15 03:35:08 +08:00
|
|
|
|
if (H5G_namei (loc, name, NULL, &grp_ent/*out*/, &obj_ent/*out*/,
|
|
|
|
|
H5G_TARGET_SLINK, NULL)<0) {
|
1998-04-15 00:44:46 +08:00
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL,
|
|
|
|
|
"symbolic link was not found");
|
|
|
|
|
}
|
|
|
|
|
if (H5G_CACHED_SLINK!=obj_ent.type) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL,
|
|
|
|
|
"object is not a symbolic link");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Get the address of the local heap for the link value and a pointer
|
|
|
|
|
* into that local heap.
|
|
|
|
|
*/
|
|
|
|
|
if (NULL==H5O_read (&grp_ent, H5O_STAB, 0, &stab_mesg)) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to determine local heap address");
|
|
|
|
|
}
|
1999-07-29 02:25:43 +08:00
|
|
|
|
if (NULL==(s=H5HL_peek (grp_ent.file, stab_mesg.heap_addr,
|
1998-04-15 00:44:46 +08:00
|
|
|
|
obj_ent.cache.slink.lval_offset))) {
|
|
|
|
|
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to read symbolic link value");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Copy to output buffer */
|
|
|
|
|
if (size>0 && buf) {
|
1998-09-09 03:15:44 +08:00
|
|
|
|
HDstrncpy (buf, s, size);
|
1998-04-15 00:44:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE (SUCCEED);
|
|
|
|
|
}
|
|
|
|
|
|
1998-07-21 05:01:32 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_set_comment
|
|
|
|
|
*
|
|
|
|
|
* Purpose: (Re)sets the comment for an object.
|
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
1998-07-21 05:01:32 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, July 20, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
1998-08-31 21:46:47 +08:00
|
|
|
|
H5G_set_comment(H5G_entry_t *loc, const char *name, const char *buf)
|
1998-07-21 05:01:32 +08:00
|
|
|
|
{
|
|
|
|
|
H5G_entry_t obj_ent;
|
|
|
|
|
H5O_name_t comment;
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5G_set_comment, FAIL);
|
|
|
|
|
|
|
|
|
|
/* Get the symbol table entry for the object */
|
1998-10-15 03:35:08 +08:00
|
|
|
|
if (H5G_namei(loc, name, NULL, NULL, &obj_ent/*out*/, H5G_TARGET_NORMAL,
|
|
|
|
|
NULL)<0) {
|
1998-07-21 05:01:32 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Remove the previous comment message if any */
|
|
|
|
|
if (H5O_remove(&obj_ent, H5O_NAME, 0)<0) H5E_clear();
|
|
|
|
|
|
|
|
|
|
/* Add the new message */
|
|
|
|
|
if (buf && *buf) {
|
|
|
|
|
comment.s = H5MM_xstrdup(buf);
|
|
|
|
|
if (H5O_modify(&obj_ent, H5O_NAME, H5O_NEW_MESG, 0, &comment)<0) {
|
|
|
|
|
HRETURN_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to set comment object header message");
|
|
|
|
|
}
|
|
|
|
|
H5O_reset(H5O_NAME, &comment);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE(SUCCEED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_get_comment
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Get the comment value for an object.
|
|
|
|
|
*
|
[svn-r537] Changes since 19980722
----------------------
./src/H5A.c
./src/H5Apublic.h
./test/tattr.c
Switched the order of the second and third argument of
H5Aget_name() to make it consistent with other functions that
take buffers and buffer sizes.
./src/H5G.c
./src/H5Gpublic.h
./src/H5Gprivate.h
The H5Gget_comment() function returns the size of the comment
including the null terminator. If the object has no comment
then zero is returned. If an error occurs then a negative
value is returned.
./MANIFEST
./tools/Makefile.in
./tools/h5tools.h [NEW]
./tools/h5dump.c [NEW]
Created a library for printing values of datasets in a way
that looks nice. It's not done yet, but I needed it for
debugging the contents of files from Jim Reus.
./tools/h5ls.c
Added the `-d' and `--dump' options which cause the contents
of a dataset to be printed. Added `-w N' and `--width=N'
options to control how wide the raw data output should be. If
you want single-column output then say `-w1'.
Printing dataset values can now handle datasets of any integer
or floating point atomic type. As a special case, integers
which are one byte wide are treated a character strings for
now.
Sample output:
$ h5ls --dump --width=60 banana.hdf
ARCHIVE 0:0:0:744 Dataset {52/Inf}
Data:
(0) "U struct complex { double R; double I; };\012V"
(43) " double;\012"
U 0:0:0:2500 Dataset {256/512}
Data: printing of compound data types is not implemented yet
V 0:0:0:3928 Dataset {256/512}
Data:
(0) 0, 0.015625, 0.03125, 0.046875, 0.0625,
(5) 0.078125, 0.09375, 0.109375, 0.125, 0.140625,
(10) 0.15625, 0.171875, 0.1875, 0.203125, 0.21875,
(15) 0.234375, 0.25, 0.265625, 0.28125, 0.296875,
...
1998-07-24 05:19:17 +08:00
|
|
|
|
* Return: Success: Number of bytes in the comment including the
|
|
|
|
|
* null terminator. Zero if the object has no
|
|
|
|
|
* comment.
|
1998-07-21 05:01:32 +08:00
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Failure: Negative
|
1998-07-21 05:01:32 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Monday, July 20, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
2001-08-15 06:09:56 +08:00
|
|
|
|
int
|
1998-08-31 21:46:47 +08:00
|
|
|
|
H5G_get_comment(H5G_entry_t *loc, const char *name, size_t bufsize, char *buf)
|
1998-07-21 05:01:32 +08:00
|
|
|
|
{
|
|
|
|
|
H5O_name_t comment;
|
|
|
|
|
H5G_entry_t obj_ent;
|
2001-08-15 06:09:56 +08:00
|
|
|
|
int retval = FAIL;
|
1998-07-21 05:01:32 +08:00
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5G_get_comment, FAIL);
|
|
|
|
|
|
|
|
|
|
/* Get the symbol table entry for the object */
|
1998-10-15 03:35:08 +08:00
|
|
|
|
if (H5G_namei(loc, name, NULL, NULL, &obj_ent/*out*/, H5G_TARGET_NORMAL,
|
|
|
|
|
NULL)<0) {
|
1998-07-21 05:01:32 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Get the message */
|
|
|
|
|
comment.s = NULL;
|
|
|
|
|
if (NULL==H5O_read(&obj_ent, H5O_NAME, 0, &comment)) {
|
[svn-r537] Changes since 19980722
----------------------
./src/H5A.c
./src/H5Apublic.h
./test/tattr.c
Switched the order of the second and third argument of
H5Aget_name() to make it consistent with other functions that
take buffers and buffer sizes.
./src/H5G.c
./src/H5Gpublic.h
./src/H5Gprivate.h
The H5Gget_comment() function returns the size of the comment
including the null terminator. If the object has no comment
then zero is returned. If an error occurs then a negative
value is returned.
./MANIFEST
./tools/Makefile.in
./tools/h5tools.h [NEW]
./tools/h5dump.c [NEW]
Created a library for printing values of datasets in a way
that looks nice. It's not done yet, but I needed it for
debugging the contents of files from Jim Reus.
./tools/h5ls.c
Added the `-d' and `--dump' options which cause the contents
of a dataset to be printed. Added `-w N' and `--width=N'
options to control how wide the raw data output should be. If
you want single-column output then say `-w1'.
Printing dataset values can now handle datasets of any integer
or floating point atomic type. As a special case, integers
which are one byte wide are treated a character strings for
now.
Sample output:
$ h5ls --dump --width=60 banana.hdf
ARCHIVE 0:0:0:744 Dataset {52/Inf}
Data:
(0) "U struct complex { double R; double I; };\012V"
(43) " double;\012"
U 0:0:0:2500 Dataset {256/512}
Data: printing of compound data types is not implemented yet
V 0:0:0:3928 Dataset {256/512}
Data:
(0) 0, 0.015625, 0.03125, 0.046875, 0.0625,
(5) 0.078125, 0.09375, 0.109375, 0.125, 0.140625,
(10) 0.15625, 0.171875, 0.1875, 0.203125, 0.21875,
(15) 0.234375, 0.25, 0.265625, 0.28125, 0.296875,
...
1998-07-24 05:19:17 +08:00
|
|
|
|
if (buf && bufsize>0) buf[0] = '\0';
|
|
|
|
|
retval = 0;
|
1998-07-21 05:01:32 +08:00
|
|
|
|
} else {
|
1998-09-09 03:15:44 +08:00
|
|
|
|
HDstrncpy(buf, comment.s, bufsize);
|
2001-08-15 06:09:56 +08:00
|
|
|
|
retval = (int)HDstrlen(comment.s);
|
1998-07-21 05:01:32 +08:00
|
|
|
|
H5O_reset(H5O_NAME, &comment);
|
|
|
|
|
}
|
|
|
|
|
|
[svn-r537] Changes since 19980722
----------------------
./src/H5A.c
./src/H5Apublic.h
./test/tattr.c
Switched the order of the second and third argument of
H5Aget_name() to make it consistent with other functions that
take buffers and buffer sizes.
./src/H5G.c
./src/H5Gpublic.h
./src/H5Gprivate.h
The H5Gget_comment() function returns the size of the comment
including the null terminator. If the object has no comment
then zero is returned. If an error occurs then a negative
value is returned.
./MANIFEST
./tools/Makefile.in
./tools/h5tools.h [NEW]
./tools/h5dump.c [NEW]
Created a library for printing values of datasets in a way
that looks nice. It's not done yet, but I needed it for
debugging the contents of files from Jim Reus.
./tools/h5ls.c
Added the `-d' and `--dump' options which cause the contents
of a dataset to be printed. Added `-w N' and `--width=N'
options to control how wide the raw data output should be. If
you want single-column output then say `-w1'.
Printing dataset values can now handle datasets of any integer
or floating point atomic type. As a special case, integers
which are one byte wide are treated a character strings for
now.
Sample output:
$ h5ls --dump --width=60 banana.hdf
ARCHIVE 0:0:0:744 Dataset {52/Inf}
Data:
(0) "U struct complex { double R; double I; };\012V"
(43) " double;\012"
U 0:0:0:2500 Dataset {256/512}
Data: printing of compound data types is not implemented yet
V 0:0:0:3928 Dataset {256/512}
Data:
(0) 0, 0.015625, 0.03125, 0.046875, 0.0625,
(5) 0.078125, 0.09375, 0.109375, 0.125, 0.140625,
(10) 0.15625, 0.171875, 0.1875, 0.203125, 0.21875,
(15) 0.234375, 0.25, 0.265625, 0.28125, 0.296875,
...
1998-07-24 05:19:17 +08:00
|
|
|
|
FUNC_LEAVE(retval);
|
1998-07-21 05:01:32 +08:00
|
|
|
|
}
|
1998-04-15 00:44:46 +08:00
|
|
|
|
|
1998-09-22 23:27:26 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_unlink
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Unlink a name from a group.
|
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
1998-09-22 23:27:26 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Thursday, September 17, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
|
|
|
|
H5G_unlink(H5G_entry_t *loc, const char *name)
|
|
|
|
|
{
|
|
|
|
|
H5G_entry_t grp_ent, obj_ent;
|
|
|
|
|
size_t len;
|
|
|
|
|
const char *base=NULL;
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5G_unlink, FAIL);
|
|
|
|
|
assert(loc);
|
|
|
|
|
assert(name && *name);
|
|
|
|
|
|
|
|
|
|
/* Get the entry for the group that contains the object to be unlinked */
|
1998-10-15 03:35:08 +08:00
|
|
|
|
if (H5G_namei(loc, name, NULL, &grp_ent, &obj_ent,
|
|
|
|
|
H5G_TARGET_SLINK|H5G_TARGET_MOUNT, NULL)<0) {
|
1998-09-22 23:27:26 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found");
|
|
|
|
|
}
|
1999-07-29 02:25:43 +08:00
|
|
|
|
if (!H5F_addr_defined(grp_ent.header)) {
|
1998-09-22 23:27:26 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL,
|
|
|
|
|
"no containing group specified");
|
|
|
|
|
}
|
|
|
|
|
if (NULL==(base=H5G_basename(name, &len)) || '/'==*base) {
|
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL,
|
|
|
|
|
"problems obtaining object base name");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Remove the name from the symbol table */
|
|
|
|
|
if (H5G_stab_remove(&grp_ent, base)<0) {
|
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to unlink name from symbol table");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE(SUCCEED);
|
|
|
|
|
}
|
1998-09-28 22:20:21 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_move
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Atomically rename an object.
|
|
|
|
|
*
|
1998-10-27 05:18:54 +08:00
|
|
|
|
* Return: Non-negative on success/Negative on failure
|
1998-09-28 22:20:21 +08:00
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Friday, September 25, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
2002-04-27 04:34:46 +08:00
|
|
|
|
* Raymond Lu
|
|
|
|
|
* Thursday, April 18, 2002
|
|
|
|
|
*
|
1998-09-28 22:20:21 +08:00
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
herr_t
|
2002-04-27 04:34:46 +08:00
|
|
|
|
H5G_move(H5G_entry_t *src_loc, const char *src_name, H5G_entry_t *dst_loc,
|
|
|
|
|
const char *dst_name)
|
1998-09-28 22:20:21 +08:00
|
|
|
|
{
|
1998-10-01 04:17:26 +08:00
|
|
|
|
H5G_stat_t sb;
|
|
|
|
|
char *linkval=NULL;
|
|
|
|
|
size_t lv_size=32;
|
|
|
|
|
|
1998-09-28 22:20:21 +08:00
|
|
|
|
FUNC_ENTER(H5G_move, FAIL);
|
2002-04-27 04:34:46 +08:00
|
|
|
|
assert(src_loc);
|
|
|
|
|
assert(dst_loc);
|
1998-09-28 22:20:21 +08:00
|
|
|
|
assert(src_name && *src_name);
|
|
|
|
|
assert(dst_name && *dst_name);
|
|
|
|
|
|
2002-04-27 04:34:46 +08:00
|
|
|
|
if (H5G_get_objinfo(src_loc, src_name, FALSE, &sb)<0) {
|
1998-10-01 04:17:26 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found");
|
1998-09-28 22:20:21 +08:00
|
|
|
|
}
|
1998-10-01 04:17:26 +08:00
|
|
|
|
if (H5G_LINK==sb.type) {
|
|
|
|
|
/*
|
|
|
|
|
* When renaming a symbolic link we rename the link but don't change
|
|
|
|
|
* the value of the link.
|
|
|
|
|
*/
|
|
|
|
|
do {
|
|
|
|
|
if (NULL==(linkval=H5MM_realloc(linkval, 2*lv_size))) {
|
|
|
|
|
HRETURN_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
|
|
|
|
|
"unable to allocate space for symbolic link "
|
|
|
|
|
"value");
|
|
|
|
|
}
|
|
|
|
|
linkval[lv_size-1] = '\0';
|
2002-04-27 04:34:46 +08:00
|
|
|
|
if (H5G_linkval(src_loc, src_name, lv_size, linkval)<0) {
|
1998-10-01 04:17:26 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to read symbolic link value");
|
|
|
|
|
}
|
|
|
|
|
} while (linkval[lv_size-1]);
|
2002-04-27 04:34:46 +08:00
|
|
|
|
if (H5G_link(src_loc, linkval, dst_loc, dst_name, H5G_LINK_SOFT,
|
1998-10-15 03:35:08 +08:00
|
|
|
|
H5G_TARGET_NORMAL)<0) {
|
1998-10-01 04:17:26 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to rename symbolic link");
|
|
|
|
|
}
|
|
|
|
|
H5MM_xfree(linkval);
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
/*
|
|
|
|
|
* Rename the object.
|
|
|
|
|
*/
|
2002-04-27 04:34:46 +08:00
|
|
|
|
if (H5G_link(src_loc, src_name, dst_loc, dst_name, H5G_LINK_HARD,
|
1998-10-15 03:35:08 +08:00
|
|
|
|
H5G_TARGET_MOUNT)<0) {
|
1998-10-01 04:17:26 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to register new name for object");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Remove the old name */
|
2002-04-27 04:34:46 +08:00
|
|
|
|
if (H5G_unlink(src_loc, src_name)<0) {
|
1998-09-28 22:20:21 +08:00
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL,
|
|
|
|
|
"unable to deregister old object name");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE(SUCCEED);
|
|
|
|
|
}
|
1998-10-15 03:35:08 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: H5G_insertion_file
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Given a location and name that specifies a not-yet-existing
|
|
|
|
|
* object return the file into which the object is about to be
|
|
|
|
|
* inserted.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: File pointer
|
|
|
|
|
*
|
|
|
|
|
* Failure: NULL
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Wednesday, October 14, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
H5F_t *
|
|
|
|
|
H5G_insertion_file(H5G_entry_t *loc, const char *name)
|
|
|
|
|
{
|
|
|
|
|
const char *rest;
|
|
|
|
|
H5G_entry_t grp_ent;
|
|
|
|
|
size_t size;
|
|
|
|
|
|
|
|
|
|
FUNC_ENTER(H5G_insertion_file, NULL);
|
|
|
|
|
assert(loc);
|
|
|
|
|
assert(name && *name);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Look up the name to get the containing group and to make sure the name
|
|
|
|
|
* doesn't already exist.
|
|
|
|
|
*/
|
|
|
|
|
if (H5G_namei(loc, name, &rest, &grp_ent, NULL, H5G_TARGET_NORMAL,
|
|
|
|
|
NULL)>=0) {
|
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_EXISTS, NULL, "name already exists");
|
|
|
|
|
}
|
|
|
|
|
H5E_clear();
|
|
|
|
|
|
|
|
|
|
/* Make sure only the last component wasn't resolved */
|
|
|
|
|
rest = H5G_component(rest, &size);
|
|
|
|
|
assert(*rest && size>0);
|
|
|
|
|
rest = H5G_component(rest+size, NULL);
|
|
|
|
|
if (*rest) {
|
|
|
|
|
HRETURN_ERROR(H5E_SYM, H5E_NOTFOUND, NULL,
|
|
|
|
|
"insertion point not found");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FUNC_LEAVE(grp_ent.file);
|
|
|
|
|
}
|