(subshell_name_quote): use GString for string forming.

(do_subshell_chdir): changed related to modified subshell_name_quote().

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
Andrew Borodin 2013-04-06 18:54:19 +04:00 committed by Slava Zanko
parent ce2f642093
commit 6d172837f0

View File

@ -1092,13 +1092,12 @@ exit_subshell (void)
*
*/
static char *
static GString *
subshell_name_quote (const char *s)
{
char *ret, *d;
GString *ret;
const char *su, *n;
const char *quote_cmd_start, *quote_cmd_end;
int c;
if (subshell_type == FISH)
{
@ -1111,49 +1110,36 @@ subshell_name_quote (const char *s)
quote_cmd_end = "'`\"";
}
/* Factor 5 because we need \, 0 and 3 other digits per character. */
d = ret = g_try_malloc (1 + (5 * strlen (s)) + (strlen (quote_cmd_start))
+ (strlen (quote_cmd_end)));
if (d == NULL)
return NULL;
ret = g_string_sized_new (64);
/* Prevent interpreting leading `-' as a switch for `cd' */
if (*s == '-')
{
*d++ = '.';
*d++ = '/';
}
if (s[0] == '-')
g_string_append (ret, "./");
/* Copy the beginning of the command to the buffer */
strcpy (d, quote_cmd_start);
d += strlen (quote_cmd_start);
g_string_append (ret, quote_cmd_start);
/*
* Print every character except digits and letters as a backslash-escape
* sequence of the form \0nnn, where "nnn" is the numeric value of the
* character converted to octal number.
*/
su = s;
for (; su[0] != '\0';)
for (su = s; su[0] != '\0'; su = n)
{
n = str_cget_next_char_safe (su);
if (str_isalnum (su))
{
memcpy (d, su, n - su);
d += n - su;
}
g_string_append_len (ret, su, n - su);
else
{
int c;
for (c = 0; c < n - su; c++)
{
sprintf (d, "\\0%03o", (unsigned char) su[c]);
d += 5;
g_string_append_printf (ret, "\\0%03o", (unsigned char) su[c]);
}
}
su = n;
}
strcpy (d, quote_cmd_end);
g_string_append (ret, quote_cmd_end);
return ret;
}
@ -1166,7 +1152,6 @@ void
do_subshell_chdir (const vfs_path_t * vpath, gboolean update_prompt, gboolean reset_prompt)
{
char *pcwd;
char *temp;
char *directory;
pcwd = vfs_path_to_str_flags (current_panel->cwd_vpath, 0, VPF_RECODE);
@ -1188,25 +1173,19 @@ do_subshell_chdir (const vfs_path_t * vpath, gboolean update_prompt, gboolean re
write_all (mc_global.tty.subshell_pty, " cd ", 4);
directory = vfs_path_to_str (vpath);
if (directory != '\0')
if (directory != NULL)
{
char *translate;
translate = vfs_translate_path_n (directory);
if (translate != NULL)
{
GString *temp;
temp = subshell_name_quote (translate);
if (temp)
{
write_all (mc_global.tty.subshell_pty, temp, strlen (temp));
g_free (temp);
}
else
{
/* Should not happen unless the directory name is so long
that we don't have memory to quote it. */
write_all (mc_global.tty.subshell_pty, ".", 1);
}
write_all (mc_global.tty.subshell_pty, temp->str, temp->len);
g_string_free (temp, TRUE);
g_free (translate);
}
else