o Replaced WIN32 directory scanner with dirent_win.h
[asdcplib.git] / src / KM_memio.h
index 5349749b829d87e4751c7c3a1e879a2fbc35b6c6..caf4fc0aca0f48a1517a8a6bbd1c93822baa0c90 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2006-2010, John Hurst
+Copyright (c) 2006-2011, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -122,13 +122,13 @@ namespace Kumu
        return true;
       }
 
-      inline bool WriteString(const std::string& str)
-      {
-       if ( ! WriteUi32BE(str.length()) ) return false;
-       if ( ! WriteRaw((const byte_t*)str.c_str(), str.length()) ) return false;
+      inline bool WriteString(const std::string& str) {
+       ui32_t len = static_cast<ui32_t>(str.length());
+       if ( ! WriteUi32BE(len) ) return false;
+       if ( ! WriteRaw((const byte_t*)str.c_str(), len) ) return false;
        return true;
       }
-    };
+   };
 
   //
   class MemIOReader
@@ -217,11 +217,16 @@ namespace Kumu
 
       inline bool ReadString(std::string& str)
       {
-       ui32_t str_length;
+       ui32_t str_length = 0;
        if ( ! ReadUi32BE(&str_length) ) return false;
-       if ( ( m_size + str_length ) > m_capacity ) return false;
-       str.assign((const char*)CurrentData(), str_length);
-       if ( ! SkipOffset(str_length) ) return false;
+
+       if ( str_length > 0 )
+         {
+           if ( ( m_size + str_length ) > m_capacity ) return false;
+           str.assign((const char*)CurrentData(), str_length);
+           if ( ! SkipOffset(str_length) ) return false;
+         }
+
        return true;
       }
     };