From 79b23a1e754f308ddfdfffb71bf9c8de4a75e3fb Mon Sep 17 00:00:00 2001
From: law <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Sat, 10 Apr 1999 04:27:16 +0000
Subject: [PATCH]         * collect2.c (find_a_file): Use
 HAVE_DOS_BASED_FILE_SYSTEM in place         of the DIR_SEPARATOR test.       
  Consider any file starting with a drivename to be absolute.         If the
 absolute filename test fails and EXECUTABLE_SUFFIX is         defined, append
 EXECUTABLE_SUFFIX to the file and try again.         * cppinit.c (base_name):
 Use HAVE_DOS_BASED_FILE_SYSTEM         in place of __MSDOS__ and _WIN32.     
    * cppfiles.c (simplify_pathname): Likewise.         * gcc.c
 (IS_DIR_SEPARATOR): Define new macro. Returns true if a         character is
 a directory separator.         (find_a_file): Use it.        
 (convert_filename): Likewise.         (process_command): Likewise.        
 (do_spec_1): Likewise.         (is_directory): Likewise.         (main):
 Likewise.         * prefix.c (IS_DIR_SEPARATOR): Define. Tests whether a
 character is         a directory separator.         (translate_name): Use it.
         (update_path): Change DIR_SEPARATOR_2 to DIR_SEPARATOR. Fix        
 warning in block where '/' is changed to DIR_SEPARATOR.         *
 i386/xm-djgpp.h (DIR_SEPARATOR): Set to '/'.         (DIR_SEPARATOR_2): New
 macro. Set to '\'.         (HAVE_DOS_BASED_FILESYS): Define.         *
 i386/xm-mingw32.h: Updated copyright. Set         DIR_SEPARATOR_2 to '/'.
 Define HAVE_DOS_BASED_FILE_SYSTEM.         * i386/xm-os2.h: Likewise.        
 * winnt/xm-winnt.h: Likewise.         * i386/xm-dos.h: Likewise.  Add
 copyright.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@26328 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog                | 32 +++++++++++++++++
 gcc/collect2.c               | 15 ++++++--
 gcc/config/i386/xm-djgpp.h   |  6 +++-
 gcc/config/i386/xm-dos.h     | 24 +++++++++++++
 gcc/config/i386/xm-mingw32.h |  8 ++++-
 gcc/config/i386/xm-os2.h     |  8 ++++-
 gcc/config/winnt/xm-winnt.h  |  7 +++-
 gcc/cppfiles.c               |  2 +-
 gcc/cppinit.c                |  2 +-
 gcc/gcc.c                    | 68 +++++++++++++++++++-----------------
 gcc/prefix.c                 | 47 +++++++++++++++++--------
 11 files changed, 164 insertions(+), 55 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fd8f5d7a3e08..0022e4a88629 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,35 @@
+Sat Apr 10 05:14:50 1999  Mark Elbrecht  <snowball3@usa.net>
+
+	* collect2.c (find_a_file): Use HAVE_DOS_BASED_FILE_SYSTEM in place
+	of the DIR_SEPARATOR test.
+	Consider any file starting with a drivename to be absolute.
+	If the absolute filename test fails and EXECUTABLE_SUFFIX is 
+	defined, append EXECUTABLE_SUFFIX to the file and try again.
+	* cppinit.c (base_name): Use HAVE_DOS_BASED_FILE_SYSTEM 
+	in place of __MSDOS__ and _WIN32.
+	* cppfiles.c (simplify_pathname): Likewise.
+	* gcc.c (IS_DIR_SEPARATOR): Define new macro. Returns true if a
+	character is a directory separator.
+	(find_a_file): Use it.
+	(convert_filename): Likewise.
+	(process_command): Likewise.
+	(do_spec_1): Likewise.
+	(is_directory): Likewise.
+	(main): Likewise.
+	* prefix.c (IS_DIR_SEPARATOR): Define. Tests whether a character is
+	a directory separator.
+	(translate_name): Use it.
+	(update_path): Change DIR_SEPARATOR_2 to DIR_SEPARATOR. Fix 
+	warning in block where '/' is changed to DIR_SEPARATOR.
+	* i386/xm-djgpp.h (DIR_SEPARATOR): Set to '/'.
+	(DIR_SEPARATOR_2): New macro. Set to '\'.
+	(HAVE_DOS_BASED_FILESYS): Define.
+	* i386/xm-mingw32.h: Updated copyright. Set 
+	DIR_SEPARATOR_2 to '/'. Define HAVE_DOS_BASED_FILE_SYSTEM.
+	* i386/xm-os2.h: Likewise.
+	* winnt/xm-winnt.h: Likewise.
+	* i386/xm-dos.h: Likewise.  Add copyright.
+
 1999-04-10  Joseph S. Myers  <jsm28@cam.ac.uk>
 
 	* pdp11.h (TARGET_SWITCHES): Add option to vary assembler syntax.
