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;
}