node = table[i];  if (node->total > calltree_root.total) continue;
static void dump_graph(PLHashTable *hashtbl, const char *title, FILE *fp){    uint32 i, count;    graphnode **table;    char buf1[32], buf2[32];    count = hashtbl->nentries;    table = (graphnode**) malloc(count * sizeof(graphnode*));    if (!table) {        perror(program);        exit(1);    }    PL_HashTableEnumerateEntries(hashtbl, tabulate_node, table);    qsort(table, count, sizeof(graphnode*), node_table_compare);    fprintf(fp,            "<table border=1>\n"              "<tr><th>%s</th>"                "<th>Total/Direct (percents)</th>"                "<th>Fan-in</th>"                "<th>Fan-out</th>"              "</tr>\n",            title);    for (i = 0; i < count; i++) {        graphnode *node;        node = table[i];        /* XXX cast out bogusly large components (threading confusion? */        if (node->total > calltree_root.total)            continue;        /* Don't bother with truly puny nodes. */        if (node->total < min_subtotal)            break;        fprintf(fp,                "<tr>"                  "<td valign=top><a name='%s'>%s</td>"                  "<td valign=top>%s/%s (%%%1.2f/%%%1.2f)</td>",                graphnode_name(node),                graphnode_name(node),                prettybig(node->total, buf1, sizeof buf1),                prettybig(node->direct, buf2, sizeof buf2),                percent(node->total, calltree_root.total),                percent(node->direct, calltree_root.total));        sort_graphedge_list(&node->in);        dump_graphedge_list(node->in, fp);        sort_graphedge_list(&node->out);        dump_graphedge_list(node->out, fp);        fputs("</tr>\n", fp);    }    fputs("</table>\n", fp);    free((void*) table);}