示例#1
0
文件: regex.c 项目: artzub/mc
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);
    }
示例#2
0
文件: regex.c 项目: sfionov/mc-dev
/* --------------------------------------------------------------------------------------------- */
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;
}