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