mirror of https://github.com/MidnightCommander/mc
(mc_search__recode_str): return GString.
(mc_search__get_one_symbol): likewise. Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
parent
7a65d5200b
commit
1da094ae4a
|
@ -38,10 +38,10 @@ typedef struct mc_search_cond_struct
|
|||
|
||||
/* search/lib.c : */
|
||||
|
||||
gchar *mc_search__recode_str (const char *str, gsize str_len, const char *charset_from,
|
||||
const char *charset_to, gsize * bytes_written);
|
||||
gchar *mc_search__get_one_symbol (const char *charset, const char *str, gsize str_len,
|
||||
gboolean * just_letters);
|
||||
GString *mc_search__recode_str (const char *str, gsize str_len, const char *charset_from,
|
||||
const char *charset_to);
|
||||
GString *mc_search__get_one_symbol (const char *charset, const char *str, gsize str_len,
|
||||
gboolean * just_letters);
|
||||
GString *mc_search__tolower_case_str (const char *charset, const char *str, gsize str_len);
|
||||
GString *mc_search__toupper_case_str (const char *charset, const char *str, gsize str_len);
|
||||
|
||||
|
|
|
@ -68,30 +68,27 @@ mc_search__change_case_str (const char *charset, const char *str, gsize str_len,
|
|||
gchar *dst_ptr;
|
||||
gsize dst_len;
|
||||
#ifdef HAVE_CHARSET
|
||||
gchar *converted_str;
|
||||
gsize converted_str_len;
|
||||
GString *converted_str;
|
||||
const char *src_ptr;
|
||||
|
||||
if (charset == NULL)
|
||||
charset = cp_source;
|
||||
|
||||
converted_str = mc_search__recode_str (str, str_len, charset, cp_display, &converted_str_len);
|
||||
converted_str = mc_search__recode_str (str, str_len, charset, cp_display);
|
||||
|
||||
dst_str = g_malloc (converted_str_len);
|
||||
dst_len = converted_str_len + 1; /* +1 is required for str_toupper/str_tolower */
|
||||
dst_str = g_malloc (converted_str->len);
|
||||
dst_len = converted_str->len + 1; /* +1 is required for str_toupper/str_tolower */
|
||||
|
||||
for (src_ptr = converted_str, dst_ptr = dst_str;
|
||||
for (src_ptr = converted_str->str, dst_ptr = dst_str;
|
||||
case_conv (src_ptr, &dst_ptr, &dst_len); src_ptr += str_length_char (src_ptr))
|
||||
;
|
||||
*dst_ptr = '\0';
|
||||
|
||||
g_free (converted_str);
|
||||
dst_len = converted_str->len;
|
||||
g_string_free (converted_str, TRUE);
|
||||
|
||||
dst_ptr = mc_search__recode_str (dst_str, converted_str_len, cp_display, charset, &dst_len);
|
||||
ret = mc_search__recode_str (dst_str, dst_len, cp_display, charset);
|
||||
g_free (dst_str);
|
||||
|
||||
ret = g_string_new_len (dst_ptr, dst_len);
|
||||
g_free (dst_ptr);
|
||||
#else
|
||||
(void) charset;
|
||||
|
||||
|
@ -112,11 +109,11 @@ mc_search__change_case_str (const char *charset, const char *str, gsize str_len,
|
|||
/*** public functions ****************************************************************************/
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
gchar *
|
||||
mc_search__recode_str (const char *str, gsize str_len,
|
||||
const char *charset_from, const char *charset_to, gsize * bytes_written)
|
||||
GString *
|
||||
mc_search__recode_str (const char *str, gsize str_len, const char *charset_from,
|
||||
const char *charset_to)
|
||||
{
|
||||
gchar *ret = NULL;
|
||||
GString *ret = NULL;
|
||||
|
||||
if (charset_from != NULL && charset_to != NULL
|
||||
&& g_ascii_strcasecmp (charset_to, charset_from) != 0)
|
||||
|
@ -126,60 +123,61 @@ mc_search__recode_str (const char *str, gsize str_len,
|
|||
conv = g_iconv_open (charset_to, charset_from);
|
||||
if (conv != INVALID_CONV)
|
||||
{
|
||||
gsize bytes_read;
|
||||
gchar *val;
|
||||
gsize bytes_read = 0;
|
||||
gsize bytes_written = 0;
|
||||
|
||||
val = g_convert_with_iconv (str, str_len, conv, &bytes_read, &bytes_written, NULL);
|
||||
|
||||
ret = g_convert_with_iconv (str, str_len, conv, &bytes_read, bytes_written, NULL);
|
||||
g_iconv_close (conv);
|
||||
|
||||
if (val != NULL)
|
||||
{
|
||||
ret = g_string_new_len (val, bytes_written);
|
||||
g_free (val);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ret == NULL)
|
||||
{
|
||||
*bytes_written = str_len;
|
||||
ret = g_strndup (str, str_len);
|
||||
}
|
||||
ret = g_string_new_len (str, str_len);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
gchar *
|
||||
GString *
|
||||
mc_search__get_one_symbol (const char *charset, const char *str, gsize str_len,
|
||||
gboolean * just_letters)
|
||||
{
|
||||
gchar *converted_str;
|
||||
GString *converted_str;
|
||||
const gchar *next_char;
|
||||
|
||||
gsize tmp_len;
|
||||
#ifdef HAVE_CHARSET
|
||||
gsize converted_str_len;
|
||||
gchar *converted_str2;
|
||||
GString *converted_str2;
|
||||
|
||||
if (charset == NULL)
|
||||
charset = cp_source;
|
||||
|
||||
converted_str = mc_search__recode_str (str, str_len, charset, cp_display, &converted_str_len);
|
||||
converted_str = mc_search__recode_str (str, str_len, charset, cp_display);
|
||||
#else
|
||||
(void) charset;
|
||||
|
||||
converted_str = g_strndup (str, str_len);
|
||||
converted_str = g_string_new_len (str, str_len);
|
||||
#endif
|
||||
|
||||
next_char = str_cget_next_char (converted_str);
|
||||
|
||||
tmp_len = next_char - converted_str;
|
||||
|
||||
converted_str[tmp_len] = '\0';
|
||||
next_char = str_cget_next_char (converted_str->str);
|
||||
g_string_set_size (converted_str, (gsize) (next_char - converted_str->str));
|
||||
|
||||
#ifdef HAVE_CHARSET
|
||||
converted_str2 =
|
||||
mc_search__recode_str (converted_str, tmp_len, cp_display, charset, &converted_str_len);
|
||||
mc_search__recode_str (converted_str->str, converted_str->len, cp_display, charset);
|
||||
#endif
|
||||
if (just_letters != NULL)
|
||||
*just_letters = str_isalnum (converted_str) && !str_isdigit (converted_str);
|
||||
*just_letters = str_isalnum (converted_str->str) && !str_isdigit (converted_str->str);
|
||||
#ifdef HAVE_CHARSET
|
||||
g_free (converted_str);
|
||||
g_string_free (converted_str, TRUE);
|
||||
return converted_str2;
|
||||
#else
|
||||
return converted_str;
|
||||
|
|
|
@ -163,29 +163,27 @@ mc_search__cond_struct_new_regex_accum_append (const char *charset, GString * st
|
|||
|
||||
while (loop < str_from->len)
|
||||
{
|
||||
gchar *one_char;
|
||||
gsize one_char_len;
|
||||
GString *one_char;
|
||||
gboolean just_letters;
|
||||
|
||||
one_char =
|
||||
mc_search__get_one_symbol (charset, &(str_from->str[loop]),
|
||||
mc_search__get_one_symbol (charset, str_from->str + loop,
|
||||
MIN (str_from->len - loop, 6), &just_letters);
|
||||
one_char_len = strlen (one_char);
|
||||
|
||||
if (one_char_len == 0)
|
||||
if (one_char->len == 0)
|
||||
loop++;
|
||||
else
|
||||
{
|
||||
loop += one_char_len;
|
||||
loop += one_char->len;
|
||||
|
||||
if (just_letters)
|
||||
mc_search__cond_struct_new_regex_hex_add (charset, recoded_part, one_char,
|
||||
one_char_len);
|
||||
mc_search__cond_struct_new_regex_hex_add (charset, recoded_part, one_char->str,
|
||||
one_char->len);
|
||||
else
|
||||
g_string_append_len (recoded_part, one_char, one_char_len);
|
||||
g_string_append_len (recoded_part, one_char->str, one_char->len);
|
||||
}
|
||||
|
||||
g_free (one_char);
|
||||
g_string_free (one_char, TRUE);
|
||||
}
|
||||
|
||||
g_string_append_len (str_to, recoded_part->str, recoded_part->len);
|
||||
|
@ -644,35 +642,35 @@ mc_search_regex__process_append_str (GString * dest_str, const char *from, gsize
|
|||
for (loop = 0; loop < len; loop += char_len)
|
||||
{
|
||||
GString *tmp_string = NULL;
|
||||
char *tmp_str;
|
||||
GString *s;
|
||||
|
||||
tmp_str = mc_search__get_one_symbol (NULL, from + loop, len - loop, NULL);
|
||||
char_len = strlen (tmp_str);
|
||||
s = mc_search__get_one_symbol (NULL, from + loop, len - loop, NULL);
|
||||
char_len = s->len;
|
||||
|
||||
if ((*replace_flags & REPLACE_T_UPP_TRANSFORM_CHAR) != 0)
|
||||
{
|
||||
*replace_flags &= ~REPLACE_T_UPP_TRANSFORM_CHAR;
|
||||
tmp_string = mc_search__toupper_case_str (NULL, tmp_str, char_len);
|
||||
tmp_string = mc_search__toupper_case_str (NULL, s->str, char_len);
|
||||
g_string_append_len (dest_str, tmp_string->str, tmp_string->len);
|
||||
}
|
||||
else if ((*replace_flags & REPLACE_T_LOW_TRANSFORM_CHAR) != 0)
|
||||
{
|
||||
*replace_flags &= ~REPLACE_T_LOW_TRANSFORM_CHAR;
|
||||
tmp_string = mc_search__tolower_case_str (NULL, tmp_str, char_len);
|
||||
tmp_string = mc_search__tolower_case_str (NULL, s->str, char_len);
|
||||
g_string_append_len (dest_str, tmp_string->str, tmp_string->len);
|
||||
}
|
||||
else if ((*replace_flags & REPLACE_T_UPP_TRANSFORM) != 0)
|
||||
{
|
||||
tmp_string = mc_search__toupper_case_str (NULL, tmp_str, char_len);
|
||||
tmp_string = mc_search__toupper_case_str (NULL, s->str, char_len);
|
||||
g_string_append_len (dest_str, tmp_string->str, tmp_string->len);
|
||||
}
|
||||
else if ((*replace_flags & REPLACE_T_LOW_TRANSFORM) != 0)
|
||||
{
|
||||
tmp_string = mc_search__tolower_case_str (NULL, tmp_str, char_len);
|
||||
tmp_string = mc_search__tolower_case_str (NULL, s->str, char_len);
|
||||
g_string_append_len (dest_str, tmp_string->str, tmp_string->len);
|
||||
}
|
||||
|
||||
g_free (tmp_str);
|
||||
g_string_free (s, TRUE);
|
||||
if (tmp_string != NULL)
|
||||
g_string_free (tmp_string, TRUE);
|
||||
}
|
||||
|
|
|
@ -222,8 +222,7 @@ mc_search_prepare (mc_search_t * lc_mc_search)
|
|||
for (loop1 = 0; loop1 < codepages->len; loop1++)
|
||||
{
|
||||
const char *id;
|
||||
gsize recoded_str_len;
|
||||
gchar *buffer;
|
||||
GString *buffer;
|
||||
|
||||
id = ((codepage_desc *) g_ptr_array_index (codepages, loop1))->id;
|
||||
if (g_ascii_strcasecmp (id, lc_mc_search->original.charset) == 0)
|
||||
|
@ -239,12 +238,12 @@ mc_search_prepare (mc_search_t * lc_mc_search)
|
|||
buffer =
|
||||
mc_search__recode_str (lc_mc_search->original.str->str,
|
||||
lc_mc_search->original.str->len,
|
||||
lc_mc_search->original.charset, id, &recoded_str_len);
|
||||
lc_mc_search->original.charset, id);
|
||||
|
||||
g_ptr_array_add (ret,
|
||||
mc_search__cond_struct_new (lc_mc_search, buffer,
|
||||
recoded_str_len, id));
|
||||
g_free (buffer);
|
||||
mc_search__cond_struct_new (lc_mc_search, buffer->str,
|
||||
buffer->len, id));
|
||||
g_string_free (buffer, TRUE);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
Loading…
Reference in New Issue