static uint16_t EventProbeTranscodeSequence()

in src/LttngHelpers.c [1207:1242]


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

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

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

    memcpy(pContext->pbTranscodeScratch, &cbUtf8Written, sizeof(uint16_t)); // Fill in length.
    return cbUtf8Written;
}