aboutsummaryrefslogtreecommitdiff
path: root/src/XpathParser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/XpathParser.c')
-rw-r--r--src/XpathParser.c51
1 files changed, 38 insertions, 13 deletions
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;