static uint16_t EventProbeTranscodeString()

in src/LttngHelpers.c [1168:1205]


static uint16_t EventProbeTranscodeString(
    struct lttngh_EventProbeContext* pContext,
    struct lttngh_DataDesc const* pDataDesc)
    lttng_ust_notrace;
static uint16_t EventProbeTranscodeString(
    struct lttngh_EventProbeContext* pContext,
    struct lttngh_DataDesc const* pDataDesc)
{
    assert(pDataDesc->Length <= pContext->cbTranscodeScratch - 1);

    uint16_t cbUtf8Written;
    if (pDataDesc->Type == lttngh_DataType_StringUtf16Transcoded)
    {
        cbUtf8Written = (uint16_t)Utf16ToUtf8(
            (char16_t const*)pDataDesc->Data, (unsigned)(pDataDesc->Size / sizeof(char16_t)),
            pContext->pbTranscodeScratch, pDataDesc->Length);
    }
    else
    {
        cbUtf8Written = (uint16_t)Utf32ToUtf8(
            (char32_t const*)pDataDesc->Data, (unsigned)(pDataDesc->Size / sizeof(char32_t)),
            pContext->pbTranscodeScratch, pDataDesc->Length);
    }

    pContext->pbTranscodeScratch[cbUtf8Written] = 0;
    size_t iNul = strlen((char*)pContext->pbTranscodeScratch);
    if (caa_unlikely(iNul != pDataDesc->Length))
    {
        // The data was changed on another thread or was truncated at a multi-byte char, so append #s.
        assert(iNul <= cbUtf8Written);
        assert(cbUtf8Written < pDataDesc->Length);
        memset(pContext->pbTranscodeScratch + iNul,
            '#', pDataDesc->Length - iNul);
        pContext->pbTranscodeScratch[pDataDesc->Length] = 0;
    }

    return cbUtf8Written;
}