/****************************************************************************
* NCSA HDF *
* Software Development Group *
* National Center for Supercomputing Applications *
* University of Illinois at Urbana-Champaign *
* 605 E. Springfield, Champaign IL 61820 *
* *
* For conditions of distribution and use, see the accompanying *
* hdf/COPYING file. *
* *
****************************************************************************/
#include "hdf.h"
#include "mfhdf.h"
#include "hcomp.h"
#include "test_hrepack_verify.h"
/*-------------------------------------------------------------------------
* Function: sds_verifiy_comp
*
* Purpose: utility function to verify compression for SDS_NAME
*
* Return: void
*
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
*
* Date: August 3, 2003
*
*-------------------------------------------------------------------------
*/
int sds_verifiy_comp(const char *sds_name,
int32 in_comp_type,
int32 in_comp_info)
{
comp_coder_t comp_type; /* to retrieve compression type into */
comp_info comp_info; /* compression structure */
int32 sd_id,
sds_id,
sds_index;
/* get chunk and comp */
sd_id = SDstart (FILENAME_OUT, DFACC_RDONLY);
sds_index = SDnametoindex(sd_id, sds_name);
if ((sds_id = SDselect(sd_id, sds_index))==FAIL) {
printf("Error: Cannot open sds <%s>", sds_name);
SDend (sd_id);
return -1;
}
/*-------------------------------------------------------------------------
* retrieve and verify the compression info
*-------------------------------------------------------------------------
*/
comp_type = COMP_CODE_NONE; /* reset variables before retrieving info */
HDmemset(&comp_info, 0, sizeof(comp_info)) ;
SDgetcompress(sds_id, &comp_type, &comp_info);
if ( comp_type != in_comp_type )
{
printf("Error: Compression type does not match ");
SDendaccess (sds_id);
SDend (sd_id);
return -1;
}
if (in_comp_info) {
if ( comp_info.skphuff.skp_size != in_comp_info )
{
printf("Error: compresion information does not match ");
SDendaccess (sds_id);
SDend (sd_id);
return -1;
}
}
/* terminate access to the sds */
SDendaccess (sds_id);
/* terminate access to the sd interface */
SDend (sd_id);
return 0;
}
/*-------------------------------------------------------------------------
* Function: sds_verifiy_comp_all
*
* Purpose: utility function to verify compression for all SDSs
*
* Return: void
*
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
*
* Date: August 3, 2003
*
*-------------------------------------------------------------------------
*/
int sds_verifiy_comp_all(int32 in_comp_type,
int32 in_comp_info)
{
comp_coder_t comp_type; /* to retrieve compression type into */
comp_info comp_info; /* compression structure */
int32 sd_id,
sds_id,
sds_index,
n_datasets, /* number of datasets in the file */
n_file_attrs, /* number of file attributes */
data_type, /* number type */
rrank, /* read rank */
n_attrs, /* number of attributes */
dim_sizes[MAX_VAR_DIMS];/* dimensions of an image */
char name[MAX_GR_NAME]; /* name of dataset */
int info;
int status;
/* initialize the sd interface */
sd_id = SDstart (FILENAME_OUT, DFACC_READ);
/* determine the number of data sets in the file */
if (SDfileinfo (sd_id, &n_datasets, &n_file_attrs)==FAIL) {
printf("Error: Cannot get file information");
SDend (sd_id);
return -1;
}
for (sds_index = 0; sds_index < n_datasets; sds_index++)
{
sds_id = SDselect (sd_id, sds_index);
/* skip dimension scales */
if ( SDiscoordvar(sds_id) ) {
SDendaccess(sds_id);
continue;
}
name[0] = '\0';
status=SDgetinfo(sds_id, name, &rrank, dim_sizes, &data_type, &n_attrs);
if (status < 0) {
printf("Error: can't read info for SDS <%s>",name);
SDendaccess (sds_id);
SDend (sd_id);
return -1;
}
/*-------------------------------------------------------------------------
* retrieve and verify the compression info
*-------------------------------------------------------------------------
*/
comp_type = COMP_CODE_NONE; /* reset variables before retrieving info */
HDmemset(&comp_info, 0, sizeof(comp_info)) ;
status = SDgetcompress(sds_id, &comp_type, &comp_info);
if (status < 0) {
printf("Warning: can't read compression for SDS <%s>",name);
} else {
if ( comp_type != in_comp_type )
{
printf("Error: compression type does not match <%s>",name);
SDendaccess (sds_id);
SDend (sd_id);
return -1;
}
if (in_comp_type)
{
switch (in_comp_type)
{
case COMP_CODE_NONE:
break;
case COMP_CODE_RLE:
break;
case COMP_CODE_SZIP:
break;
case COMP_CODE_SKPHUFF:
info = comp_info.skphuff.skp_size;
break;
case COMP_CODE_DEFLATE:
info = comp_info.deflate.level;
break;
default:
printf("Error: Unrecognized compression code %d\n",in_comp_type);
break;
};
if ( info != in_comp_info )
{
printf("Error: compresion information does not match for <%s>",name);
SDendaccess (sds_id);
SDend (sd_id);
return -1;
}
}
}
/* terminate access to the current dataset */
SDendaccess (sds_id);
}
/* terminate access to the sd interface */
SDend (sd_id);
return 0;
}
/*-------------------------------------------------------------------------
* Function: sds_verifiy_chunk
*
* Purpose: utility function to verify chunking for SDS_NAME
*
* Return: void
*
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
*
* Date: August 3, 2003
*
*-------------------------------------------------------------------------
*/
int sds_verifiy_chunk(const char *sds_name,
int32 in_chunk_flags,
int rank,
int32 *in_chunk_lengths)
{
HDF_CHUNK_DEF chunk_def; /* chunk defintion read */
int32 chunk_flags; /* chunking flag */
int32 sd_id,
sds_id,
sds_index;
int i;
/* get chunk and comp */
sd_id = SDstart (FILENAME_OUT, DFACC_RDONLY);
sds_index = SDnametoindex(sd_id, sds_name);
if ((sds_id = SDselect(sd_id, sds_index))==FAIL) {
printf("Error: cannot open sds <%s>", sds_name);
SDend (sd_id);
return -1;
}
SDgetchunkinfo (sds_id, &chunk_def, &chunk_flags);
/*-------------------------------------------------------------------------
* retrieve and verify the chunk info
*-------------------------------------------------------------------------
*/
if ( chunk_flags != (in_chunk_flags) )
{
printf("Error: chunk flags do not match");
SDendaccess (sds_id);
SDend (sd_id);
return -1;
}
for (i = 0; i < rank; i++)
{
if (chunk_def.chunk_lengths[i] != in_chunk_lengths[i] )
{
printf("Error: chunk lengths do not match ");
SDendaccess (sds_id);
SDend (sd_id);
return -1;
}
}
/* terminate access to the sds */
SDendaccess (sds_id);
/* terminate access to the sd interface */
SDend (sd_id);
return 0;
}
/*-------------------------------------------------------------------------
* Function: sds_verifiy_chunk_all
*
* Purpose: utility function to verify chunking for all SDSs
*
* Return: void
*
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
*
* Date: August 3, 2003
*
*-------------------------------------------------------------------------
*/
int sds_verifiy_chunk_all(int32 in_chunk_flags,
int rank,
int32 *in_chunk_lengths,
const char *sds_exclude)
{
HDF_CHUNK_DEF chunk_def; /* chunk defintion read */
int32 chunk_flags; /* chunking flag */
int32 sd_id,
sds_id,
sds_index,
n_datasets, /* number of datasets in the file */
n_file_attrs, /* number of file attributes */
data_type, /* number type */
rrank, /* read rank */
n_attrs, /* number of attributes */
dim_sizes[MAX_VAR_DIMS];/* dimensions of an image */
char name[MAX_GR_NAME]; /* name of dataset */
int i;
/* initialize the sd interface */
sd_id = SDstart (FILENAME_OUT, DFACC_READ);
/* determine the number of data sets in the file */
if (SDfileinfo (sd_id, &n_datasets, &n_file_attrs)==FAIL) {
printf("Error: cannot get file information");
SDend (sd_id);
return -1;
}
for (sds_index = 0; sds_index < n_datasets; sds_index++)
{
sds_id = SDselect (sd_id, sds_index);
/* skip dimension scales */
if ( SDiscoordvar(sds_id) ) {
SDendaccess(sds_id);
continue;
}
SDgetinfo(sds_id, name, &rrank, dim_sizes, &data_type, &n_attrs);
SDgetchunkinfo (sds_id, &chunk_def, &chunk_flags);
/* do not compare this one */
if (strcmp(name,sds_exclude)==0)
{
SDendaccess(sds_id);
SDend (sd_id);
return 0;
}
/*-------------------------------------------------------------------------
* retrieve and verify the chunk info
*-------------------------------------------------------------------------
*/
if ( chunk_flags != (in_chunk_flags) )
{
printf("Error: chunk flags do not match");
SDendaccess (sds_id);
SDend (sd_id);
return -1;
}
for (i = 0; i < rank; i++)
{
if (chunk_def.chunk_lengths[i] != in_chunk_lengths[i] )
{
printf("Error: chunk lengths do not match ");
SDendaccess (sds_id);
SDend (sd_id);
return -1;
}
}
/* terminate access to the current dataset */
SDendaccess (sds_id);
}
/* terminate access to the sd interface */
SDend (sd_id);
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1