X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Fapi%2Finternal%2Fbam%2FBamWriter_p.cpp;h=97a9a12d4b98b7ffaa1bf06a51ed0d568dd381b1;hb=db80a3a8da82dcdbd460fd03f098a33f3c6b13e6;hp=ba4989f48b7b47321e178f7c4a271928ee9b8d22;hpb=8077f86ef52bfb08c17430b797c737d217d41cf3;p=bamtools.git diff --git a/src/api/internal/bam/BamWriter_p.cpp b/src/api/internal/bam/BamWriter_p.cpp index ba4989f..97a9a12 100644 --- a/src/api/internal/bam/BamWriter_p.cpp +++ b/src/api/internal/bam/BamWriter_p.cpp @@ -2,7 +2,7 @@ // BamWriter_p.cpp (c) 2010 Derek Barnett // Marth Lab, Department of Biology, Boston College // --------------------------------------------------------------------------- -// Last modified: 25 October 2011 (DB) +// Last modified: 13 February 2012 (DB) // --------------------------------------------------------------------------- // Provides the basic functionality for producing BAM files // *************************************************************************** @@ -283,7 +283,7 @@ void BamWriterPrivate::WriteAlignment(const BamAlignment& al) { pBaseQualities[i] -= 33; // FASTQ conversion m_stream.Write(pBaseQualities, queryLength); - // write the read group tag + // write the tag data if ( m_isBigEndian ) { char* tagData = new char[tagDataLength](); @@ -434,13 +434,14 @@ void BamWriterPrivate::WriteReferences(const BamTools::RefVector& referenceSeque RefVector::const_iterator rsEnd = referenceSequences.end(); for ( ; rsIter != rsEnd; ++rsIter ) { - // write the reference sequence name length - uint32_t referenceSequenceNameLen = rsIter->RefName.size() + 1; - if ( m_isBigEndian ) BamTools::SwapEndian_32(referenceSequenceNameLen); - m_stream.Write((char*)&referenceSequenceNameLen, Constants::BAM_SIZEOF_INT); + // write the reference sequence name length (+1 for terminator) + const uint32_t actualNameLen = rsIter->RefName.size() + 1; + uint32_t maybeSwappedNameLen = actualNameLen; + if ( m_isBigEndian ) BamTools::SwapEndian_32(maybeSwappedNameLen); + m_stream.Write((char*)&maybeSwappedNameLen, Constants::BAM_SIZEOF_INT); // write the reference sequence name - m_stream.Write(rsIter->RefName.c_str(), referenceSequenceNameLen); + m_stream.Write(rsIter->RefName.c_str(), actualNameLen); // write the reference sequence length int32_t referenceLength = rsIter->RefLength; @@ -452,11 +453,12 @@ void BamWriterPrivate::WriteReferences(const BamTools::RefVector& referenceSeque void BamWriterPrivate::WriteSamHeaderText(const std::string& samHeaderText) { // write the SAM header text length - uint32_t samHeaderLen = samHeaderText.size(); - if ( m_isBigEndian ) BamTools::SwapEndian_32(samHeaderLen); - m_stream.Write((char*)&samHeaderLen, Constants::BAM_SIZEOF_INT); + const uint32_t actualHeaderLen = samHeaderText.size(); + uint32_t maybeSwappedHeaderLen = samHeaderText.size(); + if ( m_isBigEndian ) BamTools::SwapEndian_32(maybeSwappedHeaderLen); + m_stream.Write((char*)&maybeSwappedHeaderLen, Constants::BAM_SIZEOF_INT); // write the SAM header text - if ( samHeaderLen > 0 ) - m_stream.Write(samHeaderText.data(), samHeaderLen); + if ( actualHeaderLen > 0 ) + m_stream.Write(samHeaderText.data(), actualHeaderLen); }