diff options
author | Doug Rupp <rupp@adacore.com> | 2005-06-16 10:30:18 +0200 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2005-06-16 10:30:18 +0200 |
commit | 99b97b2e96674bbb43bcd9509009fd2e2663c287 (patch) | |
tree | 844344f2c331434b0910c59cb402352ca3d232dd /gcc/ada/adaint.c | |
parent | 1e813ab6c01a9a4628f991c7a91719e4988c590c (diff) | |
download | gcc-99b97b2e96674bbb43bcd9509009fd2e2663c287.zip gcc-99b97b2e96674bbb43bcd9509009fd2e2663c287.tar.gz gcc-99b97b2e96674bbb43bcd9509009fd2e2663c287.tar.bz2 |
adaint.c (__gnat_to_canonical_file_spec): Check for error returns in call to decc$translate_vms.
2005-06-14 Doug Rupp <rupp@adacore.com>
Pascal Obry <obry@adacore.com>
* adaint.c (__gnat_to_canonical_file_spec): Check for error returns in
call to decc$translate_vms.
(__gnat_locate_regular_file): Check if the path_val contains quotes. We
need to remove those quotes before catenating the filename.
(__gnat_locate_exec_on_path): improvements to the Win32 section:
* avoid allocating the memory twice for better efficiency;
* allocate 32K buffer for environment expansion as suggested by MSDN;
* prepend ".;" to the path so that current directory is searched too.
From-SVN: r101020
Diffstat (limited to 'gcc/ada/adaint.c')
-rw-r--r-- | gcc/ada/adaint.c | 74 |
1 files changed, 55 insertions, 19 deletions
diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c index b98b52c..51c01ab 100644 --- a/gcc/ada/adaint.c +++ b/gcc/ada/adaint.c @@ -1939,13 +1939,30 @@ char * __gnat_locate_regular_file (char *file_name, char *path_val) { char *ptr; - int absolute = __gnat_is_absolute_path (file_name, strlen (file_name)); + char *file_path = alloca (strlen (file_name) + 1); + int absolute; + + /* Remove quotes around file_name if present */ + + ptr = file_name; + if (*ptr == '"') + ptr++; + + strcpy (file_path, ptr); + + ptr = file_path + strlen (file_path) - 1; + + if (*ptr == '"') + *ptr = '\0'; /* Handle absolute pathnames. */ + + absolute = __gnat_is_absolute_path (file_path, strlen (file_name)); + if (absolute) { - if (__gnat_is_regular_file (file_name)) - return xstrdup (file_name); + if (__gnat_is_regular_file (file_path)) + return xstrdup (file_path); return 0; } @@ -1976,10 +1993,21 @@ __gnat_locate_regular_file (char *file_name, char *path_val) if (*path_val == 0) return 0; + /* Skip the starting quote */ + + if (*path_val == '"') + path_val++; + for (ptr = file_path; *path_val && *path_val != PATH_SEPARATOR; ) - *ptr++ = *path_val++; + *ptr++ = *path_val++; ptr--; + + /* Skip the ending quote */ + + if (*ptr == '"') + ptr--; + if (*ptr != '/' && *ptr != DIR_SEPARATOR) *++ptr = DIR_SEPARATOR; @@ -2026,20 +2054,24 @@ __gnat_locate_exec_on_path (char *exec_name) #endif #ifdef _WIN32 /* In Win32 systems we expand the PATH as for XP environment - variables are not automatically expanded. */ - int len = strlen (path_val) * 3; - char *expanded_path_val = alloca (len + 1); + variables are not automatically expanded. We also prepend the + ".;" to the path to match normal NT path search semantics */ - DWORD res = ExpandEnvironmentStrings (path_val, expanded_path_val, len); + #define EXPAND_BUFFER_SIZE 32767 - if (res != 0) - { - path_val = expanded_path_val; - } -#endif + apath_val = alloca (EXPAND_BUFFER_SIZE); + + apath_val [0] = '.'; + apath_val [1] = ';'; + DWORD res = ExpandEnvironmentStrings + (path_val, apath_val + 2, EXPAND_BUFFER_SIZE - 2); + + if (!res) apath_val [0] = '\0'; +#else apath_val = alloca (strlen (path_val) + 1); strcpy (apath_val, path_val); +#endif return __gnat_locate_exec (exec_name, apath_val); } @@ -2218,15 +2250,19 @@ __gnat_to_canonical_file_spec (char *filespec) if (strchr (filespec, ']') || strchr (filespec, ':')) { - strncpy (new_canonical_filespec, - (char *) decc$translate_vms (filespec), MAXPATH); + char *tspec = (char *) decc$translate_vms (filespec); + + if (tspec != (char *) -1) + strncpy (new_canonical_filespec, tspec, MAXPATH); } else if ((strlen (filespec) == strspn (filespec, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_")) && (filespec1 = getenv (filespec))) { - strncpy (new_canonical_filespec, - (char *) decc$translate_vms (filespec1), MAXPATH); + char *tspec = (char *) decc$translate_vms (filespec1); + + if (tspec != (char *) -1) + strncpy (new_canonical_filespec, tspec, MAXPATH); } else { @@ -2484,7 +2520,7 @@ _flush_cache() #if defined (CROSS_COMPILE) \ || (! (defined (sparc) && defined (sun) && defined (__SVR4)) \ - && ! (defined (linux) && defined (i386)) \ + && ! (defined (linux) && (defined (i386) || defined (__x86_64__))) \ && ! defined (__FreeBSD__) \ && ! defined (__hpux__) \ && ! defined (__APPLE__) \ @@ -2494,7 +2530,7 @@ _flush_cache() && ! (defined (__mips) && defined (__sgi))) /* Dummy function to satisfy g-trasym.o. Currently Solaris sparc, HP/UX, - GNU/Linux x86, Tru64 & Windows provide a non-dummy version of this + GNU/Linux x86{_64}, Tru64 & Windows provide a non-dummy version of this procedure in libaddr2line.a. */ void |