/* *INDENT-OFF* */ START_PARAMETRIZED_TEST (test_regex_replace_esc_seq_prepare, test_regex_replace_esc_seq_prepare_ds) /* *INDENT-ON* */ { /* given */ GString *replace_str; gsize actual_skipped_len = 0; int actual_flags = 0; gboolean actual_result; replace_str = g_string_new (data->input_string); /* when */ actual_result = mc_search_regex__replace_handle_esc_seq (replace_str, data->input_pos, &actual_skipped_len, &actual_flags); /* then */ mctest_assert_int_eq (actual_result, data->expected_result); mctest_assert_int_eq (actual_skipped_len, data->expected_skipped_len); mctest_assert_int_eq (actual_flags, data->expected_flags); g_string_free (replace_str, TRUE); }
static int mc_search_regex__process_replace_str (const GString * replace_str, const gsize current_pos, gsize * skip_len, replace_transform_type_t * replace_flags) { int ret = -1; char *tmp_str; const char *curr_str = &(replace_str->str[current_pos]); if (current_pos > replace_str->len) return REPLACE_PREPARE_T_NOTHING_SPECIAL; *skip_len = 0; if ((*curr_str == '$') && (*(curr_str + 1) == '{') && ((*(curr_str + 2) & (char) 0xf0) == 0x30) && (replace_str->len > current_pos + 2)) { if (strutils_is_char_escaped (replace_str->str, curr_str)) { *skip_len = 1; return REPLACE_PREPARE_T_NOTHING_SPECIAL; } for (*skip_len = 0; current_pos + *skip_len + 2 < replace_str->len && (*(curr_str + 2 + *skip_len) & (char) 0xf0) == 0x30; (*skip_len)++); if (*(curr_str + 2 + *skip_len) != '}') return REPLACE_PREPARE_T_NOTHING_SPECIAL; tmp_str = g_strndup (curr_str + 2, *skip_len); if (tmp_str == NULL) return REPLACE_PREPARE_T_NOTHING_SPECIAL; ret = atoi (tmp_str); g_free (tmp_str); *skip_len += 3; /* ${} */ return ret; /* capture buffer index >= 0 */ } if ((*curr_str == '\\') && (replace_str->len > current_pos + 1)) { if (strutils_is_char_escaped (replace_str->str, curr_str)) { *skip_len = 1; return REPLACE_PREPARE_T_NOTHING_SPECIAL; } if (g_ascii_isdigit (*(curr_str + 1))) { ret = g_ascii_digit_value (*(curr_str + 1)); /* capture buffer index >= 0 */ *skip_len = 2; /* \\ and one digit */ return ret; } if (!mc_search_regex__replace_handle_esc_seq (replace_str, current_pos, skip_len, &ret)) return ret; ret = REPLACE_PREPARE_T_REPLACE_FLAG; *skip_len += 2; switch (*(curr_str + 1)) { case 'U': *replace_flags |= REPLACE_T_UPP_TRANSFORM; *replace_flags &= ~REPLACE_T_LOW_TRANSFORM; break; case 'u': *replace_flags |= REPLACE_T_UPP_TRANSFORM_CHAR; break; case 'L': *replace_flags |= REPLACE_T_LOW_TRANSFORM; *replace_flags &= ~REPLACE_T_UPP_TRANSFORM; break; case 'l': *replace_flags |= REPLACE_T_LOW_TRANSFORM_CHAR; break; case 'E': *replace_flags = REPLACE_T_NO_TRANSFORM; break; default: ret = REPLACE_PREPARE_T_NOTHING_SPECIAL; break; } } return ret; }