summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/h5tools.c487
1 files changed, 483 insertions, 4 deletions
diff --git a/tools/h5tools.c b/tools/h5tools.c
index 61a6459..dbe8be6 100644
--- a/tools/h5tools.c
+++ b/tools/h5tools.c
@@ -72,6 +72,9 @@ int print_data(hid_t oid, hid_t _p_type, int obj_data);
#define START_OF_DATA 0x0001
#define END_OF_DATA 0x0002
+/* Special strings embedded in the output */
+#define OPTIONAL_LINE_BREAK "\001"
+
/* Variable length string datatype */
#define STR_INIT_LEN 4096 /*initial length */
typedef struct h5dump_str_t {
@@ -80,9 +83,6 @@ typedef struct h5dump_str_t {
size_t nalloc; /*allocated size of string */
} h5dump_str_t;
-/* Special strings embedded in the output */
-#define OPTIONAL_LINE_BREAK "\001"
-
/* Output variables */
typedef struct h5dump_context_t {
size_t cur_column; /*current column for output */
@@ -95,7 +95,22 @@ typedef struct h5dump_context_t {
size_t prev_prefix_len;/*length of previous prefix */
int continuation; /*continuation of previous data?*/
} h5dump_context_t;
-
+
+typedef herr_t (*H5G_operator_t)(hid_t, const char*, void*);
+
+
+
+extern void init_prefix(char **temp, int length);
+extern void init_table(table_t **table);
+extern void free_table(table_t **table);
+extern void dump_table(char *name, table_t* table);
+extern herr_t find_objs(hid_t group, const char *name, void *op_data);
+extern int search_obj (table_t *temp, unsigned long *);
+extern int get_table_idx(table_t *table, unsigned long *);
+extern int get_tableflag(table_t*, int);
+extern int set_tableflag(table_t*, int);
+extern char* get_objectname(table_t*, int);
+
/*-------------------------------------------------------------------------
* Function: h5dump_str_close
@@ -2518,3 +2533,467 @@ void print_version(char *program_name)
H5_VERS_SUBRELEASE);
}
+
+
+
+
+
+/*
+
+THE FUNCTIONS BELOW ARE FROM THE H5FINSHD.C FILE
+
+*/
+
+/*-------------------------------------------------------------------------
+ * Function: init_table
+ *
+ * Purpose: allocate and initialize tables for shared groups, datasets,
+ * and committed types
+ *
+ * Return: void
+ *
+ * Programmer: Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-----------------------------------------------------------------------*/
+void init_table (table_t** temp){
+
+ int i;
+ table_t *table = malloc(sizeof(table_t));
+
+ table->size = 20;
+ table->nobjs = 0;
+
+ table->objs = (obj_t*) malloc(table->size*sizeof(obj_t));
+
+
+ for (i = 0; i < table->size; i++) {
+ table->objs[i].objno[0] = table->objs[i].objno[1] = 0;
+ table->objs[i].displayed = 0;
+ table->objs[i].recorded = 0;
+ table->objs[i].objflag = 0;
+ }
+ *temp = table;
+
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: init_prefix
+ *
+ * Purpose: allocate and initialize prefix
+ *
+ * Return: void
+ *
+ * Modifications:
+ *
+ *-----------------------------------------------------------------------*/
+void init_prefix(char **prefix, int prefix_len){
+ char *temp;
+ temp = (char *) malloc(prefix_len * sizeof (char));
+ *temp = '\0';
+ *prefix = temp;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: free_table
+ *
+ * Purpose: free tables for shared groups, datasets,
+ * and committed types
+ *
+ * Return: void
+ *
+ * Programmer: Paul Harten
+ *
+ * Modifications:
+ *
+ *-----------------------------------------------------------------------*/
+void
+free_table (table_t **table){
+
+ table_t *temp = *table;
+ if (temp->objs != NULL) {
+ HDfree(temp->objs);
+ }
+ *table = temp;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: search_obj
+ *
+ * Purpose: search the object specified by objno in the table
+ *
+ * Return: an integer, the location of the object
+ * -1 if object is not found
+ *
+ *
+ * Programmer: Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-----------------------------------------------------------------------*/
+int
+search_obj (table_t *table, unsigned long *objno) {
+int i=0, found=0;
+
+ while (i < table->nobjs && !found)
+ if (table->objs[i].objno[0] == *(objno) &&
+ table->objs[i].objno[1] == *(objno+1) ) found = 1;
+ else i++;
+
+ if (!found) return -1;
+ else return i;
+
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: add_obj
+ *
+ * Purpose: add a shared object to the table
+ * realloc the table if necessary
+ *
+ * Return: void
+ *
+ * Programmer: Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-----------------------------------------------------------------------*/
+void
+add_obj (table_t *table, unsigned long *objno, char *objname) {
+int i;
+
+ if (table->nobjs == table->size) {
+ table->size *= 2;
+ table->objs = realloc (table->objs, table->size*sizeof(obj_t));
+ for (i = table->nobjs; i < table->size; i++) {
+ table->objs[i].objno[0] = table->objs[i].objno[1] = 0;
+ table->objs[i].displayed = 0;
+ table->objs[i].recorded = 0;
+ table->objs[i].objflag = 0;
+ }
+ }
+
+ i = table->nobjs++;
+ table->objs[i].objno[0] = *objno;
+ table->objs[i].objno[1] = *(objno+1);
+ strcpy (table->objs[i].objname, objname);
+
+}
+/*-------------------------------------------------------------------------
+ * Function: Find_objs
+ *
+ * Purpose: Find objects, committed types and store them in tables
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-----------------------------------------------------------------------*/
+herr_t find_objs(hid_t group, const char *name, void *op_data)
+{
+ hid_t obj, type;
+ H5G_stat_t statbuf;
+ char *tmp;
+ int i;
+ find_objs_t *info = (find_objs_t*)op_data;
+
+ if (info->threshold > 1) { /*will get an infinite loop if greater than 1*/
+ return(FAIL);
+ }
+
+ H5Gget_objinfo(group, name, TRUE, &statbuf);
+
+ tmp = (char *) malloc ((strlen(info->prefix)+strlen(name)+2) * sizeof(char));
+
+ strcpy(tmp, info->prefix);
+
+ switch (statbuf.type) {
+
+ case H5G_GROUP:
+ if ((obj=H5Gopen (group, name))>=0) {
+
+ if (info->prefix_len < (int)(strlen(info->prefix) + strlen(name) + 2)) {
+ info->prefix_len *= 2;
+ info->prefix = realloc (info->prefix, info->prefix_len * sizeof(char));
+ }
+ strcat(strcat(info->prefix,"/"), name);
+
+ if (statbuf.nlink > info->threshold) {
+ if (search_obj (info->group_table, statbuf.objno) < 0) {
+ add_obj (info->group_table, statbuf.objno, info->prefix);
+ H5Giterate (obj, ".", NULL, find_objs, (void*)info);
+ }
+ } else
+ H5Giterate (obj, ".", NULL, find_objs, (void*)info);
+
+ strcpy(info->prefix, tmp);
+ H5Gclose (obj);
+
+ } else
+ info->status = 1;
+
+ break;
+
+ case H5G_DATASET:
+
+ strcat(tmp,"/");
+ strcat(tmp,name); /* absolute name of the data set */
+ if (statbuf.nlink > info->threshold &&
+ search_obj (info->dset_table, statbuf.objno) < 0)
+ add_obj (info->dset_table, statbuf.objno, tmp);
+
+ if ((obj=H5Dopen (group, name))>=0) {
+ type = H5Dget_type (obj);
+ if (H5Tcommitted(type) > 0 ) {
+ H5Gget_objinfo(type, ".", TRUE, &statbuf);
+ if (search_obj (info->type_table, statbuf.objno) < 0) {
+ add_obj (info->type_table, statbuf.objno, tmp) ;
+ info->type_table->objs[info->type_table->nobjs - 1].objflag = 0;
+ }
+ }
+ H5Tclose(type);
+ H5Dclose (obj);
+ } else
+ info->status = 1;
+
+ break;
+
+ case H5G_TYPE:
+ strcat(tmp,"/");
+ strcat(tmp,name); /* absolute name of the type */
+ i = search_obj (info->type_table, statbuf.objno);
+ if (i < 0) {
+ add_obj (info->type_table, statbuf.objno, tmp) ;
+ info->type_table->objs[info->type_table->nobjs-1].recorded = 1; /* named data type */
+ info->type_table->objs[info->type_table->nobjs-1].objflag = 1; /* named data type */
+ } else {
+ strcpy (info->type_table->objs[i].objname, tmp);
+ info->type_table->objs[i].recorded = 1;
+ info->type_table->objs[info->type_table->nobjs-1].objflag = 1; /* named data type */
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ free (tmp);
+
+ return SUCCEED;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: dump_tables
+ *
+ * Purpose: display the contents of tables for debugging purposes
+ *
+ * Return: void
+ *
+ * Programmer: Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-----------------------------------------------------------------------*/
+void
+dump_table(char* tablename, table_t *table) {
+int i;
+
+ printf("%s: # of entries = %d\n", tablename,table->nobjs);
+ for ( i = 0; i < table->nobjs; i++)
+ printf ("%lu %lu %s %d\n", table->objs[i].objno[0],
+ table->objs[i].objno[1],
+ table->objs[i].objname,
+ table->objs[i].objflag);
+
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: get_table_idx
+ *
+ * Purpose: Determine if objects are in a link loop
+ *
+ * Return: Success: table index of object detected to be in loop
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Paul Harten
+ *
+ *-----------------------------------------------------------------------*/
+int
+get_table_idx(table_t *table, unsigned long *objno)
+{
+int idx = -1;
+/*
+ switch (type) {
+
+ case H5G_GROUP:
+
+ idx = search_obj(&group_table, objno);
+ break;
+
+ case H5G_DATASET:
+
+ idx = search_obj(&dset_table, objno);
+ break;
+
+ case H5G_TYPE:
+
+ idx = search_obj(&type_table, objno);
+ break;
+
+ default:
+
+ idx = -1;
+
+ }
+*/
+ idx = search_obj(table, objno);
+ return idx;
+
+}
+/*-------------------------------------------------------------------------
+ * Function: Get table flag setting
+ *
+ * Purpose: Keep the structures and variables used private to
+ * this file.
+ *
+ * Return: Success: Boolean setting of the i'th element of the
+ * object table flag
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Paul Harten
+ *
+ *-----------------------------------------------------------------------*/
+int
+get_tableflag(table_t *table, int idx)
+{
+ /*
+ switch (type) {
+
+ case H5G_GROUP:
+
+ return group_table.objs[idx].objflag;
+
+ case H5G_DATASET:
+
+ return dset_table.objs[idx].objflag;
+
+ case H5G_TYPE:
+
+ return type_table.objs[idx].objflag;
+
+ default:
+
+ return -1;
+}
+ */
+ return(table->objs[idx].objflag);
+
+
+}
+/*-------------------------------------------------------------------------
+ * Function: Set table flag setting
+ *
+ * Purpose: Keep the structures and variables used private to
+ * this file.
+ *
+ * Return: Success: Boolean setting of the i'th element of the
+ * object table flag
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Paul Harten
+ *
+ *-----------------------------------------------------------------------*/
+int
+set_tableflag(table_t *table, int idx)
+{
+/*
+ switch (type) {
+
+ case H5G_GROUP:
+
+ group_table.objs[idx].objflag = TRUE;
+ return SUCCEED;
+
+ case H5G_DATASET:
+
+ dset_table.objs[idx].objflag = TRUE;
+ return SUCCEED;
+
+ case H5G_TYPE:
+
+ type_table.objs[idx].objflag = TRUE;
+ return SUCCEED;
+
+ default:
+
+ return FAIL;
+}
+*/
+ table->objs[idx].objflag = TRUE;
+ return(SUCCEED);
+
+
+}
+/*-------------------------------------------------------------------------
+ * Function: Get name of i'th object in table
+ *
+ * Purpose:
+ *
+ * Return: Success: strdup() of object name character string
+ *
+ * Failure: NULL
+ *
+ * Programmer: Paul Harten
+ *
+ *-----------------------------------------------------------------------*/
+char *
+get_objectname(table_t* table, int idx)
+{
+ /*
+ switch (type) {
+
+ case H5G_GROUP:
+
+ return strdup(group_table.objs[idx].objname);
+
+ case H5G_DATASET:
+
+ return strdup(dset_table.objs[idx].objname);
+
+ case H5G_TYPE:
+
+ return strdup(type_table.objs[idx].objname);
+
+ default:
+
+ return NULL;
+
+ }
+ */
+
+ return(strdup(table->objs[idx].objname));
+}
+
+
+
+
+
+
+
+