Move irc_* data structures to librb.

This makes the base ircd less cluttered up with data structures that can
go elsewhere.
This commit is contained in:
Elizabeth Myers 2016-03-06 14:17:19 -06:00
parent eddf454cd3
commit a4bf26dd34
31 changed files with 809 additions and 786 deletions

View file

@ -43,7 +43,7 @@
#include "hash.h" #include "hash.h"
#include "modules.h" #include "modules.h"
#include "messages.h" #include "messages.h"
#include "irc_radixtree.h" #include "rb_radixtree.h"
static int mo_sendbans(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]); static int mo_sendbans(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]);
@ -90,7 +90,7 @@ static int mo_sendbans(struct MsgBuf *msgbuf_p, struct Client *client_p, struct
int i, count; int i, count;
const char *target, *mask2; const char *target, *mask2;
struct Client *server_p; struct Client *server_p;
struct irc_radixtree_iteration_state state; struct rb_radixtree_iteration_state state;
if (!IsOperRemoteBan(source_p)) if (!IsOperRemoteBan(source_p))
{ {
@ -144,7 +144,7 @@ static int mo_sendbans(struct MsgBuf *msgbuf_p, struct Client *client_p, struct
target, aconf->host, aconf->passwd); target, aconf->host, aconf->passwd);
} }
IRC_RADIXTREE_FOREACH(aconf, &state, resv_tree) RB_RADIXTREE_FOREACH(aconf, &state, resv_tree)
{ {
if (aconf->hold) if (aconf->hold)
continue; continue;

View file

@ -26,11 +26,11 @@
#define INCLUDED_hash_h #define INCLUDED_hash_h
struct Dictionary; struct Dictionary;
struct irc_radixtree; struct rb_radixtree;
extern struct Dictionary *nd_dict; extern struct Dictionary *nd_dict;
extern struct irc_radixtree *resv_tree; extern struct rb_radixtree *resv_tree;
extern struct irc_radixtree *channel_tree; extern struct rb_radixtree *channel_tree;
/* Magic value for FNV hash functions */ /* Magic value for FNV hash functions */
#define FNV1_32_INIT 0x811c9dc5UL #define FNV1_32_INIT 0x811c9dc5UL

View file

@ -1,170 +0,0 @@
/*
* charybdis: an advanced ircd.
* irc_dictionary.h: Dictionary-based storage.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
* Copyright (c) 2007 Jilles Tjoelker <jilles -at- stack.nl>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice is present in all copies.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __IRC_DICTIONARY_H__
#define __IRC_DICTIONARY_H__
struct Dictionary; /* defined in src/dictionary.c */
typedef int (*DCF)(/* const void *a, const void *b */);
struct DictionaryElement
{
struct DictionaryElement *left, *right, *prev, *next;
void *data;
const void *key;
int position;
};
struct DictionaryIter
{
struct DictionaryElement *cur, *next;
};
/*
* this is a convenience macro for inlining iteration of dictionaries.
*/
#define DICTIONARY_FOREACH(element, state, dict) for (irc_dictionary_foreach_start((dict), (state)); (element = irc_dictionary_foreach_cur((dict), (state))); irc_dictionary_foreach_next((dict), (state)))
/*
* irc_dictionary_create_named() creates a new dictionary tree which has a name.
* name is the name, compare_cb is the comparator.
*/
extern struct Dictionary *irc_dictionary_create(const char *name, DCF compare_cb);
/*
* irc_dictionary_set_comparator_func() resets the comparator used for lookups and
* insertions in the DTree structure.
*/
extern void irc_dictionary_set_comparator_func(struct Dictionary *dict,
DCF compare_cb);
/*
* irc_dictionary_get_comparator_func() returns the comparator used for lookups and
* insertions in the DTree structure.
*/
extern DCF irc_dictionary_get_comparator_func(struct Dictionary *dict);
/*
* irc_dictionary_get_linear_index() returns the linear index of an object in the
* DTree structure.
*/
extern int irc_dictionary_get_linear_index(struct Dictionary *dict, const void *key);
/*
* irc_dictionary_destroy() destroys all entries in a dtree, and also optionally calls
* a defined callback function to destroy any data attached to it.
*/
extern void irc_dictionary_destroy(struct Dictionary *dtree,
void (*destroy_cb)(struct DictionaryElement *delem, void *privdata),
void *privdata);
/*
* irc_dictionary_foreach() iterates all entries in a dtree, and also optionally calls
* a defined callback function to use any data attached to it.
*
* To shortcircuit iteration, return non-zero from the callback function.
*/
extern void irc_dictionary_foreach(struct Dictionary *dtree,
int (*foreach_cb)(struct DictionaryElement *delem, void *privdata),
void *privdata);
/*
* irc_dictionary_search() iterates all entries in a dtree, and also optionally calls
* a defined callback function to use any data attached to it.
*
* When the object is found, a non-NULL is returned from the callback, which results
* in that object being returned to the user.
*/
extern void *irc_dictionary_search(struct Dictionary *dtree,
void *(*foreach_cb)(struct DictionaryElement *delem, void *privdata),
void *privdata);
/*
* irc_dictionary_foreach_start() begins an iteration over all items
* keeping state in the given struct. If there is only one iteration
* in progress at a time, it is permitted to remove the current element
* of the iteration (but not any other element).
*/
extern void irc_dictionary_foreach_start(struct Dictionary *dtree,
struct DictionaryIter *state);
/*
* irc_dictionary_foreach_cur() returns the current element of the iteration,
* or NULL if there are no more elements.
*/
extern void *irc_dictionary_foreach_cur(struct Dictionary *dtree,
struct DictionaryIter *state);
/*
* irc_dictionary_foreach_next() moves to the next element.
*/
extern void irc_dictionary_foreach_next(struct Dictionary *dtree,
struct DictionaryIter *state);
/*
* irc_dictionary_add() adds a key->value entry to the dictionary tree.
*/
extern struct DictionaryElement *irc_dictionary_add(struct Dictionary *dtree, const void *key, void *data);
/*
* irc_dictionary_find() returns a struct DictionaryElement container from a dtree for key 'key'.
*/
extern struct DictionaryElement *irc_dictionary_find(struct Dictionary *dtree, const void *key);
/*
* irc_dictionary_find() returns data from a dtree for key 'key'.
*/
extern void *irc_dictionary_retrieve(struct Dictionary *dtree, const void *key);
/*
* irc_dictionary_delete() deletes a key->value entry from the dictionary tree.
*/
extern void *irc_dictionary_delete(struct Dictionary *dtree, const void *key);
/*
* irc_dictionary_size() returns the number of elements in a dictionary tree.
*/
extern unsigned int irc_dictionary_size(struct Dictionary *dtree);
void irc_dictionary_stats(struct Dictionary *dict, void (*cb)(const char *line, void *privdata), void *privdata);
void irc_dictionary_stats_walk(void (*cb)(const char *line, void *privdata), void *privdata);
#define IRC_POINTER_TO_INT(x) ((int32_t) (long) (x))
#define IRC_INT_TO_POINTER(x) ((void *) (long) (int32_t) (x))
#define IRC_POINTER_TO_UINT(x) ((uint32_t) (unsigned long) (x))
#define IRC_UINT_TO_POINTER(x) ((void *) (unsigned long) (uint32_t) (x))
static inline int irc_int32cmp(const void *a, const void *b)
{
return IRC_POINTER_TO_INT(b) - IRC_POINTER_TO_INT(a);
}
static inline int irc_uint32cmp(const void *a, const void *b)
{
return IRC_POINTER_TO_UINT(b) - IRC_POINTER_TO_UINT(a);
}
#endif

View file

@ -1,156 +0,0 @@
/*
* charybdis: an advanced ircd.
* irc_radixtree.h: Dictionary-based storage.
*
* Copyright (c) 2007-2016 William Pitcock <nenolod -at- dereferenced.org>
* Copyright (c) 2007-2016 Jilles Tjoelker <jilles -at- stack.nl>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __irc_radixtree_H__
#define __irc_radixtree_H__
struct irc_radixtree;/* defined in ircd/irc_radixtree.c */
struct irc_radixtree_leaf; /* defined in ircd/irc_radixtree.c */
/*
* struct irc_radixtree_iteration_state, private.
*/
struct irc_radixtree_iteration_state
{
struct irc_radixtree_leaf *cur, *next;
void *pspare[4];
int ispare[4];
};
/*
* this is a convenience macro for inlining iteration of dictionaries.
*/
#define IRC_RADIXTREE_FOREACH(element, state, dict) \
for (irc_radixtree_foreach_start((dict), (state)); (element = irc_radixtree_foreach_cur((dict), (state))); irc_radixtree_foreach_next((dict), (state)))
#define IRC_RADIXTREE_FOREACH_FROM(element, state, dict, key) \
for (irc_radixtree_foreach_start_from((dict), (state), (key)); (element = irc_radixtree_foreach_cur((dict), (state))); irc_radixtree_foreach_next((dict), (state)))
/*
* irc_radixtree_create() creates a new patricia tree of the defined resolution.
* compare_cb is the canonizing function.
*/
extern struct irc_radixtree *irc_radixtree_create(const char *name, void (*canonize_cb)(char *key));
/*
* irc_radixtree_shutdown() deallocates all heaps used in patricia trees. This is
* useful on embedded devices with little memory, and/or when you know you won't need
* any more patricia trees.
*/
extern void irc_radixtree_shutdown(void);
/*
* irc_radixtree_destroy() destroys all entries in a dtree, and also optionally calls
* a defined callback function to destroy any data attached to it.
*/
extern void irc_radixtree_destroy(struct irc_radixtree *dtree, void (*destroy_cb)(const char *key, void *data, void *privdata), void *privdata);
/*
* irc_radixtree_foreach() iterates all entries in a dtree, and also optionally calls
* a defined callback function to use any data attached to it.
*
* To shortcircuit iteration, return non-zero from the callback function.
*/
extern void irc_radixtree_foreach(struct irc_radixtree *dtree, int (*foreach_cb)(const char *key, void *data, void *privdata), void *privdata);
/*
* irc_radixtree_search() iterates all entries in a dtree, and also optionally calls
* a defined callback function to use any data attached to it.
*
* When the object is found, a non-NULL is returned from the callback, which results
* in that object being returned to the user.
*/
extern void *irc_radixtree_search(struct irc_radixtree *dtree, void *(*foreach_cb)(const char *key, void *data, void *privdata), void *privdata);
/*
* irc_radixtree_foreach_start() begins an iteration over all items
* keeping state in the given struct. If there is only one iteration
* in progress at a time, it is permitted to remove the current element
* of the iteration (but not any other element).
*/
extern void irc_radixtree_foreach_start(struct irc_radixtree *dtree, struct irc_radixtree_iteration_state *state);
/*
* irc_radixtree_foreach_start_from() begins an iteration over all items,
* starting with the item specified by `key`. If there is only one iteration
* in progress at a time, it is permitted to remove the current element
* of the iteration (but not any other element).
* Use NULL as a key to have it start at the beginning.
*/
extern void irc_radixtree_foreach_start_from(struct irc_radixtree *dtree, struct irc_radixtree_iteration_state *state, const char *key);
/*
* irc_radixtree_foreach_cur() returns the current element of the iteration,
* or NULL if there are no more elements.
*/
extern void *irc_radixtree_foreach_cur(struct irc_radixtree *dtree, struct irc_radixtree_iteration_state *state);
/*
* irc_radixtree_foreach_next() moves to the next element.
*/
extern void irc_radixtree_foreach_next(struct irc_radixtree *dtree, struct irc_radixtree_iteration_state *state);
/*
* irc_radixtree_add() adds a key->value entry to the patricia tree.
*/
extern int irc_radixtree_add(struct irc_radixtree *dtree, const char *key, void *data);
/*
* irc_radixtree_find() returns data from a dtree for key 'key'.
*/
extern void *irc_radixtree_retrieve(struct irc_radixtree *dtree, const char *key);
/*
* irc_radixtree_delete() deletes a key->value entry from the patricia tree.
*/
extern void *irc_radixtree_delete(struct irc_radixtree *dtree, const char *key);
/* Low-level functions */
struct irc_radixtree_leaf *irc_radixtree_elem_add(struct irc_radixtree *dtree, const char *key, void *data);
struct irc_radixtree_leaf *irc_radixtree_elem_find(struct irc_radixtree *dtree, const char *key, int fuzzy);
void irc_radixtree_elem_delete(struct irc_radixtree *dtree, struct irc_radixtree_leaf *elem);
const char *irc_radixtree_elem_get_key(struct irc_radixtree_leaf *elem);
void irc_radixtree_elem_set_data(struct irc_radixtree_leaf *elem, void *data);
void *irc_radixtree_elem_get_data(struct irc_radixtree_leaf *elem);
unsigned int irc_radixtree_size(struct irc_radixtree *dict);
void irc_radixtree_stats(struct irc_radixtree *dict, void (*cb)(const char *line, void *privdata), void *privdata);
void irc_radixtree_stats_walk(void (*cb)(const char *line, void *privdata), void *privdata);
void irc_radixtree_strcasecanon(char *key);
void irc_radixtree_irccasecanon(char *key);
#endif

View file

@ -1,6 +1,6 @@
/* /*
* ircd-ratbox: A slightly useful ircd. * ircd-ratbox: A slightly useful ircd.
* irc_string.h: A header for the ircd string functions. * match.h: A header for the ircd string functions.
* *
* Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center * Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center
* Copyright (C) 1996-2002 Hybrid Development Team * Copyright (C) 1996-2002 Hybrid Development Team
@ -137,4 +137,26 @@ extern const unsigned int CharAttrs[];
#define IsNonEOS(c) (CharAttrs[(unsigned char)(c)] & NONEOS_C) #define IsNonEOS(c) (CharAttrs[(unsigned char)(c)] & NONEOS_C)
#define IsEol(c) (CharAttrs[(unsigned char)(c)] & EOL_C) #define IsEol(c) (CharAttrs[(unsigned char)(c)] & EOL_C)
/* Below are used for radix trees and the like */
static inline void irccasecanon(char *str)
{
while (*str)
{
*str = ToUpper(*str);
str++;
}
return;
}
static inline void strcasecanon(char *str)
{
while (*str)
{
*str = toupper((unsigned char)*str);
str++;
}
return;
}
#endif /* INCLUDED_match_h */ #endif /* INCLUDED_match_h */

View file

@ -25,7 +25,7 @@
#ifndef INCLUDED_parse_h_h #ifndef INCLUDED_parse_h_h
#define INCLUDED_parse_h_h #define INCLUDED_parse_h_h
#include "irc_dictionary.h" #include "rb_dictionary.h"
struct Message; struct Message;
struct Client; struct Client;

View file

@ -31,8 +31,6 @@ libircd_la_SOURCES = \
hook.c \ hook.c \
hostmask.c \ hostmask.c \
ipv4_from_ipv6.c \ ipv4_from_ipv6.c \
irc_radixtree.c \
irc_dictionary.c \
ircd.c \ ircd.c \
ircd_parser.y \ ircd_parser.y \
ircd_lexer.l \ ircd_lexer.l \

View file

@ -37,7 +37,7 @@
#include "client.h" #include "client.h"
#include "hash.h" #include "hash.h"
#include "cache.h" #include "cache.h"
#include "irc_dictionary.h" #include "rb_dictionary.h"
#include "numeric.h" #include "numeric.h"
#include "send.h" #include "send.h"
@ -69,8 +69,8 @@ init_cache(void)
oper_motd = cache_file(OPATH, "opers.motd", 0); oper_motd = cache_file(OPATH, "opers.motd", 0);
memset(&links_cache_list, 0, sizeof(links_cache_list)); memset(&links_cache_list, 0, sizeof(links_cache_list));
help_dict_oper = irc_dictionary_create("oper help", strcasecmp); help_dict_oper = rb_dictionary_create("oper help", strcasecmp);
help_dict_user = irc_dictionary_create("user help", strcasecmp); help_dict_user = rb_dictionary_create("user help", strcasecmp);
} }
/* /*
@ -245,12 +245,12 @@ load_help(void)
DICTIONARY_FOREACH(cacheptr, &iter, help_dict_oper) DICTIONARY_FOREACH(cacheptr, &iter, help_dict_oper)
{ {
irc_dictionary_delete(help_dict_oper, cacheptr->name); rb_dictionary_delete(help_dict_oper, cacheptr->name);
free_cachefile(cacheptr); free_cachefile(cacheptr);
} }
DICTIONARY_FOREACH(cacheptr, &iter, help_dict_user) DICTIONARY_FOREACH(cacheptr, &iter, help_dict_user)
{ {
irc_dictionary_delete(help_dict_user, cacheptr->name); rb_dictionary_delete(help_dict_user, cacheptr->name);
free_cachefile(cacheptr); free_cachefile(cacheptr);
} }
@ -265,7 +265,7 @@ load_help(void)
continue; continue;
snprintf(filename, sizeof(filename), "%s/%s", HPATH, ldirent->d_name); snprintf(filename, sizeof(filename), "%s/%s", HPATH, ldirent->d_name);
cacheptr = cache_file(filename, ldirent->d_name, HELP_OPER); cacheptr = cache_file(filename, ldirent->d_name, HELP_OPER);
irc_dictionary_add(help_dict_oper, cacheptr->name, cacheptr); rb_dictionary_add(help_dict_oper, cacheptr->name, cacheptr);
} }
closedir(helpfile_dir); closedir(helpfile_dir);
@ -289,7 +289,7 @@ load_help(void)
*/ */
if(S_ISLNK(sb.st_mode)) if(S_ISLNK(sb.st_mode))
{ {
cacheptr = irc_dictionary_retrieve(help_dict_oper, ldirent->d_name); cacheptr = rb_dictionary_retrieve(help_dict_oper, ldirent->d_name);
if(cacheptr != NULL) if(cacheptr != NULL)
{ {
@ -300,7 +300,7 @@ load_help(void)
#endif #endif
cacheptr = cache_file(filename, ldirent->d_name, HELP_USER); cacheptr = cache_file(filename, ldirent->d_name, HELP_USER);
irc_dictionary_add(help_dict_user, cacheptr->name, cacheptr); rb_dictionary_add(help_dict_user, cacheptr->name, cacheptr);
} }
closedir(helpfile_dir); closedir(helpfile_dir);

View file

@ -20,7 +20,7 @@
#include "stdinc.h" #include "stdinc.h"
#include "capability.h" #include "capability.h"
#include "irc_dictionary.h" #include "rb_dictionary.h"
#include "s_assert.h" #include "s_assert.h"
static rb_dlink_list capability_indexes = { NULL, NULL, 0 }; static rb_dlink_list capability_indexes = { NULL, NULL, 0 };
@ -32,7 +32,7 @@ capability_find(struct CapabilityIndex *idx, const char *cap)
if (cap == NULL) if (cap == NULL)
return NULL; return NULL;
return irc_dictionary_retrieve(idx->cap_dict, cap); return rb_dictionary_retrieve(idx->cap_dict, cap);
} }
unsigned int unsigned int
@ -44,7 +44,7 @@ capability_get(struct CapabilityIndex *idx, const char *cap, void **ownerdata)
if (cap == NULL) if (cap == NULL)
return 0; return 0;
entry = irc_dictionary_retrieve(idx->cap_dict, cap); entry = rb_dictionary_retrieve(idx->cap_dict, cap);
if (entry != NULL && !(entry->flags & CAP_ORPHANED)) if (entry != NULL && !(entry->flags & CAP_ORPHANED))
{ {
if (ownerdata != NULL) if (ownerdata != NULL)
@ -64,7 +64,7 @@ capability_put(struct CapabilityIndex *idx, const char *cap, void *ownerdata)
if (!idx->highest_bit) if (!idx->highest_bit)
return 0xFFFFFFFF; return 0xFFFFFFFF;
if ((entry = irc_dictionary_retrieve(idx->cap_dict, cap)) != NULL) if ((entry = rb_dictionary_retrieve(idx->cap_dict, cap)) != NULL)
{ {
entry->flags &= ~CAP_ORPHANED; entry->flags &= ~CAP_ORPHANED;
return (1 << entry->value); return (1 << entry->value);
@ -76,7 +76,7 @@ capability_put(struct CapabilityIndex *idx, const char *cap, void *ownerdata)
entry->value = idx->highest_bit; entry->value = idx->highest_bit;
entry->ownerdata = ownerdata; entry->ownerdata = ownerdata;
irc_dictionary_add(idx->cap_dict, entry->cap, entry); rb_dictionary_add(idx->cap_dict, entry->cap, entry);
idx->highest_bit++; idx->highest_bit++;
if (idx->highest_bit % (sizeof(unsigned int) * 8) == 0) if (idx->highest_bit % (sizeof(unsigned int) * 8) == 0)
@ -107,7 +107,7 @@ capability_orphan(struct CapabilityIndex *idx, const char *cap)
s_assert(idx != NULL); s_assert(idx != NULL);
entry = irc_dictionary_retrieve(idx->cap_dict, cap); entry = rb_dictionary_retrieve(idx->cap_dict, cap);
if (entry != NULL) if (entry != NULL)
{ {
entry->flags &= ~CAP_REQUIRED; entry->flags &= ~CAP_REQUIRED;
@ -123,7 +123,7 @@ capability_require(struct CapabilityIndex *idx, const char *cap)
s_assert(idx != NULL); s_assert(idx != NULL);
entry = irc_dictionary_retrieve(idx->cap_dict, cap); entry = rb_dictionary_retrieve(idx->cap_dict, cap);
if (entry != NULL) if (entry != NULL)
entry->flags |= CAP_REQUIRED; entry->flags |= CAP_REQUIRED;
} }
@ -143,7 +143,7 @@ capability_index_create(const char *name)
idx = rb_malloc(sizeof(struct CapabilityIndex)); idx = rb_malloc(sizeof(struct CapabilityIndex));
idx->name = name; idx->name = name;
idx->cap_dict = irc_dictionary_create(name, strcasecmp); idx->cap_dict = rb_dictionary_create(name, strcasecmp);
idx->highest_bit = 1; idx->highest_bit = 1;
rb_dlinkAdd(idx, &idx->node, &capability_indexes); rb_dlinkAdd(idx, &idx->node, &capability_indexes);
@ -158,7 +158,7 @@ capability_index_destroy(struct CapabilityIndex *idx)
rb_dlinkDelete(&idx->node, &capability_indexes); rb_dlinkDelete(&idx->node, &capability_indexes);
irc_dictionary_destroy(idx->cap_dict, capability_destroy, NULL); rb_dictionary_destroy(idx->cap_dict, capability_destroy, NULL);
rb_free(idx); rb_free(idx);
} }

View file

@ -51,7 +51,7 @@
#include "blacklist.h" #include "blacklist.h"
#include "reject.h" #include "reject.h"
#include "scache.h" #include "scache.h"
#include "irc_dictionary.h" #include "rb_dictionary.h"
#include "sslproc.h" #include "sslproc.h"
#include "s_assert.h" #include "s_assert.h"
@ -127,7 +127,7 @@ init_client(void)
rb_event_addish("exit_aborted_clients", exit_aborted_clients, NULL, 1); rb_event_addish("exit_aborted_clients", exit_aborted_clients, NULL, 1);
rb_event_add("flood_recalc", flood_recalc, NULL, 1); rb_event_add("flood_recalc", flood_recalc, NULL, 1);
nd_dict = irc_dictionary_create("nickdelay", irccmp); nd_dict = rb_dictionary_create("nickdelay", irccmp);
} }

