summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/h5findshd.c302
1 files changed, 302 insertions, 0 deletions
diff --git a/tools/h5findshd.c b/tools/h5findshd.c
new file mode 100644
index 0000000..a18e2ac
--- /dev/null
+++ b/tools/h5findshd.c
@@ -0,0 +1,302 @@
+
+#include <hdf5.h>
+#include <H5private.h>
+
+typedef struct shared_obj_t{
+unsigned long objno[2];
+char objname[1024];
+int displayed;
+} shared_obj_t;
+
+typedef struct table_t{
+int size;
+int nobjs;
+shared_obj_t *objs;
+} table_t;
+
+int prefix_len = 1024;
+char *prefix;
+table_t group_table, dset_table, type_table;
+
+typedef herr_t (*H5G_operator_t)(hid_t, const char*, void*);
+
+extern void init_table(void);
+extern void free_table(void);
+extern int search_obj (table_t, unsigned long *);
+extern void add_obj (table_t *, unsigned long *, char *);
+extern void dump_tables(void);
+extern herr_t find_shared_objs(hid_t , char *, void *);
+
+/*-------------------------------------------------------------------------
+ * 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 (void){
+int i;
+
+ group_table.size = dset_table.size = type_table.size = 20;
+ group_table.nobjs = dset_table.nobjs = type_table.nobjs = 0;
+
+ group_table.objs = (shared_obj_t*) HDmalloc(group_table.size*sizeof(shared_obj_t));
+ dset_table.objs = (shared_obj_t*) HDmalloc(dset_table.size*sizeof(shared_obj_t));
+ type_table.objs = (shared_obj_t*) HDmalloc(type_table.size*sizeof(shared_obj_t));
+
+ for (i = 0; i < group_table.size; i++) {
+ group_table.objs[i].objno[0] = group_table.objs[i].objno[1] = 0;
+ group_table.objs[i].displayed = 0;
+ }
+
+ for (i = 0; i < dset_table.size; i++) {
+ dset_table.objs[i].objno[0] = dset_table.objs[i].objno[1] = 0;
+ dset_table.objs[i].displayed = 0;
+ }
+
+ for (i = 0; i < type_table.size; i++) {
+ dset_table.objs[i].objno[0] = dset_table.objs[i].objno[1] = 0;
+ dset_table.objs[i].displayed = 0;
+ }
+
+ prefix = (char *) HDmalloc(prefix_len * sizeof (char));
+ strcpy(prefix, "");
+
+}
+
+/*-------------------------------------------------------------------------
+ * Function: free_table
+ *
+ * Purpose: free tables for shared groups, datasets,
+ * and committed types
+ *
+ * Return: void
+ *
+ * Programmer: Paul Harten
+ *
+ * Modifications:
+ *
+ *-----------------------------------------------------------------------*/
+void
+free_table (void){
+
+ HDfree(&group_table);
+ HDfree(&dset_table);
+ HDfree(&type_table);
+
+}
+
+
+/*-------------------------------------------------------------------------
+ * 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 = HDrealloc (table->objs, table->size*sizeof(shared_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;
+ }
+ }
+
+ i = table->nobjs++;
+ table->objs[i].objno[0] = *objno;
+ table->objs[i].objno[1] = *(objno+1);
+ strcpy (table->objs[i].objname, objname);
+
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: dump_tables
+ *
+ * Purpose: display the contents of tables for debugging purposes
+ *
+ * Return: void
+ *
+ * Programmer: Ruey-Hsia Li
+ *
+ * Modifications:
+ *
+ *-----------------------------------------------------------------------*/
+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 ("%lu %lu %s %d\n", group_table.objs[i].objno[0],
+ group_table.objs[i].objno[1],
+ group_table.objs[i].objname,
+ group_table.objs[i].displayed);
+
+ printf("\ndset_table: # of entries = %d\n", dset_table.nobjs);
+ for ( i = 0; i < dset_table.nobjs; i++)
+ printf ("%lu %lu %s %d\n", dset_table.objs[i].objno[0],
+ dset_table.objs[i].objno[1],
+ dset_table.objs[i].objname,
+ dset_table.objs[i].displayed);
+
+ printf("\ntype_table: # of entries = %d\n", type_table.nobjs);
+ for ( i = 0; i < type_table.nobjs; i++)
+ printf ("%lu %lu %s %d\n", type_table.objs[i].objno[0],
+ type_table.objs[i].objno[1],
+ type_table.objs[i].objname,
+ type_table.objs[i].displayed);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: Find_shared_objs
+ *
+ * Purpose: Find shared objects, committed types and store them in tables
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Ruey-Hsia Li
+ *
+ * Modifications: Paul Harten
+ *
+ *-----------------------------------------------------------------------*/
+herr_t
+find_shared_objs(hid_t group, char *name, void __unused__ *op_data)
+{
+hid_t obj, type;
+H5G_stat_t statbuf;
+char *tmp;
+int status=SUCCEED;
+int i;
+
+ H5Gget_objinfo(group, name, TRUE, &statbuf);
+
+ tmp = (char *) HDmalloc ((strlen(prefix)+strlen(name)+2) * sizeof(char));
+
+ strcpy(tmp, prefix);
+
+ switch (statbuf.type) {
+
+ case H5G_GROUP:
+ if ((obj=H5Gopen (group, name))>=0) {
+
+ if (prefix_len < (int)(strlen(prefix) + strlen(name) + 2)) {
+ prefix_len *= 2;
+ prefix = HDrealloc (prefix, prefix_len * sizeof(char));
+ }
+ strcat(strcat(prefix,"/"), name);
+
+ if (statbuf.nlink > 1) {
+ if (search_obj (group_table, statbuf.objno) < 0) {
+ add_obj (&group_table, statbuf.objno, prefix);
+ status = H5Giterate (obj, ".", NULL, (H5G_operator_t)find_shared_objs, NULL);
+ }
+ } else
+ status = H5Giterate (obj, ".", NULL, (H5G_operator_t)find_shared_objs, NULL);
+
+ strcpy(prefix, tmp);
+ H5Gclose (obj);
+
+ } else
+ status = FAIL;
+
+ break;
+
+ case H5G_DATASET:
+
+ strcat(tmp,"/");
+ strcat(tmp,name); /* absolute name of the data set */
+ if (statbuf.nlink > 1 &&
+ search_obj (dset_table, statbuf.objno) < 0)
+ add_obj (&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 (type_table, statbuf.objno) < 0) {
+ add_obj (&type_table, statbuf.objno, tmp) ;
+ type_table.objs[type_table.nobjs-1].displayed = 0;
+ }
+ }
+ H5Tclose(type);
+ H5Dclose (obj);
+ status = SUCCEED;
+ } else
+ status = FAIL;
+
+ break;
+
+ case H5G_TYPE:
+ strcat(tmp,"/");
+ strcat(tmp,name); /* absolute name of the type */
+ i = search_obj (type_table, statbuf.objno);
+ if (i < 0) {
+ add_obj (&type_table, statbuf.objno, tmp) ;
+ type_table.objs[type_table.nobjs-1].displayed = 1; /* named data type */
+ } else {
+ strcpy (type_table.objs[i].objname, tmp);
+ type_table.objs[i].displayed = 1; /* named data type */
+ }
+ status = SUCCEED;
+ break;
+
+ default:
+ break;
+ }
+
+ HDfree (tmp);
+
+ return status;
+
+}