+void destroy(struct file_with_size *node) {
+ struct file_with_size *next;
+ while(node) {
+ next = node->next;
+ free(node->filename);
+ free(node);
+ node = next;
+ }
+}
+
+/**********************************************************************/
+
+int compare_files(const void *x1, const void *x2) {
+ const struct file_with_size **f1, **f2;
+
+ f1 = (const struct file_with_size **) x1;
+ f2 = (const struct file_with_size **) x2;
+
+ if(reverse_sorting) {
+ if((*f1)->size < (*f2)->size) {
+ return 1;
+ } else if((*f1)->size > (*f2)->size) {
+ return -1;
+ } else {
+ return 0;
+ }
+ } else {
+ if((*f1)->size < (*f2)->size) {
+ return -1;
+ } else if((*f1)->size > (*f2)->size) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+}
+
+void print_sorted(struct file_with_size *root, int height) {
+ struct file_with_size *node;
+ struct file_with_size **nodes;
+ int nb, n, first, last;
+
+ nb = 0;
+ for(node = root; node; node = node->next) {
+ nb++;
+ }
+
+ nodes = malloc(nb * sizeof(struct file_with_size *));
+
+ n = 0;
+ for(node = root; node; node = node->next) {
+ nodes[n++] = node;
+ }
+
+ qsort(nodes, nb, sizeof(struct file_with_size *), compare_files);
+
+ first = 0;
+ last = nb;
+
+ if(forced_height) {
+ height = forced_height;
+ }
+
+ if(height > 0 && height < nb) {
+ first = nb - height;
+ }
+
+ if(show_top) {
+ n = last;
+ last = nb - first;
+ first = nb - n;
+ }
+
+ if(fancy_size_display) {
+ for(n = first; n < last; n++) {
+ if(nodes[n]->size < 1024) {
+ printf("% 7d %s\n",
+ ((int) nodes[n]->size),
+ nodes[n]->filename);
+ } else if(nodes[n]->size < 1024 * 1024) {
+ printf("% 6.1fK %s\n",
+ ((double) (nodes[n]->size))/(1024.0),
+ nodes[n]->filename);
+ } else if(nodes[n]->size < 1024 * 1024 * 1024) {
+ printf("% 6.1fM %s\n",
+ ((double) (nodes[n]->size))/(1024.0 * 1024),
+ nodes[n]->filename);
+ } else {
+ printf("% 6.1fG %s\n",
+ ((double) (nodes[n]->size))/(1024.0 * 1024.0 * 1024.0),
+ nodes[n]->filename);
+ }
+ }
+ } else {
+ for(n = first; n < last; n++) {
+ print_size_sum(nodes[n]->size);
+ printf(" %s\n", nodes[n]->filename);
+ }
+ }
+
+ free(nodes);
+}
+
+/**********************************************************************/
+