// Marth Lab, Department of Biology, Boston College\r
// All rights reserved.\r
// ---------------------------------------------------------------------------\r
-// Last modified: 8 December 2009 (DB)\r
+// Last modified: 11 January 2010 (DB)\r
// ---------------------------------------------------------------------------\r
// BGZF routines were adapted from the bgzf.c code developed at the Broad\r
// Institute.\r
\r
// destructor\r
BgzfData::~BgzfData(void) {\r
- if(CompressedBlock) delete [] CompressedBlock;\r
- if(UncompressedBlock) delete [] UncompressedBlock;\r
+ if(CompressedBlock) { delete[] CompressedBlock; }\r
+ if(UncompressedBlock) { delete[] UncompressedBlock; }\r
}\r
\r
// closes BGZF file\r
IsOpen = false;\r
\r
// flush the current BGZF block\r
- if ( IsWriteOnly ) { FlushBlock(); }\r
+ if (IsWriteOnly) { FlushBlock(); }\r
\r
// write an empty block (as EOF marker)\r
int blockLength = DeflateBlock();\r
\r
// initialize the gzip header\r
char* buffer = CompressedBlock;\r
- unsigned int bufferSize = CompressedBlockSize;\r
-\r
memset(buffer, 0, 18);\r
buffer[0] = GZIP_ID1;\r
buffer[1] = (char)GZIP_ID2;\r
// loop to retry for blocks that do not compress enough\r
int inputLength = BlockOffset;\r
int compressedLength = 0;\r
+ unsigned int bufferSize = CompressedBlockSize;\r
\r
while(true) {\r
-\r
+ \r
+ // initialize zstream values\r
z_stream zs;\r
zs.zalloc = NULL;\r
zs.zfree = NULL;\r
zs.avail_in = inputLength;\r
zs.next_out = (Bytef*)&buffer[BLOCK_HEADER_LENGTH];\r
zs.avail_out = bufferSize - BLOCK_HEADER_LENGTH - BLOCK_FOOTER_LENGTH;\r
-\r
+ \r
// initialize the zlib compression algorithm\r
if(deflateInit2(&zs, Z_DEFAULT_COMPRESSION, Z_DEFLATED, GZIP_WINDOW_BITS, Z_DEFAULT_MEM_LEVEL, Z_DEFAULT_STRATEGY) != Z_OK) {\r
printf("ERROR: zlib deflate initialization failed.\n");\r
if(numBytesWritten != blockLength) {\r
printf("ERROR: Expected to write %u bytes during flushing, but wrote %u bytes.\n", blockLength, numBytesWritten);\r
exit(1);\r
- }\r
-\r
+ }\r
+ \r
BlockAddress += blockLength;\r
}\r
}\r
\r
void BgzfData::Open(const string& filename, const char* mode) {\r
\r
+ // determine open mode\r
if ( strcmp(mode, "rb") == 0 ) {\r
IsWriteOnly = false;\r
} else if ( strcmp(mode, "wb") == 0) {\r
exit(1);\r
}\r
\r
- Stream = fopen(filename.c_str(), mode);\r
+ // open Stream to read to/write from file, stdin, or stdout\r
+ // stdin/stdout option contributed by Aaron Quinlan (2010-Jan-03)\r
+ if ( (filename != "stdin") && (filename != "stdout") ) {\r
+ // read/wrtie BGZF data to/from a file\r
+ Stream = fopen(filename.c_str(), mode);\r
+ }\r
+ else if ( (filename == "stdin") && (strcmp(mode, "rb") == 0 ) ) { \r
+ // read BGZF data from stdin\r
+ Stream = freopen(NULL, mode, stdin);\r
+ }\r
+ else if ( (filename == "stdout") && (strcmp(mode, "wb") == 0) ) { \r
+ // write BGZF data to stdout\r
+ Stream = freopen(NULL, mode, stdout);\r
+ }\r
+ \r
if(!Stream) {\r
printf("ERROR: Unable to open the BAM file %s\n", filename.c_str() );\r
exit(1);\r
// Marth Lab, Department of Biology, Boston College\r
// All rights reserved.\r
// ---------------------------------------------------------------------------\r
-// Last modified: 8 December 2009 (DB)\r
+// Last modified: 11 January 2010 (DB)\r
// ---------------------------------------------------------------------------\r
// BGZF routines were adapted from the bgzf.c code developed at the Broad\r
// Institute.\r
#include "zlib.h"\r
\r
// Platform-specific type definitions\r
-#ifdef _MSC_VER\r
- typedef char int8_t;\r
- typedef unsigned char uint8_t;\r
- typedef short int16_t;\r
- typedef unsigned short uint16_t;\r
- typedef int int32_t;\r
- typedef unsigned int uint32_t;\r
- typedef long long int64_t;\r
- typedef unsigned long long uint64_t;\r
-#else\r
- #include <stdint.h>\r
-#endif\r
+#ifndef BAMTOOLS_TYPES\r
+#define BAMTOOLS_TYPES\r
+ #ifdef _MSC_VER\r
+ typedef char int8_t;\r
+ typedef unsigned char uint8_t;\r
+ typedef short int16_t;\r
+ typedef unsigned short uint16_t;\r
+ typedef int int32_t;\r
+ typedef unsigned int uint32_t;\r
+ typedef long long int64_t;\r
+ typedef unsigned long long uint64_t;\r
+ #else\r
+ #include <stdint.h>\r
+ #endif\r
+#endif // BAMTOOLS_TYPES\r
\r
namespace BamTools {\r
\r
\r
inline\r
bool BgzfData::CheckBlockHeader(char* header) {\r
-\r
return (header[0] == GZIP_ID1 &&\r
header[1] == (char)GZIP_ID2 &&\r
header[2] == Z_DEFLATED &&\r
// unpacks a buffer into an unsigned short\r
inline\r
unsigned short BgzfData::UnpackUnsignedShort(char* buffer) {\r
- union { unsigned short value; unsigned char valueBuffer[sizeof(unsigned short)];} un;\r
+ union { unsigned short value; unsigned char valueBuffer[sizeof(unsigned short)]; } un;\r
un.value = 0;\r
un.valueBuffer[0] = buffer[0];\r
un.valueBuffer[1] = buffer[1];\r
// Marth Lab, Department of Biology, Boston College\r
// All rights reserved.\r
// ---------------------------------------------------------------------------\r
-// Last modified: 8 December 2009 (DB)\r
+// Last modified: 11 December 2009 (DB)\r
// ---------------------------------------------------------------------------\r
// Provides the basic constants, data structures, etc. for using BAM files\r
// ***************************************************************************\r
#include <utility>\r
#include <vector>\r
\r
+// Platform-specific type definitions\r
+#ifndef BAMTOOLS_TYPES\r
+#define BAMTOOLS_TYPES\r
+ #ifdef _MSC_VER\r
+ typedef char int8_t;\r
+ typedef unsigned char uint8_t;\r
+ typedef short int16_t;\r
+ typedef unsigned short uint16_t;\r
+ typedef int int32_t;\r
+ typedef unsigned int uint32_t;\r
+ typedef long long int64_t;\r
+ typedef unsigned long long uint64_t;\r
+ #else\r
+ #include <stdint.h>\r
+ #endif\r
+#endif // BAMTOOLS_TYPES\r
+\r
namespace BamTools {\r
\r
// BAM constants\r
// Marth Lab, Department of Biology, Boston College\r
// All rights reserved.\r
// ---------------------------------------------------------------------------\r
-// Last modified: 8 December 2009 (DB)\r
+// Last modified: 11 January 2010(DB)\r
// ---------------------------------------------------------------------------\r
// Uses BGZF routines were adapted from the bgzf.c code developed at the Broad\r
// Institute.\r
return false;\r
}\r
\r
+ size_t elementsRead = 0;\r
+ \r
// see if index is valid BAM index\r
char magic[4];\r
- fread(magic, 1, 4, indexStream);\r
+ elementsRead = fread(magic, 1, 4, indexStream);\r
if (strncmp(magic, "BAI\1", 4)) {\r
printf("Problem with index file - invalid format.\n");\r
fclose(indexStream);\r
\r
// get number of reference sequences\r
uint32_t numRefSeqs;\r
- fread(&numRefSeqs, 4, 1, indexStream);\r
+ elementsRead = fread(&numRefSeqs, 4, 1, indexStream);\r
\r
// intialize space for BamIndex data structure\r
Index.reserve(numRefSeqs);\r
\r
// get number of bins for this reference sequence\r
int32_t numBins;\r
- fread(&numBins, 4, 1, indexStream);\r
+ elementsRead = fread(&numBins, 4, 1, indexStream);\r
\r
if (numBins > 0) {\r
RefData& refEntry = References[i];\r
\r
// get binID\r
uint32_t binID;\r
- fread(&binID, 4, 1, indexStream);\r
+ elementsRead = fread(&binID, 4, 1, indexStream);\r
\r
// get number of regionChunks in this bin\r
uint32_t numChunks;\r
- fread(&numChunks, 4, 1, indexStream);\r
+ elementsRead = fread(&numChunks, 4, 1, indexStream);\r
\r
// intialize ChunkVector\r
ChunkVector regionChunks;\r
// get chunk boundaries (left, right)\r
uint64_t left;\r
uint64_t right;\r
- fread(&left, 8, 1, indexStream);\r
- fread(&right, 8, 1, indexStream);\r
+ elementsRead = fread(&left, 8, 1, indexStream);\r
+ elementsRead = fread(&right, 8, 1, indexStream);\r
\r
// save ChunkPair\r
regionChunks.push_back( Chunk(left, right) );\r
\r
// get number of linear offsets\r
int32_t numLinearOffsets;\r
- fread(&numLinearOffsets, 4, 1, indexStream);\r
+ elementsRead = fread(&numLinearOffsets, 4, 1, indexStream);\r
\r
// intialize LinearOffsetVector\r
LinearOffsetVector offsets;\r
uint64_t linearOffset;\r
for (int j = 0; j < numLinearOffsets; ++j) {\r
// read a linear offset & store\r
- fread(&linearOffset, 8, 1, indexStream);\r
+ elementsRead = fread(&linearOffset, 8, 1, indexStream);\r
offsets.push_back(linearOffset);\r
}\r
\r