Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}