Modified Deserializer::ReadCStr to allow C-strings to be read into a
authorTed Kremenek <kremenek@apple.com>
Mon, 17 Dec 2007 22:25:12 +0000 (22:25 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 17 Dec 2007 22:25:12 +0000 (22:25 +0000)
std::vector<char> starting from any index in the vector.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45129 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Bitcode/Deserialize.h
lib/Bitcode/Reader/Deserialize.cpp

index 430100ee286756f96a911cacd4d0e74022512e01..dc1cdc0898dcee919fd874c71670d40340677572 100644 (file)
@@ -156,7 +156,7 @@ public:
   }
   
   char* ReadCStr(char* cstr = NULL, unsigned MaxLen=0, bool isNullTerm=true);
-  void ReadCStr(std::vector<char>& buff, bool isNullTerm=false);
+  void ReadCStr(std::vector<char>& buff, bool isNullTerm=false, unsigned Idx=0);
 
   template <typename T>
   inline T* ReadOwnedPtr(bool AutoRegister = true) {
index cb32f7d5efefd83ee10ed342e63a68292d9a2e83..8e0b62c509506a4de02654804c8eed5f74a33741 100644 (file)
@@ -329,11 +329,18 @@ char* Deserializer::ReadCStr(char* cstr, unsigned MaxLen, bool isNullTerm) {
   return cstr;
 }
 
-void Deserializer::ReadCStr(std::vector<char>& buff, bool isNullTerm) {
+void Deserializer::ReadCStr(std::vector<char>& buff, bool isNullTerm,
+                            unsigned Idx) {
+  
   unsigned len = ReadInt();
 
-  buff.clear();  
-  buff.reserve(len);
+  // If Idx is beyond the current before size, reduce Idx to refer to the
+  // element after the last element.
+  if (Idx > buff.size())
+    Idx = buff.size();
+
+  buff.reserve(len+Idx);
+  buff.resize(Idx);      
   
   for (unsigned i = 0; i < len; ++i)
     buff.push_back((char) ReadInt());