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++) {