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.