X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=cde%2Fconfig%2Fmakedepend%2Fifparser.c;h=b06a4fd17f14b9acabc477386f14aeb35e73d3d2;hb=29ea5f794d20264c545a0e641835cbbd6821d46f;hp=17e71a8c5bd3b1eaeeec2d9f05da77c68668faa2;hpb=01d6c363fa5c1bc1ce72e90d4e7daca74bd3175e;p=oweals%2Fcde.git diff --git a/cde/config/makedepend/ifparser.c b/cde/config/makedepend/ifparser.c index 17e71a8c..b06a4fd1 100644 --- a/cde/config/makedepend/ifparser.c +++ b/cde/config/makedepend/ifparser.c @@ -16,7 +16,7 @@ * details. * * You should have received a copy of the GNU Lesser General Public - * License along with these librararies and programs; if not, write + * License along with these libraries and programs; if not, write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301 USA */ @@ -81,6 +81,7 @@ #include "ifparser.h" #include +#include #include #include @@ -201,7 +202,7 @@ parse_value (g, cp, valp) const char *cp; long *valp; { - const char *var; + const char *var, *varend; *valp = 0; @@ -228,6 +229,16 @@ parse_value (g, cp, valp) *valp = -(*valp); return cp; + case '+': + DO (cp = parse_value (g, cp + 1, valp)); + *valp = +(*valp); + return cp; + + case '~': + DO (cp = parse_value (g, cp + 1, valp)); + *valp = ~(*valp); + return cp; + case '#': DO (cp = parse_variable (g, cp + 1, &var)); SKIPSPACE (cp); @@ -276,7 +287,24 @@ parse_value (g, cp, valp) return CALLFUNC(g, handle_error) (g, cp, "variable or number"); else { DO (cp = parse_variable (g, cp, &var)); - *valp = (*(g->funcs.eval_variable)) (g, var, cp - var); + varend = cp; + SKIPSPACE(cp); + if (*cp != '(') { + *valp = (*(g->funcs.eval_variable)) (g, var, varend - var); + } else { + do { + long dummy; + DO (cp = ParseIfExpression (g, cp + 1, &dummy)); + SKIPSPACE(cp); + if (*cp == ')') + break; + if (*cp != ',') + return CALLFUNC(g, handle_error) (g, cp, ","); + } while (1); + + *valp = 1; /* XXX */ + cp++; + } } return cp; @@ -464,7 +492,7 @@ parse_band (g, cp, valp) static const char * -parse_bor (g, cp, valp) +parse_bxor (g, cp, valp) IfParser *g; const char *cp; long *valp; @@ -474,6 +502,27 @@ parse_bor (g, cp, valp) DO (cp = parse_band (g, cp, valp)); SKIPSPACE (cp); + switch (*cp) { + case '^': + DO (cp = parse_bxor (g, cp + 1, &rightval)); + *valp = (*valp ^ rightval); + break; + } + return cp; +} + + +static const char * +parse_bor (g, cp, valp) + IfParser *g; + const char *cp; + long *valp; +{ + long rightval; + + DO (cp = parse_bxor (g, cp, valp)); + SKIPSPACE (cp); + switch (*cp) { case '|': if (cp[1] != '|') {