From: Willy Tarreau Date: Mon, 14 Dec 2009 11:40:27 +0000 (+0100) Subject: [MINOR] ebtree: add functions to lookup non-null terminated strings X-Git-Tag: v1.4-dev5~61 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c9a31da73f64a846c2a2f5606dcf965d2cca06a9;p=thirdparty%2Fhaproxy.git [MINOR] ebtree: add functions to lookup non-null terminated strings Sometimes it's useful to lookup a string without terminating it with a zero. We can do that relying on ebmb_lookup() since the string in the tree contains a zero. --- diff --git a/ebtree/ebistree.c b/ebtree/ebistree.c index acaf3fa524..938caf785a 100644 --- a/ebtree/ebistree.c +++ b/ebtree/ebistree.c @@ -1,6 +1,6 @@ /* * Elastic Binary Trees - exported functions for Indirect String data nodes. - * Version 5.0 + * Version 5.1 * (C) 2002-2009 - Willy Tarreau * * This program is free software; you can redistribute it and/or modify @@ -21,6 +21,7 @@ /* Consult ebistree.h for more details about those functions */ #include "ebistree.h" +#include "ebimtree.h" /* Find the first occurence of a zero-terminated string in the tree . * It's the caller's reponsibility to use this function only on trees which @@ -31,6 +32,21 @@ REGPRM2 struct ebpt_node *ebis_lookup(struct eb_root *root, const char *x) return __ebis_lookup(root, x); } +/* Find the first occurence of a length string in the tree . + * It's the caller's reponsibility to use this function only on trees which + * only contain zero-terminated strings, and that no null character is present + * in string in the first chars. If none can be found, return NULL. + */ +REGPRM3 struct ebpt_node *ebis_lookup_len(struct eb_root *root, const char *x, unsigned int len) +{ + struct ebpt_node *node; + + node = ebim_lookup(root, x, len); + if (!node || ((const char *)node->key)[len] != 0) + return NULL; + return node; +} + /* Insert ebpt_node into subtree starting at node root . Only * new->key needs be set with the zero-terminated string key. The ebpt_node is * returned. If root->b[EB_RGHT]==1, the tree may only contain unique keys. The diff --git a/ebtree/ebistree.h b/ebtree/ebistree.h index 984df2e647..62f42c6fdc 100644 --- a/ebtree/ebistree.h +++ b/ebtree/ebistree.h @@ -1,6 +1,6 @@ /* * Elastic Binary Trees - macros to manipulate Indirect String data nodes. - * Version 5.0 + * Version 5.1 * (C) 2002-2009 - Willy Tarreau * * This program is free software; you can redistribute it and/or modify @@ -32,6 +32,7 @@ * in ebistree.c, which simply relies on their inline version. */ REGPRM2 struct ebpt_node *ebis_lookup(struct eb_root *root, const char *x); +REGPRM3 struct ebpt_node *ebis_lookup_len(struct eb_root *root, const char *x, unsigned int len); REGPRM2 struct ebpt_node *ebis_insert(struct eb_root *root, struct ebpt_node *new); /* Find the first occurence of a zero-terminated string in the tree . diff --git a/ebtree/ebsttree.c b/ebtree/ebsttree.c index 8b666bc55a..b00ad69b97 100644 --- a/ebtree/ebsttree.c +++ b/ebtree/ebsttree.c @@ -1,6 +1,6 @@ /* * Elastic Binary Trees - exported functions for String data nodes. - * Version 5.0 + * Version 5.1 * (C) 2002-2009 - Willy Tarreau * * This program is free software; you can redistribute it and/or modify @@ -31,6 +31,21 @@ REGPRM2 struct ebmb_node *ebst_lookup(struct eb_root *root, const char *x) return __ebst_lookup(root, x); } +/* Find the first occurence of a length string in the tree . + * It's the caller's reponsibility to use this function only on trees which + * only contain zero-terminated strings, and that no null character is present + * in string in the first chars. If none can be found, return NULL. + */ +REGPRM3 struct ebmb_node *ebst_lookup_len(struct eb_root *root, const char *x, unsigned int len) +{ + struct ebmb_node *node; + + node = ebmb_lookup(root, x, len); + if (!node || node->key[len] != 0) + return NULL; + return node; +} + /* Insert ebmb_node into subtree starting at node root . Only * new->key needs be set with the zero-terminated string key. The ebmb_node is * returned. If root->b[EB_RGHT]==1, the tree may only contain unique keys. The diff --git a/ebtree/ebsttree.h b/ebtree/ebsttree.h index 87e0306e0d..6fa6412f2d 100644 --- a/ebtree/ebsttree.h +++ b/ebtree/ebsttree.h @@ -1,6 +1,6 @@ /* * Elastic Binary Trees - macros to manipulate String data nodes. - * Version 5.0 + * Version 5.1 * (C) 2002-2009 - Willy Tarreau * * This program is free software; you can redistribute it and/or modify @@ -30,6 +30,7 @@ * in ebsttree.c, which simply relies on their inline version. */ REGPRM2 struct ebmb_node *ebst_lookup(struct eb_root *root, const char *x); +REGPRM3 struct ebmb_node *ebst_lookup_len(struct eb_root *root, const char *x, unsigned int len); REGPRM2 struct ebmb_node *ebst_insert(struct eb_root *root, struct ebmb_node *new); /* Find the first occurence of a zero-terminated string in the tree .