streamsize streambuf::xsgetn(char_type* __buf, streamsize __buf_size) { streamsize __get_count = 0; while (__get_count < __buf_size) { if (__M_gnext < __M_gend) { size_t __chunk = min(static_cast<size_t>(__M_gend - __M_gnext), static_cast<size_t>(__buf_size - __get_count)); VOS_memcpy_s(__buf, __buf_size - __get_count, __M_gnext, __chunk); __get_count += __chunk; __buf += __chunk; __M_gnext += __chunk; } else { int_type __char = sbumpc(); if (__char != EOF) { *__buf = static_cast<char>(__char); ++__get_count; ++__buf; } else { break; } } } return __get_count; }
streamsize streambuf::xsputn(const char_type* __src_buf, streamsize __buf_size) { streamsize __put_count = 0; while (__put_count < __buf_size) { if (__M_pnext < __M_pend) { size_t __chunk = min(static_cast<size_t>(__M_pend - __M_pnext), static_cast<size_t>(__buf_size - __put_count)); VOS_memcpy_s(__M_pnext, __M_pend - __M_pnext, __src_buf, __chunk); __put_count += __chunk; __src_buf += __chunk; __M_pnext += __chunk; } else if (overflow(static_cast<int>(*__src_buf)) != EOF) { ++__put_count; ++__src_buf; } else { break; } } return __put_count; }
streamsize stringbuf::xsputn(const char_type* __string, streamsize __length) { if (((__M_mode & ios_base::out) == 0) || (__length <= 0)) return 0; streamsize __nwritten = 0; // If the put pointer is somewhere in the middle of the string, then overwrite instead of append. if (!__M_str.empty() && (pbase() == __M_str.begin())) { ptrdiff_t __avail = __M_str.end() - pptr(); if (__avail >= __length) { VOS_memcpy_s(pptr(), epptr() - pptr(), __string, static_cast<size_t>(__length)); pbump(static_cast<int>(__length)); return __length; } else { VOS_memcpy_s(pptr(), epptr() - pptr(), __string, __avail); __nwritten += __avail; __length -= __avail; __string += __avail; } } // At this point we know we're appending. char_type* __data_ptr; if (__M_mode & ios_base::in) { ptrdiff_t __get_offset = gptr() - eback(); __M_str.append(__string, __string + static_cast<ptrdiff_t>(__length)); __data_ptr = __M_str.begin(); setg(__data_ptr, __data_ptr + __get_offset, __M_str.end()); } else { __M_str.append(__string, __string + static_cast<ptrdiff_t>(__length)); __data_ptr = __M_str.begin(); } setp(__data_ptr, __M_str.end()); pbump(static_cast<int>(__M_str.size())); __nwritten += __length; return __nwritten; }
void _VectorBase::_M_push_back(const void* __data, size_t __unit_size) { STL_ASSERT((_M_get_finish() >= _M_get_start()) && (_M_get_end_of_storage() >= _M_get_finish()) && (__data != NULL)); if (__M_finish != __M_end_of_storage) { VOS_memcpy_s(__M_finish, __unit_size, __data, __unit_size); __M_finish = _M_get_finish() + __unit_size; } else { _M_insert_overflow(__M_finish, 1, __data, __unit_size); } }