/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * * the files COPYING and Copyright.html. COPYING can be found at the root * * of the source code distribution tree; Copyright.html can be found at the * * root level of an installed copy of the electronic HDF5 document set and * * is linked from the top-level documents page. It can also be found at * * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include "h5diff.h" #include #include /* Due to alignment issue in Alpha clusters, options must be declared here * not as a local variable in main(). */ diff_opt_t options = {0,0,0,0,0,0,0,0}; static void usage(void); static int check_n_input( const char* ); static int check_f_input( const char* ); /*------------------------------------------------------------------------- * Function: main * * Purpose: h5diff main program * * Return: An exit status of 0 means no differences were found, 1 means some * differences were found. * * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu * * Date: May 9, 2003 * * Comments: * * Modifications: * *------------------------------------------------------------------------- */ int main(int argc, const char *argv[]) { int i; const char *s = NULL; const char *fname1 = NULL; const char *fname2 = NULL; const char *objname1 = NULL; const char *objname2 = NULL; int nfound=0, ret; /*------------------------------------------------------------------------- * initial check of command line options *------------------------------------------------------------------------- */ if ( argc==2 && (strcmp("-h",argv[1])==0) ) usage(); if ( argc<3 ) { printf("Number of arguments is only %d\n", argc ); usage(); } /*------------------------------------------------------------------------- * file names are first *------------------------------------------------------------------------- */ if ( argc>=3 ) { fname1 = argv[1]; fname2 = argv[2]; } /*------------------------------------------------------------------------- * parse command line options *------------------------------------------------------------------------- */ for (i=3; i is not a valid option\n", argv[i+1] ); usage(); } options.delta = atof(argv[i+1]); i++; /* go to next */ } else { printf("Not a valid -d option\n"); usage(); } break; case 'p': if ( i is not a valid option\n", argv[i+1] ); usage(); } options.percent = atof(argv[i+1]); i++; /* go to next */ } else { printf("Not a valid -p option\n"); usage(); } break; case 'n': if ( i is not a valid option\n", argv[i+1] ); usage(); } options.count = atoi(argv[i+1]); i++; /* go to next */ } else { printf("Not a valid -n option\n"); usage(); } break; } /*switch*/ } /*for*/ } /*if*/ else /* not single-letter switches */ { /* check if it is not a -d, -p parameter */ if ( '-'==argv[i-1][0] && ('d'==argv[i-1][1] ||'p'==argv[i-1][1] )) continue; else { if ( objname1==NULL ) objname1 = argv[i]; if ( objname2==NULL ) { /* check if we have a second object name */ if ( i+1 57 ) /* ascii values between 1 and 9 */ return -1; } else if ( c < 48 || c > 57 ) /* 0 also */ return -1; } return 1; } /*------------------------------------------------------------------------- * Function: check_f_input * * Purpose: check for a valid floating point input * * Return: 1 for ok, -1 for fail * * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu * * Date: May 9, 2003 * * Comments: * * Modifications: * *------------------------------------------------------------------------- */ static int check_f_input( const char *str ) { double x; /* the atof return value on a hexadecimal input is different on some systems; we do a character check for this */ if (strlen(str)>2 && str[0]=='0' && str[1]=='x') return -1; x=atof(str); if (x==0) return -1; return 1; } /*------------------------------------------------------------------------- * Function: usage * * Purpose: print a usage message * * Return: void * * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu * * Date: May 9, 2003 * *------------------------------------------------------------------------- */ static void usage(void) { printf("Usage: h5diff file1 file2 [OPTIONS] [obj1[obj2]] \n"); printf("\n"); printf("file1 File name of the first HDF5 file\n"); printf("file2 File name of the second HDF5 file\n"); printf("[obj1] Name of an HDF5 object, in absolute path\n"); printf("[obj2] Name of an HDF5 object, in absolute path\n"); printf("[OPTIONS] are:\n"); printf("[-h] Print out this information\n"); printf("[-v] Verbose mode\n"); printf("[-r] Print only what objects differ, not the differences\n"); printf("[-n count] Print difference up to count number\n"); printf("[-d delta] Print difference when it is greater than limit delta\n"); printf("[-p relative] Print difference when it is greater than a relative limit\n"); printf("\n"); printf("Items in [] are optional\n"); printf("[obj1] and [obj2] are HDF5 objects (datasets, groups or datatypes)\n"); printf("The 'count' value must be a positive integer\n"); printf("The 'delta' and 'relative' values must be positive numbers\n"); printf("The -d compare criteria is |a - b| > delta\n"); printf("The -p compare criteria is |1 - b/a| > relative\n"); printf("\n"); printf("Examples:\n"); printf("\n"); printf("1) h5diff file1 file2 /a/b /a/c\n"); printf("\n"); printf(" Compares object '/a/b' in file1 with '/a/c' in file2\n"); printf("\n"); printf("2) h5diff file1 file2 /a/b\n"); printf("\n"); printf(" Compares object '/a/b' in both files\n"); printf("\n"); printf("3) h5diff file1 file2\n"); printf("\n"); printf(" Compares all objects in both files\n"); printf("\n"); exit(0); }