MOAB: Mesh Oriented datABase  (version 5.5.0)
dump_sets.c
Go to the documentation of this file.
1 #include "mhdf.h"
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <H5Tpublic.h>
5 
6 #define CHECK \
7  do \
8  { \
9  if( mhdf_isError( &status ) ) \
10  { \
11  fprintf( stderr, "mhdf error at %s:%d : \"%s\"\n", __FILE__, __LINE__, mhdf_message( &status ) ); \
12  exit( 2 ); \
13  } \
14  } while( 0 )
15 
16 void dump_sets( mhdf_FileHandle file );
17 void dump_set_contents( long first, long num_sets, const int* flags, const long* end_indices, const long* contents );
18 void dump_set_list( long id, const long* array, long count );
19 void dump_set_ranges( long id, const long* array, long count );
20 
21 int WIDTH;
22 
23 int main( int argc, char* argv[] )
24 {
25  mhdf_Status status;
26  mhdf_FileHandle file;
27  unsigned long max_id;
28 
29  if( argc != 2 )
30  {
31  fprintf( stderr, "Usage: %s <input_file>\n", argv[0] );
32  return 1;
33  }
34 
35  file = mhdf_openFile( argv[1], 0, &max_id, -1, &status );
36  CHECK;
37 
38  WIDTH = 1;
39  while( max_id >= 10 )
40  {
41  max_id /= 10;
42  ++WIDTH;
43  }
44  dump_sets( file );
45  mhdf_closeFile( file, &status );
46  CHECK;
47  return 0;
48 }
49 
51 {
52  long *end_indices, *data, *new_data;
53  int* flags;
54  long num_sets, first, num_data;
55  hid_t meta, handle;
56  mhdf_Status status;
57 
58  meta = mhdf_openSetMeta( file, &num_sets, &first, &status );
59  CHECK;
60  end_indices = malloc( num_sets * sizeof( long ) );
61 
62  printf( "\nSet IDs: %ld - %ld\n", first, first + num_sets - 1 );
63 
64  puts( "\nSets:\n" );
65  flags = malloc( num_sets * sizeof( int ) );
66  mhdf_readSetFlags( meta, 0, num_sets, H5T_NATIVE_INT, flags, &status );
67  CHECK;
68  mhdf_readSetContentEndIndices( meta, 0, num_sets, H5T_NATIVE_LONG, end_indices, &status );
69  CHECK;
70  handle = mhdf_openSetData( file, &num_data, &status );
71  CHECK;
72  data = malloc( num_data * sizeof( long ) );
73  mhdf_readSetData( handle, 0, num_data, H5T_NATIVE_LONG, data, &status );
74  CHECK;
75  mhdf_closeData( file, handle, &status );
76  CHECK;
77  dump_set_contents( first, num_sets, flags, end_indices, data );
78  free( flags );
79 
80  puts( "\nSet Children:\n" );
81  mhdf_readSetChildEndIndices( meta, 0, num_sets, H5T_NATIVE_LONG, end_indices, &status );
82  CHECK;
83  handle = mhdf_openSetChildren( file, &num_data, &status );
84  CHECK;
85  new_data = realloc( data, num_data * sizeof( long ) );
86  if( !new_data )
87  {
88  fprintf( stderr, "dump_sets.c::dump_sets(): reallocation of data failed\n" );
89  free( data );
90  free( end_indices );
91  mhdf_closeData( file, handle, &status );
92  CHECK;
93  mhdf_closeData( file, meta, &status );
94  CHECK;
95  return;
96  }
97  else
98  data = new_data;
99  mhdf_readSetParentsChildren( handle, 0, num_data, H5T_NATIVE_LONG, data, &status );
100  CHECK;
101  mhdf_closeData( file, handle, &status );
102  CHECK;
103  dump_set_contents( first, num_sets, NULL, end_indices, data );
104 
105  puts( "\nSet Parents:\n" );
106  mhdf_readSetParentEndIndices( meta, 0, num_sets, H5T_NATIVE_LONG, end_indices, &status );
107  CHECK;
108  handle = mhdf_openSetParents( file, &num_data, &status );
109  CHECK;
110  new_data = realloc( data, num_data * sizeof( long ) );
111  if( !new_data )
112  {
113  fprintf( stderr, "dump_sets.c::dump_sets(): reallocation of data failed\n" );
114  free( data );
115  free( end_indices );
116  mhdf_closeData( file, handle, &status );
117  CHECK;
118  mhdf_closeData( file, meta, &status );
119  CHECK;
120  return;
121  }
122  else
123  data = new_data;
124  mhdf_readSetParentsChildren( handle, 0, num_data, H5T_NATIVE_LONG, data, &status );
125  CHECK;
126  mhdf_closeData( file, handle, &status );
127  CHECK;
128  dump_set_contents( first, num_sets, NULL, end_indices, data );
129 
130  free( end_indices );
131  free( data );
132  mhdf_closeData( file, meta, &status );
133  CHECK;
134 }
135 
136 void dump_set_contents( long first, long num_sets, const int* flags, const long* end_indices, const long* contents )
137 {
138  long prev = -1;
139  long i, end;
140 
141  for( i = 0; i < num_sets; ++i )
142  {
143  end = end_indices[i];
144  if( end < prev )
145  {
146  fprintf( stderr, "Invalid end index for set %ld (ID %ld): %ld following %ld\n", i, first + i, end, prev );
147  exit( 2 );
148  }
149  if( flags && ( flags[i] & mhdf_SET_RANGE_BIT ) )
150  {
151  dump_set_ranges( i + first, contents + prev + 1, end - prev );
152  }
153  else
154  {
155  dump_set_list( i + first, contents + prev + 1, end - prev );
156  }
157  prev = end;
158  }
159 }
160 
161 void dump_set_list( long id, const long* array, long count )
162 {
163  long i;
164 
165  if( !count ) return; /* skip empty sets */
166 
167  printf( "%*ld: %ld", WIDTH, id, array[0] );
168  for( i = 1; i < count; ++i )
169  printf( ", %ld", array[i] );
170  printf( " (%ld)\n", count );
171 }
172 
173 void dump_set_ranges( long id, const long* array, long count )
174 {
175  long i, n = 0;
176 
177  if( !count ) return; /* skip empty sets */
178  printf( "%*ld:", WIDTH, id );
179  if( count % 2 )
180  {
181  puts( " <INVALID DATA LENGTH FOR RANGED LIST>\n" );
182  return;
183  }
184 
185  for( i = 0; i < count; i += 2 )
186  {
187  if( array[i + 1] > 1 )
188  printf( " %ld-%ld", array[i], array[i] + array[i + 1] - 1 );
189  else
190  printf( " %ld", array[i] );
191  if( i + 2 < count ) putchar( ',' );
192  n += array[i + 1];
193  }
194  printf( " (%ld)\n", n );
195 }