aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1995-07-26 08:40:08 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1995-07-26 08:40:08 -0400
commitaa6b6385f2b1aa288907cc7adbd0b5b839707a94 (patch)
treee7ec26497c0de9ed78d5a1c1f3d277ae04c5fd8b /gcc
parentdfda5a87b5432c74b6f5dde252a0d07c81314332 (diff)
downloadgcc-aa6b6385f2b1aa288907cc7adbd0b5b839707a94.zip
gcc-aa6b6385f2b1aa288907cc7adbd0b5b839707a94.tar.gz
gcc-aa6b6385f2b1aa288907cc7adbd0b5b839707a94.tar.bz2
(do_include, read_name_map): Omit leading "./" and trailing "/" when it makes sense.
(do_include, read_name_map): Omit leading "./" and trailing "/" when it makes sense. (skip_redundant_dir_prefix): New function. From-SVN: r10163
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cccp.c47
1 files changed, 34 insertions, 13 deletions
diff --git a/gcc/cccp.c b/gcc/cccp.c
index f60027f..ee726e5 100644
--- a/gcc/cccp.c
+++ b/gcc/cccp.c
@@ -1082,7 +1082,8 @@ static struct tm *timestamp PROTO((void));
static void special_symbol PROTO((HASHNODE *, FILE_BUF *));
static int redundant_include_p PROTO((char *));
-static is_system_include PROTO((char *));
+static int is_system_include PROTO((char *));
+static char *skip_redundant_dir_prefix PROTO((char *));
static char *read_filename_string PROTO((int, FILE *));
static struct file_name_map *read_name_map PROTO((char *));
@@ -4260,7 +4261,7 @@ do_include (buf, limit, op, keyword)
struct file_name_list *search_start = include; /* Chain of dirs to search */
struct file_name_list dsp[1]; /* First in chain, if #include "..." */
struct file_name_list *searchptr = 0;
- int flen;
+ size_t flen;
int f; /* file number */
@@ -4500,9 +4501,9 @@ get_filename:
a standard piece of the list. */
if (searchptr->fname[0] == 0)
continue;
- strcpy (fname, searchptr->fname);
- strcat (fname, "/");
- fname[strlen (fname) + flen] = 0;
+ strcpy (fname, skip_redundant_dir_prefix (searchptr->fname));
+ if (fname[0] && fname[strlen (fname) - 1] != '/')
+ strcat (fname, "/");
} else {
fname[0] = 0;
}
@@ -4569,8 +4570,9 @@ get_filename:
continue;
p = (char *) alloca (strlen (searchptr->fname)
+ strlen (fname) + 2);
- strcpy (p, searchptr->fname);
- strcat (p, "/");
+ strcpy (p, skip_redundant_dir_prefix (searchptr->fname));
+ if (p[0] && p[strlen (p) - 1] != '/')
+ strcat (p, "/");
strcat (p, fname);
deps_output (p, ' ');
break;
@@ -4749,6 +4751,21 @@ is_system_include (filename)
return 0;
}
+/* Skip leading "./" from a directory name.
+ This may yield the empty string, which represents the current directory. */
+
+static char *
+skip_redundant_dir_prefix (dir)
+ char *dir;
+{
+ while (dir[0] == '.' && dir[1] == '/')
+ for (dir += 2; *dir == '/'; dir++)
+ continue;
+ if (dir[0] == '.' && !dir[1])
+ dir++;
+ return dir;
+}
+
/* The file_name_map structure holds a mapping of file names for a
particular directory. This mapping is read from the file named
FILE_NAME_MAP_FILE in that directory. Such a file can be used to
@@ -4816,6 +4833,10 @@ read_name_map (dirname)
register struct file_name_map_list *map_list_ptr;
char *name;
FILE *f;
+ size_t dirlen;
+ int separator_needed;
+
+ dirname = skip_redundant_dir_prefix (dirname);
for (map_list_ptr = map_list; map_list_ptr;
map_list_ptr = map_list_ptr->map_list_next)
@@ -4827,18 +4848,18 @@ read_name_map (dirname)
map_list_ptr->map_list_name = savestring (dirname);
map_list_ptr->map_list_map = NULL;
- name = (char *) alloca (strlen (dirname) + strlen (FILE_NAME_MAP_FILE) + 2);
+ dirlen = strlen (dirname);
+ separator_needed = dirlen != 0 && dirname[dirlen - 1] != '/';
+ name = (char *) alloca (dirlen + strlen (FILE_NAME_MAP_FILE) + 2);
strcpy (name, dirname);
- if (*dirname)
- strcat (name, "/");
- strcat (name, FILE_NAME_MAP_FILE);
+ name[dirlen] = '/';
+ strcpy (name + dirlen + separator_needed, FILE_NAME_MAP_FILE);
f = fopen (name, "r");
if (!f)
map_list_ptr->map_list_map = NULL;
else
{
int ch;
- int dirlen = strlen (dirname);
while ((ch = getc (f)) != EOF)
{
@@ -4864,7 +4885,7 @@ read_name_map (dirname)
ptr->map_to = xmalloc (dirlen + strlen (to) + 2);
strcpy (ptr->map_to, dirname);
ptr->map_to[dirlen] = '/';
- strcpy (ptr->map_to + dirlen + 1, to);
+ strcpy (ptr->map_to + dirlen + separator_needed, to);
free (to);
}