diff options
author | Rob Landley <rob@landley.net> | 2006-05-04 00:22:03 +0400 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2006-05-04 00:22:03 +0400 |
commit | 425e7584a48575435bff7c702bddb8461f90a095 (patch) | |
tree | 3cd0be1451471714e3c61dd755f2a6dafd71245e /coreutils | |
parent | 1801e9cde72e6931a7617f150bd276927e78d6a5 (diff) |
Patch from Rich Felker to make ls use libc's qsort.
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/ls.c | 36 |
1 files changed, 10 insertions, 26 deletions
diff --git a/coreutils/ls.c b/coreutils/ls.c index 9cbb4cab7..882eab8e7 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c @@ -396,8 +396,10 @@ static struct dnode **splitdnarray(struct dnode **dn, int nfiles, int which) /*----------------------------------------------------------------------*/ #ifdef CONFIG_FEATURE_LS_SORTFILES -static int sortcmp(struct dnode *d1, struct dnode *d2) +static int sortcmp(const void *a, const void *b) { + struct dnode *d1 = *(struct dnode **)a; + struct dnode *d2 = *(struct dnode **)b; unsigned int sort_opts = all_fmt & SORT_MASK; int dif; @@ -432,27 +434,9 @@ static int sortcmp(struct dnode *d1, struct dnode *d2) } /*----------------------------------------------------------------------*/ -static void shellsort(struct dnode **dn, int size) +static void dnsort(struct dnode **dn, int size) { - struct dnode *temp; - int gap, i, j; - - /* shell short the array */ - if (dn == NULL || size < 2) - return; - - for (gap = size / 2; gap > 0; gap /= 2) { - for (i = gap; i < size; i++) { - for (j = i - gap; j >= 0; j -= gap) { - if (sortcmp(dn[j], dn[j + gap]) <= 0) - break; - /* they are out of order, swap them */ - temp = dn[j]; - dn[j] = dn[j + gap]; - dn[j + gap] = temp; - } - } - } + qsort(dn, size, sizeof *dn, sortcmp); } #endif @@ -543,7 +527,7 @@ static void showdirs(struct dnode **dn, int ndirs, int first) if (nfiles > 0) { /* list all files at this level */ #ifdef CONFIG_FEATURE_LS_SORTFILES - shellsort(subdnp, nfiles); + dnsort(subdnp, nfiles); #endif showfiles(subdnp, nfiles); #ifdef CONFIG_FEATURE_LS_RECURSIVE @@ -553,7 +537,7 @@ static void showdirs(struct dnode **dn, int ndirs, int first) dndirs = countsubdirs(subdnp, nfiles); if (dndirs > 0) { #ifdef CONFIG_FEATURE_LS_SORTFILES - shellsort(dnd, dndirs); + dnsort(dnd, dndirs); #endif showdirs(dnd, dndirs, 0); free(dnd); /* free the array of dnode pointers to the dirs */ @@ -1135,7 +1119,7 @@ int ls_main(int argc, char **argv) if (all_fmt & DISP_NOLIST) { #ifdef CONFIG_FEATURE_LS_SORTFILES - shellsort(dnp, nfiles); + dnsort(dnp, nfiles); #endif if (nfiles > 0) showfiles(dnp, nfiles); @@ -1146,7 +1130,7 @@ int ls_main(int argc, char **argv) dnfiles = nfiles - dndirs; if (dnfiles > 0) { #ifdef CONFIG_FEATURE_LS_SORTFILES - shellsort(dnf, dnfiles); + dnsort(dnf, dnfiles); #endif showfiles(dnf, dnfiles); if (ENABLE_FEATURE_CLEAN_UP) @@ -1154,7 +1138,7 @@ int ls_main(int argc, char **argv) } if (dndirs > 0) { #ifdef CONFIG_FEATURE_LS_SORTFILES - shellsort(dnd, dndirs); + dnsort(dnd, dndirs); #endif showdirs(dnd, dndirs, dnfiles == 0); if (ENABLE_FEATURE_CLEAN_UP) |