/****************************************************************************
* 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 "hrepack.h"
int cmp_grs(char* file1_name,char* file2_name);
int cmp_gr(int32 ri1_id, int32 ri2_id);
/*-------------------------------------------------------------------------
* Function: cmp_grs
*
* Purpose: compare all GR images in 2 files, assumed to be identical
*
* Return: same as memcmp
*
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
*
* Date: September 03, 2003
*
*-------------------------------------------------------------------------
*/
int cmp_grs(char* file1_name,char* file2_name)
{
int32 file1_id, /* file identifier */
file2_id, /* file identifier */
gr1_id, /* GR interface identifier */
gr2_id, /* GR interface identifier */
ri1_id, /* raster image identifier */
ri2_id, /* raster image identifier */
n_rimages, /* number of raster images in the file */
n_file_attrs, /* number of file attributes */
ri_index; /* index of a image */
int cmp=-1;
/* open the files for read */
file1_id = Hopen (file1_name,DFACC_READ,0);
file2_id = Hopen (file2_name,DFACC_READ,0);
/* initialize the GR interface */
gr1_id = GRstart (file1_id);
gr2_id = GRstart (file2_id);
/* determine the contents of the file */
if (GRfileinfo (gr1_id, &n_rimages, &n_file_attrs)==FAIL){
printf("Error: Cannot get GR info\n");
goto out;
}
for (ri_index = 0; ri_index < n_rimages; ri_index++)
{
ri1_id = GRselect (gr1_id, ri_index);
ri2_id = GRselect (gr2_id, ri_index);
/* compare GR */
cmp = cmp_gr(ri1_id,ri2_id);
/* terminate access to the current raster image */
GRendaccess (ri1_id);
GRendaccess (ri2_id);
}
out:
/* terminate access to the GR interface */
GRend (gr2_id);
GRend (gr2_id);
/* close the HDF files */
if (Hclose (file1_id)== FAIL )
printf( "Failed to close file <%s>\n", file1_name);
if (Hclose (file2_id)== FAIL )
printf( "Failed to close file <%s>\n", file2_name);
return cmp;
}
/*-------------------------------------------------------------------------
* Function: cmp_gr
*
* Purpose: compare 2 GR images in 2 files, assumed to be identical
*
* Return: same as memcmp
*
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
*
* Date: September 03, 2003
*
*-------------------------------------------------------------------------
*/
int cmp_gr(int32 ri1_id, int32 ri2_id)
{
int32 dimsizes[2], /* dimensions of an image */
n_comps, /* number of components an image contains */
interlace_mode1,/* interlace mode of an image */
dtype, /* number type of an image */
n_attrs; /* number of attributes belong to an image */
int32 interlace_mode2;
char gr_name[MAX_GR_NAME];
int j, rank=2;
int32 start[2], /* read start */
edges[2], /* read edges */
numtype, /* number type */
eltsz, /* element size */
nelms, /* number of elements */
data_size;
VOIDP buf1=NULL, buf2=NULL;
int cmp=-1;
GRgetiminfo(ri1_id,gr_name,&n_comps,&dtype,&interlace_mode1,dimsizes,&n_attrs);
GRgetiminfo(ri2_id,gr_name,&n_comps,&dtype,&interlace_mode2,dimsizes,&n_attrs);
printf( "Comparing GR <%s>: ", gr_name);
/*-------------------------------------------------------------------------
* match interlace
* NOTE: GR images are always stored as pixel_interlace (0) on disk
* that does not happen with images saved with the
* DF24 - Single-file 24-Bit Raster Image Interface,
* where the interlace mode on disk can be 0, 1 or 2
*-------------------------------------------------------------------------
*/
if ( interlace_mode1 != interlace_mode2 )
{
printf("Warning: different interlace mode: <%d> and <%d>",
interlace_mode1,interlace_mode2);
interlace_mode1=interlace_mode2;
}
/*-------------------------------------------------------------------------
* check for data size before printing
*-------------------------------------------------------------------------
*/
/* compute the number of the bytes for each value. */
numtype = dtype & DFNT_MASK;
eltsz = DFKNTsize(numtype | DFNT_NATIVE);
/* set edges of GR */
nelms=1;
for (j = 0; j < rank; j++) {
nelms *= dimsizes[j];
edges[j] = dimsizes[j];
start[j] = 0;
}
data_size = dimsizes[0]*dimsizes[1]*n_comps*eltsz;
/*-------------------------------------------------------------------------
* read gr 1
*-------------------------------------------------------------------------
*/
/* alloc */
if ((buf1 = (VOIDP) HDmalloc(data_size)) == NULL) {
printf( "Failed to allocate %d elements of size %d\n", nelms, eltsz);
goto out;
}
/* set the interlace for reading */
if ( GRreqimageil(ri1_id, interlace_mode1) == FAIL ){
printf( "Could not set interlace for GR\n");
goto out;
}
/* read data */
if (GRreadimage (ri1_id, start, NULL, edges, buf1) == FAIL) {
printf( "Could not read GR\n");
goto out;
}
/*-------------------------------------------------------------------------
* read gr 2
*-------------------------------------------------------------------------
*/
/* alloc */
if ((buf2 = (VOIDP) HDmalloc(data_size)) == NULL) {
printf( "Failed to allocate %d elements of size %d\n", nelms, eltsz);
goto out;
}
/* set the interlace for reading */
if ( GRreqimageil(ri2_id, interlace_mode2 /*interlace_mode1*/) == FAIL ){
printf( "Could not set interlace for GR\n");
goto out;
}
/* read data */
if (GRreadimage (ri2_id, start, NULL, edges, buf2) == FAIL) {
printf( "Could not read GR\n");
goto out;
}
cmp = HDmemcmp(buf1,buf2,data_size);
if (cmp!=0)
printf("Differences found\n");
else
printf("\n");
out:
/* terminate access to the GRs */
GRendaccess(ri1_id);
GRendaccess(ri2_id);
if (buf1)
free(buf1);
if (buf2)
free(buf2);
return cmp;
}
syntax highlighted by Code2HTML, v. 0.9.1