aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Booth <neil@gcc.gnu.org>2001-03-04 12:02:02 +0000
committerNeil Booth <neil@gcc.gnu.org>2001-03-04 12:02:02 +0000
commit7868b4a2520b831eec35cbabc7f28d3694aebbf4 (patch)
treed7897ebb45f49ac182f124043b11088aa89ca781
parent91c704c4589f1d5e2a9d4cf3e070b56907cf5f61 (diff)
downloadgcc-7868b4a2520b831eec35cbabc7f28d3694aebbf4.zip
gcc-7868b4a2520b831eec35cbabc7f28d3694aebbf4.tar.gz
gcc-7868b4a2520b831eec35cbabc7f28d3694aebbf4.tar.bz2
cppfiles.c (_cpp_execute_include): Don't make a null-terminated copy of the filename.
* cppfiles.c (_cpp_execute_include): Don't make a null-terminated copy of the filename. Don't use CPP_PREV_BUFFER. Don't call strlen or strcpy; we already know the length. (_cpp_compare_file_date): Similarly. * cpphash.h (struct cpp_reader): Delete done_initialising. (CPP_PREV_BUFFER): Delete. * cppinit.c (cpp_start_read): Don't set done_initialising. * cpplex.c (parse_string): Guarantee null-termination. (_cpp_equiv_toklists): Remove. * cpplib.c (glue_header_name): Null-terminate. (do_line): Don't leak memory. * cpplib.h (BT_WEAK): Delete. * cppmain.c (cb_ident): Strings are now null-terminated. From-SVN: r40233
-rw-r--r--gcc/ChangeLog28
-rw-r--r--gcc/cppfiles.c21
-rw-r--r--gcc/cpphash.h5
-rw-r--r--gcc/cppinit.c2
-rw-r--r--gcc/cpplex.c58
-rw-r--r--gcc/cpplib.c11
-rw-r--r--gcc/cpplib.h4
-rw-r--r--gcc/cppmain.c2
8 files changed, 53 insertions, 78 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4190054..7a1772b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,9 +1,25 @@
-2001-03-04 Laurynas Biveinis <lauras@softhome.net>
-
- * gcc.c (convert_filename): Append executable suffix
- if NO_AUTO_EXE_SUFFIX is not defined.
- * gcc.texi: Document NO_AUTO_EXE_SUFFIX.
- * config/i386/djgpp.h: Define NO_AUTO_EXE_SUFFIX.
+2001-03-04 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ * cppfiles.c (_cpp_execute_include): Don't make a null-terminated
+ copy of the filename. Don't use CPP_PREV_BUFFER. Don't call
+ strlen or strcpy; we already know the length.
+ (_cpp_compare_file_date): Similarly.
+ * cpphash.h (struct cpp_reader): Delete done_initialising.
+ (CPP_PREV_BUFFER): Delete.
+ * cppinit.c (cpp_start_read): Don't set done_initialising.
+ * cpplex.c (parse_string): Guarantee null-termination.
+ (_cpp_equiv_toklists): Remove.
+ * cpplib.c (glue_header_name): Null-terminate.
+ (do_line): Don't leak memory.
+ * cpplib.h (BT_WEAK): Delete.
+ * cppmain.c (cb_ident): Strings are now null-terminated.
+
+2001-03-04 Laurynas Biveinis <lauras@softhome.net>
+
+ * gcc.c (convert_filename): Append executable suffix
+ if NO_AUTO_EXE_SUFFIX is not defined.
+ * gcc.texi: Document NO_AUTO_EXE_SUFFIX.
+ * config/i386/djgpp.h: Define NO_AUTO_EXE_SUFFIX.
2001-03-03 David O'Brien <obrien@FreeBSD.org>
diff --git a/gcc/cppfiles.c b/gcc/cppfiles.c
index 72af433..0dfd9d0 100644
--- a/gcc/cppfiles.c
+++ b/gcc/cppfiles.c
@@ -585,10 +585,9 @@ _cpp_execute_include (pfile, header, no_reinclude, include_next)
int include_next;
{
struct search_path *search_start = 0;
- unsigned int len = header->val.str.len;
unsigned int angle_brackets = header->type == CPP_HEADER_NAME;
+ const char *fname = (const char *) header->val.str.text;
struct include_file *inc;
- char *fname;
int print_dep;
/* Help protect #include or similar from recursion. */
@@ -626,10 +625,6 @@ _cpp_execute_include (pfile, header, no_reinclude, include_next)
}
}
- fname = alloca (len + 1);
- memcpy (fname, header->val.str.text, len);
- fname[len] = '\0';
-
if (!search_start)
{
if (angle_brackets)
@@ -660,8 +655,8 @@ _cpp_execute_include (pfile, header, no_reinclude, include_next)
/* Handle -H option. */
if (CPP_OPTION (pfile, print_include_names))
{
- cpp_buffer *fp = CPP_BUFFER (pfile);
- while ((fp = CPP_PREV_BUFFER (fp)) != NULL)
+ cpp_buffer *fp = pfile->buffer;
+ while ((fp = fp->prev) != NULL)
putc ('.', stderr);
fprintf (stderr, " %s\n", inc->name);
}
@@ -692,13 +687,13 @@ _cpp_execute_include (pfile, header, no_reinclude, include_next)
/* FIXME: ptr can be null, no? */
len = ptr->len;
- p = (char *) alloca (len + strlen (fname) + 2);
+ p = (char *) alloca (len + header->val.str.len + 2);
if (len)
{
memcpy (p, ptr->name, len);
p[len++] = '/';
}
- strcpy (p + len, fname);
+ memcpy (p + len, fname, header->val.str.len + 1);
_cpp_simplify_pathname (p);
deps_add_dep (pfile->deps, p);
}
@@ -722,8 +717,7 @@ _cpp_compare_file_date (pfile, f)
cpp_reader *pfile;
const cpp_token *f;
{
- unsigned int len = f->val.str.len;
- char *fname;
+ const char *fname = (const char *) f->val.str.text;
struct search_path *search_start;
struct include_file *inc;
@@ -732,9 +726,6 @@ _cpp_compare_file_date (pfile, f)
else if (CPP_OPTION (pfile, ignore_srcdir))
search_start = pfile->buffer->search_from;
- fname = alloca (len + 1);
- memcpy (fname, f->val.str.text, len);
- fname[len] = '\0';
inc = find_include_file (pfile, fname, search_start);
if (!inc)
diff --git a/gcc/cpphash.h b/gcc/cpphash.h
index 5b2c24b..df27e73 100644
--- a/gcc/cpphash.h
+++ b/gcc/cpphash.h
@@ -339,10 +339,6 @@ struct cpp_reader
/* We're printed a warning recommending against using #import. */
unsigned char import_warning;
- /* True after cpp_start_read completes. Used to inhibit some
- warnings while parsing the command line. */
- unsigned char done_initializing;
-
/* True if we are skipping a failed conditional group. */
unsigned char skipping;
@@ -380,7 +376,6 @@ extern unsigned char _cpp_trigraph_map[UCHAR_MAX + 1];
/* Macros. */
-#define CPP_PREV_BUFFER(BUFFER) ((BUFFER)->prev)
#define CPP_PRINT_DEPS(PFILE) CPP_OPTION (PFILE, print_deps)
#define CPP_IN_SYSTEM_HEADER(PFILE) \
(CPP_BUFFER (PFILE) && CPP_BUFFER (PFILE)->sysp)
diff --git a/gcc/cppinit.c b/gcc/cppinit.c
index 61f72b4..457d266 100644
--- a/gcc/cppinit.c
+++ b/gcc/cppinit.c
@@ -948,8 +948,6 @@ cpp_start_read (pfile, fname)
p = q;
}
- pfile->done_initializing = 1;
-
/* The -imacros files can be scanned now, but the -include files
have to be pushed onto the buffer stack and processed later,
otherwise cppmain.c won't see the tokens. include_head was built
diff --git a/gcc/cpplex.c b/gcc/cpplex.c
index bd96303..37a0c61 100644
--- a/gcc/cpplex.c
+++ b/gcc/cpplex.c
@@ -629,10 +629,11 @@ unescaped_terminator_p (pfile, dest)
}
/* Parses a string, character constant, or angle-bracketed header file
- name. Handles embedded trigraphs and escaped newlines.
+ name. Handles embedded trigraphs and escaped newlines. The stored
+ string is guaranteed NUL-terminated, but it is not guaranteed that
+ this is the first NUL since embedded NULs are preserved.
- Multi-line strings are allowed, but they are deprecated within
- directives. */
+ Multi-line strings are allowed, but they are deprecated. */
static void
parse_string (pfile, token, terminator)
cpp_reader *pfile;
@@ -651,14 +652,21 @@ parse_string (pfile, token, terminator)
for (;;)
{
if (buffer->cur == buffer->rlimit)
+ c = EOF;
+ else
+ c = *buffer->cur++;
+
+ have_char:
+ /* We need space for the terminating NUL. */
+ if (dest >= limit)
+ limit = _cpp_next_chunk (pool, 0, &dest);
+
+ if (c == EOF)
{
- c = EOF;
unterminated (pfile, terminator);
break;
}
- c = *buffer->cur++;
- have_char:
/* Handle trigraphs, escaped newlines etc. */
if (c == '?' || c == '\\')
c = skip_escaped_newlines (buffer, c);
@@ -690,8 +698,9 @@ parse_string (pfile, token, terminator)
if (pfile->mlstring_pos.line == 0)
pfile->mlstring_pos = pfile->lexer_pos;
- handle_newline (buffer, c); /* Stores to read_ahead. */
- c = '\n';
+ c = handle_newline (buffer, c);
+ *dest++ = '\n';
+ goto have_char;
}
else if (c == '\0')
{
@@ -699,25 +708,16 @@ parse_string (pfile, token, terminator)
cpp_warning (pfile, "null character(s) preserved in literal");
}
- /* No terminating null for strings - they could contain nulls. */
- if (dest >= limit)
- limit = _cpp_next_chunk (pool, 0, &dest);
*dest++ = c;
-
- /* If we had a new line, the next character is in read_ahead. */
- if (c != '\n')
- continue;
- c = buffer->read_ahead;
- if (c != EOF)
- goto have_char;
}
/* Remember the next character. */
buffer->read_ahead = c;
+ *dest = '\0';
token->val.str.text = POOL_FRONT (pool);
token->val.str.len = dest - token->val.str.text;
- POOL_COMMIT (pool, token->val.str.len);
+ POOL_COMMIT (pool, token->val.str.len + 1);
}
/* The stored comment includes the comment start and any terminator. */
@@ -1481,26 +1481,6 @@ _cpp_equiv_tokens (a, b)
return 0;
}
-#if 0
-/* Compare two token lists. */
-int
-_cpp_equiv_toklists (a, b)
- const struct toklist *a, *b;
-{
- unsigned int i, count;
-
- count = a->limit - a->first;
- if (count != (b->limit - b->first))
- return 0;
-
- for (i = 0; i < count; i++)
- if (! _cpp_equiv_tokens (&a->first[i], &b->first[i]))
- return 0;
-
- return 1;
-}
-#endif
-
/* Determine whether two tokens can be pasted together, and if so,
what the resulting token is. Returns CPP_EOF if the tokens cannot
be pasted, or the appropriate type for the merged token if they
diff --git a/gcc/cpplib.c b/gcc/cpplib.c
index 07f8fad..571e204 100644
--- a/gcc/cpplib.c
+++ b/gcc/cpplib.c
@@ -525,8 +525,9 @@ glue_header_name (pfile, header)
cpp_error (pfile, "missing terminating > character");
else
{
- token_mem = _cpp_pool_alloc (&pfile->ident_pool, total_len);
+ token_mem = _cpp_pool_alloc (&pfile->ident_pool, total_len + 1);
memcpy (token_mem, buffer, total_len);
+ token_mem[total_len] = '\0';
header->type = CPP_HEADER_NAME;
header->flags &= ~PREV_WHITE;
@@ -708,14 +709,10 @@ do_line (pfile)
if (token.type == CPP_STRING)
{
char *fname;
- unsigned int len;
+ unsigned int len = token.val.str.len + 1;
- /* FIXME: memory leak. */
- len = token.val.str.len;
- fname = xmalloc (len + 1);
+ fname = (char *) _cpp_pool_alloc (&pfile->ident_pool, len);
memcpy (fname, token.val.str.text, len);
- fname[len] = '\0';
-
_cpp_simplify_pathname (fname);
/* Only accept flags for the # 55 form. */
diff --git a/gcc/cpplib.h b/gcc/cpplib.h
index eaa0ff9..c0c3ff3 100644
--- a/gcc/cpplib.h
+++ b/gcc/cpplib.h
@@ -463,9 +463,7 @@ enum builtin_type
BT_BASE_FILE, /* `__BASE_FILE__' */
BT_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */
BT_TIME, /* `__TIME__' */
- BT_STDC, /* `__STDC__' */
- BT_WEAK /* Whether or not G++ supports weak
- symbols. */
+ BT_STDC /* `__STDC__' */
};
/* There is a slot in the hashnode for use by front ends when integrated
diff --git a/gcc/cppmain.c b/gcc/cppmain.c
index 6d3afe0..ceab9c9 100644
--- a/gcc/cppmain.c
+++ b/gcc/cppmain.c
@@ -347,7 +347,7 @@ cb_ident (pfile, str)
const cpp_string * str;
{
maybe_print_line (cpp_get_line (pfile)->output_line);
- fprintf (print.outf, "#ident \"%.*s\"\n", (int) str->len, str->text);
+ fprintf (print.outf, "#ident \"%s\"\n", str->text);
print.lineno++;
}