/** * Check if two literals are equal * * @return true if equal * false otherwise */ bool lit_literal_equal (literal_t lit1, /**< first literal */ literal_t lit2) /**< second literal */ { switch (lit2->get_type ()) { case lit_literal_storage_t::LIT_STR: { return lit_literal_equal_charset_rec (lit1, static_cast<lit_charset_record_t *>(lit2)); } case lit_literal_storage_t::LIT_MAGIC_STR: { lit_magic_string_id_t magic_str_id = lit_magic_record_get_magic_str_id (lit2); return lit_literal_equal_utf8 (lit1, lit_get_magic_string_utf8 (magic_str_id), lit_get_magic_string_size (magic_str_id)); } case lit_literal_storage_t::LIT_MAGIC_STR_EX: { lit_magic_string_ex_id_t magic_str_ex_id = lit_magic_record_ex_get_magic_str_id (lit2); return lit_literal_equal_utf8 (lit1, lit_get_magic_string_ex_utf8 (magic_str_ex_id), lit_get_magic_string_ex_size (magic_str_ex_id)); } case lit_literal_storage_t::LIT_NUMBER: { return lit_literal_equal_num (lit1, static_cast<lit_number_record_t *>(lit2)->get_number ()); } default: { JERRY_UNREACHABLE (); } } } /* lit_literal_equal */
/** * Get the contents of the literal as a zero-terminated string. * If literal is a magic string record, the corresponding string is not copied to the buffer, * but is returned directly. * * @return pointer to the zero-terminated string. */ const lit_utf8_byte_t * lit_literal_to_utf8_string (literal_t lit, /**< literal to be processed */ lit_utf8_byte_t *buff_p, /**< buffer to use as a string storage */ size_t size) /**< size of the buffer */ { JERRY_ASSERT (buff_p != NULL && size > 0); rcs_record_t::type_t type = lit->get_type (); switch (type) { case LIT_STR_T: { lit_charset_record_t *ch_rec_p = static_cast<lit_charset_record_t *> (lit); ch_rec_p->get_charset (buff_p, size); return buff_p; } case LIT_MAGIC_STR_T: { return lit_get_magic_string_utf8 (lit_magic_record_get_magic_str_id (lit)); } case LIT_MAGIC_STR_EX_T: { return lit_get_magic_string_ex_utf8 (lit_magic_record_ex_get_magic_str_id (lit)); } case LIT_NUMBER_T: { ecma_number_to_utf8_string (static_cast<lit_number_record_t *> (lit)->get_number (), buff_p, (ssize_t)size); return buff_p; } default: JERRY_UNREACHABLE (); } JERRY_UNREACHABLE (); } /* lit_literal_to_utf8_string */
/** * Check if literal equals to zero-terminated string * * @return true if equal * false otherwise */ bool lit_literal_equal_zt (literal_t lit, /**< literal to compare */ const ecma_char_t *str) /**< zero-terminated string to compare */ { switch (lit->get_type ()) { case LIT_STR_T: { return static_cast<lit_charset_record_t *>(lit)->equal_zt (str); } case LIT_MAGIC_STR_T: { ecma_magic_string_id_t magic_id = lit_magic_record_get_magic_str_id (lit); return ecma_compare_zt_strings (str, ecma_get_magic_string_zt (magic_id)); } case LIT_MAGIC_STR_EX_T: { ecma_magic_string_ex_id_t magic_id = lit_magic_record_ex_get_magic_str_id (lit); return ecma_compare_zt_strings (str, ecma_get_magic_string_ex_zt (magic_id)); } case LIT_NUMBER_T: { ecma_char_t buff[ECMA_MAX_CHARS_IN_STRINGIFIED_NUMBER]; ecma_number_to_zt_string (static_cast<lit_number_record_t *>(lit)->get_number (), buff, ECMA_MAX_CHARS_IN_STRINGIFIED_NUMBER); return ecma_compare_zt_strings (str, buff); } default: { JERRY_UNREACHABLE (); } } } /* lit_literal_equal_zt */
/** * Check if literal equals to charset record * * @return true if equal * false otherwise */ static bool lit_literal_equal_charset_rec (literal_t lit, /**< literal to compare */ lit_charset_record_t *record) /**< charset record to compare */ { switch (lit->get_type ()) { case LIT_STR_T: { return static_cast<lit_charset_record_t *>(lit)->equal (record); } case LIT_MAGIC_STR_T: { return record->equal_zt (ecma_get_magic_string_zt (lit_magic_record_get_magic_str_id (lit))); } case LIT_MAGIC_STR_EX_T: { return record->equal_zt (ecma_get_magic_string_ex_zt (lit_magic_record_ex_get_magic_str_id (lit))); } case LIT_NUMBER_T: { ecma_char_t buff[ECMA_MAX_CHARS_IN_STRINGIFIED_NUMBER]; ecma_number_to_zt_string (static_cast<lit_number_record_t *>(lit)->get_number (), buff, ECMA_MAX_CHARS_IN_STRINGIFIED_NUMBER); return record->equal_zt (buff); } default: { JERRY_UNREACHABLE (); } } } /* lit_literal_equal_charset_rec */
/** * Find a literal in literal storage. * Only charset and magic string records are checked during search. * * @return pointer to a literal or NULL if no corresponding literal exists */ literal_t lit_find_literal_by_utf8_string (const lit_utf8_byte_t *str_p, /**< a string to search for */ lit_utf8_size_t str_size) /**< length of the string */ { JERRY_ASSERT (str_p || !str_size); for (literal_t lit = lit_storage.get_first (); lit != NULL; lit = lit_storage.get_next (lit)) { rcs_record_t::type_t type = lit->get_type (); if (type == LIT_STR_T) { if (static_cast<lit_charset_record_t *>(lit)->get_length () != str_size) { continue; } if (!static_cast<lit_charset_record_t *>(lit)->compare_utf8 (str_p, str_size)) { return lit; } } else if (type == LIT_MAGIC_STR_T) { lit_magic_string_id_t magic_id = lit_magic_record_get_magic_str_id (lit); const lit_utf8_byte_t *magic_str_p = lit_get_magic_string_utf8 (magic_id); if (lit_zt_utf8_string_size (magic_str_p) != str_size) { continue; } if (!strncmp ((const char *) magic_str_p, (const char *) str_p, str_size)) { return lit; } } else if (type == LIT_MAGIC_STR_EX_T) { lit_magic_string_ex_id_t magic_id = lit_magic_record_ex_get_magic_str_id (lit); const lit_utf8_byte_t *magic_str_p = lit_get_magic_string_ex_utf8 (magic_id); if (lit_zt_utf8_string_size (magic_str_p) != str_size) { continue; } if (!strncmp ((const char *) magic_str_p, (const char *) str_p, str_size)) { return lit; } } } return NULL; } /* lit_find_literal_by_utf8_string */
/** * Find a literal in literal storage. * Only charset and magic string records are checked during search. * * @return pointer to a literal or NULL if no corresponding literal exists */ literal_t lit_find_literal_by_charset (const ecma_char_t *str, /**< a string to search for */ ecma_length_t len) /**< length of the string */ { JERRY_ASSERT (str || !len); for (literal_t lit = lit_storage.get_first (); lit != NULL; lit = lit_storage.get_next (lit)) { rcs_record_t::type_t type = lit->get_type (); if (type == LIT_STR_T) { if (static_cast<lit_charset_record_t *>(lit)->get_length () != len) { continue; } if (!static_cast<lit_charset_record_t *>(lit)->compare_zt (str, len)) { return lit; } } else if (type == LIT_MAGIC_STR_T) { ecma_magic_string_id_t magic_id = lit_magic_record_get_magic_str_id (lit); const char *magic_str = (const char *) ecma_get_magic_string_zt (magic_id); if (strlen (magic_str) != len) { continue; } if (!strncmp (magic_str, (const char *) str, strlen (magic_str))) { return lit; } } else if (type == LIT_MAGIC_STR_EX_T) { ecma_magic_string_ex_id_t magic_id = lit_magic_record_ex_get_magic_str_id (lit); const char *magic_str = (const char *) ecma_get_magic_string_ex_zt (magic_id); if (strlen (magic_str) != len) { continue; } if (!strncmp (magic_str, (const char *) str, strlen (magic_str))) { return lit; } } } return NULL; } /* lit_find_literal_by_charset */
/** * Get the contents of the literal as a zero-terminated string. * If literal is a magic string record, the corresponding string is not copied to the buffer, * but is returned directly. * * @return pointer to the zero-terminated string. */ const ecma_char_t * lit_literal_to_charset (literal_t lit, /**< literal to be processed */ ecma_char_t *buff, /**< buffer to use as a string storage */ size_t size) /**< size of the buffer */ { JERRY_ASSERT (buff != NULL && size > sizeof (ecma_char_t)); rcs_record_t::type_t type = lit->get_type (); switch (type) { case LIT_STR_T: { lit_charset_record_t *ch_rec_p = static_cast<lit_charset_record_t *> (lit); ecma_length_t index = ch_rec_p->get_charset (buff, size); if (index != 0 && ((size_t)index + 1) * sizeof (ecma_char_t) > size) { index--; } buff[index] = '\0'; return buff; } case LIT_MAGIC_STR_T: { return ecma_get_magic_string_zt (lit_magic_record_get_magic_str_id (lit)); } case LIT_MAGIC_STR_EX_T: { return ecma_get_magic_string_ex_zt (lit_magic_record_ex_get_magic_str_id (lit)); } case LIT_NUMBER_T: { ecma_number_to_zt_string (static_cast<lit_number_record_t *> (lit)->get_number (), buff, (ssize_t)size); return buff; } default: JERRY_UNREACHABLE (); } JERRY_UNREACHABLE (); } /* lit_literal_to_charset */
/** * Check if literal equals to charset record * * @return true if is_equal * false otherwise */ static bool lit_literal_equal_charset_rec (literal_t lit, /**< literal to compare */ lit_charset_record_t *record) /**< charset record to compare */ { switch (lit->get_type ()) { case LIT_STR_T: { return static_cast<lit_charset_record_t *>(lit)->is_equal (record); } case LIT_MAGIC_STR_T: { lit_magic_string_id_t magic_string_id = lit_magic_record_get_magic_str_id (lit); return record->is_equal_utf8_string (lit_get_magic_string_utf8 (magic_string_id), lit_get_magic_string_size (magic_string_id)); } case LIT_MAGIC_STR_EX_T: { lit_magic_string_ex_id_t magic_string_id = lit_magic_record_ex_get_magic_str_id (lit); return record->is_equal_utf8_string (lit_get_magic_string_ex_utf8 (magic_string_id), lit_get_magic_string_ex_size (magic_string_id)); } case LIT_NUMBER_T: { lit_utf8_byte_t buff[ECMA_MAX_CHARS_IN_STRINGIFIED_NUMBER]; lit_utf8_size_t copied = ecma_number_to_utf8_string (static_cast<lit_number_record_t *>(lit)->get_number (), buff, sizeof (buff)); return record->is_equal_utf8_string (buff, copied); } default: { JERRY_UNREACHABLE (); } } } /* lit_literal_equal_charset_rec */
/** * Check if literal equals to utf-8 string * * @return true if equal * false otherwise */ bool lit_literal_equal_utf8 (literal_t lit, /**< literal to compare */ const lit_utf8_byte_t *str_p, /**< utf-8 string to compare */ lit_utf8_size_t str_size) /**< string size in bytes */ { switch (lit->get_type ()) { case LIT_STR_T: { return static_cast<lit_charset_record_t *>(lit)->is_equal_utf8_string (str_p, str_size); } case LIT_MAGIC_STR_T: { lit_magic_string_id_t magic_id = lit_magic_record_get_magic_str_id (lit); return lit_compare_utf8_string_and_magic_string (str_p, str_size, magic_id); } case LIT_MAGIC_STR_EX_T: { lit_magic_string_ex_id_t magic_id = lit_magic_record_ex_get_magic_str_id (lit); return lit_compare_utf8_string_and_magic_string_ex (str_p, str_size, magic_id); } case LIT_NUMBER_T: { lit_utf8_byte_t num_buf[ECMA_MAX_CHARS_IN_STRINGIFIED_NUMBER]; lit_utf8_size_t num_size = ecma_number_to_utf8_string (static_cast<lit_number_record_t *>(lit)->get_number (), num_buf, sizeof (num_buf)); return lit_compare_utf8_strings (str_p, str_size, num_buf, num_size); } default: { JERRY_UNREACHABLE (); } } } /* lit_literal_equal_utf8 */