/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef AXIOM_XPATH_INTERNALS_PARSER_H #define AXIOM_XPATH_INTERNALS_PARSER_H #ifdef __cplusplus extern "C" { #endif /** * @defgroup axiom_xpath_parser parser * @ingroup axiom_xpath * @{ */ /* Macros */ /** Get the current character in the expression */ #define AXIOM_XPATH_CURRENT (expr->expr_ptr < expr->expr_len ? \ expr->expr_str[expr->expr_ptr] : -1) /** Get a character after the current */ #define AXIOM_XPATH_NEXT(ind) (expr->expr_ptr + ind < expr->expr_len ? \ expr->expr_str[expr->expr_ptr + ind] : -1) /** Increment the pointer to the expression */ #define AXIOM_XPATH_READ(n) (expr->expr_ptr += n) /** Check if expression has finished parsing */ #define AXIOM_XPATH_HAS_MORE (expr->expr_ptr < expr->expr_len) /** Skip white spaces */ #define AXIOM_XPATH_SKIP_WHITESPACES \ { while(AXIOM_XPATH_CURRENT == ' ') \ AXIOM_XPATH_READ(1); \ } /** Wrape an operation in a self_or_descendent step; used to handle '//' */ #define AXIOM_XPATH_WRAP_SELF_DESCENDANT(_op2) \ axiom_xpath_add_operation(env, expr, AXIOM_XPATH_OPERATION_STEP, \ axiom_xpath_add_operation(env, expr, AXIOM_XPATH_OPERATION_NODE_TEST, \ AXIOM_XPATH_PARSE_END, AXIOM_XPATH_PARSE_END, \ axiom_xpath_create_node_test_node(env), \ axiom_xpath_create_axis(env, AXIOM_XPATH_AXIS_DESCENDANT_OR_SELF)), \ _op2, NULL, NULL) /** Adds an operation */ #define AXIOM_XPATH_PUSH(_opr, _op1, _op2) axiom_xpath_add_operation( \ env, expr, _opr, _op1, _op2, NULL, NULL) /** Adds an operation with parameters */ #define AXIOM_XPATH_PUSH_PAR(_opr, _par1, _par2, _op1) axiom_xpath_add_operation( \ env, expr, _opr, _op1, AXIOM_XPATH_PARSE_END, (void *)_par1, (void *)_par2) /* Functions */ /** * Add an operation to the operations array * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @param op_type Type of the operation * @param op1 First operand * @param op2 Second operand * @param par1 First parameter * @param par2 Second parameter * @return Index of the operation in the array */ int axiom_xpath_add_operation( const axutil_env_t *env, axiom_xpath_expression_t* expr, axiom_xpath_operation_type_t op_type, int op1, int op2, void *par1, void *par2); /** * Compile a XPath expression * * [14] Expr ::= OrExpr * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return Index of the main operation in the array */ int axiom_xpath_compile( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compile an equals expression * * ***Not completed*** * [23] EqualityExpr ::= UnionExpr '=' UnionExpr * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return Index of the operation in the array */ int axiom_xpath_compile_equalexpr( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compile an union * * [18] UnionExpr ::= PathExpr * | UnionExpr '|' PathExpr * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return Index of the operation in the array */ int axiom_xpath_compile_union( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compile a path expression * * [19] PathExpr ::= LocationPath * | FilterExpr * | FilterExpr '/' RelativeLocationPath * | FilterExpr '//' RelativeLocationPath * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return Index of the operation in the array */ int axiom_xpath_compile_path_expression( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compile a path expression with a filter * * [19] PathExpr ::= FilterExpr * | FilterExpr '/' RelativeLocationPath * | FilterExpr '//' RelativeLocationPath * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return Index of the operation in the array */ int axiom_xpath_path_compile_path_expression_filter( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compile a filter expression * * 20] FilterExpr ::= PrimaryExpr * | FilterExpr Predicate * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return Index of the operation in the array */ int axiom_xpath_compile_filter( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compile a location path * * [1] LocationPath ::= RelativeLocationPath * | AbsoluteLocationPath * [2] AbsoluteLocationPath ::= '/' RelativeLocationPath? * | AbbreviatedAbsoluteLocationPath * * [10] AbbreviatedAbsoluteLocationPath ::= '//' RelativeLocationPath * [11] AbbreviatedRelativeLocationPath ::= RelativeLocationPath '//' Step * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return Index of the operation in the array */ int axiom_xpath_compile_location_path( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compile a relative location * * [3] RelativeLocationPath ::= Step * | RelativeLocationPath '/' Step * | AbbreviatedRelativeLocationPath * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return Index of the operation in the array */ int axiom_xpath_compile_relative_location( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compile a step * * [4] Step ::= AxisSpecifier NodeTest Predicate* * | AbbreviatedStep * [5] AxisSpecifier ::= AxisName '::' * | AbbreviatedAxisSpecifier * * [12] AbbreviatedStep ::= '.' | '..' * [13] AbbreviatedAxisSpecifier ::= '@'? * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return Index of the operation in the array */ int axiom_xpath_compile_step( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compiles an OrExpr. * * [21] OrExpr ::= AndExpr * | OrExpr 'or' AndExpr * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return Index of the operation in the array */ int axiom_xpath_compile_orexpr( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compiles an AndExpr. * * [22] AndExpr ::= EqualityExpr * | AndExpr 'and' EqualityExpr * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return Index of the operation in the array */ int axiom_xpath_compile_andexpr( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compiles a FunctionCall * * [16] FunctionCall ::= FunctionName '(' ( Argument ( ',' Argument )* )? ')' * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return Index of the operation in the array */ int axiom_xpath_compile_function_call( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compiles an Argument. * * [17] Argument ::= Expr * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return Index of the operation in the array */ int axiom_xpath_compile_argument( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compile a node test * * [7] NodeTest ::= NameTest * | NodeType '(' ')' * | 'processing-instruction' '(' Literal ')' * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return Index of the operation in the array */ axiom_xpath_node_test_t* axiom_xpath_compile_node_test( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compile a predicate(s) * * [8] Predicate ::= '[' PredicateExpr ']' * [9] PredicateExpr ::= Expr * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return Index of the operation in the array */ int axiom_xpath_compile_predicate( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compile a literal * * [29] Literal ::= '"' [^"]* '"' * | "'" [^']* "'" * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return The literal parsed */ axis2_char_t* axiom_xpath_compile_literal( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compile a number * * [30] Number ::= Digits ('.' Digits?)? * | '.' Digits * [31] Digits ::= [0-9]+ * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return The number parsed */ double* axiom_xpath_compile_number( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Compile a ncname * * @param env Environment must not be null * @param expr A pointer to the XPath expression * @return The ncname parsed */ axis2_char_t* axiom_xpath_compile_ncname( const axutil_env_t *env, axiom_xpath_expression_t* expr); /** * Get the XPath axis by axis name * * [6] AxisName ::= 'ancestor' * | 'ancestor-or-self' * | 'attribute' * | 'child' * | 'descendant' * | 'descendant-or-self' * | 'following' * | 'following-sibling' * | 'namespace' * | 'parent' * | 'preceding' * | 'preceding-sibling' * | 'self' * * @param env Environment must not be null * @param name Name of the axis * @return XPath axis; returns AXIOM_XPATH_AXIS_NONE if invalid name */ axiom_xpath_axis_t axiom_xpath_get_axis( const axutil_env_t *env, axis2_char_t* name); /** * Create a node test which matches all nodes (*) * * @param env Environment must not be null * @return Node test */ axiom_xpath_node_test_t* axiom_xpath_create_node_test_all( const axutil_env_t *env); /** * Create a node test which matches all nodes (nodes()) * * @param env Environment must not be null * @return Node test */ axiom_xpath_node_test_t* axiom_xpath_create_node_test_node( const axutil_env_t *env); /** * Create a pointer to an axis; allocate memory using the allocator * * @param env Environment must not be null * @param axis XPath axis * @return Pointer to the axis created */ axiom_xpath_axis_t *axiom_xpath_create_axis( const axutil_env_t *env, axiom_xpath_axis_t axis); /** @} */ #ifdef __cplusplus } #endif #endif