X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Ffrontend%2Fparser.c;h=76382d34b099756b09348e0afa67ab013a9ab7ca;hb=72a63cfb0e65bb575889b8dbee6648cafd6a52f2;hp=b970e73671eceefd8fd697d3029046b8fb8ac7f1;hpb=4215d1d8c69367c1d43bed9d39d428a92b329a92;p=sysdb.git diff --git a/src/frontend/parser.c b/src/frontend/parser.c index b970e73..76382d3 100644 --- a/src/frontend/parser.c +++ b/src/frontend/parser.c @@ -27,36 +27,104 @@ #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 /* - * 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 : */