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