src/utils/raSqlQuery/raSqlQuery.c 1.3
1.3 2009/11/20 01:35:37 kent
Adding unary minus.
Index: src/utils/raSqlQuery/raSqlQuery.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/utils/raSqlQuery/raSqlQuery.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -b -B -U 4 -r1.2 -r1.3
--- src/utils/raSqlQuery/raSqlQuery.c 20 Nov 2009 01:18:09 -0000 1.2
+++ src/utils/raSqlQuery/raSqlQuery.c 20 Nov 2009 01:35:37 -0000 1.3
@@ -80,8 +80,10 @@
rqlParseBooleanToInt,
rqlParseBooleanToDouble,
rqlParseIntToDouble,
+ rqlParseUnaryMinusDouble,
+
rqlParseAnd, /* An and */
rqlParseOr, /* An or */
};
@@ -115,8 +117,10 @@
return "rqlParseBooleanToDouble";
case rqlParseIntToDouble:
return "rqlParseIntToDouble";
+ case rqlParseUnaryMinusDouble:
+ return "rqlParseUnaryMinusDouble";
default:
return "rqlParseUnknown";
}
}
@@ -353,12 +357,34 @@
return cast;
}
}
+struct rqlParse *rqlParseUnaryMinus(struct tokenizer *tkz)
+/* Return unary minus sort of parse tree if there's a leading '-' */
+{
+char *tok = tokenizerMustHaveNext(tkz);
+if (tok[0] == '-')
+ {
+ struct rqlParse *c = rqlParseAtom(tkz);
+ c = rqlParseCoerce(c, rqlTypeDouble);
+ struct rqlParse *p;
+ AllocVar(p);
+ p->op = rqlParseUnaryMinusDouble;
+ p->type = rqlTypeDouble;
+ p->children = c;
+ return p;
+ }
+else
+ {
+ tokenizerReuse(tkz);
+ return rqlParseAtom(tkz);
+ }
+}
+
struct rqlParse *rqlParseCmp(struct tokenizer *tkz)
/* Parse out comparison. */
{
-struct rqlParse *l = rqlParseAtom(tkz);
+struct rqlParse *l = rqlParseUnaryMinus(tkz);
struct rqlParse *p = l;
char *tok = tokenizerNext(tkz);
if (tok != NULL)
{
@@ -376,9 +402,9 @@
{
tokenizerReuse(tkz);
return p;
}
- struct rqlParse *r = rqlParseAtom(tkz);
+ struct rqlParse *r = rqlParseUnaryMinus(tkz);
AllocVar(p);
p->op = op;
p->type = rqlTypeBoolean;
@@ -549,8 +575,14 @@
res.type = rqlTypeDouble;
res.val.x = res.val.b;
break;
+ case rqlParseUnaryMinusDouble:
+ res = rqlEvalOnRecord(p->children, ra);
+ res.type = rqlTypeDouble;
+ res.val.x = -res.val.x;
+ break;
+
default:
errAbort("Unknown op %s\n", rqlParseOpToString(p->op));
res.type = rqlTypeInt; // Keep compiler from complaining.
res.val.i = 0; // Keep compiler from complaining.