diff options
author | Neil Booth <neil@daikokuya.demon.co.uk> | 2002-02-23 20:21:39 +0000 |
---|---|---|
committer | Neil Booth <neil@gcc.gnu.org> | 2002-02-23 20:21:39 +0000 |
commit | 2450e0b8ea9b4b630995889b5584913d2d6e456f (patch) | |
tree | 7ec695eb7af99d6f51037fc40bf0c114b6f3ff62 /gcc/cpplib.c | |
parent | 70b6aaed80b78e1b1e72e84d8efc6574ef506299 (diff) | |
download | gcc-2450e0b8ea9b4b630995889b5584913d2d6e456f.zip gcc-2450e0b8ea9b4b630995889b5584913d2d6e456f.tar.gz gcc-2450e0b8ea9b4b630995889b5584913d2d6e456f.tar.bz2 |
cpplib.c (glue_header_name): Use local buffer to build up header name.
* cpplib.c (glue_header_name): Use local buffer to build up
header name.
From-SVN: r49998
Diffstat (limited to 'gcc/cpplib.c')
-rw-r--r-- | gcc/cpplib.c | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/gcc/cpplib.c b/gcc/cpplib.c index 12baa10..1a38f01 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; } |