示例#1
0
int be_speech_context::rawLogEntry(int severity4, int /* severityX */, const pan_slice_t (&ar)[rawLogArrayDimension], size_t cchTotal)
{
    // Define auto_buffer to use Windows process heap

    // Allocate the buffer

    buffer_t buff(cchTotal + 1 + 1);

#ifdef STLSOFT_CF_EXCEPTION_SUPPORT
    // When exception support is not enabled, failure to allocate will yield an empty instance
    if(buff.empty())
    {
        return 0;
    }
    else
#endif /* STLSOFT_CF_EXCEPTION_SUPPORT */
    {
        size_t nWritten = concatenateSlices(&buff[0], buff.size(), rawLogArrayDimension, &ar[0]);

        PANTHEIOS_CONTRACT_ENFORCE_POSTCONDITION_RETURN_INTERNAL(nWritten == cchTotal, "Written length differs from allocated length");

        buff[nWritten++] = '\n';
        buff[nWritten] = '\0';

        PANTHEIOS_CONTRACT_ENFORCE_ASSUMPTION(nWritten + 1 == buff.size());

        // Output

        return this->speak(severity4, buff.data(), nWritten);
    }
}
int WindowsDebugger_Context::rawLogEntry(int /* severity4 */, int /* severityX */, const pan_slice_t (&ar)[rawLogArrayDimension], size_t cchTotal)
{
    // Allocate the buffer

    buffer_t buff(cchTotal + 1 + 1);

#ifdef STLSOFT_CF_EXCEPTION_SUPPORT
    // When exception support is not enabled, failure to allocate will yield an empty instance
    if(buff.empty())
    {
        return 0;
    }
    else
#endif /* STLSOFT_CF_EXCEPTION_SUPPORT */
    {
        size_t nWritten = concatenateSlices(&buff[0], buff.size(), rawLogArrayDimension, &ar[0]);

        PANTHEIOS_CONTRACT_ENFORCE_POSTCONDITION_RETURN_INTERNAL(nWritten == cchTotal, "Written length differs from allocated length");

        buff[nWritten++] = '\n';
        buff[nWritten] = '\0';

        PANTHEIOS_CONTRACT_ENFORCE_ASSUMPTION(nWritten + 1 == buff.size());

        // Output

        pan_OutputDebugString_(&buff[0]);

        return static_cast<int>(nWritten);
    }
}
示例#3
0
void pointer::construct_()
{
    PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(0 == m_sz[0], "cannot construct if value is non-empty");
    PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(0 == m_len, "cannot construct if length is non-0");

    if(static_cast<void const*>(0) == m_value)
    {
        static const pan_char_t  s_null[] = PANTHEIOS_LITERAL_STRING("(null)");

        STLSOFT_STATIC_ASSERT(sizeof(m_sz) >= sizeof(s_null));

        ::memcpy(&m_sz[0], &s_null[0], sizeof(s_null));

        m_len = STLSOFT_NUM_ELEMENTS(s_null) - 1;
    }
    else
    {
        pan_char_t          szFmt[101];
        int                 width;
        pan_char_t const*   zeroX;
        pan_char_t const*   leadingMinus;
        pan_char_t const*   zeroPad;

        if(m_minWidth < 0)
        {
            width           =   -m_minWidth;
            leadingMinus    =   PANTHEIOS_LITERAL_STRING("-");
        }
        else
        {
            width           =   m_minWidth;
            leadingMinus    =   PANTHEIOS_LITERAL_STRING("");
        }

        zeroX   =   (m_format & fmt::zeroXPrefix) ? PANTHEIOS_LITERAL_STRING("0x") : PANTHEIOS_LITERAL_STRING("");
        zeroPad =   (m_format & fmt::zeroPad) ? PANTHEIOS_LITERAL_STRING("0") : PANTHEIOS_LITERAL_STRING("");

        if( 0 != width &&
            fmt::zeroXPrefix == (m_format & (fmt::zeroXPrefix | fmt::zeroPad)))
        {
            // Special case

            pan_char_t szTemp[23]; // 23 is always big enough, since the width is 21

            PANTHEIOS_CONTRACT_ENFORCE_ASSUMPTION(0 == (m_format & fmt::zeroPad));

            // Determine ptr-sized integer type
#if defined(STLSOFT_COMPILER_IS_GCC)
            typedef unsigned long                                             intptr_t_;
#else /* ? compiler */
            typedef stlsoft::int_size_traits<sizeof(void*)>::unsigned_type    intptr_t_;
#endif /* compiler */

            int r = pantheios_util_snprintf(
                        &szTemp[0]
                    ,   STLSOFT_NUM_ELEMENTS(szTemp)
                    ,   PANTHEIOS_LITERAL_STRING("0x%lx")
                    ,   static_cast<intptr_t_>(stlsoft::union_cast<intptr_t_>(m_value))
                    );

            if(r < 0)
            {
                return;
            }
            else
            {
                size_t n = static_cast<size_t>(r);

                PANTHEIOS_CONTRACT_ENFORCE_POSTCONDITION_RETURN_INTERNAL((n + 2) <= STLSOFT_NUM_ELEMENTS(szTemp), "snprintf() overwrote the local buffer capacity");

                width += 2;

                if(static_cast<size_t>(width) > n)
                {
                    if(m_minWidth < 0)
                    {
                        PANTHEIOS_char_copy(&m_sz[0], szTemp, n);
                        std::fill_n(&m_sz[0] + n, size_t(width - n), ' ');
                        m_sz[width] = '\0';
                    }
                    else
                    {
                        std::fill_n(&m_sz[0], size_t(width - n), ' ');
                        PANTHEIOS_char_copy(&m_sz[0] + (size_t(width) - n), szTemp, (n + 1));
                    }

                    m_len = static_cast<size_t>(width);
                }
                else
                {
                    PANTHEIOS_char_copy(&m_sz[0], szTemp, (n + 1));

                    m_len = n;
                }
            }
        }
        else
        {
            pantheios_util_snprintf(&szFmt[0]
                                ,   STLSOFT_NUM_ELEMENTS(szFmt)
                                ,   PANTHEIOS_LITERAL_STRING("%s%%%s%s%dx")
                                ,   zeroX
                                ,   leadingMinus
                                ,   zeroPad
                                ,   width);

            m_len = static_cast<size_t>(pantheios_util_snprintf(&m_sz[0], STLSOFT_NUM_ELEMENTS(m_sz), szFmt, m_value));
        }
    }

    PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(0 != m_sz[0], "failed to set value to non-empty");
    PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(m_len > 0, "failed to set length");
    PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(m_len < 23, "pantheios::pointer string too long");
}
示例#4
0
文件: slice.cpp 项目: dlex/pantheios
void slice_inserter::construct_()
{
    PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(0u == m_buffer.size(), "cannot construct if value is non-empty");

    pan_slice_t         slices[7];
    pan_slice_t const   equals(-1, (NULL != m_equals) ? m_equals : PANTHEIOS_LITERAL_STRING("="));
    pan_char_t          num[21];

    slices[0] = pan_slice_t(-1, m_strName);         // 0: str name
    slices[2] = pan_slice_t(m_str, m_len);          // 2: str
    slices[4] = pan_slice_t(-1, m_lenName);         // 4: len name

    if(0u != slices[0].len)
    {
        slices[1] = equals;                         // 1: equals (for str)
    }
    if(0u != slices[4].len)
    {
        pan_char_t const* separator = (NULL != m_separator) ? m_separator : PANTHEIOS_LITERAL_STRING(", ");

        slices[3] = pan_slice_t(-1, separator);     // 3: separator
        slices[5] = equals;                         // 5: equals (for len)

        size_t              lenLen;
        pan_char_t const*   lenPtr = stlsoft::integer_to_string(&num[0], STLSOFT_NUM_ELEMENTS(num), m_len, &lenLen);

        slices[6] = pan_slice_t(lenPtr, lenLen);
    }

    // calc buffer size, resize, and write all slices into buffer

#if !defined(STLSOFT_COMPILER_IS_BORLAND)

    const size_t n = std::accumulate(   stlsoft::member_selector(slices, &pan_slice_t::len)
                                    ,   stlsoft::member_selector(slices + STLSOFT_NUM_ELEMENTS(slices), &pan_slice_t::len)
                                    ,   size_t(0));

#else /* ? compiler */

    // The crappy way, for less-than compilers
    size_t n = 0;

    { for(size_t i = 0; i != STLSOFT_NUM_ELEMENTS(slices); ++i)
    {
        n += slices[i].len;
    }}

#endif /* compiler */

    m_buffer.resize(n);

    size_t nWritten = 0;

    std::copy(  slices
            ,   slices + STLSOFT_NUM_ELEMENTS(slices)
            ,   stlsoft::cstring_concatenator(&m_buffer[0], &nWritten));

    PANTHEIOS_CONTRACT_ENFORCE_POSTCONDITION_RETURN_INTERNAL(nWritten == n, "Written length differs from allocated length");

    PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(0 != m_buffer[0], "failed to set value to non-empty");
}