summaryrefslogtreecommitdiffstats
path: root/tools/h4toh5/h4toh5sds.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/h4toh5/h4toh5sds.c')
-rw-r--r--tools/h4toh5/h4toh5sds.c2319
1 files changed, 0 insertions, 2319 deletions
diff --git a/tools/h4toh5/h4toh5sds.c b/tools/h4toh5/h4toh5sds.c
deleted file mode 100644
index 01b7e8f..0000000
--- a/tools/h4toh5/h4toh5sds.c
+++ /dev/null
@@ -1,2319 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * Copyright (C) 2000 National Center for Supercomputing Applications.
- * All rights reserved.
- *
- *-------------------------------------------------------------------------
- */
-
-/******************************************************************************
-
- Description:
-
-1. converter
-
-See HDF4 to HDF5 mapping specification at
-(http://hdf.ncsa.uiuc.edu/HDF5/papers/h4toh5) for the default mapping
-from HDF4 object to HDF5 object.
-
-The whole converter includes 10 files, h4toh5util.h, h4toh5main.h, h4toh5util.c, h4toh5main.c, h4toh5sds.c, h4toh5image.c,h4toh5vdata.c,h4toh5vgroup.c,h4toh5pal.c and h4toh5anno.c.
-
-2. this file
-
-Converting an hdf4 sds object into an hdf5 dataset.
-
-Author: Kent Yang(ymuqun@ncsa.uiuc.edu)
-
-
-*****************************************************************************/
-
-#include "h4toh5main.h"
-
-static int convert_zerosdsunlimit(int32 file_id,
- int32 sds_id,
- hid_t h5_group,
- hid_t h5_dimgroup,
- int32 chunk_size,
- int h4_attr);
-
-/*-------------------------------------------------------------------------
- * Function: Sds_h4_to_h5
- *
- * Purpose: translate SDS object into hdf5 dataset
- *
- * Return: FAIL if failed, SUCCEED if successful.
- *
- * In :
- sds_id: SDS identifier
- h5_group: hdf5 group id
- h5_dimgroup: hdf5 dimension group id
- dim_pathname: dimensional path name
-
- *-------------------------------------------------------------------------
- */
-
-int Sds_h4_to_h5(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup,int h4_attr){
-
- int32 sds_dtype;
- int32 sds_rank;
- int32 sds_dimsizes[MAX_VAR_DIMS];
- int32* sds_start;
- int32* sds_edge;
- int32* sds_stride;
- int32 count_sdsdata;
- int32 sds_ref;
- int sds_empty;
- int32 istat;
- int i,j;
- int32 num_sdsattrs;
- void* sds_data;
-
- int check_sdsname;
- int check_gloattr;
-
- char sdsname[MAX_NC_NAME];
- char sdslabel[MAX_NC_NAME];
- size_t h4size;
- size_t h4memsize;
- HDF_CHUNK_DEF c_def_out;
- hsize_t* chunk_dims;
- int32 c_flags;
-
- /* for checking compression */
-
- sp_info_block_t info_block;
- int16 special_code;
- int32 access_id;
- uint16 sd_ref;
- int gzip_level;
-
- /* define variables for hdf5. */
- hid_t h5dset;
- hid_t h5d_sid;
- hid_t h5ty_id;
- hid_t h5_memtype;
- hid_t create_plist;
- hid_t write_plist;
- hsize_t h5dims[MAX_VAR_DIMS];
- hsize_t max_h5dims[MAX_VAR_DIMS];
-#ifdef H5_WANT_H5_V1_4_COMPAT
- hsize_t bufsize;
-#else /* H5_WANT_H5_V1_4_COMPAT */
- size_t bufsize;
-#endif /* H5_WANT_H5_V1_4_COMPAT */
- char* h5csds_name;
- herr_t ret;
-
- /* define variables to handle transformation when the maximum memory
- buffer is set by users. */
-
- int NUM_HSLAB_PERD;
- int32* h4slab_start;
- int32* h4slab_stride;
- int32* h4slab_stop;
- int32* h4slab_dims;
- int32* h4slab_edges;
- hsize_t* h5slab_offset;
- hsize_t* h5slab_count;
- int h4slab_count,h4slab_index;
- int32 slabsize;
- int32 chunksize;
- int32 count_slabdata;
- hid_t slabmemspace;
-
- FILE *fp;
- int memopt;
- int sdsopt_flag = 1;
-
- memopt = 0;
- slabsize = 0;
- if((fp= fopen("parafile","r"))==NULL){/*ignore the parameter file */
- sdsopt_flag = 0;
- memopt = 0;
- chunksize = HDF4_CHUNKSIZE;
- }
-
- if(sdsopt_flag !=0) {
- fscanf(fp,"%d",&memopt);
- while(fgetc(fp)!='\n');
- fscanf(fp,"%d",&slabsize);
- while(fgetc(fp)!='\n');
- fscanf(fp,"%d",&chunksize);
- fclose(fp);
- }
-
- special_code = -1;
- /* zeroing out the memory for sdsname and sdslabel.*/
-
- h4toh5_ZeroMemory(sdsname,MAX_NC_NAME);
- h4toh5_ZeroMemory(sdslabel,MAX_NC_NAME);
-
- /* check whether the sds is empty. */
- if(SDcheckempty(sds_id,&sds_empty)== FAIL) {
- printf("error in running SDcheckempty routine. \n");
- return FAIL;
- }
-
- /*check whether the sds is created with unlimited dimension. */
-
- /*obtain name,rank,dimsizes,datatype and num of attributes of sds */
- if (SDgetinfo(sds_id,sdsname,&sds_rank,sds_dimsizes,&sds_dtype,
- &num_sdsattrs)==FAIL) {
- printf("unable to get information of sds h5dset.\n");
- return FAIL;
- }
- if(sds_empty !=0) {
- if(sds_dimsizes[0]==0) {
- if(convert_zerosdsunlimit(file_id,sds_id,h5_group,h5_dimgroup,chunksize,h4_attr)==FAIL){
- printf("cannot convert unlimited dimension SDS with 0.\n");
- return FAIL;
- }
- }
- else if(convert_sdsfillvalue(file_id,sds_id,h5_group,h5_dimgroup,h4_attr)==FAIL) {
- printf("cannot convert fill value successfully.\n");
- return FAIL;
- }
- return SUCCEED;
- }
-
- if(SDgetchunkinfo(sds_id,&c_def_out, &c_flags)== FAIL) {
- printf("error in getting chunking information. \n");
- return FAIL;
- }
-
- /* obtain start,edge, stride and number of sds data. */
-
- sds_start = malloc(sizeof(int32)*sds_rank);
- if(sds_start == NULL) {
- printf("error in allocating memory for sds start.\n");
- return FAIL;
- }
-
- sds_edge = malloc(sizeof(int32)*sds_rank);
- if(sds_edge == NULL) {
- printf("error in allocating memory for sds edge.\n");
- free(sds_start);
- return FAIL;
- }
-
- sds_stride = malloc(sizeof(int32)*sds_rank);
- if(sds_stride == NULL) {
- printf("error in allocating memory for sds stride. \n");
- free(sds_start);
- free(sds_edge);
- return FAIL;
- }
-
- count_sdsdata = 1;
- for (i=0;i<sds_rank;i++){
- sds_stride[i] = 1;
- sds_start[i] = 0;
- sds_edge[i] = sds_dimsizes[i];
- count_sdsdata = count_sdsdata*sds_dimsizes[i];
- }
-
- for (i=0;i<sds_rank;i++) {
- h5dims[i] = sds_edge[i]-sds_start[i];
- max_h5dims[i] = h5dims[i];
- }
- if(SDisrecord(sds_id)) {
- max_h5dims[0] = H5S_UNLIMITED;
- }
-
- /* convert hdf4 data type to hdf5 data type. */
- if (h4type_to_h5type(sds_dtype,&h5_memtype,&h4memsize,&h4size,
- &h5ty_id) == FAIL) {
- printf("failed to translate datatype. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- return FAIL;
- }
-
- /* check whether the datatype is string, if we find string format,
- we will change them back into integer format.*/
-
- if (h5ty_id == H5T_STRING) {
- /* rechange string datatype into numerical datatype.*/
- if(h5string_to_int(sds_dtype,&h5_memtype,h4memsize,
- &h5ty_id)== FAIL) {
- printf("error in translating H5T_STRING to int.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- return FAIL;
- }
- }
-
- /* sds_data = malloc(h4memsize*count_sdsdata);
-
- if(sds_data == NULL) {
- printf("error in allocating memory. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- return FAIL;
- }
- istat = SDreaddata(sds_id, sds_start, sds_stride, sds_edge,
- (VOIDP)sds_data);
- if (istat == FAIL) {
- printf("unable to read data from h5dset. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- return FAIL;
- }
- */
-
- /* obtaining reference number and name of h5 dataset
- corresponding to sds. */
-
- sds_ref = SDidtoref(sds_id);
- if(sds_ref == FAIL) {
- printf("error in obtaining sds reference number. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- return FAIL;
- }
-
- h5csds_name = get_name(sds_ref,2*num_sds,sds_hashtab,&check_sdsname);
- if (h5csds_name == NULL && check_sdsname == 0 ) {
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- printf("error,cannot find sds name \n");
- return FAIL;
- }
-
- if (h5csds_name == NULL && check_sdsname == -1) {
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- printf("error,sds name is not defined.\n");
- return FAIL;
- }
-
- if (h5csds_name == NULL && check_sdsname == -2) {
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- printf("error,not enough memory for allocating sds name.\n");
- return FAIL;
- }
-
- h5d_sid = H5Screate_simple(sds_rank,h5dims,max_h5dims);
-
- if (h5d_sid < 0) {
- printf("failed to create hdf5 data space converted from SDS. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- return FAIL;
- }
-
- /* create property list. */
-
- create_plist = H5Pcreate(H5P_DATASET_CREATE);
- chunk_dims = malloc(sizeof(hsize_t)*sds_rank);
-
-
- sd_ref = get_SDref(file_id,DFTAG_NDG,sds_ref);
- if(sd_ref == 0)
- sd_ref = get_SDref(file_id,DFTAG_SDG,sds_ref);
- if(sd_ref >0 )
- access_id = Hstartread(file_id,DFTAG_SD,sd_ref);
-
- if(sd_ref == 0)
- access_id = FAIL;
-
- if(access_id != FAIL) {
- istat = Hinquire(access_id,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&special_code);
- if(istat == FAIL) {
- printf("failed to inquire information \n ");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- if(special_code >0){
-
- if(HDget_special_info(access_id,&info_block)==FAIL){
- printf("fail to get special info.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- /* free(info_block.cdims);*/
- if(info_block.key == SPECIAL_COMP) {
-
- if(c_flags == HDF_NONE){
- /* 1. if the first dimension is unlimited dimension,
- we have to provide a chunking size.
- 2. the current HDF5 will not handle compression case itself,
- in order that the converted HDF5 is compressed, we have to
- provide a chunking size. currently it is set to h5dim[i].*/
-
- for(i=0;i<sds_rank;i++){
- chunk_dims[i] = (hsize_t)(h5dims[i]);
- }
- if(H5Pset_chunk(create_plist, sds_rank, chunk_dims)<0) {
- printf("failed to set up chunking information for ");
- printf("property list.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- if(H5Pset_deflate(create_plist,GZIP_COMLEVEL)<0){
- /* if(H5Pset_deflate(create_plist,2)<0){*/
- printf("fail to set compression method for HDF5 file.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- }
- }
-
- }
- else if(c_flags == HDF_NONE && SDisrecord(sds_id))
- {
- for(i=0;i<sds_rank;i++){
- chunk_dims[i] = (hsize_t)(sds_dimsizes[i]);
- }
- if(H5Pset_chunk(create_plist, sds_rank, chunk_dims)<0) {
- printf("failed to set up chunking information for ");
- printf("property list.\n");
- free(chunk_dims);
- H5Pclose(create_plist);
- return FAIL;
- }
- }
-
- }
-
- }
-
- /* HDF4 can support various compression methods including simple RLE, NBIT, Skip Huffman, gzip,Jpeg , HDF5 currently only supports gzip compression.
- By default, we will compress HDF5 dataset by using gzip compression if HDF5 file is compressed. */
-
-
- if(c_flags == HDF_CHUNK || c_flags == (HDF_CHUNK | HDF_COMP)
- || c_flags == (HDF_CHUNK | HDF_NBIT) ){
-
- if(c_def_out.comp.comp_type == COMP_CODE_RLE || c_def_out.comp.comp_type == COMP_CODE_NBIT || c_def_out.comp.comp_type == COMP_CODE_SKPHUFF || c_def_out.comp.comp_type == COMP_CODE_DEFLATE || c_def_out.comp.comp_type == COMP_CODE_JPEG) {
-
- for(i=0;i<sds_rank;i++)
- chunk_dims[i] = (hsize_t)c_def_out.chunk_lengths[i];
-
- if(H5Pset_chunk(create_plist, sds_rank, chunk_dims)<0) {
- printf("failed to set up chunking information for ");
- printf("property list.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- return FAIL;
- }
- if(c_def_out.comp.comp_type == COMP_CODE_DEFLATE)
- gzip_level = c_def_out.comp.cinfo.deflate.level;
- else gzip_level = GZIP_COMLEVEL;
- if(H5Pset_deflate(create_plist,gzip_level)<0){
- printf("fail to set compression method for HDF5 file.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- }
- }
- }
-
- if(access_id == FAIL && c_flags != HDF_CHUNK && c_flags != (HDF_CHUNK | HDF_COMP)
- && c_flags != (HDF_CHUNK | HDF_NBIT)) {
- for(i=0;i<sds_rank;i++)
- chunk_dims[i] = h5dims[i];
- if(H5Pset_chunk(create_plist, sds_rank, chunk_dims)<0) {
- printf("failed to set up chunking information for ");
- printf("property list.\n");
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- return FAIL;
- }
- }
- h5dset = H5Dcreate(h5_group,h5csds_name,h5ty_id,h5d_sid,create_plist);
-
- if (h5dset < 0) {
- printf("failed to create hdf5 dataset converted from SDS. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- if(count_sdsdata*h4memsize <= slabsize || memopt!= 1) {
-
- sds_data = malloc(h4memsize*count_sdsdata);
-
- if(sds_data == NULL) {
- printf("error in allocating memory. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- return FAIL;
- }
- istat = SDreaddata(sds_id, sds_start, sds_stride, sds_edge,
- (VOIDP)sds_data);
- if (istat == FAIL) {
- printf("unable to read data from h5dset. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- return FAIL;
- }
-
- write_plist = H5Pcreate(H5P_DATASET_XFER);
- bufsize = h4memsize;
- for(i=0;i<sds_rank;i++)
- bufsize *= h5dims[i];
- if(H5Pset_buffer(write_plist,bufsize,NULL,NULL)<0) {
- printf("fail to create data transfer property list.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- H5Pclose(write_plist);
- return FAIL;
- }
- if (H5Dwrite(h5dset,h5_memtype,h5d_sid,h5d_sid,write_plist,
- (void *)sds_data)<0) {
- printf("failed to write data into hdf5 dataset");
- printf(" converted from SDS.\n");
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- return FAIL;
- }
- free(sds_data);
- }
-
- else {
- /* obtain the number of hyperslab per dimension. */
- NUM_HSLAB_PERD= get_numslab_perD(h4memsize*count_sdsdata,slabsize,sds_rank);
-
- h4slab_start = calloc(sds_rank,sizeof(int32));
- h4slab_stride = calloc(sds_rank,sizeof(int32));
- h4slab_stop = calloc(sds_rank,sizeof(int32));
- h4slab_dims = calloc(sds_rank,sizeof(int32));
- h4slab_edges = calloc(sds_rank,sizeof(int32));
- h5slab_offset = calloc(sds_rank,sizeof(hsize_t));
- h5slab_count = calloc(sds_rank,sizeof(hsize_t));
-
- /* Initialize the hyperslab parameter. */
- for ( i =0;i<sds_rank;i++) {
- h4slab_start[i] =0;
- h4slab_stop[i] = 0;
- h4slab_stride[i] =1;
- h4slab_dims[i] = h5ceil(sds_dimsizes[i],NUM_HSLAB_PERD);
- }
-
- h4slab_count = -1;
-
- /* total number of hyperslab is equal to pow(NUM_HSLAB_PERD,sds_rank)-1,
- At first, all other dimensions are fixed, only the first dimension
- (the most frequently changing dimension) changes its starting point
- and ending point.
- After the first dimension moves to the end of its dimension,
- the second dimension starts to change. So we use "mod fuction" to check the which
- dimension we are heading to. */
-
- while(h4slab_count != pow(NUM_HSLAB_PERD,sds_rank)-1){
- h4slab_count++;
- h4slab_index = -1;
- for (i=0;i<sds_rank;i++){
- /* check the current location of the slab. */
- if((h4slab_count%pow(NUM_HSLAB_PERD,(i+1)))==0){
- h4slab_index = i;
- }
- }
- if(h4slab_index != -1 && h4slab_index != (sds_rank-1)) {
- for(j=0;j<=h4slab_index;j++){
- h4slab_start[j] =0;
- }
- h4slab_start[j] = h4slab_start[j]+h4slab_dims[j];
- }
-
- for(i=0;i<sds_rank;i++){
- h4slab_stop[i] = h4slab_start[i]+h4slab_dims[i];
- if(h4slab_stop[i]>sds_dimsizes[i])
- h4slab_stop[i] = sds_dimsizes[i];
- }
- count_slabdata = 1;
- for(i=0;i<sds_rank;i++){
- count_slabdata = count_slabdata*(h4slab_stop[i]-h4slab_start[i]);
- h4slab_edges[i] = h4slab_stop[i]-h4slab_start[i];
- }
- count_slabdata = count_slabdata*h4memsize;
- sds_data = malloc(count_slabdata);
- if(sds_data == NULL) {
- printf("error in allocating memory. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- return FAIL;
- }
- istat = SDreaddata(sds_id, h4slab_start, h4slab_stride, h4slab_edges,
- (VOIDP)sds_data);
- if (istat == FAIL) {
- printf("unable to read SDS data. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- return FAIL;
- }
- write_plist = H5Pcreate(H5P_DATASET_XFER);
- /* bufsize = h4memsize;
- for(i=0;i<sds_rank;i++)
- bufsize *= h5dims[i];*/
- bufsize = slabsize;
- if(H5Pset_buffer(write_plist,bufsize,NULL,NULL)<0) {
- printf("fail to create data transfer property list.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- H5Pclose(write_plist);
- return FAIL;
- }
-
- for (i=0;i<sds_rank;i++) {
- h5slab_offset[i] = (hsize_t)(h4slab_start[i]);
- h5slab_count[i] =(hsize_t)(h4slab_stop[i]-h4slab_start[i]);
- }
-
- slabmemspace = H5Screate_simple(sds_rank,h5slab_count,NULL);
- H5Sselect_hyperslab(h5d_sid,H5S_SELECT_SET,h5slab_offset,NULL,h5slab_count,NULL);
- if (H5Dwrite(h5dset,h5_memtype,slabmemspace,h5d_sid,write_plist,
- (void *)sds_data)<0) {
- printf("failed to write data into hdf5 dataset");
- printf(" converted from SDS.\n");
- H5Sclose(h5d_sid);
-
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- return FAIL;
- }
- free(sds_data);
-
- h4slab_start[0] = h4slab_start[0]+h4slab_dims[0];
- }
-
- free(h4slab_start);
- free(h4slab_stop);
- free(h4slab_dims);
- free(h4slab_edges);
- free(h5slab_offset);
- free(h5slab_count);
- }
- /* convert sds annotation into attribute of sds dataset.
- Since there is no routines to find the exact tag of sds object,
- we will check three possible object tags of sds objects, that is:
- DFTAG_SD,DFTAG_SDG,DFTAG_NDG. If the object tag of sds object is
- falling out of this scope, we will not convert annotations into
- hdf5 attributes; it is user's responsibility to make sure object tags
- for sds objects are only one of the above three tags.*/
-
- if(Annoobj_h4_to_h5(file_id,sds_ref,DFTAG_SD,h5dset)== FAIL){
- printf("failed to convert sds annotation into hdf5 attribute.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- if(Annoobj_h4_to_h5(file_id,sds_ref,DFTAG_SDG,h5dset)== FAIL){
- printf("failed to convert sds annotation into hdf5 attribute.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- if(Annoobj_h4_to_h5(file_id,sds_ref,DFTAG_NDG,h5dset)== FAIL){
- printf("failed to convert sds annotation into hdf5 attribute.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- /* convert sds dimensional scale dataset into hdf5 dataset. */
- if(sdsdim_to_h5dataset(sds_id,sds_rank,h5dset,h5_dimgroup,sds_dimsizes[0]) == FAIL) {
- printf("failed to convert dimensional scale to hdf5 dataset. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- return FAIL;
- }
- check_gloattr = 0;
- if (sds_transattrs(sds_id,h5dset,num_sdsattrs,check_gloattr)==FAIL) {
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- printf(" Error in obtaining sds attributes. \n");
- return FAIL;
- }
-
- /********************************************/
- /* handle extra attributes of sds : sds label, object type
- and reference num */
-
- if(h4_attr !=0) {
- strcpy(sdslabel,SDSLABEL);
-
- if(h4_transpredattrs(h5dset,HDF4_OBJECT_TYPE,sdslabel)==FAIL) {
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- printf("unable to transfer sds label to HDF4 OBJECT TYPE.\n");
- return FAIL;
- }
-
- if(sdsname[0] != '\0') {
- if(h4_transpredattrs(h5dset,HDF4_OBJECT_NAME,sdsname)==FAIL){
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- printf("unable to transfer sds name to HDF5 dataset attribute.\n");
- return FAIL;
- }
- }
-
- if(h4_transnumattr(h5dset,HDF4_REF_NUM,sds_ref)==FAIL){
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- printf("unable to transfer sds ref. to HDF5 dataset attribute.\n");
- return FAIL;
- }
- }
- istat = SDendaccess(sds_id);
- ret = H5Pclose(create_plist);
- ret = H5Sclose(h5d_sid);
- ret = H5Dclose(h5dset);
- /* free(sds_data);*/
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(chunk_dims);
-
- return SUCCEED;
-}
-
-/*-------------------------------------------------------------------------
- * Function: sds_transattrs
- *
- * Purpose: translate attribute of HDF4 SDS object into
- hdf5 dataset attribute
- *
- * Return: FAIL if failed, SUCCEED if successful.
- *
- * In :
- ssds_id: SDS identifier
- sh5_dset: hdf5 dataset
- snum_sdsattrs: number of sds attribute
- check_gloflag: a flag that check whether the attribute is
- a file attribute or a sds id or a dimensional scale id.
-
- *-------------------------------------------------------------------------
- */
-
-int sds_transattrs(int32 ssds_id, hid_t sh5_dset,int snum_sdsattrs,
- int check_gloflag) {
-
- char ssdsatrr_name[2*MAX_NC_NAME];
- char sdsglo[MAX_NC_NAME];
- char* sdsrepattr_name;
- int32 count_ssdsadata;
- int32 ssds_atype;
- size_t sh4_amemsize;
- size_t sh4_asize;
- hid_t sh5a_sid;
- hid_t sh5a_id;
- hid_t sh5_atype;
- hid_t sh5_amemtype;
- hid_t sh5str_type;
- hid_t sh5str_memtype;
- hsize_t sh5dims[MAX_VAR_DIMS];
- void* ssds_adata;
- herr_t sret;
- int i;
-
- for (i = 0;i < snum_sdsattrs; i++) {
-
- if (SDattrinfo(ssds_id,i,ssdsatrr_name,&ssds_atype,
- &count_ssdsadata)==FAIL){
- printf("unable to obtain SDS attribute information. \n");
- return FAIL;
- }
-
- /* make a table for the attribute type, to do the corresponding type. */
-
- if(h4type_to_h5type(ssds_atype,&sh5_amemtype,&sh4_amemsize,
- &sh4_asize,&sh5_atype)== FAIL) {
- printf("fail to translate sds attribute data type from H4 to H5. \n");
- return FAIL;
- }
-
- ssds_adata = malloc(sh4_amemsize * count_ssdsadata);
- if(ssds_adata == NULL) {
- printf("error, cannot allocate memory for sds attribute data. \n");
- return FAIL;
- }
-
- if(SDreadattr(ssds_id,i,(VOIDP)ssds_adata)== FAIL) {
- printf("error in reading attributes of sds object. \n");
- free(ssds_adata);
- return FAIL;
- }
-
- /* if attribute doesn't have name, a default name is set. */
- if(ssdsatrr_name[0] == '\0') {
- sdsrepattr_name = trans_obj_name(DFTAG_NDG,i);
- strcpy(ssdsatrr_name,sdsrepattr_name);
- free(sdsrepattr_name);
- }
-
- /* if the sds attribute is a file attribute. */
- if(check_gloflag == 1){
- strcpy(sdsglo,GLOSDS);
- strcat(ssdsatrr_name,"_");
- strcat(ssdsatrr_name,sdsglo);
- }
-
- /* now do attribute-transferring.
- 1. deal with string data type
- 2. set attribute space.
- 3. get attribute name, set property list. */
-
- if (sh5_atype == H5T_STRING) {
-
- sh5a_sid = H5Screate(H5S_SCALAR);
-
- if (sh5a_sid < 0) {
- printf("failed to create attribute space for");
- printf(" HDF4_OBJECT_TYPE SDS. \n");
- free(ssds_adata);
- return FAIL;
- }
-
- if ((sh5str_type = mkstr(count_ssdsadata,
- H5T_STR_SPACEPAD))<0) {
- printf("error in making string. \n");
- H5Sclose(sh5a_sid);
- free(ssds_adata);
- return FAIL;
- }
-
- /* check this line later. */
- if ((sh5str_memtype = mkstr(count_ssdsadata*sh4_amemsize,
- H5T_STR_SPACEPAD))<0) {
- printf("error in making memory string. \n");
- H5Sclose(sh5a_sid);
- free(ssds_adata);
- return FAIL;
- }
-
- sh5a_id = H5Acreate(sh5_dset,ssdsatrr_name,sh5str_type,
- sh5a_sid,H5P_DEFAULT);
-
- if (sh5a_id <0) {
- printf("failed to obtain attribute id for");
- printf(" HDF4_OBJECT_TYPE SDS. \n");
- H5Sclose(sh5a_sid);
- free(ssds_adata);
- return FAIL;
- }
-
- sret = H5Awrite(sh5a_id,sh5str_memtype,(void *)ssds_adata);
-
- if (sret <0) {
- printf("failed to write attribute data for");
- printf(" HDF4_OBJECT_TYPE SDS. \n");
- H5Sclose(sh5a_sid);
- H5Aclose(sh5a_id);
- free(ssds_adata);
- return FAIL;
- }
-
- sret = H5Sclose(sh5a_sid);
- sret = H5Aclose(sh5a_id);
- }
-
- else {
-
- if(count_ssdsadata == 1) {
-
- sh5a_sid = H5Screate(H5S_SCALAR);
- if (sh5a_sid < 0) {
- printf("failed to create space id. \n");
- free(ssds_adata);
- return FAIL;
- }
- }
- else {
- sh5dims[0] = count_ssdsadata;
- sh5a_sid = H5Screate_simple(1,sh5dims,NULL);
-
- if (sh5a_sid < 0) {
- printf("failed to create attribute space. \n");
- free(ssds_adata);
- return FAIL;
- }
- }
- sh5a_id = H5Acreate(sh5_dset,ssdsatrr_name,sh5_atype,
- sh5a_sid,H5P_DEFAULT);
-
- if(sh5a_id <0) {
- printf("failed to obtain attribute id. \n");
- H5Sclose(sh5a_sid);
- free(ssds_adata);
- return FAIL;
- }
-
- sret = H5Awrite(sh5a_id,sh5_amemtype,(void *)ssds_adata);
-
- if(sret <0) {
- printf("failed to write attribute data.\n ");
- H5Sclose(sh5a_sid);
- H5Aclose(sh5a_id);
- free(ssds_adata);
- return FAIL;
- }
- sret = H5Sclose(sh5a_sid);
- sret = H5Aclose(sh5a_id);
- }
- free(ssds_adata);
- }
- return SUCCEED;
-}
-/****************sdsdim_to_h5dataset*******************
-
- * Purpose: translate dimensional scale dataset into
- hdf5 dataset
- *
- * Return: FAIL if failed, SUCCEED if successful.
- *
- * In :
- sds_id: SDS identifier
- sds_rank: number of sds dimensions
- Out:
- Modification:
-
- *-------------------------------------------------------------------------
- */
-
-int sdsdim_to_h5dataset(int32 sds_id,int32 sds_rank,hid_t sh5dset,
- hid_t sh5_dimgroup,int32 firstdimsize) {
-
- int32 sdsdim_id;
- int32 sdsdim_type = 0;
- int32 sds_dimscasize[1];
- int32 istat;
- int i,k;
- int count_h5objref;/* this counter updates the number of h5 object reference. */
- int count_h5attrname;/*this counter updates the number of h5 dimensional name attribute.*/
-
- int check_gloattr;
- int32 num_sdsdimattrs;
- int check_sdsdim;
- void* dim_scadata;
-
- char sdsdim_name[MAX_NC_NAME+1];
- char* cor_sdsdimname;
- size_t h4dim_memsize;
- size_t h4dim_size;
-
- HDF_CHUNK_DEF c_def_out;
- int32 c_flags;
- int32* sdsdimempty;
-
- /* define varibles for hdf5. */
-
- hid_t h5dim_dset;
- hid_t h5dim_sid;
-
- hid_t h5dim_tid;
- hid_t h5dim_memtype;
-hid_t h5dim_nameaid;
- hid_t h5dim_namesid;
-
- hid_t h5str_dimntype;
-
- hid_t attr_refSpace;
- hid_t attr_refType;
- hid_t attribID;
- hid_t create_plist;
-
- int dim_index;
- hsize_t h5dimscas[1];
- hsize_t max_h5dimscas[1];
- hsize_t h5dim_dims[1];
- hsize_t h5dimname_dims[1];
- hsize_t attr_refDims[1];
- hsize_t h5dim_chunkdim[1];
- hobj_ref_t dim_refdat;
-
- hobj_ref_t* alldim_refdat;
-
- char* h5sdsdim_name;
- /* char *h5sdsdim_allname[MAX_VAR_DIMS];
- char *h5newsdsdim_name; */
-
- char h5sdsdim_allname[MAX_VAR_DIMS*MAX_DIM_NAME];
- char h5newsdsdim_name[MAX_DIM_NAME];
- char h5dimpath_name[MAX_DIM_NAME];
- herr_t ret;
-
- sdsdimempty = malloc(sds_rank *sizeof(int32));
-
- for(i=0;i<sds_rank;i++)
- sdsdimempty[i] = 0;
-
- /*zero out memory for h5sdsdim_allname and h5dimpath_name */
-
- /*** the following line should be erased for variable length HDF5 string.**/
- h4toh5_ZeroMemory(h5sdsdim_allname,(MAX_VAR_DIMS*MAX_DIM_NAME)*sizeof(char));
- h4toh5_ZeroMemory(h5dimpath_name,MAX_DIM_NAME*sizeof(char));
-
- /*check whether the sds is created with unlimited dimension. */
-
- if(firstdimsize !=0) {
- if(SDgetchunkinfo(sds_id,&c_def_out, &c_flags)== FAIL) {
- printf("error in getting chunking information. \n");
- return FAIL;
- }
- }
-
- /* initialize the dimensional number of sds dimensions, h5dim_dims
- is used for grabbing hdf5 dimensional name list and object reference
- list. */
- h5dim_dims[0] = (hsize_t)sds_rank;
- count_h5objref = 0;
- count_h5attrname = 0;
-
- for (i = 0; i<sds_rank;i++) {
- sdsdim_id = SDgetdimid(sds_id,i);
-
- if(sdsdim_id == FAIL) {
- printf("error in obtaining sds dimension id. \n");
- return FAIL;
- }
-
- istat = SDdiminfo(sdsdim_id,sdsdim_name,sds_dimscasize,
- &sdsdim_type,&num_sdsdimattrs);
-
- if (istat == FAIL) {
- printf("sds get dim. information failed. \n");
- SDendaccess(sdsdim_id);
- return FAIL;
- }
-
- /* Here we have very messy cases for dimensional scale when
- sdsdim_type is 0(or not set).
- When sdsdim_type is 0, it means no SDS dimensional scale
- data for this dimensions. However, users may define SDS dimensional
- scale name. We want to keep this information.
- If user doesn't specific the name we will skip this dimension */
-
- if(sdsdim_type == 0) {
- if(strncmp(sdsdim_name,fakeDim,strlen(fakeDim))==0){
- SDendaccess(sdsdim_id);
- continue;
- }
- }
- /* for unlimited SDS dimension, grab the current dimensional size. */
- if(sds_dimscasize[0] == 0) sds_dimscasize[0] = firstdimsize;
-
- /* check whether this dimensional scale dataset is looked up. */
- check_sdsdim = lookup_name(sdsdim_name,DIM_HASHSIZE,dim_hashtab);
-
- strcpy(h5dimpath_name,HDF4_DIMG);
-
- /* checking whether sds dimension scale name contains ORI_SLASH, changing into CHA_SLASH.*/
-
- cor_sdsdimname = correct_name(sdsdim_name);
- if(cor_sdsdimname == NULL) {
- printf("error in generating corrected sds dimensional scale name.\n");
- SDendaccess(sdsdim_id);
- return FAIL;
- }
-
- /* generating hdf5 dimensional scale name. */
- h5sdsdim_name = get_obj_aboname(cor_sdsdimname,NULL,h5dimpath_name,NULL);
- if (h5sdsdim_name == NULL) {
- printf("error in getting hdf5 sds dimension name.\n");
- SDendaccess(sdsdim_id);
- free(cor_sdsdimname);
- return FAIL;
- }
- free(cor_sdsdimname);
-
- strncpy(&h5sdsdim_allname[count_h5attrname*MAX_DIM_NAME],h5sdsdim_name,MAX_DIM_NAME);
-
-
- /*h5sdsdim_allname[count_h5attrname]=HDstrdup(h5sdsdim_name);
- should be added for variable length HDF5 string. 6/11/2001. */
-
- /* here we should add some comments for fakedim0--name. It seems that
- hdf4(netcdf) will use unique fake dimension name, fakedim + unique
- number, so check_sdsdim will never be 1 if the dimension name is fake
- name. Under this case, count_h5objref and count_h5attrname
- will not increase if this dimension doesnot
- have dimensional scale data. That assures the object reference of sds is
- correct. */
-
- /*if this dimension is not touched, get name of the dimensional scale data. */
- if (check_sdsdim == 1){/* the dimension is touched, skip this one.*/
- free(h5sdsdim_name);
- SDendaccess(sdsdim_id);
- /* here we have to check a special case when the dimension type is 0.
- We should ignore counting object reference.*/
- if(sdsdim_type == 0) {
- count_h5attrname++;
- continue;
- }
- count_h5objref = count_h5objref + 1;
- count_h5attrname = count_h5attrname + 1;
- continue;
- }
-
- if (check_sdsdim != 0) {
- printf("error in checking sds dimensions.\n");
- SDendaccess(sdsdim_id);
- free(h5sdsdim_name);
- return FAIL;
- }
-
- /* here we want to keep the dimensional scale name without
- making the object reference. */
- if(sdsdim_type == 0) {
-
- count_h5attrname = count_h5attrname + 1;
- sdsdimempty[i] = 1;
- continue;
- }
- /* get h5 dimensional scale data type. */
- if(h4type_to_h5type(sdsdim_type,&h5dim_memtype,&h4dim_memsize,
- &h4dim_size,&h5dim_tid)== FAIL) {
- printf("error in transferring sds dimension data type.\n");
- SDendaccess(sdsdim_id);
- free(h5sdsdim_name);
- return FAIL;
- }
-
- /* dimensional scale dataset cannot be H5T_STRING data type.
- So transferring back to int8 */
-
- if (h5dim_tid == H5T_STRING) {
- if(h5string_to_int(sdsdim_type,&h5dim_memtype,h4dim_memsize,
- &h5dim_tid)==FAIL){
- printf("error in translating from string to int. \n");
- SDendaccess(sdsdim_id);
- free(h5sdsdim_name);
- return FAIL;
- }
- }
-
- /* get the dimensional scale data. */
- dim_scadata = malloc(h4dim_memsize*sds_dimscasize[0]);
- istat = SDgetdimscale(sdsdim_id,(VOIDP)dim_scadata);
-
- if (istat == FAIL) {
- printf("sds get dim. scale failed. \n");
- SDendaccess(sdsdim_id);
- free(h5sdsdim_name);
- free(dim_scadata);
- return FAIL;
- }
-
- /* set dimensional scale size properly. */
- h5dimscas[0] = sds_dimscasize[0];
-
-
- /* only set for the first dimension if SDS is unlimited dimension. */
- if(SDisrecord(sds_id) && i == 0)
- max_h5dimscas[0] = H5S_UNLIMITED;
- else
- max_h5dimscas[0] = h5dimscas[0];
-
- h5dim_sid = H5Screate_simple(1,h5dimscas,max_h5dimscas);
-
- if(h5dim_sid <0) {
- printf("error in creating space. \n");
- SDendaccess(sdsdim_id);
- free(h5sdsdim_name);
- free(dim_scadata);
- return FAIL;
- }
-
- /* create property list, for chunked sds or unlimited dimension cases */
-
- create_plist = H5Pcreate(H5P_DATASET_CREATE);
-
- if(create_plist == -1) {
- printf("failed to create property list. \n");
- SDendaccess(sdsdim_id);
- free(h5sdsdim_name);
- free(dim_scadata);
- H5Sclose(h5dim_sid);
- }
-
-
- if(c_flags == HDF_NONE && SDisrecord(sds_id) && i == 0)
- {
- h5dim_chunkdim[0] = (hsize_t)(h5dimscas[0]/2);
-
- if(H5Pset_chunk(create_plist,1, h5dim_chunkdim)<0) {
- printf("failed to set up chunking information for ");
- printf("dimensional scale property list.\n");
- SDendaccess(sdsdim_id);
- free(h5sdsdim_name);
- free(dim_scadata);
- H5Sclose(h5dim_sid);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- }
-
- if(c_flags == HDF_CHUNK || c_flags == (HDF_CHUNK | HDF_COMP)
- || c_flags == (HDF_CHUNK | HDF_NBIT) ){
-
- h5dim_chunkdim[0] = (hsize_t)c_def_out.chunk_lengths[0];
-
- if(H5Pset_chunk(create_plist,1, h5dim_chunkdim)<0) {
- printf("failed to set up chunking information for ");
- printf("property list.\n");
- SDendaccess(sdsdim_id);
- free(h5sdsdim_name);
- free(dim_scadata);
- H5Sclose(h5dim_sid);
- H5Pclose(create_plist);
- return FAIL;
- }
- }
-
- /* create h5 dataset under group HDF4_DIMG*/
- h5dim_dset = H5Dcreate(sh5_dimgroup,h5sdsdim_name,h5dim_tid,
- h5dim_sid,create_plist);
-
- if(h5dim_dset <0) {
- printf("error in creating dataset. \n");
- free(h5sdsdim_name);
- free(dim_scadata);
- SDendaccess(sdsdim_id);
- H5Sclose(h5dim_sid);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- if (H5Dwrite(h5dim_dset,h5dim_memtype,h5dim_sid,h5dim_sid,
- H5P_DEFAULT,(void *)dim_scadata)<0) {
- printf("error writing dimensional scale data\n");
- free(h5sdsdim_name);
- free(dim_scadata);
- SDendaccess(sdsdim_id);
- H5Sclose(h5dim_sid);
- H5Pclose(create_plist);
- H5Dclose(h5dim_dset);
- return FAIL;
- }
-
- check_gloattr = 0;
- if(sds_transattrs(sdsdim_id,h5dim_dset,num_sdsdimattrs,check_gloattr)
- == FAIL){
- printf("error in transferring attributes. \n");
- free(h5sdsdim_name);
- free(dim_scadata);
- SDendaccess(sdsdim_id);
- H5Sclose(h5dim_sid);
- H5Dclose(h5dim_dset);
- H5Pclose(create_plist);
- return FAIL;
- }
- SDendaccess(sdsdim_id);
- free(dim_scadata);
- free(h5sdsdim_name);
- ret = H5Sclose(h5dim_sid);
- ret = H5Dclose(h5dim_dset);
- ret = H5Pclose(create_plist);
- count_h5objref = count_h5objref + 1;
- count_h5attrname =count_h5attrname + 1;
- }
-
- /*1. create object reference number to dimensional scale dataset.
- 2. store absolute name of dimensional name into
- dimensional list. */
-
- if ( count_h5objref != 0) {
-
- h5dim_dims[0] = count_h5objref;
-
- attr_refDims[0] = count_h5objref;
- attr_refSpace = H5Screate_simple(1,attr_refDims,NULL);
- attr_refType = H5Tcopy(H5T_STD_REF_OBJ);
- alldim_refdat = calloc((size_t)count_h5objref,sizeof(hobj_ref_t));
-
- if(alldim_refdat == NULL) {
- printf("error in allocating memory. \n");
- H5Sclose(attr_refSpace);
- H5Tclose(attr_refType);
- return FAIL;
- }
- k =0;
-
- for(i=0;i<count_h5objref;i++){
- if(sdsdimempty[i])
- k = k +1;
- h4toh5_ZeroMemory(h5newsdsdim_name,MAX_DIM_NAME);
- strcpy(h5newsdsdim_name,&h5sdsdim_allname[k*MAX_DIM_NAME]);
-
- /*h5newsdsdim_name = HDstrdup(h5sdsdim_allname[k]);
- for variable length HDF5 string. 6/11/2001; Kent*/
-
- ret = H5Rcreate(&dim_refdat,sh5_dimgroup,h5newsdsdim_name,
- H5R_OBJECT,-1);
- if(ret <0) {
- free(alldim_refdat);
- H5Sclose(attr_refSpace);
- H5Tclose(attr_refType);
- printf("error in generating H5 reference. \n");
- return FAIL;
- }
- alldim_refdat[i] = dim_refdat;
- k = k +1;
-
- /*free(h5newsdsdim_name); for variable length HDF5 string 6/11/2001.*/
- }
-
- attribID = H5Acreate(sh5dset,DIMSCALE,attr_refType,attr_refSpace,
- H5P_DEFAULT);
- if(attribID < 0) {
- free(alldim_refdat);
- H5Sclose(attr_refSpace);
- H5Tclose(attr_refType);
- H5Aclose(attribID);
- printf("error in generating H5 attribute ID. \n");
- return FAIL;
- }
-
- ret = H5Awrite(attribID,attr_refType,(void *)alldim_refdat);
-
- H5Sclose(attr_refSpace);
- H5Tclose(attr_refType);
- H5Aclose(attribID);
- free(alldim_refdat);
- }
-
- if(count_h5attrname!= 0) {
-
- h5dimname_dims[0] = count_h5attrname;
-
- h5dim_namesid = H5Screate_simple(1,h5dimname_dims,NULL);
-
- if(h5dim_namesid <0) {
- printf("error in creating sds dimensionlist space.\n");
- return FAIL;
- }
-
- /*h5str_dimntype = mkstr(MAX_DIM_NAME,H5T_STR_SPACEPAD); */
-
- h5str_dimntype = mkstr(MAX_DIM_NAME,H5T_STR_NULLTERM);
- if(h5str_dimntype < 0) {
- H5Sclose(h5dim_namesid);
- printf("error in generating H5T_STRING type.\n");
- return FAIL;
- }
-
- /*using variable length, h5dump and h5view do not
- support this, this will be supported later.
- h5str_dimntype = H5Tcopy(H5T_C_S1);
- ret = H5Tset_size(h5str_dimntype,H5T_VARIABLE);
- 6/11/2001, Kent Yang
- */
- h5dim_nameaid = H5Acreate(sh5dset,HDF4_DIMENSION_LIST,h5str_dimntype,
- h5dim_namesid,H5P_DEFAULT);
-
- if(h5dim_nameaid <0) {
- H5Sclose(h5dim_namesid);
- printf("error in creating sds dimensionlist id.\n");
- return FAIL;
- }
-
- ret = H5Awrite(h5dim_nameaid,h5str_dimntype,h5sdsdim_allname);
-
- if(ret < 0) {
- H5Sclose(h5dim_namesid);
- H5Aclose(h5dim_nameaid);
- printf("error in writing sds dimensionlist. \n");
- return FAIL;
- }
-
-
- ret = H5Sclose(h5dim_namesid);
- ret = H5Aclose(h5dim_nameaid);
-
- /*used for variable length HDF5 string.
- for(dim_index = 0; dim_index <count_h5attrname;dim_index++)
- free(h5sdsdim_allname[dim_index]);
- 6/11/2001, kent
- since variable length has not been supported in h5dump yet and
- that will cause testing failed so we use NULL TERM instead.
- 8/9/2001 kent */
- }
- free(sdsdimempty);
- return SUCCEED;
-}
-
-int convert_sdsfillvalue(int32 file_id,int32 sds_id,hid_t h5_group,hid_t h5_dimgroup,int h4_attr){
-
-
- int32 sds_dtype;
- int32 sds_rank;
- int32 sds_dimsizes[MAX_VAR_DIMS];
- int32* sds_start;
- int32* sds_edge;
- int32* sds_stride;
- int32 count_sdsdata;
- int32 sds_ref;
- int32 istat;
- int i;
- int32 num_sdsattrs;
- void* fill_value;
-
- int check_sdsname;
- int check_gloattr;
-
- char sdsname[MAX_NC_NAME];
- char sdslabel[MAX_NC_NAME];
- size_t h4size;
- size_t h4memsize;
- HDF_CHUNK_DEF c_def_out;
- hsize_t* chunk_dims;
- int32 c_flags;
-
- /* define varibles for hdf5. */
-
- hid_t h5dset;
- hid_t h5d_sid;
- hid_t h5ty_id;
- hid_t h5_memtype;
- hid_t create_plist;
- hid_t write_plist;
- hsize_t h5dims[MAX_VAR_DIMS];
- hsize_t max_h5dims[MAX_VAR_DIMS];
-#ifdef H5_WANT_H5_V1_4_COMPAT
- hsize_t bufsize;
-#else /* H5_WANT_H5_V1_4_COMPAT */
- size_t bufsize;
-#endif /* H5_WANT_H5_V1_4_COMPAT */
- char* h5csds_name;
-
- if (SDgetinfo(sds_id,sdsname,&sds_rank,sds_dimsizes,&sds_dtype,
- &num_sdsattrs)==FAIL) {
- printf("unable to get information of sds h5dset.\n");
- return FAIL;
- }
-
- /* obtain start,edge, stride and number of sds data. */
-
- sds_start = malloc(sizeof(int32)*sds_rank);
- if(sds_start == NULL) {
- printf("error in allocating memory for sds start.\n");
- return FAIL;
- }
-
- sds_edge = malloc(sizeof(int32)*sds_rank);
- if(sds_edge == NULL) {
- printf("error in allocating memory for sds edge.\n");
- free(sds_start);
- return FAIL;
- }
-
- sds_stride = malloc(sizeof(int32)*sds_rank);
- if(sds_stride == NULL) {
- printf("error in allocating memory for sds stride. \n");
- free(sds_start);
- free(sds_edge);
- return FAIL;
- }
-
- count_sdsdata = 1;
- for (i=0;i<sds_rank;i++){
- sds_stride[i] = 1;
- sds_start[i] = 0;
- sds_edge[i] = sds_dimsizes[i];
- count_sdsdata = count_sdsdata*sds_dimsizes[i];
-
- }
- for (i=0;i<sds_rank;i++) {
- h5dims[i] = sds_edge[i]-sds_start[i];
- max_h5dims[i] = h5dims[i];
- }
-
- if(SDisrecord(sds_id)) {
- max_h5dims[0] = H5S_UNLIMITED;
- }
- /* convert hdf4 data type to hdf5 data type. */
- if (h4type_to_h5type(sds_dtype,&h5_memtype,&h4memsize,&h4size,
- &h5ty_id) == FAIL) {
- printf("failed to translate datatype. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- return FAIL;
- }
-
- /* check whether the datatype is string, if we find string format,
- we will change them back into integer format.*/
-
- if (h5ty_id == H5T_STRING) {
- /* rechange string datatype into numerical datatype.*/
- if(h5string_to_int(sds_dtype,&h5_memtype,h4memsize,
- &h5ty_id)== FAIL) {
- printf("error in translating H5T_STRING to int.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- return FAIL;
- }
- }
- /* Since we know this SDS dataset fills with fill value, so currently
- we will comment this out. */
- /*
- sds_data = malloc(h4memsize*count_sdsdata);
- if(sds_data == NULL) {
- printf("error in allocating memory. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- return FAIL;
- }
-
- istat = SDreaddata(sds_id, sds_start, sds_stride, sds_edge,
- (VOIDP)sds_data);
- if (istat == FAIL) {
- printf("unable to read data from h5dset. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(sds_data);
- return FAIL;
- }
-
- */
-
- fill_value = malloc(h4memsize);
- h4toh5_ZeroMemory(fill_value,h4memsize*sizeof(char));
- if(num_sdsattrs != 0)
- if(SDgetfillvalue(sds_id,fill_value)==FAIL)
- printf("unable to get fill value, fill value will be set to zero \n");
-
-
- sds_ref = SDidtoref(sds_id);
- if(sds_ref == FAIL) {
- printf("error in obtaining sds reference number. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- return FAIL;
- }
-
- h5csds_name = get_name(sds_ref,2*num_sds,sds_hashtab,&check_sdsname);
- if (h5csds_name == NULL && check_sdsname == 0 ) {
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
-
- printf("error,cannot find sds name \n");
- return FAIL;
- }
-
- if (h5csds_name == NULL && check_sdsname == -1) {
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
-
- printf("error,sds name is not defined.\n");
- return FAIL;
- }
-
- if (h5csds_name == NULL && check_sdsname == -2) {
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
-
- printf("error,not enough memory for allocating sds name.\n");
- return FAIL;
- }
-
- h5d_sid = H5Screate_simple(sds_rank,h5dims,max_h5dims);
-
- if (h5d_sid < 0) {
- printf("failed to create hdf5 data space converted from SDS. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
-
- return FAIL;
- }
-
- /* set creation property list. */
-
- create_plist = H5Pcreate(H5P_DATASET_CREATE);
- if(create_plist <0) {
- printf("failed to create hdf5 creation list.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
-
- return FAIL;
- }
- chunk_dims = malloc(sizeof(hsize_t)*sds_rank);
-
- if(chunk_dims == NULL) {
- H5Pclose(create_plist);
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- printf("unable to allocate memory for chunk_dims\n");
- return FAIL;
- }
- if(SDisrecord(sds_id)){
- for(i=0;i<sds_rank;i++){
- chunk_dims[i] = (hsize_t)(sds_dimsizes[i]/2);
- }
- if(H5Pset_chunk(create_plist, sds_rank, chunk_dims)<0) {
- printf("cannot set chunking size properly.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(chunk_dims);
- H5Pclose(create_plist);
- return FAIL;
- }
- }
-
- if(H5Pset_fill_value(create_plist,h5ty_id,fill_value)<0){
- printf("failed to set property list fill value.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- h5dset = H5Dcreate(h5_group,h5csds_name,h5ty_id,h5d_sid,create_plist);
-
- if (h5dset < 0) {
- printf("failed to create hdf5 dataset converted from SDS. \n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- return FAIL;
- }
- /* Before HDF5 library make the optimzation of dealing with fill value
- data, leave this alone. */
- /* write_plist = H5Pcreate(H5P_DATASET_XFER);
- bufsize = h4memsize;
- for(i=1;i<sds_rank;i++)
- bufsize *= h5dims[i];
-
- if(H5Pset_buffer(write_plist,bufsize,NULL,NULL)<0) {
- printf("fail to create data transfer property list.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- H5Pclose(write_plist);
- return FAIL;
- }
-
- if (H5Dwrite(h5dset,h5_memtype,h5d_sid,h5d_sid,write_plist,
- (void *)sds_data)<0) {
- printf("failed to write data into hdf5 dataset");
- printf(" converted from SDS.\n");
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- H5Pclose(write_plist);
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(chunk_dims);
- return FAIL;
- }
-
- */
- /* convert sds annotation into attribute of sds dataset.
- Since there is no routines to find the exact tag of sds object,
- we will check three possible object tags of sds objects, that is:
- DFTAG_SD,DFTAG_SDG,DFTAG_NDG. If the object tag of sds object is
- falling out of this scope, we will not convert annotations into
- hdf5 attributes; it is user's responsibility to make sure object tags
- for sds objects are only one of the above three tags.*/
-
- if(Annoobj_h4_to_h5(file_id,sds_ref,DFTAG_SD,h5dset)== FAIL){
- printf("failed to convert sds annotation into hdf5 attribute.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- if(Annoobj_h4_to_h5(file_id,sds_ref,DFTAG_SDG,h5dset)== FAIL){
- printf("failed to convert sds annotation into hdf5 attribute.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- if(Annoobj_h4_to_h5(file_id,sds_ref,DFTAG_NDG,h5dset)== FAIL){
- printf("failed to convert sds annotation into hdf5 attribute.\n");
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- check_gloattr = 0;
-
-
- if (sds_transattrs(sds_id,h5dset,num_sdsattrs,check_gloattr)==FAIL) {
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- printf(" Error in obtaining sds attributes. \n");
- return FAIL;
- }
-
- /********************************************/
- /* handle extra attributes of sds : sds label, object type
- and reference num */
-
- if(h4_attr !=0) {
- strcpy(sdslabel,SDSLABEL);
-
- if(h4_transpredattrs(h5dset,HDF4_OBJECT_TYPE,sdslabel)==FAIL) {
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
-
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- printf("unable to transfer sds label to HDF4 OBJECT TYPE.\n");
- return FAIL;
- }
-
- if(sdsname[0] != '\0') {
- if(h4_transpredattrs(h5dset,HDF4_OBJECT_NAME,sdsname)==FAIL){
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
-
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- printf("unable to transfer sds name to HDF5 dataset attribute.\n");
- return FAIL;
- }
- }
-
- if(h4_transnumattr(h5dset,HDF4_REF_NUM,sds_ref)==FAIL){
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
-
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- printf("unable to transfer sds ref. to HDF5 dataset attribute.\n");
- return FAIL;
- }
- }
- free(sds_start);
- free(sds_edge);
- free(sds_stride);
- free(chunk_dims);
- free(fill_value);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
-/* H5Pclose(write_plist); */
- return SUCCEED;
-}
-
-
-uint16 get_SDref(int32 file_id,uint16 tag,int32 sds_ref){
-
- DFdi di;
- int32 found,GroupID;
- int sd_ref = 0;
-
-
- if((GroupID = DFdiread(file_id,tag,(uint16)sds_ref))<0){
- /* for some cases, although sd_ref cannot be found, the current
- SDS object is still legal(unlimited dimension with the current
- size set to 0. so comment this the following warning printfs out. */
- /* printf("cannot find sd_ref\n");*/
- return sd_ref;
- }
-
- found = 0;
- di.tag = DFTAG_NULL;
- di.ref = 0;
- while((found == 0) &&(DFdiget(GroupID,&di.tag,&di.ref)==0)){
- if(di.tag == DFTAG_SD)
- found = 1;
- }
-
- sd_ref = di.ref;
- if(!found) ;
- /* printf("cannot find sd_ref\n");*/
-
- DFdifree(GroupID);
- return sd_ref;
-}
-
-static int convert_zerosdsunlimit(int32 file_id,
- int32 sds_id,
- hid_t h5_group,
- hid_t h5_dimgroup,
- int32 chunk_size,
- int h4_attr) {
-
-
- int32 sds_dtype;
- int32 sds_rank;
- int32 sds_dimsizes[MAX_VAR_DIMS];
- int32* sds_start;
- int32* sds_edge;
- int32* sds_stride;
- int32 count_sdsdata;
- int32 sds_ref;
- int32 istat;
- int i;
- int32 num_sdsattrs;
- void* fill_value;
-
- int check_sdsname;
- int check_gloattr;
-
- char sdsname[MAX_NC_NAME];
- char sdslabel[MAX_NC_NAME];
- size_t h4size;
- size_t h4memsize;
- HDF_CHUNK_DEF c_def_out;
- hsize_t* chunk_dims;
- int32 c_flags;
-
- /* for checking compression */
-
- sp_info_block_t info_block;
- int16 special_code;
- int32 access_id;
- uint16 sd_ref;
- int gzip_level;
- /* define varibles for hdf5. */
-
- hid_t h5dset;
- hid_t h5d_sid;
- hid_t h5ty_id;
- hid_t h5_memtype;
- hid_t create_plist;
- hid_t write_plist;
- hsize_t h5dims[MAX_VAR_DIMS];
- hsize_t max_h5dims[MAX_VAR_DIMS];
- hsize_t bufsize;
- char* h5csds_name;
-
- if (SDgetinfo(sds_id,sdsname,&sds_rank,sds_dimsizes,&sds_dtype,
- &num_sdsattrs)==FAIL) {
- printf("unable to get information of sds h5dset.\n");
- return FAIL;
- }
-
- for (i=0;i<sds_rank;i++) {
- h5dims[i] = sds_dimsizes[i];
- max_h5dims[i] = h5dims[i];
- }
-
- if(SDisrecord(sds_id)){
- max_h5dims[0] = H5S_UNLIMITED;
- /* h5dims[0] = 0;*/
- }
-
- /* convert hdf4 data type to hdf5 data type. */
- if (h4type_to_h5type(sds_dtype,&h5_memtype,&h4memsize,&h4size,
- &h5ty_id) == FAIL) {
- printf("failed to translate datatype. \n");
- return FAIL;
- }
-
- /* check whether the datatype is string, if we find string format,
- we will change them back into integer format.*/
-
- if (h5ty_id == H5T_STRING) {
- /* rechange string datatype into numerical datatype.*/
- if(h5string_to_int(sds_dtype,&h5_memtype,h4memsize,
- &h5ty_id)== FAIL) {
- printf("error in translating H5T_STRING to int.\n");
- return FAIL;
- }
- }
-
- sds_ref = SDidtoref(sds_id);
- if(sds_ref == FAIL) {
- printf("error in obtaining sds reference number. \n");
- return FAIL;
- }
-
- h5csds_name = get_name(sds_ref,2*num_sds,sds_hashtab,&check_sdsname);
- if (h5csds_name == NULL && check_sdsname == 0 ) {
- printf("error,cannot find sds name \n");
- return FAIL;
- }
-
- if (h5csds_name == NULL && check_sdsname == -1) {
- printf("error,sds name is not defined.\n");
- return FAIL;
- }
-
- if (h5csds_name == NULL && check_sdsname == -2) {
- printf("error,not enough memory for allocating sds name.\n");
- return FAIL;
- }
-
- h5d_sid = H5Screate_simple(sds_rank,h5dims,max_h5dims);
-
- if (h5d_sid < 0) {
- printf("failed to create hdf5 data space converted from SDS. \n");
- return FAIL;
- }
-
-
- /* create property list. */
-
- create_plist = H5Pcreate(H5P_DATASET_CREATE);
- chunk_dims = malloc(sizeof(hsize_t)*sds_rank);
-
-
- sd_ref = get_SDref(file_id,DFTAG_NDG,sds_ref);
- if(sd_ref == 0)
- sd_ref = get_SDref(file_id,DFTAG_SDG,sds_ref);
- if(sd_ref >0 )
- access_id = Hstartread(file_id,DFTAG_SD,sd_ref);
- if(sd_ref == 0)
- access_id = FAIL;
- if(access_id != FAIL) {
- istat = Hinquire(access_id,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&special_code);
- if(istat == FAIL) {
- printf("failed to inquire information \n ");
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- free(h5csds_name);
- return FAIL;
- }
-
- if(special_code >0){
-
- if(HDget_special_info(access_id,&info_block)==FAIL){
- printf("fail to get special info.\n");
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- free(h5csds_name);
- return FAIL;
- }
-
- /* free(info_block.cdims);*/
- if(info_block.key == SPECIAL_COMP) {
-
- if(c_flags == HDF_NONE){
- /* 1. if the first dimension is unlimited dimension,
- we have to provide a chunking size.
- 2. the current HDF5 will not handle compression case itself,
- in order that the converted HDF5 is compressed, we have to
- provide a chunking size. currently it is set to h5dim[i].*/
-
- for(i=0;i<sds_rank;i++){
- chunk_dims[i] = (hsize_t)(h5dims[i]);
- }
- if(H5Pset_chunk(create_plist, sds_rank, chunk_dims)<0) {
- printf("failed to set up chunking information for ");
- printf("property list.\n");
- free(chunk_dims);
- free(h5csds_name);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- if(H5Pset_deflate(create_plist,GZIP_COMLEVEL)<0){
- /* if(H5Pset_deflate(create_plist,2)<0){*/
- printf("fail to set compression method for HDF5 file.\n");
- free(chunk_dims);
- free(h5csds_name);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- }
- }
-
- }
- else if(c_flags == HDF_NONE && SDisrecord(sds_id))
- {
- for(i=0;i<sds_rank;i++){
- chunk_dims[i] = (hsize_t)(sds_dimsizes[i]);
- if(sds_dimsizes[0] == 0)
- chunk_dims[0] = (hsize_t)chunk_size;
- }
- if(H5Pset_chunk(create_plist, sds_rank, chunk_dims)<0) {
- printf("failed to set up chunking information for ");
- printf("property list.\n");
- free(h5csds_name);
- free(chunk_dims);
- H5Pclose(create_plist);
- return FAIL;
- }
- }
-
- }
-
- }
-
- /* HDF4 can support various compression methods including simple RLE, NBIT, Skip Huffman, gzip,Jpeg , HDF5 currently only supports gzip compression.
- By default, we will compress HDF5 dataset by using gzip compression if HDF5 file is compressed. */
-
-
- if(c_flags == HDF_CHUNK || c_flags == (HDF_CHUNK | HDF_COMP)
- || c_flags == (HDF_CHUNK | HDF_NBIT) ){
-
- if(c_def_out.comp.comp_type == COMP_CODE_RLE || c_def_out.comp.comp_type == COMP_CODE_NBIT || c_def_out.comp.comp_type == COMP_CODE_SKPHUFF || c_def_out.comp.comp_type == COMP_CODE_DEFLATE || c_def_out.comp.comp_type == COMP_CODE_JPEG) {
-
- for(i=0;i<sds_rank;i++)
- chunk_dims[i] = (hsize_t)c_def_out.chunk_lengths[i];
-
- if(H5Pset_chunk(create_plist, sds_rank, chunk_dims)<0) {
- printf("failed to set up chunking information for ");
- printf("property list.\n");
- free(chunk_dims);
- free(h5csds_name);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- return FAIL;
- }
- if(c_def_out.comp.comp_type == COMP_CODE_DEFLATE)
- gzip_level = c_def_out.comp.cinfo.deflate.level;
- else gzip_level = GZIP_COMLEVEL;
- if(H5Pset_deflate(create_plist,gzip_level)<0){
- printf("fail to set compression method for HDF5 file.\n");
- free(chunk_dims);
- free(h5csds_name);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- }
- }
- }
-
- if(access_id == FAIL) {
- chunk_dims[0] = (hsize_t)chunk_size;
- for(i=1;i<sds_rank;i++)
- chunk_dims[i] = h5dims[i];
- if(H5Pset_chunk(create_plist, sds_rank, chunk_dims)<0) {
- printf("failed to set up chunking information for ");
- printf("property list.\n");
- free(chunk_dims);
- free(h5csds_name);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- return FAIL;
- }
- }
-
- h5dset = H5Dcreate(h5_group,h5csds_name,h5ty_id,h5d_sid,create_plist);
- if (h5dset < 0) {
- printf("failed to create hdf5 dataset converted from SDS. \n");
- free(chunk_dims);
- free(h5csds_name);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- if(sdsdim_to_h5dataset(sds_id,sds_rank,h5dset,h5_dimgroup,sds_dimsizes[0])<0){
- printf("failed to convert SDS dimensional scale dataset correctly \n"); free(h5csds_name);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- /* convert sds annotation into attribute of sds dataset.
- Since there is no routines to find the exact tag of sds object,
- we will check three possible object tags of sds objects, that is:
- DFTAG_SD,DFTAG_SDG,DFTAG_NDG. If the object tag of sds object is
- falling out of this scope, we will not convert annotations into
- hdf5 attributes; it is user's responsibility to make sure object tags
- for sds objects are only one of the above three tags.*/
-
- if(Annoobj_h4_to_h5(file_id,sds_ref,DFTAG_SD,h5dset)== FAIL){
- printf("failed to convert sds annotation into hdf5 attribute.\n");
- free(h5csds_name);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- if(Annoobj_h4_to_h5(file_id,sds_ref,DFTAG_SDG,h5dset)== FAIL){
- printf("failed to convert sds annotation into hdf5 attribute.\n");
- free(h5csds_name);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- if(Annoobj_h4_to_h5(file_id,sds_ref,DFTAG_NDG,h5dset)== FAIL){
- printf("failed to convert sds annotation into hdf5 attribute.\n");
- free(h5csds_name);
- free(chunk_dims);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- return FAIL;
- }
-
- check_gloattr = 0;
-
-
- if (sds_transattrs(sds_id,h5dset,num_sdsattrs,check_gloattr)==FAIL) {
- free(chunk_dims);
- free(h5csds_name);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- printf(" Error in obtaining sds attributes. \n");
- return FAIL;
- }
-
- /********************************************/
- /* handle extra attributes of sds : sds label, object type
- and reference num */
-
- if(h4_attr !=0) {
- strcpy(sdslabel,SDSLABEL);
-
- if(h4_transpredattrs(h5dset,HDF4_OBJECT_TYPE,sdslabel)==FAIL) {
- free(chunk_dims);
- free(h5csds_name);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- printf("unable to transfer sds label to HDF4 OBJECT TYPE.\n");
- return FAIL;
- }
-
- if(sdsname[0] != '\0') {
- if(h4_transpredattrs(h5dset,HDF4_OBJECT_NAME,sdsname)==FAIL){
- free(chunk_dims);
- free(h5csds_name);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- printf("unable to transfer sds name to HDF5 dataset attribute.\n");
- return FAIL;
- }
- }
-
- if(h4_transnumattr(h5dset,HDF4_REF_NUM,sds_ref)==FAIL){
- free(chunk_dims);
- free(h5csds_name);
- H5Sclose(h5d_sid);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- printf("unable to transfer sds ref. to HDF5 dataset attribute.\n");
- return FAIL;
- }
- }
- H5Sclose(h5d_sid);
- free(h5csds_name);
- free(chunk_dims);
- H5Dclose(h5dset);
- H5Pclose(create_plist);
- return SUCCEED;
-}
-
-
-int get_numslab_perD(int32 totalsize,int slabsize,int rank) {
-
- int i,flag;
- int32 tempsize;
- int numslab_perD;
- numslab_perD =1;
- flag = 0;
-
- while(!flag) {
- tempsize =1;
- for(i=0;i<rank;i++)
- tempsize = tempsize*numslab_perD;
- if((totalsize/tempsize)<=slabsize){
- flag = 1;
- }
- else
- numslab_perD++;
- }
- printf("numslab_perD %d\n",numslab_perD);
- return numslab_perD;
-}
-
-
-int h5ceil(int32 m,int32 n){
- if(m/n * n < m) return m/n +1;
- else return m/n;
-}
-
-
-int pow(int num,int h4index) {
- int i;
- int total;
- total = 1;
- for( i= 1; i<=h4index;i++)
- total = total * num;
- return total;
-}