src/hg/bedItemOverlapCount/bedItemOverlapCount.c 1.19

1.19 2009/10/01 04:50:06 braney
implement Angie's suggestions to make the code more readable
Index: src/hg/bedItemOverlapCount/bedItemOverlapCount.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/bedItemOverlapCount/bedItemOverlapCount.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -b -B -U 4 -r1.18 -r1.19
--- src/hg/bedItemOverlapCount/bedItemOverlapCount.c	29 Sep 2009 18:15:31 -0000	1.18
+++ src/hg/bedItemOverlapCount/bedItemOverlapCount.c	1 Oct 2009 04:50:06 -0000	1.19
@@ -19,9 +19,9 @@
 typedef unsigned int unitSize;
 
 #define MAXCOUNT (unitSize)~0
 #define MAXMESSAGE "Overflow of overlap counts. Max is %lu.  Recompile with bigger unitSize or use -max option"
-#define INCWOVERFLOW(x) if(counts[x] == MAXCOUNT) {if(!doMax) errAbort(MAXMESSAGE,(unsigned long)MAXCOUNT);} else counts[x]++
+#define INCWOVERFLOW(countArray,x) if(countArray[x] == MAXCOUNT) {if(!doMax) errAbort(MAXMESSAGE,(unsigned long)MAXCOUNT);} else countArray[x]++
 
 /* Command line switches. */
 static struct hash *chromHash = NULL;
 static char *host = NULL;
@@ -107,9 +107,9 @@
 while ((row = sqlNextRow(sr)) != NULL)
     {
     el = chromInfoLoad(row);
     if (el->size > max) max = el->size;
-    verbose(4, "Add hash %s value %u (%#lx)\n", el->chrom, el->size, (unsigned long)el->size);
+    verbose(4, "Add hash %s value %u (%#lx)\n", el->chrom, el->size, (unsigned long)&el->size);
     hashAdd(ret, el->chrom, (void *)(& el->size));
     }
 sqlFreeResult(&sr);
 sqlDisconnect(&conn);
@@ -128,34 +128,42 @@
 }
 
 static void outputCounts(unitSize *counts, char *chrom, unsigned size)
 {
-unitSize *start = counts;
-unitSize *lastCount = &counts[size];
-unitSize *ptr;
+if (size == 0)
+    errAbort("got 0 for size of chrom %s\n", chrom);
 
-for(ptr=counts; ptr < lastCount - 1; ptr++)
+if (doOutBounds)
+    {
+    if (counts[0] < overMin)
+	overMin = counts[0];
+    if (counts[0] > overMax)
+	overMax = counts[0];
+    }
+
+int ii;
+int prevValue = counts[0];
+int startPoint = 0;
+for(ii=1; ii < size; ii++)
     {
     if (doOutBounds)
 	{
-	if (ptr[1] < overMin)
-	    overMin = ptr[1];
-	if (ptr[1] > overMax)
-	    overMax = ptr[1];
+	if (counts[ii] < overMin)
+	    overMin = counts[ii];
+	if (counts[ii] > overMax)
+	    overMax = counts[ii];
 	}
-    if (ptr[0] != ptr[1])
+    if (counts[ii] != prevValue)
 	{
-	if (doZero || (ptr[0] != 0))
-	    printf("%s\t%lu\t%lu\t%lu\n", 
-                chrom, (unsigned long)(start - counts), (unsigned long)(ptr - counts + 1), (unsigned long)ptr[0]);
-	start = ptr + 1;
+	if (doZero || (prevValue != 0))
+	    printf("%s\t%u\t%u\t%u\n", chrom, startPoint, ii, prevValue);
+	startPoint = ii;
+	prevValue = counts[ii];
 	}
     }
 
-if (doZero || (ptr[0] != 0))
-    printf("%s\t%lu\t%lu\t%lu\n", 
-	chrom, (unsigned long)(start - counts), (unsigned long)(ptr - counts + 1), (unsigned long)ptr[0]);
-
+if (doZero || (prevValue != 0))
+    printf("%s\t%u\t%u\t%u\n", chrom, startPoint, ii, prevValue);
 }
 
 static void bedItemOverlapCount(char *database, int fileCount, char *fileList[])
 {
@@ -246,11 +254,11 @@
 		    bed->chromEnd,chromSize);
 		}
 
 	    for (i = bed->chromStart; i < chromSize; ++i)
-		INCWOVERFLOW(i);
+		INCWOVERFLOW(counts,i);
 	    for (i = 0; i < (bed->chromEnd - chromSize); ++i)
-		INCWOVERFLOW(i);
+		INCWOVERFLOW(counts,i);
 	    }
 	else if (doBed12)
 	    {
 	    int *starts = bed->chromStarts;
@@ -260,15 +268,15 @@
 	    for(; starts < endStarts; starts++, sizes++)
 		{
 		unsigned int end = *starts + *sizes + bed->chromStart;
 		for (i = *starts + bed->chromStart; i < end; ++i)
-		    INCWOVERFLOW(i);
+		    INCWOVERFLOW(counts,i);
 		}
 	    }
 	else
 	    {
 	    for (i = bed->chromStart; i < bed->chromEnd; ++i)
-		INCWOVERFLOW(i);
+		INCWOVERFLOW(counts, i);
 	    }
 	outputToDo = TRUE;
 	bedFree(&bed); // plug the memory leak
 	}