From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20885 invoked by alias); 28 Apr 2005 20:39:04 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 20812 invoked from network); 28 Apr 2005 20:38:57 -0000 Received: from unknown (HELO romy.inter.net.il) (192.114.186.66) by sourceware.org with SMTP; 28 Apr 2005 20:38:57 -0000 Received: from zaretski (IGLD-80-230-65-115.inter.net.il [80.230.65.115]) by romy.inter.net.il (MOS 3.5.6-GR) with ESMTP id BCD07548 (AUTH halo1); Thu, 28 Apr 2005 23:38:27 +0300 (IDT) Date: Thu, 28 Apr 2005 20:39:00 -0000 From: "Eli Zaretskii" To: bug-gdb@rich-paul.net Message-ID: <01c54c32$Blat.v2.4$26bfb1a0@zahav.net.il> Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=ISO-8859-1 CC: bug-gdb@gnu.org, gdb-patches@sources.redhat.com In-reply-to: <20050427180410.GA19592@nevyn.them.org> (message from Daniel Jacobowitz on Wed, 27 Apr 2005 14:04:10 -0400) Subject: Re: [RFA] Fix file name generation in edit_command (was: Ver 6.3 edit command failing) Reply-to: Eli Zaretskii References: <01c54b35$Blat.v2.4$c3f52520@zahav.net.il> <20050427143620.GA1686@nevyn.them.org> <01c54b40$Blat.v2.4$be3bafe0@zahav.net.il> <20050427180410.GA19592@nevyn.them.org> X-SW-Source: 2005-04/txt/msg00397.txt.bz2 > Date: Wed, 27 Apr 2005 14:04:10 -0400 > From: Daniel Jacobowitz > Cc: bug-gdb@rich-paul.net, bug-gdb@gnu.org, gdb-patches@sources.redhat.com > > It strikes me as odd that you can use "edit" if GDB doesn't know where > the source file is. I realize this is a pre-existing condition, but... > Also, symtab_to_fullname includes the cached fullname check. So what's > your opinion of boiling the whole thing down to: > > fn = symtab_to_fullname (sal.symtab); > if (fn == NULL) > error (_("Could not find file \"%s\""), sal.symtab->filename); > p = xstrprintf ("%s +%d %s", editor, sal.line, fn); > > Mark, can I have those bonus points? :-) I ended up committing the attached. Note that it quotes the file name, to account for possible special characters that would confise the shell. (I use "..." for quoting because this is more portable to various shells, including on Windows.) Thanks to Daniel and Mark for valuable input. 2005-04-28 Eli Zaretskii * cli/cli-cmds.c (edit_command): If symtab->fullname is not yet set, use symtab_to_fullname, instead of trying to do its job. Use xstrprintf instead of malloc and sprintf. Index: gdb/cli/cli-cmds.c =================================================================== RCS file: /cvs/src/src/gdb/cli/cli-cmds.c,v retrieving revision 1.58 retrieving revision 1.59 diff -u -r1.58 -r1.59 --- gdb/cli/cli-cmds.c 16 Mar 2005 15:58:41 -0000 1.58 +++ gdb/cli/cli-cmds.c 28 Apr 2005 20:32:41 -0000 1.59 @@ -554,7 +554,7 @@ int cmdlen, log10; unsigned m; char *editor; - char *p; + char *p, *fn; /* Pull in the current default source line if necessary */ if (arg == 0) @@ -627,25 +627,26 @@ if ((editor = (char *) getenv ("EDITOR")) == NULL) editor = "/bin/ex"; - + /* Approximate base-10 log of line to 1 unit for digit count */ for(log10=32, m=0x80000000; !(sal.line & m) && log10>0; log10--, m=m>>1); log10 = 1 + (int)((log10 + (0 == ((m-1) & sal.line)))/3.32192809); - cmdlen = strlen(editor) + 1 - + (NULL == sal.symtab->dirname ? 0 : strlen(sal.symtab->dirname) + 1) - + (NULL == sal.symtab->filename? 0 : strlen(sal.symtab->filename)+ 1) - + log10 + 2; - - p = xmalloc(cmdlen); - sprintf(p,"%s +%d %s%s",editor,sal.line, - (NULL == sal.symtab->dirname ? "./" : - (NULL != sal.symtab->filename && *(sal.symtab->filename) != '/') ? - sal.symtab->dirname : ""), - (NULL == sal.symtab->filename ? "unknown" : sal.symtab->filename) - ); - shell_escape(p, from_tty); + /* If we don't already know the full absolute file name of the + source file, find it now. */ + if (!sal.symtab->fullname) + { + fn = symtab_to_fullname (sal.symtab); + if (!fn) + fn = "unknown"; + } + else + fn = sal.symtab->fullname; + /* Quote the file name, in case it has whitespace or other special + characters. */ + p = xstrprintf ("%s +%d \"%s\"", editor, sal.line, fn); + shell_escape(p, from_tty); xfree(p); }