summaryrefslogtreecommitdiffstats
path: root/gcc/cpplib.c
diff options
context:
space:
mode:
authorneil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>2002-02-23 20:21:39 +0000
committerneil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>2002-02-23 20:21:39 +0000
commit92b1c81aad3e46eeb253a6500e684811e83d1856 (patch)
tree7ec695eb7af99d6f51037fc40bf0c114b6f3ff62 /gcc/cpplib.c
parent809ec257c8350a22096f618d660c9b556d6717b0 (diff)
downloadppe42-gcc-92b1c81aad3e46eeb253a6500e684811e83d1856.tar.gz
ppe42-gcc-92b1c81aad3e46eeb253a6500e684811e83d1856.zip
* cpplib.c (glue_header_name): Use local buffer to build up
header name. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@49998 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cpplib.c')
-rw-r--r--gcc/cpplib.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/gcc/cpplib.c b/gcc/cpplib.c
index 12baa101ef2..1a38f01c2fb 100644
--- a/gcc/cpplib.c
+++ b/gcc/cpplib.c
@@ -507,13 +507,12 @@ glue_header_name (pfile)
{
cpp_token *header = NULL;
const cpp_token *token;
- unsigned char *dest;
- size_t len;
+ unsigned char *buffer;
+ size_t len, total_len = 0, capacity = 1024;
/* To avoid lexed tokens overwriting our glued name, we can only
allocate from the string pool once we've lexed everything. */
-
- dest = BUFF_FRONT (pfile->u_buff);
+ buffer = (unsigned char *) xmalloc (capacity);
for (;;)
{
token = cpp_get_token (pfile);
@@ -521,34 +520,35 @@ glue_header_name (pfile)
if (token->type == CPP_GREATER || token->type == CPP_EOF)
break;
- /* + 1 for terminating NUL. */
- len = cpp_token_len (token) + 1;
- if ((size_t) (BUFF_LIMIT (pfile->u_buff) - dest) < len)
+ len = cpp_token_len (token);
+ if (total_len + len > capacity)
{
- size_t len_so_far = dest - BUFF_FRONT (pfile->u_buff);
- _cpp_extend_buff (pfile, &pfile->u_buff, len);
- dest = BUFF_FRONT (pfile->u_buff) + len_so_far;
+ capacity = (capacity + len) * 2;
+ buffer = (unsigned char *) xrealloc (buffer, capacity);
}
if (token->flags & PREV_WHITE)
- *dest++ = ' ';
+ buffer[total_len++] = ' ';
- dest = cpp_spell_token (pfile, token, dest);
+ total_len = cpp_spell_token (pfile, token, &buffer[total_len]) - buffer;
}
if (token->type == CPP_EOF)
cpp_error (pfile, "missing terminating > character");
else
{
+ unsigned char *token_mem = _cpp_unaligned_alloc (pfile, total_len + 1);
+ memcpy (token_mem, buffer, total_len);
+ token_mem[total_len] = '\0';
+
header = _cpp_temp_token (pfile);
header->type = CPP_HEADER_NAME;
header->flags = 0;
- header->val.str.len = dest - BUFF_FRONT (pfile->u_buff);
- header->val.str.text = BUFF_FRONT (pfile->u_buff);
- *dest++ = '\0';
- BUFF_FRONT (pfile->u_buff) = dest;
+ header->val.str.len = total_len;
+ header->val.str.text = token_mem;
}
+ free ((PTR) buffer);
return header;
}
OpenPOWER on IntegriCloud