*** h5dump.c.1.80 Tue Dec 12 10:07:39 2000 --- h5dump.c Thu Dec 14 11:56:49 2000 *************** *** 1,6 **** ! /*------------------------------------------------------------------------- * ! * Copyright (C) 1998 National Center for Supercomputing Applications. * All rights reserved. * *------------------------------------------------------------------------- --- 1,7 ---- ! /*------------------------------------------------------------------------ * ! * Copyright (C) 1998,1999,2000 ! * National Center for Supercomputing Applications. * All rights reserved. * *------------------------------------------------------------------------- *************** *** 11,214 **** #include "H5private.h" #include "h5tools.h" ! static int display_oid = 0; ! static int display_data = 1; ! static int d_status = 0; ! static int unamedtype = 0; /* shared data type with no name */ ! ! static int prefix_len = 1024; ! static table_t *group_table = NULL, *dset_table = NULL, *type_table = NULL; ! static char *prefix; static const dump_header *dump_header_format; ! /* internal functions */ ! static void dump_group(hid_t , const char* ); ! static void dump_dataset(hid_t, const char*); ! static void dump_data(hid_t, int); ! static void dump_named_datatype(hid_t , const char *); ! static void dump_oid(hid_t oid); ! static void print_enum(hid_t type); /* external functions */ ! extern void indentation(int); ! extern int print_data(hid_t, hid_t, int); ! static h5dump_t dataformat = { ! 0, /*raw*/ ! "", /*fmt_raw*/ ! "%d", /*fmt_int*/ ! "%u", /*fmt_uint*/ ! "%d", /*fmt_schar*/ ! "%u", /*fmt_uchar*/ ! "%d", /*fmt_short*/ ! "%u", /*fmt_ushort*/ ! "%ld", /*fmt_long*/ ! "%lu", /*fmt_ulong*/ ! NULL, /*fmt_llong*/ ! NULL, /*fmt_ullong*/ ! "%g", /*fmt_double*/ ! "%g", /*fmt_float*/ ! ! 0, /*ascii*/ ! 0, /*str_locale*/ ! 0, /*str_repeat*/ ! ! ! "[ ", /*arr_pre*/ ! ", ", /*arr_sep*/ ! " ]", /*arr_suf*/ ! 1, /*arr_linebreak*/ ! ! "", /*cmpd_name*/ ! ",\n", /*cmpd_sep*/ ! "{\n", /*cmpd_pre*/ ! "}", /*cmpd_suf*/ ! "\n", /*cmpd_end*/ ! ! ",", /*vlen_sep*/ ! "(", /*vlen_pre*/ ! ")", /*vlen_suf*/ ! "", /*vlen_end*/ ! ! "%s", /*elmt_fmt*/ ! ",", /*elmt_suf1*/ ! " ", /*elmt_suf2*/ ! ! "", /*idx_n_fmt*/ ! "", /*idx_sep*/ ! "", /*idx_fmt*/ ! ! 80, /*line_ncols*//*standard default columns*/ ! 0, /*line_per_line*/ ! "", /*line_pre*/ ! "%s", /*line_1st*/ ! "%s", /*line_cont*/ ! "", /*line_suf*/ ! "", /*line_sep*/ ! 1, /*line_multi_new*/ ! " ", /*line_indent*/ ! ! 1, /*skip_first*/ ! ! 1, /*obj_hidefileno*/ ! " %lu:%lu",/*obj_format*/ ! ! 1, /*dset_hidefileno*/ ! "DATASET %lu:%lu ",/*dset_format*/ ! "%s", /*dset_blockformat_pre*/ ! "%s", /*dset_ptformat_pre*/ ! "%s", /*dset_ptformat*/ }; static const dump_header standardformat = { ! "standardformat", /*name*/ ! "HDF5", /*fileebgin*/ ! "", /*fileend*/ ! BOOT_BLOCK, /*bootblockbegin*/ ! "", /*bootblockend*/ ! GROUPNAME, /*groupbegin*/ ! "", /*groupend*/ ! DATASET, /*datasetbegin*/ ! "", /*datasetend*/ ! ATTRIBUTE, /*attributebegin*/ ! "", /*attributeend*/ ! DATATYPE, /*datatypebegin*/ ! "", /*datatypeend*/ ! DATASPACE, /*dataspacebegin*/ ! "", /*dataspaceend*/ ! DATA, /*databegin*/ ! "", /*dataend*/ ! SOFTLINK, /*softlinkbegin*/ ! "", /*softlinkend*/ ! ! "{", /*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*/ ! ! "", /*dataspacedescriptionbegin*/ ! "", /*dataspacedescriptionend*/ ! "(", /*dataspacedimbegin*/ ! ")", /*dataspacedimend*/ }; static const dump_header xmlformat = { ! "xml", /*name*/ ! "", /*filebegin*/ ! "", /*fileend*/ ! "", /*bootblockbegin*/ ! "", /*bootblockend*/ ! "", /*groupbegin*/ ! "", /*groupend*/ ! "", /*datasetbegin*/ ! "", /*datasetend*/ ! "", /*attributebegin*/ ! "", /*attributeend*/ ! "", /*datatypeend*/ ! "", /*datatypeend*/ ! "", /*dataspacebegin*/ ! "", /*dataspaceend*/ ! "", /*databegin*/ ! "", /*dataend*/ ! "", /*softlinkbegin*/ ! "", /*softlinkend*/ ! ! "", /*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*/ ! ! "", /*dataspacedescriptionbegin*/ ! "", /*dataspacedescriptionend*/ ! "(", /*dataspacedimbegin*/ ! ")", /*dataspacedimend*/ }; /*------------------------------------------------------------------------- * Function: usage * --- 12,418 ---- #include "H5private.h" #include "h5tools.h" ! static herr_t xml_dump_all(hid_t group, const char *name, ! void *op_data); ! ! static int display_oid = 0; ! static int display_data = 1; ! static int d_status = 0; ! static int unamedtype = 0; /* shared data type with no name */ ! ! static int prefix_len = 1024; ! static table_t *group_table = NULL, *dset_table = NULL, *type_table = ! NULL; ! static char *prefix; static const dump_header *dump_header_format; ! /** ! ** Added for XML ** ! **/ ! ! /* global variables for XML option */ ! ! static int doxml = 0; ! #define DEFAULT_DTD "http://hdf.ncsa.uiuc.edu/DTDs/HDF5-File.dtd" ! static char *xml_dtd_uri = NULL; ! /* fill_ref_path_table is called to inialize the object ! reference paths. */ ! hid_t thefile = -1; ! static herr_t fill_ref_path_table(hid_t, const char *, ! void UNUSED *); ! /** XML **/ ! ! /* internal functions used by standard format */ ! ! static void dump_oid(hid_t oid); ! static void print_enum(hid_t type); /* external functions */ ! extern void indentation(int); ! extern int print_data(hid_t, hid_t, int); ! static h5dump_t dataformat = { ! 0, /*raw */ ! ! "", /*fmt_raw */ ! "%d", /*fmt_int */ ! "%u", /*fmt_uint */ ! "%d", /*fmt_schar */ ! "%u", /*fmt_uchar */ ! "%d", /*fmt_short */ ! "%u", /*fmt_ushort */ ! "%ld", /*fmt_long */ ! "%lu", /*fmt_ulong */ ! NULL, /*fmt_llong */ ! NULL, /*fmt_ullong */ ! "%g", /*fmt_double */ ! "%g", /*fmt_float */ ! ! 0, /*ascii */ ! 0, /*str_locale */ ! 0, /*str_repeat */ ! ! "[ ", /*arr_pre */ ! ", ", /*arr_sep */ ! " ]", /*arr_suf */ ! 1, /*arr_linebreak */ ! ! "", /*cmpd_name */ ! ",\n", /*cmpd_sep */ ! "{\n", /*cmpd_pre */ ! "}", /*cmpd_suf */ ! "\n", /*cmpd_end */ ! ! ",", /*vlen_sep */ ! "(", /*vlen_pre */ ! ")", /*vlen_suf */ ! "", /*vlen_end */ ! ! "%s", /*elmt_fmt */ ! ",", /*elmt_suf1 */ ! " ", /*elmt_suf2 */ ! ! "", /*idx_n_fmt */ ! "", /*idx_sep */ ! "", /*idx_fmt */ ! ! 80, /*line_ncols *//*standard default columns */ ! 0, /*line_per_line */ ! "", /*line_pre */ ! "%s", /*line_1st */ ! "%s", /*line_cont */ ! "", /*line_suf */ ! "", /*line_sep */ ! 1, /*line_multi_new */ ! " ", /*line_indent */ ! ! 1, /*skip_first */ ! ! 1, /*obj_hidefileno */ ! " %lu:%lu", /*obj_format */ ! ! 1, /*dset_hidefileno */ ! "DATASET %lu:%lu ", /*dset_format */ ! "%s", /*dset_blockformat_pre */ ! "%s", /*dset_ptformat_pre */ ! "%s", /*dset_ptformat */ ! }; ! ! /** ! ** Added for XML ** ! **/ ! /* ! * Alternative formating for data dumped to XML ! * In general, the numbers are the same, but separators ! * except spaces are not used. ! * ! * Some of these are not used, as some kinds of data are ! * dumped in completely new subroutines. ! * ! * Some of this formatting may yet need to change. ! * ! * This table only affects XML output. ! */ ! static h5dump_t xml_dataformat = { ! 0, /*raw */ ! "", /*fmt_raw */ ! "%d", /*fmt_int */ ! "%u", /*fmt_uint */ ! "%d", /*fmt_schar */ ! "%u", /*fmt_uchar */ ! "%d", /*fmt_short */ ! "%u", /*fmt_ushort */ ! "%ld", /*fmt_long */ ! "%lu", /*fmt_ulong */ ! NULL, /*fmt_llong */ ! NULL, /*fmt_ullong */ ! "%g", /*fmt_double */ ! "%g", /*fmt_float */ ! ! 0, /*ascii */ ! 0, /*str_locale */ ! 0, /*str_repeat */ ! ! " ", /*arr_pre */ ! " ", /*arr_sep */ ! " ", /*arr_suf */ ! 1, /*arr_linebreak */ ! ! "", /*cmpd_name */ ! " ", /*cmpd_sep */ ! "", /*cmpd_pre */ ! "", /*cmpd_suf */ ! "", /*cmpd_end */ ! ! " ", /*vlen_sep */ ! " ", /*vlen_pre */ ! " ", /*vlen_suf */ ! "", /*vlen_end */ ! ! "%s", /*elmt_fmt */ ! " ", /*elmt_suf1 */ ! "", /*elmt_suf2 */ ! ! "", /*idx_n_fmt */ ! "", /*idx_sep */ ! "", /*idx_fmt */ ! ! 80, /*line_ncols *//*standard default columns */ ! 0, /*line_per_line */ ! "", /*line_pre */ ! "%s", /*line_1st */ ! "%s", /*line_cont */ ! "", /*line_suf */ ! "", /*line_sep */ ! 1, /*line_multi_new */ ! " ", /*line_indent */ ! ! 1, /*skip_first */ ! ! 1, /*obj_hidefileno */ ! " %lu:%lu", /*obj_format */ ! ! 1, /*dset_hidefileno */ ! "DATASET %lu:%lu ", /*dset_format */ ! "%s", /*dset_blockformat_pre */ ! "%s", /*dset_ptformat_pre */ ! "%s", /*dset_ptformat */ }; + /** XML **/ + static const dump_header standardformat = { ! "standardformat", /*name */ ! "HDF5", /*fileebgin */ ! "", /*fileend */ ! BOOT_BLOCK, /*bootblockbegin */ ! "", /*bootblockend */ ! GROUPNAME, /*groupbegin */ ! "", /*groupend */ ! DATASET, /*datasetbegin */ ! "", /*datasetend */ ! ATTRIBUTE, /*attributebegin */ ! "", /*attributeend */ ! DATATYPE, /*datatypebegin */ ! "", /*datatypeend */ ! DATASPACE, /*dataspacebegin */ ! "", /*dataspaceend */ ! DATA, /*databegin */ ! "", /*dataend */ ! SOFTLINK, /*softlinkbegin */ ! "", /*softlinkend */ ! ! "{", /*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 */ ! ! "", /*dataspacedescriptionbegin */ ! "", /*dataspacedescriptionend */ ! "(", /*dataspacedimbegin */ ! ")", /*dataspacedimend */ }; + /** + ** 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 */ ! "", /*fileend */ ! "", /*bootblockbegin */ ! "", /*bootblockend */ ! "", /*groupbegin */ ! "", /*groupend */ ! "", /*datasetbegin */ ! "", /*datasetend */ ! "", /*attributebegin */ ! "", /*attributeend */ ! "", /*datatypeend */ ! "", /*datatypeend */ ! "", /*dataspacebegin */ ! "", /*dataspaceend */ ! "", /*databegin */ ! "", /*dataend */ ! "", /*softlinkbegin */ ! "", /*softlinkend */ ! ! "", /*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 */ ! ! "", /*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); ! hobj_ref_t *ref_path_table_put(hid_t, char *); ! char *xml_escape_the_string(const char *); ! char *xml_escape_the_name(const char *); ! ! /** ! ** Change for XML ** ! ** ! ** The 'dump_xxx' functions have two versions, standard and XML. ! ** ! ** They are called indirectly through the 'dump_function_table'. ! ** e.g., dump_group(...) becomes dump_functions->dump_group(...); ! ** ! ** The standard functions are unchanged except for the way ! ** they are called ! **/ ! ! /* The dump functions of the dump_function_table */ ! ! /* standard format: no change */ ! static void dump_group(hid_t, const char *); ! static void dump_dataset(hid_t, const char *); ! static void dump_data(hid_t, int); ! static void dump_named_datatype(hid_t, const char *); ! static void dump_dataspace(hid_t space); ! static void dump_datatype(hid_t type); ! static herr_t dump_attr(hid_t attr, const char *attr_name, ! void UNUSED * op_data); ! ! /* XML format: same interface, alternaive output */ ! ! static void xml_dump_group(hid_t, const char *); ! static void xml_dump_dataset(hid_t ds, const char *dsname); ! static void xml_dump_data(hid_t, int); ! static void xml_dump_named_datatype(hid_t, const char *); ! static void xml_dump_dataspace(hid_t space); ! static void xml_dump_datatype(hid_t type); ! static herr_t xml_dump_attr(hid_t attr, const char *attr_name, ! void UNUSED * op_data); ! ! /** ! ** Added for XML ** ! ** ! ** This is the global dispatch table for the dump functions. ! **/ ! /* the table of dump functions */ ! typedef struct ! { ! void (*dump_group_function) (hid_t, const char *); ! void (*dump_named_datatype_function) (hid_t, ! const char *); ! void (*dump_dataset_function) (hid_t, const char *); ! void (*dump_dataspace_function) (hid_t); ! void (*dump_datatype_function) (hid_t); ! herr_t (*dump_attribute_function) (hid_t, const char *, ! void *); ! void (*dump_data_function) (hid_t, int); ! } ! dump_functions; ! ! /* Standard DDL output */ ! static const dump_functions ddl_function_table = { ! dump_group, ! dump_named_datatype, ! dump_dataset, ! dump_dataspace, ! dump_datatype, ! dump_attr, ! dump_data }; + /* XML output */ + static const dump_functions xml_function_table = { + xml_dump_group, + xml_dump_named_datatype, + xml_dump_dataset, + xml_dump_dataspace, + xml_dump_datatype, + xml_dump_attr, + xml_dump_data + }; + + /* The global table is set to either ddl_function_table or + xml_function_table in the initialization. + */ + static const dump_functions *dump_function_table; /*------------------------------------------------------------------------- * Function: usage * *************** *** 228,234 **** Usage of HDF5 Dumper:\n\ \n\ h5dump [-h] [-bb] [-header] [-v] [-V] [-a ] [-d ] [-g ]\n\ ! [-l ] [-o ] [-t ] [-w ] \n\ \n\ -h Print information on this command and exit.\n\ -bb Display the conent of the boot block. [Default: don't display]\n\ --- 432,439 ---- Usage of HDF5 Dumper:\n\ \n\ h5dump [-h] [-bb] [-header] [-v] [-V] [-a ] [-d ] [-g ]\n\ ! [-l ] [-o ] [-t ] [-w ] \n\ ! [-xml -xml-dtd ] \n\ \n\ -h Print information on this command and exit.\n\ -bb Display the conent of the boot block. [Default: don't display]\n\ *************** *** 241,246 **** --- 446,453 ---- -l Display the value(s) of the specified soft link(s).\n\ -t Display the specified named data type(s).\n\ -w Display the information with the specified maximum number of columns.\n\ + -xml Display output the description in XML.\n\ + -xml-dtd Use the DTD at the URI specified.\n\ -o Output the raw data of datasets to a separate file .\n\ \n\ is an integer greater than 1.\n\ *************** *** 269,567 **** static void print_datatype(hid_t type) { ! char *fname ; ! hid_t nmembers, mtype, str_type; ! int i, j, ndims, perm[H5DUMP_MAX_RANK]; ! size_t size; ! hsize_t dims[H5DUMP_MAX_RANK]; ! H5T_str_t str_pad; ! H5T_cset_t cset; ! H5G_stat_t statbuf; ! hid_t super; switch (H5Tget_class(type)) { ! case H5T_INTEGER: ! if (H5Tequal(type, H5T_STD_I8BE)) { ! printf("H5T_STD_I8BE"); ! } else if (H5Tequal(type, H5T_STD_I8LE)) { ! printf("H5T_STD_I8LE"); ! } else if (H5Tequal(type, H5T_STD_I16BE)) { ! printf("H5T_STD_I16BE"); ! } else if (H5Tequal(type, H5T_STD_I16LE)) { ! printf("H5T_STD_I16LE"); ! } else if (H5Tequal(type, H5T_STD_I32BE)) { ! printf("H5T_STD_I32BE"); ! } else if (H5Tequal(type, H5T_STD_I32LE)) { ! printf("H5T_STD_I32LE"); ! } else if (H5Tequal(type, H5T_STD_I64BE)) { ! printf("H5T_STD_I64BE"); ! } else if (H5Tequal(type, H5T_STD_I64LE)) { ! printf("H5T_STD_I64LE"); ! } else if (H5Tequal(type, H5T_STD_U8BE)) { ! printf("H5T_STD_U8BE"); ! } else if (H5Tequal(type, H5T_STD_U8LE)) { ! printf("H5T_STD_U8LE"); ! } else if (H5Tequal(type, H5T_STD_U16BE)) { ! printf("H5T_STD_U16BE"); ! } else if (H5Tequal(type, H5T_STD_U16LE)) { ! printf("H5T_STD_U16LE"); ! } else if (H5Tequal(type, H5T_STD_U32BE)) { ! printf("H5T_STD_U32BE"); ! } else if (H5Tequal(type, H5T_STD_U32LE)) { ! printf("H5T_STD_U32LE"); ! } else if (H5Tequal(type, H5T_STD_U64BE)) { ! printf("H5T_STD_U64BE"); ! } else if (H5Tequal(type, H5T_STD_U64LE)) { ! printf("H5T_STD_U64LE"); ! } else if (H5Tequal(type, H5T_NATIVE_SCHAR)) { ! printf("H5T_NATIVE_SCHAR"); ! } else if (H5Tequal(type, H5T_NATIVE_UCHAR)) { ! printf("H5T_NATIVE_UCHAR"); ! } else if (H5Tequal(type, H5T_NATIVE_SHORT)) { ! printf("H5T_NATIVE_SHORT"); ! } else if (H5Tequal(type, H5T_NATIVE_USHORT)) { ! printf("H5T_NATIVE_USHORT"); ! } else if (H5Tequal(type, H5T_NATIVE_INT)) { ! printf("H5T_NATIVE_INT"); ! } else if (H5Tequal(type, H5T_NATIVE_UINT)) { ! printf("H5T_NATIVE_UINT"); ! } else if (H5Tequal(type, H5T_NATIVE_LONG)) { ! printf("H5T_NATIVE_LONG"); ! } else if (H5Tequal(type, H5T_NATIVE_ULONG)) { ! printf("H5T_NATIVE_ULONG"); ! } else if (H5Tequal(type, H5T_NATIVE_LLONG)) { ! printf("H5T_NATIVE_LLONG"); ! } else if (H5Tequal(type, H5T_NATIVE_ULLONG)) { ! printf("H5T_NATIVE_ULLONG"); ! } else { ! printf("undefined integer"); ! d_status = 1; ! } ! break; ! ! case H5T_FLOAT: ! if (H5Tequal(type, H5T_IEEE_F32BE)) { ! printf("H5T_IEEE_F32BE"); ! } else if (H5Tequal(type, H5T_IEEE_F32LE)) { ! printf("H5T_IEEE_F32LE"); ! } else if (H5Tequal(type, H5T_IEEE_F64BE)) { ! printf("H5T_IEEE_F64BE"); ! } else if (H5Tequal(type, H5T_IEEE_F64LE)) { ! printf("H5T_IEEE_F64LE"); ! } else if (H5Tequal(type, H5T_NATIVE_FLOAT)) { ! printf("H5T_NATIVE_FLOAT"); ! } else if (H5Tequal(type, H5T_NATIVE_DOUBLE)) { ! printf("H5T_NATIVE_DOUBLE"); ! } else if (H5Tequal(type, H5T_NATIVE_LDOUBLE)) { ! printf("H5T_NATIVE_LDOUBLE"); ! } else { ! printf("undefined float"); ! d_status = 1; ! } ! break; ! ! case H5T_TIME: ! printf("H5T_TIME: not yet implemented"); ! break; ! ! case H5T_STRING: ! size = H5Tget_size(type); ! str_pad = H5Tget_strpad(type); ! cset = H5Tget_cset(type); ! ! printf("H5T_STRING %s\n", dump_header_format->strblockbegin); ! indent += COL; ! ! indentation(indent + COL); ! printf("%s %d;\n", STRSIZE, (int)size); ! ! indentation(indent + COL); ! printf("%s ", STRPAD); ! if (str_pad == H5T_STR_NULLTERM ) ! printf("H5T_STR_NULLTERM;\n"); ! else if (str_pad == H5T_STR_NULLPAD ) ! printf("H5T_STR_NULLPAD;\n"); ! else if (str_pad == H5T_STR_SPACEPAD ) ! printf("H5T_STR_SPACEPAD;\n"); ! else ! printf("H5T_STR_ERROR;\n"); ! ! indentation(indent + COL); ! printf("%s ", CSET); ! if (cset == H5T_CSET_ASCII) ! printf("H5T_CSET_ASCII;\n"); ! else ! printf("unknown_cset;\n"); ! ! str_type = H5Tcopy(H5T_C_S1); ! H5Tset_cset(str_type, cset); ! H5Tset_size(str_type, size); ! H5Tset_strpad(str_type, str_pad); ! ! indentation(indent + COL); ! printf("%s ", CTYPE); ! ! if (H5Tequal(type,str_type)) { ! printf("H5T_C_S1;\n"); ! H5Tclose(str_type); ! } else { ! H5Tclose(str_type); ! str_type = H5Tcopy(H5T_FORTRAN_S1); ! H5Tset_cset(str_type, cset ) ; ! H5Tset_size(str_type, size); ! H5Tset_strpad(str_type, str_pad ); ! ! if (H5Tequal(type,str_type)) { ! printf( "H5T_FORTRAN_S1;\n"); ! } else { ! printf("unknown_one_character_type;\n "); ! d_status = 1; ! } ! ! H5Tclose(str_type); ! } ! ! indent -= COL; ! indentation(indent + COL); ! printf("%s", dump_header_format->strblockend); ! break; ! ! case H5T_BITFIELD: ! if (H5Tequal(type, H5T_STD_B8BE)) { ! printf("H5T_STD_B8BE"); ! } else if (H5Tequal(type, H5T_STD_B8LE)) { ! printf("H5T_STD_B8LE"); ! } else if (H5Tequal(type, H5T_STD_B16BE)) { ! printf("H5T_STD_B16BE"); ! } else if (H5Tequal(type, H5T_STD_B16LE)) { ! printf("H5T_STD_B16LE"); ! } else if (H5Tequal(type, H5T_STD_B32BE)) { ! printf("H5T_STD_B32BE"); ! } else if (H5Tequal(type, H5T_STD_B32LE)) { ! printf("H5T_STD_B32LE"); ! } else if (H5Tequal(type, H5T_STD_B64BE)) { ! printf("H5T_STD_B64BE"); ! } else if (H5Tequal(type, H5T_STD_B64LE)) { ! printf("H5T_STD_B64LE"); ! } else { ! printf("undefined bitfield"); ! d_status = 1; ! } ! break; ! ! case H5T_OPAQUE: ! printf("\n"); ! indentation(indent + COL); ! printf("H5T_OPAQUE;\n"); ! indentation(indent + COL); ! printf("OPAQUE_TAG \"%s\";\n", H5Tget_tag(type)); ! indentation(indent); ! break; ! ! case H5T_COMPOUND: ! if (H5Tcommitted(type) > 0) { ! H5Gget_objinfo(type, ".", TRUE, &statbuf); ! i = search_obj (type_table, statbuf.objno); ! ! if (i >= 0) { ! if (!type_table->objs[i].recorded) ! printf("\"/#%lu:%lu\"\n", type_table->objs[i].objno[0], ! type_table->objs[i].objno[1]); ! else ! printf("\"%s\"", type_table->objs[i].objname); ! } else { ! printf("h5dump error: unknown committed type.\n"); ! d_status = 1; ! } ! } else { ! nmembers = H5Tget_nmembers(type); ! ! printf("H5T_COMPOUND %s\n", dump_header_format->structblockbegin); ! for (i = 0; i < nmembers; i++) { ! fname = H5Tget_member_name(type, i); ! mtype = H5Tget_member_type(type, i); ! ! indentation (indent + COL); ! ! if (H5Tget_class(mtype) == H5T_COMPOUND) { ! indent += COL; ! } ! ! print_datatype(mtype); ! ! if (H5Tget_class(mtype) == H5T_COMPOUND) { ! indent -= COL; ! } ! ! printf (" \"%s\";\n", fname); ! ! free(fname); ! } ! indentation(indent); ! printf("%s", dump_header_format->structblockend); ! } ! break; ! ! case H5T_REFERENCE: ! printf("H5T_REFERENCE"); ! break; ! ! case H5T_ENUM: ! printf("H5T_ENUM %s\n",dump_header_format->enumblockbegin); ! indent += COL; ! indentation(indent + COL); ! super = H5Tget_super(type); ! print_datatype(super); ! printf(";\n"); ! print_enum(type); ! indent -= COL; ! indentation(indent + COL); ! printf("%s", dump_header_format->enumblockend); ! break; ! ! case H5T_VLEN: ! printf("H5T_VLEN %s ",dump_header_format->vlenblockbegin); ! ! super = H5Tget_super(type); ! print_datatype(super); ! H5Tclose(super); ! ! /* Print closing */ ! printf("%s", dump_header_format->vlenblockend); ! break; ! ! case H5T_ARRAY: ! /* Get array base type */ ! super = H5Tget_super(type); ! ! /* Print lead-in */ ! printf("H5T_ARRAY { "); ! ! /* Get array information */ ! ndims = H5Tget_array_ndims(type); ! H5Tget_array_dims(type, dims, perm); ! ! /* Print array dimensions */ ! for (j = 0; j < ndims; j++) ! printf("[%d]",(int)dims[j]); ! ! printf(" "); ! ! /* Print base type */ ! print_datatype(super); ! ! /* Close array base type */ ! H5Tclose(super); ! ! /* Print closing */ ! printf(" }"); ! ! break; ! ! default: ! printf("unknown data type"); ! d_status = 1; ! break; } } --- 476,775 ---- static void print_datatype(hid_t type) { ! char *fname; ! hid_t nmembers, mtype, str_type; ! int i, j, ndims, perm[H5DUMP_MAX_RANK]; ! size_t size; ! hsize_t dims[H5DUMP_MAX_RANK]; ! H5T_str_t str_pad; ! H5T_cset_t cset; ! H5G_stat_t statbuf; ! hid_t super; switch (H5Tget_class(type)) { ! case H5T_INTEGER: ! if (H5Tequal(type, H5T_STD_I8BE)) { ! printf("H5T_STD_I8BE"); ! } else if (H5Tequal(type, H5T_STD_I8LE)) { ! printf("H5T_STD_I8LE"); ! } else if (H5Tequal(type, H5T_STD_I16BE)) { ! printf("H5T_STD_I16BE"); ! } else if (H5Tequal(type, H5T_STD_I16LE)) { ! printf("H5T_STD_I16LE"); ! } else if (H5Tequal(type, H5T_STD_I32BE)) { ! printf("H5T_STD_I32BE"); ! } else if (H5Tequal(type, H5T_STD_I32LE)) { ! printf("H5T_STD_I32LE"); ! } else if (H5Tequal(type, H5T_STD_I64BE)) { ! printf("H5T_STD_I64BE"); ! } else if (H5Tequal(type, H5T_STD_I64LE)) { ! printf("H5T_STD_I64LE"); ! } else if (H5Tequal(type, H5T_STD_U8BE)) { ! printf("H5T_STD_U8BE"); ! } else if (H5Tequal(type, H5T_STD_U8LE)) { ! printf("H5T_STD_U8LE"); ! } else if (H5Tequal(type, H5T_STD_U16BE)) { ! printf("H5T_STD_U16BE"); ! } else if (H5Tequal(type, H5T_STD_U16LE)) { ! printf("H5T_STD_U16LE"); ! } else if (H5Tequal(type, H5T_STD_U32BE)) { ! printf("H5T_STD_U32BE"); ! } else if (H5Tequal(type, H5T_STD_U32LE)) { ! printf("H5T_STD_U32LE"); ! } else if (H5Tequal(type, H5T_STD_U64BE)) { ! printf("H5T_STD_U64BE"); ! } else if (H5Tequal(type, H5T_STD_U64LE)) { ! printf("H5T_STD_U64LE"); ! } else if (H5Tequal(type, H5T_NATIVE_SCHAR)) { ! printf("H5T_NATIVE_SCHAR"); ! } else if (H5Tequal(type, H5T_NATIVE_UCHAR)) { ! printf("H5T_NATIVE_UCHAR"); ! } else if (H5Tequal(type, H5T_NATIVE_SHORT)) { ! printf("H5T_NATIVE_SHORT"); ! } else if (H5Tequal(type, H5T_NATIVE_USHORT)) { ! printf("H5T_NATIVE_USHORT"); ! } else if (H5Tequal(type, H5T_NATIVE_INT)) { ! printf("H5T_NATIVE_INT"); ! } else if (H5Tequal(type, H5T_NATIVE_UINT)) { ! printf("H5T_NATIVE_UINT"); ! } else if (H5Tequal(type, H5T_NATIVE_LONG)) { ! printf("H5T_NATIVE_LONG"); ! } else if (H5Tequal(type, H5T_NATIVE_ULONG)) { ! printf("H5T_NATIVE_ULONG"); ! } else if (H5Tequal(type, H5T_NATIVE_LLONG)) { ! printf("H5T_NATIVE_LLONG"); ! } else if (H5Tequal(type, H5T_NATIVE_ULLONG)) { ! printf("H5T_NATIVE_ULLONG"); ! } else { ! printf("undefined integer"); ! d_status = 1; ! } ! break; ! ! case H5T_FLOAT: ! if (H5Tequal(type, H5T_IEEE_F32BE)) { ! printf("H5T_IEEE_F32BE"); ! } else if (H5Tequal(type, H5T_IEEE_F32LE)) { ! printf("H5T_IEEE_F32LE"); ! } else if (H5Tequal(type, H5T_IEEE_F64BE)) { ! printf("H5T_IEEE_F64BE"); ! } else if (H5Tequal(type, H5T_IEEE_F64LE)) { ! printf("H5T_IEEE_F64LE"); ! } else if (H5Tequal(type, H5T_NATIVE_FLOAT)) { ! printf("H5T_NATIVE_FLOAT"); ! } else if (H5Tequal(type, H5T_NATIVE_DOUBLE)) { ! printf("H5T_NATIVE_DOUBLE"); ! } else if (H5Tequal(type, H5T_NATIVE_LDOUBLE)) { ! printf("H5T_NATIVE_LDOUBLE"); ! } else { ! printf("undefined float"); ! d_status = 1; ! } ! break; ! ! case H5T_TIME: ! printf("H5T_TIME: not yet implemented"); ! break; ! ! case H5T_STRING: ! size = H5Tget_size(type); ! str_pad = H5Tget_strpad(type); ! cset = H5Tget_cset(type); ! ! printf("H5T_STRING %s\n", dump_header_format->strblockbegin); ! indent += COL; ! ! indentation(indent + COL); ! printf("%s %d;\n", STRSIZE, (int) size); ! ! indentation(indent + COL); ! printf("%s ", STRPAD); ! if (str_pad == H5T_STR_NULLTERM) ! printf("H5T_STR_NULLTERM;\n"); ! else if (str_pad == H5T_STR_NULLPAD) ! printf("H5T_STR_NULLPAD;\n"); ! else if (str_pad == H5T_STR_SPACEPAD) ! printf("H5T_STR_SPACEPAD;\n"); ! else ! printf("H5T_STR_ERROR;\n"); ! ! indentation(indent + COL); ! printf("%s ", CSET); ! ! if (cset == H5T_CSET_ASCII) ! printf("H5T_CSET_ASCII;\n"); ! else ! printf("unknown_cset;\n"); ! ! str_type = H5Tcopy(H5T_C_S1); ! H5Tset_cset(str_type, cset); ! H5Tset_size(str_type, size); ! H5Tset_strpad(str_type, str_pad); ! ! indentation(indent + COL); ! printf("%s ", CTYPE); ! ! if (H5Tequal(type, str_type)) { ! printf("H5T_C_S1;\n"); ! H5Tclose(str_type); ! } else { ! H5Tclose(str_type); ! str_type = H5Tcopy(H5T_FORTRAN_S1); ! H5Tset_cset(str_type, cset); ! H5Tset_size(str_type, size); ! H5Tset_strpad(str_type, str_pad); ! ! if (H5Tequal(type, str_type)) { ! printf("H5T_FORTRAN_S1;\n"); ! } else { ! printf("unknown_one_character_type;\n "); ! d_status = 1; ! } ! ! H5Tclose(str_type); ! } ! ! indent -= COL; ! indentation(indent + COL); ! printf("%s", dump_header_format->strblockend); ! break; ! ! case H5T_BITFIELD: ! if (H5Tequal(type, H5T_STD_B8BE)) { ! printf("H5T_STD_B8BE"); ! } else if (H5Tequal(type, H5T_STD_B8LE)) { ! printf("H5T_STD_B8LE"); ! } else if (H5Tequal(type, H5T_STD_B16BE)) { ! printf("H5T_STD_B16BE"); ! } else if (H5Tequal(type, H5T_STD_B16LE)) { ! printf("H5T_STD_B16LE"); ! } else if (H5Tequal(type, H5T_STD_B32BE)) { ! printf("H5T_STD_B32BE"); ! } else if (H5Tequal(type, H5T_STD_B32LE)) { ! printf("H5T_STD_B32LE"); ! } else if (H5Tequal(type, H5T_STD_B64BE)) { ! printf("H5T_STD_B64BE"); ! } else if (H5Tequal(type, H5T_STD_B64LE)) { ! printf("H5T_STD_B64LE"); ! } else { ! printf("undefined bitfield"); ! d_status = 1; ! } ! break; ! ! case H5T_OPAQUE: ! printf("\n"); ! indentation(indent + COL); ! printf("H5T_OPAQUE;\n"); ! indentation(indent + COL); ! printf("OPAQUE_TAG \"%s\";\n", H5Tget_tag(type)); ! indentation(indent); ! break; ! ! case H5T_COMPOUND: ! if (H5Tcommitted(type) > 0) { ! H5Gget_objinfo(type, ".", TRUE, &statbuf); ! i = search_obj(type_table, statbuf.objno); ! ! if (i >= 0) { ! if (!type_table->objs[i].recorded) ! printf("\"/#%lu:%lu\"\n", type_table->objs[i].objno[0], ! type_table->objs[i].objno[1]); ! else ! printf("\"%s\"", type_table->objs[i].objname); ! } else { ! printf("h5dump error: unknown committed type.\n"); ! d_status = 1; ! } ! } else { ! nmembers = H5Tget_nmembers(type); ! ! printf("H5T_COMPOUND %s\n", dump_header_format->structblockbegin); ! for (i = 0; i < nmembers; i++) { ! fname = H5Tget_member_name(type, i); ! mtype = H5Tget_member_type(type, i); ! ! indentation(indent + COL); ! ! if (H5Tget_class(mtype) == H5T_COMPOUND) { ! indent += COL; ! } ! ! print_datatype(mtype); ! ! if (H5Tget_class(mtype) == H5T_COMPOUND) { ! indent -= COL; ! } ! ! printf(" \"%s\";\n", fname); ! ! free(fname); ! } ! indentation(indent); ! printf("%s", dump_header_format->structblockend); ! } ! break; ! ! case H5T_REFERENCE: ! printf("H5T_REFERENCE"); ! break; ! ! case H5T_ENUM: ! printf("H5T_ENUM %s\n", dump_header_format->enumblockbegin); ! indent += COL; ! indentation(indent + COL); ! super = H5Tget_super(type); ! print_datatype(super); ! printf(";\n"); ! print_enum(type); ! indent -= COL; ! indentation(indent + COL); ! printf("%s", dump_header_format->enumblockend); ! break; ! ! case H5T_VLEN: ! printf("H5T_VLEN %s ", dump_header_format->vlenblockbegin); ! ! super = H5Tget_super(type); ! print_datatype(super); ! H5Tclose(super); ! ! /* Print closing */ ! printf("%s", dump_header_format->vlenblockend); ! break; ! ! case H5T_ARRAY: ! /* Get array base type */ ! super = H5Tget_super(type); ! ! /* Print lead-in */ ! printf("H5T_ARRAY { "); ! ! /* Get array information */ ! ndims = H5Tget_array_ndims(type); ! H5Tget_array_dims(type, dims, perm); ! ! /* Print array dimensions */ ! for (j = 0; j < ndims; j++) ! printf("[%d]", (int) dims[j]); ! ! printf(" "); ! ! /* Print base type */ ! print_datatype(super); ! ! /* Close array base type */ ! H5Tclose(super); ! ! /* Print closing */ ! printf(" }"); ! ! break; ! ! default: ! printf("unknown data type"); ! d_status = 1; ! break; } } *************** *** 581,587 **** dump_bb(void) { printf("%s %s boot block not yet implemented %s\n", ! BOOT_BLOCK, BEGIN, END); } /*------------------------------------------------------------------------- --- 789,795 ---- dump_bb(void) { printf("%s %s boot block not yet implemented %s\n", ! BOOT_BLOCK, BEGIN, END); } /*------------------------------------------------------------------------- *************** *** 604,617 **** indentation(indent); printf("%s %s ", dump_header_format->datatypebegin, ! dump_header_format->datatypeblockbegin); print_datatype(type); ! if (H5Tget_class(type) == H5T_COMPOUND || H5Tget_class(type) == H5T_STRING) ! indentation(indent); printf(" %s %s\n", dump_header_format->datatypeblockend, ! dump_header_format->datatypeend); indent -= COL; } --- 812,825 ---- indentation(indent); printf("%s %s ", dump_header_format->datatypebegin, ! dump_header_format->datatypeblockbegin); print_datatype(type); ! if (H5Tget_class(type) == H5T_COMPOUND ! || H5Tget_class(type) == H5T_STRING) indentation(indent); printf(" %s %s\n", dump_header_format->datatypeblockend, ! dump_header_format->datatypeend); indent -= COL; } *************** *** 632,684 **** static void dump_dataspace(hid_t space) { ! hsize_t size[H5DUMP_MAX_RANK]; ! hsize_t maxsize[H5DUMP_MAX_RANK]; ! int ndims = H5Sget_simple_extent_dims(space, size, maxsize); ! int i; indentation(indent + COL); printf("%s ", dump_header_format->dataspacebegin); if (H5Sis_simple(space)) { ! if (ndims == 0) { ! /* scalar dataspace */ ! HDfprintf(stdout, "%s %s ", ! dump_header_format->dataspacedescriptionbegin, ! SCALAR); ! } else { ! /* simple dataspace */ ! HDfprintf(stdout, "%s %s { %s %Hu", ! dump_header_format->dataspacedescriptionbegin, SIMPLE, ! dump_header_format->dataspacedimbegin,size[0]); ! ! for (i = 1; i < ndims; i++) ! HDfprintf(stdout, ", %Hu", size[i]); ! ! printf(" %s / ", dump_header_format->dataspacedimend); ! ! if (maxsize[0] == H5S_UNLIMITED) ! HDfprintf(stdout, "%s %s", ! dump_header_format->dataspacedimbegin, ! "H5S_UNLIMITED"); ! else ! HDfprintf(stdout, "%s %Hu", ! dump_header_format->dataspacedimbegin, maxsize[0]); ! ! for (i = 1; i < ndims; i++) ! if (maxsize[i] == H5S_UNLIMITED) ! HDfprintf(stdout, ", %s", "H5S_UNLIMITED"); ! else ! HDfprintf(stdout, ", %Hu", maxsize[i]); ! printf(" %s }", dump_header_format->dataspacedimend); ! } } else { ! printf("%s not yet implemented %s\n", BEGIN, END); } end_obj(dump_header_format->dataspaceend, ! dump_header_format->dataspaceblockend); } /*------------------------------------------------------------------------- --- 840,892 ---- static void dump_dataspace(hid_t space) { ! hsize_t size[H5DUMP_MAX_RANK]; ! hsize_t maxsize[H5DUMP_MAX_RANK]; ! int ndims = ! H5Sget_simple_extent_dims(space, size, maxsize); ! int i; indentation(indent + COL); printf("%s ", dump_header_format->dataspacebegin); if (H5Sis_simple(space)) { ! if (ndims == 0) { ! /* scalar dataspace */ ! HDfprintf(stdout, "%s %s ", ! dump_header_format->dataspacedescriptionbegin, SCALAR); ! } else { ! /* simple dataspace */ ! HDfprintf(stdout, "%s %s { %s %Hu", ! dump_header_format->dataspacedescriptionbegin, SIMPLE, ! dump_header_format->dataspacedimbegin, size[0]); ! ! for (i = 1; i < ndims; i++) ! HDfprintf(stdout, ", %Hu", size[i]); ! ! printf(" %s / ", dump_header_format->dataspacedimend); ! ! if (maxsize[0] == H5S_UNLIMITED) ! HDfprintf(stdout, "%s %s", ! dump_header_format->dataspacedimbegin, ! "H5S_UNLIMITED"); ! else ! HDfprintf(stdout, "%s %Hu", ! dump_header_format->dataspacedimbegin, maxsize[0]); ! ! for (i = 1; i < ndims; i++) ! if (maxsize[i] == H5S_UNLIMITED) ! HDfprintf(stdout, ", %s", "H5S_UNLIMITED"); ! else ! HDfprintf(stdout, ", %Hu", maxsize[i]); ! printf(" %s }", dump_header_format->dataspacedimend); ! } } else { ! printf("%s not yet implemented %s\n", BEGIN, END); } end_obj(dump_header_format->dataspaceend, ! dump_header_format->dataspaceblockend); } /*------------------------------------------------------------------------- *************** *** 696,739 **** * *-----------------------------------------------------------------------*/ static herr_t ! dump_attr(hid_t attr, const char *attr_name, void UNUSED *op_data) { ! hid_t attr_id, type, space; ! herr_t ret = SUCCEED; indentation(indent); begin_obj(dump_header_format->attributebegin, attr_name, ! dump_header_format->attributeblockbegin); ! ! if ((attr_id = H5Aopen_name (attr, attr_name)) >= 0) { ! type = H5Aget_type(attr_id); ! space = H5Aget_space(attr_id); ! dump_datatype(type); ! dump_dataspace(space); ! ! if (display_oid) ! dump_oid(attr_id); ! if (display_data) ! dump_data(attr_id, ATTRIBUTE_DATA); ! ! H5Tclose(type); ! H5Sclose(space); ! H5Aclose (attr_id); ! indentation (indent); ! end_obj(dump_header_format->attributeend, ! dump_header_format->attributeblockend); ! } else { ! indentation(indent + COL); ! printf("h5dump error: unable to open attribute.\n"); ! indentation(indent); ! end_obj(dump_header_format->attributeend, ! dump_header_format->attributeblockend); ! d_status = 1; ! ret = FAIL; } ! return ret; } /*------------------------------------------------------------------------- --- 904,947 ---- * *-----------------------------------------------------------------------*/ static herr_t ! dump_attr(hid_t attr, const char *attr_name, void UNUSED * op_data) { ! hid_t attr_id, type, space; ! herr_t ret = SUCCEED; indentation(indent); begin_obj(dump_header_format->attributebegin, attr_name, ! dump_header_format->attributeblockbegin); ! if ((attr_id = H5Aopen_name(attr, attr_name)) >= 0) { ! type = H5Aget_type(attr_id); ! space = H5Aget_space(attr_id); ! dump_datatype(type); ! dump_dataspace(space); ! ! if (display_oid) ! dump_oid(attr_id); ! ! if (display_data) ! dump_data(attr_id, ATTRIBUTE_DATA); ! ! H5Tclose(type); ! H5Sclose(space); ! H5Aclose(attr_id); ! indentation(indent); ! end_obj(dump_header_format->attributeend, ! dump_header_format->attributeblockend); ! } else { ! indentation(indent + COL); ! printf("h5dump error: unable to open attribute.\n"); ! indentation(indent); ! end_obj(dump_header_format->attributeend, ! dump_header_format->attributeblockend); ! d_status = 1; ! ret = FAIL; } ! return ret; } /*------------------------------------------------------------------------- *************** *** 753,875 **** static herr_t dump_selected_attr(hid_t loc_id, char *name) { ! int j; ! char *obj_name, *attr_name; ! hid_t oid, attr_id, type, space; ! H5G_stat_t statbuf; ! j = (int)strlen(name) - 1; obj_name = malloc(j + 2); /* find the last / */ ! while (name[j] != '/' && j >=0) ! j--; /* object name */ if (j == -1) { ! strcpy(obj_name, "/"); } else { ! strncpy(obj_name, name, j+1); ! obj_name[j+1] = '\0'; } attr_name = name + j + 1; begin_obj(dump_header_format->attributebegin, name, ! dump_header_format->attributeblockbegin); ! H5Gget_objinfo(loc_id, obj_name, FALSE , &statbuf); switch (statbuf.type) { case H5G_GROUP: ! if ((oid = H5Gopen(loc_id, obj_name)) < 0) { ! indentation(COL); ! fprintf(stdout, "h5dump error: unable to open %s\n", obj_name); ! end_obj(dump_header_format->attributeend, ! dump_header_format->attributeblockend); ! d_status = 1; ! return FAIL; ! } ! break; case H5G_DATASET: ! if ((oid = H5Dopen(loc_id, obj_name)) < 0) { ! indentation(COL); ! fprintf(stdout, "h5dump error: unable to open %s\n", obj_name); ! end_obj(dump_header_format->attributeend, ! dump_header_format->attributeblockend); ! d_status = 1; ! return FAIL; ! } ! break; case H5G_TYPE: ! if ((oid = H5Topen(loc_id, obj_name)) < 0 ) { ! indentation(COL); ! fprintf(stdout, "h5dump error: unable to open %s\n", obj_name); ! end_obj(dump_header_format->attributeend, ! dump_header_format->attributeblockend); ! d_status = 1; ! return FAIL; ! } ! break; default: ! indentation(COL); ! fprintf(stdout, "h5dump error: unable to open %s\n", obj_name); ! end_obj(dump_header_format->attributeend, ! dump_header_format->attributeblockend); ! d_status = 1; ! return FAIL; } ! if ((attr_id = H5Aopen_name (oid, attr_name)) >= 0) { ! type = H5Aget_type(attr_id); ! space = H5Aget_space(attr_id); ! dump_datatype(type); ! dump_dataspace(space); ! ! if (display_oid) ! dump_oid(attr_id); ! ! if (display_data) ! dump_data(attr_id, ATTRIBUTE_DATA); ! ! H5Tclose(type); ! H5Sclose(space); ! H5Aclose (attr_id); ! end_obj(dump_header_format->attributeend, ! dump_header_format->attributeblockend); ! } else { ! indentation(COL); ! printf("h5dump error: unable to open attribute.\n"); ! end_obj(dump_header_format->attributeend, ! dump_header_format->attributeblockend); ! d_status = 1; } switch (statbuf.type) { case H5G_GROUP: ! if (H5Gclose (oid) < 0) { ! d_status = 1; ! return FAIL; ! } ! break; ! case H5G_DATASET: ! if (H5Dclose (oid) < 0 ) { ! d_status = 1; ! return FAIL; ! } ! break; case H5G_TYPE: ! if (H5Tclose(oid) < 0 ) { ! d_status = 1; ! return FAIL; ! } ! break; default: ! d_status = 1; ! return FAIL; } free(obj_name); --- 961,1083 ---- static herr_t dump_selected_attr(hid_t loc_id, char *name) { ! int j; ! char *obj_name, *attr_name; ! hid_t oid, attr_id, type, space; ! H5G_stat_t statbuf; ! j = (int) strlen(name) - 1; obj_name = malloc(j + 2); /* find the last / */ ! while (name[j] != '/' && j >= 0) ! j--; /* object name */ if (j == -1) { ! strcpy(obj_name, "/"); } else { ! strncpy(obj_name, name, j + 1); ! obj_name[j + 1] = '\0'; } attr_name = name + j + 1; begin_obj(dump_header_format->attributebegin, name, ! dump_header_format->attributeblockbegin); ! H5Gget_objinfo(loc_id, obj_name, FALSE, &statbuf); switch (statbuf.type) { case H5G_GROUP: ! if ((oid = H5Gopen(loc_id, obj_name)) < 0) { ! indentation(COL); ! fprintf(stdout, "h5dump error: unable to open %s\n", obj_name); ! end_obj(dump_header_format->attributeend, ! dump_header_format->attributeblockend); ! d_status = 1; ! return FAIL; ! } ! break; case H5G_DATASET: ! if ((oid = H5Dopen(loc_id, obj_name)) < 0) { ! indentation(COL); ! fprintf(stdout, "h5dump error: unable to open %s\n", obj_name); ! end_obj(dump_header_format->attributeend, ! dump_header_format->attributeblockend); ! d_status = 1; ! return FAIL; ! } ! break; case H5G_TYPE: ! if ((oid = H5Topen(loc_id, obj_name)) < 0) { ! indentation(COL); ! fprintf(stdout, "h5dump error: unable to open %s\n", obj_name); ! end_obj(dump_header_format->attributeend, ! dump_header_format->attributeblockend); ! d_status = 1; ! return FAIL; ! } ! break; default: ! indentation(COL); ! fprintf(stdout, "h5dump error: unable to open %s\n", obj_name); ! end_obj(dump_header_format->attributeend, ! dump_header_format->attributeblockend); ! d_status = 1; ! return FAIL; } ! if ((attr_id = H5Aopen_name(oid, attr_name)) >= 0) { ! type = H5Aget_type(attr_id); ! space = H5Aget_space(attr_id); ! dump_datatype(type); ! dump_dataspace(space); ! ! if (display_oid) ! dump_oid(attr_id); ! ! if (display_data) ! dump_data(attr_id, ATTRIBUTE_DATA); ! ! H5Tclose(type); ! H5Sclose(space); ! H5Aclose(attr_id); ! end_obj(dump_header_format->attributeend, ! dump_header_format->attributeblockend); ! } else { ! indentation(COL); ! printf("h5dump error: unable to open attribute.\n"); ! end_obj(dump_header_format->attributeend, ! dump_header_format->attributeblockend); ! d_status = 1; } switch (statbuf.type) { case H5G_GROUP: ! if (H5Gclose(oid) < 0) { ! d_status = 1; ! return FAIL; ! } ! break; ! case H5G_DATASET: ! if (H5Dclose(oid) < 0) { ! d_status = 1; ! return FAIL; ! } ! break; case H5G_TYPE: ! if (H5Tclose(oid) < 0) { ! d_status = 1; ! return FAIL; ! } ! break; default: ! d_status = 1; ! return FAIL; } free(obj_name); *************** *** 888,1005 **** * Programmer: Ruey-Hsia Li * * Modifications: * *-----------------------------------------------------------------------*/ static herr_t ! dump_all(hid_t group, const char *name, void UNUSED *op_data) { ! hid_t obj; ! char *buf, *tmp; ! H5G_stat_t statbuf; ! int i; H5Gget_objinfo(group, name, FALSE, &statbuf); ! tmp = (char *)malloc(strlen(prefix) + strlen(name) + 2); strcpy(tmp, prefix); switch (statbuf.type) { case H5G_LINK: ! indentation(indent); ! buf = malloc(statbuf.linklen); ! begin_obj(dump_header_format->softlinkbegin, name, ! dump_header_format->softlinkblockbegin); ! indentation(indent + COL); ! ! if (H5Gget_linkval(group, name, statbuf.linklen, buf) >= 0) { ! printf("LINKTARGET \"%s\"\n", buf); ! } else { ! printf("h5dump error: unable to get link value.\n"); ! d_status = 1; ! } ! ! indentation(indent); ! end_obj(dump_header_format->softlinkend, ! dump_header_format->softlinkblockend); ! free(buf); ! break; case H5G_GROUP: ! if ((obj = H5Gopen (group, name)) >= 0) { ! strcat(strcat(prefix, "/"), name); ! dump_group(obj, name); ! strcpy(prefix, tmp); ! H5Gclose (obj); ! } else { ! printf("h5dump error: unable to dump group %s\n", name); ! d_status = 1; ! } ! break; case H5G_DATASET: ! if ((obj = H5Dopen(group, name)) >= 0) { ! /* hard link */ ! H5Gget_objinfo(obj, ".", TRUE, &statbuf); ! ! if (statbuf.nlink > 1) { ! i = search_obj (dset_table, statbuf.objno); ! ! if (i < 0) { ! indentation(indent); ! begin_obj(dump_header_format->datasetbegin, name, ! dump_header_format->datasetblockbegin); ! indentation(indent + COL); ! printf("h5dump error: internal error\n"); ! indentation(indent); ! end_obj(dump_header_format->datasetend, ! dump_header_format->datasetblockend); ! d_status = 1; ! goto done; ! } else if (dset_table->objs[i].displayed) { ! indentation(indent); ! begin_obj(dump_header_format->datasetbegin, name, ! dump_header_format->datasetblockbegin); ! indentation(indent + COL); ! printf("%s \"%s\"\n", HARDLINK, dset_table->objs[i].objname); ! indentation(indent); ! end_obj(dump_header_format->datasetend, ! dump_header_format->datasetblockend); ! goto done; ! } else { ! dset_table->objs[i].displayed = 1; ! strcat(tmp, "/"); ! strcat(tmp, name); ! strcpy(dset_table->objs[i].objname, tmp); ! } ! } ! ! dump_dataset(obj, name); ! H5Dclose(obj); ! } else { ! printf("h5dump error: unable to dump dataset %s\n", name); ! d_status = 1; ! } ! break; case H5G_TYPE: ! if ((obj = H5Topen(group, name)) >= 0) { ! dump_named_datatype(obj, name); ! H5Tclose(obj); ! } else { ! printf("h5dump error: unable to dump data type %s\n", name); ! d_status = 1; ! } ! break; default: ! printf ("h5dump error: unknown object %s\n", name); ! d_status = 1; ! return FAIL; } ! done: free(tmp); return SUCCEED; } --- 1096,1417 ---- * Programmer: Ruey-Hsia Li * * Modifications: + * 11/00 Added XML support * *-----------------------------------------------------------------------*/ static herr_t ! dump_all(hid_t group, const char *name, void UNUSED * op_data) { ! hid_t obj; ! char *buf, *tmp; ! H5G_stat_t statbuf; ! int i; H5Gget_objinfo(group, name, FALSE, &statbuf); ! tmp = (char *) malloc(strlen(prefix) + strlen(name) + 2); strcpy(tmp, prefix); switch (statbuf.type) { case H5G_LINK: ! indentation(indent); ! buf = malloc(statbuf.linklen); ! ! if (!doxml) { ! begin_obj(dump_header_format->softlinkbegin, name, ! dump_header_format->softlinkblockbegin); ! indentation(indent + COL); ! } ! ! if (H5Gget_linkval(group, name, statbuf.linklen, buf) >= 0) { ! /* print the value of a soft link */ ! if (!doxml) { ! /* Standard DDL: no modification */ ! printf("LINKTARGET \"%s\"\n", buf); ! } else { ! /* XML */ ! printf ! ("\n", ! xml_escape_the_name(name), xml_escape_the_name(buf), ! xml_escape_the_name(buf), xml_escape_the_name(name), ! (strcmp(prefix, ! "") ? xml_escape_the_name(prefix) : "root")); ! } ! } else { ! printf("h5dump error: unable to get link value.\n"); ! d_status = 1; ! } ! ! if (!doxml) { ! indentation(indent); ! end_obj(dump_header_format->softlinkend, ! dump_header_format->softlinkblockend); ! } ! ! free(buf); ! break; case H5G_GROUP: ! if ((obj = H5Gopen(group, name)) >= 0) { ! strcat(strcat(prefix, "/"), name); ! dump_function_table->dump_group_function(obj, name); ! strcpy(prefix, tmp); ! H5Gclose(obj); ! } else { ! printf("h5dump error: unable to dump group %s\n", name); ! d_status = 1; ! } ! break; case H5G_DATASET: ! if ((obj = H5Dopen(group, name)) >= 0) { ! /* hard link */ ! H5Gget_objinfo(obj, ".", TRUE, &statbuf); ! ! if (statbuf.nlink > 1) { ! i = search_obj(dset_table, statbuf.objno); ! ! if (i < 0) { ! indentation(indent); ! begin_obj(dump_header_format->datasetbegin, name, ! dump_header_format->datasetblockbegin); ! indentation(indent + COL); ! printf("h5dump error: internal error\n"); ! indentation(indent); ! end_obj(dump_header_format->datasetend, ! dump_header_format->datasetblockend); ! d_status = 1; ! goto done; ! } else if (dset_table->objs[i].displayed) { ! indentation(indent); ! if (!doxml) { ! begin_obj(dump_header_format->datasetbegin, name, ! dump_header_format->datasetblockbegin); ! indentation(indent + COL); ! printf("%s \"%s\"\n", HARDLINK, ! dset_table->objs[i].objname); ! indentation(indent); ! end_obj(dump_header_format->datasetend, ! dump_header_format->datasetblockend); ! } else { ! /* the XML version */ ! printf ! ("\n", ! xml_escape_the_name(name), ! xml_escape_the_name(tmp), ! (strcmp(prefix, "") ? xml_escape_the_name(prefix) ! : "root")); ! ! indentation(indent + COL); ! printf("\n", ! xml_escape_the_name(dset_table->objs[i]. ! objname)); ! indentation(indent); ! printf("%s\n", dump_header_format->datasetend); ! } ! H5Dclose(obj); ! goto done; ! } else { ! dset_table->objs[i].displayed = 1; ! strcat(tmp, "/"); ! strcat(tmp, name); ! strcpy(dset_table->objs[i].objname, tmp); ! } ! } ! ! dump_function_table->dump_dataset_function(obj, name); ! H5Dclose(obj); ! } else { ! printf("h5dump error: unable to dump dataset %s\n", name); ! d_status = 1; ! } ! break; ! ! case H5G_TYPE: ! if ((obj = H5Topen(group, name)) >= 0) { ! dump_function_table->dump_named_datatype_function(obj, name); ! H5Tclose(obj); ! } else { ! printf("h5dump error: unable to dump data type %s\n", name); ! d_status = 1; ! } ! ! break; ! ! default: ! printf("h5dump error: unknown object %s\n", name); ! d_status = 1; ! return FAIL; ! } ! ! done: ! free(tmp); ! return SUCCEED; ! } ! ! /*------------------------------------------------------------------------- ! * Function: xml_dump all ! * ! * Purpose: Dump everything in the specified object: dump in order. ! * ! * Return: Success: SUCCEED ! * ! * Failure: FAIL ! * ! * Programmer: REMcG ! * ! * Modifications: ! * 11/00 Added XML support ! * ! *-----------------------------------------------------------------------*/ ! static herr_t ! xml_dump_all(hid_t group, const char *name, void *op_data) ! { ! hid_t obj; ! char *buf, *tmp; ! H5G_stat_t statbuf; ! int i; ! ! H5Gget_objinfo(group, name, FALSE, &statbuf); ! if (statbuf.type != *(int *) op_data) ! return SUCCEED; ! tmp = (char *) malloc(strlen(prefix) + strlen(name) + 2); ! strcpy(tmp, prefix); ! ! switch (statbuf.type) { ! case H5G_LINK: ! indentation(indent); ! buf = malloc(statbuf.linklen); ! ! if (!doxml) { ! begin_obj(dump_header_format->softlinkbegin, name, ! dump_header_format->softlinkblockbegin); ! indentation(indent + COL); ! } ! ! if (H5Gget_linkval(group, name, statbuf.linklen, buf) >= 0) { ! /* print the value of a soft link */ ! if (!doxml) { ! /* Standard DDL: no modification */ ! printf("LINKTARGET \"%s\"\n", buf); ! } else { ! /* XML */ ! printf ! ("\n", ! xml_escape_the_name(name), xml_escape_the_name(buf), ! xml_escape_the_name(buf), xml_escape_the_name(name), ! (strcmp(prefix, ! "") ? xml_escape_the_name(prefix) : "root")); ! } ! } else { ! printf("h5dump error: unable to get link value.\n"); ! d_status = 1; ! } ! ! if (!doxml) { ! indentation(indent); ! end_obj(dump_header_format->softlinkend, ! dump_header_format->softlinkblockend); ! } ! ! free(buf); ! break; ! ! case H5G_GROUP: ! if ((obj = H5Gopen(group, name)) >= 0) { ! strcat(strcat(prefix, "/"), name); ! dump_function_table->dump_group_function(obj, name); ! strcpy(prefix, tmp); ! H5Gclose(obj); ! } else { ! printf("h5dump error: unable to dump group %s\n", name); ! d_status = 1; ! } ! ! break; ! case H5G_DATASET: ! if ((obj = H5Dopen(group, name)) >= 0) { ! /* hard link */ ! H5Gget_objinfo(obj, ".", TRUE, &statbuf); ! ! if (statbuf.nlink > 1) { ! i = search_obj(dset_table, statbuf.objno); ! ! if (i < 0) { ! indentation(indent); ! begin_obj(dump_header_format->datasetbegin, name, ! dump_header_format->datasetblockbegin); ! indentation(indent + COL); ! printf("h5dump error: internal error\n"); ! indentation(indent); ! end_obj(dump_header_format->datasetend, ! dump_header_format->datasetblockend); ! d_status = 1; ! goto done; ! } else if (dset_table->objs[i].displayed) { ! indentation(indent); ! if (!doxml) { ! begin_obj(dump_header_format->datasetbegin, name, ! dump_header_format->datasetblockbegin); ! indentation(indent + COL); ! printf("%s \"%s\"\n", HARDLINK, ! dset_table->objs[i].objname); ! indentation(indent); ! end_obj(dump_header_format->datasetend, ! dump_header_format->datasetblockend); ! } else { ! /* the XML version */ ! printf ! ("\n", ! xml_escape_the_name(name), ! xml_escape_the_name(tmp), ! (strcmp(prefix, "") ? xml_escape_the_name(prefix) ! : "root")); ! ! indentation(indent + COL); ! printf("\n", ! xml_escape_the_name(dset_table->objs[i]. ! objname)); ! indentation(indent); ! printf("%s\n", dump_header_format->datasetend); ! } ! H5Dclose(obj); ! goto done; ! } else { ! dset_table->objs[i].displayed = 1; ! strcat(tmp, "/"); ! strcat(tmp, name); ! strcpy(dset_table->objs[i].objname, tmp); ! } ! } ! ! dump_function_table->dump_dataset_function(obj, name); ! H5Dclose(obj); ! } else { ! printf("h5dump error: unable to dump dataset %s\n", name); ! d_status = 1; ! } ! break; case H5G_TYPE: ! if ((obj = H5Topen(group, name)) >= 0) { ! dump_function_table->dump_named_datatype_function(obj, name); ! H5Tclose(obj); ! } else { ! printf("h5dump error: unable to dump data type %s\n", name); ! d_status = 1; ! } ! break; default: ! printf("h5dump error: unknown object %s\n", name); ! d_status = 1; ! return FAIL; } ! done: free(tmp); return SUCCEED; } *************** *** 1020,1043 **** dump_named_datatype(hid_t type, const char *name) { indentation(indent); ! printf("%s \"%s\" %s",dump_header_format->datatypebegin, name, ! dump_header_format->datatypeblockbegin); if (H5Tget_class(type) == H5T_COMPOUND) { ! hid_t temp_type=H5Tcopy(type); ! print_datatype(temp_type); ! H5Tclose(temp_type); } else { ! indentation(indent + COL); ! print_datatype(type); ! printf(";\n"); } indentation(indent); end_obj(dump_header_format->datatypeend, ! dump_header_format->datatypeblockend); } /*------------------------------------------------------------------------- * Function: dump_group --- 1432,1492 ---- dump_named_datatype(hid_t type, const char *name) { indentation(indent); ! printf("%s \"%s\" %s", dump_header_format->datatypebegin, name, ! dump_header_format->datatypeblockbegin); ! ! if (H5Tget_class(type) == H5T_COMPOUND) { ! hid_t temp_type = H5Tcopy(type); ! ! print_datatype(temp_type); ! H5Tclose(temp_type); ! } else { ! indentation(indent + COL); ! print_datatype(type); ! printf(";\n"); ! } ! ! indentation(indent); ! end_obj(dump_header_format->datatypeend, ! dump_header_format->datatypeblockend); ! } ! ! #ifdef notdef ! static void ! dump_named_datatype(hid_t type, const char *name) ! { ! int nmembers = 1, x; ! hid_t comptype; ! char *compname; ! ! indentation(indent); ! begin_obj(dump_header_format->datatypebegin, name, ! dump_header_format->datatypeblockbegin); if (H5Tget_class(type) == H5T_COMPOUND) { ! nmembers = H5Tget_nmembers(type); ! for (x = 0; x < nmembers; x++) { ! comptype = H5Tget_member_type(type, x); ! compname = H5Tget_member_name(type, x); ! ! indentation(indent + COL); ! print_datatype(comptype); ! printf(" \"%s\"", compname); ! ! printf(";\n"); ! } } else { ! indentation(indent + COL); ! print_datatype(type); ! printf(";\n"); } indentation(indent); end_obj(dump_header_format->datatypeend, ! dump_header_format->datatypeblockend); } + #endif /*------------------------------------------------------------------------- * Function: dump_group *************** *** 1054,1115 **** static void dump_group(hid_t gid, const char *name) { ! H5G_stat_t statbuf; ! hid_t dset, type; ! char typename[1024], *tmp; ! int i; tmp = malloc(strlen(prefix) + strlen(name) + 2); strcpy(tmp, prefix); indentation(indent); begin_obj(dump_header_format->groupbegin, name, ! dump_header_format->groupblockbegin); indent += COL; if (display_oid) ! dump_oid(gid); if (!strcmp(name, "/") && unamedtype) ! /* dump unamed type in root group */ ! for (i = 0; i < type_table->nobjs; i++) ! if (!type_table->objs[i].recorded) { ! dset = H5Dopen(gid, type_table->objs[i].objname); ! type = H5Dget_type(dset); ! sprintf(typename,"#%lu:%lu", ! type_table->objs[i].objno[0], ! type_table->objs[i].objno[1]); ! dump_named_datatype(type, typename); ! H5Tclose(type); ! H5Dclose(dset); ! } H5Gget_objinfo(gid, ".", TRUE, &statbuf); ! if (statbuf.nlink > 1) { ! i = search_obj (group_table, statbuf.objno); ! if (i < 0) { ! indentation(indent); ! printf("h5dump error: internal error\n"); ! d_status = 1; ! } else if (group_table->objs[i].displayed) { ! indentation(indent); ! printf("%s \"%s\"\n", HARDLINK, group_table->objs[i].objname); ! } else { ! strcpy(group_table->objs[i].objname, prefix); ! group_table->objs[i].displayed = 1; ! H5Aiterate(gid, NULL, dump_attr, NULL); ! H5Giterate(gid, ".", NULL, dump_all, NULL); ! } } else { ! H5Aiterate(gid, NULL, dump_attr, NULL); ! H5Giterate(gid, ".", NULL, dump_all, NULL); } indent -= COL; indentation(indent); ! end_obj(dump_header_format->groupend, ! dump_header_format->groupblockend); free(tmp); } --- 1503,1563 ---- static void dump_group(hid_t gid, const char *name) { ! H5G_stat_t statbuf; ! hid_t dset, type; ! char typename[1024], *tmp; ! int i; tmp = malloc(strlen(prefix) + strlen(name) + 2); strcpy(tmp, prefix); indentation(indent); begin_obj(dump_header_format->groupbegin, name, ! dump_header_format->groupblockbegin); indent += COL; if (display_oid) ! dump_oid(gid); if (!strcmp(name, "/") && unamedtype) ! /* dump unamed type in root group */ ! for (i = 0; i < type_table->nobjs; i++) ! if (!type_table->objs[i].recorded) { ! dset = H5Dopen(gid, type_table->objs[i].objname); ! type = H5Dget_type(dset); ! sprintf(typename, "#%lu:%lu", ! type_table->objs[i].objno[0], ! type_table->objs[i].objno[1]); ! dump_named_datatype(type, typename); ! H5Tclose(type); ! H5Dclose(dset); ! } H5Gget_objinfo(gid, ".", TRUE, &statbuf); ! if (statbuf.nlink > 1) { ! i = search_obj(group_table, statbuf.objno); ! if (i < 0) { ! indentation(indent); ! printf("h5dump error: internal error\n"); ! d_status = 1; ! } else if (group_table->objs[i].displayed) { ! indentation(indent); ! printf("%s \"%s\"\n", HARDLINK, group_table->objs[i].objname); ! } else { ! strcpy(group_table->objs[i].objname, prefix); ! group_table->objs[i].displayed = 1; ! H5Aiterate(gid, NULL, dump_attr, NULL); ! H5Giterate(gid, ".", NULL, dump_all, NULL); ! } } else { ! H5Aiterate(gid, NULL, dump_attr, NULL); ! H5Giterate(gid, ".", NULL, dump_all, NULL); } indent -= COL; indentation(indent); ! end_obj(dump_header_format->groupend, dump_header_format->groupblockend); free(tmp); } *************** *** 1128,1169 **** static void dump_dataset(hid_t did, const char *name) { ! hid_t type, space; ! indentation (indent); begin_obj(dump_header_format->datasetbegin, name, ! dump_header_format->datasetblockbegin); type = H5Dget_type(did); space = H5Dget_space(did); dump_datatype(type); dump_dataspace(space); if (display_oid) ! dump_oid(did); if (display_data) ! switch (H5Tget_class(type)) { ! case H5T_TIME: ! indentation(indent + COL); ! printf("DATA{ not yet implemented.}\n"); ! break; ! ! case H5T_INTEGER: ! case H5T_FLOAT: ! case H5T_STRING: ! case H5T_BITFIELD: ! case H5T_OPAQUE: ! case H5T_COMPOUND: ! case H5T_REFERENCE: ! case H5T_ENUM: ! case H5T_VLEN: ! case H5T_ARRAY: ! dump_data(did,DATASET_DATA); ! break; ! ! default: ! break; ! } indent += COL; H5Aiterate(did, NULL, dump_attr, NULL); --- 1576,1617 ---- static void dump_dataset(hid_t did, const char *name) { ! hid_t type, space; ! indentation(indent); begin_obj(dump_header_format->datasetbegin, name, ! dump_header_format->datasetblockbegin); type = H5Dget_type(did); space = H5Dget_space(did); dump_datatype(type); dump_dataspace(space); if (display_oid) ! dump_oid(did); if (display_data) ! switch (H5Tget_class(type)) { ! case H5T_TIME: ! indentation(indent + COL); ! printf("DATA{ not yet implemented.}\n"); ! break; ! ! case H5T_INTEGER: ! case H5T_FLOAT: ! case H5T_STRING: ! case H5T_BITFIELD: ! case H5T_OPAQUE: ! case H5T_COMPOUND: ! case H5T_REFERENCE: ! case H5T_ENUM: ! case H5T_VLEN: ! case H5T_ARRAY: ! dump_data(did, DATASET_DATA); ! break; ! ! default: ! break; ! } indent += COL; H5Aiterate(did, NULL, dump_attr, NULL); *************** *** 1172,1178 **** H5Sclose(space); indentation(indent); end_obj(dump_header_format->datasetend, ! dump_header_format->datasetblockend); } #if H5DUMP_DEBUG --- 1620,1626 ---- H5Sclose(space); indentation(indent); end_obj(dump_header_format->datasetend, ! dump_header_format->datasetblockend); } #if H5DUMP_DEBUG *************** *** 1188,1226 **** * Modifications: * *-----------------------------------------------------------------------*/ ! static void dump_tables(void) { ! int i; printf("group_table: # of entries = %d\n", group_table->nobjs); ! for ( i = 0; i < group_table->nobjs; i++) ! printf("%ul %ul %s %d %d\n", group_table->objs[i].objno[0], ! group_table->objs[i].objno[1], ! group_table->objs[i].objname, ! group_table->objs[i].displayed, ! group_table->objs[i].recorded); printf("\ndset_table: # of entries = %d\n", dset_table->nobjs); ! for ( i = 0; i < dset_table->nobjs; i++) ! printf("%ul %ul %s %d %d\n", dset_table->objs[i].objno[0], ! dset_table->objs[i].objno[1], ! dset_table->objs[i].objname, ! dset_table->objs[i].displayed, ! dset_table->objs[i].recorded); ! printf("\ntype_table: # of entries = %d\n", type_table->nobjs); ! for ( i = 0; i < type_table->nobjs; i++) ! printf("%ul %ul %s %d %d\n", type_table->objs[i].objno[0], ! type_table->objs[i].objno[1], ! type_table->objs[i].objname, ! type_table->objs[i].displayed, ! type_table->objs[i].recorded); } ! #endif /* H5DUMP_DEBUG */ /*------------------------------------------------------------------------- * Function: dump_data --- 1636,1671 ---- * Modifications: * *-----------------------------------------------------------------------*/ ! static void dump_tables(void) { ! int i; printf("group_table: # of entries = %d\n", group_table->nobjs); ! for (i = 0; i < group_table->nobjs; i++) ! printf("%ul %ul %s %d %d\n", group_table->objs[i].objno[0], ! group_table->objs[i].objno[1], ! group_table->objs[i].objname, ! group_table->objs[i].displayed, group_table->objs[i].recorded); printf("\ndset_table: # of entries = %d\n", dset_table->nobjs); ! for (i = 0; i < dset_table->nobjs; i++) ! printf("%ul %ul %s %d %d\n", dset_table->objs[i].objno[0], ! dset_table->objs[i].objno[1], ! dset_table->objs[i].objname, ! dset_table->objs[i].displayed, dset_table->objs[i].recorded); ! printf("\ntype_table: # of entries = %d\n", type_table->nobjs); ! for (i = 0; i < type_table->nobjs; i++) ! printf("%ul %ul %s %d %d\n", type_table->objs[i].objno[0], ! type_table->objs[i].objno[1], ! type_table->objs[i].objname, ! type_table->objs[i].displayed, type_table->objs[i].recorded); } ! #endif /* H5DUMP_DEBUG */ /*------------------------------------------------------------------------- * Function: dump_data *************** *** 1238,1251 **** static void dump_data(hid_t obj_id, int obj_data) { ! h5dump_t *outputformat = &dataformat; ! int d_status = -1; ! void *buf; ! hid_t space, type, p_type; ! int ndims, i; ! hsize_t size[64], nelmts = 1; ! int depth; ! int stdindent = COL; /* should be 3*/ outputformat->line_ncols = nCols; indent += COL; --- 1683,1696 ---- static void dump_data(hid_t obj_id, int obj_data) { ! h5dump_t *outputformat = &dataformat; ! int d_status = -1; ! void *buf; ! hid_t space, type, p_type; ! int ndims, i; ! hsize_t size[64], nelmts = 1; ! int depth; ! int stdindent = COL; /* should be 3 */ outputformat->line_ncols = nCols; indent += COL; *************** *** 1258,1300 **** */ depth = indent / stdindent + 1; indentation(indent); ! begin_obj(dump_header_format->databegin, (const char *)NULL, ! dump_header_format->datablockbegin); /* Print all the values. */ if (obj_data == DATASET_DATA) { ! d_status = h5dump_dset(stdout, outputformat, obj_id, -1,depth); } else { ! /* need to call h5dump_mem for the attribute data */ ! type = H5Aget_type(obj_id); ! p_type = h5dump_fixtype(type); ! space = H5Aget_space(obj_id); ! ndims = H5Sget_simple_extent_dims(space, size, NULL); ! ! for (i = 0; i < ndims; i++) ! nelmts *= size[i]; ! ! buf = malloc(nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type))); ! assert(buf); ! ! if (H5Aread(obj_id, p_type, buf) >= 0) ! d_status = h5dump_mem(stdout, outputformat, obj_id, p_type, space, buf, depth); ! ! free(buf); ! H5Tclose(p_type); ! H5Sclose(space); ! H5Tclose(type); } - if (d_status < 0) { ! indentation(indent+COL); ! printf("Unable to print data.\n"); ! d_status = 1; } indentation(indent); ! end_obj(dump_header_format->dataend, ! dump_header_format->datablockend); indent -= COL; } --- 1703,1744 ---- */ depth = indent / stdindent + 1; indentation(indent); ! begin_obj(dump_header_format->databegin, (const char *) NULL, ! dump_header_format->datablockbegin); /* Print all the values. */ if (obj_data == DATASET_DATA) { ! d_status = h5dump_dset(stdout, outputformat, obj_id, -1, depth); } else { ! /* need to call h5dump_mem for the attribute data */ ! type = H5Aget_type(obj_id); ! p_type = h5dump_fixtype(type); ! space = H5Aget_space(obj_id); ! ndims = H5Sget_simple_extent_dims(space, size, NULL); ! ! for (i = 0; i < ndims; i++) ! nelmts *= size[i]; ! ! buf = malloc(nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type))); ! assert(buf); ! ! if (H5Aread(obj_id, p_type, buf) >= 0) ! d_status = ! h5dump_mem(stdout, outputformat, obj_id, p_type, space, buf, ! depth); ! free(buf); ! H5Tclose(p_type); ! H5Sclose(space); ! H5Tclose(type); } if (d_status < 0) { ! indentation(indent + COL); ! printf("Unable to print data.\n"); ! d_status = 1; } indentation(indent); ! end_obj(dump_header_format->dataend, dump_header_format->datablockend); indent -= COL; } *************** *** 1316,1327 **** static int set_output_file(const char *fname) { ! FILE *f; /* temporary holding place for the stream pointer */ ! /* so that rawdatastream is changed only when succeeded */ ! if ((f = fopen(fname, "w"))!=NULL) { ! rawdatastream = f; ! return 0; } return -1; --- 1760,1771 ---- static int set_output_file(const char *fname) { ! FILE *f; /* temporary holding place for the stream pointer */ ! /* so that rawdatastream is changed only when succeeded */ ! if ((f = fopen(fname, "w")) != NULL) { ! rawdatastream = f; ! return 0; } return -1; *************** *** 1340,1366 **** * Modifications: * Albert Cheng, 2000/09/30 * Add the -o option--output file for datasets raw data * *-----------------------------------------------------------------------*/ int main(int argc, char *argv[]) { ! hid_t fid, gid, dsetid, typeid; ! char *fname = NULL; ! int i, index, curr_arg, display_bb=0, display_all=1, newwidth= 0; ! int nopts=0, *opts; ! char *buf, name[128], name1[128]; ! H5G_stat_t statbuf; ! void *edata; ! hid_t (*func)(void*); ! find_objs_t *info = malloc(sizeof(find_objs_t)); if (argc < 2) { ! usage(); ! exit(1); } dump_header_format = &standardformat; /* Disable error reporting */ H5Eget_auto(&func, &edata); --- 1784,1814 ---- * Modifications: * Albert Cheng, 2000/09/30 * Add the -o option--output file for datasets raw data + * Changes to support XML Nov. 2000, REMcG * *-----------------------------------------------------------------------*/ int main(int argc, char *argv[]) { ! hid_t fid, gid, dsetid, typeid; ! char *fname = NULL; ! int i, index, curr_arg, display_bb = 0, display_all = ! 1, newwidth = 0; ! int nopts = 0, *opts; ! int usingdasho = 0; ! char *buf, name[128], name1[128]; ! H5G_stat_t statbuf; ! void *edata; ! hid_t (*func) (void *); ! find_objs_t *info = malloc(sizeof(find_objs_t)); if (argc < 2) { ! usage(); ! exit(1); } dump_header_format = &standardformat; + dump_function_table = &ddl_function_table; /* Disable error reporting */ H5Eget_auto(&func, &edata); *************** *** 1374,1495 **** /* parse command line options */ for (curr_arg = 1; curr_arg < argc; curr_arg++) { ! if (argv[curr_arg][0] == '-') { ! opts[nopts++] = curr_arg; ! ! if (!strcmp(argv[curr_arg],"-h")) { ! usage(); ! free(opts); ! exit(0); ! } else if (!strcmp(argv[curr_arg],"-V")) { ! print_version("h5dump"); ! free(opts); ! exit(0); ! } else if (!strcmp(argv[curr_arg],"-bb")) { ! display_bb = 1; ! } else if (!strcmp(argv[curr_arg],"-header")) { ! display_data=0; ! } else if (!strcmp(argv[curr_arg],"-v")) { ! display_oid = 1; ! } else if (!strcmp(argv[curr_arg],"-w")) { ! /* ! * this way we know which arg was the -w we know it won't be 0 ! * since curr_arg starts at 1 ! */ ! newwidth = curr_arg; ! } else if (!strcmp(argv[curr_arg], "-o")) { ! /* a separate output file for dataset raw data */ ! if (argc == curr_arg){ ! /* missing */ ! usage(); ! free(opts); ! exit(1); ! } ! ! if (set_output_file(argv[curr_arg+1]) < 0){ ! /* failed to set output file */ ! usage(); ! free(opts); ! exit(1); ! } ! } else if (!strcmp(argv[curr_arg], "-xml")) { ! dump_header_format = &xmlformat; ! } else if (strcmp(argv[curr_arg],"-a") && ! strcmp(argv[curr_arg],"-d") && ! strcmp(argv[curr_arg],"-g") && ! strcmp(argv[curr_arg],"-l") && ! strcmp(argv[curr_arg],"-t")) { ! fprintf(stderr, "h5dump error: illegal option %s \n", ! argv[curr_arg]); ! usage(); ! free(opts); ! exit(1); ! } else { ! display_all = 0; ! } ! } } /* check names */ if (argc == 2) { ! if (opts[0] == 1) { ! /* argv[1] is an option */ ! fprintf(stderr, "h5dump error: no or no \n"); ! usage(); ! free(opts); ! exit(1); ! } ! } else { ! for (i = 0; i < nopts-1; i++) { ! if (opts[i + 1] - opts[i] == 1) { ! if (strcmp(argv[opts[i]], "-bb") && ! strcmp(argv[opts[i]], "-header") && ! strcmp(argv[opts[i]], "-xml") && ! strcmp(argv[opts[i]], "-v")) { ! fprintf(stderr, ! "h5dump error: no after option %s\n", ! argv[opts[i]]); ! usage(); ! free(opts); ! exit(1); ! } ! } ! } ! ! if (argc - opts[nopts - 1] == 1) { ! fprintf(stderr,"h5dump error: no \n"); ! usage(); ! free(opts); ! exit(1); ! } ! ! if (argc - opts[nopts - 1] == 2) { ! if (strcmp(argv[opts[i]], "-bb") && ! strcmp(argv[opts[i]], "-header") && ! strcmp(argv[opts[i]], "-xml") && ! strcmp(argv[opts[i]], "-v")) { ! fprintf(stderr, ! "h5dump error: no or no " ! "or no after option %s\n", argv[opts[i]]); ! usage(); ! free(opts); ! exit(1); ! } ! } } if (argv[argc - 1][0] == '\\') ! fname = &argv[argc - 1][1]; else ! fname = argv[argc - 1]; fid = h5dump_fopen(fname, NULL, 0); if (fid < 0) { ! fprintf(stderr, "h5dump error: unable to open file %s \n", fname); ! free(opts); ! exit(1); ! } /* allocate and initialize internal data structure */ init_table(&group_table); --- 1822,1986 ---- /* parse command line options */ for (curr_arg = 1; curr_arg < argc; curr_arg++) { ! if (argv[curr_arg][0] == '-') { ! opts[nopts++] = curr_arg; ! ! if (!strcmp(argv[curr_arg], "-h")) { ! usage(); ! free(opts); ! exit(0); ! } else if (!strcmp(argv[curr_arg], "-V")) { ! print_version("h5dump"); ! free(opts); ! exit(0); ! } else if (!strcmp(argv[curr_arg], "-bb")) { ! display_bb = 1; ! } else if (!strcmp(argv[curr_arg], "-header")) { ! display_data = 0; ! } else if (!strcmp(argv[curr_arg], "-v")) { ! display_oid = 1; ! } else if (!strcmp(argv[curr_arg], "-w")) { ! /* ! * this way we know which arg was the -w we know it won't be 0 ! * since curr_arg starts at 1 ! */ ! newwidth = curr_arg; ! } else if (!strcmp(argv[curr_arg], "-o")) { ! /* a separate output file for dataset raw data */ ! if (argc == curr_arg) { ! /* missing */ ! usage(); ! free(opts); ! exit(1); ! } ! ! if (set_output_file(argv[curr_arg + 1]) < 0) { ! /* failed to set output file */ ! usage(); ! free(opts); ! exit(1); ! } else { ! usingdasho = 1; ! } ! } else if (!strcmp(argv[curr_arg], "-xml")) { ! /* select XML output */ ! doxml = 1; ! dump_header_format = &xmlformat; ! dump_function_table = &xml_function_table; ! } else if (!strcmp(argv[curr_arg], "-dtd")) { ! /* specify alternative XML DTD */ ! if (argc == curr_arg) { ! /* missing */ ! usage(); ! free(opts); ! exit(1); ! } ! xml_dtd_uri = strdup(argv[curr_arg + 1]); ! } else if (strcmp(argv[curr_arg], "-a") && ! strcmp(argv[curr_arg], "-d") && ! strcmp(argv[curr_arg], "-g") && ! strcmp(argv[curr_arg], "-l") && ! strcmp(argv[curr_arg], "-t")) { ! fprintf(stderr, "h5dump error: illegal option %s \n", ! argv[curr_arg]); ! usage(); ! free(opts); ! exit(1); ! } else { ! display_all = 0; ! } ! } } /* check names */ if (argc == 2) { ! if (opts[0] == 1) { ! /* argv[1] is an option */ ! fprintf(stderr, "h5dump error: no or no \n"); ! usage(); ! free(opts); ! exit(1); ! } ! } else { ! for (i = 0; i < nopts - 1; i++) { ! if (opts[i + 1] - opts[i] == 1) { ! if (strcmp(argv[opts[i]], "-bb") && ! strcmp(argv[opts[i]], "-header") && ! strcmp(argv[opts[i]], "-xml") && ! strcmp(argv[opts[i]], "-v")) { ! fprintf(stderr, ! "h5dump error: no after option %s\n", ! argv[opts[i]]); ! usage(); ! free(opts); ! exit(1); ! } ! } ! } ! ! if (argc - opts[nopts - 1] == 1) { ! fprintf(stderr, "h5dump error: no \n"); ! usage(); ! free(opts); ! exit(1); ! } ! ! if (argc - opts[nopts - 1] == 2) { ! if (strcmp(argv[opts[i]], "-bb") && ! strcmp(argv[opts[i]], "-header") && ! strcmp(argv[opts[i]], "-xml") && strcmp(argv[opts[i]], "-v")) { ! fprintf(stderr, ! "h5dump error: no or no " ! "or no after option %s\n", argv[opts[i]]); ! usage(); ! free(opts); ! exit(1); ! } ! } } + /* check for conflicting options */ + if (doxml) { + if (!display_all) { + fprintf(stderr, "h5dump error: option %s not available for XML\n", + "to display selected objects"); + exit(1); + } else if (display_bb) { + fprintf(stderr, "h5dump error: option %s not available for XML\n", + "-bb"); + exit(1); + } else if (!display_data) { + fprintf(stderr, "h5dump error: option %s not available for XML\n", + "-header"); + exit(1); + } else if (display_oid == 1) { + fprintf(stderr, "h5dump error: option %s not available for XML\n", + "-v"); + exit(1); + } else if (usingdasho) { + fprintf(stderr, "h5dump error: option %s not available for XML\n", + "-o"); + exit(1); + } + } else { + if (xml_dtd_uri != NULL) { + fprintf(stderr, + "h5dump warning: option %s only applies with XML: %s\n", + "-dtd ", xml_dtd_uri); + } + } if (argv[argc - 1][0] == '\\') ! fname = &argv[argc - 1][1]; else ! fname = argv[argc - 1]; fid = h5dump_fopen(fname, NULL, 0); if (fid < 0) { ! fprintf(stderr, "h5dump error: unable to open file %s \n", fname); ! free(opts); ! exit(1); ! } /* allocate and initialize internal data structure */ init_table(&group_table); *************** *** 1507,1730 **** info->dset_table = dset_table; info->status = d_status; /* find all shared objects */ ! H5Giterate(fid, "/", NULL, find_objs, (void*)info); strcpy(prefix, ""); /* does there exist unamed committed data type */ ! for ( i = 0; i < type_table->nobjs; i++) ! if (type_table->objs[i].recorded == 0) ! unamedtype = 1; #ifdef H5DUMP_DEBUG dump_tables(); #endif if (info->status) { ! printf("internal error! \n"); ! goto done; } /* start to dump */ ! begin_obj(dump_header_format->filebegin, fname, ! dump_header_format->fileblockbegin); ! ! if (display_bb) ! dump_bb(); ! if (newwidth) ! sscanf(argv[newwidth + 1], "%d", &nCols); if (display_all) { ! if ((gid = H5Gopen (fid, "/")) < 0 ) { ! fprintf(stdout, "h5dump error: unable to open root group\n"); ! d_status = 1; ! } else { ! dump_group(gid, "/"); ! } ! ! if (H5Gclose (gid) < 0) { ! fprintf(stdout, "h5dump error: unable to close root group\n"); ! d_status = 1; ! } ! } else { ! for (i = 0; i < nopts; i++) { ! if (!strcmp(argv[opts[i]],"-a")) { ! for (curr_arg = opts[i] + 1; ! curr_arg < ((i + 1) == nopts ? (argc - 1) : opts[i + 1]); ! curr_arg++) ! dump_selected_attr (fid, argv[curr_arg]); ! } else if (!strcmp(argv[opts[i]],"-d")) { ! for (curr_arg = opts[i] + 1; ! curr_arg < ((i + 1) == nopts ? (argc - 1) : opts[i + 1]); ! curr_arg++) { ! ! if ((dsetid = H5Dopen (fid, argv[curr_arg]))<0) { ! begin_obj(dump_header_format->datasetbegin, argv[curr_arg], ! dump_header_format->datasetblockbegin); ! indentation(COL); ! fprintf(stdout, "h5dump error: unable to open %s\n", ! argv[curr_arg]); ! end_obj(dump_header_format->datasetend, ! dump_header_format->datasetblockend); ! d_status = 1; ! } else { ! H5Gget_objinfo(dsetid, ".", TRUE, &statbuf); ! ! if (statbuf.nlink > 1) { ! index = search_obj (dset_table, statbuf.objno); ! ! if (index >= 0) { ! if (dset_table->objs[index].displayed) { ! begin_obj(dump_header_format->datasetbegin, ! argv[curr_arg], ! dump_header_format->datasetblockbegin); ! indentation(indent + COL); ! printf("%s \"%s\"\n", HARDLINK, ! dset_table->objs[index].objname); ! indentation(indent); ! end_obj(dump_header_format->datasetend, ! dump_header_format->datasetblockend); ! } else { ! strcpy(dset_table->objs[index].objname, ! argv[curr_arg]); ! dset_table->objs[index].displayed = 1; ! dump_dataset(dsetid, argv[curr_arg]); ! } ! } else { ! d_status = 1; ! } ! } else { ! dump_dataset(dsetid, argv[curr_arg]); ! } ! ! if (H5Dclose(dsetid) < 1) ! d_status = 1; ! } ! } ! } else if (!strcmp(argv[opts[i]],"-g")) { ! for (curr_arg = opts[i] + 1; ! curr_arg < ((i + 1) == nopts ? (argc - 1) : opts[i + 1]); ! curr_arg++) { ! if ((gid = H5Gopen(fid, argv[curr_arg])) < 0) { ! begin_obj(dump_header_format->groupbegin, argv[curr_arg], ! dump_header_format->groupblockbegin); ! indentation(COL); ! fprintf(stdout, "h5dump error: unable to open %s\n", ! argv[curr_arg]); ! end_obj(dump_header_format->groupend, ! dump_header_format->groupblockend); ! d_status = 1; ! } else { ! H5Gget_objinfo(gid, ".", TRUE, &statbuf); ! strcpy(prefix, argv[curr_arg]); ! dump_group(gid, argv[curr_arg]); ! ! if (H5Gclose(gid) < 0) ! d_status = 1; ! } ! } ! } else if (!strcmp(argv[opts[i]],"-l")) { ! for (curr_arg = opts[i] + 1; ! curr_arg < ((i + 1) == nopts ? (argc - 1) : opts[i + 1]); ! curr_arg++) { ! if (H5Gget_objinfo(fid, argv[curr_arg], FALSE, &statbuf) < 0) { ! begin_obj(dump_header_format->softlinkbegin, ! argv[curr_arg], ! dump_header_format->softlinkblockbegin); ! indentation(COL); ! fprintf(stdout, "h5dump error: unable to get obj info from %s\n", ! argv[curr_arg]); ! end_obj(dump_header_format->softlinkend, ! dump_header_format->softlinkblockend); ! d_status = 1; ! } else if (statbuf.type == H5G_LINK) { ! buf = malloc(statbuf.linklen*sizeof(char)); ! begin_obj(dump_header_format->softlinkbegin, ! argv[curr_arg], ! dump_header_format->softlinkblockbegin); ! indentation(COL); ! ! if (H5Gget_linkval(fid, argv[curr_arg], statbuf.linklen, buf) >= 0) { ! printf("LINKTARGET \"%s\"\n", buf); ! } else { ! fprintf(stdout, "h5dump error: unable to get link value\n"); ! d_status = 1; ! } ! ! end_obj(dump_header_format->softlinkend, ! dump_header_format->softlinkblockend); ! free(buf); ! } else { ! begin_obj(dump_header_format->softlinkbegin, ! argv[curr_arg], ! dump_header_format->softlinkblockbegin); ! indentation(COL); ! fprintf(stdout, "h5dump error: %s is not a link\n", argv[curr_arg]); ! end_obj(dump_header_format->softlinkend, ! dump_header_format->softlinkblockend); ! d_status = 1; ! } ! } ! } else if (!strcmp(argv[opts[i]],"-t")) { ! for (curr_arg = opts[i] + 1; ! curr_arg < ((i + 1) == nopts ? (argc - 1) : opts[i + 1]); ! curr_arg++) { ! if ((typeid = H5Topen(fid, argv[curr_arg])) < 0) { ! /* check if argv[curr_arg] is unamed data type */ ! index = 0; ! ! while (index < type_table->nobjs ) { ! if (!type_table->objs[index].recorded) { /* unamed data type */ ! sprintf(name, "#%lu:%lu\n", ! type_table->objs[index].objno[0], ! type_table->objs[index].objno[1]); ! sprintf(name1, "/#%lu:%lu\n", ! type_table->objs[index].objno[0], ! type_table->objs[index].objno[1]); ! ! if (!strncmp(name, argv[curr_arg], strlen(argv[curr_arg])) || ! !strncmp(name1, argv[curr_arg], strlen(argv[curr_arg]))) ! break; ! } ! ! index++; ! } ! ! if (index == type_table->nobjs) { ! /* unknown type */ ! begin_obj(dump_header_format->datatypebegin, argv[curr_arg], ! dump_header_format->datatypeblockbegin); ! indentation(COL); ! fprintf(stdout, "h5dump error: unable to open %s\n", ! argv[curr_arg]); ! end_obj(dump_header_format->datatypeend, ! dump_header_format->datatypeblockend); ! d_status = 1; ! } else { ! dsetid = H5Dopen(fid, type_table->objs[index].objname); ! typeid = H5Dget_type(dsetid); ! dump_named_datatype(typeid, argv[curr_arg]); ! H5Tclose(typeid); ! H5Dclose(dsetid); ! } ! } else { ! dump_named_datatype(typeid, argv[curr_arg]); ! ! if (H5Tclose(typeid) < 0) ! d_status = 1; ! } ! } ! } ! } } ! end_obj(dump_header_format->fileend, dump_header_format->fileblockend); ! done: if (H5Fclose(fid) < 0) ! d_status = 1; free(group_table->objs); free(dset_table->objs); free(type_table->objs); --- 1998,2273 ---- info->dset_table = dset_table; info->status = d_status; + if (doxml) { + /* initialize XML */ + thefile = fid; + + /* find all objects that might be targets of a refernce */ + if ((gid = H5Gopen(fid, "/")) >= 0) { + ref_path_table_put(gid, "/"); + H5Giterate(fid, "/", NULL, fill_ref_path_table, (void *) info); + } + H5Gclose(gid); + /* reset prefix! */ + strcpy(prefix, ""); + + /* make sure the URI is initialized to something */ + if (xml_dtd_uri == NULL) + xml_dtd_uri = strdup(DEFAULT_DTD); + } + /* find all shared objects */ ! H5Giterate(fid, "/", NULL, find_objs, (void *) info); strcpy(prefix, ""); /* does there exist unamed committed data type */ ! for (i = 0; i < type_table->nobjs; i++) ! if (type_table->objs[i].recorded == 0) ! unamedtype = 1; #ifdef H5DUMP_DEBUG dump_tables(); #endif if (info->status) { ! printf("internal error! \n"); ! goto done; } /* start to dump */ ! if (!doxml) { ! begin_obj(dump_header_format->filebegin, fname, ! dump_header_format->fileblockbegin); ! } else { ! printf("\n"); ! printf("\n", ! xml_dtd_uri); ! printf("\n"); ! } ! ! if (!doxml && display_bb) ! dump_bb(); ! if (newwidth) ! sscanf(argv[newwidth + 1], "%d", &nCols); if (display_all) { ! if ((gid = H5Gopen(fid, "/")) < 0) { ! fprintf(stdout, "h5dump error: unable to open root group\n"); ! d_status = 1; ! } else { ! dump_function_table->dump_group_function(gid, "/"); ! } ! ! if (H5Gclose(gid) < 0) { ! fprintf(stdout, "h5dump error: unable to close root group\n"); ! d_status = 1; ! } ! } else { ! if (doxml) { ! /* Note: this option is not supported for XML */ ! printf("internal error! \n"); ! goto done; ! } ! for (i = 0; i < nopts; i++) { ! if (!strcmp(argv[opts[i]], "-a")) { ! for (curr_arg = opts[i] + 1; ! curr_arg < ((i + 1) == nopts ? (argc - 1) : opts[i + 1]); ! curr_arg++) ! dump_selected_attr(fid, argv[curr_arg]); ! } else if (!strcmp(argv[opts[i]], "-d")) { ! for (curr_arg = opts[i] + 1; ! curr_arg < ((i + 1) == nopts ? (argc - 1) : opts[i + 1]); ! curr_arg++) { ! ! if ((dsetid = H5Dopen(fid, argv[curr_arg])) < 0) { ! begin_obj(dump_header_format->datasetbegin, ! argv[curr_arg], ! dump_header_format->datasetblockbegin); ! indentation(COL); ! fprintf(stdout, "h5dump error: unable to open %s\n", ! argv[curr_arg]); ! end_obj(dump_header_format->datasetend, ! dump_header_format->datasetblockend); ! d_status = 1; ! } else { ! H5Gget_objinfo(dsetid, ".", TRUE, &statbuf); ! ! if (statbuf.nlink > 1) { ! index = search_obj(dset_table, statbuf.objno); ! ! if (index >= 0) { ! if (dset_table->objs[index].displayed) { ! begin_obj ! (dump_header_format->datasetbegin, ! argv[curr_arg], ! dump_header_format-> ! datasetblockbegin); ! indentation(indent + COL); ! printf("%s \"%s\"\n", HARDLINK, ! dset_table->objs[index].objname); ! indentation(indent); ! end_obj(dump_header_format->datasetend, ! dump_header_format-> ! datasetblockend); ! } else { ! strcpy(dset_table->objs[index].objname, ! argv[curr_arg]); ! dset_table->objs[index].displayed = 1; ! dump_dataset(dsetid, argv[curr_arg]); ! } ! } else { ! d_status = 1; ! } ! } else { ! dump_dataset(dsetid, argv[curr_arg]); ! } ! ! if (H5Dclose(dsetid) < 1) ! d_status = 1; ! } ! } ! } else if (!strcmp(argv[opts[i]], "-g")) { ! for (curr_arg = opts[i] + 1; ! curr_arg < ((i + 1) == nopts ? (argc - 1) : opts[i + 1]); ! curr_arg++) { ! if ((gid = H5Gopen(fid, argv[curr_arg])) < 0) { ! begin_obj(dump_header_format->groupbegin, ! argv[curr_arg], ! dump_header_format->groupblockbegin); ! indentation(COL); ! fprintf(stdout, "h5dump error: unable to open %s\n", ! argv[curr_arg]); ! end_obj(dump_header_format->groupend, ! dump_header_format->groupblockend); ! d_status = 1; ! } else { ! H5Gget_objinfo(gid, ".", TRUE, &statbuf); ! strcpy(prefix, argv[curr_arg]); ! dump_group(gid, argv[curr_arg]); ! ! if (H5Gclose(gid) < 0) ! d_status = 1; ! } ! } ! } else if (!strcmp(argv[opts[i]], "-l")) { ! for (curr_arg = opts[i] + 1; ! curr_arg < ((i + 1) == nopts ? (argc - 1) : opts[i + 1]); ! curr_arg++) { ! if (H5Gget_objinfo(fid, argv[curr_arg], FALSE, &statbuf) < ! 0) { ! begin_obj(dump_header_format->softlinkbegin, ! argv[curr_arg], ! dump_header_format->softlinkblockbegin); ! indentation(COL); ! fprintf(stdout, ! "h5dump error: unable to get obj info from %s\n", ! argv[curr_arg]); ! end_obj(dump_header_format->softlinkend, ! dump_header_format->softlinkblockend); ! d_status = 1; ! } else if (statbuf.type == H5G_LINK) { ! buf = malloc(statbuf.linklen * sizeof(char)); ! begin_obj(dump_header_format->softlinkbegin, ! argv[curr_arg], ! dump_header_format->softlinkblockbegin); ! indentation(COL); ! ! if (H5Gget_linkval ! (fid, argv[curr_arg], statbuf.linklen, buf) >= 0) { ! printf("LINKTARGET \"%s\"\n", buf); ! } else { ! fprintf(stdout, ! "h5dump error: unable to get link value\n"); ! d_status = 1; ! } ! ! end_obj(dump_header_format->softlinkend, ! dump_header_format->softlinkblockend); ! free(buf); ! } else { ! begin_obj(dump_header_format->softlinkbegin, ! argv[curr_arg], ! dump_header_format->softlinkblockbegin); ! indentation(COL); ! fprintf(stdout, "h5dump error: %s is not a link\n", ! argv[curr_arg]); ! end_obj(dump_header_format->softlinkend, ! dump_header_format->softlinkblockend); ! d_status = 1; ! } ! } ! } else if (!strcmp(argv[opts[i]], "-t")) { ! for (curr_arg = opts[i] + 1; ! curr_arg < ((i + 1) == nopts ? (argc - 1) : opts[i + 1]); ! curr_arg++) { ! if ((typeid = H5Topen(fid, argv[curr_arg])) < 0) { ! /* check if argv[curr_arg] is unamed data type */ ! index = 0; ! ! while (index < type_table->nobjs) { ! if (!type_table->objs[index].recorded) { /* unamed data type */ ! sprintf(name, "#%lu:%lu\n", ! type_table->objs[index].objno[0], ! type_table->objs[index].objno[1]); ! sprintf(name1, "/#%lu:%lu\n", ! type_table->objs[index].objno[0], ! type_table->objs[index].objno[1]); ! ! if (!strncmp ! (name, argv[curr_arg], ! strlen(argv[curr_arg])) ! || !strncmp(name1, argv[curr_arg], ! strlen(argv[curr_arg]))) ! break; ! } ! ! index++; ! } ! ! if (index == type_table->nobjs) { ! /* unknown type */ ! begin_obj(dump_header_format->datatypebegin, ! argv[curr_arg], ! dump_header_format->datatypeblockbegin); ! indentation(COL); ! fprintf(stdout, ! "h5dump error: unable to open %s\n", ! argv[curr_arg]); ! end_obj(dump_header_format->datatypeend, ! dump_header_format->datatypeblockend); ! d_status = 1; ! } else { ! dsetid = ! H5Dopen(fid, type_table->objs[index].objname); ! typeid = H5Dget_type(dsetid); ! dump_named_datatype(typeid, argv[curr_arg]); ! H5Tclose(typeid); ! H5Dclose(dsetid); ! } ! } else { ! dump_named_datatype(typeid, argv[curr_arg]); ! ! if (H5Tclose(typeid) < 0) ! d_status = 1; ! } ! } ! } ! } } ! if (!doxml) { ! end_obj(dump_header_format->fileend, ! dump_header_format->fileblockend); ! } else { ! printf("%s\n", dump_header_format->fileend); ! } ! done: if (H5Fclose(fid) < 0) ! d_status = 1; + /* To Do: clean up XML table */ free(group_table->objs); free(dset_table->objs); free(type_table->objs); *************** *** 1756,1772 **** static void print_enum(hid_t type) { ! char **name = NULL; /*member names */ ! unsigned char *value = NULL; /*value array */ ! int nmembs; /*number of members */ ! int nchars; /*number of output characters */ ! hid_t super; /*enum base integer type */ ! hid_t native = -1; /*native integer data type */ ! size_t dst_size; /*destination value type size */ ! int i; /*miscellaneous counters */ ! size_t j; ! ! nmembs = H5Tget_nmembers(type); super = H5Tget_super(type); /* --- 2299,2315 ---- static void print_enum(hid_t type) { ! char **name = NULL; /*member names */ ! unsigned char *value = NULL; /*value array */ ! int nmembs; /*number of members */ ! int nchars; /*number of output characters */ ! hid_t super; /*enum base integer type */ ! hid_t native = -1; /*native integer data type */ ! size_t dst_size; /*destination value type size */ ! int i; /*miscellaneous counters */ ! size_t j; ! ! nmembs = H5Tget_nmembers(type); super = H5Tget_super(type); /* *************** *** 1776,1791 **** * 2. unsigned long_long -- the largest native unsigned integer * 3. raw format */ ! if (H5Tget_size(type)<=sizeof(long_long)) { ! dst_size = sizeof(long_long); ! if (H5T_SGN_NONE==H5Tget_sign(type)) { ! native = H5T_NATIVE_ULLONG; ! } else { ! native = H5T_NATIVE_LLONG; ! } } else { ! dst_size = H5Tget_size(type); } /* Get the names and raw values of all members */ --- 2319,2334 ---- * 2. unsigned long_long -- the largest native unsigned integer * 3. raw format */ ! if (H5Tget_size(type) <= sizeof(long_long)) { ! dst_size = sizeof(long_long); ! if (H5T_SGN_NONE == H5Tget_sign(type)) { ! native = H5T_NATIVE_ULLONG; ! } else { ! native = H5T_NATIVE_LLONG; ! } } else { ! dst_size = H5Tget_size(type); } /* Get the names and raw values of all members */ *************** *** 1793,1841 **** value = calloc(nmembs, MAX(H5Tget_size(type), dst_size)); for (i = 0; i < nmembs; i++) { ! name[i] = H5Tget_member_name(type, i); ! H5Tget_member_value(type, i, value + i * H5Tget_size(type)); } /* Convert values to native data type */ if (native > 0) ! H5Tconvert(super, native, nmembs, value, NULL, H5P_DEFAULT); /* Sort members by increasing value */ ! /*not implemented yet*/ /* Print members */ for (i = 0; i < nmembs; i++) { ! indentation(indent + COL); ! nchars = printf("\"%s\"", name[i]);/*display_string(stdout, name[i], TRUE);*/ ! printf("%*s ", MAX(0, 16 - nchars), ""); ! ! if (native < 0) { ! printf("0x"); ! ! for (j = 0; j < dst_size; j++) ! printf("%02x", value[i * dst_size + j]); ! } else if (H5T_SGN_NONE == H5Tget_sign(native)) { ! printf("%" PRINTF_LL_WIDTH "u", ! *((unsigned long_long *)((void *)(value + i * dst_size)))); ! } else { ! printf("%" PRINTF_LL_WIDTH "d", ! *((long_long *)((void *)(value + i * dst_size)))); ! } ! printf(";\n"); } /* Release resources */ for (i = 0; i < nmembs; i++) ! free(name[i]); free(name); free(value); H5Tclose(super); if (0 == nmembs) ! printf("\n%*s ", indent+4, ""); } /*------------------------------------------------------------------------- --- 2336,2384 ---- value = calloc(nmembs, MAX(H5Tget_size(type), dst_size)); for (i = 0; i < nmembs; i++) { ! name[i] = H5Tget_member_name(type, i); ! H5Tget_member_value(type, i, value + i * H5Tget_size(type)); } /* Convert values to native data type */ if (native > 0) ! H5Tconvert(super, native, nmembs, value, NULL, H5P_DEFAULT); /* Sort members by increasing value */ ! /*not implemented yet */ /* Print members */ for (i = 0; i < nmembs; i++) { ! indentation(indent + COL); ! nchars = printf("\"%s\"", name[i]); /*display_string(stdout, name[i], TRUE); */ ! printf("%*s ", MAX(0, 16 - nchars), ""); ! ! if (native < 0) { ! printf("0x"); ! ! for (j = 0; j < dst_size; j++) ! printf("%02x", value[i * dst_size + j]); ! } else if (H5T_SGN_NONE == H5Tget_sign(native)) { ! printf("%" PRINTF_LL_WIDTH "u", *((unsigned long_long *) ! ((void *) (value + i * dst_size)))); ! } else { ! printf("%" PRINTF_LL_WIDTH "d", ! *((long_long *) ((void *) (value + i * dst_size)))); ! } ! printf(";\n"); } /* Release resources */ for (i = 0; i < nmembs; i++) ! free(name[i]); free(name); free(value); H5Tclose(super); if (0 == nmembs) ! printf("\n%*s ", indent + 4, ""); } /*------------------------------------------------------------------------- *************** *** 1850,1860 **** * Modifications: * *-----------------------------------------------------------------------*/ ! static void dump_oid(hid_t oid) { indentation(indent + COL); printf("%s %s ", OBJID, BEGIN); printf("%d", oid); ! printf(" %s\n", END); } --- 2393,4316 ---- * Modifications: * *-----------------------------------------------------------------------*/ ! static void dump_oid(hid_t oid) { indentation(indent + COL); printf("%s %s ", OBJID, BEGIN); printf("%d", oid); ! printf(" %s\n", END); ! } ! ! /* ! * XML support ! */ ! ! /* ! * XML needs a table to look up a path name for an object ! * reference. ! * ! * This table stores mappings of reference -> path ! * for all objects in the file that may be the target of ! * an object reference. ! * ! * The 'path' is an absolute path by which the object ! * can be accessed. When an object has > 1 such path, ! * only one will be used in the table, with no particular ! * 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 */ ! ! /*------------------------------------------------------------------------- ! * Function: ref_path_table_lookup ! * ! * Purpose: Looks up a table entry given a path name. ! * Used during construction of the table. ! * ! * Return: The table entre (pte) or NULL if not in the ! * table. ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! struct ref_path_table_entry_t * ! ref_path_table_lookup(hid_t obj, char *thepath) ! { ! int i; ! hobj_ref_t *ref; ! herr_t status; ! struct ref_path_table_entry_t *pte = ref_path_table; ! if (ref_path_table == NULL) ! return NULL; ! ref = (hobj_ref_t *) malloc(sizeof(hobj_ref_t)); ! if (ref == NULL) { ! /* fatal error ? */ ! return NULL; ! } ! status = H5Rcreate(ref, thefile, thepath, H5R_OBJECT, -1); ! if (status < 0) { ! /* fatal error ? */ ! return NULL; ! } ! for (i = 0; i < npte; i++) { ! if (memcmp(ref, pte->obj_ref, sizeof(hobj_ref_t)) == 0) { ! return pte; ! } ! pte = pte->next; ! } ! return NULL; ! } ! ! /*------------------------------------------------------------------------- ! * Function: ref_path_table_put ! * ! * Purpose: Enter the 'obj' with 'path' in the table if ! * not already there. ! * Create an object reference, pte, and store them ! * in the table. ! * ! * Return: The object reference for the object. ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! ! hobj_ref_t * ! ref_path_table_put(hid_t obj, char *path) ! { ! hobj_ref_t *ref; ! herr_t status; ! struct ref_path_table_entry_t *pte; ! ! /* look up 'obj'. If already in table, return */ ! pte = ref_path_table_lookup(obj, path); ! if (pte != NULL) ! return pte->obj_ref; ! ! /* 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 = obj; ! ref = (hobj_ref_t *) malloc(sizeof(hobj_ref_t)); ! if (ref == NULL) { ! /* fatal error? */ ! free(pte); ! return NULL; ! } ! ! status = H5Rcreate(ref, thefile, path, H5R_OBJECT, -1); ! if (status < 0) { ! /* fatal error? */ ! free(ref); ! free(pte); ! return NULL; ! } ! ! pte->obj_ref = ref; ! ! pte->apath = strdup(path); ! ! pte->next = ref_path_table; ! ref_path_table = pte; ! ! npte++; ! ! return ref; ! } ! ! /*------------------------------------------------------------------------- ! * Function: lookup_ref_path ! * ! * Purpose: Lookup the path to the object with refernce 'ref'. ! * ! * Return: Return a path to the object, or NULL if not found. ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! char * ! lookup_ref_path(hobj_ref_t * ref) ! { ! int i; ! struct ref_path_table_entry_t *pte = NULL; ! ! if (ref_path_table == NULL) ! return NULL; ! ! pte = ref_path_table; ! if (pte == NULL) { ! /* fatal -- not initialized? */ ! return NULL; ! } ! for (i = 0; i < npte; i++) { ! if (memcmp(ref, pte->obj_ref, sizeof(hobj_ref_t)) == 0) { ! return pte->apath; ! } ! pte = pte->next; ! } ! return NULL; ! } ! ! /*------------------------------------------------------------------------- ! * Function: fill_ref_path_table ! * ! * Purpose: Called by interator to create references for ! * all objects and enter them in the table. ! * ! * Return: Error status. ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! ! static herr_t ! fill_ref_path_table(hid_t group, const char *name, void UNUSED * op_data) ! { ! hid_t obj; ! char *tmp; ! H5G_stat_t statbuf; ! struct ref_path_table_entry_t *pte; ! char *thepath; ! ! H5Gget_objinfo(group, name, FALSE, &statbuf); ! tmp = (char *) malloc(strlen(prefix) + strlen(name) + 2); ! if (tmp == NULL) ! return FAIL; ! thepath = (char *) malloc(strlen(prefix) + strlen(name) + 2); ! if (thepath == NULL) { ! free(tmp); ! return FAIL; ! } ! strcpy(tmp, prefix); ! ! strcpy(thepath, prefix); ! strcat(thepath, "/"); ! strcat(thepath, name); ! ! switch (statbuf.type) { ! case H5G_DATASET: ! if ((obj = H5Dopen(group, name)) >= 0) { ! pte = ref_path_table_lookup(obj, thepath); ! if (pte == NULL) { ! ref_path_table_put(obj, thepath); ! } ! H5Dclose(obj); ! } else { ! fprintf(stderr, "h5dump error: unable to get dataset %s\n", name); ! d_status = 1; ! } ! break; ! case H5G_GROUP: ! if ((obj = H5Gopen(group, name)) >= 0) { ! strcat(strcat(prefix, "/"), name); ! pte = ref_path_table_lookup(obj, thepath); ! if (pte == NULL) { ! ref_path_table_put(obj, thepath); ! H5Giterate(obj, ".", NULL, fill_ref_path_table, NULL); ! strcpy(prefix, tmp); ! } ! H5Gclose(obj); ! } else { ! fprintf(stderr, "h5dump error: unable to dump group %s\n", name); ! d_status = 1; ! } ! break; ! case H5G_TYPE: ! if ((obj = H5Topen(group, name)) >= 0) { ! pte = ref_path_table_lookup(obj, thepath); ! if (pte == NULL) { ! ref_path_table_put(obj, thepath); ! } ! H5Tclose(obj); ! } else { ! fprintf(stderr, "h5dump error: unable to get dataset %s\n", name); ! d_status = 1; ! } ! break; ! default:; ! } ! free(tmp); ! free(thepath); ! return 0; ! } ! ! static const char *quote = """; ! static const char *amp = "&"; ! static const char *lt = "<"; ! static const char *gt = ">"; ! static const char *apos = "'"; ! ! /*------------------------------------------------------------------------- ! * Function: xml_escape_the_name ! * ! * Purpose: Escape XML reserved chars in a name, so HDF5 strings ! * and paths can be correctly read back in XML element. ! * ! * Return: The revised string. ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! ! char * ! xml_escape_the_name(const char *str) ! { ! int extra; ! int len; ! int i; ! char *cp; ! char *ncp; ! char *rcp; ! ! if (str == NULL) ! return (char *) str; ! cp = (char *) str; ! len = strlen(str); ! extra = 0; ! for (i = 0; i < len; i++) { ! if (*cp == '\"') { ! extra += (strlen(quote) - 1); ! } else if (*cp == '\'') { ! extra += (strlen(apos) - 1); ! } else if (*cp == '<') { ! extra += (strlen(lt) - 1); ! } else if (*cp == '>') { ! extra += (strlen(gt) - 1); ! } else if (*cp == '&') { ! extra += (strlen(amp) - 1); ! } ! cp++; ! } ! ! if (extra == 0) { ! return (char *) str; ! } else { ! cp = (char *) str; ! rcp = ncp = malloc(len + extra + 1); ! if (ncp == NULL) ! return NULL; /* ?? */ ! for (i = 0; i < len; i++) { ! if (*cp == '\'') { ! strncpy(ncp, apos, strlen(apos)); ! ncp += strlen(apos); ! cp++; ! } else if (*cp == '<') { ! strncpy(ncp, lt, strlen(lt)); ! ncp += strlen(lt); ! cp++; ! } else if (*cp == '>') { ! strncpy(ncp, gt, strlen(gt)); ! ncp += strlen(gt); ! cp++; ! } else if (*cp == '\"') { ! strncpy(ncp, quote, strlen(quote)); ! ncp += strlen(quote); ! cp++; ! } else if (*cp == '&') { ! strncpy(ncp, amp, strlen(amp)); ! ncp += strlen(amp); ! cp++; ! } else { ! *ncp++ = *cp++; ! } ! } ! *ncp = '\0'; ! return rcp; ! } ! } ! ! /*------------------------------------------------------------------------- ! * Function: xml_escape_the_string ! * ! * Purpose: Escape XML reserved chars in a string, so HDF5 strings ! * and paths can be correctly read back in XML CDATA. ! * ! * Return: The revised string. ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! ! char * ! xml_escape_the_string(const char *str) ! { ! int extra; ! int len; ! int i; ! char *cp; ! char *ncp; ! char *rcp; ! ! if (str == NULL) ! return (char *) str; ! cp = (char *) str; ! len = strlen(str); ! extra = 0; ! for (i = 0; i < len; i++) { ! if (*cp == '\\') { ! extra++; ! } else if (*cp == '\"') { ! extra++; ! } else if (*cp == '\'') { ! extra += (strlen(apos) - 1); ! } else if (*cp == '<') { ! extra += (strlen(lt) - 1); ! } else if (*cp == '>') { ! extra += (strlen(gt) - 1); ! } else if (*cp == '&') { ! extra += (strlen(amp) - 1); ! } ! cp++; ! } ! ! if (extra == 0) { ! return (char *) str; ! } else { ! cp = (char *) str; ! rcp = ncp = malloc(len + extra + 1); ! if (ncp == NULL) ! return NULL; /* ?? */ ! for (i = 0; i < len; i++) { ! if (*cp == '\\') { ! *ncp++ = '\\'; ! *ncp++ = *cp++; ! } else if (*cp == '\"') { ! *ncp++ = '\\'; ! *ncp++ = *cp++; ! } else if (*cp == '\'') { ! strncpy(ncp, apos, strlen(apos)); ! ncp += strlen(apos); ! cp++; ! } else if (*cp == '<') { ! strncpy(ncp, lt, strlen(lt)); ! ncp += strlen(lt); ! cp++; ! } else if (*cp == '>') { ! strncpy(ncp, gt, strlen(gt)); ! ncp += strlen(gt); ! cp++; ! } else if (*cp == '&') { ! strncpy(ncp, amp, strlen(amp)); ! ncp += strlen(amp); ! cp++; ! } else { ! *ncp++ = *cp++; ! } ! } ! *ncp = '\0'; ! return rcp; ! } ! } ! ! /** ! ** XML print functions--these replace some functions in the ! ** h5tools.c suite. ! **/ ! ! /*------------------------------------------------------------------------- ! * Function: xml_print_datatype ! * ! * Purpose: Print description of a datatype in XML. ! * Note: this is called inside a element. ! * ! * Return: void ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! static void ! xml_print_datatype(hid_t type) ! { ! char *fname; ! hid_t nmembers, mtype; ! int i, j, ndims, perm[H5DUMP_MAX_RANK]; ! size_t size; ! hsize_t dims[H5DUMP_MAX_RANK]; ! H5T_str_t str_pad; ! H5T_cset_t cset; ! H5G_stat_t statbuf; ! hid_t super; ! H5T_order_t ord; ! H5T_sign_t sgn; ! size_t sz; ! size_t spos; ! size_t epos; ! size_t esize; ! size_t mpos; ! size_t msize; ! int nmembs; ! ! switch (H5Tget_class(type)) { ! case H5T_INTEGER: ! indentation(indent); ! printf("\n"); ! indent += COL; ! /* */ ! ord = H5Tget_order(type); ! sgn = H5Tget_sign(type); ! indentation(indent); ! printf("\n"); ! indent -= COL; ! indentation(indent); ! printf("\n"); ! break; ! ! case H5T_FLOAT: ! /* */ ! ord = H5Tget_order(type); ! indentation(indent); ! printf("\n"); ! indent += COL; ! indentation(indent); ! printf("\n", ! msize, mpos); ! indent -= COL; ! indentation(indent); ! printf("\n"); ! break; ! ! case H5T_TIME: ! indentation(indent); ! printf("\n"); ! indent += COL; ! indentation(indent); ! printf("\n"); ! printf(""); ! indent -= COL; ! indentation(indent); ! printf("\n"); ! break; ! ! case H5T_STRING: ! /* */ ! size = H5Tget_size(type); ! str_pad = H5Tget_strpad(type); ! cset = H5Tget_cset(type); ! ! indentation(indent); ! printf("\n"); ! indent += COL; ! indentation(indent); ! printf("\n"); ! } else if (str_pad == H5T_STR_NULLPAD) { ! printf("H5T_STR_NULLPAD\"/>\n"); ! } else if (str_pad == H5T_STR_SPACEPAD) { ! printf("H5T_STR_SPACEPAD\"/>\n"); ! } else { ! printf("H5T_STR_ERROR\"/>\n"); ! } ! indent -= COL; ! indentation(indent); ! printf("\n"); ! break; ! ! case H5T_BITFIELD: ! /* */ ! ord = H5Tget_order(type); ! indentation(indent); ! printf("\n"); ! indent += COL; ! indentation(indent); ! printf("\n", size); ! indent -= COL; ! indentation(indent); ! printf("\n"); ! break; ! ! case H5T_OPAQUE: ! /* */ ! ! indentation(indent); ! printf("\n"); ! indent += COL; ! indentation(indent); ! printf("\n", size); ! indent -= COL; ! indentation(indent); ! printf("\n"); ! break; ! ! case H5T_COMPOUND: ! /* recursively describe the components of a compound datatype */ ! if (H5Tcommitted(type) > 0) { ! /* detect a shared datatype, output only once */ ! H5Gget_objinfo(type, ".", TRUE, &statbuf); ! i = search_obj(type_table, statbuf.objno); ! ! if (i >= 0) { ! /* This should be defined somewhere else */ ! if (!type_table->objs[i].recorded) { ! /* 'anonymous' NDT. Use it's object num. ! as it's name. */ ! printf("objs[i].objno[0], ! type_table->objs[i].objno[1]); ! printf("\"/>\n"); ! } else { ! /* point to the NDT by name */ ! printf("objs[i].objname)); ! printf("\"/>\n"); ! } ! } else { ! printf("\n"); ! d_status = 1; ! } ! ! } else { ! /* type of a dataset */ ! nmembers = H5Tget_nmembers(type); ! ! indentation(indent); ! printf("\n"); ! ! /* List each member Field of the type */ ! /* */ ! /* */ ! indent += COL; ! for (i = 0; i < nmembers; i++) { ! fname = H5Tget_member_name(type, i); ! mtype = H5Tget_member_type(type, i); ! indentation(indent); ! printf("\n", ! xml_escape_the_name(fname)); ! ! free(fname); ! if ((H5Tget_class(mtype) == H5T_COMPOUND) ! || (H5Tget_class(mtype) == H5T_VLEN) ! || (H5Tget_class(mtype) == H5T_ARRAY)) { ! indent += COL; ! ! /* Nested compound type: recur */ ! indentation(indent); ! printf("\n"); ! indent += COL; ! xml_print_datatype(mtype); ! indent -= COL; ! indentation(indent); ! printf("%s\n", dump_header_format->datatypeend); ! indent -= COL; ! } else { ! ! indent += COL; ! indentation(indent); ! printf("\n"); ! indent += COL; ! xml_print_datatype(mtype); ! indent -= COL; ! indentation(indent); ! printf("%s\n", dump_header_format->datatypeend); ! indent -= COL; ! } ! ! indentation(indent); ! printf("\n"); ! } ! indent -= COL; ! indentation(indent); ! printf("\n"); ! } ! break; ! ! case H5T_REFERENCE: ! indentation(indent); ! printf("\n"); ! indent += COL; ! indentation(indent); ! /* Only Object references supported at this time */ ! printf("\n"); ! indentation(indent + COL); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! indent -= COL; ! indentation(indent); ! printf("\n"); ! break; ! ! case H5T_ENUM: ! /* ! list Name, values of enum ! */ ! nmembs = H5Tget_nmembers(type); ! indentation(indent); ! printf("\n"); ! indent += COL; ! indentation(indent); ! printf("\n", nmembs); ! xml_print_enum(type); ! indentation(indent); ! printf("\n"); ! indent -= COL; ! indentation(indent); ! printf("\n"); ! break; ! ! case H5T_VLEN: ! indentation(indent); ! printf("\n"); ! super = H5Tget_super(type); ! indent += COL; ! indentation(indent); ! printf("\n"); ! indent += COL; ! xml_print_datatype(super); ! indent -= COL; ! indentation(indent); ! printf("%s\n", dump_header_format->datatypeend); ! indent -= COL; ! indentation(indent); ! printf("\n"); ! H5Tclose(super); ! ! break; ! ! case H5T_ARRAY: ! /* Get array base type */ ! super = H5Tget_super(type); ! ! /* Print lead-in */ ! indentation(indent); ! printf("\n", ndims); ! indent += COL; ! indentation(indent); ! printf("\n"); ! indent += COL; ! xml_print_datatype(super); ! indent -= COL; ! indentation(indent); ! printf("%s\n", dump_header_format->datatypeend); ! indent -= COL; ! ! /* Get array information */ ! H5Tget_array_dims(type, dims, perm); ! ! /* list of dimensions */ ! indent += COL; ! if (perm != NULL) { ! /* for each dimension, list */ ! for (j = 0; j < ndims; j++) { ! indentation(indent); ! printf("\n", ! (int) dims[j], (int) perm[j]); ! } ! } else { ! for (j = 0; j < ndims; j++) { ! indentation(indent); ! printf("\n", ! (int) dims[j]); ! } ! } ! indent -= COL; ! ! indentation(indent); ! printf("\n"); ! /* Close array base type */ ! H5Tclose(super); ! break; ! ! default: ! printf(""); ! d_status = 1; ! break; ! } ! } ! ! /*------------------------------------------------------------------------- ! * Function: xml_dump_datatype ! * ! * Purpose: Dump description of a datatype in XML. ! * ! * Return: void ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! static void ! xml_dump_datatype(hid_t type) ! { ! int i; ! H5G_stat_t statbuf; ! ! indent += COL; ! indentation(indent); ! ! if (H5Tcommitted(type) > 0) { ! /* Data type is a shared or named data type */ ! H5Gget_objinfo(type, ".", TRUE, &statbuf); ! i = search_obj(type_table, statbuf.objno); ! ! if (i >= 0) { ! /* Shared data type, must be entered as an object */ ! 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("objs[i].objno[0], ! type_table->objs[i].objno[1]); ! printf("\"/>\n"); ! } else { ! /* pointer to a named data type already in XML */ ! printf("objs[i].objname)); ! printf("\"/>\n"); ! } ! } else { ! printf("\n"); ! } ! indent -= COL; ! return; ! } ! printf("%s %s\n", dump_header_format->datatypebegin, ! dump_header_format->datatypeblockbegin); ! indent += COL; ! xml_print_datatype(type); ! indent -= COL; ! indentation(indent); ! printf("%s\n", dump_header_format->datatypeend); ! indent -= COL; ! } ! ! /*------------------------------------------------------------------------- ! * Function: xml_dump_dataspace ! * ! * Purpose: Dump description of a dataspace in XML. ! * ! * Return: void ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! static void ! xml_dump_dataspace(hid_t space) ! { ! hsize_t size[H5DUMP_MAX_RANK]; ! hsize_t maxsize[H5DUMP_MAX_RANK]; ! int ndims = ! H5Sget_simple_extent_dims(space, size, maxsize); ! int i; ! ! indentation(indent + COL); ! printf("%s\n", dump_header_format->dataspacebegin); ! if (H5Sis_simple(space)) { ! indentation(indent + COL + COL); ! ! if (ndims == 0) { ! /* scalar dataspace (just a tag, no XML attrs. defined */ ! printf("\n"); ! } else { ! /* simple dataspace */ ! /* */ ! printf("\n", ndims); ! ! /* print the elements */ ! for (i = 0; i < ndims; i++) { ! indentation(indent + COL + COL + COL); ! if (maxsize[i] == H5S_UNLIMITED) { ! HDfprintf(stdout, ! "\n", ! size[i]); ! } else if (maxsize[i] == (hsize_t) 0) { ! HDfprintf(stdout, ! "\n", ! size[i], size[i]); ! } else { ! HDfprintf(stdout, ! "\n", ! size[i], maxsize[i]); ! } ! } ! indentation(indent + COL + COL); ! printf("\n", ndims); ! } ! } else { ! printf("\n"); ! } ! ! indentation(indent + COL); ! printf("%s\n", dump_header_format->dataspaceend); ! ! } ! ! /*------------------------------------------------------------------------- ! * Function: xml_dump_data ! * ! * Purpose: Dump description of data in XML. ! * Note that this calls the h5dump_xxx calls in ! * the h5tools library. ! * ! * Return: void ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! static void ! xml_dump_data(hid_t obj_id, int obj_data) ! { ! h5dump_t *outputformat = &xml_dataformat; ! int d_status = -1; ! void *buf; ! char *attr_name = malloc(sizeof(char) * 80); ! hid_t space, type, p_type; ! int ndims, i; ! hsize_t size[64], nelmts = 1; ! int depth; ! int stdindent = COL; /* should be 3 */ ! ! outputformat->line_ncols = nCols; ! ! indent += COL; ! ! /* ! * the depth will tell us how far we need to indent extra. we use to just ! * use indent but with the merging of the tools lib we have to do ! * something different for the lib funtions... the normal indentation is 6 ! * so when we don't need any extra indentation, depth will be 0. ! */ ! depth = indent / stdindent + 1; ! ! /* Print all the values. */ ! indentation(indent); ! printf("%s\n", dump_header_format->databegin); ! indentation(indent + COL); ! printf("\n"); ! if (obj_data == DATASET_DATA) { ! type = H5Dget_type(obj_id); ! if (H5Tget_class(type) == H5T_REFERENCE) { ! d_status = xml_print_refs(obj_id, DATASET_DATA); ! } else if (H5Tget_class(type) == H5T_STRING) { ! d_status = xml_print_strs(obj_id, DATASET_DATA); ! } else { ! d_status = h5dump_dset(stdout, outputformat, obj_id, -1, depth); ! } ! } else { ! /* Attribute data */ ! type = H5Aget_type(obj_id); ! ! if (H5Tget_class(type) == H5T_REFERENCE) { ! /* references are done differently than ! the standard output: ! XML dumps a path to the object ! referenced. ! */ ! d_status = xml_print_refs(obj_id, ATTRIBUTE_DATA); ! H5Tclose(type); ! } else if (H5Tget_class(type) == H5T_STRING) { ! d_status = xml_print_strs(obj_id, ATTRIBUTE_DATA); ! } else { ! /* all other data */ ! p_type = h5dump_fixtype(type); ! H5Tclose(type); ! ! space = H5Aget_space(obj_id); ! ! ndims = H5Sget_simple_extent_dims(space, size, NULL); ! ! for (i = 0; i < ndims; i++) ! nelmts *= size[i]; ! ! buf = ! malloc(nelmts * MAX(H5Tget_size(type), H5Tget_size(p_type))); ! assert(buf); ! ! if (H5Aread(obj_id, p_type, buf) >= 0) { ! d_status = ! h5dump_mem(stdout, outputformat, obj_id, p_type, space, ! buf, depth); ! } ! free(buf); ! H5Tclose(p_type); ! H5Sclose(space); ! H5Tclose(type); ! } ! } ! ! if (d_status < 0) { ! indentation(indent + COL); ! printf("Unable to print data.\n"); ! d_status = 1; ! } ! ! indentation(indent + COL); ! printf("\n"); ! indentation(indent); ! printf("%s\n", dump_header_format->dataend); ! indent -= COL; ! } ! ! /*------------------------------------------------------------------------- ! * Function: xml_dump_attr ! * ! * Purpose: Dump a description of an HDF5 attribute in XML. ! * ! * Return: herr_t ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! static herr_t ! xml_dump_attr(hid_t attr, const char *attr_name, void UNUSED * op_data) ! { ! hid_t attr_id, type, space; ! hobj_ref_t ref; ! char *path; ! ! indentation(indent); ! printf("\n", xml_escape_the_name(attr_name)); ! ! if ((attr_id = H5Aopen_name(attr, attr_name)) >= 0) { ! type = H5Aget_type(attr_id); ! space = H5Aget_space(attr_id); ! ! dump_function_table->dump_dataspace_function(space); ! dump_function_table->dump_datatype_function(type); ! ! /* ! **** not sure what or whether this can be done in XML ! if (display_oid) ! dump_oid(attr_id); ! */ ! ! /* not sure if display_data option is allowed */ ! if (display_data) { ! switch (H5Tget_class(type)) { ! case H5T_INTEGER: ! case H5T_FLOAT: ! case H5T_STRING: ! case H5T_BITFIELD: ! case H5T_OPAQUE: ! case H5T_ENUM: ! case H5T_ARRAY: ! dump_function_table->dump_data_function(attr_id, ! ATTRIBUTE_DATA); ! break; ! ! case H5T_TIME: ! indent += COL; ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! indent -= COL; ! break; ! ! case H5T_COMPOUND: ! indentation(indent); ! printf ! ("\n", ! H5Tget_class(type)); ! dump_function_table->dump_data_function(attr_id, ! ATTRIBUTE_DATA); ! break; ! ! case H5T_REFERENCE: ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! xml_print_refs(attr_id, ATTRIBUTE_DATA); ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! break; ! ! case H5T_VLEN: ! printf("\n", ! H5Tget_class(type)); ! dump_function_table->dump_data_function(attr_id, ! ATTRIBUTE_DATA); ! break; ! default: ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n", H5Tget_class(type)); ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! break; ! } ! } else { ! /* The case of an attribute never yet written */ ! indentation(indent); ! printf("\n"); ! indentation(indent + COL); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! } ! ! H5Tclose(type); ! H5Sclose(space); ! H5Aclose(attr_id); ! indentation(indent); ! printf("%s\n", dump_header_format->attributeend); ! return SUCCEED; ! ! } else { ! /* ?? failed */ ! indentation(indent + COL); ! printf("\n"); ! indentation(indent); ! printf("%s\n", dump_header_format->attributeend); ! d_status = 1; ! return FAIL; ! } ! } ! ! /*------------------------------------------------------------------------- ! * Function: xml_dump_named_datatype ! * ! * Purpose: Dump a description of an HDF5 NDT in XML. ! * ! * Return: herr_t ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! static void ! xml_dump_named_datatype(hid_t type, const char *name) ! { ! int nmembers = 1, x, j; ! hid_t mtype; ! char *fname; ! char *tmp; ! int ndims, perm[H5DUMP_MAX_RANK]; ! size_t dims[H5DUMP_MAX_RANK]; ! ! tmp = (char *) malloc(strlen(prefix) + strlen(name) + 2); ! strcpy(tmp, prefix); ! strcat(tmp, "/"); ! strcat(tmp, name); ! ! indentation(indent); ! if (strncmp(name, "#", 1) == 0) { ! /* Special: this is an 'anonymous' NDT, deleted but ! still in use. ! We follow the dumper's undocumented practice, and ! use its object id as its name. ! Exactly the same as normal, but a separate case ! in the event we want to do something else in ! the future. ! */ ! printf("\n", ! name, tmp, name); ! } else { ! printf("\n", ! xml_escape_the_name(name), ! xml_escape_the_name(tmp), ! (strcmp(prefix, "") ? xml_escape_the_name(name) : "root")); ! } ! ! indent += COL; ! if (H5Tget_class(type) == H5T_COMPOUND) { ! /* Dump this here for sure. */ ! nmembers = H5Tget_nmembers(type); ! ! indentation(indent); ! printf("\n"); ! ! indent += COL; ! for (x = 0; x < nmembers; x++) { ! fname = H5Tget_member_name(type, x); ! mtype = H5Tget_member_type(type, x); ! indentation(indent); ! printf("\n", xml_escape_the_name(fname)); ! free(fname); ! ! if ((H5Tget_class(mtype) == H5T_COMPOUND) ! || (H5Tget_class(mtype) == H5T_VLEN) ! || (H5Tget_class(mtype) == H5T_ARRAY)) { ! indent += COL; ! ! /* Nested compound type: recur */ ! indentation(indent); ! printf("%s %s\n", dump_header_format->datatypebegin, ! dump_header_format->datatypeblockbegin); ! indent += COL; ! xml_print_datatype(mtype); ! indent -= COL; ! indentation(indent); ! printf("%s\n", dump_header_format->datatypeend); ! indent -= COL; ! } else { ! indent += COL; ! indentation(indent); ! printf("%s %s\n", dump_header_format->datatypebegin, ! dump_header_format->datatypeblockbegin); ! indent += COL; ! xml_print_datatype(mtype); ! indent -= COL; ! indentation(indent); ! printf("%s\n", dump_header_format->datatypeend); ! indent -= COL; ! } ! ! indentation(indent); ! printf("\n"); ! } ! ! indent -= COL; ! indentation(indent); ! printf("\n"); ! } else { ! /* Other data types: call print_datatype */ ! indent += COL; ! xml_print_datatype(type); ! indent -= COL; ! } ! ! indent -= COL; ! indentation(indent); ! printf("\n"); ! } ! ! /*------------------------------------------------------------------------- ! * Function: xml_dump_group ! * ! * Purpose: Dump a description of an HDF5 Group (and its members) in XML. ! * ! * Return: void ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! static void ! xml_dump_group(hid_t gid, const char *name) ! { ! H5G_stat_t statbuf; ! char *cp; ! hid_t dset, type; ! char typename[1024], *tmp; ! char *par; ! int i; ! int isRoot = 0; ! int xtype; ! ! if (strcmp(name, "/") == 0) { ! isRoot = 1; ! } else { ! tmp = malloc(strlen(prefix) + strlen(name) + 2); ! strcpy(tmp, prefix); ! par = strdup(tmp); ! cp = strrchr(par, '/'); ! if (cp != NULL) { ! if ((cp == par) && strlen(par) > 1) { ! *(cp + 1) = '\0'; ! } else { ! *cp = '\0'; ! } ! } ! } ! indentation(indent); ! if (isRoot) { ! printf("\n"); ! } else { ! printf("\n", ! xml_escape_the_name(name), ! xml_escape_the_name(tmp), xml_escape_the_name(par)); ! } ! indent += COL; ! H5Gget_objinfo(gid, ".", TRUE, &statbuf); ! ! if (statbuf.nlink > 1) { ! /* Group with more than one link to it... */ ! i = search_obj(group_table, statbuf.objno); ! ! if (i < 0) { ! indentation(indent); ! printf("h5dump error: internal error\n"); ! d_status = 1; ! } else if (group_table->objs[i].displayed) { ! /* already seen: enter a groupptr */ ! indentation(indent + COL); ! printf("\n", ! xml_escape_the_name(group_table->objs[i].objname)); ! } else { ! /* first time this group has been seen -- describe it */ ! strcpy(group_table->objs[i].objname, prefix); ! group_table->objs[i].displayed = 1; ! ! /* 1. do all the attributes of the group */ ! H5Aiterate(gid, NULL, ! dump_function_table->dump_attribute_function, NULL); ! ! /****?? not sure how to support this ! if (display_oid) ! dump_oid(gid); ! */ ! ! if (!strcmp(name, "/") && unamedtype) { ! /* Very special case: dump unamed type in root group */ ! for (i = 0; i < type_table->nobjs; i++) { ! if (!type_table->objs[i].recorded) { ! dset = H5Dopen(gid, type_table->objs[i].objname); ! type = H5Dget_type(dset); ! sprintf(typename, "#%lu:%lu", ! type_table->objs[i].objno[0], ! type_table->objs[i].objno[1]); ! dump_function_table->dump_named_datatype_function ! (type, typename); ! H5Tclose(type); ! H5Dclose(dset); ! } ! } ! } ! ! /* iterate through all the members */ ! /* ! H5Giterate(gid, ".", NULL, dump_all, NULL); ! */ ! xtype = H5G_TYPE; ! H5Giterate(gid, ".", NULL, xml_dump_all, (void *) &xtype); ! xtype = H5G_DATASET; ! H5Giterate(gid, ".", NULL, xml_dump_all, (void *) &xtype); ! xtype = H5G_LINK; ! H5Giterate(gid, ".", NULL, xml_dump_all, (void *) &xtype); ! xtype = H5G_GROUP; ! H5Giterate(gid, ".", NULL, xml_dump_all, (void *) &xtype); ! } ! } else { ! i = search_obj(group_table, statbuf.objno); ! /* only time this group will be seen -- describe it */ ! strcpy(group_table->objs[i].objname, prefix); ! group_table->objs[i].displayed = 1; ! ! /* 1. do all the attributes of the group */ ! H5Aiterate(gid, NULL, dump_function_table->dump_attribute_function, ! NULL); ! ! /****?? not sure how to support this ! if (display_oid) ! dump_oid(gid); ! */ ! ! if (!strcmp(name, "/") && unamedtype) { ! /* Very special case: dump unamed type in root group */ ! for (i = 0; i < type_table->nobjs; i++) { ! if (!type_table->objs[i].recorded) { ! dset = H5Dopen(gid, type_table->objs[i].objname); ! type = H5Dget_type(dset); ! sprintf(typename, "#%lu:%lu", ! type_table->objs[i].objno[0], ! type_table->objs[i].objno[1]); ! dump_function_table->dump_named_datatype_function(type, ! typename); ! H5Tclose(type); ! H5Dclose(dset); ! } ! } ! } ! ! /* iterate through all the members */ ! /* ! H5Giterate(gid, ".", NULL, dump_all, NULL); ! */ ! xtype = H5G_TYPE; ! H5Giterate(gid, ".", NULL, xml_dump_all, (void *) &xtype); ! xtype = H5G_DATASET; ! H5Giterate(gid, ".", NULL, xml_dump_all, (void *) &xtype); ! xtype = H5G_LINK; ! H5Giterate(gid, ".", NULL, xml_dump_all, (void *) &xtype); ! xtype = H5G_GROUP; ! H5Giterate(gid, ".", NULL, xml_dump_all, (void *) &xtype); ! } ! ! indent -= COL; ! indentation(indent); ! if (isRoot) { ! printf("\n"); ! } else { ! printf("%s\n", dump_header_format->groupend); ! } ! /* don't free this!!! ! free(tmp); ! */ ! } ! ! /*------------------------------------------------------------------------- ! * Function: xml_print_refs ! * ! * Purpose: Print a path to the objects referenced by HDF5 Referneces. ! * ! * Return: void ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! static int ! xml_print_refs(hid_t did, int source) ! { ! herr_t e; ! hid_t type, space; ! char *buf; ! hobj_ref_t *refbuf; ! char *path; ! hsize_t ssiz; ! int i; ! if (source == DATASET_DATA) { ! type = H5Dget_type(did); ! } else if (source == ATTRIBUTE_DATA) { ! type = H5Aget_type(did); ! } else { ! /* return an error */ ! return FAIL; ! } ! if (H5Tget_class(type) != H5T_REFERENCE) { ! /* return an error */ ! return FAIL; ! } ! if (!H5Tequal(type, H5T_STD_REF_OBJ)) { ! /* region ref not supported yet... */ ! /* return an error */ ! return FAIL; ! } ! if (source == DATASET_DATA) { ! space = H5Dget_space(did); ! ssiz = H5Sget_simple_extent_npoints(space); ! ssiz *= H5Tget_size(type); ! ! buf = malloc(ssiz); ! e = H5Dread(did, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf); ! /* need to check result here */ ! ! } else if (source == ATTRIBUTE_DATA) { ! space = H5Aget_space(did); ! ssiz = H5Sget_simple_extent_npoints(space); ! ssiz *= H5Tget_size(type); ! ! buf = malloc(ssiz); ! e = H5Aread(did, H5T_STD_REF_OBJ, buf); ! /* need to check the result here */ ! } else { ! /* error */ ! return FAIL; ! } ! ! refbuf = (hobj_ref_t *) buf; ! ssiz = H5Sget_simple_extent_npoints(space); ! ! for (i = 0; i < ssiz; i++) { ! path = lookup_ref_path(refbuf); ! indentation(indent + COL); ! if (path == NULL) { ! printf("\"%s\"\n", "NULL"); ! } else { ! printf("\"%s\"\n", xml_escape_the_string(path)); ! } ! refbuf++; ! } ! return SUCCEED; ! } ! ! /*------------------------------------------------------------------------- ! * Function: xml_print_strs ! * ! * Purpose: Print strings. ! * ! * Return: void ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! static int ! xml_print_strs(hid_t did, int source) ! { ! herr_t e; ! hid_t type, space; ! char *buf; ! char *bp; ! char *onestring; ! hsize_t ssiz; ! size_t tsiz; ! int i; ! if (source == DATASET_DATA) { ! type = H5Dget_type(did); ! } else if (source == ATTRIBUTE_DATA) { ! type = H5Aget_type(did); ! } else { ! /* return an error */ ! return FAIL; ! } ! if (H5Tget_class(type) != H5T_STRING) { ! /* return an error */ ! return FAIL; ! } ! if (source == DATASET_DATA) { ! space = H5Dget_space(did); ! ssiz = H5Sget_simple_extent_npoints(space); ! ssiz *= H5Tget_size(type); ! ! buf = malloc(ssiz); ! e = H5Dread(did, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf); ! /* need to check result here */ ! ! } else if (source == ATTRIBUTE_DATA) { ! space = H5Aget_space(did); ! ssiz = H5Sget_simple_extent_npoints(space); ! ssiz *= H5Tget_size(type); ! ! buf = malloc(ssiz); ! e = H5Aread(did, type, buf); ! /* need to check the result here */ ! } else { ! /* error */ ! return FAIL; ! } ! ! /* pull out each string... */ ! ssiz = H5Sget_simple_extent_npoints(space); ! ! onestring = (char *) malloc(H5Tget_size(type)); ! tsiz = H5Tget_size(type); ! bp = buf; ! ! for (i = 0; i < ssiz; i++) { ! strncpy(onestring, bp, tsiz); ! indentation(indent + COL); ! if (onestring == NULL) { ! printf("\"%s\"\n", "NULL"); ! } else { ! printf("\"%s\"\n", xml_escape_the_string(onestring)); ! } ! bp += tsiz; ! } ! return SUCCEED; ! } ! ! /*------------------------------------------------------------------------- ! * Function: check_compression ! * ! * Purpose: private function to check for compression and ! * put a comment in the XML. (Not fully implemented.) ! * ! * Return: void ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! void ! check_compression(hid_t dcpl) ! { ! int nfilt; ! int i; ! H5Z_filter_t filter; ! char namebuf[20]; ! size_t cd_nelmts = 1; ! unsigned int cd_values; ! unsigned int flags; ! char *t1 = "H5Z_FILTER_DEFLATE"; ! ! 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, 20, namebuf); ! if (filter == H5Z_FILTER_DEFLATE) { ! indentation(indent + COL); ! printf("\n"); ! indentation(indent + COL); ! printf("\n", cd_values); ! } ! } ! } ! ! /*------------------------------------------------------------------------- ! * Function: xml_dump_group ! * ! * Purpose: Dump a description of an HDF5 Group (and its members) in XML. ! * ! * Return: void ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! static void ! xml_dump_dataset(hid_t did, const char *name) ! { ! hid_t type, space; ! hid_t dcpl; ! int maxdims; ! hsize_t *chsize; ! int ndims; ! int i; ! char *tmp; ! ! tmp = (char *) malloc(strlen(prefix) + strlen(name) + 2); ! strcpy(tmp, prefix); ! strcat(tmp, "/"); ! strcat(tmp, name); ! indentation(indent); ! printf("\n", ! xml_escape_the_name(name), ! xml_escape_the_name(tmp), ! (strcmp(prefix, "") ? xml_escape_the_name(prefix) : "root")); ! ! dcpl = H5Dget_create_plist(did); ! type = H5Dget_type(did); ! space = H5Dget_space(did); ! ! /* Print information about chunked storage */ ! 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("\n"); ! indent += COL; ! indentation(indent); ! printf("\n", ndims); ! /* check for compression and tell about it... */ ! ! check_compression(dcpl); ! ! indent += COL; ! for (i = 0; i < ndims; i++) { ! indentation(indent); ! printf("\n", chsize[i]); ! } ! indent -= COL; ! ! indentation(indent); ! printf("\n"); ! indent -= COL; ! indentation(indent); ! printf("\n"); ! indent -= COL; ! free(chsize); ! } ! /* and check for external.... */ ! ! dump_function_table->dump_dataspace_function(space); ! dump_function_table->dump_datatype_function(type); ! ! /* not sure what to do with this ! if (display_oid) ! dump_oid(did); ! */ ! ! indent += COL; ! H5Aiterate(did, NULL, dump_function_table->dump_attribute_function, NULL); ! indent -= COL; ! i = H5Dget_storage_size(did); ! if (display_data && (i > 0)) { ! switch (H5Tget_class(type)) { ! case H5T_INTEGER: ! case H5T_FLOAT: ! case H5T_STRING: ! case H5T_BITFIELD: ! case H5T_OPAQUE: ! case H5T_ENUM: ! case H5T_ARRAY: ! dump_function_table->dump_data_function(did, DATASET_DATA); ! break; ! ! case H5T_TIME: ! indent += COL; ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! indent -= COL; ! break; ! ! case H5T_COMPOUND: ! indentation(indent); ! printf("\n", ! H5Tget_class(type)); ! dump_function_table->dump_data_function(did, DATASET_DATA); ! break; ! ! case H5T_REFERENCE: ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! xml_print_refs(did, DATASET_DATA); ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! break; ! ! case H5T_VLEN: ! printf("\n", ! H5Tget_class(type)); ! dump_function_table->dump_data_function(did, DATASET_DATA); ! break; ! default: ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n", H5Tget_class(type)); ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! break; ! } ! } else { ! /* no data written */ ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! } ! ! /* ! free(tmp); ! */ ! H5Tclose(type); ! H5Sclose(space); ! indentation(indent); ! printf("%s\n", dump_header_format->datasetend); ! } ! ! /*------------------------------------------------------------------------- ! * Function: xml_print_enum ! * ! * Purpose: Print the values of an HDF5 ENUM in XML. ! * Very similar to regular DDL output. ! * ! * Return: void ! * ! * Programmer: REMcG ! * ! * Modifications: ! * ! *-----------------------------------------------------------------------*/ ! static void ! xml_print_enum(hid_t type) ! { ! char **name = NULL; /*member names */ ! unsigned char *value = NULL; /*value array */ ! int nmembs; /*number of members */ ! int nchars; /*number of output characters */ ! hid_t super; /*enum base integer type */ ! hid_t native = -1; /*native integer data type */ ! size_t dst_size; /*destination value type size */ ! int i; /*miscellaneous counters */ ! size_t j; ! ! nmembs = H5Tget_nmembers(type); ! super = H5Tget_super(type); ! ! /* ! * Determine what data type to use for the native values. To simplify ! * things we entertain three possibilities: ! * 1. long_long -- the largest native signed integer ! * 2. unsigned long_long -- the largest native unsigned integer ! * 3. raw format ! */ ! if (H5Tget_size(type) <= sizeof(long_long)) { ! dst_size = sizeof(long_long); ! ! if (H5T_SGN_NONE == H5Tget_sign(type)) { ! native = H5T_NATIVE_ULLONG; ! } else { ! native = H5T_NATIVE_LLONG; ! } ! } else { ! dst_size = H5Tget_size(type); ! } ! ! /* Get the names and raw values of all members */ ! name = calloc(nmembs, sizeof(char *)); ! value = calloc(nmembs, MAX(H5Tget_size(type), dst_size)); ! ! for (i = 0; i < nmembs; i++) { ! name[i] = H5Tget_member_name(type, i); ! H5Tget_member_value(type, i, value + i * H5Tget_size(type)); ! } ! ! /* Convert values to native data type */ ! if (native > 0) ! H5Tconvert(super, native, nmembs, value, NULL, H5P_DEFAULT); ! ! /* Sort members by increasing value */ ! /*not implemented yet */ ! ! /* Print members */ ! indent += COL; ! for (i = 0; i < nmembs; i++) { ! indentation(indent); ! printf("\n"); ! indentation(indent + COL); ! printf("%s\n", xml_escape_the_name(name[i])); ! indentation(indent); ! printf("\n"); ! indentation(indent); ! printf("\n"); ! indentation(indent + COL); ! if (native < 0) { ! printf("0x"); ! ! for (j = 0; j < dst_size; j++) ! printf("%02x", value[i * dst_size + j]); ! } else if (H5T_SGN_NONE == H5Tget_sign(native)) { ! printf("%" PRINTF_LL_WIDTH "u", *((unsigned long_long *) ! ((void *) (value + i * dst_size)))); ! } else { ! printf("%" PRINTF_LL_WIDTH "d", ! *((long_long *) ((void *) (value + i * dst_size)))); ! } ! printf("\n"); ! indentation(indent); ! printf("\n"); ! ! } ! indent -= COL; ! ! /* Release resources */ ! for (i = 0; i < nmembs; i++) ! free(name[i]); ! ! free(name); ! free(value); ! H5Tclose(super); }