cb217f20b4a701edfa88f4db623266a9bf25202e kent Mon Mar 4 22:58:07 2013 -0800 Some more steps towards supporting multiple extra indexes in bigBed files. diff --git src/lib/bbiRead.c src/lib/bbiRead.c index f8bb53c..af27dd4 100644 --- src/lib/bbiRead.c +++ src/lib/bbiRead.c @@ -102,50 +102,56 @@ } bbi->typeSig = sig; bbi->isSwapped = isSwapped; /* Read rest of defined bits of header, byte swapping as needed. */ bbi->version = udcReadBits16(udc, isSwapped); bbi->zoomLevels = udcReadBits16(udc, isSwapped); bbi->chromTreeOffset = udcReadBits64(udc, isSwapped); bbi->unzoomedDataOffset = udcReadBits64(udc, isSwapped); bbi->unzoomedIndexOffset = udcReadBits64(udc, isSwapped); bbi->fieldCount = udcReadBits16(udc, isSwapped); bbi->definedFieldCount = udcReadBits16(udc, isSwapped); bbi->asOffset = udcReadBits64(udc, isSwapped); bbi->totalSummaryOffset = udcReadBits64(udc, isSwapped); bbi->uncompressBufSize = udcReadBits32(udc, isSwapped); -bbi->nameIndexOffset = udcReadBits64(udc, isSwapped); - -/* Skip over reserved area. */ -udcSeek(udc, 64); // Absolute seek over fixed size 64 bit header +bbi->extensionOffset = udcReadBits64(udc, isSwapped); /* Read zoom headers. */ int i; struct bbiZoomLevel *level, *levelList = NULL; for (i=0; izoomLevels; ++i) { AllocVar(level); level->reductionLevel = udcReadBits32(udc, isSwapped); level->reserved = udcReadBits32(udc, isSwapped); level->dataOffset = udcReadBits64(udc, isSwapped); level->indexOffset = udcReadBits64(udc, isSwapped); slAddHead(&levelList, level); } slReverse(&levelList); bbi->levelList = levelList; +/* Deal with header extension if any. */ +if (bbi->extensionOffset != 0) + { + udcSeek(udc, bbi->extensionOffset); + bbi->extensionSize = udcReadBits16(udc, isSwapped); + bbi->extraIndexCount = udcReadBits16(udc, isSwapped); + bbi->extraIndexListOffset = udcReadBits64(udc, isSwapped); + } + /* Attach B+ tree of chromosome names and ids. */ udcSeek(udc, bbi->chromTreeOffset); bbi->chromBpt = bptFileAttach(fileName, udc); return bbi; } void bbiFileClose(struct bbiFile **pBwf) /* Close down a big wig/big bed file. */ { struct bbiFile *bwf = *pBwf; if (bwf != NULL) { cirTreeFileDetach(&bwf->unzoomedCir); slFreeList(&bwf->levelList);