Browse Source

(mc_search__recode_str): return GString.

(mc_search__get_one_symbol): likewise.

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
Andrew Borodin 2 years ago
parent
commit
1da094ae4a
4 changed files with 59 additions and 64 deletions
  1. 4 4
      lib/search/internal.h
  2. 34 36
      lib/search/lib.c
  3. 16 18
      lib/search/regex.c
  4. 5 6
      lib/search/search.c

+ 4 - 4
lib/search/internal.h

@@ -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);
 

+ 34 - 36
lib/search/lib.c

@@ -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;

+ 16 - 18
lib/search/regex.c

@@ -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);
     }

+ 5 - 6
lib/search/search.c

@@ -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