1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "IO.hh"
#include "IEEEIO.hh"
#ifdef WITH_HDF4
#include "HDFIO.hh"
#endif
#ifdef WITH_HDF5
#include "H5IO.hh"
#endif
char *programname;
void usage(){
printf("Correct usage is %s <infile> <outfile> [-swapbytes]\n",programname);
puts("-swapbytes requests opposite of native byte-order for IEEEIO output");
puts("The default is to write IEEE files in native byte-order");
exit(1); // failure code
}
int main(int argc,char *argv[]){
programname=argv[0]; // for usage/error_exit routine
if(argc<3) usage();
int i,swap;
int sindex=0,dindex=0,findex=0;
IObase *infile,*outfile;
#ifdef WITH_HDF4
HDFIO *hdffile;
#endif
int hdfin=0;
int h5in=0;
for(i=1;i<argc;i++){
if(*(argv[i])=='-') findex=i;
else if(!sindex) sindex=i;
else dindex=i;
}
if(!sindex || !dindex || // doesn't have both infile and outfile specified
(findex && !strcmp("-help",argv[findex])) || // used help flag
(findex && strcmp("-swapbytes",argv[findex])) ) // invalid flag
usage();
if(findex && !strcmp("-swapbytes",argv[findex])) swap=1;
else swap=0;
// for the input file
char *s_ext=strrchr(argv[sindex],'.');
char *d_ext=strrchr(argv[dindex],'.');
if(s_ext && (!strcmp(s_ext,".ieee") || !strcmp(s_ext,".raw"))){
infile=new IEEEIO(argv[sindex],IObase::Read);
}
#ifdef WITH_HDF4
else if(s_ext && !strcmp(s_ext,".hdf")){
infile=hdffile=new HDFIO(argv[sindex],IObase::Read);
hdfin=1;
}
#endif
#ifdef WITH_HDF5
else if(s_ext && (!strcmp(s_ext,".h5") || !strcmp(s_ext,".hdf5"))){
infile = new H5IO(argv[sindex],IObase::Read);
if(!infile->isValid()) fprintf(stderr,"**** not hdf5 input?\n");
h5in=1;
}
#endif
if(!infile->isValid()){
printf("cant read %s\n",argv[sindex]);
usage();
}
// for the outfile,
if(d_ext && (!strcmp(d_ext,".ieee") || !strcmp(d_ext,".raw"))){
outfile=new IEEEIO(argv[dindex],IObase::Create,swap); // swap only affects IEEEIO output
}
#ifdef WITH_HDF4
else if(d_ext && !strcmp(d_ext,".hdf")){
outfile=new HDFIO(argv[dindex],IObase::Create);
}
#endif
#ifdef WITH_HDF5
else if(d_ext && (!strcmp(d_ext,".h5") || !strcmp(d_ext,".hdf5"))){
outfile = new H5IO(argv[dindex],IObase::Create);
}
#endif
if(!outfile->isValid()){
printf("cant write %s\n",argv[dindex]);
delete infile;
usage();
}
// Now do the conversion
for(i=0;i<infile->nDatasets();i++){
int rank,dims[5];
IObase::DataType type;
char *data;
infile->seek(i);
if(hdfin && hdffile->isCoord()) continue; // skip coord vars
fprintf(stderr,".%u",i);
infile->readInfo(type,rank,dims);
{
int j,sz;
for(j=0,sz=1;j<rank;j++) sz*=dims[j];
sz*=IObase::sizeOf(type);
data=new char[sz];
}
infile->read(data);
outfile->write(type,rank,dims,data);
delete data; // OK, so I'm not being smart about mem allocation here
for(int j=0;j<infile->nAttributes();j++){
char name[256]; // should be big enough
int length;
fprintf(stderr,"a");
infile->readAttributeInfo(j,name,type,length);
data = new char[length * IObase::sizeOf(type)];
infile->readAttribute(j,data);
outfile->writeAttribute(name,type,length,data);
delete data;
}
}
puts("");
delete outfile;
delete infile;
return 0; // success code
}
|