cpplib.c (glue_header_name): Use local buffer to build up header name.
authorNeil Booth <neil@daikokuya.demon.co.uk>
Sat, 23 Feb 2002 20:21:39 +0000 (20:21 +0000)
committerNeil Booth <neil@gcc.gnu.org>
Sat, 23 Feb 2002 20:21:39 +0000 (20:21 +0000)
* cpplib.c (glue_header_name): Use local buffer to build up
header name.

From-SVN: r49998

gcc/ChangeLog
gcc/cpplib.c

index 11ec5227be1d6c3bc35ec77eb9c83451c37b3a70..92381ee95433c88d96c9b350671400c3ebc20ae9 100644 (file)
@@ -1,3 +1,8 @@
+2002-02-23  Neil Booth  <neil@daikokuya.demon.co.uk>
+
+       * cpplib.c (glue_header_name): Use local buffer to build up
+       header name.
+
 2002-02-23  Neil Booth  <neil@daikokuya.demon.co.uk>
 
        * doc/cpp.texi, doc/invoke.texi: Update documentation for -MM.
index 12baa101ef2d3d8eff9d419f08ed1d42101c249f..1a38f01c2fb65fc769bcb23f05decda2089afeef 100644 (file)
@@ -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;
 }