diff --git a/src/cpp.c b/src/cpp.c index fb837d6f6a7b70423e361da52478f0fcb09be85c..7c05078429c63a108d330e9258ff24dea07fc5a8 100644 --- a/src/cpp.c +++ b/src/cpp.c @@ -5,7 +5,7 @@ \*/ /* - * $Id: cpp.c,v 1.79 2000/12/05 21:08:16 per Exp $ + * $Id: cpp.c,v 1.80 2001/01/17 13:36:29 grubba Exp $ */ #include "global.h" #include "stralloc.h" @@ -1144,9 +1144,61 @@ static void check_constant(struct cpp *this, len--; } - for(dlen=0; dlen<len; dlen++) - if(!isidchar(INDEX_PCHARP(data, dlen))) - break; + if (INDEX_PCHARP(data, 0) == '`') { + /* LFUN */ + for(dlen=0; dlen<len; dlen++) { + int c; + if ((c = INDEX_PCHARP(data, dlen)) != '`') { + switch(c) { + case '/': case '%': case '*': case '&': + case '|': case '^': case '~': + dlen++; + break; + case '+': + if ((++dlen < len) && INDEX_PCHARP(data, dlen) == '=') + dlen++; + break; + case '-': + if ((++dlen < len) && INDEX_PCHARP(data, dlen) == '>') { + dlen++; + } + break; + case '>': case '<': case '!': case '=': + { + /* We get a false match for the operator `!!, but that's ok. */ + int c2; + if ((++dlen < len) && + (((c2 = INDEX_PCHARP(data, dlen)) == c) || (c2 == '='))) { + dlen++; + } + } + break; + case '(': + if ((++dlen < len) && INDEX_PHARP(data, dlen) == ')') { + dlen++; + } else { + cpp_error(this, "Expected `().\n"); + } + break; + case '[': + if ((++dlen < len) && INDEX_PHARP(data, ++dlen) == ']') { + dlen++; + } else { + cpp_error(this, "Expected `[].\n"); + } + break; + default: + cpp_error(this, "Unrecognized ` identifier.\n"); + break; + } + break; + } + } + } else { + for(dlen=0; dlen<len; dlen++) + if(!isidchar(INDEX_PCHARP(data, dlen))) + break; + } if(res) {