(enter): use GString instead of hand-made memory (re)allocation.
authorAndrew Borodin <aborodin@vmail.ru>
Fri, 2 Nov 2012 09:44:47 +0000 (2 13:44 +0400)
committerAndrew Borodin <aborodin@vmail.ru>
Fri, 9 Nov 2012 06:05:13 +0000 (9 10:05 +0400)
Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
src/filemanager/command.c

index bfe286d..d98b772 100644 (file)
@@ -258,8 +258,8 @@ enter (WInput * lc_cmdline)
     }
     else
     {
-        char *command, *s;
-        size_t i, j, cmd_len;
+        GString *command;
+        size_t i;
 
         if (!vfs_current_is_local ())
         {
@@ -275,30 +275,25 @@ enter (WInput * lc_cmdline)
             return MSG_NOT_HANDLED;
         }
 #endif
-        cmd_len = strlen (cmd);
-        command = g_malloc (cmd_len + 1);
-        command[0] = 0;
-        for (i = j = 0; i < cmd_len; i++)
+        command = g_string_sized_new (32);
+
+        for (i = 0; cmd[i] != '\0'; i++)
         {
-            if (cmd[i] == '%')
-            {
-                i++;
-                s = expand_format (NULL, cmd[i], TRUE);
-                command = g_realloc (command, j + strlen (s) + cmd_len - i + 1);
-                strcpy (command + j, s);
-                g_free (s);
-                j = strlen (command);
-            }
+            if (cmd[i] != '%')
+                g_string_append_c (command, cmd[i]);
             else
             {
-                command[j] = cmd[i];
-                j++;
+                char *s;
+
+                s = expand_format (NULL, cmd[++i], TRUE);
+                g_string_append (command, s);
+                g_free (s);
             }
-            command[j] = 0;
         }
+
         input_clean (lc_cmdline);
-        shell_execute (command, 0);
-        g_free (command);
+        shell_execute (command->str, 0);
+        g_string_free (command, TRUE);
 
 #ifdef ENABLE_SUBSHELL
         if ((quit & SUBSHELL_EXIT) != 0)