[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