bug 639: Buffer::CopyData is buggy.
authorNicola Baldo <nbaldo@cttc.es>
Thu, 13 Aug 2009 09:36:16 +0200
changeset 4708 b251fb79becb
parent 4707 3a2013cbb81f
child 4709 b0743dbc4e55
bug 639: Buffer::CopyData is buggy.
src/common/buffer.cc
src/common/buffer.h
--- a/src/common/buffer.cc	Thu Aug 13 09:09:53 2009 +0200
+++ b/src/common/buffer.cc	Thu Aug 13 09:36:16 2009 +0200
@@ -20,6 +20,7 @@
 #include "buffer.h"
 #include "ns3/assert.h"
 #include "ns3/log.h"
+#include "ns3/fatal-error.h"
 #include <iostream>
 
 NS_LOG_COMPONENT_DEFINE ("Buffer");
@@ -646,25 +647,25 @@
 void
 Buffer::CopyData(std::ostream *os, uint32_t size) const
 {
-  if (size == GetSize ())
+  if (size > 0)
     {
-      // fast path
-      os->write((const char*)(m_data->m_data + m_start), m_zeroAreaStart-m_start);
-      char zero = 0;
-      for (uint32_t i = 0; i < m_zeroAreaEnd - m_zeroAreaStart; ++i)
-        {
-          os->write (&zero, 1);
-        }
-      os->write ((const char*)(m_data->m_data + m_zeroAreaStart), m_end - m_zeroAreaEnd);
-    }
-  else
-    {
-      // slow path
-      Buffer::Iterator i = Begin ();
-      while (!i.IsEnd () && size > 0)
-        {
-          char byte = i.ReadU8 ();
-          os->write (&byte, 1);
+      uint32_t tmpsize = std::min (m_zeroAreaStart-m_start, size);
+      os->write((const char*)(m_data->m_data + m_start), tmpsize);
+      if (size > tmpsize) 
+        { 
+          size -= m_zeroAreaStart-m_start;
+          tmpsize = std::min (m_zeroAreaEnd - m_zeroAreaStart, size);
+          char zero = 0;
+          for (uint32_t i = 0; i < tmpsize; ++i)
+            {
+              os->write (&zero, 1);
+            }
+          if (size > tmpsize)
+            {
+              size -= tmpsize;
+              tmpsize = std::min (m_end - m_zeroAreaEnd, size);
+              os->write ((const char*)(m_data->m_data + m_zeroAreaStart), tmpsize); 
+            }
         }
     }
 }
--- a/src/common/buffer.h	Thu Aug 13 09:09:53 2009 +0200
+++ b/src/common/buffer.h	Thu Aug 13 09:36:16 2009 +0200
@@ -487,6 +487,12 @@
   int32_t GetCurrentStartOffset (void) const;
   int32_t GetCurrentEndOffset (void) const;
 
+  /** 
+   * Copy the specified amount of data from the buffer to the given output stream.
+   * 
+   * @param os the output stream
+   * @param size the maximum amount of bytes to copy. If zero, nothing is copied.
+   */
   void CopyData (std::ostream *os, uint32_t size) const;
 
   Buffer (Buffer const &o);