in sdk/src/azure/core/az_json_token.c [86:149]
AZ_NODISCARD static bool _az_json_token_is_text_equal_helper(
az_span token_slice,
az_span* expected_text,
bool* next_char_escaped)
{
int32_t token_size = az_span_size(token_slice);
uint8_t* token_ptr = az_span_ptr(token_slice);
int32_t expected_size = az_span_size(*expected_text);
uint8_t* expected_ptr = az_span_ptr(*expected_text);
int32_t token_idx = 0;
for (int32_t i = 0; i < expected_size; i++)
{
if (token_idx >= token_size)
{
*expected_text = az_span_slice_to_end(*expected_text, i);
return false;
}
uint8_t token_byte = token_ptr[token_idx];
if (token_byte == '\\' || *next_char_escaped)
{
if (*next_char_escaped)
{
token_byte = _az_json_unescape_single_byte(token_byte);
}
else
{
token_idx++;
if (token_idx >= token_size)
{
*next_char_escaped = true;
*expected_text = az_span_slice_to_end(*expected_text, i);
return false;
}
token_byte = _az_json_unescape_single_byte(token_ptr[token_idx]);
}
*next_char_escaped = false;
// TODO: Characters escaped in the form of \uXXXX where XXXX is the UTF-16 code point, is
// not currently supported.
// To do this, we need to encode UTF-16 codepoints (including surrogate pairs) into UTF-8.
if (token_byte == 'u')
{
*expected_text = AZ_SPAN_EMPTY;
return false;
}
}
if (token_byte != expected_ptr[i])
{
*expected_text = AZ_SPAN_EMPTY;
return false;
}
token_idx++;
}
*expected_text = AZ_SPAN_EMPTY;
// Only return true if the size of the unescaped token matches the expected size exactly.
return token_idx == token_size;
}