diff options
author | Robert E. McGrath <mcgrath@ncsa.uiuc.edu> | 2003-07-29 21:24:21 (GMT) |
---|---|---|
committer | Robert E. McGrath <mcgrath@ncsa.uiuc.edu> | 2003-07-29 21:24:21 (GMT) |
commit | 014ec80a8f6adb8956db3e172725820fe4298d04 (patch) | |
tree | 4496ce3c06061c2c461bb63b6e285b1c793cdb36 /tools/h5dump | |
parent | 4bb5eef01c9264b017de6145788946a293396439 (diff) | |
download | hdf5-014ec80a8f6adb8956db3e172725820fe4298d04.zip hdf5-014ec80a8f6adb8956db3e172725820fe4298d04.tar.gz hdf5-014ec80a8f6adb8956db3e172725820fe4298d04.tar.bz2 |
[svn-r7276] Purpose:
This is an omibus update to the h5dump program.
1. Fixes bug 888
2. updates XML output to 1.6
Description:
Solution:
Platforms tested:
verbena, arabica, copper (64)
Misc. update:
MANIFEST updated
Need to do release notes.
Diffstat (limited to 'tools/h5dump')
-rw-r--r-- | tools/h5dump/Makefile.in | 79 | ||||
-rw-r--r-- | tools/h5dump/h5dump.c | 1284 | ||||
-rwxr-xr-x | tools/h5dump/testh5dump.sh | 48 | ||||
-rwxr-xr-x | tools/h5dump/testh5dumpxml.sh | 153 |
4 files changed, 1184 insertions, 380 deletions
diff --git a/tools/h5dump/Makefile.in b/tools/h5dump/Makefile.in index 766d00b..22cc63b 100644 --- a/tools/h5dump/Makefile.in +++ b/tools/h5dump/Makefile.in @@ -27,6 +27,7 @@ CPPFLAGS=-I. -I$(srcdir) -I$(top_builddir)/src -I$(top_srcdir)/src \ ## TEST_PROGS=h5dumpgentest TEST_SCRIPTS=$(srcdir)/testh5dump.sh +TEST_SCRIPTS_XML=$(srcdir)/testh5dumpxml.sh ## These are our main targets: library and tools. ## @@ -75,4 +76,82 @@ h5dump: h5dump.lo h5dumpgentest: h5dumpgentest.lo @$(LT_LINK_EXE) $(CFLAGS) -o $@ h5dumpgentest.lo $(LIBTOOLS) $(LIBHDF5) $(LDFLAGS) $(LIBS) +## Runs each test in order, passing $(TEST_FLAGS) to the program. +## Since tests are done in a shell loop, "make -i" does apply inside it. +## Set HDF5_Make_Ignore to a non-blank string to ignore errors inside the loop. +## The timestamps give a rough idea how much time the tests use. +## +tests-xml: $(TEST_PROGS_XML) $(TEST_PROGS_PARA_XML) $(TEST_SCRIPTS_XML) $(LIB) +check-xml test-xml _test-xml: tests-xml + @echo "===Tests begin `date`===" + @for test in $(TEST_PROGS_XML) dummy; do \ + if test $$test != dummy; then \ + echo "============================"; \ + echo "Testing $$test $(TEST_FLAGS)"; \ + echo "============================"; \ + srcdir="$(srcdir)" \ + $(RUNTEST) ./$$test $(TEST_FLAGS) || \ + (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \ + break; \ + echo ""; \ + fi; \ + done; \ + test $$test = dummy || false + @if test -n "$(TEST_PROGS_PARA_XML)"; then \ + echo "**** Hint ****"; \ + echo "Parallel test files reside in the current directory" \ + "by default."; \ + echo "Set HDF5_PARAPREFIX to use another directory. E.g.,"; \ + echo " HDF5_PARAPREFIX=/PFS/user/me"; \ + echo " export HDF5_PARAPREFIX"; \ + echo " make check"; \ + echo "**** end of Hint ****"; \ + fi + @for test in $(TEST_PROGS_PARA_XML) dummy; do \ + if test $$test != dummy; then \ + echo "============================"; \ + echo "Testing $$test $(TEST_FLAGS)"; \ + echo "============================"; \ + srcdir="$(srcdir)" \ + $(RUNPARALLEL) ./$$test $(TEST_FLAGS) || \ + (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \ + break; \ + echo ""; \ + fi; \ + done; \ + test $$test = dummy || false + @for test in $(TEST_SCRIPTS_XML) dummy; do \ + if test $$test != dummy; then \ + echo "============================"; \ + echo "Testing $$test $(TEST_FLAGS)"; \ + echo "============================"; \ + RUNSERIAL="$(RUNSERIAL)" RUNPARALLEL="$(RUNPARALLEL)" \ + srcdir="$(srcdir)" \ + /bin/sh $$test $(TEST_FLAGS) || \ + (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \ + break; \ + echo ""; \ + fi; \ + done; \ + test $$test = dummy || false + @echo "===Tests ended `date`===" + @for d in X $(SUBDIRS); do \ + if test $$d != X; then \ + (set -x; cd $$d && $(MAKE) tests) || exit 1; \ + fi; \ + done + +## Run test with different Virtual File Driver +check-vfd-xml: + @for vfd in $(VFD_LIST) dummy; do \ + if test $$vfd != dummy; then \ + echo "============================"; \ + echo "Testing Virtual File Driver $$vfd"; \ + echo "============================"; \ + HDF5_DRIVER=$$vfd $(MAKE) check; \ + fi; \ + done + +check-all: check check-xml + @CONCLUDE@ diff --git a/tools/h5dump/h5dump.c b/tools/h5dump/h5dump.c index fc39420..a6a1ed0 100644 --- a/tools/h5dump/h5dump.c +++ b/tools/h5dump/h5dump.c @@ -18,6 +18,7 @@ #include "H5private.h" #include "h5tools.h" #include "h5tools_utils.h" +#include <strings.h> /* module-scoped variables */ static const char *progname = "h5dump"; @@ -36,6 +37,7 @@ static int display_all = TRUE; static int display_bb = FALSE; static int display_oid = FALSE; static int display_data = TRUE; +static int display_attr_data = TRUE; static int display_char = FALSE; /*print 1-byte numbers as ASCII? */ static int usingdasho = FALSE; @@ -47,11 +49,21 @@ static int usingdasho = FALSE; static herr_t fill_ref_path_table(hid_t, const char *, void *); /* module-scoped variables for XML option */ +#define DEFAULT_XSD "http://hdf.ncsa.uiuc.edu/DTDs/HDF5-File.xsd" #define DEFAULT_DTD "http://hdf.ncsa.uiuc.edu/DTDs/HDF5-File.dtd" static int doxml = 0; +static int useschema = 1; static const char *xml_dtd_uri = NULL; +static const char *xmlnsprefix="hdf5:"; static hid_t thefile = -1; +struct ref_path_table_entry_t { + hid_t obj; + hobj_ref_t *obj_ref; + char *apath; + H5G_stat_t statbuf; + struct ref_path_table_entry_t *next; +}; /** end XML **/ /* internal functions */ @@ -61,6 +73,9 @@ static herr_t dump_all(hid_t group, const char *name, void *op_data); static char *lookup_ref_path(hobj_ref_t *); static void check_compression(hid_t); static struct ref_path_table_entry_t *ref_path_table_lookup(const char *); +static int xml_name_to_XID(const char *, char *, int , int ); +static int get_next_xid(void); +static haddr_t get_fake_xid (void); /* external functions */ extern int print_data(hid_t, hid_t, int); @@ -293,96 +308,13 @@ static const dump_header standardformat = { /** ** Added for XML ** **/ -/* The 'header' formats for XML -- mostly null - * - * XML output has values embedded in the 'headers', so - * all the XML headers are done on a case by case basis. - */ -static const dump_header xmlformat = { - "xml", /*name */ - "", /*filebegin */ - "</HDF5-File>", /*fileend */ - "", /*bootblockbegin */ - "", /*bootblockend */ - "", /*groupbegin */ - "</Group>", /*groupend */ - "", /*datasetbegin */ - "</Dataset>", /*datasetend */ - "", /*attributebegin */ - "</Attribute>", /*attributeend */ - "<DataType>", /*datatypeend */ - "</DataType>", /*datatypeend */ - "<Dataspace>", /*dataspacebegin */ - "</Dataspace>", /*dataspaceend */ - "<Data>", /*databegin */ - "</Data>", /*dataend */ - "", /*softlinkbegin */ - "", /*softlinkend */ - "", /*subsettingbegin */ - "", /*subsettingend */ - "", /*startbegin */ - "", /*startend */ - "", /*stridebegin */ - "", /*strideend */ - "", /*countbegin */ - "", /*countend */ - "", /*blockbegin */ - "", /*blockend */ - - "", /*fileblockbegin */ - "", /*fileblockend */ - "", /*bootblockblockbegin */ - "", /*bootblockblockend */ - "", /*groupblockbegin */ - "", /*groupblockend */ - "", /*datasetblockbegin */ - "", /*datasetblockend */ - "", /*attributeblockbegin */ - "", /*attributeblockend */ - "", /*datatypeblockbegin */ - "", /*datatypeblockend */ - "", /*dataspaceblockbegin */ - "", /*dataspaceblockend */ - "", /*datablockbegin */ - "", /*datablockend */ - "", /*softlinkblockbegin */ - "", /*softlinkblockend */ - "", /*strblockbegin */ - "", /*strblockend */ - "", /*enumblockbegin */ - "", /*enumblockend */ - "", /*structblockbegin */ - "", /*structblockend */ - "", /*vlenblockbegin */ - "", /*vlenblockend */ - "", /*subsettingblockbegin */ - "", /*subsettingblockend */ - "", /*startblockbegin */ - "", /*startblockend */ - "", /*strideblockbegin */ - "", /*strideblockend */ - "", /*countblockbegin */ - "", /*countblockend */ - "", /*blockblockbegin */ - "", /*blockblockend */ - - "", /*dataspacedescriptionbegin */ - "", /*dataspacedescriptionend */ - "", /*dataspacedimbegin */ - "", /*dataspacedimend */ -}; - -/** XML **/ - -/** - ** Added for XML ** - **/ /* internal functions used by XML option */ static void xml_print_datatype(hid_t); static void xml_print_enum(hid_t); static int xml_print_refs(hid_t, int); static int xml_print_strs(hid_t, int); static hobj_ref_t *ref_path_table_put(hid_t, const char *); +static struct ref_path_table_entry_t *ref_path_table_gen_fake(const char *); static char *xml_escape_the_string(const char *, int); static char *xml_escape_the_name(const char *); @@ -400,9 +332,9 @@ struct handler_t { */ #if 0 /* binary: not implemented yet */ -static const char *s_opts = "hbBHirVa:c:d:f:g:k:l:t:w:xD:o:s:S:"; +static const char *s_opts = "hbBHirVa:c:d:f:g:k:l:t:w:xD:uX:o:s:S:A"; #else -static const char *s_opts = "hBHirVa:c:d:f:g:k:l:t:w:xD:o:s:S:"; +static const char *s_opts = "hBHirVa:c:d:f:g:k:l:t:w:xD:uX:o:s:S:A"; #endif /* 0 */ static struct long_options l_opts[] = { { "help", no_arg, 'h' }, @@ -496,15 +428,24 @@ static struct long_options l_opts[] = { { "strid", require_arg, 'S' }, { "string", no_arg, 'r' }, { "strin", no_arg, 'r' }, + { "use-dtd", no_arg, 'u' }, + { "use-dt", no_arg, 'u' }, + { "use-d", no_arg, 'u' }, + { "use-", no_arg, 'u' }, + { "use", no_arg, 'u' }, + { "us", no_arg, 'u' }, + { "u", no_arg, 'u' }, { "width", require_arg, 'w' }, { "widt", require_arg, 'w' }, { "wid", require_arg, 'w' }, { "wi", require_arg, 'w' }, - { "xml", no_arg, 'x' }, - { "xm", no_arg, 'x' }, { "xml-dtd", require_arg, 'D' }, { "xml-dt", require_arg, 'D' }, { "xml-d", require_arg, 'D' }, + { "xml-ns", require_arg, 'X' }, + { "xml-n", require_arg, 'X' }, + { "xml", no_arg, 'x' }, + { "xm", no_arg, 'x' }, { NULL, 0, '\0' } }; @@ -607,6 +548,7 @@ usage(const char *prog) fprintf(stdout, " -h, --help Print a usage message and exit\n"); fprintf(stdout, " -B, --bootblock Print the content of the boot block\n"); fprintf(stdout, " -H, --header Print the header only; no data is displayed\n"); + fprintf(stdout, " -A Print the header and value of attributes; data of datasets is not displayed\n"); fprintf(stdout, " -i, --object-ids Print the object ids\n"); fprintf(stdout, " -r, --string Print 1-byte integer datasets as ASCII\n"); fprintf(stdout, " -V, --version Print version number and exit\n"); @@ -618,9 +560,11 @@ usage(const char *prog) fprintf(stdout, " -o F, --output=F Output raw data into file F\n"); fprintf(stdout, " -t P, --datatype=P Print the specified named data type\n"); fprintf(stdout, " -w N, --width=N Set the number of columns of output\n"); - fprintf(stdout, " -x, --xml Output in XML\n"); - fprintf(stdout, " -D U, --xml-dtd=U Use the DTD at U\n"); - fprintf(stdout, " -- Indicate that all following arguments are non-options.\n"); + fprintf(stdout, " -x, --xml Output in XML using Schema (default)\n"); + fprintf(stdout, " -u, --use-dtd Output in XML using DTD\n"); + fprintf(stdout, " -D U, --xml-dtd=U Use the DTD or schema at U\n"); + fprintf(stdout, " -X S, --xml-ns=S (XML Schema) Use qualified names n the XML\n"); + fprintf(stdout, " \":\": no namespace, default: \"hdf5:\"\n"); fprintf(stdout, " E.g., to dump a file called `-f', use h5dump -- -f\n"); fprintf(stdout, "\n"); fprintf(stdout, " Subsetting is available by using the following options with a dataset\n"); @@ -1145,7 +1089,7 @@ dump_attr(hid_t attr, const char *attr_name, void UNUSED * op_data) if (display_oid) dump_oid(attr_id); - if (display_data) + if (display_data || display_attr_data) dump_data(attr_id, ATTRIBUTE_DATA, NULL); H5Tclose(type); @@ -1255,7 +1199,7 @@ dump_selected_attr(hid_t loc_id, const char *name) if (display_oid) dump_oid(attr_id); - if (display_data) + if (display_data || display_attr_data) dump_data(attr_id, ATTRIBUTE_DATA, NULL); H5Tclose(type); @@ -1323,7 +1267,7 @@ static herr_t dump_all(hid_t group, const char *name, void * op_data) { hid_t obj; - char *buf, *tmp = NULL; + char *targbuf, *tmp = NULL; H5G_stat_t statbuf; int i; herr_t ret = SUCCEED; @@ -1339,7 +1283,7 @@ dump_all(hid_t group, const char *name, void * op_data) switch (statbuf.type) { case H5G_LINK: indentation(indent); - buf = malloc(statbuf.linklen); + targbuf = malloc(statbuf.linklen); if (!doxml) { begin_obj(dump_header_format->softlinkbegin, name, @@ -1347,7 +1291,7 @@ dump_all(hid_t group, const char *name, void * op_data) indentation(indent + COL); } - if (H5Gget_linkval(group, name, statbuf.linklen, buf) < 0) { + if (H5Gget_linkval(group, name, statbuf.linklen, targbuf) < 0) { error_msg(progname, "unable to get link value\n"); d_status = EXIT_FAILURE; ret = FAIL; @@ -1355,36 +1299,67 @@ dump_all(hid_t group, const char *name, void * op_data) /* print the value of a soft link */ if (!doxml) { /* Standard DDL: no modification */ - printf("LINKTARGET \"%s\"\n", buf); + printf("LINKTARGET \"%s\"\n", targbuf); } else { /* XML */ + char *linkxid = malloc(100); + char *parentxid = malloc(100); + char *targetxid = malloc(100); + char *t_prefix = xml_escape_the_name(strcmp(prefix,"") ? prefix : "/"); char *t_name = xml_escape_the_name(name); - char *t_buf = xml_escape_the_name(buf); - char *t_prefix = xml_escape_the_name(prefix); - char *tmp2, *t_tmp2, *t_tmp; + char *t_targbuf = xml_escape_the_name(targbuf); + char *tmp2, *t_tmp; + int res; tmp2 = malloc(strlen(prefix) + statbuf.linklen + 1); strcpy(tmp2, prefix); - if (buf && buf[0] == '/') - strcat(tmp2, buf); + if (targbuf && targbuf[0] == '/') + strcpy(tmp2, targbuf); else - strcat(strcat(tmp2, "/"), buf); + strcat(strcat(tmp2, "/"), targbuf); t_tmp = xml_escape_the_name(strcat(strcat(tmp, "/"), name)); - t_tmp2 = xml_escape_the_name(tmp2); - - printf("<SoftLink LinkName=\"%s\" Target=\"%s\" " - "TargetObj=\"%s\" OBJ-XID=\"%s\" Source=\"%s\"/>\n", - t_name, t_buf, t_tmp2, t_tmp, - (strcmp(prefix, "") ? t_prefix : "root")); + res = xml_name_to_XID(t_tmp,linkxid,100,1); + res = xml_name_to_XID(prefix,parentxid,100,1); + + res = xml_name_to_XID(tmp2,targetxid,100,0); + + if (res == 0) { + /* target obj found */ + printf("<%sSoftLink LinkName=\"%s\" " + "OBJ-XID=\"%s\" " + "H5SourcePath=\"%s\" " + "TargetPath=\"%s\" TargetObj=\"%s\" " + "Parents=\"%s\" H5ParentPaths=\"%s\" />\n", + xmlnsprefix, + t_name, + linkxid, + t_tmp, + t_targbuf, targetxid, + parentxid, t_prefix); + free(targetxid); + } else { + /* dangling link -- omit from xml attributes */ + printf("<%sSoftLink LinkName=\"%s\" " + "OBJ-XID=\"%s\" " + "H5SourcePath=\"%s\" " + "TargetPath=\"%s\" " + "Parents=\"%s\" H5ParentPaths=\"%s\" />\n", + xmlnsprefix, + t_name, + linkxid, + t_tmp, + t_targbuf, + parentxid, t_prefix); + } free(t_name); - free(t_buf); - free(t_prefix); + free(t_targbuf); free(t_tmp); - free(t_tmp2); free(tmp2); + free(linkxid); + free(parentxid); } } @@ -1394,7 +1369,7 @@ dump_all(hid_t group, const char *name, void * op_data) dump_header_format->softlinkblockend); } - free(buf); + free(targbuf); break; case H5G_GROUP: @@ -1455,24 +1430,44 @@ dump_all(hid_t group, const char *name, void * op_data) dump_header_format->datasetblockend); } else { /* the XML version */ - char *t_name = xml_escape_the_name(name); - char *t_tmp = xml_escape_the_name(strcat(strcat(tmp, "/"), name)); - char *t_prefix = xml_escape_the_name(prefix); - char *t_objname = xml_escape_the_name(dset_table->objs[i].objname); - - printf("<Dataset Name=\"%s\" OBJ-XID=\"%s\" Parents=\"%s\">\n", - t_name, t_tmp, - (strcmp(prefix, "") ? t_prefix : "root")); + int res; + char *t_tmp; + char *t_prefix; + char *t_name; + char *dsetxid = malloc(100); + char *parentxid = malloc(100); + char *pointerxid = malloc(100); + char *tx_tmp = malloc(strlen(tmp)+strlen(name)+1); + strcpy(tx_tmp,tmp); + t_tmp = xml_escape_the_name(strcat(strcat(tx_tmp, "/"), name)); + t_prefix = xml_escape_the_name(prefix); + t_name = xml_escape_the_name(name); + res = xml_name_to_XID( strcat(strcat(tmp,"/"),name), dsetxid,100,1); + res = xml_name_to_XID( prefix ,parentxid,100,1); + + printf("<%sDataset Name=\"%s\" OBJ-XID=\"%s-%d\" " + "H5Path=\"%s\" Parents=\"%s\" " + "H5ParentPaths=\"%s\">\n", + xmlnsprefix, + t_name, dsetxid, get_next_xid(), + t_tmp, parentxid, + (strcmp(prefix, "") ? t_prefix : "/")); indentation(indent + COL); - printf("<DatasetPtr OBJ-XID=\"%s\"/>\n", t_objname); + res = xml_name_to_XID(dset_table->objs[i].objname,pointerxid,100,1); + printf("<%sDatasetPtr OBJ-XID=\"%s\" H5Path=\"%s\"/>\n", + xmlnsprefix, + pointerxid,t_tmp); indentation(indent); - printf("%s\n", dump_header_format->datasetend); + printf("</%sDataset>\n", xmlnsprefix); free(t_name); + free(dsetxid); + free(parentxid); + free(pointerxid); free(t_tmp); + free(tx_tmp); free(t_prefix); - free(t_objname); } H5Dclose(obj); @@ -2489,6 +2484,12 @@ parse_start: break; case 'H': display_data = FALSE; + display_attr_data = FALSE; + last_was_dset = FALSE; + break; + case 'A': + display_data = FALSE; + display_attr_data = TRUE; last_was_dset = FALSE; break; case 'i': @@ -2586,13 +2587,35 @@ parse_start: case 'x': /* select XML output */ doxml = TRUE; - dump_header_format = &xmlformat; + useschema = TRUE; + dump_header_format = NULL; + dump_function_table = &xml_function_table; + break; + case 'u': + doxml = TRUE; + useschema = FALSE; + xmlnsprefix = ""; + dump_header_format = NULL; dump_function_table = &xml_function_table; break; case 'D': - /* specify alternative XML DTD */ + /* specify alternative XML DTD or schema */ + /* To Do: check format of this value? */ xml_dtd_uri = opt_arg; break; + case 'X': + /* specify XML namespace (default="hdf5:"), or none */ + /* To Do: check format of this value? */ + if (!useschema) { + usage(progname); + exit(EXIT_FAILURE); + } + if (strcmp(opt_arg,":") == 0) { + xmlnsprefix = ""; + } else { + xmlnsprefix = opt_arg; + } + break; /** end XML parameters **/ /** begin subsetting parameters **/ @@ -2736,6 +2759,10 @@ free_handler(struct handler_t *hand, int len) * Moved command line parsing to separate function. Made various * "display_*" flags global. * + * REMcG + * August 2003 + * Major upgrade to XML support. + * *------------------------------------------------------------------------- */ int @@ -2770,10 +2797,6 @@ main(int argc, const char *argv[]) error_msg(progname, "option \"%s\" not available for XML\n", "--boot-block"); exit(EXIT_FAILURE); - } else if (!display_data) { - error_msg(progname, "option \"%s\" not available for XML\n", - "--header"); - exit(EXIT_FAILURE); } else if (display_oid == 1) { error_msg(progname, "option \"%s\" not available for XML\n", "--object-ids"); @@ -2842,8 +2865,19 @@ main(int argc, const char *argv[]) strcpy(prefix, ""); /* make sure the URI is initialized to something */ - if (xml_dtd_uri == NULL) - xml_dtd_uri = DEFAULT_DTD; + if (xml_dtd_uri == NULL) { + if (useschema) { + xml_dtd_uri = DEFAULT_XSD; + } else { + xml_dtd_uri = DEFAULT_DTD; + xmlnsprefix = ""; + } + } else { + if (useschema && strcmp(xmlnsprefix,"")) { + error_msg(progname, "Cannot set Schema URL for a qualified namespace--use -X or -U option with -D \n"); + exit(EXIT_FAILURE); + } + } } /* find all shared objects */ @@ -2869,9 +2903,29 @@ main(int argc, const char *argv[]) dump_header_format->fileblockbegin); } else { printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); - printf("<!DOCTYPE HDF5-File PUBLIC \"HDF5-File.dtd\" \"%s\">\n", - xml_dtd_uri); - printf("<HDF5-File>\n"); + /* alternative first element, depending on schema or DTD. */ + if (useschema) { + if (strcmp(xmlnsprefix,"") == 0) { + printf("<HDF5-File xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"%s\">\n", + xml_dtd_uri); + } else { +/* TO DO: make -url option work in this case (may need new option) */ + char * ns; + char *indx; + ns = strdup(xmlnsprefix); + indx = rindex(ns,(int)':'); + if (indx) *indx = '\0'; + + printf("<%sHDF5-File xmlns:%s=\"http://hdf.ncsa.uiuc.edu/DTDs/HDF5-File\" " + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " + "xsi:schemaLocation=\"http://hdf.ncsa.uiuc.edu/DTDs/HDF5File " + "http://hdf.ncsa.uiuc.edu/DTDs/HDF5-File.xsd\">\n",xmlnsprefix,ns); + } + } else { + printf("<!DOCTYPE HDF5-File PUBLIC \"HDF5-File.dtd\" \"%s\">\n", + xml_dtd_uri); + printf("<HDF5-File>\n"); + } } if (display_bb) @@ -2907,7 +2961,7 @@ main(int argc, const char *argv[]) end_obj(dump_header_format->fileend, dump_header_format->fileblockend); } else { - printf("%s\n", dump_header_format->fileend); + printf("</%sHDF5-File>\n", xmlnsprefix); } done: @@ -3065,12 +3119,6 @@ print_enum(hid_t type) * method of selecting which one. */ -struct ref_path_table_entry_t { - hsize_t obj; - hobj_ref_t *obj_ref; - char *apath; - struct ref_path_table_entry_t *next; -}; struct ref_path_table_entry_t *ref_path_table = NULL; /* the table */ int npte = 0; /* number of entries in the table */ @@ -3146,6 +3194,7 @@ static hobj_ref_t * ref_path_table_put(hid_t obj, const char *path) { hobj_ref_t *ref; + H5G_stat_t *sb; herr_t status; struct ref_path_table_entry_t *pte; @@ -3183,6 +3232,16 @@ ref_path_table_put(hid_t obj, const char *path) pte->apath = HDstrdup(path); + sb = (H5G_stat_t *) malloc(sizeof(H5G_stat_t)); + if (sb == NULL) { + /* fatal error? */ + free(pte); + return NULL; + } + H5Gget_objinfo(thefile, path, TRUE, sb); + + memcpy((char *)&(pte->statbuf),(char *)sb,sizeof(H5G_stat_t)); + pte->next = ref_path_table; ref_path_table = pte; @@ -3191,6 +3250,95 @@ ref_path_table_put(hid_t obj, const char *path) return ref; } +/* + * counter used to disambiguate multiple instances of same object. + */ +static int xid = 1; + +static int get_next_xid() { + return xid++; +} + +/* + * This counter is used to create fake object ID's + * The idea is to set it to the largest possible offest, which + * minimizes the chance of collision with a real object id. + * + */ +haddr_t fake_xid = HADDR_MAX; +static haddr_t +get_fake_xid () { + return (fake_xid--); +} + +/* + * for an object that does not have an object id (e.g., soft link), + * create a table entry with a fake object id as the key. + */ + +static struct ref_path_table_entry_t * +ref_path_table_gen_fake(const char *path) +{ + union { + hobj_ref_t rr; + char cc[16]; + unsigned long ll[2]; + } uu; + hobj_ref_t *ref; + H5G_stat_t *sb; + struct ref_path_table_entry_t *pte; + + /* look up 'obj'. If already in table, return */ + pte = ref_path_table_lookup(path); + if (pte != NULL) { + return pte; + } + + /* if not found, then make new entry */ + + pte = (struct ref_path_table_entry_t *) + malloc(sizeof(struct ref_path_table_entry_t)); + if (pte == NULL) { + /* fatal error? */ + return NULL; + } + + pte->obj = (hid_t)-1; + + sb = (H5G_stat_t *) malloc(sizeof(H5G_stat_t)); + if (sb == NULL) { + /* fatal error? */ + free(pte); + return NULL; + } + sb->objno[0] = (unsigned long)get_fake_xid(); + sb->objno[1] = (unsigned long)get_fake_xid(); + + memcpy((char *)&(pte->statbuf),(char *)sb,sizeof(H5G_stat_t)); + + ref = (hobj_ref_t *) malloc(sizeof(hobj_ref_t)); + if (ref == NULL) { + free(pte); + return NULL; + } + + uu.ll[0] = sb->objno[0]; + uu.ll[1] = sb->objno[1]; + + memcpy((char *)ref,(char *)&uu.rr,sizeof(ref)); + + pte->obj_ref = ref; + + pte->apath = HDstrdup(path); + + pte->next = ref_path_table; + ref_path_table = pte; + + npte++; + + return pte; +} + /*------------------------------------------------------------------------- * Function: lookup_ref_path * @@ -3318,6 +3466,55 @@ fill_ref_path_table(hid_t group, const char *name, void UNUSED * op_data) return 0; } +/* + * create a string suitable for and XML NCNAME. Uses the + * object reference to create the string. + * + * 'gen'; 0 - return null if not found + * 1 - generate a fake entry and return fake id. + */ + +int +xml_name_to_XID(const char *str , char *outstr, int outlen, int gen) +{ + struct ref_path_table_entry_t *r; + char *os; + + if (outlen < 22) return 1; + + os = outstr; + + r = ref_path_table_lookup(str); + if (r == NULL) { + if (strlen(str) == 0) { + r = ref_path_table_lookup("/"); + if (r == NULL) { + if (gen) { + sprintf(os," "); /* ?? */ + r = ref_path_table_gen_fake(str); + sprintf(os,"xid_%lu-%lu",r->statbuf.objno[0],r->statbuf.objno[1]); + return 0; + } else { + return 1; + } + } + } else { + if (gen) { + sprintf(os," "); /* ?? */ + r = ref_path_table_gen_fake(str); + sprintf(os,"xid_%lu-%lu",r->statbuf.objno[0],r->statbuf.objno[1]); + return 0; + } else { + return 1; + } + } + } + + sprintf(os,"xid_%lu-%lu",r->statbuf.objno[0],r->statbuf.objno[1]); + + return(0); +} + static const char *quote = """; static const char *amp = "&"; static const char *lt = "<"; @@ -3546,13 +3743,13 @@ xml_print_datatype(hid_t type) switch (H5Tget_class(type)) { case H5T_INTEGER: indentation(indent); - printf("<AtomicType>\n"); + printf("<%sAtomicType>\n",xmlnsprefix); indent += COL; - /* <IntegerType ByteOrder="bo" Sign="torf" Size="bytes"/> */ + /* <hdf5:IntegerType ByteOrder="bo" Sign="torf" Size="bytes"/> */ ord = H5Tget_order(type); sgn = H5Tget_sign(type); indentation(indent); - printf("<IntegerType ByteOrder=\""); + printf("<%sIntegerType ByteOrder=\"",xmlnsprefix); switch (ord) { case H5T_ORDER_LE: printf("LE"); @@ -3581,20 +3778,20 @@ xml_print_datatype(hid_t type) printf("\" />\n"); indent -= COL; indentation(indent); - printf("</AtomicType>\n"); + printf("</%sAtomicType>\n",xmlnsprefix); break; case H5T_FLOAT: - /* <FloatType ByteOrder="bo" Size="bytes" + /* <hdf5:FloatType ByteOrder="bo" Size="bytes" SignBitLocation="bytes" ExponentBits="eb" ExponentLocation="el" MantissaBits="mb" MantissaLocation="ml" /> */ ord = H5Tget_order(type); indentation(indent); - printf("<AtomicType>\n"); + printf("<%sAtomicType>\n",xmlnsprefix); indent += COL; indentation(indent); - printf("<FloatType ByteOrder=\""); + printf("<%sFloatType ByteOrder=\"",xmlnsprefix); switch (ord) { case H5T_ORDER_LE: printf("LE"); @@ -3616,33 +3813,33 @@ xml_print_datatype(hid_t type) (unsigned long)msize, (unsigned long)mpos); indent -= COL; indentation(indent); - printf("</AtomicType>\n"); + printf("</%sAtomicType>\n",xmlnsprefix); break; case H5T_TIME: indentation(indent); - printf("<AtomicType>\n"); + printf("<%sAtomicType>\n",xmlnsprefix); indent += COL; indentation(indent); - printf("<TimeType />\n"); + printf("<%sTimeType />\n",xmlnsprefix); printf("<!-- H5T_TIME: not yet implemented -->"); indent -= COL; indentation(indent); - printf("</AtomicType>\n"); + printf("</%sAtomicType>\n",xmlnsprefix); break; case H5T_STRING: - /* <StringType Cset="cs" StrSize="chars" StrPad="pad" /> */ + /* <hdf5:StringType Cset="cs" StrSize="chars" StrPad="pad" /> */ size = H5Tget_size(type); str_pad = H5Tget_strpad(type); cset = H5Tget_cset(type); is_vlstr = H5Tis_variable_str(type); indentation(indent); - printf("<AtomicType>\n"); + printf("<%sAtomicType>\n",xmlnsprefix); indent += COL; indentation(indent); - printf("<StringType Cset=\""); + printf("<%sStringType Cset=\"",xmlnsprefix); if (cset == H5T_CSET_ASCII) { printf("H5T_CSET_ASCII\" "); } else { @@ -3663,17 +3860,17 @@ xml_print_datatype(hid_t type) } indent -= COL; indentation(indent); - printf("</AtomicType>\n"); + printf("</%sAtomicType>\n",xmlnsprefix); break; case H5T_BITFIELD: - /* <BitfieldType ByteOrder="bo" Size="bytes"/> */ + /* <hdf5:BitfieldType ByteOrder="bo" Size="bytes"/> */ ord = H5Tget_order(type); indentation(indent); - printf("<AtomicType>\n"); + printf("<%sAtomicType>\n",xmlnsprefix); indent += COL; indentation(indent); - printf("<BitfieldType ByteOrder=\""); + printf("<%sBitfieldType ByteOrder=\"",xmlnsprefix); switch (ord) { case H5T_ORDER_LE: printf("LE"); @@ -3689,22 +3886,21 @@ xml_print_datatype(hid_t type) printf("\" Size=\"%lu\"/>\n", (unsigned long)size); indent -= COL; indentation(indent); - printf("</AtomicType>\n"); + printf("</%sAtomicType>\n",xmlnsprefix); break; case H5T_OPAQUE: - /* <OpaqueType Tag="tag" Size="bytes" /> */ - + /* <hdf5:OpaqueType Tag="tag" Size="bytes" /> */ indentation(indent); - printf("<AtomicType>\n"); + printf("<%sAtomicType>\n",xmlnsprefix); indent += COL; indentation(indent); - printf("<OpaqueType Tag=\"%s\" ", H5Tget_tag(type)); + printf("<%sOpaqueType Tag=\"%s\" ",xmlnsprefix, H5Tget_tag(type)); size = H5Tget_size(type); printf("Size=\"%lu\"/>\n", (unsigned long)size); indent -= COL; indentation(indent); - printf("</AtomicType>\n"); + printf("</%sAtomicType>\n",xmlnsprefix); break; case H5T_COMPOUND: @@ -3716,19 +3912,26 @@ xml_print_datatype(hid_t type) if (i >= 0) { /* This should be defined somewhere else */ + /* These 2 cases are handled the same right now, but + probably will have something different eventually */ + int res; + char * dtxid = malloc(100); + res = xml_name_to_XID(type_table->objs[i].objname,dtxid,100,1); if (!type_table->objs[i].recorded) { /* 'anonymous' NDT. Use it's object num. as it's name. */ - printf("<NamedDataTypePtr OBJ-XID=\"/#%lu:%lu\"/>\n", - type_table->objs[i].objno[0], - type_table->objs[i].objno[1]); + printf("<%sNamedDataTypePtr OBJ-XID=\"/%s\"/>\n", + xmlnsprefix, + dtxid); } else { /* point to the NDT by name */ char *t_objname = xml_escape_the_name(type_table->objs[i].objname); - - printf("<NamedDataTypePtr OBJ-XID=\"%s\"/>\n", t_objname); - free(t_objname); + printf("<%sNamedDataTypePtr OBJ-XID=\"%s\" H5Path=\"%s\"/>\n", + xmlnsprefix, + dtxid,t_objname); + free(t_objname); } + free(dtxid); } else { printf("<!-- h5dump error: unknown committed type. -->\n"); d_status = EXIT_FAILURE; @@ -3739,11 +3942,11 @@ xml_print_datatype(hid_t type) nmembers = H5Tget_nmembers(type); indentation(indent); - printf("<CompoundType>\n"); + printf("<%sCompoundType>\n",xmlnsprefix); /* List each member Field of the type */ - /* <Field FieldName="name" > */ - /* <DataType > */ + /* <hdf5:Field FieldName="name" > */ + /* <hdf5:DataType > */ indent += COL; for (i = 0; i < nmembers; i++) { char *t_fname; @@ -3752,78 +3955,78 @@ xml_print_datatype(hid_t type) mtype = H5Tget_member_type(type, i); indentation(indent); t_fname = xml_escape_the_name(fname); - printf("<Field FieldName=\"%s\">\n", t_fname); + printf("<%sField FieldName=\"%s\">\n",xmlnsprefix, t_fname); free(fname); free(t_fname); indent += COL; indentation(indent); - printf("<DataType>\n"); + printf("<%sDataType>\n",xmlnsprefix); indent += COL; xml_print_datatype(mtype); indent -= COL; indentation(indent); - printf("%s\n", dump_header_format->datatypeend); + printf("</%sDataType>\n",xmlnsprefix); indent -= COL; indentation(indent); - printf("</Field>\n"); + printf("</%sField>\n",xmlnsprefix); } indent -= COL; indentation(indent); - printf("</CompoundType>\n"); + printf("</%sCompoundType>\n",xmlnsprefix); } break; case H5T_REFERENCE: indentation(indent); - printf("<AtomicType>\n"); + printf("<%sAtomicType>\n",xmlnsprefix); indent += COL; indentation(indent); /* Only Object references supported at this time */ - printf("<ReferenceType>\n"); + printf("<%sReferenceType>\n",xmlnsprefix); indentation(indent + COL); - printf("<ObjectReferenceType />\n"); + printf("<%sObjectReferenceType />\n",xmlnsprefix); indentation(indent); - printf("</ReferenceType>\n"); + printf("</%sReferenceType>\n",xmlnsprefix); indent -= COL; indentation(indent); - printf("</AtomicType>\n"); + printf("</%sAtomicType>\n",xmlnsprefix); break; case H5T_ENUM: - /* <EnumType Nelems="ne" > + /* <hdf5:EnumType Nelems="ne" > list Name, values of enum */ nmembs = H5Tget_nmembers(type); indentation(indent); - printf("<AtomicType>\n"); + printf("<%sAtomicType>\n",xmlnsprefix); indent += COL; indentation(indent); - printf("<EnumType Nelems=\"%d\">\n", nmembs); + printf("<%sEnumType Nelems=\"%d\">\n",xmlnsprefix, nmembs); xml_print_enum(type); indentation(indent); - printf("</EnumType>\n"); + printf("</%sEnumType>\n",xmlnsprefix); indent -= COL; indentation(indent); - printf("</AtomicType>\n"); + printf("</%sAtomicType>\n",xmlnsprefix); break; case H5T_VLEN: indentation(indent); - printf("<VLType>\n"); + printf("<%sVLType>\n",xmlnsprefix); super = H5Tget_super(type); indent += COL; indentation(indent); - printf("<DataType>\n"); + printf("<%sDataType>\n",xmlnsprefix); indent += COL; xml_print_datatype(super); indent -= COL; indentation(indent); - printf("%s\n", dump_header_format->datatypeend); + printf("</%sDataType>\n",xmlnsprefix); indent -= COL; indentation(indent); - printf("</VLType>\n"); + printf("</%sVLType>\n",xmlnsprefix); H5Tclose(super); break; @@ -3834,7 +4037,7 @@ xml_print_datatype(hid_t type) /* Print lead-in */ indentation(indent); - printf("<ArrayType Ndims=\""); + printf("<%sArrayType Ndims=\"",xmlnsprefix); ndims = H5Tget_array_ndims(type); printf("%d\">\n", ndims); @@ -3847,13 +4050,14 @@ xml_print_datatype(hid_t type) /* for each dimension, list */ for (j = 0; j < ndims; j++) { indentation(indent); - printf("<ArrayDimension DimSize=\"%u\" DimPerm=\"%u\"/>\n", - (int) dims[j], (int) perm[j]); + printf("<%sArrayDimension DimSize=\"%u\" DimPerm=\"%u\"/>\n", + xmlnsprefix,(int) dims[j], (int) perm[j]); } } else { for (j = 0; j < ndims; j++) { indentation(indent); - printf("<ArrayDimension DimSize=\"%u\" DimPerm=\"0\"/>\n", + printf("<%sArrayDimension DimSize=\"%u\" DimPerm=\"0\"/>\n", + xmlnsprefix, (int) dims[j]); } } @@ -3861,15 +4065,15 @@ xml_print_datatype(hid_t type) indent += COL; indentation(indent); - printf("<DataType>\n"); + printf("<%sDataType>\n",xmlnsprefix); indent += COL; xml_print_datatype(super); indent -= COL; indentation(indent); - printf("%s\n", dump_header_format->datatypeend); + printf("</%sDataType>\n",xmlnsprefix); indent -= COL; indentation(indent); - printf("</ArrayType>\n"); + printf("</%sArrayType>\n",xmlnsprefix); /* Close array base type */ H5Tclose(super); break; @@ -3910,35 +4114,41 @@ xml_dump_datatype(hid_t type) if (i >= 0) { /* Shared data type, must be entered as an object */ + /* These 2 cases are the same now, but may change */ + int res; + char * dtxid = malloc(100); + res = xml_name_to_XID(type_table->objs[i].objname,dtxid,100,1); if (!type_table->objs[i].recorded) { /* anonymous stored data type: following the dumper's current practice: use it's object ref as its name */ - printf("<NamedDataTypePtr OBJ-XID=\"/#%lu:%lu\"/>\n", - type_table->objs[i].objno[0], - type_table->objs[i].objno[1]); + printf("<%sNamedDataTypePtr OBJ-XID=\"%s\"/>\n", + xmlnsprefix, + dtxid); + } else { /* pointer to a named data type already in XML */ char *t_objname = xml_escape_the_name(type_table->objs[i].objname); - - printf("<NamedDataTypePtr OBJ-XID=\"%s\"/>\n", t_objname); - free(t_objname); + printf("<%sNamedDataTypePtr OBJ-XID=\"%s\" H5Path=\"%s\" />\n", + xmlnsprefix, + dtxid,t_objname); + free(t_objname); } + free(dtxid); } else { printf("<!-- h5dump error: unknown committed type. -->\n"); } indent -= COL; return; } - printf("%s %s\n", dump_header_format->datatypebegin, - dump_header_format->datatypeblockbegin); + printf("<%sDataType>\n",xmlnsprefix); indent += COL; xml_print_datatype(type); indent -= COL; indentation(indent); - printf("%s\n", dump_header_format->datatypeend); + printf("</%sDataType>\n",xmlnsprefix); indent -= COL; } @@ -3965,44 +4175,44 @@ xml_dump_dataspace(hid_t space) int i; indentation(indent + COL); - printf("%s\n", dump_header_format->dataspacebegin); + printf("<%sDataspace>\n", xmlnsprefix); if (H5Sis_simple(space)) { indentation(indent + COL + COL); if (ndims == 0) { /* scalar dataspace (just a tag, no XML attrs. defined */ - printf("<ScalarDataspace />\n"); + printf("<%sScalarDataspace />\n",xmlnsprefix); } else { /* simple dataspace */ - /* <SimpleDataspace Ndims="nd"> */ - printf("<SimpleDataspace Ndims=\"%d\">\n", ndims); + /* <hdf5:SimpleDataspace Ndims="nd"> */ + printf("<%sSimpleDataspace Ndims=\"%d\">\n",xmlnsprefix, ndims); - /* print the <Dimension> elements */ + /* print the <hdf5:Dimension> elements */ for (i = 0; i < ndims; i++) { indentation(indent + COL + COL + COL); if (maxsize[i] == H5S_UNLIMITED) { HDfprintf(stdout, - "<Dimension DimSize=\"%Hu\" MaxDimSize=\"UNLIMITED\"/>\n", - size[i]); + "<%sDimension DimSize=\"%Hu\" MaxDimSize=\"UNLIMITED\"/>\n", + xmlnsprefix,size[i]); } else if (maxsize[i] == (hsize_t) 0) { HDfprintf(stdout, - "<Dimension DimSize=\"%Hu\" MaxDimSize=\"%Hu\"/>\n", - size[i], size[i]); + "<%sDimension DimSize=\"%Hu\" MaxDimSize=\"%Hu\"/>\n", + xmlnsprefix,size[i], size[i]); } else { HDfprintf(stdout, - "<Dimension DimSize=\"%Hu\" MaxDimSize=\"%Hu\"/>\n", - size[i], maxsize[i]); + "<%sDimension DimSize=\"%Hu\" MaxDimSize=\"%Hu\"/>\n", + xmlnsprefix, size[i], maxsize[i]); } } indentation(indent + COL + COL); - printf("</SimpleDataspace>\n"); + printf("</%sSimpleDataspace>\n", xmlnsprefix ); } } else { printf("<!-- not yet implemented -->\n"); } indentation(indent + COL); - printf("%s\n", dump_header_format->dataspaceend); + printf("</%sDataspace>\n", xmlnsprefix); } @@ -4046,9 +4256,9 @@ xml_dump_data(hid_t obj_id, int obj_data, struct subset_t UNUSED * sset) /* Print all the values. */ indentation(indent); - printf("%s\n", dump_header_format->databegin); + printf("<%sData>\n", xmlnsprefix); indentation(indent + COL); - printf("<DataFromFile>\n"); + printf("<%sDataFromFile>\n",xmlnsprefix); if (obj_data == DATASET_DATA) { type = H5Dget_type(obj_id); if (H5Tget_class(type) == H5T_REFERENCE) { @@ -4106,9 +4316,9 @@ xml_dump_data(hid_t obj_id, int obj_data, struct subset_t UNUSED * sset) } indentation(indent + COL); - printf("</DataFromFile>\n"); + printf("</%sDataFromFile>\n",xmlnsprefix); indentation(indent); - printf("%s\n", dump_header_format->dataend); + printf("</%sData>\n", xmlnsprefix); indent -= COL; } @@ -4132,7 +4342,7 @@ xml_dump_attr(hid_t attr, const char *attr_name, void UNUSED * op_data) char *t_aname = xml_escape_the_name(attr_name); indentation(indent); - printf("<Attribute Name=\"%s\">\n", t_aname); + printf("<%sAttribute Name=\"%s\">\n",xmlnsprefix, t_aname); free(t_aname); if ((attr_id = H5Aopen_name(attr, attr_name)) >= 0) { @@ -4142,7 +4352,7 @@ xml_dump_attr(hid_t attr, const char *attr_name, void UNUSED * op_data) dump_function_table->dump_dataspace_function(space); dump_function_table->dump_datatype_function(type); - if (display_data) { + if (display_attr_data) { switch (H5Tget_class(type)) { case H5T_INTEGER: case H5T_FLOAT: @@ -4157,13 +4367,14 @@ xml_dump_attr(hid_t attr, const char *attr_name, void UNUSED * op_data) case H5T_TIME: indent += COL; indentation(indent); - printf("<Data>\n"); + printf("<%sData>\n",xmlnsprefix); indentation(indent); printf("<!-- Time data not yet implemented. -->\n"); indentation(indent); - printf("<NoData />\n"); + printf("<%sNoData/>\n",xmlnsprefix); indentation(indent); - printf("<Data>\n"); + printf("<hdf5:Data>\n"); + printf("</%sData>\n",xmlnsprefix); indent -= COL; break; @@ -4175,20 +4386,20 @@ xml_dump_attr(hid_t attr, const char *attr_name, void UNUSED * op_data) case H5T_REFERENCE: indentation(indent); - printf("<Data>\n"); + printf("<%sData>\n",xmlnsprefix); indentation(indent); if (!H5Tequal(type, H5T_STD_REF_OBJ)) { printf("<!-- Note: Region references not supported -->\n"); indentation(indent); - printf("<NoData />\n"); + printf("<%sNoData />\n",xmlnsprefix); } else { - printf("<DataFromFile>\n"); + printf("<%sDataFromFile>\n",xmlnsprefix); xml_print_refs(attr_id, ATTRIBUTE_DATA); indentation(indent); - printf("</DataFromFile>\n"); + printf("</%sDataFromFile>\n",xmlnsprefix); } indentation(indent); - printf("</Data>\n"); + printf("</%sData>\n",xmlnsprefix); break; case H5T_VLEN: @@ -4197,30 +4408,30 @@ xml_dump_attr(hid_t attr, const char *attr_name, void UNUSED * op_data) break; default: indentation(indent); - printf("<Data>\n"); + printf("<%sData>\n",xmlnsprefix); indentation(indent); printf("<!-- Unknown datatype: %d -->\n", H5Tget_class(type)); indentation(indent); - printf("<NoData/>\n"); + printf("<%sNoData/>\n",xmlnsprefix); indentation(indent); - printf("</Data>\n"); + printf("</%sData>\n",xmlnsprefix); break; } } else { /* The case of an attribute never yet written ?? */ indentation(indent); - printf("<Data>\n"); + printf("<%sData>\n",xmlnsprefix); indentation(indent + COL); - printf("<NoData/>\n"); + printf("<%sNoData/>\n",xmlnsprefix); indentation(indent); - printf("</Data>\n"); + printf("</%sData>\n",xmlnsprefix); } H5Tclose(type); H5Sclose(space); H5Aclose(attr_id); indentation(indent); - printf("%s\n", dump_header_format->attributeend); + printf("</%sAttribute>\n", xmlnsprefix ); return SUCCEED; } else { @@ -4228,7 +4439,7 @@ xml_dump_attr(hid_t attr, const char *attr_name, void UNUSED * op_data) indentation(indent + COL); printf("<!-- h5dump error: unable to open attribute. -->\n"); indentation(indent); - printf("%s\n", dump_header_format->attributeend); + printf("</%sAttribute>\n", xmlnsprefix ); d_status = EXIT_FAILURE; return FAIL; } @@ -4251,9 +4462,15 @@ static void xml_dump_named_datatype(hid_t type, const char *name) { int nmembers = 1, x; + int res; hid_t mtype; char *fname; char *tmp; + char * dtxid; + char * parentxid; + char *t_tmp; + char *t_prefix; + char *t_name; tmp = malloc(strlen(prefix) + strlen(name) + 2); strcpy(tmp, prefix); @@ -4261,6 +4478,13 @@ xml_dump_named_datatype(hid_t type, const char *name) strcat(tmp, name); indentation(indent); + /*char **/ dtxid = malloc(100); + /*char **/ parentxid = malloc(100); + /*char **/t_tmp = xml_escape_the_name(tmp); + /*char **/t_prefix = xml_escape_the_name(prefix); + /*char **/t_name = xml_escape_the_name(name); + res = xml_name_to_XID(tmp,dtxid,100,1); + res = xml_name_to_XID(prefix,parentxid,100,1); if (strncmp(name, "#", 1) == 0) { /* Special: this is an 'anonymous' NDT, deleted but still in use. @@ -4270,25 +4494,23 @@ xml_dump_named_datatype(hid_t type, const char *name) in the event we want to do something else in the future. */ - char *t_tmp = xml_escape_the_name(tmp); - char *t_prefix = xml_escape_the_name(prefix); - - printf("<NamedDataType Name=\"%s\" OBJ-XID=\"%s\" Parents=\"%s\">\n", - name, t_tmp, (strcmp(prefix, "") ? t_prefix : "root")); - free(t_tmp); - free(t_prefix); + printf("<%sNamedDataType Name=\"%s\" OBJ-XID=\"%s\" " + "Parents=\"%s\" H5ParentPaths=\"%s\">\n", + xmlnsprefix, + name, dtxid, + parentxid,(strcmp(prefix, "") ? t_prefix : "/")); } else { - char *t_name = xml_escape_the_name(name); - char *t_prefix = xml_escape_the_name(prefix); - char *t_tmp = xml_escape_the_name(tmp); - - printf("<NamedDataType Name=\"%s\" OBJ-XID=\"%s\" Parents=\"%s\">\n", - t_name, t_tmp, (strcmp(prefix, "") ? t_prefix : "root")); - - free(t_name); - free(t_prefix); - free(t_tmp); + printf("<%sNamedDataType Name=\"%s\" OBJ-XID=\"%s\" " + "H5Path=\"%s\" Parents=\"%s\" H5ParentPaths=\"%s\">\n", + xmlnsprefix, + t_name, dtxid, + t_tmp, parentxid, (strcmp(prefix, "") ? t_prefix : "/")); } + free(dtxid); + free(parentxid); + free(t_tmp); + free(t_prefix); + free(t_name); indent += COL; @@ -4297,9 +4519,9 @@ xml_dump_named_datatype(hid_t type, const char *name) nmembers = H5Tget_nmembers(type); indentation(indent); - printf("<DataType>\n"); + printf("<%sDataType>\n",xmlnsprefix); indentation(indent); - printf("<CompoundType>\n"); + printf("<%sCompoundType>\n",xmlnsprefix); indent += COL; for (x = 0; x < nmembers; x++) { @@ -4309,7 +4531,7 @@ xml_dump_named_datatype(hid_t type, const char *name) mtype = H5Tget_member_type(type, x); indentation(indent); t_fname = xml_escape_the_name(fname); - printf("<Field FieldName=\"%s\">\n", t_fname); + printf("<%sField FieldName=\"%s\">\n",xmlnsprefix, t_fname); free(fname); free(t_fname); @@ -4320,50 +4542,48 @@ xml_dump_named_datatype(hid_t type, const char *name) /* Nested compound type: recur */ indentation(indent); - printf("%s %s\n", dump_header_format->datatypebegin, - dump_header_format->datatypeblockbegin); + printf("<%sDataType>\n",xmlnsprefix); indent += COL; xml_print_datatype(mtype); indent -= COL; indentation(indent); - printf("%s\n", dump_header_format->datatypeend); + printf("</%sDataType>\n",xmlnsprefix); indent -= COL; } else { indent += COL; indentation(indent); - printf("%s %s\n", dump_header_format->datatypebegin, - dump_header_format->datatypeblockbegin); + printf("<%sDataType>\n",xmlnsprefix); indent += COL; xml_print_datatype(mtype); indent -= COL; indentation(indent); - printf("%s\n", dump_header_format->datatypeend); + printf("</%sDataType>\n",xmlnsprefix); indent -= COL; } indentation(indent); - printf("</Field>\n"); + printf("</%sField>\n",xmlnsprefix); } indent -= COL; indentation(indent); - printf("</CompoundType>\n"); + printf("</%sCompoundType>\n",xmlnsprefix); indentation(indent); - printf("</DataType>\n"); + printf("</%sDataType>\n",xmlnsprefix); } else { /* Other data types: call print_datatype */ indentation(indent); - printf("<DataType>\n"); + printf("<%sDataType>\n",xmlnsprefix); indent += COL; xml_print_datatype(type); indent -= COL; indentation(indent); - printf("</DataType>\n"); + printf("</%sDataType>\n",xmlnsprefix); } indent -= COL; indentation(indent); - printf("</NamedDataType>\n"); + printf("</%sNamedDataType>\n",xmlnsprefix); } /*------------------------------------------------------------------------- @@ -4390,9 +4610,14 @@ xml_dump_group(hid_t gid, const char *name) int i; int isRoot = 0; int xtype; + char *ptrstr; + char *t_objname; + char *par_name; if (strcmp(name, "/") == 0) { isRoot = 1; + tmp = malloc(2); + strcpy(tmp, "/"); } else { tmp = malloc(strlen(prefix) + strlen(name) + 2); strcpy(tmp, prefix); @@ -4409,20 +4634,6 @@ xml_dump_group(hid_t gid, const char *name) indentation(indent); - if (isRoot) { - printf("<RootGroup OBJ-XID=\"root\">\n"); - } else { - char *t_name = xml_escape_the_name(name); - char *t_tmp = xml_escape_the_name(tmp); - char *t_par = xml_escape_the_name(par); - - printf("<Group Name=\"%s\" OBJ-XID=\"%s\" Parents=\"%s\" >\n", - t_name, t_tmp, (strcmp(prefix, "") ? t_par : "root")); - free(t_name); - free(t_tmp); - free(t_par); - } - indent += COL; H5Gget_objinfo(gid, ".", TRUE, &statbuf); @@ -4437,14 +4648,68 @@ xml_dump_group(hid_t gid, const char *name) d_status = EXIT_FAILURE; } else if (group_table->objs[i].displayed) { /* already seen: enter a groupptr */ - char *t_objname = xml_escape_the_name(group_table->objs[i].objname); + int res; + char *t_name = xml_escape_the_name(name); + char *grpxid = malloc(100); + char *parentxid = malloc(100); + if (isRoot) { + /* probably can't happen! */ + res = xml_name_to_XID("/",grpxid,100,1); + printf("<%sRootGroup OBJ-XID=\"%s\" H5Path=\"%s\">\n", + xmlnsprefix,grpxid,"/"); + } else { + t_objname = xml_escape_the_name(group_table->objs[i].objname); + par_name = xml_escape_the_name(par); + res = xml_name_to_XID(tmp,grpxid,100,1); + res = xml_name_to_XID(par,parentxid,100,1); + printf("<%sGroup Name=\"%s\" OBJ-XID=\"%s-%d\" H5Path=\"%s\" " + "Parents=\"%s\" H5ParentPaths=\"%s\">\n", + xmlnsprefix,t_name, grpxid, get_next_xid(), + t_objname, parentxid, par_name); + free(t_objname); + free(par_name); + } + free(t_name); + free(grpxid); indentation(indent + COL); - printf("<GroupPtr OBJ-XID=\"%s\"/>\n", t_objname); + ptrstr = malloc(100); + t_objname = xml_escape_the_name(group_table->objs[i].objname); + par_name = xml_escape_the_name(par); + res = xml_name_to_XID(par,parentxid,100,1); + res = xml_name_to_XID(group_table->objs[i].objname,ptrstr,100,1); + printf("<%sGroupPtr OBJ-XID=\"%s\" H5Path=\"%s\" " + "Parents=\"%s\" H5ParentPaths=\"%s\" />\n", + xmlnsprefix, + ptrstr, t_objname, parentxid, par_name); free(t_objname); + free(parentxid); + } else { + /* first time this group has been seen -- describe it */ - free(group_table->objs[i].objname); + int res; + char *t_name = xml_escape_the_name(name); + char *grpxid = malloc(100); + char *parentxid = malloc(100); + if (isRoot) { + res = xml_name_to_XID("/",grpxid,100,1); + printf("<%sRootGroup OBJ-XID=\"%s\" H5Path=\"%s\">\n", + xmlnsprefix,grpxid,"/"); + } else { + char *t_tmp = xml_escape_the_name(tmp); + par_name = xml_escape_the_name(par); + res = xml_name_to_XID(tmp,grpxid,100,1); + res = xml_name_to_XID(par,parentxid,100,1); + printf("<%sGroup Name=\"%s\" OBJ-XID=\"%s\" H5Path=\"%s\" " + "Parents=\"%s\" H5ParentPaths=\"%s\" >\n", + xmlnsprefix,t_name, grpxid, t_tmp, parentxid, par_name); + free(t_tmp); + free(par_name); + } + free(t_name); + free(grpxid); + free(parentxid); group_table->objs[i].objname = HDstrdup(prefix); group_table->objs[i].displayed = 1; @@ -4477,8 +4742,34 @@ xml_dump_group(hid_t gid, const char *name) H5Giterate(gid, ".", NULL, dump_all, (void *) &xtype); xtype = H5G_LINK; H5Giterate(gid, ".", NULL, dump_all, (void *) &xtype); + } } else { + + /* only link -- must be first time! */ + int res; + char *t_name = xml_escape_the_name(name); + char *grpxid = malloc(100); + char *parentxid = malloc(100); + if (isRoot) { + res = xml_name_to_XID("/",grpxid,100,1); + printf("<%sRootGroup OBJ-XID=\"%s\" H5Path=\"%s\">\n", + xmlnsprefix,grpxid,"/"); + } else { + char *t_tmp = xml_escape_the_name(tmp); + par_name = xml_escape_the_name(par); + res = xml_name_to_XID(tmp,grpxid,100,1); + res = xml_name_to_XID(par,parentxid,100,1); + printf("<%sGroup Name=\"%s\" OBJ-XID=\"%s\" H5Path=\"%s\" " + "Parents=\"%s\" H5ParentPaths=\"%s\" >\n", + xmlnsprefix,t_name, grpxid, t_tmp, + parentxid, par_name); + free(t_tmp); + free(par_name); + } + free(t_name); + free(grpxid); + free(parentxid); /* 1. do all the attributes of the group */ H5Aiterate(gid, NULL, dump_function_table->dump_attribute_function, NULL); @@ -4507,18 +4798,17 @@ xml_dump_group(hid_t gid, const char *name) H5Giterate(gid, ".", NULL, dump_all, (void *) &xtype); xtype = H5G_LINK; H5Giterate(gid, ".", NULL, dump_all, (void *) &xtype); + } indent -= COL; indentation(indent); if (isRoot) { - printf("</RootGroup>\n"); + printf("</%sRootGroup>\n",xmlnsprefix); } else { - printf("%s\n", dump_header_format->groupend); + printf("</%sGroup>\n" ,xmlnsprefix); } -/* don't free this!!! free(tmp); -*/ } /*------------------------------------------------------------------------- @@ -4765,13 +5055,229 @@ check_compression(hid_t dcpl) &cd_values, 20, namebuf); if (filter == H5Z_FILTER_DEFLATE) { indentation(indent + COL); - printf("<Compression />\n"); + printf("<%sCompression />\n",xmlnsprefix); indentation(indent + COL); printf("<!-- Compression parameter %d -->\n", cd_values); } } } +/*------------------------------------------------------------------------- + * Function: check_filters + * + * Purpose: private function to check for the filters and + * put tags in the XML. + * + * Return: void + * + * Programmer: REMcG + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static void +check_filters(hid_t dcpl) +{ + int nfilt; + int i; + H5Z_filter_t filter; + char namebuf[120]; + size_t cd_nelmts = 20; + unsigned int cd_values[20]; + unsigned int flags; + nfilt = H5Pget_nfilters(dcpl); + if (nfilt <= 0) + return; + for (i = 0; i < nfilt; i++) { + filter = H5Pget_filter(dcpl, i, &flags, + (size_t *) &cd_nelmts, + cd_values, 120, namebuf); + if (filter == H5Z_FILTER_DEFLATE) { + indentation(indent + COL); + printf("<%sDeflate Level=\"",xmlnsprefix); + if (cd_nelmts < 1) { + /* not sure what this means? */ + printf("6"); + } else { + printf("%d",cd_values[0]); + } + printf("\"/>\n"); + } else if (filter == H5Z_FILTER_FLETCHER32) { + indentation(indent + COL); + printf("<%sFletcher32 />",xmlnsprefix); + } else if (filter == H5Z_FILTER_SHUFFLE) { + indentation(indent + COL); + printf("<%sShuffle />",xmlnsprefix); + } else if (filter == H5Z_FILTER_SZIP) { +/* 3 private values: can't be set, but can be read. + Note: these are defined in H5Zprivate, they are + duplicated here. + */ +#define H5_SZIP_LSB_OPTION_MASK 8 +#define H5_SZIP_MSB_OPTION_MASK 16 +#define H5_SZIP_RAW_OPTION_MASK 128 + indentation(indent + COL); + printf("<%sSZIP ",xmlnsprefix); + if (cd_nelmts < 2) { + /* no pixels ? */ + printf("Pixels_per_block=\"-1\" "); + } else { + printf("Pixels_per_block=\"%d\" ",cd_values[1]); + } + /* analyse the options mask */ + if (cd_values[0] & H5_SZIP_CHIP_OPTION_MASK) { + printf("Mode =\"Hardware\" "); + } else if (cd_values[0] & H5_SZIP_ALLOW_K13_OPTION_MASK) { + printf("Mode =\"K13\" "); + } + printf("Coding=\""); + if (cd_values[0] & H5_SZIP_EC_OPTION_MASK) { + printf("Entropy"); + } else if (cd_values[0] & H5_SZIP_NN_OPTION_MASK) { + printf("NN"); + } + printf("\" "); + + printf("ByteOrder=\""); + if (cd_values[0] & H5_SZIP_LSB_OPTION_MASK) { + printf("LSB"); + } else if (cd_values[0] & H5_SZIP_MSB_OPTION_MASK) { + printf("MSB"); + } + printf("\" "); + + if (cd_values[0] & H5_SZIP_RAW_OPTION_MASK) { + printf("Header=\"Raw\""); + } + printf("/>\n"); + } else { + /* unknown option */ + } + } +} + +static void xml_dump_fill_value(hid_t dcpl, hid_t type) +{ +int sz; +int i; +hsize_t space; +hid_t p_type; +void * buf; +char * path; +char * name; + indent += COL; + indentation(indent); + printf("<%sData>\n",xmlnsprefix); + indent += COL; + + space = H5Tget_size(type); + buf = malloc((size_t)space); + + H5Pget_fill_value(dcpl, type, buf); + + if (H5Tget_class(type) == H5T_REFERENCE) { + path = lookup_ref_path(buf); + + indentation(indent); + printf("<%sDataFromFile>\n",xmlnsprefix); + if (!path) { + printf("\"%s\"\n", "NULL"); + } else { + char *t_path = xml_escape_the_string(path, -1); + + printf("\"%s\"\n", t_path); + free(t_path); + } + indentation(indent); + printf("</%sDataFromFile>\n",xmlnsprefix); + } else if (H5Tget_class(type) == H5T_STRING) { + /* ????? */ + indentation(indent); + printf("<!-- String fill values not yet implemented. -->\n"); + indentation(indent); + printf("<%sNoData />\n",xmlnsprefix); + } else { + /* all other data */ + switch (H5Tget_class(type)) { + case H5T_INTEGER: + indentation(indent); + printf("<%sDataFromFile>\n",xmlnsprefix); + indentation(indent); + printf("\"%d\"\n",*(int *)buf); + indentation(indent); + printf("</%sDataFromFile>\n",xmlnsprefix); + break; + case H5T_FLOAT: + indentation(indent); + printf("<%sDataFromFile>\n",xmlnsprefix); + indentation(indent); + printf("\"%f\"\n",*(float *)buf); + indentation(indent); + printf("</%sDataFromFile>\n",xmlnsprefix); + break; + case H5T_BITFIELD: + case H5T_OPAQUE: + indentation(indent); + printf("<%sDataFromFile>\n",xmlnsprefix); + sz = H5Tget_size(type); + indentation(indent); + printf("\""); + for (i = 0; i < sz; i++) { + printf("%x ",*(unsigned int *)buf); + } + printf("\"\n"); + indentation(indent); + printf("</%sDataFromFile>\n",xmlnsprefix); + break; + case H5T_ENUM: + indentation(indent); + printf("<%sDataFromFile>\n",xmlnsprefix); + name = H5Tget_member_name(type, *(int *)buf); + indentation(indent); + printf("\"%s\"\n",name); + indentation(indent); + printf("</%sDataFromFile>\n",xmlnsprefix); + break; + case H5T_ARRAY: + indentation(indent); + printf("<!-- Array fill values not yet implemented. -->\n"); + indentation(indent); + printf("<%sNoData />\n",xmlnsprefix); + break; + case H5T_TIME: + indentation(indent); + printf("<!-- Time fill not yet implemented. -->\n"); + indentation(indent); + printf("<%sNoData />\n",xmlnsprefix); + break; + case H5T_COMPOUND: + indentation(indent); + printf("<!-- Compound fill not yet implemented. -->\n"); + indentation(indent); + printf("<%sNoData />\n",xmlnsprefix); + break; + case H5T_VLEN: + indentation(indent); + printf("<!-- VL fill not yet implemented. -->\n"); + indentation(indent); + printf("<%sNoData />\n",xmlnsprefix); + break; + default: + indentation(indent); + printf("<!-- Unknown fill datatype: %d -->\n", H5Tget_class(type)); + indentation(indent); + printf("<%sNoData/>\n",xmlnsprefix); + break; + } + free(buf); + H5Tclose(p_type); + } + indent -= COL; + indentation(indent); + printf("</%sData>\n",xmlnsprefix); + indent -= COL; +} /*------------------------------------------------------------------------- * Function: xml_dump_group * @@ -4790,13 +5296,20 @@ xml_dump_dataset(hid_t did, const char *name, struct subset_t UNUSED * sset) { hid_t type, space; hid_t dcpl; + herr_t err; + H5D_fill_value_t fvstatus; int maxdims; hsize_t *chsize; int ndims; int i; - hsize_t tempi; + H5D_alloc_time_t at; + H5D_fill_time_t ft; + int res; + hsize_t tempi; char *tmp; char *t_name, *t_tmp, *t_prefix; + char *rstr = malloc(100); + char *pstr = malloc(100); tmp = malloc(strlen(prefix) + strlen(name) + 2); strcpy(tmp, prefix); @@ -4808,51 +5321,149 @@ xml_dump_dataset(hid_t did, const char *name, struct subset_t UNUSED * sset) t_tmp = xml_escape_the_name(tmp); t_prefix = xml_escape_the_name(prefix); - printf("<Dataset Name=\"%s\" OBJ-XID=\"%s\" Parents=\"%s\">\n", - t_name, t_tmp, (strcmp(prefix, "") ? t_prefix : "root")); + res = xml_name_to_XID(tmp, rstr, 100, 1); + res = xml_name_to_XID(prefix, pstr, 100, 1); + printf("<%sDataset Name=\"%s\" OBJ-XID=\"%s\" H5Path= \"%s\" Parents=\"%s\" H5ParentPaths=\"%s\">\n",xmlnsprefix, + t_name, rstr, t_tmp, pstr, strcmp(prefix, "") ? t_prefix : "/"); free(t_name); free(t_tmp); free(t_prefix); + free(rstr); + free(pstr); + free(tmp); dcpl = H5Dget_create_plist(did); type = H5Dget_type(did); space = H5Dget_space(did); - /* Print information about chunked storage */ + /* Print information about storage layout */ if (H5D_CHUNKED == H5Pget_layout(dcpl)) { maxdims = H5Sget_simple_extent_ndims(space); chsize = (hsize_t *) malloc(maxdims * sizeof(hsize_t)); indent += COL; indentation(indent); - printf("<StorageLayout>\n"); + printf("<%sStorageLayout>\n",xmlnsprefix); indent += COL; indentation(indent); - printf("<ChunkedLayout "); + printf("<%sChunkedLayout ",xmlnsprefix); ndims = H5Pget_chunk(dcpl, maxdims, chsize); printf("Ndims=\"%d\">\n", ndims); - /* check for compression and tell about it... */ - - check_compression(dcpl); indent += COL; for (i = 0; i < ndims; i++) { indentation(indent); - HDfprintf(stdout, "<ChunkDimension DimSize=\"%Hu\" />\n", chsize[i]); + HDfprintf(stdout, "<%sChunkDimension DimSize=\"%Hu\" />\n", + xmlnsprefix, chsize[i]); } + indentation(indent); + printf("<%sRequiredFilter>\n",xmlnsprefix); + indent += COL; + check_filters(dcpl); + indent -= COL; + indentation(indent); + printf("</%sRequiredFilter>\n",xmlnsprefix); + indent -= COL; indentation(indent); - printf("</ChunkedLayout>\n"); + printf("</%sChunkedLayout>\n",xmlnsprefix); indent -= COL; indentation(indent); - printf("</StorageLayout>\n"); + printf("</%sStorageLayout>\n",xmlnsprefix); indent -= COL; free(chsize); + } else if (H5D_CONTIGUOUS == H5Pget_layout(dcpl)) { + indent += COL; + indentation(indent); + printf("<%sStorageLayout>\n",xmlnsprefix); + indent += COL; + indentation(indent); + printf("<%sContiguousLayout/>\n",xmlnsprefix); + indent -= COL; + indentation(indent); + printf("</%sStorageLayout>\n",xmlnsprefix); + indent -= COL; + indentation(indent); + } else if (H5D_COMPACT == H5Pget_layout(dcpl)) { + indent += COL; + indentation(indent); + printf("<%sStorageLayout>\n",xmlnsprefix); + indent += COL; + indentation(indent); + printf("<%sCompactLayout/>\n",xmlnsprefix); + indent -= COL; + indentation(indent); + printf("</%sStorageLayout>\n",xmlnsprefix); + indent -= COL; + indentation(indent); + } + /* and check for external.... ?? */ + + /* fill value */ + + indent += COL; + indentation(indent); + printf("<%sFillValueInfo ",xmlnsprefix); + err = H5Pget_fill_time(dcpl, &ft); + printf("FillTime=\""); + switch ( ft ) { + case H5D_FILL_TIME_ALLOC: + printf("FillOnAlloc"); + break; + case H5D_FILL_TIME_NEVER: + printf("FillNever"); + break; + case H5D_FILL_TIME_IFSET: + printf("FillIfSet"); + break; + default: + printf("?"); + break; + } + printf("\" "); + err = H5Pget_alloc_time(dcpl, &at); + printf("AllocationTime=\""); + switch ( at ) { + case H5D_ALLOC_TIME_EARLY: + printf("Early"); + break; + case H5D_ALLOC_TIME_INCR: + printf("Incremental"); + break; + case H5D_ALLOC_TIME_LATE: + printf("Late"); + break; + case H5D_ALLOC_TIME_DEFAULT: + default: + printf("?"); + break; } - /* and check for external.... */ + printf("\""); + printf(">\n"); + + indent += COL; + indentation(indent); + printf("<%sFillValue>\n",xmlnsprefix); + indent += COL; + err = H5Pfill_value_defined(dcpl, &fvstatus); + if (fvstatus == H5D_FILL_VALUE_UNDEFINED) { + indentation(indent + COL); + printf("<%sNoFill/>\n",xmlnsprefix); + } else { + xml_dump_fill_value(did,type); + } + + indent -= COL; + indentation(indent); + printf("</%sFillValue>\n",xmlnsprefix); + + indent -= COL; + indentation(indent); + printf("</%sFillValueInfo>\n",xmlnsprefix); + indent -= COL; dump_function_table->dump_dataspace_function(space); dump_function_table->dump_datatype_function(type); @@ -4860,7 +5471,7 @@ xml_dump_dataset(hid_t did, const char *name, struct subset_t UNUSED * sset) indent += COL; H5Aiterate(did, NULL, dump_function_table->dump_attribute_function, NULL); indent -= COL; - tempi = H5Dget_storage_size(did); + tempi = H5Dget_storage_size(did); if (display_data && (tempi > 0)) { switch (H5Tget_class(type)) { @@ -4877,13 +5488,13 @@ xml_dump_dataset(hid_t did, const char *name, struct subset_t UNUSED * sset) case H5T_TIME: indent += COL; indentation(indent); - printf("<Data>\n"); + printf("<%sData>\n",xmlnsprefix); indentation(indent); printf("<!-- Time data not yet implemented. -->\n"); indentation(indent); - printf("<NoData />\n"); + printf("<%sNoData />\n",xmlnsprefix); indentation(indent); - printf("<Data>\n"); + printf("<%sData>\n",xmlnsprefix); indent -= COL; break; @@ -4895,20 +5506,20 @@ xml_dump_dataset(hid_t did, const char *name, struct subset_t UNUSED * sset) case H5T_REFERENCE: indentation(indent); - printf("<Data>\n"); + printf("<%sData>\n",xmlnsprefix); indentation(indent); if (!H5Tequal(type, H5T_STD_REF_OBJ)) { printf("<!-- Note: Region references not supported -->\n"); indentation(indent); - printf("<NoData />\n"); + printf("<%sNoData />\n",xmlnsprefix); } else { - printf("<DataFromFile>\n"); + printf("<%sDataFromFile>\n",xmlnsprefix); xml_print_refs(did, DATASET_DATA); indentation(indent); - printf("</DataFromFile>\n"); + printf("</%sDataFromFile>\n",xmlnsprefix); } indentation(indent); - printf("</Data>\n"); + printf("</%sData>\n",xmlnsprefix); break; case H5T_VLEN: @@ -4917,32 +5528,29 @@ xml_dump_dataset(hid_t did, const char *name, struct subset_t UNUSED * sset) break; default: indentation(indent); - printf("<Data>\n"); + printf("<%sData>\n",xmlnsprefix); indentation(indent); printf("<!-- Unknown datatype: %d -->\n", H5Tget_class(type)); indentation(indent); - printf("<NoData/>\n"); + printf("<%sNoData/>\n",xmlnsprefix); indentation(indent); - printf("</Data>\n"); + printf("</%sData>\n",xmlnsprefix); break; } } else { /* no data written */ indentation(indent); - printf("<Data>\n"); + printf("<%sData>\n",xmlnsprefix); indentation(indent); - printf("<NoData/>\n"); + printf("<%sNoData/>\n",xmlnsprefix); indentation(indent); - printf("</Data>\n"); + printf("</%sData>\n",xmlnsprefix); } -/* - free(tmp); -*/ H5Tclose(type); H5Sclose(space); indentation(indent); - printf("%s\n", dump_header_format->datasetend); + printf("</%sDataset>\n", xmlnsprefix); } /*------------------------------------------------------------------------- @@ -4974,6 +5582,12 @@ xml_print_enum(hid_t type) nmembs = H5Tget_nmembers(type); super = H5Tget_super(type); + indentation(indent); + printf("<%sDataType>\n",xmlnsprefix); + xml_print_datatype(super); + indentation(indent); + printf("</%sDataType>\n",xmlnsprefix); + /* * Determine what data type to use for the native values. To simplify * things we entertain three possibilities: @@ -5015,14 +5629,14 @@ xml_print_enum(hid_t type) char *t_name = xml_escape_the_name(name[i]); indentation(indent); - printf("<EnumElement>\n"); + printf("<%sEnumElement>\n",xmlnsprefix); indentation(indent + COL); printf("%s\n", t_name); free(t_name); indentation(indent); - printf("</EnumElement>\n"); + printf("</%sEnumElement>\n",xmlnsprefix); indentation(indent); - printf("<EnumValue>\n"); + printf("<%sEnumValue>\n",xmlnsprefix); indentation(indent + COL); if (native < 0) { printf("0x"); @@ -5038,7 +5652,7 @@ xml_print_enum(hid_t type) } printf("\n"); indentation(indent); - printf("</EnumValue>\n"); + printf("</%sEnumValue>\n",xmlnsprefix); } indent -= COL; diff --git a/tools/h5dump/testh5dump.sh b/tools/h5dump/testh5dump.sh index 5bc98cf..13046d5 100755 --- a/tools/h5dump/testh5dump.sh +++ b/tools/h5dump/testh5dump.sh @@ -170,6 +170,9 @@ TOOLTEST tmulti.ddl --filedriver=multi tmulti # test for files with group names which reach > 1024 bytes in size TOOLTEST tlarge_objname.ddl -w157 tlarge_objname.h5 +# test '-A' to suppress data but print attr's +TOOLTEST tall-2A.ddl -A tall.h5 + # test Subsetting TOOLTEST tall-4s.ddl --dataset=/g1/g1.1/dset1.1.1 --start=1,1 --stride=2,3 --count=3,2 --block=1,1 tall.h5 TOOLTEST tall-5s.ddl -d "/g1/g1.1/dset1.1.2[0;2;10;]" tall.h5 @@ -183,51 +186,6 @@ TOOLTEST tchar1.ddl -r tchar.h5 # Missing file name TOOLTEST tnofilename.ddl -# test XML -TOOLTEST tall.h5.xml --xml tall.h5 -TOOLTEST tattr.h5.xml --xml tattr.h5 -TOOLTEST tbitfields.h5.xml --xml tbitfields.h5 -TOOLTEST tcompound.h5.xml --xml tcompound.h5 -TOOLTEST tcompound2.h5.xml --xml tcompound2.h5 -TOOLTEST tdatareg.h5.xml --xml tdatareg.h5 -TOOLTEST tdset.h5.xml --xml tdset.h5 -TOOLTEST tdset2.h5.xml --xml tdset2.h5 -TOOLTEST tenum.h5.xml --xml tenum.h5 -TOOLTEST tgroup.h5.xml --xml tgroup.h5 -TOOLTEST thlink.h5.xml --xml thlink.h5 -TOOLTEST tloop.h5.xml --xml tloop.h5 -TOOLTEST tloop2.h5.xml --xml tloop2.h5 -TOOLTEST tmany.h5.xml --xml tmany.h5 -TOOLTEST tnestedcomp.h5.xml --xml tnestedcomp.h5 -TOOLTEST tobjref.h5.xml --xml tobjref.h5 -TOOLTEST topaque.h5.xml --xml topaque.h5 -TOOLTEST tslink.h5.xml --xml tslink.h5 -TOOLTEST tstr.h5.xml --xml tstr.h5 -TOOLTEST tstr2.h5.xml --xml tstr2.h5 -TOOLTEST tref.h5.xml --xml tref.h5 -TOOLTEST tname-amp.h5.xml --xml tname-amp.h5 -TOOLTEST tname-apos.h5.xml --xml tname-apos.h5 -TOOLTEST tname-gt.h5.xml --xml tname-gt.h5 -TOOLTEST tname-lt.h5.xml --xml tname-lt.h5 -TOOLTEST tname-quot.h5.xml --xml tname-quot.h5 -TOOLTEST tname-sp.h5.xml --xml tname-sp.h5 -TOOLTEST tstring.h5.xml --xml tstring.h5 -TOOLTEST tstring-at.h5.xml --xml tstring-at.h5 -TOOLTEST tref-escapes.h5.xml --xml tref-escapes.h5 -TOOLTEST tref-escapes-at.h5.xml --xml tref-escapes-at.h5 -TOOLTEST tnodata.h5.xml --xml tnodata.h5 -TOOLTEST tarray1.h5.xml --xml tarray1.h5 -TOOLTEST tarray2.h5.xml --xml tarray2.h5 -TOOLTEST tarray3.h5.xml --xml tarray3.h5 -TOOLTEST tarray6.h5.xml --xml tarray6.h5 -TOOLTEST tarray7.h5.xml --xml tarray7.h5 -TOOLTEST tvldtypes1.h5.xml --xml tvldtypes1.h5 -TOOLTEST tvldtypes2.h5.xml --xml tvldtypes2.h5 -TOOLTEST tvldtypes3.h5.xml --xml tvldtypes3.h5 -TOOLTEST tvlstr.h5.xml --xml tvlstr.h5 -TOOLTEST tsaf.h5.xml --xml tsaf.h5 -TOOLTEST tempty.h5.xml --xml tempty.h5 - if test $nerrors -eq 0 ; then echo "All $DUMPER tests passed." fi diff --git a/tools/h5dump/testh5dumpxml.sh b/tools/h5dump/testh5dumpxml.sh new file mode 100755 index 0000000..9c7ef67 --- /dev/null +++ b/tools/h5dump/testh5dumpxml.sh @@ -0,0 +1,153 @@ +#! /bin/sh +# +# Copyright by the Board of Trustees of the University of Illinois. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the files COPYING and Copyright.html. COPYING can be found at the root +# of the source code distribution tree; Copyright.html can be found at the +# root level of an installed copy of the electronic HDF5 document set and +# is linked from the top-level documents page. It can also be found at +# http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have +# access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. +# +# Tests for the h5dump tool + +DUMPER=h5dump # The tool name +DUMPER_BIN=`pwd`/$DUMPER # The path of the tool binary + +CMP='cmp -s' +DIFF='diff -c' + +nerrors=0 +verbose=yes + +# The build (current) directory might be different than the source directory. +if test -z "$srcdir"; then + srcdir=. +fi + +test -d ../testfiles || mkdir ../testfiles + +# Print a line-line message left justified in a field of 70 characters +# beginning with the word "Testing". +# +TESTING() { + SPACES=" " + echo "Testing $* $SPACES" | cut -c1-70 | tr -d '\012' +} + +# Run a test and print PASS or *FAIL*. If a test fails then increment +# the `nerrors' global variable and (if $verbose is set) display the +# difference between the actual output and the expected output. The +# expected output is given as the first argument to this function and +# the actual output file is calculated by replacing the `.ddl' with +# `.out'. The actual output is not removed if $HDF5_NOCLEANUP has a +# non-zero value. +# +TOOLTEST() { + expect="$srcdir/../testfiles/$1" + actual="../testfiles/`basename $1 .ddl`.out" + actual_err="../testfiles/`basename $1 .ddl`.err" + shift + + # Run test. + TESTING $DUMPER $@ + ( + echo "#############################" + echo "Expected output for '$DUMPER $@'" + echo "#############################" + cd $srcdir/../testfiles + $RUNSERIAL $DUMPER_BIN $@ + ) >$actual 2>$actual_err + cat $actual_err >> $actual + + if $CMP $expect $actual; then + echo " PASSED" + else + echo "*FAILED*" + echo " Expected result (*.ddl) differs from actual result (*.out)" + nerrors="`expr $nerrors + 1`" + test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/ /' + fi + + # Clean up output file + if test -z "$HDF5_NOCLEANUP"; then + rm -f $actual $actual_err + fi +} + +############################################################################## +############################################################################## +### T H E T E S T S ### +############################################################################## +############################################################################## + +# test XML +TOOLTEST tall.h5.xml --xml tall.h5 +TOOLTEST tattr.h5.xml --xml tattr.h5 +TOOLTEST tbitfields.h5.xml --xml tbitfields.h5 +TOOLTEST tcompound.h5.xml --xml tcompound.h5 +TOOLTEST tcompound2.h5.xml --xml tcompound2.h5 +TOOLTEST tdatareg.h5.xml --xml tdatareg.h5 +TOOLTEST tdset.h5.xml --xml tdset.h5 +TOOLTEST tdset2.h5.xml --xml tdset2.h5 +TOOLTEST tenum.h5.xml --xml tenum.h5 +TOOLTEST tgroup.h5.xml --xml tgroup.h5 +TOOLTEST thlink.h5.xml --xml thlink.h5 +TOOLTEST tloop.h5.xml --xml tloop.h5 +TOOLTEST tloop2.h5.xml --xml tloop2.h5 +TOOLTEST tmany.h5.xml --xml tmany.h5 +TOOLTEST tnestedcomp.h5.xml --xml tnestedcomp.h5 +TOOLTEST tobjref.h5.xml --xml tobjref.h5 +TOOLTEST topaque.h5.xml --xml topaque.h5 +TOOLTEST tslink.h5.xml --xml tslink.h5 +TOOLTEST tstr.h5.xml --xml tstr.h5 +TOOLTEST tstr2.h5.xml --xml tstr2.h5 +TOOLTEST tref.h5.xml --xml tref.h5 +TOOLTEST tname-amp.h5.xml --xml tname-amp.h5 +TOOLTEST tname-apos.h5.xml --xml tname-apos.h5 +TOOLTEST tname-gt.h5.xml --xml tname-gt.h5 +TOOLTEST tname-lt.h5.xml --xml tname-lt.h5 +TOOLTEST tname-quot.h5.xml --xml tname-quot.h5 +TOOLTEST tname-sp.h5.xml --xml tname-sp.h5 +TOOLTEST tstring.h5.xml --xml tstring.h5 +TOOLTEST tstring-at.h5.xml --xml tstring-at.h5 +TOOLTEST tref-escapes.h5.xml --xml tref-escapes.h5 +TOOLTEST tref-escapes-at.h5.xml --xml tref-escapes-at.h5 +TOOLTEST tnodata.h5.xml --xml tnodata.h5 +TOOLTEST tarray1.h5.xml --xml tarray1.h5 +TOOLTEST tarray2.h5.xml --xml tarray2.h5 +TOOLTEST tarray3.h5.xml --xml tarray3.h5 +TOOLTEST tarray6.h5.xml --xml tarray6.h5 +TOOLTEST tarray7.h5.xml --xml tarray7.h5 +TOOLTEST tvldtypes1.h5.xml --xml tvldtypes1.h5 +TOOLTEST tvldtypes2.h5.xml --xml tvldtypes2.h5 +TOOLTEST tvldtypes3.h5.xml --xml tvldtypes3.h5 +TOOLTEST tvlstr.h5.xml --xml tvlstr.h5 +TOOLTEST tsaf.h5.xml --xml tsaf.h5 +TOOLTEST tempty.h5.xml --xml tempty.h5 + +# other options for xml + +TOOLTEST tempty-dtd.h5.xml --xml --use-dtd tempty.h5 +TOOLTEST tempty-dtd-2.h5.xml --xml -u tempty.h5 +TOOLTEST tempty-nons.h5.xml --xml -X ":" tempty.h5 +TOOLTEST tempty-nons-2.h5.xml --xml --xml-ns=":" tempty.h5 + +## Some of these combinations are syntactically correct but +## the URLs are dummies +TOOLTEST tempty-ns.h5.xml --xml -X "thing:" tempty.h5 +TOOLTEST tempty-ns-2.h5.xml --xml --xml-ns="thing:" tempty.h5 +TOOLTEST tempty-nons-uri.h5.xml --xml --xml-ns=":" --xml-dtd="http://somewhere.net" tempty.h5 +TOOLTEST tempty-dtd-uri.h5.xml --xml --use-dtd --xml-dtd="http://somewhere.net" tempty.h5 + +TOOLTEST tall-2A.h5.xml --xml -A tall.h5 + + +if test $nerrors -eq 0 ; then + echo "All $DUMPER tests passed." +fi + +exit $nerrors |