prompt, spaces, `cd' and system commands..
q#
eth0 at o2.pl
Sun Nov 28 03:04:08 UTC 2004
On Sat, Nov 27, 2004 at 09:30:47AM +0100, Oswald Buddenhagen wrote:
> On Sat, Nov 27, 2004 at 03:06:53AM +0100, q# wrote:
> > This patch fix this issue, but please _double check_ this patch.
> > Comments are _very_ welcome.
> >
> so here we go: this patch sucks. :-P
> glib provides a proper shell command interpretation function; use that
> instead of crafting some fragile dequoting voodoo. (yes, i know you
> didn't start this, but once you touch that code ...)
I tried to rewrite this function. I'm stuck little with condition
(get_current_type () == view_tree)
I can't force mc to show me this "FIXME" dialog :/ and also don't
undesrstand for what this part of code was (in old function).
In `do_cd_command()' I want:
remove unnecessary spaces before and after dirname,
striped dir stored in cmd (it goes to mc history),
unqoted dir pass on to `examine_cd()'.
Comments and constructive flames are very welcome.
--
best regards
q#
-------------- next part --------------
Index: src/command.c
===================================================================
RCS file: /cvsroot/mc/mc/src/command.c,v
retrieving revision 1.28
diff -u -r1.28 command.c
--- src/command.c 3 Nov 2004 19:43:17 -0000 1.28
+++ src/command.c 28 Nov 2004 02:38:48 -0000
@@ -138,53 +138,35 @@
/* Execute the cd command on the command line */
void do_cd_command (char *cmd)
{
- int len;
-
/* Any final whitespace should be removed here
(to see why, try "cd fred "). */
/* NOTE: I think we should not remove the extra space,
that way, we can cd into hidden directories */
/* FIXME: what about interpreting quoted strings like the shell.
so one could type "cd <tab> M-a <enter>" and it would work. */
- len = strlen (cmd) - 1;
- while (len >= 0 &&
- (cmd [len] == ' ' || cmd [len] == '\t' || cmd [len] == '\n')){
- cmd [len] = 0;
- len --;
+ char *dir = g_strstrip (g_strdup (cmd+2));
+ char *unq = g_shell_unquote (g_strdup (dir), NULL);
+
+ if (unq == NULL) {
+
+ message (1, MSG_ERROR, _(" Cannot unquote shell string "));
+
+ } else if (get_current_type () == view_tree) {
+
+ message (1, MSG_ERROR, _(" FIXME: Not implemented yet "));
+
+ } else if (!examine_cd (unq)) {
+
+ char *d = strip_password (g_strdup (unq), 1);
+ message (1, MSG_ERROR, _(" Cannot chdir to \"%s\" \n %s "),
+ d, unix_error_string (errno));
+ g_free (d);
}
-
- if (cmd [2] == 0)
- cmd = "cd ";
-
- if (get_current_type () == view_tree){
- if (cmd [0] == 0){
- sync_tree (home_dir);
- } else if (strcmp (cmd+3, "..") == 0){
- char *dir = current_panel->cwd;
- int len = strlen (dir);
- while (len && dir [--len] != PATH_SEP);
- dir [len] = 0;
- if (len)
- sync_tree (dir);
- else
- sync_tree (PATH_SEP_STR);
- } else if (cmd [3] == PATH_SEP){
- sync_tree (cmd+3);
- } else {
- char *old = current_panel->cwd;
- char *new;
- new = concat_dir_and_file (old, cmd+3);
- sync_tree (new);
- g_free (new);
- }
- } else
- if (!examine_cd (&cmd [3])) {
- char *d = strip_password (g_strdup (&cmd [3]), 1);
- message (1, MSG_ERROR, _(" Cannot chdir to \"%s\" \n %s "),
- d, unix_error_string (errno));
- g_free (d);
- return;
- }
+
+ g_sprintf (cmd, "cd %s", dir);
+ g_free (dir);
+ g_free (unq);
+ return;
}
/* Handle Enter on the command line */
More information about the mc-devel
mailing list