From 425e7584a48575435bff7c702bddb8461f90a095 Mon Sep 17 00:00:00 2001
From: Rob Landley <rob@landley.net>
Date: Wed, 3 May 2006 20:22:03 +0000
Subject: [PATCH] Patch from Rich Felker to make ls use libc's qsort.

---
 coreutils/ls.c | 36 ++++++++++--------------------------
 1 file 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)
-- 
2.25.1