From f6b9e43347e8a0dbbc6016ff3584dc56058135c8 Mon Sep 17 00:00:00 2001 From: reinelt Date: Mon, 6 Oct 2003 05:47:27 +0000 Subject: [lcd4linux @ 2003-10-06 05:47:27 by reinelt] operators: ==, \!=, <=, >= git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@257 3ae390bd-cb1e-0410-b409-cd5a39f66f1f --- evaluator.c | 48 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-) (limited to 'evaluator.c') diff --git a/evaluator.c b/evaluator.c index 8c4a740..995b61a 100644 --- a/evaluator.c +++ b/evaluator.c @@ -1,4 +1,4 @@ -/* $Id: evaluator.c,v 1.1 2003/10/06 04:34:06 reinelt Exp $ +/* $Id: evaluator.c,v 1.2 2003/10/06 05:47:27 reinelt Exp $ * * expression evaluation * @@ -10,6 +10,9 @@ * FIXME: GPL or not GPL???? * * $Log: evaluator.c,v $ + * Revision 1.2 2003/10/06 05:47:27 reinelt + * operators: ==, \!=, <=, >= + * * Revision 1.1 2003/10/06 04:34:06 reinelt * expression evaluator added * @@ -96,7 +99,7 @@ #define is_blank(c) (c==' ' || c=='\t') #define is_number(c) (isdigit(c) || c=='.') #define is_name(c) (isalnum(c) || c=='_') -#define is_delim(c) (strchr("+-*/%^().,;=<>&|", c)!=NULL) +#define is_delim(c) (strchr("+-*/%^().,;=<>!&|", c)!=NULL) typedef struct { @@ -422,7 +425,14 @@ static void Parse (void) if (is_delim(*Expression)) { Type=T_DELIMITER; - Token=strndup(Expression++, 1); + // special case for <=, >=, ==, != + if (strchr("<>=!", *Expression)!=NULL && *(Expression+1)=='=') { + Token=strndup(Expression, 2); + Expression+=2; + } else { + Token=strndup(Expression, 1); + Expression++; + } } else if (isdigit(*Expression)) { @@ -475,7 +485,7 @@ static void Level02 (RESULT *result) char *name; if (Type==T_NAME) { - if (*Expression == '=') { + if (Expression[0]=='=' && Expression[1]!='=') { name=strdup(Token); Parse(); Parse(); @@ -520,7 +530,7 @@ static void Level04 (RESULT *result) while(*Token=='&') { Parse(); - Level06 (&operand); + Level05 (&operand); value = (R2N(result)!=0.0) && (R2N(&operand)!=0.0); SetResult(&result, R_NUMBER, &value); } @@ -536,13 +546,13 @@ static void Level05 (RESULT *result) Level06 (result); - if ((operator=*Token)=='<' || operator=='>') { + if (((operator=Token[0])=='=' || operator=='!') && Token[1]=='=') { Parse(); - Level07 (&operand); - if (operator=='<') - value = (R2N(result) < R2N(&operand)); + Level06 (&operand); + if (operator=='=') + value = (R2N(result) == R2N(&operand)); else - value = (R2N(result) > R2N(&operand)); + value = (R2N(result) != R2N(&operand)); SetResult(&result, R_NUMBER, &value); } } @@ -551,19 +561,27 @@ static void Level05 (RESULT *result) // relational operators static void Level06 (RESULT *result) { - char operator; + char operator[2]; RESULT operand = {0, 0.0, NULL}; double value; Level07 (result); - if ((operator=*Token)=='<' || operator=='>') { + if (*Token=='<' || *Token=='>') { + operator[0]=Token[0]; + operator[1]=Token[1]; Parse(); Level07 (&operand); - if (operator=='<') - value = (R2N(result) < R2N(&operand)); + if (operator[0]=='<') + if (operator[1]=='=') + value = (R2N(result) <= R2N(&operand)); + else + value = (R2N(result) < R2N(&operand)); else - value = (R2N(result) > R2N(&operand)); + if (operator[1]=='=') + value = (R2N(result) >= R2N(&operand)); + else + value = (R2N(result) > R2N(&operand)); SetResult(&result, R_NUMBER, &value); } } -- cgit v1.2.3