MCPcopy Create free account
hub / github.com/DeusData/codebase-memory-mcp / cbm_parse

Function cbm_parse

src/cypher/cypher.c:1998–2059  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1996}
1997
1998int cbm_parse(const cbm_token_t *tokens, int token_count, // NOLINT(misc-no-recursion)
1999 cbm_parse_result_t *out) {
2000 memset(out, 0, sizeof(*out));
2001 parser_t p = {.tokens = tokens, .count = token_count, .pos = 0};
2002
2003 /* Check for unsupported leading keywords */
2004 const char *unsup = unsupported_clause_error(peek(&p)->type);
2005 if (unsup) {
2006 out->error = heap_strdup(unsup);
2007 return CBM_NOT_FOUND;
2008 }
2009
2010 cbm_query_t *q = calloc(CBM_ALLOC_ONE, sizeof(cbm_query_t));
2011
2012 if (check(&p, TOK_UNWIND)) {
2013 parse_unwind_clause(&p, q);
2014 }
2015
2016 bool first_optional = false;
2017 if (check(&p, TOK_OPTIONAL)) {
2018 advance(&p);
2019 first_optional = true;
2020 }
2021 if (!expect(&p, TOK_MATCH)) {
2022 out->error = heap_strdup(p.error[0] ? p.error : "expected MATCH");
2023 cbm_query_free(q);
2024 return CBM_NOT_FOUND;
2025 }
2026
2027 int pat_cap = CYP_INIT_CAP4;
2028 q->patterns = malloc(pat_cap * sizeof(cbm_pattern_t));
2029 q->pattern_optional = malloc(pat_cap * sizeof(bool));
2030
2031 if (parse_match_pattern(&p, &q->patterns[0]) < 0) {
2032 out->error = heap_strdup(p.error[0] ? p.error : "failed to parse pattern");
2033 cbm_query_free(q);
2034 return CBM_NOT_FOUND;
2035 }
2036 q->pattern_optional[0] = first_optional;
2037 q->pattern_count = SKIP_ONE;
2038
2039 if (parse_match_chain(&p, q, &pat_cap) < 0) {
2040 out->error = heap_strdup(p.error[0] ? p.error : "failed to parse additional pattern");
2041 cbm_query_free(q);
2042 return CBM_NOT_FOUND;
2043 }
2044
2045 if (parse_where(&p, &q->where) < 0) {
2046 out->error = heap_strdup(p.error[0] ? p.error : "failed to parse WHERE");
2047 cbm_query_free(q);
2048 return CBM_NOT_FOUND;
2049 }
2050
2051 if (parse_post_where(&p, q, &pat_cap) < 0) {
2052 out->error = heap_strdup(p.error[0] ? p.error : "failed to parse query");
2053 cbm_query_free(q);
2054 return CBM_NOT_FOUND;
2055 }

Callers 2

parse_post_whereFunction · 0.85
cbm_cypher_parseFunction · 0.85

Calls 12

unsupported_clause_errorFunction · 0.85
peekFunction · 0.85
parse_unwind_clauseFunction · 0.85
advanceFunction · 0.85
expectFunction · 0.85
cbm_query_freeFunction · 0.85
parse_match_patternFunction · 0.85
parse_match_chainFunction · 0.85
parse_whereFunction · 0.85
parse_post_whereFunction · 0.85
heap_strdupFunction · 0.70
checkFunction · 0.70

Tested by

no test coverage detected