streamsize stringbuf::_M_xsputnc(char_type __char, streamsize __count) { if (((__M_mode & ios_base::out) == 0) || (__count <= 0)) return 0; streamsize __nwritten = 0; // If the put pointer is somewhere in the middle of the string, then overwrite instead of append. if (pbase() == __M_str.begin()) { ptrdiff_t __avail = __M_str.end() - pptr(); if (__avail >= __count) { VOS_memset_s(pptr(), epptr() - pptr(), __char, static_cast<size_t>(__count)); pbump(static_cast<int>(__count)); return __count; } else { VOS_memset_s(pptr(), epptr() - pptr(), __char, __avail); __nwritten += __avail; __count -= __avail; } } // At this point we know we're appending. size_t __app_size = static_cast<size_t>(__count); char_type* __data_ptr; if (__M_mode & ios_base::in) { ptrdiff_t __get_offset = gptr() - eback(); __M_str.append(__app_size, __char); __data_ptr = __M_str.begin(); setg(__data_ptr, __data_ptr + __get_offset, __M_str.end()); } else { __M_str.append(__app_size, __char); __data_ptr = __M_str.begin(); } setp(__data_ptr, __M_str.end()); pbump(static_cast<int>(__M_str.size())); __nwritten += __app_size; return __nwritten; }
streamsize streambuf::_M_xsputnc(char_type __char, streamsize __count) { streamsize __put_count = 0; while (__put_count < __count) { if (__M_pnext < __M_pend) { size_t __chunk = min(static_cast<size_t>(__M_pend - __M_pnext), static_cast<size_t>(__count - __put_count)); VOS_memset_s(__M_pnext, __M_pend - __M_pnext, __char, __chunk); __put_count += __chunk; __M_pnext += __chunk; } else if (overflow(static_cast<int>(__char)) != EOF) { ++__put_count; } else { break; } } return __put_count; }