| #ifndef PARSE_TREE_H |
| #define PARSE_TREE_H 1 |
| /* |
| * 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. |
| */ |
| |
| #include <stdbool.h> |
| #include <qpid/dispatch/error.h> |
| #include <qpid/dispatch/iterator.h> |
| |
| |
| typedef struct qd_parse_tree qd_parse_tree_t; |
| |
| // Pattern matching algorithms |
| // ADDRESS - configured address prefix/pattern matching |
| // token separators: '.' or '/' |
| // match exactly one: '*' |
| // match zero or more: '#' |
| // AMQP_0_10 - compliant with old 0-10 draft Topic exchanges |
| // token separators: '.' |
| // match exactly one: '*' |
| // match zero or more: '#' |
| // MQTT - compliant with MQTT wildcard topic filters |
| // token separators: '/' |
| // match exactly one: '+' |
| // match zero or more: '#' |
| // Note: '#' only permitted at end of pattern |
| // |
| typedef enum { |
| QD_PARSE_TREE_ADDRESS, |
| QD_PARSE_TREE_AMQP_0_10, |
| QD_PARSE_TREE_MQTT |
| } qd_parse_tree_type_t; |
| |
| qd_parse_tree_t *qd_parse_tree_new(qd_parse_tree_type_t type); |
| void qd_parse_tree_free(qd_parse_tree_t *tree); |
| qd_parse_tree_type_t qd_parse_tree_type(const qd_parse_tree_t *tree); |
| const char *qd_parse_address_token_sep(); |
| |
| // verify the pattern is in a legal format for the given tree's match algorithm |
| bool qd_parse_tree_validate_pattern(const qd_parse_tree_t *tree, |
| const qd_iterator_t *pattern); |
| |
| // Inserts payload in tree using pattern as the lookup key |
| // |
| // @param node root of parse tree |
| // @param pattern match pattern (copied) |
| // @param payload stored in tree (referenced) |
| // @return QD_ERROR_NONE (0) on success else qd_error_t code |
| // |
| qd_error_t qd_parse_tree_add_pattern(qd_parse_tree_t *node, |
| const qd_iterator_t *pattern, |
| void *payload); |
| |
| // returns old payload or NULL if not present |
| // |
| // @param node root of parse tree |
| // @param pattern match pattern of payload to remove |
| // |
| void *qd_parse_tree_remove_pattern(qd_parse_tree_t *node, |
| const qd_iterator_t *pattern); |
| |
| // retrieves the payload pointer |
| // returns true if pattern found and sets *payload |
| // |
| bool qd_parse_tree_get_pattern(qd_parse_tree_t *tree, |
| const qd_iterator_t *pattern, |
| void **payload); |
| |
| // find the 'best' match to 'value', using the following precedence (highest |
| // first): |
| // |
| // 1) exact token match |
| // 2) "match exactly one" wildcard match |
| // 3) "match zero or more" wildcard match |
| // |
| // example: |
| // given the following AMQP 0-10 topic patterns: |
| // 1) 'a.b.c' |
| // 2) 'a.b.*' |
| // 3)'a.b.#' |
| // |
| // 'a.b.c' will match 1 |
| // 'a.b.x' will match 2 |
| // 'a.b' and 'a.b.c.x' will match 3 |
| // |
| // returns true on match and sets *payload |
| bool qd_parse_tree_retrieve_match(qd_parse_tree_t *tree, |
| const qd_iterator_t *value, |
| void **payload); |
| |
| // parse tree traversal |
| |
| // return false to stop tree transversal |
| typedef bool qd_parse_tree_visit_t(void *handle, |
| const char *pattern, |
| void *payload); |
| |
| // visit each matching pattern that matches value in the order based on the |
| // above precedence rules |
| void qd_parse_tree_search(qd_parse_tree_t *tree, const qd_iterator_t *value, |
| qd_parse_tree_visit_t *callback, void *handle); |
| |
| // visit each terminal node on the tree, returns last value returned by callback |
| bool qd_parse_tree_walk(qd_parse_tree_t *tree, qd_parse_tree_visit_t *callback, void *handle); |
| |
| // |
| // parse tree functions using string interface |
| // |
| |
| // Inserts payload in tree using pattern as the lookup key |
| // |
| // @param node root of parse tree |
| // @param pattern match pattern (copied) |
| // @param payload stored in tree (referenced) |
| // @return QD_ERROR_NONE (0) on success else qd_error_t code |
| // |
| qd_error_t qd_parse_tree_add_pattern_str(qd_parse_tree_t *node, |
| const char *pattern, |
| void *payload); |
| |
| // returns true on match and sets *payload |
| bool qd_parse_tree_retrieve_match_str(qd_parse_tree_t *tree, |
| const char *value, |
| void **payload); |
| |
| // returns old payload or NULL if not present |
| void *qd_parse_tree_remove_pattern_str(qd_parse_tree_t *node, |
| const char *pattern); |
| #endif /* parse_tree.h */ |