src/utils/faCmp/faCmp.c 1.8

1.8 2009/11/13 21:33:25 markd
use different exit code when differences are detected to make it easy to use in scripts
Index: src/utils/faCmp/faCmp.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/utils/faCmp/faCmp.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -b -B -U 1000000 -r1.7 -r1.8
--- src/utils/faCmp/faCmp.c	30 Jan 2008 23:11:27 -0000	1.7
+++ src/utils/faCmp/faCmp.c	13 Nov 2009 21:33:25 -0000	1.8
@@ -1,127 +1,139 @@
 /* faCmp - Compare two .fa files. */
 #include "common.h"
 #include "linefile.h"
 #include "hash.h"
 #include "cheapcgi.h"
 #include "fa.h"
 #include "options.h"
 #include "nib.h"
 
 static char const rcsid[] = "$Id$";
 
 void usage()
 /* Explain usage and exit. */
 {
 errAbort(
   "faCmp - Compare two .fa files\n"
   "usage:\n"
   "   faCmp [options] a.fa b.fa\n"
   "options:\n"
   "    -softMask - use the soft masking information during the compare\n"
   "                Differences will be noted if the masking is different.\n"
   "    -sortName - sort input files by name before comparing\n"
   "    -peptide - read as peptide sequences\n"
   "default:\n"
   "    no masking information is used during compare.  It is as if both\n"
   "    sequences were not masked.\n"
+  "\n"
+  "Exit codes:\n"
+  "   - 0 if files are the same\n"
+  "   - 1 if files differ\n"
+  "   - 255 on an error\n"
+  "\n"
   );
 }
 /* command line options and values */
 static struct optionSpec optionSpecs[] =
 {
     {"softMask", OPTION_BOOLEAN},
     {"sortName", OPTION_BOOLEAN},
     {"peptide", OPTION_BOOLEAN},
     {NULL, 0}
 };
 
 
 int faSortByName(const void *va, const void *vb)    
 /* used for slSorting dnaSeq */
 {
 const struct dnaSeq *a = *((struct dnaSeq **)va);
 const struct dnaSeq *b = *((struct dnaSeq **)vb);
 return(strcmp(a->name, b->name));
 }
 
 void faCmp(int options, char *aFile, char *bFile)
 /* faCmp - Compare two .fa files. */
 {
 struct dnaSeq *aList = (struct dnaSeq *) NULL;
 struct dnaSeq *bList = (struct dnaSeq *) NULL;
 int aCount = 0;
 int bCount = 0;
 struct dnaSeq *a, *b;
 DNA *aDna, *bDna;
 int size, i;
 int errCount = 0;
 
 if (optionExists("peptide"))
     {
     aList = faReadAllPep(aFile);
     bList = faReadAllPep(bFile);
     }
 else if (NIB_MASK_MIXED & options)
     {
     aList = faReadAllMixed(aFile);
     bList = faReadAllMixed(bFile);
     }
 else
     {
     aList = faReadAllDna(aFile);
     bList = faReadAllDna(bFile);
     }
 aCount = slCount(aList);
 bCount = slCount(bList);
 if ( optionExists("sortName") )
     {
     verbose(1, "sorting %s\n",aFile);
     slSort(&aList, faSortByName);
     verbose(1, "sorting %s\n",bFile);
     slSort(&bList, faSortByName);
     }
 
 if (aCount != bCount)
-   errAbort("%d sequences in %s, %d in %s", aCount, aFile, bCount, bFile);
+    {
+    fprintf(stderr, "%d sequences in %s, %d in %s\n", aCount, aFile, bCount, bFile);
+    exit(1);
+    }
 for (a = aList, b = bList; a != NULL && b != NULL; a = a->next, b = b->next)
     {
     verbose(2, "comparing %s to %s\n",a->name, b->name);
     if (a->size != b->size)
         {
         fprintf(stderr, "%s in %s has %d bases.  %s in %s has %d bases\n",
 		a->name, aFile, a->size, b->name, bFile, b->size);
         errCount++;
         continue;
         }
     aDna = a->dna;
     bDna = b->dna;
     size = a->size;
     for (i=0; i<size; ++i)
         {
 	if (aDna[i] != bDna[i])
             {
 	    fprintf(stderr, "%s in %s differs from %s at %s at base %d (%c != %c)\n",
                     a->name, aFile, b->name, bFile, i, aDna[i], bDna[i]);
             errCount++;
             break;
             }
 	}
     }
 if (errCount == 0)
     fprintf(stderr, "%s and %s are the same\n", aFile, bFile);
 else
-    errAbort("%s and %s have %d sequences that differ", aFile, bFile, errCount);
+    {
+    fprintf(stderr, "%s and %s have %d sequences that differ\n", aFile, bFile, errCount);
+    exit(1);
+    }
 }
 
 int main(int argc, char *argv[])
 /* Process command line. */
 {
 int options = 0;
 optionInit(&argc, argv, optionSpecs);
 if ( optionExists("softMask") )
     options |= NIB_MASK_MIXED;
 if (argc != 3)
     usage();
 faCmp(options, argv[1], argv[2]);
 return 0;
 }