diff --git a/src/frontend/parser.c b/src/frontend/parser.c
index b970e73671eceefd8fd697d3029046b8fb8ac7f1..76382d34b099756b09348e0afa67ab013a9ab7ca 100644 (file)
--- a/src/frontend/parser.c
+++ b/src/frontend/parser.c
#include "sysdb.h"
+#include "frontend/connection-private.h"
#include "frontend/parser.h"
#include "frontend/grammar.h"
-#include "frontend/connection-private.h"
+
+#include "core/store.h"
+
+#include "utils/llist.h"
#include <string.h>
/*
- * public API
+ * private helper functions
*/
-int
-sdb_fe_parse(const char *query)
+static int
+scanner_init(const char *input, int len,
+ sdb_fe_yyscan_t *scanner, sdb_fe_yyextra_t *extra)
{
- sdb_fe_yyscan_t scanner;
- int yyres;
+ if (! input)
+ return -1;
+
+ memset(extra, 0, sizeof(*extra));
+ extra->parsetree = sdb_llist_create();
+ extra->mode = SDB_PARSE_DEFAULT;
- if (! query)
+ if (! extra->parsetree)
return -1;
- scanner = sdb_fe_scanner_init(query);
- if (! scanner)
+ *scanner = sdb_fe_scanner_init(input, len, extra);
+ if (! scanner) {
+ sdb_llist_destroy(extra->parsetree);
return -1;
+ }
+ return 0;
+} /* scanner_init */
+
+/*
+ * public API
+ */
+
+sdb_llist_t *
+sdb_fe_parse(const char *query, int len)
+{
+ sdb_fe_yyscan_t scanner;
+ sdb_fe_yyextra_t yyextra;
+ int yyres;
+
+ if (scanner_init(query, len, &scanner, &yyextra))
+ return NULL;
yyres = sdb_fe_yyparse(scanner);
sdb_fe_scanner_destroy(scanner);
- if (yyres)
- return -1;
- return 0;
+ if (yyres) {
+ sdb_llist_destroy(yyextra.parsetree);
+ return NULL;
+ }
+ return yyextra.parsetree;
} /* sdb_fe_parse */
+sdb_store_matcher_t *
+sdb_fe_parse_matcher(const char *expr, int len)
+{
+ sdb_fe_yyscan_t scanner;
+ sdb_fe_yyextra_t yyextra;
+
+ sdb_conn_node_t *node;
+ sdb_store_matcher_t *m;
+
+ int yyres;
+
+ if (scanner_init(expr, len, &scanner, &yyextra))
+ return NULL;
+
+ yyextra.mode = SDB_PARSE_EXPR;
+
+ yyres = sdb_fe_yyparse(scanner);
+ sdb_fe_scanner_destroy(scanner);
+
+ if (yyres) {
+ sdb_llist_destroy(yyextra.parsetree);
+ return NULL;
+ }
+
+ node = SDB_CONN_NODE(sdb_llist_get(yyextra.parsetree, 0));
+ if (! node)
+ return NULL;
+
+ if (node->cmd == CONNECTION_EXPR)
+ m = CONN_MATCHER(node)->matcher;
+ else
+ m = NULL;
+
+ CONN_MATCHER(node)->matcher = NULL;
+ sdb_llist_destroy(yyextra.parsetree);
+ sdb_object_deref(SDB_OBJ(node));
+ return m;
+} /* sdb_fe_parse_matcher */
+
/* vim: set tw=78 sw=4 ts=4 noexpandtab : */