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