-/* $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
*
* 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
*
#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 {
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)) {
char *name;
if (Type==T_NAME) {
- if (*Expression == '=') {
+ if (Expression[0]=='=' && Expression[1]!='=') {
name=strdup(Token);
Parse();
Parse();
while(*Token=='&') {
Parse();
- Level06 (&operand);
+ Level05 (&operand);
value = (R2N(result)!=0.0) && (R2N(&operand)!=0.0);
SetResult(&result, R_NUMBER, &value);
}
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);
}
}
// 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);
}
}
-/* $Id: expression.c,v 1.1 2003/10/06 04:34:06 reinelt Exp $
+/* $Id: expression.c,v 1.2 2003/10/06 05:47:27 reinelt Exp $
*
* expression handling
*
*
*
* $Log: expression.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
*
}
-#if 1
-
int EX_test(int argc, char* argv[])
{
int ec;
return 0;
}
-#endif