1 /* 2 * 3 * Copyright (c) 2004 4 * John Maddock 5 * 6 * Use, modification and distribution are subject to the 7 * Boost Software License, Version 1.0. (See accompanying file 8 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 * 10 */ 11 12 /* 13 * LOCATION: see http://www.boost.org for most recent version. 14 * FILE regex_raw_buffer.cpp 15 * VERSION see <boost/version.hpp> 16 * DESCRIPTION: Member functions for class raw_storage. 17 */ 18 19 20 #define BOOST_REGEX_SOURCE 21 #include <boost/config.hpp> 22 #include <memory> 23 #include <cstring> 24 #include <boost/assert.hpp> 25 #include <boost/regex/v4/regex_raw_buffer.hpp> 26 27 #if defined(BOOST_NO_STDC_NAMESPACE) 28 namespace std{ 29 using ::memcpy; 30 using ::memmove; 31 } 32 #endif 33 34 35 namespace boost{ namespace BOOST_REGEX_DETAIL_NS{ 36 resize(size_type n)37void BOOST_REGEX_CALL raw_storage::resize(size_type n) 38 { 39 size_type newsize = start ? last - start : 1024; 40 while(newsize < n) 41 newsize *= 2; 42 size_type datasize = end - start; 43 // extend newsize to WORD/DWORD boundary: 44 newsize = (newsize + padding_mask) & ~(padding_mask); 45 46 // allocate and copy data: 47 pointer ptr = static_cast<pointer>(::operator new(newsize)); 48 BOOST_REGEX_NOEH_ASSERT(ptr) 49 if(start) 50 std::memcpy(ptr, start, datasize); 51 52 // get rid of old buffer: 53 ::operator delete(start); 54 55 // and set up pointers: 56 start = ptr; 57 end = ptr + datasize; 58 last = ptr + newsize; 59 } 60 insert(size_type pos,size_type n)61void* BOOST_REGEX_CALL raw_storage::insert(size_type pos, size_type n) 62 { 63 BOOST_ASSERT(pos <= size_type(end - start)); 64 if(size_type(last - end) < n) 65 resize(n + (end - start)); 66 void* result = start + pos; 67 std::memmove(start + pos + n, start + pos, (end - start) - pos); 68 end += n; 69 return result; 70 } 71 72 }} // namespaces 73