diff options
author | codeout <goodies@codeout.net> | 2012-10-03 20:57:13 +0900 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2012-10-04 03:20:43 -0700 |
commit | 523c6a46b06a726d63aa7a27840b79586f356bb5 (patch) | |
tree | e1db845c24704b15dda6c4706f58b13744ecc77d /ext/rpatricia/rpatricia.c | |
parent | a5be0f72618bcb2c82ee5131f4899abb3d9db529 (diff) | |
download | rpatricia-523c6a46b06a726d63aa7a27840b79586f356bb5.tar.gz |
Added a method 'nodes' to return all nodes in ruby's Hash.
This is useful when a ruby code requires nodes list for example, and also it helps when we sort user data by prefix. [ew: minor compiler compatibility fixes]
Diffstat (limited to 'ext/rpatricia/rpatricia.c')
-rw-r--r-- | ext/rpatricia/rpatricia.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/ext/rpatricia/rpatricia.c b/ext/rpatricia/rpatricia.c index e1ae1df..03f6588 100644 --- a/ext/rpatricia/rpatricia.c +++ b/ext/rpatricia/rpatricia.c @@ -203,6 +203,30 @@ p_print_nodes (int argc, VALUE *argv, VALUE self) } static VALUE +p_nodes (VALUE self) +{ + VALUE buf = rb_str_new(0, 0); + char *cbuf; + patricia_tree_t *tree; + patricia_node_t *node; + VALUE hash; + + Data_Get_Struct(self, patricia_tree_t, tree); + + hash = rb_hash_new(); + if (tree->head) { + PATRICIA_WALK(tree->head, node) { + rb_str_resize(buf, PATRICIA_MAXSTRLEN); + cbuf = RSTRING_PTR(buf); + prefix_toa2x(node->prefix, cbuf, 1); + rb_str_set_len(buf, strlen(cbuf)); + rb_hash_aset(hash, buf, (VALUE)node->data); + } PATRICIA_WALK_END; + } + return hash; +} + +static VALUE p_data (VALUE self) { VALUE user_data; @@ -385,6 +409,7 @@ Init_rpatricia (void) /* derivatives of climb */ rb_define_method(cPatricia, "num_nodes", p_num_nodes, 0); rb_define_method(cPatricia, "show_nodes", p_print_nodes, -1); + rb_define_method(cPatricia, "nodes", p_nodes, 0); /* destroy tree */ rb_define_method(cPatricia, "destroy", p_destroy, 0); |