diff --git a/gcc/collect2.c b/gcc/collect2.c
index 2f31d94138bd..95a99a70e8b4 100644
--- a/gcc/collect2.c
+++ b/gcc/collect2.c
@@ -823,9 +823,8 @@ find_a_file (pprefix, name)
   /* Determine the filename to execute (special case for absolute paths).  */
 
   if (*name == '/'
-#ifdef DIR_SEPARATOR
-      || (DIR_SEPARATOR == '\\' && name[1] == ':'
-      && (name[2] == DIR_SEPARATOR || name[2] == '/'))
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+      || (*name && name[1] == ':')
 #endif
       )
     {
@@ -839,6 +838,16 @@ find_a_file (pprefix, name)
 	  return temp;
 	}
 
+#ifdef EXECUTABLE_SUFFIX
+	/* Some systems have a suffix for executable files.
+	   So try appending that.  */
+      strcpy (temp, name);
+	strcat (temp, EXECUTABLE_SUFFIX);
+	
+	if (access (temp, X_OK) == 0)
+	  return temp;
+#endif
+
       if (debug)
 	fprintf (stderr, "  - failed to locate using absolute path\n");
     }
diff --git a/gcc/config/i386/xm-djgpp.h b/gcc/config/i386/xm-djgpp.h
index de91855f2e70..50034fd071d5 100644
--- a/gcc/config/i386/xm-djgpp.h
+++ b/gcc/config/i386/xm-djgpp.h
@@ -28,7 +28,11 @@ Boston, MA 02111-1307, USA.  */
 #define EXECUTABLE_SUFFIX ".exe"
 
 /* Even though we support "/", allow "\" since everybody tests both.  */
-#define DIR_SEPARATOR '\\'
+#define DIR_SEPARATOR '/'
+#define DIR_SEPARATOR_2 '\\'
+
+/* Allow test for DOS drive names.  */
+#define HAVE_DOS_BASED_FILESYSTEM
 
 #define NO_SYS_SIGLIST 1
 
diff --git a/gcc/config/i386/xm-dos.h b/gcc/config/i386/xm-dos.h
index a734a81b94eb..4e1cb42c8c11 100644
--- a/gcc/config/i386/xm-dos.h
+++ b/gcc/config/i386/xm-dos.h
@@ -1,3 +1,23 @@
+/* Configuration for GNU C-compiler for Intel 80386 running DOS.
+   Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING.  If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
 #include "i386/xm-i386.h"
 
 /* Use semicolons to separate elements of a path.  */
@@ -5,6 +25,10 @@
 
 /* Use backslashs to separate levels of directory.  */
 #define DIR_SEPARATOR '\\'
+#define DIR_SEPARATOR_2 '/'
+
+/* Allow checks for drive names. */
+#define HAVE_DOS_BASED_FILE_SYSTEM
 
 /* Suffix for executable file names.  */
 #define EXECUTABLE_SUFFIX ".exe"
diff --git a/gcc/config/i386/xm-mingw32.h b/gcc/config/i386/xm-mingw32.h
index d818142d9e52..6872580f33e4 100644
--- a/gcc/config/i386/xm-mingw32.h
+++ b/gcc/config/i386/xm-mingw32.h
@@ -1,6 +1,6 @@
 /* Configuration for GNU C-compiler for hosting on Windows32.
    using GNU tools and the Windows32 API Library.
-   Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -36,6 +36,12 @@ Boston, MA 02111-1307, USA. */
 
 /* Even though we support "/", allow "\" since everybody tests both.  */
 #define DIR_SEPARATOR '\\'
