bug 639: Buffer::CopyData is buggy.
authorNicola Baldo <nbaldo@cttc.es>
Thu Aug 13 09:36:16 2009 +0200 (2009-08-13)
changeset 4708b251fb79becb
parent 4707 3a2013cbb81f
child 4709 b0743dbc4e55
bug 639: Buffer::CopyData is buggy.
src/common/buffer.cc
src/common/buffer.h
     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);