1 | /*************************************** 2 | $Revision: 1.16 $ 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,2000,2001,2002 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 | #define RX_IMPL_PRINT 34 | #include "rip.h" 35 | 36 | const char * 37 | RX_text_srch_mode(rx_srch_mt mode) 38 | { 39 | return rx_srch_mode_text[mode]; 40 | } 41 | 42 | er_ret_t 43 | rx_walk_hook_printnode(rx_node_t *node, int level, int nodecounter, void *con) 44 | { 45 | sk_conn_st *condat = (sk_conn_st *) con; 46 | char line[200]="", buf[1024]; 47 | 48 | int i; 49 | 50 | /* indent*/ 51 | for(i=0;i<level;i++) strcat(line," "); 52 | 53 | sprintf( line+strlen(line) ,"** level %d ** ", level); 54 | /* @ %p; parent %p, child[0]=%p, child[1]=%p\n", */ 55 | /* node, node->parent_ptr, node->child_ptr[0], node->child_ptr[1] );*/ 56 | 57 | rx_nod_print(node, buf, 1024); 58 | 59 | SK_cd_puts(condat, line); 60 | SK_cd_puts(condat, buf); 61 | SK_cd_puts(condat, "\n"); 62 | return RX_OK; 63 | } 64 | 65 | /***************************************************************************/ 66 | 67 | er_ret_t 68 | rx_tree_print( sk_conn_st *condat, rx_tree_t *tree ) 69 | { 70 | int cnt; 71 | er_ret_t err; 72 | char line[200]=""; 73 | 74 | if( tree->top_ptr != NULL ) { 75 | cnt = rx_walk_tree(tree->top_ptr, rx_walk_hook_printnode, 76 | RX_WALK_CNTGLU, /* print also glue nodes*/ 77 | 255, 0, 0, condat, &err); 78 | sprintf(line,"Traversed %d nodes\n", cnt); 79 | SK_cd_puts(condat,line); 80 | } 81 | else { 82 | SK_cd_puts(condat,"The tree is empty!\n"); 83 | } 84 | 85 | return err; 86 | } 87 | 88 | 89 | /***************************************************************************/ 90 | 91 | #if 0 92 | 93 | This function is never used, and may potentially cause a buffer overflow. 94 | If you need it, check that %s and add it back in. Shane 95 | 96 | void 97 | rx_space_printone(void *voptr, void *condat) 98 | { 99 | rx_tree_t *ptr = voptr; 100 | char aout[1024]; 101 | char prstr[IP_PREFSTR_MAX]; 102 | 103 | *aout=0; 104 | 105 | sprintf(aout+strlen(aout), "%50s:%d\n", "space", ptr->space ); 106 | sprintf(aout+strlen(aout), "%50s:%d\n", "family", ptr->family ); 107 | sprintf(aout+strlen(aout), "%50s:%d\n", "subtrees", ptr->subtrees); 108 | sprintf(aout+strlen(aout), "%50s:%d\n", "mem_mode", ptr->mem_mode); 109 | sprintf(aout+strlen(aout), "%50s:%d\n", "num_nodes",ptr->num_nodes); 110 | sprintf(aout+strlen(aout), "%50s:%08x\n", "top_ptr", (int) ptr->top_ptr); 111 | sprintf(aout+strlen(aout), "%50s:%d\n", "maxbits", ptr->maxbits); 112 | 113 | if( IP_pref_b2a( &(ptr->prefix), prstr, IP_PREFSTR_MAX) != IP_OK ) 114 | die; /* program error.*/ 115 | 116 | sprintf(aout+strlen(aout), "%50s:%s\n", "prefix", prstr); 117 | SK_cd_puts( (sk_conn_st *)condat,aout); 118 | } 119 | 120 | #endif /* 0 */ 121 | 122 | /***************************************************************************/ 123 | 124 | void 125 | rx_nod_print( rx_node_t *node, char *buf, unsigned maxchar ) 126 | { 127 | char pref[IP_PREFSTR_MAX]; 128 | 129 | if( IP_pref_b2a( &(node->prefix), pref, IP_PREFSTR_MAX) != IP_OK ) { 130 | die; 131 | } 132 | 133 | snprintf(buf, maxchar, "%s%s", 134 | ( node->glue ) ? "++glue++" : "", pref); 135 | } 136 | /***************************************************************************/ 137 | 138 | void 139 | rx_stk_print( rx_nodcpy_t stack[], /* stack==array of node_copies*/ 140 | int stackdepth ) 141 | { 142 | int i; 143 | rx_node_t *node; 144 | char buf[1024]; 145 | 146 | ER_dbg_va(FAC_RX, ASP_RX_STKBLD_DET, 147 | "stack dump: %d elements", stackdepth); 148 | 149 | for(i = 0; i < stackdepth; i++) { 150 | node = & stack[i].cpy; 151 | 152 | rx_nod_print(node, buf, 1024); 153 | 154 | ER_dbg_va(FAC_RX, ASP_RX_STKBLD_DET, "position %d: %s", i, buf); 155 | } 156 | }