X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fprefix.c;h=c72203c22219082a5ee993143f73ac42e66cf1aa;hb=05476866247e4b65496693ee6ced12d85922d011;hp=18f79987a34e8284b1e87f4ee5a1d03cbe4b1449;hpb=9039f3fdae4fe3b4686e1e8635be51911d512d9a;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/prefix.c b/gcc/prefix.c index 18f79987a34..c72203c2221 100644 --- a/gcc/prefix.c +++ b/gcc/prefix.c @@ -1,12 +1,12 @@ /* Utility to update paths from internal to external forms. - Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 - Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, + 2007 Free Software Foundation, Inc. This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by -the Free Software Foundation; either version 2 of the License, or (at +the Free Software Foundation; either version 3 of the License, or (at your option) any later version. GCC is distributed in the hope that it will be useful, @@ -15,9 +15,8 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public -License along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +License along with GCC; see the file COPYING3. If not see +. */ /* This file contains routines to update a path, both to canonicalize the directory format and to handle any prefix translation. @@ -67,6 +66,8 @@ Boston, MA 02111-1307, USA. */ #include "config.h" #include "system.h" +#include "coretypes.h" +#include "tm.h" #if defined(_WIN32) && defined(ENABLE_WIN32_REGISTRY) #include #endif @@ -74,21 +75,20 @@ Boston, MA 02111-1307, USA. */ static const char *std_prefix = PREFIX; -static const char *get_key_value PARAMS ((char *)); -static char *translate_name PARAMS ((char *)); -static char *save_string PARAMS ((const char *, int)); -static void tr PARAMS ((char *, int, int)); +static const char *get_key_value (char *); +static char *translate_name (char *); +static char *save_string (const char *, int); +static void tr (char *, int, int); #if defined(_WIN32) && defined(ENABLE_WIN32_REGISTRY) -static char *lookup_key PARAMS ((char *)); +static char *lookup_key (char *); static HKEY reg_key = (HKEY) INVALID_HANDLE_VALUE; #endif /* Given KEY, as above, return its value. */ static const char * -get_key_value (key) - char *key; +get_key_value (char *key) { const char *prefix = 0; char *temp = 0; @@ -112,11 +112,9 @@ get_key_value (key) /* Return a copy of a string that has been placed in the heap. */ static char * -save_string (s, len) - const char *s; - int len; +save_string (const char *s, int len) { - char *result = xmalloc (len + 1); + char *result = XNEWVEC (char, len + 1); memcpy (result, s, len); result[len] = 0; @@ -125,11 +123,14 @@ save_string (s, len) #if defined(_WIN32) && defined(ENABLE_WIN32_REGISTRY) +#ifndef WIN32_REGISTRY_KEY +# define WIN32_REGISTRY_KEY BASEVER +#endif + /* Look up "key" in the registry, as above. */ static char * -lookup_key (key) - char *key; +lookup_key (char *key) { char *dst; DWORD size; @@ -157,13 +158,13 @@ lookup_key (key) } size = 32; - dst = (char *) xmalloc (size); + dst = xmalloc (size); - res = RegQueryValueExA (reg_key, key, 0, &type, dst, &size); + res = RegQueryValueExA (reg_key, key, 0, &type, (LPBYTE) dst, &size); if (res == ERROR_MORE_DATA && type == REG_SZ) { - dst = (char *) xrealloc (dst, size); - res = RegQueryValueExA (reg_key, key, 0, &type, dst, &size); + dst = xrealloc (dst, size); + res = RegQueryValueExA (reg_key, key, 0, &type, (LPBYTE) dst, &size); } if (type != REG_SZ || res != ERROR_SUCCESS) @@ -181,8 +182,7 @@ lookup_key (key) Otherwise, return the given name. */ static char * -translate_name (name) - char *name; +translate_name (char *name) { char code; char *key, *old_name; @@ -231,9 +231,7 @@ translate_name (name) /* In a NUL-terminated STRING, replace character C1 with C2 in-place. */ static void -tr (string, c1, c2) - char *string; - int c1, c2; +tr (char *string, int c1, int c2) { do { @@ -243,18 +241,20 @@ tr (string, c1, c2) while (*string++); } -/* Update PATH using KEY if PATH starts with PREFIX. The returned - string is always malloc-ed, and the caller is responsible for - freeing it. */ +/* Update PATH using KEY if PATH starts with PREFIX as a directory. + The returned string is always malloc-ed, and the caller is + responsible for freeing it. */ char * -update_path (path, key) - const char *path; - const char *key; +update_path (const char *path, const char *key) { char *result, *p; + const int len = strlen (std_prefix); - if (! strncmp (path, std_prefix, strlen (std_prefix)) && key != 0) + if (! strncmp (path, std_prefix, len) + && (IS_DIR_SEPARATOR(path[len]) + || path[len] == '\0') + && key != 0) { bool free_key = false; @@ -264,9 +264,9 @@ update_path (path, key) free_key = true; } - result = concat (key, &path[strlen (std_prefix)], NULL); + result = concat (key, &path[len], NULL); if (free_key) - free ((char *) key); + free (CONST_CAST (char *, key)); result = translate_name (result); } else @@ -284,49 +284,39 @@ update_path (path, key) p = strchr (p, '.'); if (p == NULL) break; - /* Get rid of a leading `./' and replace `/./' with `/', when - such components are followed with another `.'. */ - if (IS_DIR_SEPARATOR (p[1]) - && (p == result || IS_DIR_SEPARATOR (p[-1]))) - { - src = p + 2; - /* Be careful about .//foo */ - while (IS_DIR_SEPARATOR (*src)) - ++src; - if (*src == '.') - { - dest = p; - while ((*dest++ = *src++) != 0) - ; - } - else - ++p; - } /* Look for `/../' */ - else if (p[1] == '.' - && IS_DIR_SEPARATOR (p[2]) - && (p != result && IS_DIR_SEPARATOR (p[-1]))) + if (p[1] == '.' + && IS_DIR_SEPARATOR (p[2]) + && (p != result && IS_DIR_SEPARATOR (p[-1]))) { *p = 0; if (!ALWAYS_STRIP_DOTDOT && access (result, X_OK) == 0) { *p = '.'; - p += 3; + break; } else { /* We can't access the dir, so we won't be able to - access dir/.. either. Strip out dir/.. We know dir - isn't `.' because we've rid ourselves of `.' path - components above. */ - dest = p - 1; - while (dest != result && IS_DIR_SEPARATOR (*dest)) - --dest; - while (dest != result && !IS_DIR_SEPARATOR (dest[-1])) - --dest; - /* Don't strip leading `/'. */ - while (IS_DIR_SEPARATOR (*dest)) - ++dest; + access dir/.. either. Strip out `dir/../'. If `dir' + turns out to be `.', strip one more path component. */ + dest = p; + do + { + --dest; + while (dest != result && IS_DIR_SEPARATOR (*dest)) + --dest; + while (dest != result && !IS_DIR_SEPARATOR (dest[-1])) + --dest; + } + while (dest != result && *dest == '.'); + /* If we have something like `./..' or `/..', don't + strip anything more. */ + if (*dest == '.' || IS_DIR_SEPARATOR (*dest)) + { + *p = '.'; + break; + } src = p + 3; while (IS_DIR_SEPARATOR (*src)) ++src; @@ -358,11 +348,9 @@ update_path (path, key) return result; } -/* Reset the standard prefix */ +/* Reset the standard prefix. */ void -set_std_prefix (prefix, len) - const char *prefix; - int len; +set_std_prefix (const char *prefix, int len) { std_prefix = save_string (prefix, len); }