From 51c042567c98b0a181246523acad810cbf1b35f5 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Mon, 20 Aug 2001 06:14:53 +0000 Subject: [PATCH] cppinit.c (init_standard_includes): The returned buffer is already malloc-ed. * cppinit.c (init_standard_includes): The returned buffer is already malloc-ed. * gcc.c (add_prefix): Similarly. * prefix.c (translate_name): Update to support clear buffer ownership rules. (update_path): Similarly. Be sure to free any newly allocated key. UPDATE_PATH_HOST_CANONICALIZE takes only one argument. (tr): New function. * prefix.h (update_path): Update prototype and document. * config/i386/xm-djgpp.h (UPDATE_PATH_HOST_CANONICALIZE): Clean up and update to new buffer ownership rules. * doc/gcc.texi (UPDATE_PATH_HOST_CANONICALIZE): Update. From-SVN: r45043 --- gcc/ChangeLog | 15 ++++ gcc/config/i386/xm-djgpp.h | 38 ++++------ gcc/cppinit.c | 2 +- gcc/doc/gcc.texi | 11 +-- gcc/gcc.c | 2 +- gcc/prefix.c | 145 +++++++++++++++++++++---------------- gcc/prefix.h | 5 +- 7 files changed, 123 insertions(+), 95 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d37e8f4d98d..c7c501e3757 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2001-08-20 Neil Booth + + * cppinit.c (init_standard_includes): The returned buffer + is already malloc-ed. + * gcc.c (add_prefix): Similarly. + * prefix.c (translate_name): Update to support clear buffer + ownership rules. + (update_path): Similarly. Be sure to free any newly allocated + key. UPDATE_PATH_HOST_CANONICALIZE takes only one argument. + (tr): New function. + * prefix.h (update_path): Update prototype and document. + * config/i386/xm-djgpp.h (UPDATE_PATH_HOST_CANONICALIZE): Clean + up and update to new buffer ownership rules. + * doc/gcc.texi (UPDATE_PATH_HOST_CANONICALIZE): Update. + Mon Aug 20 01:44:50 CEST 2001 Jan Hubicka * final.c (compute_alignments): New function. diff --git a/gcc/config/i386/xm-djgpp.h b/gcc/config/i386/xm-djgpp.h index c26a5cf7bc8..cad1abf64c1 100644 --- a/gcc/config/i386/xm-djgpp.h +++ b/gcc/config/i386/xm-djgpp.h @@ -82,27 +82,17 @@ Boston, MA 02111-1307, USA. */ md_exec_prefix = update_path (md_exec_prefix, NULL); \ } while (0) -/* Canonicalize paths containing '/dev/env/', especially those in - prefix.c. */ -#define UPDATE_PATH_HOST_CANONICALIZE(PATH, KEY) \ - do { \ - if (strncmp (PATH, "/dev/env/", sizeof("/dev/env/") - 1) == 0) \ - { \ - static char *djdir; \ - static int djdir_len; \ - static char fixed_path[FILENAME_MAX + 1]; \ - char *new_path; \ - /* The default prefixes all use '/dev/env/DJDIR', so optimize \ - for this. All other uses of '/dev/env/' go through \ - libc's canonicalization function. */ \ - _fixpath (PATH, fixed_path); \ - /* _fixpath removes any trailing '/', so add it back. */ \ - strcat (fixed_path, "/"); \ - new_path = xstrdup (fixed_path); \ - PATH = new_path; \ - return PATH; \ - } \ - /* If DIR_SEPARATOR_2 isn't in PATH, nothing more need be done. */ \ - if (strchr (PATH, DIR_SEPARATOR_2) == NULL) \ - return PATH; \ - } while (0) +/* Canonicalize paths containing '/dev/env/'; used in prefix.c. + _fixpath is a djgpp-specific function to canonicalize a path. + "/dev/env/DJDIR" evaluates to "c:/djgpp" if DJDIR is "c:/djgpp" for + example. It removes any trailing '/', so add it back. */ +#define UPDATE_PATH_HOST_CANONICALIZE(PATH) \ + if (memcmp ((PATH), "/dev/env/", sizeof("/dev/env/") - 1) == 0) \ + { \ + static char fixed_path[FILENAME_MAX + 1]; \ + \ + _fixpath ((PATH), fixed_path); \ + strcat (fixed_path, "/"); \ + free (PATH); \ + (PATH) = xstrdup (fixed_path); \ + } diff --git a/gcc/cppinit.c b/gcc/cppinit.c index 0b47abea185..4a78a938987 100644 --- a/gcc/cppinit.c +++ b/gcc/cppinit.c @@ -861,7 +861,7 @@ init_standard_includes (pfile) || (CPP_OPTION (pfile, cplusplus) && !CPP_OPTION (pfile, no_standard_cplusplus_includes))) { - char *str = xstrdup (update_path (p->fname, p->component)); + char *str = update_path (p->fname, p->component); append_include_chain (pfile, str, SYSTEM, p->cxx_aware); } } diff --git a/gcc/doc/gcc.texi b/gcc/doc/gcc.texi index 862d2fe29db..befee3643bb 100644 --- a/gcc/doc/gcc.texi +++ b/gcc/doc/gcc.texi @@ -4059,12 +4059,13 @@ If defined, a C statement (sans semicolon) that performs host-dependent initialization when a compilation driver is being initialized. @findex UPDATE_PATH_HOST_CANONICALIZE -@item UPDATE_PATH_HOST_CANONICALIZE (@var{path}, @var{key}) +@item UPDATE_PATH_HOST_CANONICALIZE (@var{path}) If defined, a C statement (sans semicolon) that performs host-dependent -canonicalization when a path used in a compilation driver or preprocessor is -canonicalized. @var{path} is the path to be canonicalized, and @var{key} is -a translation prefix when its value isn't @code{NULL}. If the C statement -does canonicalize @var{path}, the new path should be returned. +canonicalization when a path used in a compilation driver or +preprocessor is canonicalized. @var{path} is a malloc-ed path to be +canonicalized. If the C statement does canonicalize @var{path} into a +different buffer, the old path should be freed and the new buffer should +have been allocated with malloc. @end table @findex bzero diff --git a/gcc/gcc.c b/gcc/gcc.c index 5d1806323ad..47cfa2e95ff 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -2607,7 +2607,7 @@ add_prefix (pprefix, prefix, component, priority, require_machine_suffix, warn) pprefix->max_len = len; pl = (struct prefix_list *) xmalloc (sizeof (struct prefix_list)); - pl->prefix = save_string (prefix, len); + pl->prefix = prefix; pl->require_machine_suffix = require_machine_suffix; pl->used_flag_ptr = warn; pl->priority = priority; diff --git a/gcc/prefix.c b/gcc/prefix.c index 5fa47e75a63..1ad88cfe8ec 100644 --- a/gcc/prefix.c +++ b/gcc/prefix.c @@ -74,8 +74,9 @@ Boston, MA 02111-1307, USA. */ static const char *std_prefix = PREFIX; static const char *get_key_value PARAMS ((char *)); -static const char *translate_name PARAMS ((const char *)); +static char *translate_name PARAMS ((char *)); static char *save_string PARAMS ((const char *, int)); +static void tr PARAMS ((char *, int, int)); #if defined(_WIN32) && defined(ENABLE_WIN32_REGISTRY) static char *lookup_key PARAMS ((char *)); @@ -230,101 +231,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; - - /* 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. */ + return name; +} - return concat (prefix, name, NULL); +/* In a NUL-terminated STRING, replace character C1 with C2 in-place. */ +static void +tr (string, c1, c2) + char *string; + int c1, c2; +{ + do + { + if (*string == c1) + *string = c2; + } + 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); - - path = concat (key, &path[strlen (std_prefix)], NULL); + 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 dependant canonicalization when needed. */ -UPDATE_PATH_HOST_CANONICALIZE (path, key); + /* 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) - { - char *new_path = xstrdup (path); - path = new_path; - do { - if (*new_path == DIR_SEPARATOR_2) - *new_path = DIR_SEPARATOR; - } while (*new_path++); - } + 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 != '/') - { - char *new_path = xstrdup (path); - path = new_path; - do { - if (*new_path == '/') - *new_path = DIR_SEPARATOR; - } while (*new_path++); - } + tr (result, '/', DIR_SEPARATOR); #endif - return path; + return result; } /* Reset the standard prefix */ diff --git a/gcc/prefix.h b/gcc/prefix.h index 03c0d191fc2..b712900cd82 100644 --- a/gcc/prefix.h +++ b/gcc/prefix.h @@ -22,7 +22,10 @@ Boston, MA 02111-1307, USA. */ #ifndef GCC_PREFIX_H #define GCC_PREFIX_H -extern const char *update_path PARAMS ((const char *, const char *)); +/* Update PATH using KEY if PATH starts with PREFIX. The returned + string is always malloc-ed, and the caller is responsible for + freeing it. */ +extern char *update_path PARAMS ((const char *path, const char *key)); extern void set_std_prefix PARAMS ((const char *, int)); #endif /* ! GCC_PREFIX_H */ -- 2.30.2