blob: 7d1a2d0153fb28bd5b1842af7a2a9c7e5e269f9a [file] [log] [blame]
/*
* 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