1 | /*************************************** 2 | $Revision: 1.7 $ 3 | 4 | Radix tree (rx). rx_print.c - functions to print a forest/tree/node 5 | (mainly for debugging purposes) 6 | 7 | Status: NOT REVUED, TESTED, INCOMPLETE 8 | 9 | Design and implementation by: Marek Bukowy 10 | 11 | ******************/ /****************** 12 | Copyright (c) 1999 RIPE NCC 13 | 14 | All Rights Reserved 15 | 16 | Permission to use, copy, modify, and distribute this software and its 17 | documentation for any purpose and without fee is hereby granted, 18 | provided that the above copyright notice appear in all copies and that 19 | both that copyright notice and this permission notice appear in 20 | supporting documentation, and that the name of the author not be 21 | used in advertising or publicity pertaining to distribution of the 22 | software without specific, written prior permission. 23 | 24 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 25 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL 26 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY 27 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 28 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 29 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 30 | ***************************************/ 31 | 32 | #define RX_IMPL 33 | #include <rxroutines.h> 34 | 35 | er_ret_t 36 | rx_walk_hook_printnode(rx_node_t *node, int level, int nodecounter, void *trash) 37 | { 38 | char line[200]="", buf[1024]; 39 | 40 | int i; 41 | 42 | // indent 43 | for(i=0;i<level;i++) strcat(line," "); 44 | 45 | rx_nod_print(node, buf, 1024); 46 | 47 | fprintf(stderr, 48 | "%s** level %d ** node: %s\n", 49 | // @ %p; parent %p, child[0]=%p, child[1]=%p\n", 50 | line, level, buf 51 | ); 52 | // node, node->parent_ptr, node->child_ptr[0], node->child_ptr[1] ); 53 | 54 | return RX_OK; 55 | } 56 | 57 | /***************************************************************************/ 58 | 59 | er_ret_t 60 | rx_tree_print( rx_tree_t *tree ) 61 | { 62 | int cnt; 63 | er_ret_t err; 64 | 65 | if( tree->top_ptr != NULL ) { 66 | cnt = rx_walk_tree(tree->top_ptr, rx_walk_hook_printnode, 67 | RX_WALK_CNTGLU, // print also glue nodes 68 | 255, 0, 0, NULL, &err); 69 | fprintf(stderr,"Traversed %d nodes\n", cnt); 70 | } 71 | else { 72 | fprintf(stderr,"The tree is empty!\n"); 73 | } 74 | 75 | return err; 76 | } 77 | 78 | 79 | /***************************************************************************/ 80 | static 81 | void 82 | rx_space_printone(void *voptr, void *junkdata) 83 | { 84 | rx_tree_t *ptr = voptr; 85 | char prstr[IP_PREFSTR_MAX]; 86 | 87 | printf("%50s:%d\n", "reg_id", ptr->reg_id); 88 | printf("%50s:%d\n", "space", ptr->space ); 89 | printf("%50s:%d\n", "family", ptr->family ); 90 | printf("%50s:%d\n", "subtrees", ptr->subtrees); 91 | printf("%50s:%d\n", "mem_mode", ptr->mem_mode); 92 | printf("%50s:%d\n", "num_nodes",ptr->num_nodes); 93 | printf("%50s:%08x\n", "top_ptr", (int) ptr->top_ptr); 94 | printf("%50s:%d\n", "maxbits", ptr->maxbits); 95 | 96 | if( IP_pref_b2a( &(ptr->prefix), prstr, IP_PREFSTR_MAX) != IP_OK ) 97 | die; // program error. 98 | 99 | printf("%50s:%s\n", "prefix", prstr); 100 | } 101 | 102 | 103 | /***************************************************************************/ 104 | /*+ print the whole forest +*/ 105 | 106 | void 107 | rx_space_list(void) 108 | { 109 | g_list_foreach( rx_forest, rx_space_printone, NULL); 110 | } 111 | /***************************************************************************/ 112 | 113 | void 114 | rx_nod_print( rx_node_t *node, char *buf, int maxchar ) 115 | { 116 | char pref[IP_PREFSTR_MAX]; 117 | 118 | if( IP_pref_b2a( &(node->prefix), pref, IP_PREFSTR_MAX) != IP_OK ) { 119 | die; 120 | } 121 | 122 | snprintf(buf, maxchar, "%s%s", 123 | ( node->glue ) ? "++glue++" : "", pref); 124 | } 125 | /***************************************************************************/ 126 | 127 | void 128 | rx_stk_print( rx_nodcpy_t stack[], // stack==array of node_copies 129 | int stackdepth ) 130 | { 131 | int i; 132 | rx_node_t *node; 133 | char buf[1024]; 134 | 135 | ER_dbg_va(FAC_RX, ASP_RX_STKBLD_DET, 136 | "stack dump: %d elements", stackdepth); 137 | 138 | for(i = 0; i < stackdepth; i++) { 139 | node = & stack[i].cpy; 140 | 141 | rx_nod_print(node, buf, 1024); 142 | 143 | ER_dbg_va(FAC_RX, ASP_RX_STKBLD_DET, "position %d: %s", i, buf); 144 | } 145 | }