From 95c189f7445e6deca85130b7b8fa25dc76fabe12 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Mon, 16 Aug 2021 13:41:20 +0200 Subject: Add indexing and example --- src/XpathParser.c | 51 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 13 deletions(-) (limited to 'src/XpathParser.c') diff --git a/src/XpathParser.c b/src/XpathParser.c index f3248eb..b79fe11 100644 --- a/src/XpathParser.c +++ b/src/XpathParser.c @@ -18,26 +18,29 @@ static void quickmedia_xpath_parser_init(QuickMediaXpathParser *self, const char quickmedia_xpath_tokenizer_init(&self->tokenizer, xpath); } -/* ('[' IDENTIFIER '=' '"' STRING '"' ']')? */ +/* (('[' IDENTIFIER '=' '"' STRING '"' ']') | ('[' NUMBER ']'))? */ static int xpath_parse_param(QuickMediaXpathParser *self, QuickMediaNodeSearchParam *result) { if(quickmedia_xpath_tokenizer_next_if(&self->tokenizer, QUICKMEDIA_XPATH_TOKEN_OPEN_BRACKET) != 0) return 1; QuickMediaXpathToken token = quickmedia_xpath_tokenizer_next(&self->tokenizer); - if(token != QUICKMEDIA_XPATH_TOKEN_IDENTIFIER) - return -1; - - result->name = self->tokenizer.identifier; + if(token == QUICKMEDIA_XPATH_TOKEN_IDENTIFIER) { + result->name = self->tokenizer.identifier; - token = quickmedia_xpath_tokenizer_next(&self->tokenizer); - if(token != QUICKMEDIA_XPATH_TOKEN_EQUAL) - return -2; + token = quickmedia_xpath_tokenizer_next(&self->tokenizer); + if(token != QUICKMEDIA_XPATH_TOKEN_EQUAL) + return -2; - token = quickmedia_xpath_tokenizer_next(&self->tokenizer); - if(token != QUICKMEDIA_XPATH_TOKEN_STRING) - return -3; - - result->value = self->tokenizer.string; + token = quickmedia_xpath_tokenizer_next(&self->tokenizer); + if(token != QUICKMEDIA_XPATH_TOKEN_STRING) + return -3; + + result->value = self->tokenizer.string; + } else if(token == QUICKMEDIA_XPATH_TOKEN_NUMBER) { + result->index = self->tokenizer.number; + } else { + return -1; + } token = quickmedia_xpath_tokenizer_next(&self->tokenizer); if(token != QUICKMEDIA_XPATH_TOKEN_CLOSING_BRACKET) @@ -48,6 +51,24 @@ static int xpath_parse_param(QuickMediaXpathParser *self, QuickMediaNodeSearchPa return 0; } +/* ('[' NUMBER ']'))? */ +static int xpath_parse_index(QuickMediaXpathParser *self, QuickMediaNodeSearchParam *result) { + if(quickmedia_xpath_tokenizer_next_if(&self->tokenizer, QUICKMEDIA_XPATH_TOKEN_OPEN_BRACKET) != 0) + return 1; + + QuickMediaXpathToken token = quickmedia_xpath_tokenizer_next(&self->tokenizer); + if(token != QUICKMEDIA_XPATH_TOKEN_NUMBER) + return -1; + + result->index = self->tokenizer.number; + + token = quickmedia_xpath_tokenizer_next(&self->tokenizer); + if(token != QUICKMEDIA_XPATH_TOKEN_CLOSING_BRACKET) + return -4; + + return 0; +} + static int xpath_parse_node(QuickMediaXpathParser *self, QuickMediaNodeSearch *result) { quickmedia_node_search_init(result); QuickMediaXpathToken token = quickmedia_xpath_tokenizer_next(&self->tokenizer); @@ -65,6 +86,10 @@ static int xpath_parse_node(QuickMediaXpathParser *self, QuickMediaNodeSearch *r if(param_result < 0) return param_result; + int index_result = xpath_parse_index(self, &result->param); + if(index_result < 0) + return index_result; + result->child = malloc(sizeof(QuickMediaNodeSearch)); if(!result->child) return -1; -- cgit v1.2.3