src/utils/raSqlQuery/rqlParse.c 1.2
1.2 2009/11/20 08:01:12 kent
Adding logical not
Index: src/utils/raSqlQuery/rqlParse.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/utils/raSqlQuery/rqlParse.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -b -B -U 4 -r1.1 -r1.2
--- src/utils/raSqlQuery/rqlParse.c 20 Nov 2009 07:41:56 -0000 1.1
+++ src/utils/raSqlQuery/rqlParse.c 20 Nov 2009 08:01:12 -0000 1.2
@@ -391,12 +391,33 @@
}
return p;
}
+static struct rqlParse *rqlParseNot(struct tokenizer *tkz)
+/* parse out a logical not. */
+{
+char *tok = tokenizerNext(tkz);
+if (sameString(tok, "not"))
+ {
+ struct rqlParse *p = rqlParseCoerce(rqlParseCmp(tkz), rqlTypeBoolean);
+ struct rqlParse *n;
+ AllocVar(n);
+ n->op = rqlOpNot;
+ n->type = rqlTypeBoolean;
+ n->children = p;
+ return n;
+ }
+else
+ {
+ tokenizerReuse(tkz);
+ return rqlParseCmp(tkz);
+ }
+}
+
static struct rqlParse *rqlParseAnd(struct tokenizer *tkz)
/* Parse out and or or. */
{
-struct rqlParse *l = rqlParseCoerce(rqlParseCmp(tkz), rqlTypeBoolean);
+struct rqlParse *l = rqlParseCoerce(rqlParseNot(tkz), rqlTypeBoolean);
struct rqlParse *parent = NULL;
struct rqlParse *p = l;
for (;;)
{
@@ -415,9 +436,9 @@
parent->type = rqlTypeBoolean;
parent->children = p;
p = parent;
}
- struct rqlParse *r = rqlParseCoerce(rqlParseCmp(tkz), rqlTypeBoolean);
+ struct rqlParse *r = rqlParseCoerce(rqlParseNot(tkz), rqlTypeBoolean);
slAddTail(&parent->children, r);
}
}
}