From 1952e2e1c1be6f107fa3ce8b10025cfd1cd7943b Mon Sep 17 00:00:00 2001 From: "David E. O'Brien" Date: Fri, 1 Feb 2002 18:16:02 +0000 Subject: Enlist the FreeBSD-CURRENT users as testers of what is to become Gcc 3.1.0. These bits are taken from the FSF anoncvs repo on 1-Feb-2002 08:20 PST. --- contrib/gcc/prefix.c | 263 +++++++++++++++++++++------------------------------ 1 file changed, 109 insertions(+), 154 deletions(-) (limited to 'contrib/gcc/prefix.c') diff --git a/contrib/gcc/prefix.c b/contrib/gcc/prefix.c index 8bf5696f07fa..88906731bfd5 100644 --- a/contrib/gcc/prefix.c +++ b/contrib/gcc/prefix.c @@ -1,12 +1,12 @@ /* Utility to update paths from internal to external forms. - Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. -This file is part of GNU CC. +This file is part of GCC. -GNU CC 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 your option) any later version. +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 +your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -44,9 +44,10 @@ Boston, MA 02111-1307, USA. */ -- If this is a Win32 OS, then the Registry will be examined for an entry of "key" in - HKEY_LOCAL_MACHINE\SOFTWARE\Free Software Foundation\ + HKEY_LOCAL_MACHINE\SOFTWARE\Free Software Foundation\ - if found, that value will be used. + if found, that value will be used. defaults to GCC version + string, but can be overridden at configuration time. -- If not found (or not a Win32 OS), the environment variable key_ROOT (the value of "key" concatenated with the constant "_ROOT") @@ -65,33 +66,23 @@ Boston, MA 02111-1307, USA. */ #include "config.h" #include "system.h" -#ifdef _WIN32 +#if defined(_WIN32) && defined(ENABLE_WIN32_REGISTRY) #include #endif #include "prefix.h" static const char *std_prefix = PREFIX; -static const char *get_key_value PROTO((char *)); -static const char *translate_name PROTO((const char *)); -static char *save_string PROTO((const char *, int)); +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)); -#ifdef _WIN32 -static char *lookup_key PROTO((char *)); +#if defined(_WIN32) && defined(ENABLE_WIN32_REGISTRY) +static char *lookup_key PARAMS ((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 * @@ -101,12 +92,12 @@ get_key_value (key) const char *prefix = 0; char *temp = 0; -#ifdef _WIN32 +#if defined(_WIN32) && defined(ENABLE_WIN32_REGISTRY) prefix = lookup_key (key); #endif if (prefix == 0) - prefix = getenv (temp = concat (key, "_ROOT", NULL_PTR)); + prefix = getenv (temp = concat (key, "_ROOT", NULL)); if (prefix == 0) prefix = std_prefix; @@ -117,62 +108,6 @@ get_key_value (key) return prefix; } -/* Concatenate a sequence of strings, returning the result. - - This function is based on the one in libiberty. */ - -char * -concat VPROTO((const char *first, ...)) -{ - register int length; - register char *newstr; - register char *end; - register const char *arg; - va_list args; -#ifndef ANSI_PROTOTYPES - const char *first; -#endif - - /* First compute the size of the result and get sufficient memory. */ - - VA_START (args, first); -#ifndef ANSI_PROTOTYPES - first = va_arg (args, const char *); -#endif - - arg = first; - length = 0; - - while (arg != 0) - { - length += strlen (arg); - arg = va_arg (args, const char *); - } - - newstr = (char *) malloc (length + 1); - va_end (args); - - /* Now copy the individual pieces to the result string. */ - - VA_START (args, first); -#ifndef ANSI_PROTOTYPES - first = va_arg (args, char *); -#endif - - end = newstr; - arg = first; - while (arg != 0) - { - while (*arg) - *end++ = *arg++; - arg = va_arg (args, const char *); - } - *end = '\000'; - va_end (args); - - return (newstr); -} - /* Return a copy of a string that has been placed in the heap. */ static char * @@ -180,14 +115,14 @@ save_string (s, len) const char *s; int len; { - register char *result = xmalloc (len + 1); + char *result = xmalloc (len + 1); - bcopy (s, result, len); + memcpy (result, s, len); result[len] = 0; return result; } -#ifdef _WIN32 +#if defined(_WIN32) && defined(ENABLE_WIN32_REGISTRY) /* Look up "key" in the registry, as above. */ @@ -209,6 +144,10 @@ lookup_key (key) res = RegOpenKeyExA (reg_key, "Free Software Foundation", 0, KEY_READ, ®_key); + if (res == ERROR_SUCCESS) + res = RegOpenKeyExA (reg_key, WIN32_REGISTRY_KEY, 0, + KEY_READ, ®_key); + if (res != ERROR_SUCCESS) { reg_key = (HKEY) INVALID_HANDLE_VALUE; @@ -217,12 +156,12 @@ lookup_key (key) } size = 32; - dst = (char *) malloc (size); + dst = (char *) xmalloc (size); res = RegQueryValueExA (reg_key, key, 0, &type, dst, &size); if (res == ERROR_MORE_DATA && type == REG_SZ) { - dst = (char *) realloc (dst, size); + dst = (char *) xrealloc (dst, size); res = RegQueryValueExA (reg_key, key, 0, &type, dst, &size); } @@ -236,103 +175,119 @@ lookup_key (key) } #endif -/* If NAME starts with a '@' or '$', apply the translation rules above - and return a new name. Otherwise, return the given name. */ +/* If NAME, a malloc-ed string, starts with a '@' or '$', apply the + translation rules above and return a newly malloc-ed name. + Otherwise, return the given name. */ -static const char * +static char * translate_name (name) - const char *name; + char *name; { - char code = name[0]; - char *key; - const char *prefix = 0; + char code; + char *key, *old_name; + const char *prefix; int keylen; - if (code != '@' && code != '$') - return name; - - for (keylen = 0; - (name[keylen + 1] != 0 && !IS_DIR_SEPARATOR (name[keylen + 1])); - keylen++) - ; + for (;;) + { + code = name[0]; + if (code != '@' && code != '$') + break; + + for (keylen = 0; + (name[keylen + 1] != 0 && !IS_DIR_SEPARATOR (name[keylen + 1])); + keylen++) + ; + + key = (char *) alloca (keylen + 1); + strncpy (key, &name[1], keylen); + key[keylen] = 0; + + if (code == '@') + { + prefix = get_key_value (key); + if (prefix == 0) + prefix = std_prefix; + } + else + prefix = getenv (key); - key = (char *) alloca (keylen + 1); - strncpy (key, &name[1], keylen); - key[keylen] = 0; + if (prefix == 0) + prefix = PREFIX; - name = &name[keylen + 1]; + /* We used to strip trailing DIR_SEPARATORs here, but that can + sometimes yield a result with no separator when one was coded + and intended by the user, causing two path components to run + together. */ - if (code == '@') - { - prefix = get_key_value (key); - if (prefix == 0) - prefix = std_prefix; + old_name = name; + name = concat (prefix, &name[keylen + 1], NULL); + free (old_name); } - else - prefix = getenv (key); - if (prefix == 0) - prefix = PREFIX; + return name; +} - /* Remove any trailing directory separator from what we got. */ - if (IS_DIR_SEPARATOR (prefix[strlen (prefix) - 1])) +/* In a NUL-terminated STRING, replace character C1 with C2 in-place. */ +static void +tr (string, c1, c2) + char *string; + int c1, c2; +{ + do { - char * temp = save_string (prefix, strlen (prefix)); - temp[strlen (temp) - 1] = 0; - prefix = temp; + if (*string == c1) + *string = c2; } - - return concat (prefix, name, NULL_PTR); + while (*string++); } -/* Update PATH using KEY if PATH starts with PREFIX. */ +/* Update PATH using KEY if PATH starts with PREFIX. The returned + string is always malloc-ed, and the caller is responsible for + freeing it. */ -const char * +char * update_path (path, key) const char *path; const char *key; { + char *result; + if (! strncmp (path, std_prefix, strlen (std_prefix)) && key != 0) { - if (key[0] != '$') - key = concat ("@", key, NULL_PTR); - - path = concat (key, &path[strlen (std_prefix)], NULL_PTR); + bool free_key = false; - while (path[0] == '@' || path[0] == '$') - path = translate_name (path); + if (key[0] != '$') + { + key = concat ("@", key, NULL); + free_key = true; + } + + result = concat (key, &path[strlen (std_prefix)], NULL); + if (free_key) + free ((char *) key); + result = translate_name (result); } + else + result = xstrdup (path); + +#ifdef UPDATE_PATH_HOST_CANONICALIZE + /* Perform host dependent canonicalization when needed. */ + UPDATE_PATH_HOST_CANONICALIZE (path); +#endif #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; - } + /* Convert DIR_SEPARATOR_2 to DIR_SEPARATOR. */ + if (DIR_SEPARATOR_2 != DIR_SEPARATOR) + tr (result, DIR_SEPARATOR_2, DIR_SEPARATOR); #endif - + #if defined (DIR_SEPARATOR) && !defined (DIR_SEPARATOR_2) if (DIR_SEPARATOR != '/') - { - int i; - int len = strlen (path); - char *new_path = save_string (path, len); - - for (i = 0; i < len; i++) - if (new_path[i] == '/') - new_path[i] = DIR_SEPARATOR; - - path = new_path; - } + tr (result, '/', DIR_SEPARATOR); #endif - return path; + return result; } /* Reset the standard prefix */ -- cgit v1.2.3