00001 #include <stdlib.h>
00002 #include <stdio.h>
00003 #include <string.h>
00004 #include "nmd_impl.h"
00005 #include "nmd.h"
00006
00007 #if defined(NMD_HAVE_HDF5)
00008 #include "hdf5.h"
00009 #define H5ERR(i) if (i<0) {NMD_ERR_RETURN(i);}
00010
00011
00012
00013 #undef __FUNCT__
00014 #define __FUNCT__ "NMDObjectDumpToHDF5"
00015 NMDErrorCode NMDObjectDumpToHDF5(NMD_metadata obj,char *fname)
00016 {
00017 hid_t f,element,ds; hsize_t dim[1]; herr_t status;
00018 int icat,icmp;
00019 NMDErrorCode ierr;
00020 CHECKHASNMDCOOKIE(obj);
00021
00022 f = H5Fcreate
00023 (fname,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT); H5ERR(f);
00024 dim[0] = 1;
00025 element = H5Screate_simple(1,dim,NULL); H5ERR(element);
00026
00027 for (icat=0; icat<obj->ncat; icat++) {
00028 NMD_metadata_category cat = obj->cats[icat];
00029 NMD_string catstring,grpstring; char *c;
00030 CHECKHASNMDCOOKIE(cat);
00031 ierr = NMDStringCreate(cat->name,&catstring); NMD_ERR_RETURN(ierr);
00032 ierr = NMDStringConcat
00033 ('/',catstring,0,0,0,&grpstring); NMD_ERR_RETURN(ierr);
00034 ierr = NMDStringGetString(grpstring,&c); NMD_ERR_RETURN(ierr);
00035 ds = H5Gcreate(f,c,0,H5P_DEFAULT,H5P_DEFAULT); H5ERR(ds);
00036
00037 for (icmp=0; icmp<cat->ncmp; icmp++) {
00038 NMD_metadata_item cmp = cat->cmps[icmp];
00039 NMD_string cmpstring,cmpcatstring;
00040 CHECKHASNMDCOOKIE(cmp);
00041 ierr = NMDStringCreate(cmp->name,&cmpstring); NMD_ERR_RETURN(ierr);
00042 ierr = NMDStringConcat
00043 ('/',catstring,'/',cmpstring,0,&cmpcatstring); NMD_ERR_RETURN(ierr);
00044 ierr = NMDStringGetString(cmpcatstring,&c); NMD_ERR_RETURN(ierr);
00045 switch (cmp->t) {
00046 case NMDInt :
00047 ds = H5Dcreate (f,c,H5T_NATIVE_INT,element,H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT); H5ERR(ds);
00048 status = H5Dwrite
00049 (ds, H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,
00050 &(cmp->i)); H5ERR(status);
00051 break;
00052 case NMDReal :
00053 ds = H5Dcreate (f,c,H5T_NATIVE_DOUBLE,element,H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT); H5ERR(ds);
00054 status = H5Dwrite
00055 (ds, H5T_NATIVE_DOUBLE,H5S_ALL,H5S_ALL,H5P_DEFAULT,
00056 &(cmp->r)); H5ERR(status);
00057 break;
00058 default :
00059 continue;
00060 }
00061 ierr = NMDStringDestroy(cmpstring); NMD_ERR_RETURN(ierr);
00062 ierr = NMDStringDestroy(cmpcatstring); NMD_ERR_RETURN(ierr);
00063 }
00064 ierr = NMDStringDestroy(catstring); NMD_ERR_RETURN(ierr);
00065 ierr = NMDStringDestroy(grpstring); NMD_ERR_RETURN(ierr);
00066 }
00067
00068 status = H5Fclose(f);
00069
00070 return 0;
00071 }
00072 #endif
00073