bug 639: Buffer::CopyData is buggy.
1.1 --- a/src/common/buffer.cc Thu Aug 13 09:09:53 2009 +0200
1.2 +++ b/src/common/buffer.cc Thu Aug 13 09:36:16 2009 +0200
1.3 @@ -20,6 +20,7 @@
1.4 #include "buffer.h"
1.5 #include "ns3/assert.h"
1.6 #include "ns3/log.h"
1.7 +#include "ns3/fatal-error.h"
1.8 #include <iostream>
1.9
1.10 NS_LOG_COMPONENT_DEFINE ("Buffer");
1.11 @@ -646,25 +647,25 @@
1.12 void
1.13 Buffer::CopyData(std::ostream *os, uint32_t size) const
1.14 {
1.15 - if (size == GetSize ())
1.16 + if (size > 0)
1.17 {
1.18 - // fast path
1.19 - os->write((const char*)(m_data->m_data + m_start), m_zeroAreaStart-m_start);
1.20 - char zero = 0;
1.21 - for (uint32_t i = 0; i < m_zeroAreaEnd - m_zeroAreaStart; ++i)
1.22 - {
1.23 - os->write (&zero, 1);
1.24 - }
1.25 - os->write ((const char*)(m_data->m_data + m_zeroAreaStart), m_end - m_zeroAreaEnd);
1.26 - }
1.27 - else
1.28 - {
1.29 - // slow path
1.30 - Buffer::Iterator i = Begin ();
1.31 - while (!i.IsEnd () && size > 0)
1.32 - {
1.33 - char byte = i.ReadU8 ();
1.34 - os->write (&byte, 1);
1.35 + uint32_t tmpsize = std::min (m_zeroAreaStart-m_start, size);
1.36 + os->write((const char*)(m_data->m_data + m_start), tmpsize);
1.37 + if (size > tmpsize)
1.38 + {
1.39 + size -= m_zeroAreaStart-m_start;
1.40 + tmpsize = std::min (m_zeroAreaEnd - m_zeroAreaStart, size);
1.41 + char zero = 0;
1.42 + for (uint32_t i = 0; i < tmpsize; ++i)
1.43 + {
1.44 + os->write (&zero, 1);
1.45 + }
1.46 + if (size > tmpsize)
1.47 + {
1.48 + size -= tmpsize;
1.49 + tmpsize = std::min (m_end - m_zeroAreaEnd, size);
1.50 + os->write ((const char*)(m_data->m_data + m_zeroAreaStart), tmpsize);
1.51 + }
1.52 }
1.53 }
1.54 }
2.1 --- a/src/common/buffer.h Thu Aug 13 09:09:53 2009 +0200
2.2 +++ b/src/common/buffer.h Thu Aug 13 09:36:16 2009 +0200
2.3 @@ -487,6 +487,12 @@
2.4 int32_t GetCurrentStartOffset (void) const;
2.5 int32_t GetCurrentEndOffset (void) const;
2.6
2.7 + /**
2.8 + * Copy the specified amount of data from the buffer to the given output stream.
2.9 + *
2.10 + * @param os the output stream
2.11 + * @param size the maximum amount of bytes to copy. If zero, nothing is copied.
2.12 + */
2.13 void CopyData (std::ostream *os, uint32_t size) const;
2.14
2.15 Buffer (Buffer const &o);