Re: [RFC] new substitute path when loading feature

Eli Zaretskii
2008-05-15T18:55:48Z

> Date: Thu, 15 May 2008 12:05:51 -0400
> From: Daniel Jacobowitz <drow@false.org>
> Cc: Eli Zaretskii <eliz@gnu.org>
>
> On Tue, May 13, 2008 at 03:20:41PM -0400, Daniel Jacobowitz wrote:
> > On Tue, May 13, 2008 at 03:11:22PM -0400, Aleksandar Ristovski wrote:
> > > No, this particular issue is not because of the slashes, but rather
> > > due to IS_ABSOLUTE_PATH returning false on a path like "c:/Temp...".
> >
> > OK. I think I "fixed" FILENAME_CMP and not IS_ABSOLUTE_PATH, but it
> > would not be hard to do both.
> >
> > I'll try to post something tonight.
>
> Sorry, my existing patch was a mess so I had to rewrite it. I haven't
> really tested this; it doesn't break a native Linux GDB in any case
> that I consider significant. See the comments in defs.h and utils.c
> for the details.
>
> Does this fix the same problem you're working on? Does anyone see a
> problem with the compromises I made here? Eli, I'd appreciate your
> opinion.

Well, the patch will certainly work with DOS-ish file names on a Posix
host, but I'm worried about breaking file names that are perfectly
valid on Posix filesystems, but which just happen to use colons and
backslashes. I agree that a probability of meeting such file names on
Posix platforms is miniscule, but this patch leaves the user no fire
escape whatsoever when she does meet them.

Can we please augment this with some minimal band-aid for when
backslashes and colons are literally used in a file name? Something
like a user option to disable this feature and use normal Posix
file-name syntax? I figure this would be enough, since mixing object
files compiled on Posix and Windows platforms should be _really_ rare.

> +/* Compare two filenames. This version should be used instead of
> + FILENAME_CMP for filenames from debug information; it recognizes
> + equivalences from compiling on a DOS filesystem even if the
> + debugger is running on a POSIX host. */
> +
> +int
> +gdb_filename_cmp (const char *lhs, const char *rhs)
> +{
> + for (; *lhs || *rhs; lhs++, rhs++)
> + {
> +#ifndef HAVE_DOS_BASED_FILE_SYSTEM
> + /* When debugging on a POSIX host, assume that each filename was
> + recorded with a single consistent capitalization during
> + compilation. Source trees are too likely to contain both
> + main.c and Main.c. */
> + if (*lhs == *rhs)
> + continue;
> +#else
> + if (tolower (*lhs) == tolower (*rhs))
> + continue;
> +#endif
> +
> + if (*lhs == '/' && *rhs == '\\')
> + continue;
> + if (*lhs == '\\' && *rhs == '/')
> + continue;
> + return (int) *lhs - (int) *rhs;
> + }
> + return 0;
> +}

Will this work if the file name is encoded in UTF-8 or some other
multi-byte encoding, btw? We do want to support those, don't we?