e70152e44cc66cc599ff6b699eb8adc07f3e656a
kent
  Sat May 24 21:09:34 2014 -0700
Adding Copyright NNNN Regents of the University of California to all files I believe with reasonable certainty were developed under UCSC employ or as part of Genome Browser copyright assignment.
diff --git src/utils/bedGraphPack/bedGraphPack.c src/utils/bedGraphPack/bedGraphPack.c
index fe4eb49..702b383 100644
--- src/utils/bedGraphPack/bedGraphPack.c
+++ src/utils/bedGraphPack/bedGraphPack.c
@@ -1,112 +1,115 @@
 /* bedGraphPack - Pack together adjacent records representing same value.. */
+
+/* Copyright (C) 2013 The Regents of the University of California 
+ * See README in this or parent directory for licensing information. */
 #include "common.h"
 #include "linefile.h"
 #include "hash.h"
 #include "options.h"
 
 void usage()
 /* Explain usage and exit. */
 {
 errAbort(
   "bedGraphPack v1 - Pack together adjacent records representing same value.\n"
   "usage:\n"
   "   bedGraphPack in.bedGraph out.bedGraph\n"
   "The input needs to be sorted by chrom and this is checked.  To put in a pipe\n"
   "use stdin and stdout in the command line in place of file names.\n"
   );
 }
 
 /* Command line validation table. */
 static struct optionSpec options[] = {
    {NULL, 0},
 };
 
 void bedGraphPack(char *input, char *output)
 /* bedGraphPack - Pack together adjacent records representing same value.. */
 {
 /* We'll keep a hash of chroms to help make sure we're sorted. */
 struct hash *chromHash = hashNew(0);
 
 /* Open input and output. */
 struct lineFile *lf = lineFileOpen(input, TRUE);
 FILE *f = mustOpen(output, "w");
 
 /* Loop is a little complex - it keeps track of previous value, and merges
  * current record into previous where possible.*/
 char *prevChrom = "", *newChrom = "";
 char prevStart[16] = "", prevEnd[16] = "", prevVal[32] = "";
 boolean done = FALSE;
 while (!done)
     {
     char *row[5];
     char *chrom = NULL, *start = NULL, *end = NULL, *val = NULL;
     char *newStart = prevStart;
     int rowSize = lineFileChopNext(lf, row, ArraySize(row));
     boolean outputLast = FALSE;
     if (rowSize == 0)
         {
 	/* Cope with end of file. */
 	outputLast = TRUE;
 	done = TRUE;
 	}
     else
 	{
 	/* Fetch next line into local string variables. */
 	lineFileExpectWords(lf, 4, rowSize);
 	chrom = row[0];
 	start = row[1];
 	end = row[2];
 	val = row[3];
 
 	/* We need to output if on a different chrom or skipping between previous record.
 	 * This is also when we need to reset our starting point. */
 	if (!sameString(prevChrom, chrom))
 	    {
 	    if (hashLookup(chromHash, chrom))
 		errAbort("%s is hopping at line %d of %s", chrom, lf->lineIx, lf->fileName);
 	    hashAddSaveName(chromHash, chrom, NULL, &newChrom);
 	    newStart = start;
 	    outputLast = TRUE;
 	    }
 	else
 	    {
 	    if (!sameString(start, prevEnd) || !sameString(val,prevVal))
 	        {
 		newStart = start;
 		outputLast = TRUE;
 		}
 	    }
 
 	}
 
     /* This is the one and only place in loop we output */
     if (outputLast && !isEmpty(prevChrom))
         {
 	fprintf(f, "%s\t%s\t%s\t%s\n", prevChrom, prevStart, prevEnd, prevVal);
 	outputLast = FALSE;
 	}
 
     /* Copy current record to previous.  The additional done check here prevents
      * us from having to duplicate the output clause to handle EOF */
     if (!done)
 	{
 	prevChrom = newChrom;
 	if (newStart != prevStart)
 	    safef(prevStart, sizeof(prevStart), "%s", newStart);
 	safef(prevEnd, sizeof(prevEnd), "%s", end);
 	safef(prevVal, sizeof(prevVal), "%s", val);
 	}
     }
 
 carefulClose(&f);
 }
 
 int main(int argc, char *argv[])
 /* Process command line. */
 {
 optionInit(&argc, argv, options);
 if (argc != 3)
     usage();
 bedGraphPack(argv[1], argv[2]);
 return 0;
 }