AZ_NODISCARD static bool _az_json_token_is_text_equal_helper()

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