1*b1cdbd2cSJim Jagielski /* 2*b1cdbd2cSJim Jagielski * $XConsortium: ifparser.h,v 1.1 92/08/22 13:05:39 rws Exp $ 3*b1cdbd2cSJim Jagielski * 4*b1cdbd2cSJim Jagielski * Copyright 1992 Network Computing Devices, Inc. 5*b1cdbd2cSJim Jagielski * 6*b1cdbd2cSJim Jagielski * Permission to use, copy, modify, and distribute this software and its 7*b1cdbd2cSJim Jagielski * documentation for any purpose and without fee is hereby granted, provided 8*b1cdbd2cSJim Jagielski * that the above copyright notice appear in all copies and that both that 9*b1cdbd2cSJim Jagielski * copyright notice and this permission notice appear in supporting 10*b1cdbd2cSJim Jagielski * documentation, and that the name of Network Computing Devices may not be 11*b1cdbd2cSJim Jagielski * used in advertising or publicity pertaining to distribution of the software 12*b1cdbd2cSJim Jagielski * without specific, written prior permission. Network Computing Devices makes 13*b1cdbd2cSJim Jagielski * no representations about the suitability of this software for any purpose. 14*b1cdbd2cSJim Jagielski * It is provided ``as is'' without express or implied warranty. 15*b1cdbd2cSJim Jagielski * 16*b1cdbd2cSJim Jagielski * NETWORK COMPUTING DEVICES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 17*b1cdbd2cSJim Jagielski * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, 18*b1cdbd2cSJim Jagielski * IN NO EVENT SHALL NETWORK COMPUTING DEVICES BE LIABLE FOR ANY SPECIAL, 19*b1cdbd2cSJim Jagielski * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 20*b1cdbd2cSJim Jagielski * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 21*b1cdbd2cSJim Jagielski * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 22*b1cdbd2cSJim Jagielski * PERFORMANCE OF THIS SOFTWARE. 23*b1cdbd2cSJim Jagielski * 24*b1cdbd2cSJim Jagielski * Author: Jim Fulton 25*b1cdbd2cSJim Jagielski * Network Computing Devices, Inc. 26*b1cdbd2cSJim Jagielski * 27*b1cdbd2cSJim Jagielski * Simple if statement processor 28*b1cdbd2cSJim Jagielski * 29*b1cdbd2cSJim Jagielski * This module can be used to evaluate string representations of C language 30*b1cdbd2cSJim Jagielski * if constructs. It accepts the following grammar: 31*b1cdbd2cSJim Jagielski * 32*b1cdbd2cSJim Jagielski * EXPRESSION := VALUE 33*b1cdbd2cSJim Jagielski * | VALUE BINOP EXPRESSION 34*b1cdbd2cSJim Jagielski * 35*b1cdbd2cSJim Jagielski * VALUE := '(' EXPRESSION ')' 36*b1cdbd2cSJim Jagielski * | '!' VALUE 37*b1cdbd2cSJim Jagielski * | '-' VALUE 38*b1cdbd2cSJim Jagielski * | 'defined' '(' variable ')' 39*b1cdbd2cSJim Jagielski * | variable 40*b1cdbd2cSJim Jagielski * | number 41*b1cdbd2cSJim Jagielski * 42*b1cdbd2cSJim Jagielski * BINOP := '*' | '/' | '%' 43*b1cdbd2cSJim Jagielski * | '+' | '-' 44*b1cdbd2cSJim Jagielski * | '<<' | '>>' 45*b1cdbd2cSJim Jagielski * | '<' | '>' | '<=' | '>=' 46*b1cdbd2cSJim Jagielski * | '==' | '!=' 47*b1cdbd2cSJim Jagielski * | '&' | '|' 48*b1cdbd2cSJim Jagielski * | '&&' | '||' 49*b1cdbd2cSJim Jagielski * 50*b1cdbd2cSJim Jagielski * The normal C order of precidence is supported. 51*b1cdbd2cSJim Jagielski * 52*b1cdbd2cSJim Jagielski * 53*b1cdbd2cSJim Jagielski * External Entry Points: 54*b1cdbd2cSJim Jagielski * 55*b1cdbd2cSJim Jagielski * ParseIfExpression parse a string for #if 56*b1cdbd2cSJim Jagielski */ 57*b1cdbd2cSJim Jagielski 58*b1cdbd2cSJim Jagielski #include <stdio.h> 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielski typedef int Bool; 61*b1cdbd2cSJim Jagielski #define False 0 62*b1cdbd2cSJim Jagielski #define True 1 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielski typedef struct _if_parser { 65*b1cdbd2cSJim Jagielski struct { /* functions */ 66*b1cdbd2cSJim Jagielski const char *(*handle_error) (/* struct _if_parser *, const char *, 67*b1cdbd2cSJim Jagielski const char * */); 68*b1cdbd2cSJim Jagielski int (*eval_variable) (/* struct _if_parser *, const char *, int */); 69*b1cdbd2cSJim Jagielski int (*eval_defined) (/* struct _if_parser *, const char *, int */); 70*b1cdbd2cSJim Jagielski } funcs; 71*b1cdbd2cSJim Jagielski char *data; 72*b1cdbd2cSJim Jagielski } IfParser; 73*b1cdbd2cSJim Jagielski 74*b1cdbd2cSJim Jagielski const char *ParseIfExpression (/* IfParser *, const char *, int * */); 75*b1cdbd2cSJim Jagielski 76