1*cdf0e10cSrcweir /* 2*cdf0e10cSrcweir * $XConsortium: ifparser.c,v 1.8 95/06/03 00:01:41 gildea Exp $ 3*cdf0e10cSrcweir * 4*cdf0e10cSrcweir * Copyright 1992 Network Computing Devices, Inc. 5*cdf0e10cSrcweir * 6*cdf0e10cSrcweir * Permission to use, copy, modify, and distribute this software and its 7*cdf0e10cSrcweir * documentation for any purpose and without fee is hereby granted, provided 8*cdf0e10cSrcweir * that the above copyright notice appear in all copies and that both that 9*cdf0e10cSrcweir * copyright notice and this permission notice appear in supporting 10*cdf0e10cSrcweir * documentation, and that the name of Network Computing Devices may not be 11*cdf0e10cSrcweir * used in advertising or publicity pertaining to distribution of the software 12*cdf0e10cSrcweir * without specific, written prior permission. Network Computing Devices makes 13*cdf0e10cSrcweir * no representations about the suitability of this software for any purpose. 14*cdf0e10cSrcweir * It is provided ``as is'' without express or implied warranty. 15*cdf0e10cSrcweir * 16*cdf0e10cSrcweir * NETWORK COMPUTING DEVICES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 17*cdf0e10cSrcweir * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, 18*cdf0e10cSrcweir * IN NO EVENT SHALL NETWORK COMPUTING DEVICES BE LIABLE FOR ANY SPECIAL, 19*cdf0e10cSrcweir * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 20*cdf0e10cSrcweir * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 21*cdf0e10cSrcweir * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 22*cdf0e10cSrcweir * PERFORMANCE OF THIS SOFTWARE. 23*cdf0e10cSrcweir * 24*cdf0e10cSrcweir * Author: Jim Fulton 25*cdf0e10cSrcweir * Network Computing Devices, Inc. 26*cdf0e10cSrcweir * 27*cdf0e10cSrcweir * Simple if statement processor 28*cdf0e10cSrcweir * 29*cdf0e10cSrcweir * This module can be used to evaluate string representations of C language 30*cdf0e10cSrcweir * if constructs. It accepts the following grammar: 31*cdf0e10cSrcweir * 32*cdf0e10cSrcweir * EXPRESSION := VALUE 33*cdf0e10cSrcweir * | VALUE BINOP EXPRESSION 34*cdf0e10cSrcweir * 35*cdf0e10cSrcweir * VALUE := '(' EXPRESSION ')' 36*cdf0e10cSrcweir * | '!' VALUE 37*cdf0e10cSrcweir * | '-' VALUE 38*cdf0e10cSrcweir * | 'defined' '(' variable ')' 39*cdf0e10cSrcweir * | 'defined' variable 40*cdf0e10cSrcweir * | # variable '(' variable-list ')' 41*cdf0e10cSrcweir * | variable 42*cdf0e10cSrcweir * | number 43*cdf0e10cSrcweir * 44*cdf0e10cSrcweir * BINOP := '*' | '/' | '%' 45*cdf0e10cSrcweir * | '+' | '-' 46*cdf0e10cSrcweir * | '<<' | '>>' 47*cdf0e10cSrcweir * | '<' | '>' | '<=' | '>=' 48*cdf0e10cSrcweir * | '==' | '!=' 49*cdf0e10cSrcweir * | '&' | '|' 50*cdf0e10cSrcweir * | '&&' | '||' 51*cdf0e10cSrcweir * 52*cdf0e10cSrcweir * The normal C order of precidence is supported. 53*cdf0e10cSrcweir * 54*cdf0e10cSrcweir * 55*cdf0e10cSrcweir * External Entry Points: 56*cdf0e10cSrcweir * 57*cdf0e10cSrcweir * ParseIfExpression parse a string for #if 58*cdf0e10cSrcweir */ 59*cdf0e10cSrcweir 60*cdf0e10cSrcweir #include "ifparser.h" 61*cdf0e10cSrcweir #include <ctype.h> 62*cdf0e10cSrcweir #include <stdlib.h> 63*cdf0e10cSrcweir #include <string.h> 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir /**************************************************************************** 66*cdf0e10cSrcweir Internal Macros and Utilities for Parser 67*cdf0e10cSrcweir ****************************************************************************/ 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir #define DO(val) if (!(val)) return NULL 70*cdf0e10cSrcweir #define CALLFUNC(ggg,fff) (*((ggg)->funcs.fff)) 71*cdf0e10cSrcweir #define SKIPSPACE(ccc) while (isspace(*ccc)) ccc++ 72*cdf0e10cSrcweir #define isvarfirstletter(ccc) (isalpha(ccc) || (ccc) == '_') 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir static const char * 76*cdf0e10cSrcweir parse_variable (g, cp, varp) 77*cdf0e10cSrcweir IfParser *g; 78*cdf0e10cSrcweir const char *cp; 79*cdf0e10cSrcweir const char **varp; 80*cdf0e10cSrcweir { 81*cdf0e10cSrcweir SKIPSPACE (cp); 82*cdf0e10cSrcweir 83*cdf0e10cSrcweir if (!isvarfirstletter (*cp)) 84*cdf0e10cSrcweir return CALLFUNC(g, handle_error) (g, cp, "variable name"); 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir *varp = cp; 87*cdf0e10cSrcweir /* EMPTY */ 88*cdf0e10cSrcweir for (cp++; isalnum(*cp) || *cp == '_'; cp++) ; 89*cdf0e10cSrcweir return cp; 90*cdf0e10cSrcweir } 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir 93*cdf0e10cSrcweir static const char * 94*cdf0e10cSrcweir parse_number (g, cp, valp) 95*cdf0e10cSrcweir IfParser *g; 96*cdf0e10cSrcweir const char *cp; 97*cdf0e10cSrcweir int *valp; 98*cdf0e10cSrcweir { 99*cdf0e10cSrcweir SKIPSPACE (cp); 100*cdf0e10cSrcweir 101*cdf0e10cSrcweir if (!isdigit(*cp)) 102*cdf0e10cSrcweir return CALLFUNC(g, handle_error) (g, cp, "number"); 103*cdf0e10cSrcweir 104*cdf0e10cSrcweir #ifdef WIN32 105*cdf0e10cSrcweir *valp = strtol(cp, &cp, 0); 106*cdf0e10cSrcweir #else 107*cdf0e10cSrcweir *valp = atoi (cp); 108*cdf0e10cSrcweir /* EMPTY */ 109*cdf0e10cSrcweir for (cp++; isdigit(*cp); cp++) ; 110*cdf0e10cSrcweir #endif 111*cdf0e10cSrcweir return cp; 112*cdf0e10cSrcweir } 113*cdf0e10cSrcweir 114*cdf0e10cSrcweir 115*cdf0e10cSrcweir static const char * 116*cdf0e10cSrcweir parse_value (g, cp, valp) 117*cdf0e10cSrcweir IfParser *g; 118*cdf0e10cSrcweir const char *cp; 119*cdf0e10cSrcweir int *valp; 120*cdf0e10cSrcweir { 121*cdf0e10cSrcweir const char *var; 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir *valp = 0; 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir SKIPSPACE (cp); 126*cdf0e10cSrcweir if (!*cp) 127*cdf0e10cSrcweir return cp; 128*cdf0e10cSrcweir 129*cdf0e10cSrcweir switch (*cp) { 130*cdf0e10cSrcweir case '(': 131*cdf0e10cSrcweir DO (cp = ParseIfExpression (g, cp + 1, valp)); 132*cdf0e10cSrcweir SKIPSPACE (cp); 133*cdf0e10cSrcweir if (*cp != ')') 134*cdf0e10cSrcweir return CALLFUNC(g, handle_error) (g, cp, ")"); 135*cdf0e10cSrcweir 136*cdf0e10cSrcweir return cp + 1; /* skip the right paren */ 137*cdf0e10cSrcweir 138*cdf0e10cSrcweir case '!': 139*cdf0e10cSrcweir DO (cp = parse_value (g, cp + 1, valp)); 140*cdf0e10cSrcweir *valp = !(*valp); 141*cdf0e10cSrcweir return cp; 142*cdf0e10cSrcweir 143*cdf0e10cSrcweir case '-': 144*cdf0e10cSrcweir DO (cp = parse_value (g, cp + 1, valp)); 145*cdf0e10cSrcweir *valp = -(*valp); 146*cdf0e10cSrcweir return cp; 147*cdf0e10cSrcweir 148*cdf0e10cSrcweir case '#': 149*cdf0e10cSrcweir DO (cp = parse_variable (g, cp + 1, &var)); 150*cdf0e10cSrcweir SKIPSPACE (cp); 151*cdf0e10cSrcweir if (*cp != '(') 152*cdf0e10cSrcweir return CALLFUNC(g, handle_error) (g, cp, "("); 153*cdf0e10cSrcweir do { 154*cdf0e10cSrcweir DO (cp = parse_variable (g, cp + 1, &var)); 155*cdf0e10cSrcweir SKIPSPACE (cp); 156*cdf0e10cSrcweir } while (*cp && *cp != ')'); 157*cdf0e10cSrcweir if (*cp != ')') 158*cdf0e10cSrcweir return CALLFUNC(g, handle_error) (g, cp, ")"); 159*cdf0e10cSrcweir *valp = 1; /* XXX */ 160*cdf0e10cSrcweir return cp + 1; 161*cdf0e10cSrcweir 162*cdf0e10cSrcweir case 'd': 163*cdf0e10cSrcweir if (strncmp (cp, "defined", 7) == 0 && !isalnum(cp[7])) { 164*cdf0e10cSrcweir int paren = 0; 165*cdf0e10cSrcweir int len; 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir cp += 7; 168*cdf0e10cSrcweir SKIPSPACE (cp); 169*cdf0e10cSrcweir if (*cp == '(') { 170*cdf0e10cSrcweir paren = 1; 171*cdf0e10cSrcweir cp++; 172*cdf0e10cSrcweir } 173*cdf0e10cSrcweir DO (cp = parse_variable (g, cp, &var)); 174*cdf0e10cSrcweir len = cp - var; 175*cdf0e10cSrcweir SKIPSPACE (cp); 176*cdf0e10cSrcweir if (paren && *cp != ')') 177*cdf0e10cSrcweir return CALLFUNC(g, handle_error) (g, cp, ")"); 178*cdf0e10cSrcweir *valp = (*(g->funcs.eval_defined)) (g, var, len); 179*cdf0e10cSrcweir return cp + paren; /* skip the right paren */ 180*cdf0e10cSrcweir } 181*cdf0e10cSrcweir /* fall out */ 182*cdf0e10cSrcweir } 183*cdf0e10cSrcweir 184*cdf0e10cSrcweir if (isdigit(*cp)) { 185*cdf0e10cSrcweir DO (cp = parse_number (g, cp, valp)); 186*cdf0e10cSrcweir } else if (!isvarfirstletter(*cp)) 187*cdf0e10cSrcweir return CALLFUNC(g, handle_error) (g, cp, "variable or number"); 188*cdf0e10cSrcweir else { 189*cdf0e10cSrcweir DO (cp = parse_variable (g, cp, &var)); 190*cdf0e10cSrcweir *valp = (*(g->funcs.eval_variable)) (g, var, cp - var); 191*cdf0e10cSrcweir } 192*cdf0e10cSrcweir 193*cdf0e10cSrcweir return cp; 194*cdf0e10cSrcweir } 195*cdf0e10cSrcweir 196*cdf0e10cSrcweir 197*cdf0e10cSrcweir 198*cdf0e10cSrcweir static const char * 199*cdf0e10cSrcweir parse_product (g, cp, valp) 200*cdf0e10cSrcweir IfParser *g; 201*cdf0e10cSrcweir const char *cp; 202*cdf0e10cSrcweir int *valp; 203*cdf0e10cSrcweir { 204*cdf0e10cSrcweir int rightval; 205*cdf0e10cSrcweir 206*cdf0e10cSrcweir DO (cp = parse_value (g, cp, valp)); 207*cdf0e10cSrcweir SKIPSPACE (cp); 208*cdf0e10cSrcweir 209*cdf0e10cSrcweir switch (*cp) { 210*cdf0e10cSrcweir case '*': 211*cdf0e10cSrcweir DO (cp = parse_product (g, cp + 1, &rightval)); 212*cdf0e10cSrcweir *valp = (*valp * rightval); 213*cdf0e10cSrcweir break; 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir case '/': 216*cdf0e10cSrcweir DO (cp = parse_product (g, cp + 1, &rightval)); 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir /* Do nothing in the divide-by-zero case. */ 219*cdf0e10cSrcweir if (rightval) { 220*cdf0e10cSrcweir *valp = (*valp / rightval); 221*cdf0e10cSrcweir } 222*cdf0e10cSrcweir break; 223*cdf0e10cSrcweir 224*cdf0e10cSrcweir case '%': 225*cdf0e10cSrcweir DO (cp = parse_product (g, cp + 1, &rightval)); 226*cdf0e10cSrcweir *valp = (*valp % rightval); 227*cdf0e10cSrcweir break; 228*cdf0e10cSrcweir } 229*cdf0e10cSrcweir return cp; 230*cdf0e10cSrcweir } 231*cdf0e10cSrcweir 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir static const char * 234*cdf0e10cSrcweir parse_sum (g, cp, valp) 235*cdf0e10cSrcweir IfParser *g; 236*cdf0e10cSrcweir const char *cp; 237*cdf0e10cSrcweir int *valp; 238*cdf0e10cSrcweir { 239*cdf0e10cSrcweir int rightval; 240*cdf0e10cSrcweir 241*cdf0e10cSrcweir DO (cp = parse_product (g, cp, valp)); 242*cdf0e10cSrcweir SKIPSPACE (cp); 243*cdf0e10cSrcweir 244*cdf0e10cSrcweir switch (*cp) { 245*cdf0e10cSrcweir case '+': 246*cdf0e10cSrcweir DO (cp = parse_sum (g, cp + 1, &rightval)); 247*cdf0e10cSrcweir *valp = (*valp + rightval); 248*cdf0e10cSrcweir break; 249*cdf0e10cSrcweir 250*cdf0e10cSrcweir case '-': 251*cdf0e10cSrcweir DO (cp = parse_sum (g, cp + 1, &rightval)); 252*cdf0e10cSrcweir *valp = (*valp - rightval); 253*cdf0e10cSrcweir break; 254*cdf0e10cSrcweir } 255*cdf0e10cSrcweir return cp; 256*cdf0e10cSrcweir } 257*cdf0e10cSrcweir 258*cdf0e10cSrcweir 259*cdf0e10cSrcweir static const char * 260*cdf0e10cSrcweir parse_shift (g, cp, valp) 261*cdf0e10cSrcweir IfParser *g; 262*cdf0e10cSrcweir const char *cp; 263*cdf0e10cSrcweir int *valp; 264*cdf0e10cSrcweir { 265*cdf0e10cSrcweir int rightval; 266*cdf0e10cSrcweir 267*cdf0e10cSrcweir DO (cp = parse_sum (g, cp, valp)); 268*cdf0e10cSrcweir SKIPSPACE (cp); 269*cdf0e10cSrcweir 270*cdf0e10cSrcweir switch (*cp) { 271*cdf0e10cSrcweir case '<': 272*cdf0e10cSrcweir if (cp[1] == '<') { 273*cdf0e10cSrcweir DO (cp = parse_shift (g, cp + 2, &rightval)); 274*cdf0e10cSrcweir *valp = (*valp << rightval); 275*cdf0e10cSrcweir } 276*cdf0e10cSrcweir break; 277*cdf0e10cSrcweir 278*cdf0e10cSrcweir case '>': 279*cdf0e10cSrcweir if (cp[1] == '>') { 280*cdf0e10cSrcweir DO (cp = parse_shift (g, cp + 2, &rightval)); 281*cdf0e10cSrcweir *valp = (*valp >> rightval); 282*cdf0e10cSrcweir } 283*cdf0e10cSrcweir break; 284*cdf0e10cSrcweir } 285*cdf0e10cSrcweir return cp; 286*cdf0e10cSrcweir } 287*cdf0e10cSrcweir 288*cdf0e10cSrcweir 289*cdf0e10cSrcweir static const char * 290*cdf0e10cSrcweir parse_inequality (g, cp, valp) 291*cdf0e10cSrcweir IfParser *g; 292*cdf0e10cSrcweir const char *cp; 293*cdf0e10cSrcweir int *valp; 294*cdf0e10cSrcweir { 295*cdf0e10cSrcweir int rightval; 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir DO (cp = parse_shift (g, cp, valp)); 298*cdf0e10cSrcweir SKIPSPACE (cp); 299*cdf0e10cSrcweir 300*cdf0e10cSrcweir switch (*cp) { 301*cdf0e10cSrcweir case '<': 302*cdf0e10cSrcweir if (cp[1] == '=') { 303*cdf0e10cSrcweir DO (cp = parse_inequality (g, cp + 2, &rightval)); 304*cdf0e10cSrcweir *valp = (*valp <= rightval); 305*cdf0e10cSrcweir } else { 306*cdf0e10cSrcweir DO (cp = parse_inequality (g, cp + 1, &rightval)); 307*cdf0e10cSrcweir *valp = (*valp < rightval); 308*cdf0e10cSrcweir } 309*cdf0e10cSrcweir break; 310*cdf0e10cSrcweir 311*cdf0e10cSrcweir case '>': 312*cdf0e10cSrcweir if (cp[1] == '=') { 313*cdf0e10cSrcweir DO (cp = parse_inequality (g, cp + 2, &rightval)); 314*cdf0e10cSrcweir *valp = (*valp >= rightval); 315*cdf0e10cSrcweir } else { 316*cdf0e10cSrcweir DO (cp = parse_inequality (g, cp + 1, &rightval)); 317*cdf0e10cSrcweir *valp = (*valp > rightval); 318*cdf0e10cSrcweir } 319*cdf0e10cSrcweir break; 320*cdf0e10cSrcweir } 321*cdf0e10cSrcweir return cp; 322*cdf0e10cSrcweir } 323*cdf0e10cSrcweir 324*cdf0e10cSrcweir 325*cdf0e10cSrcweir static const char * 326*cdf0e10cSrcweir parse_equality (g, cp, valp) 327*cdf0e10cSrcweir IfParser *g; 328*cdf0e10cSrcweir const char *cp; 329*cdf0e10cSrcweir int *valp; 330*cdf0e10cSrcweir { 331*cdf0e10cSrcweir int rightval; 332*cdf0e10cSrcweir 333*cdf0e10cSrcweir DO (cp = parse_inequality (g, cp, valp)); 334*cdf0e10cSrcweir SKIPSPACE (cp); 335*cdf0e10cSrcweir 336*cdf0e10cSrcweir switch (*cp) { 337*cdf0e10cSrcweir case '=': 338*cdf0e10cSrcweir if (cp[1] == '=') 339*cdf0e10cSrcweir cp++; 340*cdf0e10cSrcweir DO (cp = parse_equality (g, cp + 1, &rightval)); 341*cdf0e10cSrcweir *valp = (*valp == rightval); 342*cdf0e10cSrcweir break; 343*cdf0e10cSrcweir 344*cdf0e10cSrcweir case '!': 345*cdf0e10cSrcweir if (cp[1] != '=') 346*cdf0e10cSrcweir break; 347*cdf0e10cSrcweir DO (cp = parse_equality (g, cp + 2, &rightval)); 348*cdf0e10cSrcweir *valp = (*valp != rightval); 349*cdf0e10cSrcweir break; 350*cdf0e10cSrcweir } 351*cdf0e10cSrcweir return cp; 352*cdf0e10cSrcweir } 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir 355*cdf0e10cSrcweir static const char * 356*cdf0e10cSrcweir parse_band (g, cp, valp) 357*cdf0e10cSrcweir IfParser *g; 358*cdf0e10cSrcweir const char *cp; 359*cdf0e10cSrcweir int *valp; 360*cdf0e10cSrcweir { 361*cdf0e10cSrcweir int rightval; 362*cdf0e10cSrcweir 363*cdf0e10cSrcweir DO (cp = parse_equality (g, cp, valp)); 364*cdf0e10cSrcweir SKIPSPACE (cp); 365*cdf0e10cSrcweir 366*cdf0e10cSrcweir switch (*cp) { 367*cdf0e10cSrcweir case '&': 368*cdf0e10cSrcweir if (cp[1] != '&') { 369*cdf0e10cSrcweir DO (cp = parse_band (g, cp + 1, &rightval)); 370*cdf0e10cSrcweir *valp = (*valp & rightval); 371*cdf0e10cSrcweir } 372*cdf0e10cSrcweir break; 373*cdf0e10cSrcweir } 374*cdf0e10cSrcweir return cp; 375*cdf0e10cSrcweir } 376*cdf0e10cSrcweir 377*cdf0e10cSrcweir 378*cdf0e10cSrcweir static const char * 379*cdf0e10cSrcweir parse_bor (g, cp, valp) 380*cdf0e10cSrcweir IfParser *g; 381*cdf0e10cSrcweir const char *cp; 382*cdf0e10cSrcweir int *valp; 383*cdf0e10cSrcweir { 384*cdf0e10cSrcweir int rightval; 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir DO (cp = parse_band (g, cp, valp)); 387*cdf0e10cSrcweir SKIPSPACE (cp); 388*cdf0e10cSrcweir 389*cdf0e10cSrcweir switch (*cp) { 390*cdf0e10cSrcweir case '|': 391*cdf0e10cSrcweir if (cp[1] != '|') { 392*cdf0e10cSrcweir DO (cp = parse_bor (g, cp + 1, &rightval)); 393*cdf0e10cSrcweir *valp = (*valp | rightval); 394*cdf0e10cSrcweir } 395*cdf0e10cSrcweir break; 396*cdf0e10cSrcweir } 397*cdf0e10cSrcweir return cp; 398*cdf0e10cSrcweir } 399*cdf0e10cSrcweir 400*cdf0e10cSrcweir 401*cdf0e10cSrcweir static const char * 402*cdf0e10cSrcweir parse_land (g, cp, valp) 403*cdf0e10cSrcweir IfParser *g; 404*cdf0e10cSrcweir const char *cp; 405*cdf0e10cSrcweir int *valp; 406*cdf0e10cSrcweir { 407*cdf0e10cSrcweir int rightval; 408*cdf0e10cSrcweir 409*cdf0e10cSrcweir DO (cp = parse_bor (g, cp, valp)); 410*cdf0e10cSrcweir SKIPSPACE (cp); 411*cdf0e10cSrcweir 412*cdf0e10cSrcweir switch (*cp) { 413*cdf0e10cSrcweir case '&': 414*cdf0e10cSrcweir if (cp[1] != '&') 415*cdf0e10cSrcweir return CALLFUNC(g, handle_error) (g, cp, "&&"); 416*cdf0e10cSrcweir DO (cp = parse_land (g, cp + 2, &rightval)); 417*cdf0e10cSrcweir *valp = (*valp && rightval); 418*cdf0e10cSrcweir break; 419*cdf0e10cSrcweir } 420*cdf0e10cSrcweir return cp; 421*cdf0e10cSrcweir } 422*cdf0e10cSrcweir 423*cdf0e10cSrcweir 424*cdf0e10cSrcweir static const char * 425*cdf0e10cSrcweir parse_lor (g, cp, valp) 426*cdf0e10cSrcweir IfParser *g; 427*cdf0e10cSrcweir const char *cp; 428*cdf0e10cSrcweir int *valp; 429*cdf0e10cSrcweir { 430*cdf0e10cSrcweir int rightval; 431*cdf0e10cSrcweir 432*cdf0e10cSrcweir DO (cp = parse_land (g, cp, valp)); 433*cdf0e10cSrcweir SKIPSPACE (cp); 434*cdf0e10cSrcweir 435*cdf0e10cSrcweir switch (*cp) { 436*cdf0e10cSrcweir case '|': 437*cdf0e10cSrcweir if (cp[1] != '|') 438*cdf0e10cSrcweir return CALLFUNC(g, handle_error) (g, cp, "||"); 439*cdf0e10cSrcweir DO (cp = parse_lor (g, cp + 2, &rightval)); 440*cdf0e10cSrcweir *valp = (*valp || rightval); 441*cdf0e10cSrcweir break; 442*cdf0e10cSrcweir } 443*cdf0e10cSrcweir return cp; 444*cdf0e10cSrcweir } 445*cdf0e10cSrcweir 446*cdf0e10cSrcweir 447*cdf0e10cSrcweir /**************************************************************************** 448*cdf0e10cSrcweir External Entry Points 449*cdf0e10cSrcweir ****************************************************************************/ 450*cdf0e10cSrcweir 451*cdf0e10cSrcweir const char * 452*cdf0e10cSrcweir ParseIfExpression (g, cp, valp) 453*cdf0e10cSrcweir IfParser *g; 454*cdf0e10cSrcweir const char *cp; 455*cdf0e10cSrcweir int *valp; 456*cdf0e10cSrcweir { 457*cdf0e10cSrcweir return parse_lor (g, cp, valp); 458*cdf0e10cSrcweir } 459*cdf0e10cSrcweir 460*cdf0e10cSrcweir 461