View file

@ -37,17 +37,17 @@
#include "cache.h" #include "cache.h"
#include "s_newconf.h" #include "s_newconf.h"
#include "s_assert.h" #include "s_assert.h"
#include "irc_dictionary.h" #include "rb_dictionary.h"
#include "irc_radixtree.h" #include "rb_radixtree.h"
struct Dictionary *client_connid_tree = NULL; struct Dictionary *client_connid_tree = NULL;
struct Dictionary *client_zconnid_tree = NULL; struct Dictionary *client_zconnid_tree = NULL;
struct irc_radixtree *client_id_tree = NULL; struct rb_radixtree *client_id_tree = NULL;
struct irc_radixtree *client_name_tree = NULL; struct rb_radixtree *client_name_tree = NULL;
struct irc_radixtree *channel_tree = NULL; struct rb_radixtree *channel_tree = NULL;
struct irc_radixtree *resv_tree = NULL; struct rb_radixtree *resv_tree = NULL;
struct irc_radixtree *hostname_tree = NULL; struct rb_radixtree *hostname_tree = NULL;
/* /*
* look in whowas.c for the missing ...[WW_MAX]; entry * look in whowas.c for the missing ...[WW_MAX]; entry
@ -60,15 +60,15 @@ struct irc_radixtree *hostname_tree = NULL;
void void
init_hash(void) init_hash(void)
{ {
client_connid_tree = irc_dictionary_create("client connid", irc_uint32cmp); client_connid_tree = rb_dictionary_create("client connid", rb_uint32cmp);
client_zconnid_tree = irc_dictionary_create("client zconnid", irc_uint32cmp); client_zconnid_tree = rb_dictionary_create("client zconnid", rb_uint32cmp);
client_id_tree = irc_radixtree_create("client id", NULL); client_id_tree = rb_radixtree_create("client id", NULL);
client_name_tree = irc_radixtree_create("client name", irc_radixtree_irccasecanon); client_name_tree = rb_radixtree_create("client name", irccasecanon);
channel_tree = irc_radixtree_create("channel", irc_radixtree_irccasecanon); channel_tree = rb_radixtree_create("channel", irccasecanon);
resv_tree = irc_radixtree_create("resv", irc_radixtree_irccasecanon); resv_tree = rb_radixtree_create("resv", irccasecanon);
hostname_tree = irc_radixtree_create("hostname", irc_radixtree_irccasecanon); hostname_tree = rb_radixtree_create("hostname", irccasecanon);
} }
u_int32_t u_int32_t
@ -141,7 +141,7 @@ add_to_id_hash(const char *name, struct Client *client_p)
if(EmptyString(name) || (client_p == NULL)) if(EmptyString(name) || (client_p == NULL))
return; return;
irc_radixtree_add(client_id_tree, name, client_p); rb_radixtree_add(client_id_tree, name, client_p);
} }
/* add_to_client_hash() /* add_to_client_hash()
@ -156,7 +156,7 @@ add_to_client_hash(const char *name, struct Client *client_p)
if(EmptyString(name) || (client_p == NULL)) if(EmptyString(name) || (client_p == NULL))
return; return;
irc_radixtree_add(client_name_tree, name, client_p); rb_radixtree_add(client_name_tree, name, client_p);
} }
/* add_to_hostname_hash() /* add_to_hostname_hash()
@ -173,7 +173,7 @@ add_to_hostname_hash(const char *hostname, struct Client *client_p)
if(EmptyString(hostname) || (client_p == NULL)) if(EmptyString(hostname) || (client_p == NULL))
return; return;
list = irc_radixtree_retrieve(hostname_tree, hostname); list = rb_radixtree_retrieve(hostname_tree, hostname);
if (list != NULL) if (list != NULL)
{ {
rb_dlinkAddAlloc(client_p, list); rb_dlinkAddAlloc(client_p, list);
@ -181,7 +181,7 @@ add_to_hostname_hash(const char *hostname, struct Client *client_p)
} }
list = rb_malloc(sizeof(*list)); list = rb_malloc(sizeof(*list));
irc_radixtree_add(hostname_tree, hostname, list); rb_radixtree_add(hostname_tree, hostname, list);
rb_dlinkAddAlloc(client_p, list); rb_dlinkAddAlloc(client_p, list);
} }
@ -197,7 +197,7 @@ add_to_resv_hash(const char *name, struct ConfItem *aconf)
if(EmptyString(name) || aconf == NULL) if(EmptyString(name) || aconf == NULL)
return; return;
irc_radixtree_add(resv_tree, name, aconf); rb_radixtree_add(resv_tree, name, aconf);
} }
/* del_from_id_hash() /* del_from_id_hash()
@ -212,7 +212,7 @@ del_from_id_hash(const char *id, struct Client *client_p)
if(EmptyString(id) || client_p == NULL) if(EmptyString(id) || client_p == NULL)
return; return;
irc_radixtree_delete(client_id_tree, id); rb_radixtree_delete(client_id_tree, id);
} }
/* del_from_client_hash() /* del_from_client_hash()
@ -228,7 +228,7 @@ del_from_client_hash(const char *name, struct Client *client_p)
if(EmptyString(name) || client_p == NULL) if(EmptyString(name) || client_p == NULL)
return; return;
irc_radixtree_delete(client_name_tree, name); rb_radixtree_delete(client_name_tree, name);
} }
/* del_from_channel_hash() /* del_from_channel_hash()
@ -244,7 +244,7 @@ del_from_channel_hash(const char *name, struct Channel *chptr)
if(EmptyString(name) || chptr == NULL) if(EmptyString(name) || chptr == NULL)
return; return;
irc_radixtree_delete(channel_tree, name); rb_radixtree_delete(channel_tree, name);
} }
/* del_from_hostname_hash() /* del_from_hostname_hash()
@ -259,7 +259,7 @@ del_from_hostname_hash(const char *hostname, struct Client *client_p)
if(hostname == NULL || client_p == NULL) if(hostname == NULL || client_p == NULL)
return; return;
list = irc_radixtree_retrieve(hostname_tree, hostname); list = rb_radixtree_retrieve(hostname_tree, hostname);
if (list == NULL) if (list == NULL)
return; return;
@ -267,7 +267,7 @@ del_from_hostname_hash(const char *hostname, struct Client *client_p)
if (rb_dlink_list_length(list) == 0) if (rb_dlink_list_length(list) == 0)
{ {
irc_radixtree_delete(hostname_tree, hostname); rb_radixtree_delete(hostname_tree, hostname);
rb_free(list); rb_free(list);
} }
} }
@ -284,7 +284,7 @@ del_from_resv_hash(const char *name, struct ConfItem *aconf)
if(EmptyString(name) || aconf == NULL) if(EmptyString(name) || aconf == NULL)
return; return;
irc_radixtree_delete(resv_tree, name); rb_radixtree_delete(resv_tree, name);
} }
/* find_id() /* find_id()
@ -297,7 +297,7 @@ find_id(const char *name)
if(EmptyString(name)) if(EmptyString(name))
return NULL; return NULL;
return irc_radixtree_retrieve(client_id_tree, name); return rb_radixtree_retrieve(client_id_tree, name);
} }
/* find_client() /* find_client()
@ -315,7 +315,7 @@ find_client(const char *name)
if(IsDigit(*name)) if(IsDigit(*name))
return (find_id(name)); return (find_id(name));
return irc_radixtree_retrieve(client_name_tree, name); return rb_radixtree_retrieve(client_name_tree, name);
} }
/* find_named_client() /* find_named_client()
@ -329,7 +329,7 @@ find_named_client(const char *name)
if(EmptyString(name)) if(EmptyString(name))
return NULL; return NULL;
return irc_radixtree_retrieve(client_name_tree, name); return rb_radixtree_retrieve(client_name_tree, name);
} }
/* find_server() /* find_server()
@ -351,7 +351,7 @@ find_server(struct Client *source_p, const char *name)
return(target_p); return(target_p);
} }
target_p = irc_radixtree_retrieve(client_name_tree, name); target_p = rb_radixtree_retrieve(client_name_tree, name);
if (target_p != NULL) if (target_p != NULL)
{ {
if(IsServer(target_p) || IsMe(target_p)) if(IsServer(target_p) || IsMe(target_p))
@ -375,7 +375,7 @@ find_hostname(const char *hostname)
if(EmptyString(hostname)) if(EmptyString(hostname))
return NULL; return NULL;
hlist = irc_radixtree_retrieve(hostname_tree, hostname); hlist = rb_radixtree_retrieve(hostname_tree, hostname);
if (hlist == NULL) if (hlist == NULL)
return NULL; return NULL;
@ -393,7 +393,7 @@ find_channel(const char *name)
if(EmptyString(name)) if(EmptyString(name))
return NULL; return NULL;
return irc_radixtree_retrieve(channel_tree, name); return rb_radixtree_retrieve(channel_tree, name);
} }
/* /*
@ -433,7 +433,7 @@ get_or_create_channel(struct Client *client_p, const char *chname, int *isnew)
s = t; s = t;
} }
chptr = irc_radixtree_retrieve(channel_tree, s); chptr = rb_radixtree_retrieve(channel_tree, s);
if (chptr != NULL) if (chptr != NULL)
{ {
if (isnew != NULL) if (isnew != NULL)
@ -448,7 +448,7 @@ get_or_create_channel(struct Client *client_p, const char *chname, int *isnew)
chptr->channelts = rb_current_time(); /* doesn't hurt to set it here */ chptr->channelts = rb_current_time(); /* doesn't hurt to set it here */
rb_dlinkAdd(chptr, &chptr->node, &global_channel_list); rb_dlinkAdd(chptr, &chptr->node, &global_channel_list);
irc_radixtree_add(channel_tree, chptr->chname, chptr); rb_radixtree_add(channel_tree, chptr->chname, chptr);
return chptr; return chptr;
} }
@ -466,7 +466,7 @@ hash_find_resv(const char *name)
if(EmptyString(name)) if(EmptyString(name))
return NULL; return NULL;
aconf = irc_radixtree_retrieve(resv_tree, name); aconf = rb_radixtree_retrieve(resv_tree, name);
if (aconf != NULL) if (aconf != NULL)
{ {
aconf->port++; aconf->port++;
@ -480,15 +480,15 @@ void
clear_resv_hash(void) clear_resv_hash(void)
{ {
struct ConfItem *aconf; struct ConfItem *aconf;
struct irc_radixtree_iteration_state iter; struct rb_radixtree_iteration_state iter;
IRC_RADIXTREE_FOREACH(aconf, &iter, resv_tree) RB_RADIXTREE_FOREACH(aconf, &iter, resv_tree)
{ {
/* skip temp resvs */ /* skip temp resvs */
if(aconf->hold) if(aconf->hold)
continue; continue;
irc_radixtree_delete(resv_tree, aconf->host); rb_radixtree_delete(resv_tree, aconf->host);
free_conf(aconf); free_conf(aconf);
} }
} }
@ -496,25 +496,25 @@ clear_resv_hash(void)
void void
add_to_zconnid_hash(struct Client *client_p) add_to_zconnid_hash(struct Client *client_p)
{ {
irc_dictionary_add(client_zconnid_tree, IRC_UINT_TO_POINTER(client_p->localClient->zconnid), client_p); rb_dictionary_add(client_zconnid_tree, RB_UINT_TO_POINTER(client_p->localClient->zconnid), client_p);
} }
void void
del_from_zconnid_hash(struct Client *client_p) del_from_zconnid_hash(struct Client *client_p)
{ {
irc_dictionary_delete(client_zconnid_tree, IRC_UINT_TO_POINTER(client_p->localClient->zconnid)); rb_dictionary_delete(client_zconnid_tree, RB_UINT_TO_POINTER(client_p->localClient->zconnid));
} }
void void
add_to_cli_connid_hash(struct Client *client_p) add_to_cli_connid_hash(struct Client *client_p)
{ {
irc_dictionary_add(client_connid_tree, IRC_UINT_TO_POINTER(client_p->localClient->connid), client_p); rb_dictionary_add(client_connid_tree, RB_UINT_TO_POINTER(client_p->localClient->connid), client_p);
} }
void void
del_from_cli_connid_hash(struct Client *client_p) del_from_cli_connid_hash(struct Client *client_p)
{ {
irc_dictionary_delete(client_connid_tree, IRC_UINT_TO_POINTER(client_p->localClient->connid)); rb_dictionary_delete(client_connid_tree, RB_UINT_TO_POINTER(client_p->localClient->connid));
} }
struct Client * struct Client *
@ -522,11 +522,11 @@ find_cli_connid_hash(uint32_t connid)
{ {
struct Client *target_p; struct Client *target_p;
target_p = irc_dictionary_retrieve(client_connid_tree, IRC_UINT_TO_POINTER(connid)); target_p = rb_dictionary_retrieve(client_connid_tree, RB_UINT_TO_POINTER(connid));
if (target_p != NULL) if (target_p != NULL)
return target_p; return target_p;
target_p = irc_dictionary_retrieve(client_zconnid_tree, IRC_UINT_TO_POINTER(connid)); target_p = rb_dictionary_retrieve(client_zconnid_tree, RB_UINT_TO_POINTER(connid));
if (target_p != NULL) if (target_p != NULL)
return target_p; return target_p;

View file

@ -35,14 +35,14 @@
#include "hash.h" #include "hash.h"
#include "numeric.h" #include "numeric.h"
#include "send.h" #include "send.h"
#include "irc_radixtree.h" #include "rb_radixtree.h"
static struct irc_radixtree *monitor_tree; static struct rb_radixtree *monitor_tree;
void void
init_monitor(void) init_monitor(void)
{ {
monitor_tree = irc_radixtree_create("monitor lists", irc_radixtree_irccasecanon); monitor_tree = rb_radixtree_create("monitor lists", irccasecanon);
} }
struct monitor * struct monitor *
@ -50,7 +50,7 @@ find_monitor(const char *name, int add)
{ {
struct monitor *monptr; struct monitor *monptr;
monptr = irc_radixtree_retrieve(monitor_tree, name); monptr = rb_radixtree_retrieve(monitor_tree, name);
if (monptr != NULL) if (monptr != NULL)
return monptr; return monptr;
@ -58,7 +58,7 @@ find_monitor(const char *name, int add)
{ {
monptr = rb_malloc(sizeof(*monptr)); monptr = rb_malloc(sizeof(*monptr));
rb_strlcpy(monptr->name, name, sizeof(monptr->name)); rb_strlcpy(monptr->name, name, sizeof(monptr->name));
irc_radixtree_add(monitor_tree, monptr->name, monptr); rb_radixtree_add(monitor_tree, monptr->name, monptr);
return monptr; return monptr;
} }
@ -72,7 +72,7 @@ free_monitor(struct monitor *monptr)
if (rb_dlink_list_length(&monptr->users) > 0) if (rb_dlink_list_length(&monptr->users) > 0)
return; return;
irc_radixtree_delete(monitor_tree, monptr->name); rb_radixtree_delete(monitor_tree, monptr->name);
rb_free(monptr); rb_free(monptr);
} }

View file

@ -1780,7 +1780,7 @@ conf_end_alias(struct TopConf *tc)
return -1; return -1;
} }
irc_dictionary_add(alias_dict, yy_alias->name, yy_alias); rb_dictionary_add(alias_dict, yy_alias->name, yy_alias);
return 0; return 0;
} }

