The following commit has been merged in the master branch:
commit 7c415f2ec5a725d3c6f3aa114acdfd2868797aef
Author: Andrew Borodin <aboro...@vmail.ru>
Date: Fri Nov 2 13:44:47 2012 +0400
(enter): use GString instead of hand-made memory (re)allocation.
Signed-off-by: Andrew Borodin <aboro...@vmail.ru>
diff --git a/src/filemanager/command.c b/src/filemanager/command.c
index bfe286d..d98b772 100644
--- a/src/filemanager/command.c
+++ b/src/filemanager/command.c
@@ -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)
--
Midnight Commander Development