+#define DIR_SEPARATOR_2 '/'
+
+/* Mingw32 does not try to hide the underlying DOS-based file system
+   like Cygwin does.  */
+#define HAVE_DOS_BASED_FILE_SYSTEM
+
 #define EXECUTABLE_SUFFIX ".exe"
 
 #undef PATH_SEPARATOR
diff --git a/gcc/config/i386/xm-os2.h b/gcc/config/i386/xm-os2.h
index aed925e993c5..b8a5ad057a3a 100644
--- a/gcc/config/i386/xm-os2.h
+++ b/gcc/config/i386/xm-os2.h
@@ -1,6 +1,6 @@
 /* Configuration for GNU compiler
    for an Intel i386 or later processor running OS/2 2.x.
-   Copyright (C) 1993, 1994, 1995, 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1993, 1994, 1995, 1997, 1998, 1999 Free Software Foundation, Inc.
    Contributed by Samuel Figueroa (figueroa@apple.com)
 
 This file is part of GNU CC.
@@ -54,6 +54,12 @@ int spawnvp (int modeflag, char *path, char *argv[]);
 #ifndef DIR_SEPARATOR
 #define DIR_SEPARATOR '\\'
 #endif
+#ifndef DIR_SEPARATOR_2
+#define DIR_SEPARATOR_2 '/'
+#endif
+
+/* Allow handling of drive names. */
+#define HAVE_DOS_BASED_FILE_SYSTEM
 
 #define EXECUTABLE_SUFFIX ".exe"
 
diff --git a/gcc/config/winnt/xm-winnt.h b/gcc/config/winnt/xm-winnt.h
index f56073cb8de8..0bf8f87d62dd 100644
--- a/gcc/config/winnt/xm-winnt.h
+++ b/gcc/config/winnt/xm-winnt.h
@@ -1,5 +1,5 @@
 /* Configuration for GNU compiler for processor running Windows NT 3.x.
-   Copyright (C) 1993, 1995, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1993, 1995, 1997, 1999 Free Software Foundation, Inc.
    Contributed by Douglas B. Rupp (drupp@cs.washington.edu)
 
 This file is part of GNU CC.
@@ -47,7 +47,12 @@ Boston, MA 02111-1307, USA.  */
 #define OBJECT_SUFFIX ".obj"
 #define EXECUTABLE_SUFFIX ".exe"
 #define PATH_SEPARATOR ';'
+
 #define DIR_SEPARATOR '\\'
+#define DIR_SEPARATOR_2 '/'
+
+/* Allows checks for drive names.  */
+#define HAVE_DOS_BASED_FILE_SYSTEM
 
 #define S_IRUSR 0000400
 #define S_IWUSR 0000200
diff --git a/gcc/cppfiles.c b/gcc/cppfiles.c
index 4c64b9be69fd..6fd240787fde 100644
--- a/gcc/cppfiles.c
+++ b/gcc/cppfiles.c
@@ -1168,7 +1168,7 @@ simplify_pathname (path)
     char *base;
     int absolute = 0;
 
-#if defined _WIN32 || defined __MSDOS__
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
     /* Convert all backslashes to slashes. */
     for (from = path; *from; from++)
 	if (*from == '\\') *from = '/';
