cpplib bug fix (macro expansion)

Zack Weinberg zack@rabi.columbia.edu
Thu Oct 15 09:11:00 GMT 1998


On Tue, 13 Oct 1998 15:01:56 -0400, Dave Brolley wrote:
>We're getting closer. I think the patch is OK except that the blank representi
>ng
>the whitespace in the macro buffers should only be output if it was not a macr
>o
>call and before parse_goto_mark is called.
>
>If you agree to this change, then I'll install the patch.

Here is a new patch, modified as you suggested.

zw

Index: cpplib.c
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/cpplib.c,v
retrieving revision 1.37
diff -u -r1.37 cpplib.c
--- cpplib.c	1998/10/11 00:05:09	1.37
+++ cpplib.c	1998/10/15 16:09:55
@@ -5099,29 +5099,43 @@
 	    if (hp->type == T_MACRO && hp->value.defn->nargs >= 0)
 	    {
 	      struct parse_marker macro_mark;
-	      int is_macro_call;
-	      while (CPP_IS_MACRO_BUFFER (CPP_BUFFER (pfile)))
-	        {
-		  cpp_buffer *next_buf;
-		  cpp_skip_hspace (pfile);
-		  if (PEEKC () != EOF)
-		    break;
-		  next_buf = CPP_PREV_BUFFER (CPP_BUFFER (pfile));
-		  (*CPP_BUFFER (pfile)->cleanup) (CPP_BUFFER (pfile), pfile);
-		  CPP_BUFFER (pfile) = next_buf;
-	        }
+	      int is_macro_call, macbuf_whitespace = 0;
+
 	      parse_set_mark (&macro_mark, pfile);
 	      for (;;)
 		{
 		  cpp_skip_hspace (pfile);
 		  c = PEEKC ();
 		  is_macro_call = c == '(';
-		  if (c != '\n')
-		    break;
-		  FORWARD (1);
+		  if(c != EOF)
+		    {
+		      if (c != '\n')
+			break;
+		      FORWARD (1);
+		    }
+		  else
+		    {
+		      if (CPP_IS_MACRO_BUFFER (CPP_BUFFER (pfile)))
+			{
+			  if (macro_mark.position !=
+			      (CPP_BUFFER (pfile)->cur
+			       - CPP_BUFFER (pfile)->buf))
+			     macbuf_whitespace = 1;
+
+			  parse_clear_mark (&macro_mark);
+			  cpp_pop_buffer (pfile);
+			  parse_set_mark (&macro_mark, pfile);
+			}
+		      else
+			break;
+		    }	  
 		}
 	      if (!is_macro_call)
-		parse_goto_mark (&macro_mark, pfile);
+	        {
+		  parse_goto_mark (&macro_mark, pfile);
+		  if (macbuf_whitespace)
+		    CPP_PUTC (pfile, ' ');
+		}
 	      parse_clear_mark (&macro_mark);
 	      if (!is_macro_call)
 		return CPP_NAME;



More information about the Gcc-patches mailing list