1 #include "mhdf.h"
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <string.h>
5 #include <ctype.h>
6 #include <H5Tpublic.h>
7 
8 static int print_file_summary( struct mhdf_FileDesc* data );
9 
main(int argc,char * argv[])10 int main( int argc, char* argv[] )
11 {
12   int result;
13   mhdf_FileHandle file;
14   mhdf_Status status;
15   unsigned long max_id;
16   struct mhdf_FileDesc* data;
17 
18   if (argc != 2) {
19     fprintf( stderr,"Usage: %s <filename>\n", argv[0] );
20     return 1;
21   }
22 
23   file = mhdf_openFile( argv[1], 0, &max_id, -1, &status );
24   if (mhdf_isError( &status )) {
25     fprintf( stderr,"%s: %s\n", argv[1], mhdf_message( &status ) );
26     return 1;
27   }
28 
29   data = mhdf_getFileSummary( file, H5T_NATIVE_ULONG, &status, 0 ); /* no extra set info here*/
30   if (mhdf_isError( &status )) {
31     fprintf( stderr,"%s: %s\n", argv[1], mhdf_message( &status ) );
32     return 1;
33   }
34 
35   mhdf_closeFile( file, &status );
36 
37   printf( "%s:\n", argv[1] );
38   result = print_file_summary( data );
39   free( data );
40   return result;
41 }
42 
print_ent_desc(const char * name,const char * subname,struct mhdf_EntDesc * data,const char * vals_label,const char * extra_label,struct mhdf_FileDesc * all)43 static void print_ent_desc( const char* name,
44                             const char* subname,
45                             struct mhdf_EntDesc* data,
46                             const char* vals_label,
47                             const char* extra_label,
48                             struct mhdf_FileDesc* all )
49 {
50   int i, len = 10;
51 
52   if (vals_label && (int)strlen(vals_label) > len)
53     len = strlen(vals_label);
54   if (extra_label && (int)strlen(extra_label) > len)
55     len = strlen(extra_label);
56 
57   if (subname)
58     printf( "    %s (%s):\n", name, subname );
59   else
60     printf( "    %s:\n", name );
61 
62   if (vals_label)
63     printf( "      %-*s: %d\n", len, vals_label, data->vals_per_ent );
64 
65   printf( "      %-*s: %ld [%ld - %ld]\n", len, "entities", data->count, data->start_id, data->start_id + data->count - 1 );
66 
67   if (extra_label)
68     printf( "      %-*s\n", len, extra_label );
69 
70   if (!data->num_dense_tags)
71     return;
72 
73   printf( "      %-*s: \"%s\"", len, "dense tags", all->tags[data->dense_tag_indices[0]].name );
74   for (i = 1; i < data->num_dense_tags; ++i)
75     printf( ", \"%s\"", all->tags[data->dense_tag_indices[i]].name );
76   printf ("\n");
77 }
78 
print_elem_desc(struct mhdf_ElemDesc * data,struct mhdf_FileDesc * all)79 static void print_elem_desc( struct mhdf_ElemDesc* data, struct mhdf_FileDesc* all )
80 {
81   const char* adj = data->have_adj ? "adjacencies" : "no adjencies";
82   print_ent_desc( data->handle, data->type, &data->desc, "nodes per element", adj, all );
83 }
84 
tag_type_name(enum mhdf_TagDataType type)85 static const char* tag_type_name( enum mhdf_TagDataType type )
86 {
87   static const char opaque[] = "opaque";
88   static const char integer[] = "integer";
89   static const char real[] = "real";
90   static const char bits[] = "bit field";
91   static const char boolean[] = "boolean";
92   static const char id[] = "entity id";
93   static const char unknown[] = "(UNKNOWN TYPE ID)";
94   switch (type) {
95     case mhdf_OPAQUE:    return opaque;
96     case mhdf_INTEGER:   return integer;
97     case mhdf_FLOAT:     return real;
98     case mhdf_BITFIELD:  return bits;
99     case mhdf_BOOLEAN:   return boolean;
100     case mhdf_ENTITY_ID: return id;
101   }
102   return unknown;
103 }
104 
string_tag_value(const void * value,enum mhdf_TagDataType type,int size)105 static const char* string_tag_value( const void* value,
106                                      enum mhdf_TagDataType type,
107                                      int size )
108 {
109   static char buffer[1024];
110   const char* data = value;
111   char* offset = buffer;
112   int print, i;
113   const int* intptr = value;
114   const double* dblptr = value;
115   const unsigned long* idptr = value;
116 
117 
118   if (size <= 0) {
119     *buffer = '\0';
120     return buffer;
121   }
122 
123   switch (type) {
124     case mhdf_OPAQUE:
125       print = 1;
126       for (i = 0; i < size; ++i)
127         if (!isprint(data[i]))
128           print = 0;
129       if (print) {
130         offset[0] = '"';
131         memcpy( offset+1, data, size );
132         offset[size+1] = '"';
133         offset[size+2] = '\0';
134         offset += size+2;
135       }
136       else {
137         strcpy( offset, "0x" );
138         offset += 2;
139         for (i = 0; i < size; ++i)
140           offset += sprintf( offset, "%02x", (unsigned int)data[i] );
141       }
142       break;
143     case mhdf_INTEGER:
144       if (size == 1) {
145         offset += sprintf( offset, "%d", intptr[0] );
146       }
147       else {
148         offset += sprintf( offset, "{%d", intptr[0] );
149         for (i = 1; i < size; ++i)
150           offset += sprintf( offset, ",%d", intptr[i] );
151         offset += sprintf( offset, "}" );
152       }
153       break;
154     case mhdf_FLOAT:
155       if (size == 1) {
156         offset += sprintf( offset, "%g", dblptr[0] );
157       }
158       else {
159         offset += sprintf( offset, "{%g", dblptr[0] );
160         for (i = 1; i < size; ++i)
161           offset += sprintf( offset, ",%g", dblptr[i] );
162         offset += sprintf( offset, "}" );
163       }
164       break;
165     case mhdf_BITFIELD:
166       if (size > 8)
167         offset += sprintf( offset, "(more than 8 bits)" );
168       else {
169         for (i = size - 1; i >= 0; --i)
170           *(offset++) = (char)(*data & (1<<i) ? '1' : '0');
171         *offset = '\0';
172       }
173       break;
174     case mhdf_BOOLEAN:
175       if (size == 1) {
176         offset += sprintf( offset, "%s", data[0] ? "true" : "false" );
177       }
178       else {
179         offset += sprintf( offset, "{%s", data[0] ? "true" : "false" );
180         for (i = 1; i < size; ++i)
181           offset += sprintf( offset, ",%s", data[i] ? "true" : "false" );
182         offset += sprintf( offset, "}" );
183       }
184       break;
185     case mhdf_ENTITY_ID:
186       if (size == 1) {
187         offset += sprintf( offset, "%lu", idptr[0] );
188       }
189       else {
190         offset += sprintf( offset, "{%lu", idptr[0] );
191         for (i = 1; i < size; ++i)
192           offset += sprintf( offset, ",%lu", idptr[i] );
193         offset += sprintf( offset, "}" );
194       }
195       break;
196     default:
197       strcpy( buffer, "(unknown data type)" );
198       break;
199   }
200 
201   return buffer;
202 }
203 
ent_desc_name(struct mhdf_FileDesc * all,int idx)204 static const char* ent_desc_name( struct mhdf_FileDesc* all, int idx )
205 {
206   static const char nodes[] = "Nodes";
207   static const char sets[] = "Sets";
208   static const char invalid[] = "<INVALID INDEX!>";
209   if (idx == -2) return sets;
210   if (idx == -1) return nodes;
211   if (idx >= all->num_elem_desc || idx < -2) return invalid;
212   return all->elems[idx].handle;
213 }
214 
print_tag_desc(struct mhdf_TagDesc * data,struct mhdf_FileDesc * all)215 static void print_tag_desc( struct mhdf_TagDesc* data, struct mhdf_FileDesc* all )
216 {
217   int i, width = 8;
218 
219   printf( "    \"%s\":\n", data->name );
220   printf( "      %-*s: %s\n", width, "type", tag_type_name( data->type ) );
221   if (data->size < 0)
222     printf( "      %-*s: (variable)\n", width, "size" );
223   else
224     printf( "      %-*s: %d (%d bytes)\n", width, "size", data->size, data->bytes );
225   printf( "      %-*s: %x\n", width, "flags", data->storage );
226   if (data->default_value)
227     printf( "      %-*s: %s\n", width, "default",
228       string_tag_value( data->default_value, data->type, data->default_value_size ) );
229   if (data->global_value)
230     printf( "      %-*s: %s\n", width, "mesh val",
231       string_tag_value( data->global_value, data->type, data->global_value_size ) );
232   if (data->have_sparse) {
233     printf( "      %-*s: (sparse)", width, "tables" );
234     for (i = 0; i < data->num_dense_indices; ++i)
235       printf( ", %s", ent_desc_name( all, data->dense_elem_indices[i] ) );
236   }
237   else if (data->num_dense_indices) {
238     printf( "      %-*s: %s", width, "tables", ent_desc_name( all, data->dense_elem_indices[0] ) );
239     for (i = 1; i < data->num_dense_indices; ++i)
240       printf( ", %s", ent_desc_name( all, data->dense_elem_indices[i] ) );
241   }
242   else {
243     printf( "      %-*s: (none)", width, "tables" );
244   }
245   printf( "\n" );
246 }
247 
print_file_summary(struct mhdf_FileDesc * data)248 static int print_file_summary( struct mhdf_FileDesc* data )
249 {
250   int i;
251 
252   printf( "  Entities:\n" );
253   print_ent_desc( "Nodes", NULL, &data->nodes, "dimension", NULL, data );
254   for (i = 0; i < data->num_elem_desc; ++i)
255     print_elem_desc( data->elems + i, data );
256   print_ent_desc( "Sets", NULL, &data->sets, NULL, NULL, data );
257 
258   printf( "  Tags:\n" );
259   for (i = 0; i < data->num_tag_desc; ++i)
260     print_tag_desc( data->tags + i, data );
261 
262   return 0;
263 }
264