static void mc_search_regex__process_escape_sequence (GString * dest_str, const char *from, gsize len, replace_transform_type_t * replace_flags, gboolean is_utf8) { gsize i = 0; unsigned int c = 0; char b; if (len == (gsize) (-1)) len = strlen (from); if (len == 0) return; if (from[i] == '{') i++; if (i >= len) return; if (from[i] == 'x') { i++; if (i < len && from[i] == '{') i++; for (; i < len; i++) { if (from[i] >= '0' && from[i] <= '9') c = c * 16 + from[i] - '0'; else if (from[i] >= 'a' && from[i] <= 'f') c = c * 16 + 10 + from[i] - 'a'; else if (from[i] >= 'A' && from[i] <= 'F') c = c * 16 + 10 + from[i] - 'A'; else break; } } else if (from[i] >= '0' && from[i] <= '7') for (; i < len && from[i] >= '0' && from[i] <= '7'; i++) c = c * 8 + from[i] - '0'; else { switch (from[i]) { case 'n': c = '\n'; break; case 't': c = '\t'; break; case 'v': c = '\v'; break; case 'b': c = '\b'; break; case 'r': c = '\r'; break; case 'f': c = '\f'; break; case 'a': c = '\a'; break; default: mc_search_regex__process_append_str (dest_str, from, len, replace_flags); return; } } if (c < 0x80 || !is_utf8) g_string_append_c (dest_str, (char) c); else if (c < 0x800) { b = 0xC0 | (c >> 6); g_string_append_c (dest_str, b); b = 0x80 | (c & 0x3F); g_string_append_c (dest_str, b); }
/* --------------------------------------------------------------------------------------------- */ GString * mc_search_regex_prepare_replace_str (mc_search_t * mc_search, GString * replace_str) { GString *ret; gchar *tmp_str; int num_replace_tokens, index; gsize loop; gsize len = 0; gchar *prev_str; replace_transform_type_t replace_flags = REPLACE_T_NO_TRANSFORM; num_replace_tokens = mc_search_regex__get_max_num_of_replace_tokens (replace_str->str, replace_str->len); if (mc_search->num_rezults < 0) return g_string_new_len (replace_str->str, replace_str->len); if (num_replace_tokens > mc_search->num_rezults - 1 || num_replace_tokens > MC_SEARCH__NUM_REPLACE_ARGS) { mc_search->error = MC_SEARCH_E_REGEX_REPLACE; mc_search->error_str = g_strdup (STR_E_RPL_NOT_EQ_TO_FOUND); return NULL; } ret = g_string_new (""); prev_str = replace_str->str; for (loop = 0; loop < replace_str->len - 1; loop++) { index = mc_search_regex__process_replace_str (replace_str, loop, &len, &replace_flags); if (index == -1) { if (len != 0) { mc_search_regex__process_append_str (ret, prev_str, replace_str->str - prev_str + loop, &replace_flags); mc_search_regex__process_append_str (ret, replace_str->str + loop + 1, len - 1, &replace_flags); prev_str = replace_str->str + loop + len; loop += len - 1; } continue; } if (index == -2) { if (loop) mc_search_regex__process_append_str (ret, prev_str, replace_str->str - prev_str + loop, &replace_flags); prev_str = replace_str->str + loop + len; loop += len - 1; continue; } if (index > mc_search->num_rezults) { g_string_free (ret, TRUE); mc_search->error = MC_SEARCH_E_REGEX_REPLACE; mc_search->error_str = g_strdup_printf (STR_E_RPL_INVALID_TOKEN, index); return NULL; } tmp_str = mc_search_regex__get_token_by_num (mc_search, index); if (tmp_str == NULL) continue; if (loop) mc_search_regex__process_append_str (ret, prev_str, replace_str->str - prev_str + loop, &replace_flags); prev_str = replace_str->str + loop + len; mc_search_regex__process_append_str (ret, tmp_str, -1, &replace_flags); g_free (tmp_str); loop += len - 1; } mc_search_regex__process_append_str (ret, prev_str, replace_str->str - prev_str + replace_str->len, &replace_flags); return ret; }