View file

@ -35,9 +35,9 @@
#include "match.h" #include "match.h"
#include "hash.h" #include "hash.h"
#include "operhash.h" #include "operhash.h"
#include "irc_radixtree.h" #include "rb_radixtree.h"
static struct irc_radixtree *operhash_tree = NULL; static struct rb_radixtree *operhash_tree = NULL;
struct operhash_entry struct operhash_entry
{ {
@ -48,7 +48,7 @@ struct operhash_entry
void void
init_operhash(void) init_operhash(void)
{ {
operhash_tree = irc_radixtree_create("operhash", NULL); operhash_tree = rb_radixtree_create("operhash", NULL);
} }
const char * const char *
@ -60,7 +60,7 @@ operhash_add(const char *name)
if(EmptyString(name)) if(EmptyString(name))
return NULL; return NULL;
if((ohash = (struct operhash_entry *) irc_radixtree_retrieve(operhash_tree, name)) != NULL) if((ohash = (struct operhash_entry *) rb_radixtree_retrieve(operhash_tree, name)) != NULL)
{ {
ohash->refcount++; ohash->refcount++;
return ohash->name; return ohash->name;
@ -70,20 +70,20 @@ operhash_add(const char *name)
ohash = rb_malloc(sizeof(struct operhash_entry) + len); ohash = rb_malloc(sizeof(struct operhash_entry) + len);
ohash->refcount = 1; ohash->refcount = 1;
memcpy(ohash->name, name, len); memcpy(ohash->name, name, len);
irc_radixtree_add(operhash_tree, ohash->name, ohash); rb_radixtree_add(operhash_tree, ohash->name, ohash);
return ohash->name; return ohash->name;
} }
const char * const char *
operhash_find(const char *name) operhash_find(const char *name)
{ {
return irc_radixtree_retrieve(operhash_tree, name); return rb_radixtree_retrieve(operhash_tree, name);
} }
void void
operhash_delete(const char *name) operhash_delete(const char *name)
{ {
struct operhash_entry *ohash = irc_radixtree_retrieve(operhash_tree, name); struct operhash_entry *ohash = rb_radixtree_retrieve(operhash_tree, name);
if (ohash != NULL) if (ohash != NULL)
rb_free(ohash); rb_free(ohash);

View file

@ -136,14 +136,14 @@ parse(struct Client *client_p, char *pbuffer, char *bufend)
} }
else else
{ {
mptr = irc_dictionary_retrieve(cmd_dict, msgbuf.cmd); mptr = rb_dictionary_retrieve(cmd_dict, msgbuf.cmd);
/* no command or its encap only, error */ /* no command or its encap only, error */
if(!mptr || !mptr->cmd) if(!mptr || !mptr->cmd)
{ {
if (IsPerson(client_p)) if (IsPerson(client_p))
{ {
struct alias_entry *aptr = irc_dictionary_retrieve(alias_dict, msgbuf.cmd); struct alias_entry *aptr = rb_dictionary_retrieve(alias_dict, msgbuf.cmd);
if (aptr != NULL) if (aptr != NULL)
{ {
do_alias(aptr, client_p, reconstruct_parv(msgbuf.n_para - 1, msgbuf.para + 1)); do_alias(aptr, client_p, reconstruct_parv(msgbuf.n_para - 1, msgbuf.para + 1));
@ -264,7 +264,7 @@ handle_encap(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *so
struct MessageEntry ehandler; struct MessageEntry ehandler;
MessageHandler handler = 0; MessageHandler handler = 0;
mptr = irc_dictionary_retrieve(cmd_dict, command); mptr = rb_dictionary_retrieve(cmd_dict, command);
if(mptr == NULL || mptr->cmd == NULL) if(mptr == NULL || mptr->cmd == NULL)
return; return;
@ -290,7 +290,7 @@ handle_encap(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *so
void void
clear_hash_parse() clear_hash_parse()
{ {
cmd_dict = irc_dictionary_create("command", strcasecmp); cmd_dict = rb_dictionary_create("command", strcasecmp);
} }
/* mod_add_cmd /* mod_add_cmd
@ -309,14 +309,14 @@ mod_add_cmd(struct Message *msg)
if(msg == NULL) if(msg == NULL)
return; return;
if (irc_dictionary_find(cmd_dict, msg->cmd) != NULL) if (rb_dictionary_find(cmd_dict, msg->cmd) != NULL)
return; return;
msg->count = 0; msg->count = 0;
msg->rcount = 0; msg->rcount = 0;
msg->bytes = 0; msg->bytes = 0;
irc_dictionary_add(cmd_dict, msg->cmd, msg); rb_dictionary_add(cmd_dict, msg->cmd, msg);
} }
/* mod_del_cmd /* mod_del_cmd
@ -332,7 +332,7 @@ mod_del_cmd(struct Message *msg)
if(msg == NULL) if(msg == NULL)
return; return;
irc_dictionary_delete(cmd_dict, msg->cmd); rb_dictionary_delete(cmd_dict, msg->cmd);
} }
/* cancel_clients() /* cancel_clients()

View file

@ -826,7 +826,7 @@ set_default_conf(void)
ConfigFileEntry.hide_opers_in_whois = 0; ConfigFileEntry.hide_opers_in_whois = 0;
if (!alias_dict) if (!alias_dict)
alias_dict = irc_dictionary_create("alias", strcasecmp); alias_dict = rb_dictionary_create("alias", strcasecmp);
} }
#undef YES #undef YES
@ -1532,7 +1532,7 @@ clear_out_old_conf(void)
/* remove any aliases... -- nenolod */ /* remove any aliases... -- nenolod */
if (alias_dict != NULL) if (alias_dict != NULL)
{ {
irc_dictionary_destroy(alias_dict, free_alias_cb, NULL); rb_dictionary_destroy(alias_dict, free_alias_cb, NULL);
alias_dict = NULL; alias_dict = NULL;
} }

View file

@ -41,8 +41,8 @@
#include "hostmask.h" #include "hostmask.h"
#include "newconf.h" #include "newconf.h"
#include "hash.h" #include "hash.h"
#include "irc_dictionary.h" #include "rb_dictionary.h"
#include "irc_radixtree.h" #include "rb_radixtree.h"
#include "s_assert.h" #include "s_assert.h"
#include "logger.h" #include "logger.h"
#include "dns.h" #include "dns.h"
@ -686,9 +686,9 @@ expire_temp_rxlines(void *unused)
rb_dlink_node *ptr; rb_dlink_node *ptr;
rb_dlink_node *next_ptr; rb_dlink_node *next_ptr;
int i; int i;
struct irc_radixtree_iteration_state state; struct rb_radixtree_iteration_state state;
IRC_RADIXTREE_FOREACH(aconf, &state, resv_tree) RB_RADIXTREE_FOREACH(aconf, &state, resv_tree)
{ {
if(aconf->lifetime != 0) if(aconf->lifetime != 0)
continue; continue;
@ -699,7 +699,7 @@ expire_temp_rxlines(void *unused)
"Temporary RESV for [%s] expired", "Temporary RESV for [%s] expired",
aconf->host); aconf->host);
irc_radixtree_delete(resv_tree, aconf->host); rb_radixtree_delete(resv_tree, aconf->host);
free_conf(aconf); free_conf(aconf);
} }
} }
@ -750,7 +750,7 @@ add_nd_entry(const char *name)
{ {
struct nd_entry *nd; struct nd_entry *nd;
if(irc_dictionary_find(nd_dict, name) != NULL) if(rb_dictionary_find(nd_dict, name) != NULL)
return; return;
nd = rb_bh_alloc(nd_heap); nd = rb_bh_alloc(nd_heap);
@ -761,13 +761,13 @@ add_nd_entry(const char *name)
/* this list is ordered */ /* this list is ordered */
rb_dlinkAddTail(nd, &nd->lnode, &nd_list); rb_dlinkAddTail(nd, &nd->lnode, &nd_list);
irc_dictionary_add(nd_dict, nd->name, nd); rb_dictionary_add(nd_dict, nd->name, nd);
} }
void void
free_nd_entry(struct nd_entry *nd) free_nd_entry(struct nd_entry *nd)
{ {
irc_dictionary_delete(nd_dict, nd->name); rb_dictionary_delete(nd_dict, nd->name);
rb_dlinkDelete(&nd->lnode, &nd_list); rb_dlinkDelete(&nd->lnode, &nd_list);
rb_bh_free(nd_heap, nd); rb_bh_free(nd_heap, nd);

View file

@ -32,7 +32,7 @@
#include "scache.h" #include "scache.h"
#include "s_conf.h" #include "s_conf.h"
#include "s_assert.h" #include "s_assert.h"
#include "irc_radixtree.h" #include "rb_radixtree.h"
/* /*
* ircd used to store full servernames in anUser as well as in the * ircd used to store full servernames in anUser as well as in the
@ -45,7 +45,7 @@
* reworked to serve for flattening/delaying /links also * reworked to serve for flattening/delaying /links also
* -- jilles * -- jilles
* *
* reworked to make use of irc_radixtree. * reworked to make use of rb_radixtree.
* -- kaniini * -- kaniini
*/ */
@ -62,12 +62,12 @@ struct scache_entry
time_t last_split; time_t last_split;
}; };
static struct irc_radixtree *scache_tree = NULL; static struct rb_radixtree *scache_tree = NULL;
void void
clear_scache_hash_table(void) clear_scache_hash_table(void)
{ {
scache_tree = irc_radixtree_create("server names cache", irc_radixtree_irccasecanon); scache_tree = rb_radixtree_create("server names cache", irccasecanon);
} }
static struct scache_entry * static struct scache_entry *
@ -75,7 +75,7 @@ find_or_add(const char *name)
{ {
struct scache_entry *ptr; struct scache_entry *ptr;
ptr = irc_radixtree_retrieve(scache_tree, name); ptr = rb_radixtree_retrieve(scache_tree, name);
if (ptr != NULL) if (ptr != NULL)
return ptr; return ptr;
@ -89,7 +89,7 @@ find_or_add(const char *name)
ptr->last_connect = 0; ptr->last_connect = 0;
ptr->last_split = 0; ptr->last_split = 0;
irc_radixtree_add(scache_tree, ptr->name, ptr); rb_radixtree_add(scache_tree, ptr->name, ptr);
return ptr; return ptr;
} }
@ -134,10 +134,10 @@ void
scache_send_flattened_links(struct Client *source_p) scache_send_flattened_links(struct Client *source_p)
{ {
struct scache_entry *scache_ptr; struct scache_entry *scache_ptr;
struct irc_radixtree_iteration_state iter; struct rb_radixtree_iteration_state iter;
int show; int show;
IRC_RADIXTREE_FOREACH(scache_ptr, &iter, scache_tree) RB_RADIXTREE_FOREACH(scache_ptr, &iter, scache_tree)
{ {
if (!irccmp(scache_ptr->name, me.name)) if (!irccmp(scache_ptr->name, me.name))
show = FALSE; show = FALSE;
@ -170,9 +170,9 @@ void
scache_send_missing(struct Client *source_p) scache_send_missing(struct Client *source_p)
{ {
struct scache_entry *scache_ptr; struct scache_entry *scache_ptr;
struct irc_radixtree_iteration_state iter; struct rb_radixtree_iteration_state iter;
IRC_RADIXTREE_FOREACH(scache_ptr, &iter, scache_tree) RB_RADIXTREE_FOREACH(scache_ptr, &iter, scache_tree)
{ {
if (!(scache_ptr->flags & SC_ONLINE) && scache_ptr->last_split > rb_current_time() - MISSING_TIMEOUT) if (!(scache_ptr->flags & SC_ONLINE) && scache_ptr->last_split > rb_current_time() - MISSING_TIMEOUT)
sendto_one_numeric(source_p, RPL_MAP, "** %s (recently split)", sendto_one_numeric(source_p, RPL_MAP, "** %s (recently split)",
@ -191,12 +191,12 @@ void
count_scache(size_t * number_servers_cached, size_t * mem_servers_cached) count_scache(size_t * number_servers_cached, size_t * mem_servers_cached)
{ {
struct scache_entry *scache_ptr; struct scache_entry *scache_ptr;
struct irc_radixtree_iteration_state iter; struct rb_radixtree_iteration_state iter;
*number_servers_cached = 0; *number_servers_cached = 0;
*mem_servers_cached = 0; *mem_servers_cached = 0;
IRC_RADIXTREE_FOREACH(scache_ptr, &iter, scache_tree) RB_RADIXTREE_FOREACH(scache_ptr, &iter, scache_tree)
{ {
*number_servers_cached = *number_servers_cached + 1; *number_servers_cached = *number_servers_cached + 1;
*mem_servers_cached = *mem_servers_cached + *mem_servers_cached = *mem_servers_cached +

View file

@ -38,7 +38,7 @@
#include "send.h" #include "send.h"
#include "logger.h" #include "logger.h"
#include "scache.h" #include "scache.h"
#include "irc_radixtree.h" #include "rb_radixtree.h"
struct whowas_top struct whowas_top
{ {
@ -46,7 +46,7 @@ struct whowas_top
rb_dlink_list wwlist; rb_dlink_list wwlist;
}; };
static struct irc_radixtree *whowas_tree = NULL; static struct rb_radixtree *whowas_tree = NULL;
static rb_dlink_list whowas_list = {NULL, NULL, 0}; static rb_dlink_list whowas_list = {NULL, NULL, 0};
static unsigned int whowas_list_length = NICKNAMEHISTORYLENGTH; static unsigned int whowas_list_length = NICKNAMEHISTORYLENGTH;
static void whowas_trim(void *unused); static void whowas_trim(void *unused);
@ -56,7 +56,7 @@ whowas_free_wtop(struct whowas_top *wtop)
{ {
if(rb_dlink_list_length(&wtop->wwlist) == 0) if(rb_dlink_list_length(&wtop->wwlist) == 0)
{ {
irc_radixtree_delete(whowas_tree, wtop->name); rb_radixtree_delete(whowas_tree, wtop->name);
rb_free(wtop->name); rb_free(wtop->name);
rb_free(wtop); rb_free(wtop);
} }
@ -67,13 +67,13 @@ whowas_get_top(const char *name)
{ {
struct whowas_top *wtop; struct whowas_top *wtop;
wtop = irc_radixtree_retrieve(whowas_tree, name); wtop = rb_radixtree_retrieve(whowas_tree, name);
if (wtop != NULL) if (wtop != NULL)
return wtop; return wtop;
wtop = rb_malloc(sizeof(struct whowas_top)); wtop = rb_malloc(sizeof(struct whowas_top));
wtop->name = rb_strdup(name); wtop->name = rb_strdup(name);
irc_radixtree_add(whowas_tree, wtop->name, wtop); rb_radixtree_add(whowas_tree, wtop->name, wtop);
return wtop; return wtop;
} }
@ -82,7 +82,7 @@ rb_dlink_list *
whowas_get_list(const char *name) whowas_get_list(const char *name)
{ {
struct whowas_top *wtop; struct whowas_top *wtop;
wtop = irc_radixtree_retrieve(whowas_tree, name); wtop = rb_radixtree_retrieve(whowas_tree, name);
if(wtop == NULL) if(wtop == NULL)
return NULL; return NULL;
return &wtop->wwlist; return &wtop->wwlist;
@ -151,7 +151,7 @@ whowas_get_history(const char *nick, time_t timelimit)
struct whowas_top *wtop; struct whowas_top *wtop;
rb_dlink_node *ptr; rb_dlink_node *ptr;
wtop = irc_radixtree_retrieve(whowas_tree, nick); wtop = rb_radixtree_retrieve(whowas_tree, nick);
if(wtop == NULL) if(wtop == NULL)
return NULL; return NULL;
@ -197,7 +197,7 @@ whowas_trim(void *unused)
void void
whowas_init(void) whowas_init(void)
{ {
whowas_tree = irc_radixtree_create("whowas", irc_radixtree_irccasecanon); whowas_tree = rb_radixtree_create("whowas", irccasecanon);
if(whowas_list_length == 0) if(whowas_list_length == 0)
{ {
whowas_list_length = NICKNAMEHISTORYLENGTH; whowas_list_length = NICKNAMEHISTORYLENGTH;
@ -217,5 +217,5 @@ whowas_memory_usage(size_t * count, size_t * memused)
{ {
*count = rb_dlink_list_length(&whowas_list); *count = rb_dlink_list_length(&whowas_list);
*memused += *count * sizeof(struct Whowas); *memused += *count * sizeof(struct Whowas);
*memused += sizeof(struct whowas_top) * irc_radixtree_size(whowas_tree); *memused += sizeof(struct whowas_top) * rb_radixtree_size(whowas_tree);
} }

View file

@ -0,0 +1,170 @@
/*
* charybdis: an advanced ircd.
* rb_dictionary.h: Dictionary-based storage.
*
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
* Copyright (c) 2007 Jilles Tjoelker <jilles -at- stack.nl>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice is present in all copies.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __RB_DICTIONARY_H__
#define __RB_DICTIONARY_H__
struct Dictionary; /* defined in src/dictionary.c */
typedef int (*DCF)(/* const void *a, const void *b */);
struct DictionaryElement
{
struct DictionaryElement *left, *right, *prev, *next;
void *data;
const void *key;
int position;
};
struct DictionaryIter
{
struct DictionaryElement *cur, *next;
};
/*
* this is a convenience macro for inlining iteration of dictionaries.
*/
#define DICTIONARY_FOREACH(element, state, dict) for (rb_dictionary_foreach_start((dict), (state)); (element = rb_dictionary_foreach_cur((dict), (state))); rb_dictionary_foreach_next((dict), (state)))
/*
* rb_dictionary_create_named() creates a new dictionary tree which has a name.
* name is the name, compare_cb is the comparator.
*/
extern struct Dictionary *rb_dictionary_create(const char *name, DCF compare_cb);
/*
* rb_dictionary_set_comparator_func() resets the comparator used for lookups and
* insertions in the DTree structure.
*/
extern void rb_dictionary_set_comparator_func(struct Dictionary *dict,
DCF compare_cb);
/*
* rb_dictionary_get_comparator_func() returns the comparator used for lookups and
* insertions in the DTree structure.
*/
extern DCF rb_dictionary_get_comparator_func(struct Dictionary *dict);
/*
* rb_dictionary_get_linear_index() returns the linear index of an object in the
* DTree structure.
*/
extern int rb_dictionary_get_linear_index(struct Dictionary *dict, const void *key);
/*
* rb_dictionary_destroy() destroys all entries in a dtree, and also optionally calls
* a defined callback function to destroy any data attached to it.
*/
extern void rb_dictionary_destroy(struct Dictionary *dtree,
void (*destroy_cb)(struct DictionaryElement *delem, void *privdata),
void *privdata);
/*
* rb_dictionary_foreach() iterates all entries in a dtree, and also optionally calls
* a defined callback function to use any data attached to it.
*
* To shortcircuit iteration, return non-zero from the callback function.
*/
extern void rb_dictionary_foreach(struct Dictionary *dtree,
int (*foreach_cb)(struct DictionaryElement *delem, void *privdata),
void *privdata);
/*
* rb_dictionary_search() iterates all entries in a dtree, and also optionally calls
* a defined callback function to use any data attached to it.
*
* When the object is found, a non-NULL is returned from the callback, which results
* in that object being returned to the user.
*/
extern void *rb_dictionary_search(struct Dictionary *dtree,
void *(*foreach_cb)(struct DictionaryElement *delem, void *privdata),
void *privdata);
/*
* rb_dictionary_foreach_start() begins an iteration over all items
* keeping state in the given struct. If there is only one iteration
* in progress at a time, it is permitted to remove the current element
* of the iteration (but not any other element).
*/
extern void rb_dictionary_foreach_start(struct Dictionary *dtree,
struct DictionaryIter *state);
/*
* rb_dictionary_foreach_cur() returns the current element of the iteration,
* or NULL if there are no more elements.
*/
extern void *rb_dictionary_foreach_cur(struct Dictionary *dtree,
struct DictionaryIter *state);
/*
* rb_dictionary_foreach_next() moves to the next element.
*/
extern void rb_dictionary_foreach_next(struct Dictionary *dtree,
struct DictionaryIter *state);
/*
* rb_dictionary_add() adds a key->value entry to the dictionary tree.
*/
extern struct DictionaryElement *rb_dictionary_add(struct Dictionary *dtree, const void *key, void *data);
/*
* rb_dictionary_find() returns a struct DictionaryElement container from a dtree for key 'key'.
*/
extern struct DictionaryElement *rb_dictionary_find(struct Dictionary *dtree, const void *key);
/*
* rb_dictionary_find() returns data from a dtree for key 'key'.
*/
extern void *rb_dictionary_retrieve(struct Dictionary *dtree, const void *key);
/*
* rb_dictionary_delete() deletes a key->value entry from the dictionary tree.
*/
extern void *rb_dictionary_delete(struct Dictionary *dtree, const void *key);
/*
* rb_dictionary_size() returns the number of elements in a dictionary tree.
*/
extern unsigned int rb_dictionary_size(struct Dictionary *dtree);
void rb_dictionary_stats(struct Dictionary *dict, void (*cb)(const char *line, void *privdata), void *privdata);
void rb_dictionary_stats_walk(void (*cb)(const char *line, void *privdata), void *privdata);
#define RB_POINTER_TO_INT(x) ((int32_t) (long) (x))
#define RB_INT_TO_POINTER(x) ((void *) (long) (int32_t) (x))
#define RB_POINTER_TO_UINT(x) ((uint32_t) (unsigned long) (x))
#define RB_UINT_TO_POINTER(x) ((void *) (unsigned long) (uint32_t) (x))
static inline int rb_int32cmp(const void *a, const void *b)
{
return RB_POINTER_TO_INT(b) - RB_POINTER_TO_INT(a);
}
static inline int rb_uint32cmp(const void *a, const void *b)
{
return RB_POINTER_TO_UINT(b) - RB_POINTER_TO_UINT(a);
}
#endif

View file

@ -0,0 +1,153 @@
/*
* charybdis: an advanced ircd.
* rb_radixtree.h: Dictionary-based storage.
*
* Copyright (c) 2007-2016 William Pitcock <nenolod -at- dereferenced.org>
* Copyright (c) 2007-2016 Jilles Tjoelker <jilles -at- stack.nl>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __rb_radixtree_H__
#define __rb_radixtree_H__
struct rb_radixtree; /* defined in src/rb_radixtree.c */
struct rb_radixtree_leaf; /* defined in src/rb_radixtree.c */
/*
* struct rb_radixtree_iteration_state, private.
*/
struct rb_radixtree_iteration_state
{
struct rb_radixtree_leaf *cur, *next;
void *pspare[4];
int ispare[4];
};
/*
* this is a convenience macro for inlining iteration of dictionaries.
*/
#define RB_RADIXTREE_FOREACH(element, state, dict) \
for (rb_radixtree_foreach_start((dict), (state)); (element = rb_radixtree_foreach_cur((dict), (state))); rb_radixtree_foreach_next((dict), (state)))
#define RB_RADIXTREE_FOREACH_FROM(element, state, dict, key) \
for (rb_radixtree_foreach_start_from((dict), (state), (key)); (element = rb_radixtree_foreach_cur((dict), (state))); rb_radixtree_foreach_next((dict), (state)))
/*
* rb_radixtree_create() creates a new patricia tree of the defined resolution.
* compare_cb is the canonizing function.
*/
extern struct rb_radixtree *rb_radixtree_create(const char *name, void (*canonize_cb)(char *key));
/*
* rb_radixtree_shutdown() deallocates all heaps used in patricia trees. This is
* useful on embedded devices with little memory, and/or when you know you won't need
* any more patricia trees.
*/
extern void rb_radixtree_shutdown(void);
/*
* rb_radixtree_destroy() destroys all entries in a dtree, and also optionally calls
* a defined callback function to destroy any data attached to it.
*/
extern void rb_radixtree_destroy(struct rb_radixtree *dtree, void (*destroy_cb)(const char *key, void *data, void *privdata), void *privdata);
/*
* rb_radixtree_foreach() iterates all entries in a dtree, and also optionally calls
* a defined callback function to use any data attached to it.
*
* To shortcircuit iteration, return non-zero from the callback function.
*/
extern void rb_radixtree_foreach(struct rb_radixtree *dtree, int (*foreach_cb)(const char *key, void *data, void *privdata), void *privdata);
/*
* rb_radixtree_search() iterates all entries in a dtree, and also optionally calls
* a defined callback function to use any data attached to it.
*
* When the object is found, a non-NULL is returned from the callback, which results
* in that object being returned to the user.
*/
extern void *rb_radixtree_search(struct rb_radixtree *dtree, void *(*foreach_cb)(const char *key, void *data, void *privdata), void *privdata);
/*
* rb_radixtree_foreach_start() begins an iteration over all items
* keeping state in the given struct. If there is only one iteration
* in progress at a time, it is permitted to remove the current element
* of the iteration (but not any other element).
*/
extern void rb_radixtree_foreach_start(struct rb_radixtree *dtree, struct rb_radixtree_iteration_state *state);
/*
* rb_radixtree_foreach_start_from() begins an iteration over all items,
* starting with the item specified by `key`. If there is only one iteration
* in progress at a time, it is permitted to remove the current element
* of the iteration (but not any other element).
* Use NULL as a key to have it start at the beginning.
*/
extern void rb_radixtree_foreach_start_from(struct rb_radixtree *dtree, struct rb_radixtree_iteration_state *state, const char *key);
/*
* rb_radixtree_foreach_cur() returns the current element of the iteration,
* or NULL if there are no more elements.
*/
extern void *rb_radixtree_foreach_cur(struct rb_radixtree *dtree, struct rb_radixtree_iteration_state *state);
/*
* rb_radixtree_foreach_next() moves to the next element.
*/
extern void rb_radixtree_foreach_next(struct rb_radixtree *dtree, struct rb_radixtree_iteration_state *state);
/*
* rb_radixtree_add() adds a key->value entry to the patricia tree.
*/
extern int rb_radixtree_add(struct rb_radixtree *dtree, const char *key, void *data);
/*
* rb_radixtree_find() returns data from a dtree for key 'key'.
*/
extern void *rb_radixtree_retrieve(struct rb_radixtree *dtree, const char *key);
/*
* rb_radixtree_delete() deletes a key->value entry from the patricia tree.
*/
extern void *rb_radixtree_delete(struct rb_radixtree *dtree, const char *key);
/* Low-level functions */
struct rb_radixtree_leaf *rb_radixtree_elem_add(struct rb_radixtree *dtree, const char *key, void *data);
struct rb_radixtree_leaf *rb_radixtree_elem_find(struct rb_radixtree *dtree, const char *key, int fuzzy);
void rb_radixtree_elem_delete(struct rb_radixtree *dtree, struct rb_radixtree_leaf *elem);
const char *rb_radixtree_elem_get_key(struct rb_radixtree_leaf *elem);
void rb_radixtree_elem_set_data(struct rb_radixtree_leaf *elem, void *data);
void *rb_radixtree_elem_get_data(struct rb_radixtree_leaf *elem);
unsigned int rb_radixtree_size(struct rb_radixtree *dict);
void rb_radixtree_stats(struct rb_radixtree *dict, void (*cb)(const char *line, void *privdata), void *privdata);
void rb_radixtree_stats_walk(void (*cb)(const char *line, void *privdata), void *privdata);
#endif

View file

@ -38,6 +38,8 @@ librb_la_SOURCES = \
kqueue.c \ kqueue.c \
rawbuf.c \ rawbuf.c \
patricia.c \ patricia.c \
dictionary.c \
radixtree.c \
arc4random.c \ arc4random.c \
version.c version.c

View file

@ -1,6 +1,6 @@
/* /*
* charybdis: an advanced ircd * charybdis: an advanced ircd
* irc_dictionary.c: Dictionary-based information storage. * rb_dictionary.c: Dictionary-based information storage.
* *
* Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk> * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
* Copyright (c) 2007 Jilles Tjoelker <jilles -at- stack.nl> * Copyright (c) 2007 Jilles Tjoelker <jilles -at- stack.nl>
@ -22,13 +22,9 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "stdinc.h" #include <librb_config.h>
#include "match.h" #include <rb_lib.h>
#include "client.h" #include <rb_dictionary.h>
#include "setup.h"
#include "irc_dictionary.h"
#include "s_assert.h"
#include "logger.h"
struct Dictionary struct Dictionary
{ {
@ -44,7 +40,7 @@ struct Dictionary
static rb_dlink_list dictionary_list = {NULL, NULL, 0}; static rb_dlink_list dictionary_list = {NULL, NULL, 0};
/* /*
* irc_dictionary_create(const char *name, DCF compare_cb) * rb_dictionary_create(const char *name, DCF compare_cb)
* *
* Dictionary object factory. * Dictionary object factory.
* *
@ -59,7 +55,7 @@ static rb_dlink_list dictionary_list = {NULL, NULL, 0};
* - if services runs out of memory and cannot allocate the object, * - if services runs out of memory and cannot allocate the object,
* the program will abort. * the program will abort.
*/ */
struct Dictionary *irc_dictionary_create(const char *name, struct Dictionary *rb_dictionary_create(const char *name,
DCF compare_cb) DCF compare_cb)
{ {
struct Dictionary *dtree = (struct Dictionary *) rb_malloc(sizeof(struct Dictionary)); struct Dictionary *dtree = (struct Dictionary *) rb_malloc(sizeof(struct Dictionary));
@ -73,7 +69,7 @@ struct Dictionary *irc_dictionary_create(const char *name,
} }
/* /*
* irc_dictionary_set_comparator_func(struct Dictionary *dict, * rb_dictionary_set_comparator_func(struct Dictionary *dict,
* DCF compare_cb) * DCF compare_cb)
* *
* Resets the comparator function used by the dictionary code for * Resets the comparator function used by the dictionary code for
@ -89,17 +85,17 @@ struct Dictionary *irc_dictionary_create(const char *name,
* Side Effects: * Side Effects:
* - the dictionary comparator function is reset. * - the dictionary comparator function is reset.
*/ */
void irc_dictionary_set_comparator_func(struct Dictionary *dict, void rb_dictionary_set_comparator_func(struct Dictionary *dict,
DCF compare_cb) DCF compare_cb)
{ {
s_assert(dict != NULL); lrb_assert(dict != NULL);
s_assert(compare_cb != NULL); lrb_assert(compare_cb != NULL);
dict->compare_cb = compare_cb; dict->compare_cb = compare_cb;
} }
/* /*
* irc_dictionary_get_comparator_func(struct Dictionary *dict) * rb_dictionary_get_comparator_func(struct Dictionary *dict)
* *
* Returns the current comparator function used by the dictionary. * Returns the current comparator function used by the dictionary.
* *
@ -113,15 +109,15 @@ void irc_dictionary_set_comparator_func(struct Dictionary *dict,
* - none * - none
*/ */
DCF DCF
irc_dictionary_get_comparator_func(struct Dictionary *dict) rb_dictionary_get_comparator_func(struct Dictionary *dict)
{ {
s_assert(dict != NULL); lrb_assert(dict != NULL);
return dict->compare_cb; return dict->compare_cb;
} }
/* /*
* irc_dictionary_get_linear_index(struct Dictionary *dict, * rb_dictionary_get_linear_index(struct Dictionary *dict,
* const void *key) * const void *key)
* *
* Gets a linear index number for key. * Gets a linear index number for key.
@ -137,14 +133,14 @@ irc_dictionary_get_comparator_func(struct Dictionary *dict)
* - rebuilds the linear index if the tree is marked as dirty. * - rebuilds the linear index if the tree is marked as dirty.
*/ */
int int
irc_dictionary_get_linear_index(struct Dictionary *dict, const void *key) rb_dictionary_get_linear_index(struct Dictionary *dict, const void *key)
{ {
struct DictionaryElement *elem; struct DictionaryElement *elem;
s_assert(dict != NULL); lrb_assert(dict != NULL);
s_assert(key != NULL); lrb_assert(key != NULL);
elem = irc_dictionary_find(dict, key); elem = rb_dictionary_find(dict, key);
if (elem == NULL) if (elem == NULL)
return -1; return -1;
@ -165,7 +161,7 @@ irc_dictionary_get_linear_index(struct Dictionary *dict, const void *key)
} }
/* /*
* irc_dictionary_retune(struct Dictionary *dict, const void *key) * rb_dictionary_retune(struct Dictionary *dict, const void *key)
* *
* Retunes the tree, self-optimizing for the element which belongs to key. * Retunes the tree, self-optimizing for the element which belongs to key.
* *
@ -179,12 +175,12 @@ irc_dictionary_get_linear_index(struct Dictionary *dict, const void *key)
* - a new root node is nominated. * - a new root node is nominated.
*/ */
static void static void
irc_dictionary_retune(struct Dictionary *dict, const void *key) rb_dictionary_retune(struct Dictionary *dict, const void *key)
{ {
struct DictionaryElement n, *tn, *left, *right, *node; struct DictionaryElement n, *tn, *left, *right, *node;
int ret; int ret;
s_assert(dict != NULL); lrb_assert(dict != NULL);
if (dict->root == NULL) if (dict->root == NULL)
return; return;
@ -257,7 +253,7 @@ irc_dictionary_retune(struct Dictionary *dict, const void *key)
} }
/* /*
* irc_dictionary_link(struct Dictionary *dict, * rb_dictionary_link(struct Dictionary *dict,
* struct DictionaryElement *delem) * struct DictionaryElement *delem)
* *
* Links a dictionary tree element to the dictionary. * Links a dictionary tree element to the dictionary.
@ -278,11 +274,11 @@ irc_dictionary_retune(struct Dictionary *dict, const void *key)
* - a node is linked to the dictionary tree * - a node is linked to the dictionary tree
*/ */
static void static void
irc_dictionary_link(struct Dictionary *dict, rb_dictionary_link(struct Dictionary *dict,
struct DictionaryElement *delem) struct DictionaryElement *delem)
{ {
s_assert(dict != NULL); lrb_assert(dict != NULL);
s_assert(delem != NULL); lrb_assert(delem != NULL);
dict->dirty = TRUE; dict->dirty = TRUE;
@ -298,7 +294,7 @@ irc_dictionary_link(struct Dictionary *dict,
{ {
int ret; int ret;
irc_dictionary_retune(dict, delem->key); rb_dictionary_retune(dict, delem->key);
if ((ret = dict->compare_cb(delem->key, dict->root->key)) < 0) if ((ret = dict->compare_cb(delem->key, dict->root->key)) < 0)
{ {
@ -344,7 +340,7 @@ irc_dictionary_link(struct Dictionary *dict,
} }
/* /*
* irc_dictionary_unlink_root(struct Dictionary *dict) * rb_dictionary_unlink_root(struct Dictionary *dict)
* *
* Unlinks the root dictionary tree element from the dictionary. * Unlinks the root dictionary tree element from the dictionary.
* *
@ -358,7 +354,7 @@ irc_dictionary_link(struct Dictionary *dict,
* - the root node is unlinked from the dictionary tree * - the root node is unlinked from the dictionary tree
*/ */
static void static void
irc_dictionary_unlink_root(struct Dictionary *dict) rb_dictionary_unlink_root(struct Dictionary *dict)
{ {
struct DictionaryElement *delem, *nextnode, *parentofnext; struct DictionaryElement *delem, *nextnode, *parentofnext;
@ -377,7 +373,7 @@ irc_dictionary_unlink_root(struct Dictionary *dict)
/* Make the node with the next highest key the new root. /* Make the node with the next highest key the new root.
* This node has a NULL left pointer. */ * This node has a NULL left pointer. */
nextnode = delem->next; nextnode = delem->next;
s_assert(nextnode->left == NULL); lrb_assert(nextnode->left == NULL);
if (nextnode == delem->right) if (nextnode == delem->right)
{ {
dict->root = nextnode; dict->root = nextnode;
@ -388,7 +384,7 @@ irc_dictionary_unlink_root(struct Dictionary *dict)
parentofnext = delem->right; parentofnext = delem->right;
while (parentofnext->left != NULL && parentofnext->left != nextnode) while (parentofnext->left != NULL && parentofnext->left != nextnode)
parentofnext = parentofnext->left; parentofnext = parentofnext->left;
s_assert(parentofnext->left == nextnode); lrb_assert(parentofnext->left == nextnode);
parentofnext->left = nextnode->right; parentofnext->left = nextnode->right;
dict->root = nextnode; dict->root = nextnode;
dict->root->left = delem->left; dict->root->left = delem->left;
@ -413,7 +409,7 @@ irc_dictionary_unlink_root(struct Dictionary *dict)
} }
/* /*
* irc_dictionary_destroy(struct Dictionary *dtree, * rb_dictionary_destroy(struct Dictionary *dtree,
* void (*destroy_cb)(dictionary_elem_t *delem, void *privdata), * void (*destroy_cb)(dictionary_elem_t *delem, void *privdata),
* void *privdata); * void *privdata);
* *
@ -434,13 +430,13 @@ irc_dictionary_unlink_root(struct Dictionary *dict)
* - if this is called without a callback, the objects bound to the * - if this is called without a callback, the objects bound to the
* DTree will not be destroyed. * DTree will not be destroyed.
*/ */
void irc_dictionary_destroy(struct Dictionary *dtree, void rb_dictionary_destroy(struct Dictionary *dtree,
void (*destroy_cb)(struct DictionaryElement *delem, void *privdata), void (*destroy_cb)(struct DictionaryElement *delem, void *privdata),
void *privdata) void *privdata)
{ {
struct DictionaryElement *n, *tn; struct DictionaryElement *n, *tn;
s_assert(dtree != NULL); lrb_assert(dtree != NULL);
RB_DLINK_FOREACH_SAFE(n, tn, dtree->head) RB_DLINK_FOREACH_SAFE(n, tn, dtree->head)
{ {
@ -456,7 +452,7 @@ void irc_dictionary_destroy(struct Dictionary *dtree,
} }
/* /*
* irc_dictionary_foreach(struct Dictionary *dtree, * rb_dictionary_foreach(struct Dictionary *dtree,
* void (*destroy_cb)(dictionary_elem_t *delem, void *privdata), * void (*destroy_cb)(dictionary_elem_t *delem, void *privdata),
* void *privdata); * void *privdata);
* *
@ -473,13 +469,13 @@ void irc_dictionary_destroy(struct Dictionary *dtree,
* Side Effects: * Side Effects:
* - on success, a dtree is iterated * - on success, a dtree is iterated
*/ */
void irc_dictionary_foreach(struct Dictionary *dtree, void rb_dictionary_foreach(struct Dictionary *dtree,
int (*foreach_cb)(struct DictionaryElement *delem, void *privdata), int (*foreach_cb)(struct DictionaryElement *delem, void *privdata),
void *privdata) void *privdata)
{ {
struct DictionaryElement *n, *tn; struct DictionaryElement *n, *tn;
s_assert(dtree != NULL); lrb_assert(dtree != NULL);
RB_DLINK_FOREACH_SAFE(n, tn, dtree->head) RB_DLINK_FOREACH_SAFE(n, tn, dtree->head)
{ {
@ -492,7 +488,7 @@ void irc_dictionary_foreach(struct Dictionary *dtree,
} }
/* /*
* irc_dictionary_search(struct Dictionary *dtree, * rb_dictionary_search(struct Dictionary *dtree,
* void (*destroy_cb)(struct DictionaryElement *delem, void *privdata), * void (*destroy_cb)(struct DictionaryElement *delem, void *privdata),
* void *privdata); * void *privdata);
* *
@ -510,14 +506,14 @@ void irc_dictionary_foreach(struct Dictionary *dtree,
* Side Effects: * Side Effects:
* - a dtree is iterated until the requested conditions are met * - a dtree is iterated until the requested conditions are met
*/ */
void *irc_dictionary_search(struct Dictionary *dtree, void *rb_dictionary_search(struct Dictionary *dtree,
void *(*foreach_cb)(struct DictionaryElement *delem, void *privdata), void *(*foreach_cb)(struct DictionaryElement *delem, void *privdata),
void *privdata) void *privdata)
{ {
struct DictionaryElement *n, *tn; struct DictionaryElement *n, *tn;
void *ret = NULL; void *ret = NULL;
s_assert(dtree != NULL); lrb_assert(dtree != NULL);
RB_DLINK_FOREACH_SAFE(n, tn, dtree->head) RB_DLINK_FOREACH_SAFE(n, tn, dtree->head)
{ {
@ -535,7 +531,7 @@ void *irc_dictionary_search(struct Dictionary *dtree,
} }
/* /*
* irc_dictionary_foreach_start(struct Dictionary *dtree, * rb_dictionary_foreach_start(struct Dictionary *dtree,
* struct DictionaryIter *state); * struct DictionaryIter *state);
* *
* Initializes a static DTree iterator. * Initializes a static DTree iterator.
@ -550,11 +546,11 @@ void *irc_dictionary_search(struct Dictionary *dtree,
* Side Effects: * Side Effects:
* - the static iterator, &state, is initialized. * - the static iterator, &state, is initialized.
*/ */
void irc_dictionary_foreach_start(struct Dictionary *dtree, void rb_dictionary_foreach_start(struct Dictionary *dtree,
struct DictionaryIter *state) struct DictionaryIter *state)
{ {
s_assert(dtree != NULL); lrb_assert(dtree != NULL);
s_assert(state != NULL); lrb_assert(state != NULL);
state->cur = NULL; state->cur = NULL;
state->next = NULL; state->next = NULL;
@ -568,11 +564,11 @@ void irc_dictionary_foreach_start(struct Dictionary *dtree,
/* make state->cur point to first item and state->next point to /* make state->cur point to first item and state->next point to
* second item */ * second item */
state->next = state->cur; state->next = state->cur;
irc_dictionary_foreach_next(dtree, state); rb_dictionary_foreach_next(dtree, state);
} }
/* /*
* irc_dictionary_foreach_cur(struct Dictionary *dtree, * rb_dictionary_foreach_cur(struct Dictionary *dtree,
* struct DictionaryIter *state); * struct DictionaryIter *state);
* *
* Returns the data from the current node being iterated by the * Returns the data from the current node being iterated by the
@ -588,17 +584,17 @@ void irc_dictionary_foreach_start(struct Dictionary *dtree,
* Side Effects: * Side Effects:
* - none * - none
*/ */
void *irc_dictionary_foreach_cur(struct Dictionary *dtree, void *rb_dictionary_foreach_cur(struct Dictionary *dtree,
struct DictionaryIter *state) struct DictionaryIter *state)
{ {
s_assert(dtree != NULL); lrb_assert(dtree != NULL);
s_assert(state != NULL); lrb_assert(state != NULL);
return state->cur != NULL ? state->cur->data : NULL; return state->cur != NULL ? state->cur->data : NULL;
} }
/* /*
* irc_dictionary_foreach_next(struct Dictionary *dtree, * rb_dictionary_foreach_next(struct Dictionary *dtree,
* struct DictionaryIter *state); * struct DictionaryIter *state);
* *
* Advances a static DTree iterator. * Advances a static DTree iterator.
@ -613,15 +609,15 @@ void *irc_dictionary_foreach_cur(struct Dictionary *dtree,
* Side Effects: * Side Effects:
* - the static iterator, &state, is advanced to a new DTree node. * - the static iterator, &state, is advanced to a new DTree node.
*/ */
void irc_dictionary_foreach_next(struct Dictionary *dtree, void rb_dictionary_foreach_next(struct Dictionary *dtree,
struct DictionaryIter *state) struct DictionaryIter *state)
{ {
s_assert(dtree != NULL); lrb_assert(dtree != NULL);
s_assert(state != NULL); lrb_assert(state != NULL);
if (state->cur == NULL) if (state->cur == NULL)
{ {
ilog(L_MAIN, "irc_dictionary_foreach_next(): called again after iteration finished on dtree<%p>", (void *)dtree); rb_lib_log("rb_dictionary_foreach_next(): called again after iteration finished on dtree<%p>", (void *)dtree);
return; return;
} }
@ -634,7 +630,7 @@ void irc_dictionary_foreach_next(struct Dictionary *dtree,
} }
/* /*
* irc_dictionary_find(struct Dictionary *dtree, const void *key) * rb_dictionary_find(struct Dictionary *dtree, const void *key)
* *
* Looks up a DTree node by name. * Looks up a DTree node by name.
* *
@ -649,13 +645,13 @@ void irc_dictionary_foreach_next(struct Dictionary *dtree,
* Side Effects: * Side Effects:
* - none * - none
*/ */
struct DictionaryElement *irc_dictionary_find(struct Dictionary *dict, const void *key) struct DictionaryElement *rb_dictionary_find(struct Dictionary *dict, const void *key)
{ {
s_assert(dict != NULL); lrb_assert(dict != NULL);
s_assert(key != NULL); lrb_assert(key != NULL);
/* retune for key, key will be the tree's root if it's available */ /* retune for key, key will be the tree's root if it's available */
irc_dictionary_retune(dict, key); rb_dictionary_retune(dict, key);
if (dict->root && !dict->compare_cb(key, dict->root->key)) if (dict->root && !dict->compare_cb(key, dict->root->key))
return dict->root; return dict->root;
@ -664,7 +660,7 @@ struct DictionaryElement *irc_dictionary_find(struct Dictionary *dict, const voi
} }
/* /*
* irc_dictionary_add(struct Dictionary *dtree, const void *key, void *data) * rb_dictionary_add(struct Dictionary *dtree, const void *key, void *data)
* *
* Creates a new DTree node and binds data to it. * Creates a new DTree node and binds data to it.
* *
@ -680,26 +676,26 @@ struct DictionaryElement *irc_dictionary_find(struct Dictionary *dict, const voi
* Side Effects: * Side Effects:
* - data is inserted into the DTree. * - data is inserted into the DTree.
*/ */
struct DictionaryElement *irc_dictionary_add(struct Dictionary *dict, const void *key, void *data) struct DictionaryElement *rb_dictionary_add(struct Dictionary *dict, const void *key, void *data)
{ {
struct DictionaryElement *delem; struct DictionaryElement *delem;
s_assert(dict != NULL); lrb_assert(dict != NULL);
s_assert(key != NULL); lrb_assert(key != NULL);
s_assert(data != NULL); lrb_assert(data != NULL);
s_assert(irc_dictionary_find(dict, key) == NULL); lrb_assert(rb_dictionary_find(dict, key) == NULL);
delem = rb_malloc(sizeof(*delem)); delem = rb_malloc(sizeof(*delem));
delem->key = key; delem->key = key;
delem->data = data; delem->data = data;
irc_dictionary_link(dict, delem); rb_dictionary_link(dict, delem);
return delem; return delem;
} }
/* /*
* irc_dictionary_delete(struct Dictionary *dtree, const void *key) * rb_dictionary_delete(struct Dictionary *dtree, const void *key)
* *
* Deletes data from a dictionary tree. * Deletes data from a dictionary tree.
* *
@ -717,9 +713,9 @@ struct DictionaryElement *irc_dictionary_add(struct Dictionary *dict, const void
* Notes: * Notes:
* - the returned data needs to be mowgli_freed/released manually! * - the returned data needs to be mowgli_freed/released manually!
*/ */
void *irc_dictionary_delete(struct Dictionary *dtree, const void *key) void *rb_dictionary_delete(struct Dictionary *dtree, const void *key)
{ {
struct DictionaryElement *delem = irc_dictionary_find(dtree, key); struct DictionaryElement *delem = rb_dictionary_find(dtree, key);
void *data; void *data;
if (delem == NULL) if (delem == NULL)
@ -727,14 +723,14 @@ void *irc_dictionary_delete(struct Dictionary *dtree, const void *key)
data = delem->data; data = delem->data;
irc_dictionary_unlink_root(dtree); rb_dictionary_unlink_root(dtree);
rb_free(delem); rb_free(delem);
return data; return data;
} }
/* /*
* irc_dictionary_retrieve(struct Dictionary *dtree, const void *key) * rb_dictionary_retrieve(struct Dictionary *dtree, const void *key)
* *
* Retrieves data from a dictionary. * Retrieves data from a dictionary.
* *
@ -749,9 +745,9 @@ void *irc_dictionary_delete(struct Dictionary *dtree, const void *key)
* Side Effects: * Side Effects:
* - none * - none
*/ */
void *irc_dictionary_retrieve(struct Dictionary *dtree, const void *key) void *rb_dictionary_retrieve(struct Dictionary *dtree, const void *key)
{ {
struct DictionaryElement *delem = irc_dictionary_find(dtree, key); struct DictionaryElement *delem = rb_dictionary_find(dtree, key);
if (delem != NULL) if (delem != NULL)
return delem->data; return delem->data;
@ -760,7 +756,7 @@ void *irc_dictionary_retrieve(struct Dictionary *dtree, const void *key)
} }
/* /*
* irc_dictionary_size(struct Dictionary *dict) * rb_dictionary_size(struct Dictionary *dict)
* *
* Returns the size of a dictionary. * Returns the size of a dictionary.
* *
@ -773,9 +769,9 @@ void *irc_dictionary_retrieve(struct Dictionary *dtree, const void *key)
* Side Effects: * Side Effects:
* - none * - none
*/ */
unsigned int irc_dictionary_size(struct Dictionary *dict) unsigned int rb_dictionary_size(struct Dictionary *dict)
{ {
s_assert(dict != NULL); lrb_assert(dict != NULL);
return dict->count; return dict->count;
} }
@ -797,7 +793,7 @@ stats_recurse(struct DictionaryElement *delem, int depth, int *pmaxdepth)
} }
/* /*
* irc_dictionary_stats(struct Dictionary *dict, void (*cb)(const char *line, void *privdata), void *privdata) * rb_dictionary_stats(struct Dictionary *dict, void (*cb)(const char *line, void *privdata), void *privdata)
* *
* Returns the size of a dictionary. * Returns the size of a dictionary.
* *
@ -812,12 +808,12 @@ stats_recurse(struct DictionaryElement *delem, int depth, int *pmaxdepth)
* Side Effects: * Side Effects:
* - callback called with stats text * - callback called with stats text
*/ */
void irc_dictionary_stats(struct Dictionary *dict, void (*cb)(const char *line, void *privdata), void *privdata) void rb_dictionary_stats(struct Dictionary *dict, void (*cb)(const char *line, void *privdata), void *privdata)
{ {
char str[256]; char str[256];
int sum, maxdepth; int sum, maxdepth;
s_assert(dict != NULL); lrb_assert(dict != NULL);
if (dict->count) if (dict->count)
{ {
@ -833,12 +829,12 @@ void irc_dictionary_stats(struct Dictionary *dict, void (*cb)(const char *line,
cb(str, privdata); cb(str, privdata);
} }
void irc_dictionary_stats_walk(void (*cb)(const char *line, void *privdata), void *privdata) void rb_dictionary_stats_walk(void (*cb)(const char *line, void *privdata), void *privdata)
{ {
rb_dlink_node *ptr; rb_dlink_node *ptr;
RB_DLINK_FOREACH(ptr, dictionary_list.head) RB_DLINK_FOREACH(ptr, dictionary_list.head)
{ {
irc_dictionary_stats(ptr->data, cb, privdata); rb_dictionary_stats(ptr->data, cb, privdata);
} }
} }

View file

@ -1,3 +1,9 @@
make_and_lookup
make_and_lookup_ip
rb_accept_tcp
rb_base64_decode
rb_base64_encode
rb_basename
rb_bh_alloc rb_bh_alloc
rb_bh_create rb_bh_create
rb_bh_destroy rb_bh_destroy
@ -5,57 +11,35 @@ rb_bh_free
rb_bh_total_usage rb_bh_total_usage
rb_bh_usage rb_bh_usage
rb_bh_usage_all rb_bh_usage_all
rb_init_bh
rb_accept_tcp
rb_checktimeouts rb_checktimeouts
rb_clear_patricia
rb_close rb_close
rb_connect_sockaddr rb_connect_sockaddr
rb_connect_tcp rb_connect_tcp
rb_connect_tcp_ssl rb_connect_tcp_ssl
rb_count_rb_linebuf_memory
rb_crypt
rb_ctime
rb_current_time
rb_current_time_tv
rb_date
rb_destroy_patricia
rb_dictionary_add
rb_dictionary_create
rb_dictionary_delete
rb_dictionary_destroy
rb_dictionary_find
rb_dictionary_foreach_cur
rb_dictionary_foreach_next
rb_dictionary_foreach_start
rb_dictionary_retrieve
rb_dictionary_size
rb_dictionary_stats
rb_dictionary_stats_walk
rb_dirname
rb_dump_events
rb_dump_fd rb_dump_fd
rb_errstr rb_errstr
rb_fd_ssl
rb_fdlist_init
rb_get_fd
rb_get_fde
rb_get_iotype
rb_get_random
rb_get_sockerr
rb_get_ssl_certfp
rb_get_ssl_strerror
rb_get_type
rb_getmaxconnect
rb_ignore_errno
rb_inet_ntop
rb_inet_ntop_sock
rb_inet_pton
rb_inet_pton_sock
rb_init_netio
rb_init_prng
rb_listen
rb_note
rb_open
rb_pipe
rb_read
rb_recv_fd_buf
rb_select
rb_send_fd_buf
rb_set_buffers
rb_set_nb
rb_set_type
rb_setselect
rb_settimeout
rb_setup_fd
rb_setup_ssl_server
rb_socket
rb_socketpair
rb_ssl_listen
rb_ssl_start_accepted
rb_ssl_start_connected
rb_write
rb_writev
rb_crypt
rb_dump_events
rb_event_add rb_event_add
rb_event_addish rb_event_addish
rb_event_addonce rb_event_addonce
@ -65,7 +49,21 @@ rb_event_init
rb_event_next rb_event_next
rb_event_run rb_event_run
rb_event_update rb_event_update
rb_run_event rb_fdlist_init
rb_fd_ssl
rb_free_rawbuffer
rb_free_rb_dlink_node
rb_get_fd
rb_get_fde
rb_get_iotype
rb_getmaxconnect
rb_getpid
rb_get_random
rb_get_sockerr
rb_get_ssl_certfp
rb_get_ssl_strerror
rb_gettimeofday
rb_get_type
rb_helper_child rb_helper_child
rb_helper_close rb_helper_close
rb_helper_loop rb_helper_loop
@ -75,7 +73,24 @@ rb_helper_run
rb_helper_start rb_helper_start
rb_helper_write rb_helper_write
rb_helper_write_queue rb_helper_write_queue
rb_count_rb_linebuf_memory rb_ignore_errno
rb_inet_ntop
rb_inet_ntop_sock
rb_inet_pton
rb_inet_pton_sock
rb_init_bh
rb_init_netio
rb_init_patricia
rb_init_prng
rb_init_rawbuffers
rb_init_rb_dlink_nodes
rb_kill
rb_lib_die
rb_lib_init
rb_lib_log
rb_lib_loop
rb_lib_restart
rb_lib_version
rb_linebuf_attach rb_linebuf_attach
rb_linebuf_donebuf rb_linebuf_donebuf
rb_linebuf_flush rb_linebuf_flush
@ -87,66 +102,80 @@ rb_linebuf_put
rb_linebuf_putbuf rb_linebuf_putbuf
rb_linebuf_putmsg rb_linebuf_putmsg
rb_linebuf_putprefix rb_linebuf_putprefix
make_and_lookup rb_listen
make_and_lookup_ip rb_make_rb_dlink_node
rb_clear_patricia
rb_destroy_patricia
rb_init_patricia
rb_match_exact_string rb_match_exact_string
rb_match_ip rb_match_ip
rb_match_ip_exact rb_match_ip_exact
rb_match_string rb_match_string
rb_new_patricia rb_new_patricia
rb_new_rawbuffer
rb_note
rb_open
rb_outofmemory
rb_patricia_lookup rb_patricia_lookup
rb_patricia_process rb_patricia_process
rb_patricia_remove rb_patricia_remove
rb_patricia_search_best rb_patricia_search_best
rb_patricia_search_best2 rb_patricia_search_best2
rb_patricia_search_exact rb_patricia_search_exact
rb_base64_decode rb_pipe
rb_base64_encode rb_radixtree_add
rb_ctime rb_radixtree_create
rb_current_time rb_radixtree_delete
rb_current_time_tv rb_radixtree_elem_add
rb_date rb_radixtree_elem_delete
rb_lib_die rb_radixtree_elem_find
rb_lib_init rb_radixtree_elem_get_data
rb_lib_log rb_radixtree_elem_get_key
rb_lib_loop rb_radixtree_elem_set_data
rb_lib_restart rb_radixtree_foreach_cur
rb_lib_version rb_radixtree_foreach_next
rb_set_time rb_radixtree_foreach_start
rb_strtok_r rb_radixtree_foreach_start_from
rb_free_rawbuffer rb_radixtree_retrieve
rb_init_rawbuffers rb_radixtree_size
rb_new_rawbuffer rb_radixtree_stats
rb_radixtree_stats_walk
rb_rawbuf_append rb_rawbuf_append
rb_rawbuf_flush rb_rawbuf_flush
rb_rawbuf_get rb_rawbuf_get
rb_rawbuf_length rb_rawbuf_length
rb_outofmemory rb_read
rb_recv_fd_buf
rb_run_event
rb_select
rb_send_fd_buf
rb_set_buffers
rb_setenv
rb_set_nb
rb_setselect
rb_set_time
rb_settimeout
rb_set_type
rb_setup_fd
rb_setup_ssl_server
rb_sleep
rb_snprintf_append rb_snprintf_append
rb_free_rb_dlink_node rb_socket
rb_init_rb_dlink_nodes rb_socketpair
rb_make_rb_dlink_node rb_spawn_process
rb_ssl_clear_handshake_count
rb_ssl_get_cipher
rb_ssl_handshake_count
rb_ssl_listen
rb_ssl_start_accepted
rb_ssl_start_connected
rb_strerror
rb_string_to_array rb_string_to_array
rb_strlcat rb_strlcat
rb_strlcpy rb_strlcpy
rb_strnlen rb_strnlen
rb_gettimeofday rb_strtok_r
rb_sleep
rb_spawn_process
rb_supports_ssl rb_supports_ssl
rb_ssl_handshake_count
rb_ssl_clear_handshake_count
rb_strerror
rb_kill
rb_setenv
rb_getpid
rb_waitpid rb_waitpid
rb_basename rb_write
rb_dirname rb_writev
rb_ssl_get_cipher
rb_zstring_alloc rb_zstring_alloc
rb_zstring_append_from_c rb_zstring_append_from_c
rb_zstring_append_from_zstring rb_zstring_append_from_zstring

View file

@ -1,6 +1,6 @@
/* /*
* charybdis: an advanced ircd. * charybdis: an advanced ircd.
* irc_radixtree.c: Dictionary-based information storage. * rb_radixtree.c: Dictionary-based information storage.
* *
* Copyright (c) 2007-2016 William Pitcock <nenolod -at- dereferenced.org> * Copyright (c) 2007-2016 William Pitcock <nenolod -at- dereferenced.org>
* Copyright (c) 2007-2016 Jilles Tjoelker <jilles -at- stack.nl> * Copyright (c) 2007-2016 Jilles Tjoelker <jilles -at- stack.nl>
@ -32,10 +32,9 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "stdinc.h" #include <librb_config.h>
#include "s_assert.h" #include <rb_lib.h>
#include "match.h" #include <rb_radixtree.h>
#include "irc_radixtree.h"
rb_dlink_list radixtree_list = {NULL, NULL, 0}; rb_dlink_list radixtree_list = {NULL, NULL, 0};
@ -53,12 +52,12 @@ rb_dlink_list radixtree_list = {NULL, NULL, 0};
* -- jilles * -- jilles
*/ */
union irc_radixtree_elem; union rb_radixtree_elem;
struct irc_radixtree struct rb_radixtree
{ {
void (*canonize_cb)(char *key); void (*canonize_cb)(char *key);
union irc_radixtree_elem *root; union rb_radixtree_elem *root;
unsigned int count; unsigned int count;
char *id; char *id;
@ -69,19 +68,19 @@ struct irc_radixtree
#define POINTERS_PER_NODE 16 #define POINTERS_PER_NODE 16
#define NIBBLE_VAL(key, nibnum) (((key)[(nibnum) / 2] >> ((nibnum) & 1 ? 0 : 4)) & 0xF) #define NIBBLE_VAL(key, nibnum) (((key)[(nibnum) / 2] >> ((nibnum) & 1 ? 0 : 4)) & 0xF)
struct irc_radixtree_node struct rb_radixtree_node
{ {
/* nibble to test (nibble NUM%2 of byte NUM/2) */ /* nibble to test (nibble NUM%2 of byte NUM/2) */
int nibnum; int nibnum;
/* branches of the tree */ /* branches of the tree */
union irc_radixtree_elem *down[POINTERS_PER_NODE]; union rb_radixtree_elem *down[POINTERS_PER_NODE];
union irc_radixtree_elem *parent; union rb_radixtree_elem *parent;
char parent_val; char parent_val;
}; };
struct irc_radixtree_leaf struct rb_radixtree_leaf
{ {
/* -1 to indicate this is a leaf, not a node */ /* -1 to indicate this is a leaf, not a node */
int nibnum; int nibnum;
@ -91,17 +90,17 @@ struct irc_radixtree_leaf
/* key (canonized copy) */ /* key (canonized copy) */
char *key; char *key;
union irc_radixtree_elem *parent; union rb_radixtree_elem *parent;
char parent_val; char parent_val;
}; };
union irc_radixtree_elem union rb_radixtree_elem
{ {
int nibnum; int nibnum;
struct irc_radixtree_node node; struct rb_radixtree_node node;
struct irc_radixtree_leaf leaf; struct rb_radixtree_leaf leaf;
}; };
#define IS_LEAF(elem) ((elem)->nibnum == -1) #define IS_LEAF(elem) ((elem)->nibnum == -1)
@ -124,8 +123,8 @@ union irc_radixtree_elem
* Side Effects: * Side Effects:
* - none * - none
*/ */
static union irc_radixtree_elem * static union rb_radixtree_elem *
first_leaf(union irc_radixtree_elem *delem) first_leaf(union rb_radixtree_elem *delem)
{ {
int val; int val;
@ -143,7 +142,7 @@ first_leaf(union irc_radixtree_elem *delem)
} }
/* /*
* irc_radixtree_create_named(const char *name, * rb_radixtree_create_named(const char *name,
* void (*canonize_cb)(char *key)) * void (*canonize_cb)(char *key))
* *
* Dictionary object factory. * Dictionary object factory.
@ -161,10 +160,10 @@ first_leaf(union irc_radixtree_elem *delem)
* - if services runs out of memory and cannot allocate the object, * - if services runs out of memory and cannot allocate the object,
* the program will abort. * the program will abort.
*/ */
struct irc_radixtree * struct rb_radixtree *
irc_radixtree_create(const char *name, void (*canonize_cb)(char *key)) rb_radixtree_create(const char *name, void (*canonize_cb)(char *key))
{ {
struct irc_radixtree *dtree = (struct irc_radixtree *) rb_malloc(sizeof(struct irc_radixtree)); struct rb_radixtree *dtree = (struct rb_radixtree *) rb_malloc(sizeof(struct rb_radixtree));
dtree->canonize_cb = canonize_cb; dtree->canonize_cb = canonize_cb;
dtree->id = rb_strdup(name); dtree->id = rb_strdup(name);
@ -176,7 +175,7 @@ irc_radixtree_create(const char *name, void (*canonize_cb)(char *key))
} }
/* /*
* irc_radixtree_destroy(struct irc_radixtree *dtree, * rb_radixtree_destroy(struct rb_radixtree *dtree,
* void (*destroy_cb)(const char *key, void *data, void *privdata), * void (*destroy_cb)(const char *key, void *data, void *privdata),
* void *privdata); * void *privdata);
* *
@ -198,16 +197,16 @@ irc_radixtree_create(const char *name, void (*canonize_cb)(char *key))
* DTree will not be destroyed. * DTree will not be destroyed.
*/ */
void void
irc_radixtree_destroy(struct irc_radixtree *dtree, void (*destroy_cb)(const char *key, void *data, void *privdata), void *privdata) rb_radixtree_destroy(struct rb_radixtree *dtree, void (*destroy_cb)(const char *key, void *data, void *privdata), void *privdata)
{ {
struct irc_radixtree_iteration_state state; struct rb_radixtree_iteration_state state;
union irc_radixtree_elem *delem; union rb_radixtree_elem *delem;
void *entry; void *entry;
s_assert(dtree != NULL); lrb_assert(dtree != NULL);
IRC_RADIXTREE_FOREACH(entry, &state, dtree) RB_RADIXTREE_FOREACH(entry, &state, dtree)
{ {
delem = STATE_CUR(&state); delem = STATE_CUR(&state);
@ -215,7 +214,7 @@ irc_radixtree_destroy(struct irc_radixtree *dtree, void (*destroy_cb)(const char
(*destroy_cb)(delem->leaf.key, delem->leaf.data, (*destroy_cb)(delem->leaf.key, delem->leaf.data,
privdata); privdata);
irc_radixtree_delete(dtree, delem->leaf.key); rb_radixtree_delete(dtree, delem->leaf.key);
} }
rb_dlinkDelete(&dtree->node, &radixtree_list); rb_dlinkDelete(&dtree->node, &radixtree_list);
@ -224,7 +223,7 @@ irc_radixtree_destroy(struct irc_radixtree *dtree, void (*destroy_cb)(const char
} }
/* /*
* irc_radixtree_foreach(struct irc_radixtree *dtree, * rb_radixtree_foreach(struct rb_radixtree *dtree,
* int (*foreach_cb)(const char *key, void *data, void *privdata), * int (*foreach_cb)(const char *key, void *data, void *privdata),
* void *privdata); * void *privdata);
* *
@ -242,13 +241,13 @@ irc_radixtree_destroy(struct irc_radixtree *dtree, void (*destroy_cb)(const char
* - on success, a dtree is iterated * - on success, a dtree is iterated
*/ */
void void
irc_radixtree_foreach(struct irc_radixtree *dtree, int (*foreach_cb)(const char *key, void *data, void *privdata), void *privdata) rb_radixtree_foreach(struct rb_radixtree *dtree, int (*foreach_cb)(const char *key, void *data, void *privdata), void *privdata)
{ {
union irc_radixtree_elem *delem, *next; union rb_radixtree_elem *delem, *next;
int val; int val;
s_assert(dtree != NULL); lrb_assert(dtree != NULL);
delem = dtree->root; delem = dtree->root;
@ -300,7 +299,7 @@ irc_radixtree_foreach(struct irc_radixtree *dtree, int (*foreach_cb)(const char
} }
/* /*
* irc_radixtree_search(struct irc_radixtree *dtree, * rb_radixtree_search(struct rb_radixtree *dtree,
* void *(*foreach_cb)(const char *key, void *data, void *privdata), * void *(*foreach_cb)(const char *key, void *data, void *privdata),
* void *privdata); * void *privdata);
* *
@ -319,14 +318,14 @@ irc_radixtree_foreach(struct irc_radixtree *dtree, int (*foreach_cb)(const char
* - a dtree is iterated until the requested conditions are met * - a dtree is iterated until the requested conditions are met
*/ */
void * void *
irc_radixtree_search(struct irc_radixtree *dtree, void *(*foreach_cb)(const char *key, void *data, void *privdata), void *privdata) rb_radixtree_search(struct rb_radixtree *dtree, void *(*foreach_cb)(const char *key, void *data, void *privdata), void *privdata)
{ {
union irc_radixtree_elem *delem, *next; union rb_radixtree_elem *delem, *next;
int val; int val;
void *ret = NULL; void *ret = NULL;
s_assert(dtree != NULL); lrb_assert(dtree != NULL);
delem = dtree->root; delem = dtree->root;
@ -383,8 +382,8 @@ irc_radixtree_search(struct irc_radixtree *dtree, void *(*foreach_cb)(const char
} }
/* /*
* irc_radixtree_foreach_start(struct irc_radixtree *dtree, * rb_radixtree_foreach_start(struct rb_radixtree *dtree,
* struct irc_radixtree_iteration_state *state); * struct rb_radixtree_iteration_state *state);
* *
* Initializes a static DTree iterator. * Initializes a static DTree iterator.
* *
@ -399,12 +398,12 @@ irc_radixtree_search(struct irc_radixtree *dtree, void *(*foreach_cb)(const char
* - the static iterator, &state, is initialized. * - the static iterator, &state, is initialized.
*/ */
void void
irc_radixtree_foreach_start(struct irc_radixtree *dtree, struct irc_radixtree_iteration_state *state) rb_radixtree_foreach_start(struct rb_radixtree *dtree, struct rb_radixtree_iteration_state *state)
{ {
if (dtree == NULL) if (dtree == NULL)
return; return;
s_assert(state != NULL); lrb_assert(state != NULL);
if (dtree->root != NULL) if (dtree->root != NULL)
STATE_NEXT(state) = first_leaf(dtree->root); STATE_NEXT(state) = first_leaf(dtree->root);
@ -418,12 +417,12 @@ irc_radixtree_foreach_start(struct irc_radixtree *dtree, struct irc_radixtree_it
/* make STATE_CUR point to first item and STATE_NEXT point to /* make STATE_CUR point to first item and STATE_NEXT point to
* second item */ * second item */
irc_radixtree_foreach_next(dtree, state); rb_radixtree_foreach_next(dtree, state);
} }
/* /*
* irc_radixtree_foreach_cur(struct irc_radixtree *dtree, * rb_radixtree_foreach_cur(struct rb_radixtree *dtree,
* struct irc_radixtree_iteration_state *state); * struct rb_radixtree_iteration_state *state);
* *
* Returns the data from the current node being iterated by the * Returns the data from the current node being iterated by the
* static iterator. * static iterator.
@ -439,20 +438,20 @@ irc_radixtree_foreach_start(struct irc_radixtree *dtree, struct irc_radixtree_it
* - none * - none
*/ */
void * void *
irc_radixtree_foreach_cur(struct irc_radixtree *dtree, struct irc_radixtree_iteration_state *state) rb_radixtree_foreach_cur(struct rb_radixtree *dtree, struct rb_radixtree_iteration_state *state)
{ {
if (dtree == NULL) if (dtree == NULL)
return NULL; return NULL;
s_assert(state != NULL); lrb_assert(state != NULL);
return STATE_CUR(state) != NULL ? return STATE_CUR(state) != NULL ?
((struct irc_radixtree_leaf *) STATE_CUR(state))->data : NULL; ((struct rb_radixtree_leaf *) STATE_CUR(state))->data : NULL;
} }
/* /*
* irc_radixtree_foreach_next(struct irc_radixtree *dtree, * rb_radixtree_foreach_next(struct rb_radixtree *dtree,
* struct irc_radixtree_iteration_state *state); * struct rb_radixtree_iteration_state *state);
* *
* Advances a static DTree iterator. * Advances a static DTree iterator.
* *
@ -467,18 +466,18 @@ irc_radixtree_foreach_cur(struct irc_radixtree *dtree, struct irc_radixtree_iter
* - the static iterator, &state, is advanced to a new DTree node. * - the static iterator, &state, is advanced to a new DTree node.
*/ */
void void
irc_radixtree_foreach_next(struct irc_radixtree *dtree, struct irc_radixtree_iteration_state *state) rb_radixtree_foreach_next(struct rb_radixtree *dtree, struct rb_radixtree_iteration_state *state)
{ {
struct irc_radixtree_leaf *leaf; struct rb_radixtree_leaf *leaf;
union irc_radixtree_elem *delem, *next; union rb_radixtree_elem *delem, *next;
int val; int val;
if (dtree == NULL) if (dtree == NULL)
return; return;
s_assert(state != NULL); lrb_assert(state != NULL);
if (STATE_CUR(state) == NULL) if (STATE_CUR(state) == NULL)
return; return;
@ -538,7 +537,7 @@ irc_radixtree_foreach_next(struct irc_radixtree *dtree, struct irc_radixtree_ite
} }
/* /*
* irc_radixtree_elem_find(struct irc_radixtree *dtree, const char *key) * rb_radixtree_elem_find(struct rb_radixtree *dtree, const char *key)
* *
* Looks up a DTree node by name. * Looks up a DTree node by name.
* *
@ -554,19 +553,19 @@ irc_radixtree_foreach_next(struct irc_radixtree *dtree, struct irc_radixtree_ite
* Side Effects: * Side Effects:
* - none * - none
*/ */
struct irc_radixtree_leaf * struct rb_radixtree_leaf *
irc_radixtree_elem_find(struct irc_radixtree *dict, const char *key, int fuzzy) rb_radixtree_elem_find(struct rb_radixtree *dict, const char *key, int fuzzy)
{ {
char ckey_store[256]; char ckey_store[256];
char *ckey_buf = NULL; char *ckey_buf = NULL;
const char *ckey; const char *ckey;
union irc_radixtree_elem *delem; union rb_radixtree_elem *delem;
int val, keylen; int val, keylen;
s_assert(dict != NULL); lrb_assert(dict != NULL);
s_assert(key != NULL); lrb_assert(key != NULL);
keylen = strlen(key); keylen = strlen(key);
@ -613,9 +612,9 @@ irc_radixtree_elem_find(struct irc_radixtree *dict, const char *key, int fuzzy)
} }
/* /*
* irc_radixtree_foreach_start_from(struct irc_radixtree *dtree, struct irc_radixtree_iteration_state *state, const char *key) * rb_radixtree_foreach_start_from(struct rb_radixtree *dtree, struct rb_radixtree_iteration_state *state, const char *key)
* *
* Starts iteration from a specified key, by wrapping irc_radixtree_elem_find(). * Starts iteration from a specified key, by wrapping rb_radixtree_elem_find().
* *
* Inputs: * Inputs:
* - patricia tree object * - patricia tree object
@ -629,26 +628,26 @@ irc_radixtree_elem_find(struct irc_radixtree *dict, const char *key, int fuzzy)
* - the iterator's state is initialized at a specific point * - the iterator's state is initialized at a specific point
*/ */
void void
irc_radixtree_foreach_start_from(struct irc_radixtree *dtree, struct irc_radixtree_iteration_state *state, const char *key) rb_radixtree_foreach_start_from(struct rb_radixtree *dtree, struct rb_radixtree_iteration_state *state, const char *key)
{ {
s_assert(dtree != NULL); lrb_assert(dtree != NULL);
s_assert(state != NULL); lrb_assert(state != NULL);
if (key != NULL) if (key != NULL)
{ {
STATE_CUR(state) = NULL; STATE_CUR(state) = NULL;
STATE_NEXT(state) = irc_radixtree_elem_find(dtree, key, 1); STATE_NEXT(state) = rb_radixtree_elem_find(dtree, key, 1);
/* make STATE_CUR point to selected item and STATE_NEXT point to /* make STATE_CUR point to selected item and STATE_NEXT point to
* next item in the tree */ * next item in the tree */
irc_radixtree_foreach_next(dtree, state); rb_radixtree_foreach_next(dtree, state);
} }
else else
irc_radixtree_foreach_start(dtree, state); rb_radixtree_foreach_start(dtree, state);
} }
/* /*
* irc_radixtree_add(struct irc_radixtree *dtree, const char *key, void *data) * rb_radixtree_add(struct rb_radixtree *dtree, const char *key, void *data)
* *
* Creates a new DTree node and binds data to it. * Creates a new DTree node and binds data to it.
* *
@ -664,21 +663,21 @@ irc_radixtree_foreach_start_from(struct irc_radixtree *dtree, struct irc_radixtr
* Side Effects: * Side Effects:
* - data is inserted into the DTree. * - data is inserted into the DTree.
*/ */
struct irc_radixtree_leaf * struct rb_radixtree_leaf *
irc_radixtree_elem_add(struct irc_radixtree *dict, const char *key, void *data) rb_radixtree_elem_add(struct rb_radixtree *dict, const char *key, void *data)
{ {
char *ckey; char *ckey;
union irc_radixtree_elem *delem, *prev, *newnode; union rb_radixtree_elem *delem, *prev, *newnode;
union irc_radixtree_elem **place1; union rb_radixtree_elem **place1;
int val, keylen; int val, keylen;
int i, j; int i, j;
s_assert(dict != NULL); lrb_assert(dict != NULL);
s_assert(key != NULL); lrb_assert(key != NULL);
s_assert(data != NULL); lrb_assert(data != NULL);
keylen = strlen(key); keylen = strlen(key);
ckey = rb_strdup(key); ckey = rb_strdup(key);
@ -718,11 +717,11 @@ irc_radixtree_elem_add(struct irc_radixtree *dict, const char *key, void *data)
if (delem == NULL) if (delem == NULL)
{ {
s_assert(prev == NULL); lrb_assert(prev == NULL);
s_assert(dict->count == 0); lrb_assert(dict->count == 0);
place1 = &dict->root; place1 = &dict->root;
*place1 = rb_malloc(sizeof(struct irc_radixtree_leaf)); *place1 = rb_malloc(sizeof(struct rb_radixtree_leaf));
s_assert(*place1 != NULL); lrb_assert(*place1 != NULL);
(*place1)->nibnum = -1; (*place1)->nibnum = -1;
(*place1)->leaf.data = data; (*place1)->leaf.data = data;
(*place1)->leaf.key = ckey; (*place1)->leaf.key = ckey;
@ -746,8 +745,8 @@ irc_radixtree_elem_add(struct irc_radixtree *dict, const char *key, void *data)
if ((prev == NULL) || (prev->nibnum < i)) if ((prev == NULL) || (prev->nibnum < i))
{ {
/* Insert new node below prev */ /* Insert new node below prev */
newnode = rb_malloc(sizeof(struct irc_radixtree_node)); newnode = rb_malloc(sizeof(struct rb_radixtree_node));
s_assert(newnode != NULL); lrb_assert(newnode != NULL);
newnode->nibnum = i; newnode->nibnum = i;
newnode->node.parent = prev; newnode->node.parent = prev;
newnode->node.parent_val = val; newnode->node.parent_val = val;
@ -766,7 +765,7 @@ irc_radixtree_elem_add(struct irc_radixtree *dict, const char *key, void *data)
} }
else else
{ {
s_assert(dict->root->nibnum > i); lrb_assert(dict->root->nibnum > i);
dict->root->node.parent = newnode; dict->root->node.parent = newnode;
dict->root->node.parent_val = NIBBLE_VAL(delem->leaf.key, i); dict->root->node.parent_val = NIBBLE_VAL(delem->leaf.key, i);
} }
@ -794,15 +793,15 @@ irc_radixtree_elem_add(struct irc_radixtree *dict, const char *key, void *data)
else else
{ {
/* This nibble is already checked. */ /* This nibble is already checked. */
s_assert(prev->nibnum == i); lrb_assert(prev->nibnum == i);
newnode = prev; newnode = prev;
} }
val = NIBBLE_VAL(ckey, i); val = NIBBLE_VAL(ckey, i);
place1 = &newnode->node.down[val]; place1 = &newnode->node.down[val];
s_assert(*place1 == NULL); lrb_assert(*place1 == NULL);
*place1 = rb_malloc(sizeof(struct irc_radixtree_leaf)); *place1 = rb_malloc(sizeof(struct rb_radixtree_leaf));
s_assert(*place1 != NULL); lrb_assert(*place1 != NULL);
(*place1)->nibnum = -1; (*place1)->nibnum = -1;
(*place1)->leaf.data = data; (*place1)->leaf.data = data;
(*place1)->leaf.key = ckey; (*place1)->leaf.key = ckey;
@ -813,13 +812,13 @@ irc_radixtree_elem_add(struct irc_radixtree *dict, const char *key, void *data)
} }
int int
irc_radixtree_add(struct irc_radixtree *dict, const char *key, void *data) rb_radixtree_add(struct rb_radixtree *dict, const char *key, void *data)
{ {
return (irc_radixtree_elem_add(dict, key, data) != NULL); return (rb_radixtree_elem_add(dict, key, data) != NULL);
} }
/* /*
* irc_radixtree_delete(struct irc_radixtree *dtree, const char *key) * rb_radixtree_delete(struct rb_radixtree *dtree, const char *key)
* *
* Deletes data from a patricia tree. * Deletes data from a patricia tree.
* *
@ -838,32 +837,32 @@ irc_radixtree_add(struct irc_radixtree *dict, const char *key, void *data)
* - the returned data needs to be rb_freed/released manually! * - the returned data needs to be rb_freed/released manually!
*/ */
void * void *
irc_radixtree_delete(struct irc_radixtree *dict, const char *key) rb_radixtree_delete(struct rb_radixtree *dict, const char *key)
{ {
void *data; void *data;
struct irc_radixtree_leaf *leaf; struct rb_radixtree_leaf *leaf;
leaf = irc_radixtree_elem_find(dict, key, 0); leaf = rb_radixtree_elem_find(dict, key, 0);
if (leaf == NULL) if (leaf == NULL)
return NULL; return NULL;
data = leaf->data; data = leaf->data;
irc_radixtree_elem_delete(dict, leaf); rb_radixtree_elem_delete(dict, leaf);
return data; return data;
} }
void void
irc_radixtree_elem_delete(struct irc_radixtree *dict, struct irc_radixtree_leaf *leaf) rb_radixtree_elem_delete(struct rb_radixtree *dict, struct rb_radixtree_leaf *leaf)
{ {
union irc_radixtree_elem *delem, *prev, *next; union rb_radixtree_elem *delem, *prev, *next;
int val, i, used; int val, i, used;
s_assert(dict != NULL); lrb_assert(dict != NULL);
s_assert(leaf != NULL); lrb_assert(leaf != NULL);
delem = (union irc_radixtree_elem *) leaf; delem = (union rb_radixtree_elem *) leaf;
val = delem->leaf.parent_val; val = delem->leaf.parent_val;
prev = delem->leaf.parent; prev = delem->leaf.parent;
@ -884,7 +883,7 @@ irc_radixtree_elem_delete(struct irc_radixtree *dict, struct irc_radixtree_leaf
if (delem->node.down[i] != NULL) if (delem->node.down[i] != NULL)
used = used == -1 ? i : -2; used = used == -1 ? i : -2;
s_assert(used == -2 || used >= 0); lrb_assert(used == -2 || used >= 0);
if (used >= 0) if (used >= 0)
{ {
@ -919,13 +918,13 @@ irc_radixtree_elem_delete(struct irc_radixtree *dict, struct irc_radixtree_leaf
if (dict->count == 0) if (dict->count == 0)
{ {
s_assert(dict->root == NULL); lrb_assert(dict->root == NULL);
dict->root = NULL; dict->root = NULL;
} }
} }
/* /*
* irc_radixtree_retrieve(struct irc_radixtree *dtree, const char *key) * rb_radixtree_retrieve(struct rb_radixtree *dtree, const char *key)
* *
* Retrieves data from a patricia. * Retrieves data from a patricia.
* *
@ -941,9 +940,9 @@ irc_radixtree_elem_delete(struct irc_radixtree *dict, struct irc_radixtree_leaf
* - none * - none
*/ */
void * void *
irc_radixtree_retrieve(struct irc_radixtree *dtree, const char *key) rb_radixtree_retrieve(struct rb_radixtree *dtree, const char *key)
{ {
struct irc_radixtree_leaf *delem = irc_radixtree_elem_find(dtree, key, 0); struct rb_radixtree_leaf *delem = rb_radixtree_elem_find(dtree, key, 0);
if (delem != NULL) if (delem != NULL)
return delem->data; return delem->data;
@ -952,31 +951,31 @@ irc_radixtree_retrieve(struct irc_radixtree *dtree, const char *key)
} }
const char * const char *
irc_radixtree_elem_get_key(struct irc_radixtree_leaf *leaf) rb_radixtree_elem_get_key(struct rb_radixtree_leaf *leaf)
{ {
s_assert(leaf != NULL); lrb_assert(leaf != NULL);
return leaf->key; return leaf->key;
} }
void void
irc_radixtree_elem_set_data(struct irc_radixtree_leaf *leaf, void *data) rb_radixtree_elem_set_data(struct rb_radixtree_leaf *leaf, void *data)
{ {
s_assert(leaf != NULL); lrb_assert(leaf != NULL);
leaf->data = data; leaf->data = data;
} }
void * void *
irc_radixtree_elem_get_data(struct irc_radixtree_leaf *leaf) rb_radixtree_elem_get_data(struct rb_radixtree_leaf *leaf)
{ {
s_assert(leaf != NULL); lrb_assert(leaf != NULL);
return leaf->data; return leaf->data;
} }
/* /*
* irc_radixtree_size(struct irc_radixtree *dict) * rb_radixtree_size(struct rb_radixtree *dict)
* *
* Returns the size of a patricia. * Returns the size of a patricia.
* *
@ -990,9 +989,9 @@ irc_radixtree_elem_get_data(struct irc_radixtree_leaf *leaf)
* - none * - none
*/ */
unsigned int unsigned int
irc_radixtree_size(struct irc_radixtree *dict) rb_radixtree_size(struct rb_radixtree *dict)
{ {
s_assert(dict != NULL); lrb_assert(dict != NULL);
return dict->count; return dict->count;
} }
@ -1000,11 +999,11 @@ irc_radixtree_size(struct irc_radixtree *dict)
/* returns the sum of the depths of the subtree rooted in delem at depth depth */ /* returns the sum of the depths of the subtree rooted in delem at depth depth */
/* there is no need for this to be recursive, but it is easier... */ /* there is no need for this to be recursive, but it is easier... */
static int static int
stats_recurse(union irc_radixtree_elem *delem, int depth, int *pmaxdepth) stats_recurse(union rb_radixtree_elem *delem, int depth, int *pmaxdepth)
{ {
int result = 0; int result = 0;
int val; int val;
union irc_radixtree_elem *next; union rb_radixtree_elem *next;
if (depth > *pmaxdepth) if (depth > *pmaxdepth)
*pmaxdepth = depth; *pmaxdepth = depth;
@ -1012,10 +1011,10 @@ stats_recurse(union irc_radixtree_elem *delem, int depth, int *pmaxdepth)
if (depth == 0) if (depth == 0)
{ {
if (IS_LEAF(delem)) if (IS_LEAF(delem))
s_assert(delem->leaf.parent == NULL); lrb_assert(delem->leaf.parent == NULL);
else else
s_assert(delem->node.parent == NULL); lrb_assert(delem->node.parent == NULL);
} }
if (IS_LEAF(delem)) if (IS_LEAF(delem))
@ -1032,14 +1031,14 @@ stats_recurse(union irc_radixtree_elem *delem, int depth, int *pmaxdepth)
if (IS_LEAF(next)) if (IS_LEAF(next))
{ {
s_assert(next->leaf.parent == delem); lrb_assert(next->leaf.parent == delem);
s_assert(next->leaf.parent_val == val); lrb_assert(next->leaf.parent_val == val);
} }
else else
{ {
s_assert(next->node.parent == delem); lrb_assert(next->node.parent == delem);
s_assert(next->node.parent_val == val); lrb_assert(next->node.parent_val == val);
s_assert(next->node.nibnum > delem->node.nibnum); lrb_assert(next->node.nibnum > delem->node.nibnum);
} }
} }
@ -1047,7 +1046,7 @@ stats_recurse(union irc_radixtree_elem *delem, int depth, int *pmaxdepth)
} }
/* /*
* irc_radixtree_stats(struct irc_radixtree *dict, void (*cb)(const char *line, void *privdata), void *privdata) * rb_radixtree_stats(struct rb_radixtree *dict, void (*cb)(const char *line, void *privdata), void *privdata)
* *
* Returns the size of a patricia. * Returns the size of a patricia.
* *
@ -1063,12 +1062,12 @@ stats_recurse(union irc_radixtree_elem *delem, int depth, int *pmaxdepth)
* - callback called with stats text * - callback called with stats text
*/ */
void void
irc_radixtree_stats(struct irc_radixtree *dict, void (*cb)(const char *line, void *privdata), void *privdata) rb_radixtree_stats(struct rb_radixtree *dict, void (*cb)(const char *line, void *privdata), void *privdata)
{ {
char str[256]; char str[256];
int sum, maxdepth; int sum, maxdepth;
s_assert(dict != NULL); lrb_assert(dict != NULL);
maxdepth = 0; maxdepth = 0;
if (dict->count > 0) if (dict->count > 0)
@ -1086,33 +1085,13 @@ irc_radixtree_stats(struct irc_radixtree *dict, void (*cb)(const char *line, voi
} }
void void
irc_radixtree_stats_walk(void (*cb)(const char *line, void *privdata), void *privdata) rb_radixtree_stats_walk(void (*cb)(const char *line, void *privdata), void *privdata)
{ {
rb_dlink_node *ptr; rb_dlink_node *ptr;
RB_DLINK_FOREACH(ptr, radixtree_list.head) RB_DLINK_FOREACH(ptr, radixtree_list.head)
{ {
irc_radixtree_stats(ptr->data, cb, privdata); rb_radixtree_stats(ptr->data, cb, privdata);
} }
} }
void irc_radixtree_irccasecanon(char *str)
{
while (*str)
{
*str = ToUpper(*str);
str++;
}
return;
}
void irc_radixtree_strcasecanon(char *str)
{
while (*str)
{
*str = toupper((unsigned char)*str);
str++;
}
return;
}

View file

@ -146,7 +146,7 @@ mr_nick(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
return 0; return 0;
} }
if(irc_dictionary_find(nd_dict, nick)) if(rb_dictionary_find(nd_dict, nick))
{ {
sendto_one(source_p, form_str(ERR_UNAVAILRESOURCE), sendto_one(source_p, form_str(ERR_UNAVAILRESOURCE),
me.name, EmptyString(source_p->name) ? "*" : source_p->name, nick); me.name, EmptyString(source_p->name) ? "*" : source_p->name, nick);
@ -198,7 +198,7 @@ m_nick(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p
return 0; return 0;
} }
if(irc_dictionary_find(nd_dict, nick)) if(rb_dictionary_find(nd_dict, nick))
{ {
sendto_one(source_p, form_str(ERR_UNAVAILRESOURCE), sendto_one(source_p, form_str(ERR_UNAVAILRESOURCE),
me.name, EmptyString(source_p->name) ? "*" : source_p->name, nick); me.name, EmptyString(source_p->name) ? "*" : source_p->name, nick);
@ -754,7 +754,7 @@ change_remote_nick(struct Client *client_p, struct Client *source_p,
del_from_client_hash(source_p->name, source_p); del_from_client_hash(source_p->name, source_p);
/* invalidate nick delay when a remote client uses the nick.. */ /* invalidate nick delay when a remote client uses the nick.. */
if((nd = irc_dictionary_retrieve(nd_dict, nick))) if((nd = rb_dictionary_retrieve(nd_dict, nick)))
free_nd_entry(nd); free_nd_entry(nd);
strcpy(source_p->name, nick); strcpy(source_p->name, nick);
@ -1076,7 +1076,7 @@ register_client(struct Client *client_p, struct Client *server,
} }
/* remove any nd entries for this nick */ /* remove any nd entries for this nick */
if((nd = irc_dictionary_retrieve(nd_dict, nick))) if((nd = rb_dictionary_retrieve(nd_dict, nick)))
free_nd_entry(nd); free_nd_entry(nd);
add_to_client_hash(nick, source_p); add_to_client_hash(nick, source_p);

View file

@ -34,7 +34,7 @@
#include "modules.h" #include "modules.h"
#include "hash.h" #include "hash.h"
#include "cache.h" #include "cache.h"
#include "irc_dictionary.h" #include "rb_dictionary.h"
static int m_help(struct MsgBuf *, struct Client *, struct Client *, int, const char **); static int m_help(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
static int mo_help(struct MsgBuf *, struct Client *, struct Client *, int, const char **); static int mo_help(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
@ -97,7 +97,7 @@ dohelp(struct Client *source_p, int flags, const char *topic)
if(EmptyString(topic)) if(EmptyString(topic))
topic = ntopic; topic = ntopic;
hptr = irc_dictionary_retrieve(flags & HELP_OPER ? help_dict_oper : help_dict_user, topic); hptr = rb_dictionary_retrieve(flags & HELP_OPER ? help_dict_oper : help_dict_user, topic);
if(hptr == NULL || !(hptr->flags & flags)) if(hptr == NULL || !(hptr->flags & flags))
{ {

View file

@ -49,7 +49,7 @@
#include "inline/stringops.h" #include "inline/stringops.h"
#include "s_assert.h" #include "s_assert.h"
#include "logger.h" #include "logger.h"
#include "irc_radixtree.h" #include "rb_radixtree.h"
static rb_dlink_list safelisting_clients = { NULL, NULL, 0 }; static rb_dlink_list safelisting_clients = { NULL, NULL, 0 };
@ -472,9 +472,9 @@ static void safelist_one_channel(struct Client *source_p, struct Channel *chptr,
static void safelist_iterate_client(struct Client *source_p) static void safelist_iterate_client(struct Client *source_p)
{ {
struct Channel *chptr; struct Channel *chptr;
struct irc_radixtree_iteration_state iter; struct rb_radixtree_iteration_state iter;
IRC_RADIXTREE_FOREACH_FROM(chptr, &iter, channel_tree, source_p->localClient->safelist_data->chname) RB_RADIXTREE_FOREACH_FROM(chptr, &iter, channel_tree, source_p->localClient->safelist_data->chname)
{ {
if (safelist_sendq_exceeded(source_p->from) == YES) if (safelist_sendq_exceeded(source_p->from) == YES)
{ {

View file

@ -41,7 +41,7 @@
#include "reject.h" #include "reject.h"
#include "hash.h" #include "hash.h"
#include "cache.h" #include "cache.h"
#include "irc_radixtree.h" #include "rb_radixtree.h"
#include "sslproc.h" #include "sslproc.h"
static int mo_rehash(struct MsgBuf *, struct Client *, struct Client *, int, const char **); static int mo_rehash(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
@ -194,7 +194,7 @@ static void
rehash_tresvs(struct Client *source_p) rehash_tresvs(struct Client *source_p)
{ {
struct ConfItem *aconf; struct ConfItem *aconf;
struct irc_radixtree_iteration_state iter; struct rb_radixtree_iteration_state iter;
rb_dlink_node *ptr; rb_dlink_node *ptr;
rb_dlink_node *next_ptr; rb_dlink_node *next_ptr;
int i; int i;
@ -204,12 +204,12 @@ rehash_tresvs(struct Client *source_p)
if (!MyConnect(source_p)) if (!MyConnect(source_p))
remote_rehash_oper_p = source_p; remote_rehash_oper_p = source_p;
IRC_RADIXTREE_FOREACH(aconf, &iter, resv_tree) RB_RADIXTREE_FOREACH(aconf, &iter, resv_tree)
{ {
if(!aconf->hold || aconf->lifetime) if(!aconf->hold || aconf->lifetime)
continue; continue;
irc_radixtree_delete(resv_tree, aconf->host); rb_radixtree_delete(resv_tree, aconf->host);
free_conf(aconf); free_conf(aconf);
} }

View file

@ -280,7 +280,7 @@ me_nickdelay(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *so
duration = atoi(parv[1]); duration = atoi(parv[1]);
if (duration <= 0) if (duration <= 0)
{ {
nd = irc_dictionary_retrieve(nd_dict, parv[2]); nd = rb_dictionary_retrieve(nd_dict, parv[2]);
if (nd != NULL) if (nd != NULL)
free_nd_entry(nd); free_nd_entry(nd);
} }
@ -289,7 +289,7 @@ me_nickdelay(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *so
if (duration > 86400) if (duration > 86400)
duration = 86400; duration = 86400;
add_nd_entry(parv[2]); add_nd_entry(parv[2]);
nd = irc_dictionary_retrieve(nd_dict, parv[2]); nd = rb_dictionary_retrieve(nd_dict, parv[2]);
if (nd != NULL) if (nd != NULL)
nd->expire = rb_current_time() + duration; nd->expire = rb_current_time() + duration;
} }

View file

@ -46,7 +46,7 @@
#include "hash.h" #include "hash.h"
#include "reject.h" #include "reject.h"
#include "whowas.h" #include "whowas.h"
#include "irc_radixtree.h" #include "rb_radixtree.h"
#include "sslproc.h" #include "sslproc.h"
static int m_stats (struct MsgBuf *, struct Client *, struct Client *, int, const char **); static int m_stats (struct MsgBuf *, struct Client *, struct Client *, int, const char **);
@ -292,8 +292,8 @@ stats_hash(struct Client *source_p)
sendto_one_numeric(source_p, RPL_STATSDEBUG, "B :%-30s %-15s %-10s %-10s %-10s %-10s", sendto_one_numeric(source_p, RPL_STATSDEBUG, "B :%-30s %-15s %-10s %-10s %-10s %-10s",
"NAME", "TYPE", "OBJECTS", "DEPTH SUM", "AVG DEPTH", "MAX DEPTH"); "NAME", "TYPE", "OBJECTS", "DEPTH SUM", "AVG DEPTH", "MAX DEPTH");
irc_dictionary_stats_walk(stats_hash_cb, source_p); rb_dictionary_stats_walk(stats_hash_cb, source_p);
irc_radixtree_stats_walk(stats_hash_cb, source_p); rb_radixtree_stats_walk(stats_hash_cb, source_p);
} }
static void static void
@ -856,7 +856,7 @@ static void
stats_tresv(struct Client *source_p) stats_tresv(struct Client *source_p)
{ {
struct ConfItem *aconf; struct ConfItem *aconf;
struct irc_radixtree_iteration_state state; struct rb_radixtree_iteration_state state;
rb_dlink_node *ptr; rb_dlink_node *ptr;
int i; int i;
@ -869,7 +869,7 @@ stats_tresv(struct Client *source_p)
'q', aconf->port, aconf->host, aconf->passwd); 'q', aconf->port, aconf->host, aconf->passwd);
} }
IRC_RADIXTREE_FOREACH(aconf, &state, resv_tree) RB_RADIXTREE_FOREACH(aconf, &state, resv_tree)
{ {
if(aconf->hold) if(aconf->hold)
sendto_one_numeric(source_p, RPL_STATSQLINE, sendto_one_numeric(source_p, RPL_STATSQLINE,
@ -883,7 +883,7 @@ static void
stats_resv(struct Client *source_p) stats_resv(struct Client *source_p)
{ {
struct ConfItem *aconf; struct ConfItem *aconf;
struct irc_radixtree_iteration_state state; struct rb_radixtree_iteration_state state;
rb_dlink_node *ptr; rb_dlink_node *ptr;
int i; int i;
@ -896,7 +896,7 @@ stats_resv(struct Client *source_p)
'Q', aconf->port, aconf->host, aconf->passwd); 'Q', aconf->port, aconf->host, aconf->passwd);
} }
IRC_RADIXTREE_FOREACH(aconf, &state, resv_tree) RB_RADIXTREE_FOREACH(aconf, &state, resv_tree)
{ {
if(!aconf->hold) if(!aconf->hold)
sendto_one_numeric(source_p, RPL_STATSQLINE, sendto_one_numeric(source_p, RPL_STATSQLINE,