| /* 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 __AP_EXPR_PRIVATE_H__ | |
| #define __AP_EXPR_PRIVATE_H__ | |
| #include "httpd.h" | |
| #include "apr_strings.h" | |
| #include "apr_tables.h" | |
| #include "ap_expr.h" | |
| #ifndef YY_NULL | |
| #define YY_NULL 0 | |
| #endif | |
| #ifndef MIN | |
| #define MIN(a,b) (((a)<(b))?(a):(b)) | |
| #endif | |
| #if !APR_HAVE_UNISTD_H | |
| #define YY_NO_UNISTD_H | |
| #endif | |
| #ifdef _MSC_VER | |
| /* Avoid some warnings with Visual Studio (likely due to a bug in bison) */ | |
| #define YYMALLOC malloc | |
| #define YYFREE free | |
| #endif | |
| #ifndef YYDEBUG | |
| #define YYDEBUG 0 | |
| #endif | |
| /** The operations in a parse tree node */ | |
| typedef enum { | |
| op_NOP, | |
| op_True, op_False, | |
| op_Not, op_Or, op_And, | |
| op_Comp, | |
| op_EQ, op_NE, op_LT, op_LE, op_GT, op_GE, op_IN, | |
| op_REG, op_NRE, | |
| op_STR_EQ, op_STR_NE, op_STR_LT, op_STR_LE, op_STR_GT, op_STR_GE, | |
| op_Concat, | |
| op_Digit, op_String, op_Regex, op_RegexBackref, | |
| op_Var, | |
| op_ListElement, | |
| /* | |
| * call external functions/operators. | |
| * The info node contains the function pointer and some function specific | |
| * info. | |
| * For Binary operators, the Call node links to the Info node and the | |
| * Args node, which in turn links to the left and right operand. | |
| * For all other variants, the Call node links to the Info node and the | |
| * argument. | |
| */ | |
| op_UnaryOpCall, op_UnaryOpInfo, | |
| op_BinaryOpCall, op_BinaryOpInfo, op_BinaryOpArgs, | |
| op_StringFuncCall, op_StringFuncInfo, | |
| op_ListFuncCall, op_ListFuncInfo | |
| } ap_expr_node_op_e; | |
| /** The basic parse tree node */ | |
| struct ap_expr_node { | |
| ap_expr_node_op_e node_op; | |
| const void *node_arg1; | |
| const void *node_arg2; | |
| }; | |
| /** The context used by scanner and parser */ | |
| typedef struct { | |
| /* internal state of the scanner */ | |
| const char *inputbuf; | |
| int inputlen; | |
| const char *inputptr; | |
| void *scanner; | |
| char *scan_ptr; | |
| char scan_buf[MAX_STRING_LEN]; | |
| char scan_del; | |
| int at_start; | |
| /* pools for result and temporary usage */ | |
| apr_pool_t *pool; | |
| apr_pool_t *ptemp; | |
| /* The created parse tree */ | |
| ap_expr_t *expr; | |
| const char *error; | |
| const char *error2; | |
| unsigned flags; | |
| /* | |
| * The function to use to lookup provider functions for variables | |
| * and funtctions | |
| */ | |
| ap_expr_lookup_fn_t *lookup_fn; | |
| } ap_expr_parse_ctx_t; | |
| /* flex/bison functions */ | |
| int ap_expr_yyparse(ap_expr_parse_ctx_t *context); | |
| void ap_expr_yyerror(ap_expr_parse_ctx_t *context, const char *err); | |
| int ap_expr_yylex_init(void **scanner); | |
| int ap_expr_yylex_destroy(void *scanner); | |
| void ap_expr_yyset_extra(ap_expr_parse_ctx_t *context, void *scanner); | |
| /* create a parse tree node */ | |
| ap_expr_t *ap_expr_make(ap_expr_node_op_e op, const void *arg1, | |
| const void *arg2, ap_expr_parse_ctx_t *ctx); | |
| /* create parse tree node for the string-returning function 'name' */ | |
| ap_expr_t *ap_expr_str_func_make(const char *name, const ap_expr_t *arg, | |
| ap_expr_parse_ctx_t *ctx); | |
| /* create parse tree node for the list-returning function 'name' */ | |
| ap_expr_t *ap_expr_list_func_make(const char *name, const ap_expr_t *arg, | |
| ap_expr_parse_ctx_t *ctx); | |
| /* create parse tree node for the variable 'name' */ | |
| ap_expr_t *ap_expr_var_make(const char *name, ap_expr_parse_ctx_t *ctx); | |
| /* create parse tree node for the unary operator 'name' */ | |
| ap_expr_t *ap_expr_unary_op_make(const char *name, const ap_expr_t *arg, | |
| ap_expr_parse_ctx_t *ctx); | |
| /* create parse tree node for the binary operator 'name' */ | |
| ap_expr_t *ap_expr_binary_op_make(const char *name, const ap_expr_t *arg1, | |
| const ap_expr_t *arg2, | |
| ap_expr_parse_ctx_t *ctx); | |
| #endif /* __AP_EXPR_PRIVATE_H__ */ | |
| /** @} */ | |