diff options
author | drow <drow@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-11-22 20:01:07 +0000 |
---|---|---|
committer | drow <drow@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-11-22 20:01:07 +0000 |
commit | 5feeeb385ffdbe1125f30929aafc4b44e1f3d97d (patch) | |
tree | cd0710e42a786802096e328c11e150db4dc4067a /gcc/gcc.c | |
parent | 549c28fd1ce04729f5bb1617a52a2ba92e765599 (diff) | |
download | gcc-5feeeb385ffdbe1125f30929aafc4b44e1f3d97d.tar.gz |
include/
* libiberty.h (make_relative_prefix): Add prototype.
libiberty/
* Makefile.in: Add make-relative-prefix.c.
* make-relative-prefix.c: New file.
* functions.texi: Rebuilt.
gcc/
* gcc.c (make_relative_prefix, split_directories)
(free_split_directories): Removed.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@59385 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gcc.c')
-rw-r--r-- | gcc/gcc.c | 245 |
1 files changed, 0 insertions, 245 deletions
diff --git a/gcc/gcc.c b/gcc/gcc.c index c30851dfe17..a193437c569 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -267,11 +267,6 @@ static struct rusage rus, prus; struct path_prefix; static void init_spec PARAMS ((void)); -#ifndef VMS -static char **split_directories PARAMS ((const char *, int *)); -static void free_split_directories PARAMS ((char **)); -static char *make_relative_prefix PARAMS ((const char *, const char *, const char *)); -#endif /* VMS */ static void store_arg PARAMS ((const char *, int, int)); static char *load_specs PARAMS ((const char *)); static void read_specs PARAMS ((const char *, int)); @@ -2281,246 +2276,6 @@ putenv_from_prefixes (paths, env_var) putenv (build_search_list (paths, env_var, 1)); } -#ifndef VMS - -/* FIXME: the location independence code for VMS is hairier than this, - and hasn't been written. */ - -/* Split a filename into component directories. */ - -static char ** -split_directories (name, ptr_num_dirs) - const char *name; - int *ptr_num_dirs; -{ - int num_dirs = 0; - char **dirs; - const char *p, *q; - int ch; - - /* Count the number of directories. Special case MSDOS disk names as part - of the initial directory. */ - p = name; -#ifdef HAVE_DOS_BASED_FILE_SYSTEM - if (name[1] == ':' && IS_DIR_SEPARATOR (name[2])) - { - p += 3; - num_dirs++; - } -#endif /* HAVE_DOS_BASED_FILE_SYSTEM */ - - while ((ch = *p++) != '\0') - { - if (IS_DIR_SEPARATOR (ch)) - { - num_dirs++; - while (IS_DIR_SEPARATOR (*p)) - p++; - } - } - - dirs = (char **) xmalloc (sizeof (char *) * (num_dirs + 2)); - - /* Now copy the directory parts. */ - num_dirs = 0; - p = name; -#ifdef HAVE_DOS_BASED_FILE_SYSTEM - if (name[1] == ':' && IS_DIR_SEPARATOR (name[2])) - { - dirs[num_dirs++] = save_string (p, 3); - p += 3; - } -#endif /* HAVE_DOS_BASED_FILE_SYSTEM */ - - q = p; - while ((ch = *p++) != '\0') - { - if (IS_DIR_SEPARATOR (ch)) - { - while (IS_DIR_SEPARATOR (*p)) - p++; - - dirs[num_dirs++] = save_string (q, p - q); - q = p; - } - } - - if (p - 1 - q > 0) - dirs[num_dirs++] = save_string (q, p - 1 - q); - - dirs[num_dirs] = NULL; - if (ptr_num_dirs) - *ptr_num_dirs = num_dirs; - - return dirs; -} - -/* Release storage held by split directories. */ - -static void -free_split_directories (dirs) - char **dirs; -{ - int i = 0; - - while (dirs[i] != NULL) - free (dirs[i++]); - - free ((char *) dirs); -} - -/* Given three strings PROGNAME, BIN_PREFIX, PREFIX, return a string that gets - to PREFIX starting with the directory portion of PROGNAME and a relative - pathname of the difference between BIN_PREFIX and PREFIX. - - For example, if BIN_PREFIX is /alpha/beta/gamma/gcc/delta, PREFIX is - /alpha/beta/gamma/omega/, and PROGNAME is /red/green/blue/gcc, then this - function will return /red/green/blue/../omega. - - If no relative prefix can be found, return NULL. */ - -static char * -make_relative_prefix (progname, bin_prefix, prefix) - const char *progname; - const char *bin_prefix; - const char *prefix; -{ - char **prog_dirs, **bin_dirs, **prefix_dirs; - int prog_num, bin_num, prefix_num, std_loc_p; - int i, n, common; - - prog_dirs = split_directories (progname, &prog_num); - bin_dirs = split_directories (bin_prefix, &bin_num); - - /* If there is no full pathname, try to find the program by checking in each - of the directories specified in the PATH environment variable. */ - if (prog_num == 1) - { - char *temp; - - GET_ENVIRONMENT (temp, "PATH"); - if (temp) - { - char *startp, *endp, *nstore; - size_t prefixlen = strlen (temp) + 1; - if (prefixlen < 2) - prefixlen = 2; - - nstore = (char *) alloca (prefixlen + strlen (progname) + 1); - - startp = endp = temp; - while (1) - { - if (*endp == PATH_SEPARATOR || *endp == 0) - { - if (endp == startp) - { - nstore[0] = '.'; - nstore[1] = DIR_SEPARATOR; - nstore[2] = '\0'; - } - else - { - strncpy (nstore, startp, endp - startp); - if (! IS_DIR_SEPARATOR (endp[-1])) - { - nstore[endp - startp] = DIR_SEPARATOR; - nstore[endp - startp + 1] = 0; - } - else - nstore[endp - startp] = 0; - } - strcat (nstore, progname); - if (! access (nstore, X_OK) -#ifdef HAVE_HOST_EXECUTABLE_SUFFIX - || ! access (strcat (nstore, HOST_EXECUTABLE_SUFFIX), X_OK) -#endif - ) - { - free_split_directories (prog_dirs); - progname = nstore; - prog_dirs = split_directories (progname, &prog_num); - break; - } - - if (*endp == 0) - break; - endp = startp = endp + 1; - } - else - endp++; - } - } - } - - /* Remove the program name from comparison of directory names. */ - prog_num--; - - /* Determine if the compiler is installed in the standard location, and if - so, we don't need to specify relative directories. Also, if argv[0] - doesn't contain any directory specifiers, there is not much we can do. */ - std_loc_p = 0; - if (prog_num == bin_num) - { - for (i = 0; i < bin_num; i++) - { - if (strcmp (prog_dirs[i], bin_dirs[i]) != 0) - break; - } - - if (prog_num <= 0 || i == bin_num) - { - std_loc_p = 1; - free_split_directories (prog_dirs); - free_split_directories (bin_dirs); - prog_dirs = bin_dirs = (char **) 0; - return NULL; - } - } - - prefix_dirs = split_directories (prefix, &prefix_num); - - /* Find how many directories are in common between bin_prefix & prefix. */ - n = (prefix_num < bin_num) ? prefix_num : bin_num; - for (common = 0; common < n; common++) - { - if (strcmp (bin_dirs[common], prefix_dirs[common]) != 0) - break; - } - - /* If there are no common directories, there can be no relative prefix. */ - if (common == 0) - { - free_split_directories (prog_dirs); - free_split_directories (bin_dirs); - free_split_directories (prefix_dirs); - return NULL; - } - - /* Build up the pathnames in argv[0]. */ - for (i = 0; i < prog_num; i++) - obstack_grow (&obstack, prog_dirs[i], strlen (prog_dirs[i])); - - /* Now build up the ..'s. */ - for (i = common; i < n; i++) - { - obstack_grow (&obstack, DIR_UP, sizeof (DIR_UP) - 1); - obstack_1grow (&obstack, DIR_SEPARATOR); - } - - /* Put in directories to move over to prefix. */ - for (i = common; i < prefix_num; i++) - obstack_grow (&obstack, prefix_dirs[i], strlen (prefix_dirs[i])); - - free_split_directories (prog_dirs); - free_split_directories (bin_dirs); - free_split_directories (prefix_dirs); - - obstack_1grow (&obstack, '\0'); - return obstack_finish (&obstack); -} -#endif /* VMS */ - /* Check whether NAME can be accessed in MODE. This is like access, except that it never considers directories to be executable. */ |