summaryrefslogtreecommitdiff
path: root/gdb/source.c
diff options
context:
space:
mode:
authorJason Molenda <jsm@bugshack.cygnus.com>1999-08-16 19:51:47 +0000
committerJason Molenda <jsm@bugshack.cygnus.com>1999-08-16 19:51:47 +0000
commit2e1d4c63076356df1821b7bab581adff9882bf15 (patch)
treeb5ced820d31fab5535c75aeaa68878a71b5daf69 /gdb/source.c
parentd4886c3ba4261064551190a6e72f1299a65b576f (diff)
downloadgdb-2e1d4c63076356df1821b7bab581adff9882bf15.tar.gz
import gdb-1999-08-16 snapshot
Diffstat (limited to 'gdb/source.c')
-rw-r--r--gdb/source.c52
1 files changed, 42 insertions, 10 deletions
diff --git a/gdb/source.c b/gdb/source.c
index 928782cc913..3e36b1df889 100644
--- a/gdb/source.c
+++ b/gdb/source.c
@@ -1,6 +1,5 @@
/* List lines of source files for GDB, the GNU debugger.
- Copyright 1986, 87, 88, 89, 91, 92, 93, 94, 95, 96, 97, 1998
- Free Software Foundation, Inc.
+ Copyright 1986-1989, 1991-1999 Free Software Foundation, Inc.
This file is part of GDB.
@@ -339,15 +338,17 @@ mod_path (dirname, which_path)
}
}
-#ifndef _WIN32
- /* On win32 h:\ is different to h: */
- if (SLASH_P (p[-1]))
+ if (!(SLASH_P (*name) && p <= name + 1) /* "/" */
+#if defined(_WIN32) || defined(__MSDOS__)
+ /* On MS-DOS and MS-Windows, h:\ is different from h: */
+ && !(!SLASH_P (*name) && ROOTED_P (name) && p <= name + 3) /* d:/ */
+#endif
+ && SLASH_P (p[-1]))
/* Sigh. "foo/" => "foo" */
--p;
-#endif
*p = '\0';
- while (p[-1] == '.')
+ while (p > name && p[-1] == '.')
{
if (p - name == 1)
{
@@ -355,7 +356,7 @@ mod_path (dirname, which_path)
name = current_directory;
goto append;
}
- else if (SLASH_P (p[-2]))
+ else if (p > name + 1 && SLASH_P (p[-2]))
{
if (p - name == 2)
{
@@ -377,6 +378,10 @@ mod_path (dirname, which_path)
if (name[0] == '~')
name = tilde_expand (name);
+#if defined(_WIN32) || defined(__MSDOS__)
+ else if (ROOTED_P (name) && p == name + 2) /* "d:" => "d:." */
+ name = concat (name, ".", NULL);
+#endif
else if (!ROOTED_P (name) && name[0] != '$')
name = concat (current_directory, SLASH_STRING, name, NULL);
else
@@ -412,6 +417,14 @@ mod_path (dirname, which_path)
p = *which_path;
while (1)
{
+ /* FIXME: strncmp loses in interesting ways on MS-DOS and
+ MS-Windows because of case-insensitivity and two different
+ but functionally identical slash characters. We need a
+ special filesystem-dependent file-name comparison function.
+
+ Actually, even on Unix I would use realpath() or its work-
+ alike before comparing. Then all the code above which
+ removes excess slashes and dots could simply go away. */
if (!strncmp (p, name, len)
&& (p[len] == '\0' || p[len] == DIRNAME_SEPARATOR))
{
@@ -606,8 +619,7 @@ done:
/* Beware the // my son, the Emacs barfs, the botch that catch... */
*filename_opened = concat (current_directory,
- SLASH_CHAR
- == current_directory[strlen (current_directory) - 1]
+ SLASH_P (current_directory[strlen (current_directory) - 1])
? "" : SLASH_STRING,
filename, NULL);
}
@@ -1515,6 +1527,16 @@ forward_search_command (regex, from_tty)
}
while (c != '\n' && (c = getc (stream)) >= 0);
+#ifdef CRLF_SOURCE_FILES
+ /* Remove the \r, if any, at the end of the line, otherwise
+ regular expressions that end with $ or \n won't work. */
+ if (p - buf > 1 && p[-2] == '\r')
+ {
+ p--;
+ p[-1] = '\n';
+ }
+#endif
+
/* we now have a source line in buf, null terminate and match */
*p = 0;
if (re_exec (buf) > 0)
@@ -1615,6 +1637,16 @@ reverse_search_command (regex, from_tty)
}
while (c != '\n' && (c = getc (stream)) >= 0);
+#ifdef CRLF_SOURCE_FILES
+ /* Remove the \r, if any, at the end of the line, otherwise
+ regular expressions that end with $ or \n won't work. */
+ if (p - buf > 1 && p[-2] == '\r')
+ {
+ p--;
+ p[-1] = '\n';
+ }
+#endif
+
/* We now have a source line in buf; null terminate and match. */
*p = 0;
if (re_exec (buf) > 0)