[PATCH] use qsort for sorting ls output
Rich Felker
dalias at aerifal.cx
Tue May 2 17:44:49 PDT 2006
patch to remove duplication of libc functionality, recommended before
in the other thread about ls. comments? renaming the function is
purely cosmetic but it seemed wrong to have the name of a function
imply a particular implementation when there's no reason the caller
should care which implementation is used.
rich
-------------- next part --------------
Index: coreutils/ls.c
===================================================================
--- coreutils/ls.c (revision 14981)
+++ coreutils/ls.c (working copy)
@@ -396,8 +396,10 @@
/*----------------------------------------------------------------------*/
#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 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 @@
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 @@
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 @@
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 @@
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 @@
}
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)
More information about the busybox
mailing list