diff --git a/src/cpp.c b/src/cpp.c
index 43f6d312d0b63b48895c86584721a2c34edb9ece..d1aa74742af92be652edc05bbfe7b93df4726bca 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 83846282ae6c1ff18a029bd769d1afdaefe8d06e..73b684a6e1975d5b63e0a5fa0e27bab832acc3a1 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++)
 	    {