From: Neil Booth Date: Sat, 23 Feb 2002 20:21:39 +0000 (+0000) Subject: cpplib.c (glue_header_name): Use local buffer to build up header name. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2450e0b8ea9b4b630995889b5584913d2d6e456f;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 11ec5227be1..92381ee9543 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-02-23 Neil Booth + + * cpplib.c (glue_header_name): Use local buffer to build up + header name. + 2002-02-23 Neil Booth * doc/cpp.texi, doc/invoke.texi: Update documentation for -MM. 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; }