From 39dc6c27faa389a5805f4389f8ba115355d32f3c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net>
Date: Tue, 13 Jun 2000 14:39:34 -0700
Subject: [PATCH] varargs macros now implemented (same syntax as GCC varargs
 macros)

Rev: src/cpp.c:1.65
Rev: src/preprocessor.h:1.24
---
 src/cpp.c          |  6 ++++--
 src/preprocessor.h | 24 ++++++++++++++++++++++--
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/src/cpp.c b/src/cpp.c
index 43f6d312d0..d1aa74742a 100644
--- a/src/cpp.c
+++ b/src/cpp.c
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: cpp.c,v 1.64 2000/06/06 22:51:55 hubbe Exp $
+ * $Id: cpp.c,v 1.65 2000/06/13 21:39:34 hubbe Exp $
  */
 #include "global.h"
 #include "stralloc.h"
@@ -84,7 +84,8 @@ struct define
   magic_define_fun magic;
   int args;
   int num_parts;
-  int inside;
+  short inside;
+  short varargs;
   struct pike_string *first;
   struct define_part parts[1];
 };
@@ -138,6 +139,7 @@ static struct define *alloc_empty_define(struct pike_string *name, INT32 parts)
   def->magic=0;
   def->args=-1;
   def->inside=0;
+  def->varargs=0;
   def->num_parts=parts;
   def->first=0;
   def->link.s=name;
diff --git a/src/preprocessor.h b/src/preprocessor.h
index 83846282ae..73b684a6e1 100644
--- a/src/preprocessor.h
+++ b/src/preprocessor.h
@@ -1,5 +1,5 @@
 /*
- * $Id: preprocessor.h,v 1.23 2000/04/01 07:26:29 hubbe Exp $
+ * $Id: preprocessor.h,v 1.24 2000/06/13 21:39:34 hubbe Exp $
  *
  * Preprocessor template.
  * Based on cpp.c 1.45
@@ -891,6 +891,12 @@ static INT32 lower_cpp(struct cpp *this,
 		if(data[pos]==')')
 		{
 		  char buffer[1024];
+		  if(d->varargs && arg + 1 == d->args)
+		  {
+		    arguments[arg].arg = MKPCHARP(data + pos, SHIFT);
+		    arguments[arg].len=0;
+		    continue;
+		  }
 		  sprintf(buffer,
 			  "Too few arguments to macro %.950s, expected %d.",
 			  d->link.s->str, d->args);
@@ -928,8 +934,11 @@ static INT32 lower_cpp(struct cpp *this,
 		  pos=find_end_parenthesis(this, data, len, pos);
 		  continue;
 		  
+		case ',':
+		  if(d->varargs && arg+1 == d->args) continue;
+
 		case ')': 
-		case ',': pos--;
+		  pos--;
 		  break;
 		}
 		break;
@@ -1584,6 +1593,7 @@ static INT32 lower_cpp(struct cpp *this,
 	  INT32 namestart, tmp3, nameend, argno=-1;
 	  struct define *def;
 	  struct svalue *partbase,*argbase=Pike_sp;
+	  int varargs=0;
 
 	  SKIPSPACE();
 
@@ -1615,6 +1625,8 @@ static INT32 lower_cpp(struct cpp *this,
 				  "Expecting comma in macro definition.");
 		      SKIPWHITE();
 		    }
+		  if(varargs)
+		    cpp_error(this,"Expected ) after ...");
 		  tmp2=pos;
 
 		  if(!WC_ISIDCHAR(data[pos]))
@@ -1645,6 +1657,13 @@ static INT32 lower_cpp(struct cpp *this,
 		    pop_stack();
 		    argno--;
 		  }
+
+		  if(data[pos]=='.' && data[pos+1]=='.' && data[pos+2]=='.')
+		  {
+		    varargs=1;
+		    pos+=3;
+		    SKIPWHITE();
+		  }
 		}
 
 	      if(!GOBBLE(')'))
@@ -1798,6 +1817,7 @@ static INT32 lower_cpp(struct cpp *this,
 #endif /* SHIFT == 0 */
 	    copy_shared_string(def->first, partbase->u.string);
 	    def->args=argno;
+	    def->varargs=varargs;
 	    
 	    for(e=0;e<def->num_parts;e++)
 	    {
-- 
GitLab