f027f8abae506be46f46224edbc51b4f38e93bd7
kent
  Tue Feb 26 16:02:24 2013 -0800
Fixing bug where it only finds item if it's in first part of block.
diff --git src/utils/bigBedNamedItems/bigBedNamedItems.c src/utils/bigBedNamedItems/bigBedNamedItems.c
index ff9afc2..b048a35 100644
--- src/utils/bigBedNamedItems/bigBedNamedItems.c
+++ src/utils/bigBedNamedItems/bigBedNamedItems.c
@@ -41,67 +41,72 @@
 
 boolean bigBedNameQuery(struct bbiFile *bbi, char *name, FILE *f)
 /* Write item matching name to file.  Return TRUE if anything written.  */
 {
 bigBedAttachNameIndex(bbi);
 boolean isSwapped = bbi->isSwapped;
 struct offsetSize {bits64 offset; bits64 size;} block;
 boolean didWrite = FALSE;
 if (bptFileFind(bbi->nameBpt, name, strlen(name), &block, sizeof(block)))
     {
     if (bbi->isSwapped)
 	{
 	block.offset = byteSwap64(block.offset);
 	block.size = byteSwap64(block.size);
 	}
+    uglyf("found block at %llu size %llu\n", block.offset, block.size);
 
     /* Read in raw data */
     udcSeek(bbi->udc, block.offset);
     char *rawData = needLargeMem(block.size);
     udcRead(bbi->udc, rawData, block.size);
 
     /* Optionally uncompress data, and set data pointer to uncompressed version. */
     char *uncompressedData = NULL;
     char *data = NULL;
+    int dataSize = 0;
     if (bbi->uncompressBufSize > 0)
 	{
 	data = uncompressedData = needLargeMem(bbi->uncompressBufSize);
-	size_t uncSize = zUncompress(rawData, block.size, uncompressedData, bbi->uncompressBufSize);
-	assert(uncSize <= bbi->uncompressBufSize);
+	dataSize = zUncompress(rawData, block.size, uncompressedData, bbi->uncompressBufSize);
 	}
     else
+	{
         data = rawData;
+	dataSize = block.size;
+	}
 
     /* Set up for "memRead" routines to more or less treat memory block like file */
-    char *blockPt = data, *blockEnd = data + block.size;
+    char *blockPt = data, *blockEnd = data + dataSize;
     struct dyString *dy = dyStringNew(32); // Keep bits outside of chrom/start/end here
 
 
     /* Read next record into local variables. */
     while (blockPt < blockEnd)
 	{
 	bits32 chromIx = memReadBits32(&blockPt, isSwapped);
 	bits32 s = memReadBits32(&blockPt, isSwapped);
 	bits32 e = memReadBits32(&blockPt, isSwapped);
 	int c;
 	dyStringClear(dy);
 	while ((c = *blockPt++) >= 0)
 	    {
 	    if (c == 0)
 		break;
 	    dyStringAppendC(dy, c);
 	    }
+	uglyf("?%s\n", dy->string);
 	if (startsWithWordByDelimiter(name, '\t', dy->string))
 	    {
 	    char chromName[bbi->chromBpt->keySize+1];
 	    bptStringKeyAtPos(bbi->chromBpt, chromIx, chromName, sizeof(chromName));
 	    fprintf(f, "%s\t%u\t%u\t%s\n", chromName, s, e, dy->string);
 	    didWrite = TRUE;
 	    }
 	}
 
     /* Clean up temporary buffers. */
     dyStringFree(&dy);
     freez(&uncompressedData);
     freez(&rawData);
     }
 return didWrite;