/* * NXdump: Dump contents of HDF (hierarchical data format) * file using the NEXUS API * * Author: N. Maliszewskyj, NIST Center for Neutron Research, June 1997 */ #include #include #include #include #include "napi.h" #define INDENT_AMOUNT " " char * type2s(uint type){ static char unknownType[40]; switch (type){ case DFNT_NONE: return "DFNT_NONE"; case DFNT_FLOAT32: return "DFNT_FLOAT32"; case DFNT_FLOAT64: return "DFNT_FLOAT64"; case DFNT_INT8: return "DFNT_INT8"; case DFNT_UINT8: return "DFNT_UINT8"; case DFNT_INT16: return "DFNT_INT16"; case DFNT_UINT16: return "DFNT_UINT16"; case DFNT_INT32: return "DFNT_INT32"; case DFNT_UINT32: return "DFNT_UINT32"; } return "Unsupported!"; } int dumpAttr(NXhandle NXdat, char * parent, char * indent) { int length, itype; char name[VGNAMELENMAX], *data; NXstatus NXstat; while((NXstat = NXgetnextattr(NXdat, name, &length, &itype)) != NX_EOD) { data = (char *) malloc(length + 1); NXstat = NXgetattr(NXdat, name, data, length); data[length] = 0; printf("%s%s:%s=%s\n",indent,parent,name,data); } return 0; } int dumpSDS(NXhandle NXdat, char * name, char * indent) { char new_indent[80]; int rank, dims[MAX_VAR_DIMS], datatype,i; NXstatus NXstat; strcpy(new_indent,indent); strcat(new_indent,INDENT_AMOUNT); NXstat = NXopendata(NXdat, name); NXstat = NXgetinfo(NXdat, &rank, dims, &datatype); printf("%sSD %s (datatype=%s, rank=%d, dimensions=%d",new_indent, name, type2s(datatype), rank, dims[0]); if (rank > 1) { for (i=1;i%s\n",indent,class,name); if ((NXstat = NXopengroup(NXdat,name,class)) == NX_ERROR) { fprintf(stderr,"Error opening V group %s!",name); return -1; } dumpVG(NXdat,new_indent); NXstat = NXclosegroup(NXdat); printf("%sv %s->%s\n",indent,class,name); } break; default: dumpSDS(NXdat,name,new_indent); } } return 0; } void main(int argc, char ** argv) { char name[VGNAMELENMAX], class[VGNAMELENMAX], indent[80] = ""; int datatype; char filename[80]; NXhandle NXdat; NXstatus NXstat; if (argc < 2) { fprintf(stderr,"Usage: nxdump \n"); exit(1); } strcpy(filename,argv[1]); if ((NXdat = NXopen(filename,DFACC_RDWR)) == NULL) { fprintf(stderr,"Unable to access file %s! Exiting...\n",filename); exit(1); } /* Read and display global attributes */ dumpAttr(NXdat, "", indent); /* Read anything else and recurse through V groups */ dumpVG(NXdat, indent); NXclose(NXdat); }