Some optimization of loops in translation functions.
Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
Этот коммит содержится в:
родитель
b6fd832a8a
Коммит
54a9e72250
@ -52,55 +52,38 @@ mc_search__glob_translate_to_regex (const GString * astr)
|
||||
{
|
||||
const char *str = astr->str;
|
||||
GString *buff;
|
||||
gsize loop = 0;
|
||||
gsize loop;
|
||||
gboolean inside_group = FALSE;
|
||||
|
||||
buff = g_string_sized_new (32);
|
||||
|
||||
while (loop < astr->len)
|
||||
{
|
||||
for (loop = 0; loop < astr->len; loop++)
|
||||
switch (str[loop])
|
||||
{
|
||||
case '*':
|
||||
if (!strutils_is_char_escaped (str, &(str[loop])))
|
||||
{
|
||||
g_string_append (buff, (inside_group) ? ".*" : "(.*)");
|
||||
loop++;
|
||||
continue;
|
||||
}
|
||||
g_string_append (buff, inside_group ? ".*" : "(.*)");
|
||||
break;
|
||||
case '?':
|
||||
if (!strutils_is_char_escaped (str, &(str[loop])))
|
||||
{
|
||||
g_string_append (buff, (inside_group) ? "." : "(.)");
|
||||
loop++;
|
||||
continue;
|
||||
}
|
||||
g_string_append (buff, inside_group ? "." : "(.)");
|
||||
break;
|
||||
case ',':
|
||||
if (!strutils_is_char_escaped (str, &(str[loop])))
|
||||
{
|
||||
g_string_append (buff, "|");
|
||||
loop++;
|
||||
continue;
|
||||
}
|
||||
g_string_append_c (buff, '|');
|
||||
break;
|
||||
case '{':
|
||||
if (!strutils_is_char_escaped (str, &(str[loop])))
|
||||
{
|
||||
g_string_append (buff, "(");
|
||||
g_string_append_c (buff, '(');
|
||||
inside_group = TRUE;
|
||||
loop++;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
case '}':
|
||||
if (!strutils_is_char_escaped (str, &(str[loop])))
|
||||
{
|
||||
g_string_append (buff, ")");
|
||||
g_string_append_c (buff, ')');
|
||||
inside_group = FALSE;
|
||||
loop++;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
case '+':
|
||||
@ -110,13 +93,11 @@ mc_search__glob_translate_to_regex (const GString * astr)
|
||||
case ')':
|
||||
case '^':
|
||||
g_string_append_c (buff, '\\');
|
||||
/* fall through */
|
||||
default:
|
||||
g_string_append_c (buff, str[loop]);
|
||||
loop++;
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
g_string_append_c (buff, str[loop]);
|
||||
loop++;
|
||||
}
|
||||
|
||||
return buff;
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ mc_search__hex_translate_to_regex (const GString * astr)
|
||||
{
|
||||
const char *str = astr->str;
|
||||
GString *buff;
|
||||
gchar *tmp_str, *tmp_str2;
|
||||
gchar *tmp_str;
|
||||
gsize loop = 0;
|
||||
int val, ptr;
|
||||
|
||||
@ -61,33 +61,41 @@ mc_search__hex_translate_to_regex (const GString * astr)
|
||||
tmp_str = g_strndup (str, astr->len);
|
||||
g_strchug (tmp_str); /* trim leadind whitespaces */
|
||||
|
||||
while (loop < astr->len) {
|
||||
if (sscanf (tmp_str + loop, "%i%n", &val, &ptr)) {
|
||||
if (val < -128 || val > 255) {
|
||||
while (loop < astr->len)
|
||||
{
|
||||
if (sscanf (tmp_str + loop, "%i%n", &val, &ptr))
|
||||
{
|
||||
gchar *tmp_str2;
|
||||
|
||||
if (val < -128 || val > 255)
|
||||
{
|
||||
loop++;
|
||||
continue;
|
||||
}
|
||||
|
||||
tmp_str2 = g_strdup_printf ("\\x%02X", (unsigned char) val);
|
||||
g_string_append (buff, tmp_str2);
|
||||
g_free (tmp_str2);
|
||||
loop += ptr;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (*(tmp_str + loop) == '"') {
|
||||
else if (*(tmp_str + loop) == '"')
|
||||
{
|
||||
gsize loop2 = 0;
|
||||
|
||||
loop++;
|
||||
while (loop + loop2 < astr->len) {
|
||||
while (loop + loop2 < astr->len)
|
||||
{
|
||||
if (*(tmp_str + loop + loop2) == '"' &&
|
||||
!strutils_is_char_escaped (tmp_str, tmp_str + loop + loop2))
|
||||
break;
|
||||
loop2++;
|
||||
}
|
||||
|
||||
g_string_append_len (buff, tmp_str + loop, loop2 - 1);
|
||||
loop += loop2;
|
||||
continue;
|
||||
}
|
||||
loop++;
|
||||
else
|
||||
loop++;
|
||||
}
|
||||
|
||||
g_free (tmp_str);
|
||||
|
@ -50,12 +50,13 @@ mc_search__normal_translate_to_regex (const GString * astr)
|
||||
{
|
||||
const char *str = astr->str;
|
||||
GString *buff;
|
||||
gsize loop = 0;
|
||||
gsize loop;
|
||||
|
||||
buff = g_string_sized_new (32);
|
||||
|
||||
while (loop < astr->len) {
|
||||
switch (str[loop]) {
|
||||
for (loop = 0; loop < astr->len; loop++)
|
||||
switch (str[loop])
|
||||
{
|
||||
case '*':
|
||||
case '?':
|
||||
case ',':
|
||||
@ -73,13 +74,11 @@ mc_search__normal_translate_to_regex (const GString * astr)
|
||||
case '-':
|
||||
case '|':
|
||||
g_string_append_c (buff, '\\');
|
||||
/* fall through */
|
||||
default:
|
||||
g_string_append_c (buff, str[loop]);
|
||||
loop++;
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
g_string_append_c (buff, str[loop]);
|
||||
loop++;
|
||||
}
|
||||
|
||||
return buff;
|
||||
}
|
||||
|
Загрузка…
Ссылка в новой задаче
Block a user