extern guint stats_tree_branch_max_namelen(const stat_node *node, guint indent) { stat_node *child; guint maxlen = 0; guint len; indent = indent > INDENT_MAX ? INDENT_MAX : indent; if (node->children) { for (child = node->children; child; child = child->next ) { len = stats_tree_branch_max_namelen(child,indent+1); maxlen = len > maxlen ? len : maxlen; } } len = (guint) strlen(node->name) + indent; maxlen = len > maxlen ? len : maxlen; return maxlen; }
/* populates the given GString with a tree representation of a branch given by node, using indent spaces as initial indentation */ extern void stats_tree_branch_to_str(const stat_node *node, GString *s, guint indent) { stat_node *child; static gchar indentation[INDENT_MAX+1]; static gchar value[NUM_BUF_SIZE]; static gchar rate[NUM_BUF_SIZE]; static gchar percent[NUM_BUF_SIZE]; guint i = 0; if (indent == 0) { format = g_strdup_printf(" %%s%%-%us%%12s %%12s %%12s\n",stats_tree_branch_max_namelen(node,0)); } stats_tree_get_strs_from_node(node, value, rate, percent); indent = indent > INDENT_MAX ? INDENT_MAX : indent; /* fill indentation with indent spaces */ if (indent > 0) { while(i<indent) indentation[i++] = ' '; } indentation[i] = '\0'; g_string_append_printf(s,format, indentation,node->name,value,rate,percent); if (node->children) { for (child = node->children; child; child = child->next ) { stats_tree_branch_to_str(child,s,indent+1); } } if (indent == 0) { g_free(format); } }
static void draw_stats_tree(void *psp) { stats_tree *st = (stats_tree *)psp; GString *s; gchar *fmt; stat_node *child; s = g_string_new("\n===================================================================\n"); fmt = g_strdup_printf(" %%s%%-%us%%12s\t%%12s\t%%12s\n",stats_tree_branch_max_namelen(&st->root,0)); g_string_append_printf(s,fmt,"",st->cfg->name,"value","rate","percent"); g_free(fmt); g_string_append_printf(s,"-------------------------------------------------------------------\n"); for (child = st->root.children; child; child = child->next ) { stats_tree_branch_to_str(child,s,0); } s = g_string_append(s,"\n===================================================================\n"); printf("%s",s->str); }
extern GString* stats_tree_format_as_str(const stats_tree* st, st_format_type format_type, gint sort_column, gboolean sort_descending) { int maxnamelen= stats_tree_branch_max_namelen(&st->root,0); stat_node *child; GString *s; int count; gchar *separator = NULL; switch(format_type) { case ST_FORMAT_YAML: s = g_string_new("---\n"); break; case ST_FORMAT_XML: s = g_string_new("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"); break; case ST_FORMAT_CSV: s = g_string_new("\"level\",\"parent\","); for (count = 0; count<st->num_columns; count++) { g_string_append_printf(s,"\"%s\",",stats_tree_get_column_name(count)); } g_string_append (s,"\n"); break; case ST_FORMAT_PLAIN: { char fmt[16]; int sep_length; sep_length= maxnamelen; for (count = 1; count<st->num_columns; count++) { sep_length += stats_tree_get_column_size(count)+2; } separator = (gchar *)g_malloc(sep_length+1); memset (separator, '=', sep_length); separator[sep_length] = 0; s = g_string_new("\n"); g_string_append(s,separator); g_string_append_printf(s,"\n%s:\n",st->cfg->name); g_sprintf (fmt,"%%-%us",maxnamelen); g_string_append_printf(s,fmt,stats_tree_get_column_name(0)); for (count = 1; count<st->num_columns; count++) { g_sprintf (fmt," %%-%us",stats_tree_get_column_size(count)+1); g_string_append_printf(s,fmt,stats_tree_get_column_name(count)); } memset (separator, '-', sep_length); g_string_append_printf(s,"\n%s\n",separator); } break; default: return g_string_new("unknown format for stats_tree\n"); } for (child = st->root.children; child; child = child->next ) { stats_tree_format_node_as_str(child,s,format_type,0,"",maxnamelen,sort_column,sort_descending); } if (format_type==ST_FORMAT_PLAIN) { g_string_append_printf(s,"\n%s\n",separator); g_free(separator); } return s; }