X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=select.c;h=515bbc4a5ecae2a26cfa3c4ffb4ce33e6b690c33;hb=62b002ae08225cb53be301ad10808f2e6e69ffbc;hp=094ab72cbf15f21ab77b05cae9d48c5e030a918b;hpb=1e723f61001e9f4448a465886b0b4ebcdadb388e;p=adu.git diff --git a/select.c b/select.c index 094ab72..515bbc4 100644 --- a/select.c +++ b/select.c @@ -389,11 +389,62 @@ static int print_user_summary_line(struct user_info *ui, __a_unused void *data) return 1; } +static int name_comp(const void *a, const void *b) +{ + char *x = ((struct user_info *)a)->pw_name; + char *y = ((struct user_info *)b)->pw_name; + + if (!x) + return 1; + if (!y) + return -1; + return strcmp(x, y); +} + +static int uid_comp(const void *a, const void *b) +{ + return -NUM_COMPARE(((struct user_info *)a)->uid, + ((struct user_info *)b)->uid); +} + +static int dir_count_comp(const void *a, const void *b) +{ + return NUM_COMPARE(((struct user_info *)a)->dirs, + ((struct user_info *)b)->dirs); +} + +static int file_count_comp(const void *a, const void *b) +{ + return NUM_COMPARE(((struct user_info *)a)->files, + ((struct user_info *)b)->files); +} + +static int size_comp(const void *a, const void *b) +{ + return NUM_COMPARE(((struct user_info *)a)->bytes, + ((struct user_info *)b)->bytes); +} + +/* + * The comparators for sorting the user summary. + * + * This is an array of pointers to functions taking two constant void * + * pointers and returning an int. + */ +static int (*summary_comparators[])(const void *, const void *) = { + [user_summary_sort_arg_name] = name_comp, + [user_summary_sort_arg_uid] = uid_comp, + [user_summary_sort_arg_dir_count] = dir_count_comp, + [user_summary_sort_arg_file_count] = file_count_comp, + [user_summary_sort_arg_size] = size_comp, +}; + static void print_user_summary(void) { printf("User summary " "(pw_name/uid/dirs%s/files%s/size%s):\n", count_unit_buf, count_unit_buf, size_unit_buf); + sort_hash_table(summary_comparators[conf.user_summary_sort_arg]); for_each_admissible_user(print_user_summary_line, NULL); }