diff options
Diffstat (limited to 'src/ioinfo.cc')
-rw-r--r-- | src/ioinfo.cc | 281 |
1 files changed, 281 insertions, 0 deletions
diff --git a/src/ioinfo.cc b/src/ioinfo.cc new file mode 100644 index 0000000..91e487d --- /dev/null +++ b/src/ioinfo.cc @@ -0,0 +1,281 @@ +#include <stdio.h> +#include <stdlib.h> +#include "Arch.h" +#include "IO.hh" +#include "IEEEIO.hh" + +#ifdef WITH_HDF4 +#include "HDFIO.hh" +#endif +#ifdef WITH_HDF5 +#include "H5IO.hh" +#endif + +struct CmdlnParams { + char *programname; + char *filename,*filetype; + int showdatasetinfo,showannotationinfo,showattribinfo; + int showdatamax,showannotationmax,showattribmax; + int showdatastats,showattribstats; + + void setDefaults(){ + programname=""; + filename=0; + filetype=0; + showdatasetinfo=1; + showannotationinfo=0; + showattribinfo=0; + showdatamax=0; + showannotationmax=0; + showattribmax=0; + showdatastats=0; + showattribstats=0; + } + + CmdlnParams(){ + setDefaults(); + } + + CmdlnParams(int argc,char *argv[]){ + setDefaults(); + parse(argc,argv); + } + + void parse(int argc,char *argv[]){ + programname=argv[0]; + for(int i=1;i<argc;i++){ + char *str=argv[i]; + if(*str=='-'){ + char *val=argv[i+1]; + str++; + //printf("read option[%u]=[%s]\n",i,str); + if(!strcmp(str,"showdata")) { + puts("option -showdata:\tShow first 10 data entries"); + showdatamax=10;} + else if(!strcmp(str,"hidedata")) { + puts("option -hidedata:\tDon't show data"); + showdatamax=0; } + else if(!strncmp(str,"showann",7)&& + strstr(str,"data")) { + puts("option -showanndata:\tShow annotation text (max of 10 chars)"); + showannotationmax=10; showannotationinfo=1; } + else if(!strncmp(str,"hideann",7)&& + strstr(str,"data")) { + puts("option -hideanndata:\tSupress printing of annotation text"); + showannotationmax=0; } + else if(!strncmp(str,"showatt",7) && + strstr(str,"data")) { + puts("option -showattdata:\tShow first 10 elements of attribute data"); + showattribmax=10; + showattribinfo=1;} + else if(!strncmp(str,"hideatt",7)&& + strstr(str,"data")) { + puts("option -hideatt:\tHide attribute info"); + showattribmax=0; } + else if(!strncmp(str,"showann",7)&& + strstr(str,"info")) {showannotationinfo=1;} + else if(!strncmp(str,"hideann",7)&& + strstr(str,"info")) {showannotationinfo=0; } + else if(!strncmp(str,"showatt",7) && + strstr(str,"info")) { + puts("option -showattinfo:\tShow attribute info (name,type,length)"); + showattribinfo=1; } + else if(!strncmp(str,"hideatt",7) && + strstr(str,"info")) {showattribinfo=0; } + else if(!strcmp(str,"file")) { + filename=val; + i++; + filetype=strrchr(str,'.') + 1; + printf("option -file %s: Read file named [%s]\n",filename,filetype); + } + else if(!strcmp(str,"type")) {filetype=val; i++;} + } + else { // its probably a filename + filename=str; + filetype=strrchr(str,'.'); + if(filetype) filetype++; // skip the '.' + else filetype = ""; + } + } + } +}; + +char *Typename(IObase::DataType datatype){ + char *typestring; + switch(datatype){ + case IObase::Int8: + typestring="Int8"; + break; + case IObase::Int16: + typestring="Int16"; + break; + case IObase::Int32: + typestring="Int32"; + break; + case IObase::Int64: + typestring="Int64"; + break; + case IObase::Float32: + typestring="Float32"; + break; + case IObase::Float64: + typestring="Float64"; + break; + case IObase::Char8: + typestring="String"; + break; + default: + typestring="<Unknown>"; + break; + } + return typestring; +} + +int main(int argc,char *argv[]){ + CmdlnParams cmdln(argc,argv); // parse commandline parameters & flags + if(!cmdln.filename) { + puts("HEY! Need a filename there buddy!"); + exit(1); // failure code + } + + int i; + IObase *infile = NULL; + + // Figure out what kind of file to open as +#ifdef WITH_HDF5 + if(!strcmp(cmdln.filetype,"h5")){ + infile = new H5IO(cmdln.filename,IObase::Read); + } +#endif +#ifdef WITH_HDF4 + if(!strcmp(cmdln.filetype,"hdf")){ + infile = new HDFIO(cmdln.filename,IObase::Read); + } +#endif + if(!strcmp(cmdln.filetype,"raw") || !strcmp(cmdln.filetype,"ieee")){ + infile = new IEEEIO(cmdln.filename,IObase::Read); + } + if(!infile){ + puts("I don't recognize that type of file, but I'll try to open as ieee"); + cmdln.filetype="ieee"; + infile = new IEEEIO(cmdln.filename,IObase::Read); + } + if(!infile->isValid()){ + printf("%s: The file %s is not a valid %s file... sorry\n", + cmdln.programname,cmdln.filename,cmdln.filetype); + exit(1); + } + int ndatasets=infile->nDatasets(); + printf("Number of datasets=%d\n",ndatasets); + puts ("==========================="); + + // OK... now its time for da main event loop.... + for(i=0;i<ndatasets;i++){ + int j; + int rank,dims[5]; + IObase::DataType datatype; + + printf("Dataset[%u]\n",i); + puts("--------------"); + infile->readInfo(datatype,rank,dims); + + printf("Datatype=%s Rank=%u Dims=",Typename(datatype),rank); + for(j=0;j<rank-1;j++) + printf("%u,",dims[j]); + printf("%u\n",dims[rank-1]); +#if 0 // blow this away for now + if(cmdln.showdatamax){// || cmdln.showdatastats (not implemented yet) + // must allocate memory for it + void *buffer=0; + int *idims=new int[rank]; + for(int dim=0;dim<rank;dim++) idims[dim]=0; + idim[0]=showdatamax; + if(IObase::sizeOf(datatype)>0 && dims[0]>0) + buffer=new char[idims[0] * IObase::sizeOf(datatype)]; + //infile->readChunk(buffer); + delete buffer; + delete idims; + } +#endif + int nattribs=infile->nAttributes(); + int nannotations=infile->nAnnotations(); + printf("Annotations: %u\n",nannotations); + printf("Attributes: %u\n",nattribs); + + if(cmdln.showattribinfo){ + for(j=0;j<nattribs;j++){ + char attribname[64]; + Long length; + infile->readAttributeInfo(j,attribname,datatype,length); + printf("\tAttribute[%u] Name=%s Type=%s Length=%u\n", + j,attribname,Typename(datatype),length); + if(cmdln.showattribmax || cmdln.showattribstats){ + //printf("Length of Attribute=%u for total bytes=%u\n",length,IObase::sizeOf(datatype)); + void *dataptr; + dataptr=0; + if(IObase::sizeOf(datatype)>0 && length>0) + dataptr=new char[length * IObase::sizeOf(datatype)]; + else { + //puts("no data to display"); + continue; // no data to display + } + + infile->readAttribute(j,dataptr); + switch(datatype){ + case IObase::Char8:{ + char *d=(char*)dataptr; + d[length]='\0'; + //puts("show char data"); + printf("\t%s string[%u]:= %s\n",attribname,length,d); + }break; + case IObase::Int8: + case IObase::uInt8:{ + char *d=(char*)dataptr; + for(int k=0;k<cmdln.showattribmax && k<length;k++) + if(d[k]>=0x20 && d[k]<=0x7e) + printf("\t%s[%u]:=%c\n",attribname,k,d[k]); + else { + int intchar=(unsigned int)(d[k]); + printf("\t%s[%u]:=%u\n",attribname,k,intchar); + } + }break; + case IObase::Int16:{ + short *d=(short*)dataptr; + for(int k=0;k<cmdln.showattribmax && k<length;k++) + printf("\t%s[%u]:=%u\n",attribname,k,d[k]); + }break; + case IObase::Int32:{ + int *d=(int*)dataptr; + for(int k=0;k<cmdln.showattribmax && k<length;k++) + printf("\t%s[%u]:=%u\n",attribname,k,d[k]); + }break; + case IObase::Int64:{ + Long8 *d=(Long8*)dataptr; + for(int k=0;k<cmdln.showattribmax && k<length;k++) + printf("\t%s[%u]:=%lu\n",attribname,k,d[k]); + }break; + case IObase::Float32:{ + float *d=(float*)dataptr; + for(int k=0;k<cmdln.showattribmax && k<length;k++) + printf("\t%s[%u]:=%f\n",attribname,k,d[k]); + }break; + case IObase::Float64:{ + double *d=(double*)dataptr; + for(int k=0;k<cmdln.showattribmax && k<length;k++) + printf("\t%s[%u]:=%f\n",attribname,k,d[k]); + }break; + default: + puts("-----<nil>-----"); + break; + } + if(dataptr) + delete dataptr; + } + } + } + } + puts("Closing file"); + delete infile; + puts("***done"); + return 0; +} |