diff --git a/gcc/cppinit.c b/gcc/cppinit.c
index 0c151434fdaa..73008008357f 100644
--- a/gcc/cppinit.c
+++ b/gcc/cppinit.c
@@ -430,7 +430,7 @@ base_name (fname)
 {
   char *s = (char *)fname;
   char *p;
-#if defined (__MSDOS__) || defined (_WIN32)
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
   if (ISALPHA (s[0]) && s[1] == ':') s += 2;
   if ((p = rindex (s, '\\'))) s = p + 1;
 #elif defined VMS
diff --git a/gcc/gcc.c b/gcc/gcc.c
index dc321422488e..f3bb55d1e427 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -66,6 +66,14 @@ compilation is specified by a string called a "spec".  */
 #define DIR_SEPARATOR '/'
 #endif
 
+/* Define IS_DIR_SEPARATOR.  */
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
 static char dir_separator_str[] = {DIR_SEPARATOR, 0};
 
 #define obstack_chunk_alloc xmalloc
@@ -1991,10 +1999,12 @@ find_a_file (pprefix, name, mode)
 
   /* Determine the filename to execute (special case for absolute paths).  */
 
-  if (*name == '/' || *name == DIR_SEPARATOR
+  if (IS_DIR_SEPARATOR (*name)
+#ifdef HAVE_DOS_BASED_FILESYSTEM
       /* Check for disk name on MS-DOS-based systems.  */
-      || (DIR_SEPARATOR == '\\' && name[1] == ':'
-	  && (name[2] == DIR_SEPARATOR || name[2] == '/')))
+      || (name[0] && name[1] == ':' && IS_DIR_SEPARATOR (name[2]))
+#endif
+      )
     {
       if (access (name, mode) == 0)
 	{
@@ -2434,7 +2444,7 @@ convert_filename (name, do_exe)
     return name;
 
   for (i = len - 1; i >= 0; i--)
-    if (name[i] == '/' || name[i] == DIR_SEPARATOR)
+    if (IS_DIR_SEPARATOR (name[i]))
       break;
 
   for (i++; i < len; i++)
@@ -2597,13 +2607,12 @@ process_command (argc, argv)
     {
       int len = strlen (gcc_exec_prefix);
       if (len > (int) sizeof ("/lib/gcc-lib/")-1
-	  && (gcc_exec_prefix[len-1] == '/'
-	      || gcc_exec_prefix[len-1] == DIR_SEPARATOR))
+	  && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
 	{
 	  temp = gcc_exec_prefix + len - sizeof ("/lib/gcc-lib/") + 1;
-	  if ((*temp == '/' || *temp == DIR_SEPARATOR)
+	  if (IS_DIR_SEPARATOR (*temp)
 	      && strncmp (temp+1, "lib", 3) == 0
-	      && (temp[4] == '/' || temp[4] == DIR_SEPARATOR)
+	      && IS_DIR_SEPARATOR (temp[4])
 	      && strncmp (temp+5, "gcc-lib", 7) == 0)
 	    len -= sizeof ("/lib/gcc-lib/") - 1;
 	}
@@ -2630,7 +2639,7 @@ process_command (argc, argv)
 	      strncpy (nstore, startp, endp-startp);
 	      if (endp == startp)
 		strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
-	      else if (endp[-1] != '/' && endp[-1] != DIR_SEPARATOR)
+	      else if (!IS_DIR_SEPARATOR (endp[-1]))
 		{
 		  nstore[endp-startp] = DIR_SEPARATOR;
 		  nstore[endp-startp+1] = 0;
@@ -2664,7 +2673,7 @@ process_command (argc, argv)
 	      strncpy (nstore, startp, endp-startp);
 	      if (endp == startp)
 		strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
-	      else if (endp[-1] != '/' && endp[-1] != DIR_SEPARATOR)
+	      else if (!IS_DIR_SEPARATOR (endp[-1]))
 		{
 		  nstore[endp-startp] = DIR_SEPARATOR;
 		  nstore[endp-startp+1] = 0;
@@ -2697,7 +2706,7 @@ process_command (argc, argv)
 	      strncpy (nstore, startp, endp-startp);
 	      if (endp == startp)
 		strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
-	      else if (endp[-1] != '/' && endp[-1] != DIR_SEPARATOR)
+	      else if (!IS_DIR_SEPARATOR (endp[-1]))
 		{
 		  nstore[endp-startp] = DIR_SEPARATOR;
 		  nstore[endp-startp+1] = 0;
@@ -2902,12 +2911,10 @@ process_command (argc, argv)
 		  int len = strlen (value);
 		  if ((len == 7
 		       || (len > 7
-			   && (value[len - 8] == '/'
-			       || value[len - 8] == DIR_SEPARATOR)))
+			   && (IS_DIR_SEPARATOR (value[len - 8]))))
 		      && strncmp (value + len - 7, "stage", 5) == 0
 		      && ISDIGIT (value[len - 2])
-		      && (value[len - 1] == '/'
-			  || value[len - 1] == DIR_SEPARATOR))
+		      && (IS_DIR_SEPARATOR (value[len - 1])))
 		    {
 		      if (len == 7)
 			add_prefix (&include_prefixes, "include", NULL_PTR,
@@ -3074,7 +3081,7 @@ process_command (argc, argv)
      directories, so that we can search both the user specified directory
      and the standard place.  */
 
-  if (*tooldir_prefix != '/' && *tooldir_prefix != DIR_SEPARATOR)
+  if (!IS_DIR_SEPARATOR (*tooldir_prefix))
     {
       if (gcc_exec_prefix)
 	{
@@ -3525,7 +3532,7 @@ do_spec_1 (spec, inswitch, soft_matched_part)
 		  /* Relative directories always come from -B,
 		     and it is better not to use them for searching
 		     at run time.  In particular, stage1 loses  */
-		  if (pl->prefix[0] != '/' && pl->prefix[0] != DIR_SEPARATOR)
+		  if (!IS_DIR_SEPARATOR (pl->prefix[0]))
 		    continue;
 #endif
 		  /* Try subdirectory if there is one.  */
@@ -3582,8 +3589,7 @@ do_spec_1 (spec, inswitch, soft_matched_part)
 			  buffer = (char *) xrealloc (buffer, bufsize);
 			  strcpy (buffer, machine_suffix);
 			  idx = strlen (buffer);
-			  if (buffer[idx - 1] == '/'
-			      || buffer[idx - 1] == DIR_SEPARATOR)
+			  if (IS_DIR_SEPARATOR (buffer[idx - 1]))
 			    buffer[idx - 1] = 0;
 			  do_spec_1 (buffer, 1, NULL_PTR);
 			  /* Make this a separate argument.  */
@@ -3604,8 +3610,7 @@ do_spec_1 (spec, inswitch, soft_matched_part)
 			  buffer = (char *) xrealloc (buffer, bufsize);
 			  strcpy (buffer, pl->prefix);
 			  idx = strlen (buffer);
-			  if (buffer[idx - 1] == '/'
-			      || buffer[idx - 1] == DIR_SEPARATOR)
+			  if (IS_DIR_SEPARATOR (buffer[idx - 1]))
 			    buffer[idx - 1] = 0;
 			  do_spec_1 (buffer, 1, NULL_PTR);
 			  /* Make this a separate argument.  */
@@ -4598,7 +4603,7 @@ is_directory (path1, path2, linker)
   memcpy (path, path1, len1);
   memcpy (path + len1, path2, len2);
   cp = path + len1 + len2;
-  if (cp[-1] != '/' && cp[-1] != DIR_SEPARATOR)
+  if (!IS_DIR_SEPARATOR (cp[-1]))
     *cp++ = DIR_SEPARATOR;
   *cp++ = '.';
   *cp = '\0';
@@ -4646,7 +4651,8 @@ main (argc, argv)
   struct user_specs *uptr;
 
   p = argv[0] + strlen (argv[0]);
-  while (p != argv[0] && p[-1] != '/' && p[-1] != DIR_SEPARATOR) --p;
+  while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
+    --p;
   programname = p;
 
 #ifdef HAVE_LC_MESSAGES
@@ -4848,14 +4854,12 @@ main (argc, argv)
 	 standard_exec_prefix.  This lets us move the installed tree
 	 as a unit.  If GCC_EXEC_PREFIX is defined, base
 	 standard_startfile_prefix on that as well.  */
-      if (*standard_startfile_prefix == '/'
-	  || *standard_startfile_prefix == DIR_SEPARATOR
-	  || *standard_startfile_prefix == '$'
-#ifdef __MSDOS__
-	  /* Check for disk name on MS-DOS-based systems.  */
+      if (IS_DIR_SEPARATOR (*standard_startfile_prefix)
+	    || *standard_startfile_prefix == '$'
+#ifdef HAVE_DOS_BASED_FILESYSTEM
+  	    /* Check for disk name on MS-DOS-based systems.  */
           || (standard_startfile_prefix[1] == ':'
-	      && (standard_startfile_prefix[2] == DIR_SEPARATOR
-		  || standard_startfile_prefix[2] == '/'))
+	      && (IS_DIR_SEPARATOR (standard_startfile_prefix[2])))
 #endif
 	  )
 	add_prefix (&startfile_prefixes, standard_startfile_prefix, "BINUTILS",
@@ -4884,7 +4888,7 @@ main (argc, argv)
     }
   else
     {
-      if (*standard_startfile_prefix != DIR_SEPARATOR && gcc_exec_prefix)
+      if (!IS_DIR_SEPARATOR (*standard_startfile_prefix) && gcc_exec_prefix)
 	add_prefix (&startfile_prefixes,
 		    concat (gcc_exec_prefix, machine_suffix,
 			    standard_startfile_prefix, NULL_PTR),
@@ -5046,7 +5050,7 @@ main (argc, argv)
 
 	  input_basename = input_filename;
 	  for (p = input_filename; *p; p++)
-	    if (*p == '/' || *p == DIR_SEPARATOR)
+	    if (IS_DIR_SEPARATOR (*p))
 	      input_basename = p + 1;
 
 	  /* Find a suffix starting with the last period,
diff --git a/gcc/prefix.c b/gcc/prefix.c
index e5ca9239410e..8bf5696f07fa 100644
--- a/gcc/prefix.c
+++ b/gcc/prefix.c
@@ -81,6 +81,17 @@ static char *lookup_key		PROTO((char *));
 static HKEY reg_key = (HKEY) INVALID_HANDLE_VALUE;
 #endif
 
+#ifndef DIR_SEPARATOR
+# define IS_DIR_SEPARATOR(ch) ((ch) == '/')
+#else /* DIR_SEPARATOR */
+# ifndef DIR_SEPARATOR_2
+#  define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+# else /* DIR_SEPARATOR && DIR_SEPARATOR_2 */
+#  define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+# endif /* DIR_SEPARATOR && DIR_SEPARATOR_2 */
+#endif /* DIR_SEPARATOR */
+
 /* Given KEY, as above, return its value.  */
 
 static const char *
@@ -241,11 +252,7 @@ translate_name (name)
     return name;
 
   for (keylen = 0;
-       (name[keylen + 1] != 0 && name[keylen + 1] != '/'
-#ifdef DIR_SEPARATOR
-	&& name[keylen + 1] != DIR_SEPARATOR
-#endif
-	);
+       (name[keylen + 1] != 0 && !IS_DIR_SEPARATOR (name[keylen + 1]));
        keylen++)
     ;
 
@@ -268,11 +275,7 @@ translate_name (name)
     prefix = PREFIX;
 
   /* Remove any trailing directory separator from what we got.  */
-  if (prefix[strlen (prefix) - 1] == '/'
-#ifdef DIR_SEPARATOR
-      || prefix[strlen (prefix) - 1] == DIR_SEPARATOR
-#endif
-      )
+  if (IS_DIR_SEPARATOR (prefix[strlen (prefix) - 1]))
     {
       char * temp = save_string (prefix, strlen (prefix));
       temp[strlen (temp) - 1] = 0;
@@ -299,17 +302,33 @@ update_path (path, key)
       while (path[0] == '@' || path[0] == '$')
 	path = translate_name (path);
     }
+
+#ifdef DIR_SEPARATOR_2
+  /* Convert DIR_SEPARATOR_2 to DIR_SEPARATOR. */
+  if (DIR_SEPARATOR != DIR_SEPARATOR_2)
+    {
+      int i;
+      int len = strlen (path);
+      char *new_path = save_string (path, len);
+      for (i = 0; i < len; i++)
+        if (new_path[i] == DIR_SEPARATOR_2)
+          new_path[i] = DIR_SEPARATOR;
+      path = new_path;
+    }
+#endif
       
-#ifdef DIR_SEPARATOR
+#if defined (DIR_SEPARATOR) && !defined (DIR_SEPARATOR_2)
   if (DIR_SEPARATOR != '/')
     {
       int i;
       int len = strlen (path);
+      char *new_path = save_string (path, len);
 
-      path = save_string (path, len);
       for (i = 0; i < len; i++)
-	if (path[i] == '/')
-	  path[i] = DIR_SEPARATOR;
+        if (new_path[i] == '/')
+          new_path[i] = DIR_SEPARATOR;
+
+      path = new_path;
     }
 #endif
 
-- 
GitLab