Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Jul 2012 19:35:10 GMT
From:      Brooks Davis <brooks@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 214871 for review
Message-ID:  <201207241935.q6OJZA4J005529@skunkworks.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@214871?ac=10

Change 214871 by brooks@brooks_ecr_current on 2012/07/24 19:34:53

	Remove a level of indirection in the file list and correct an
	overallocation in the realloc case in the process.
	
	Sort the directory entries.

Affected files ...

.. //depot/projects/ctsrd/beribsd/src/ctsrd/browser/browser.c#15 edit

Differences ...

==== //depot/projects/ctsrd/beribsd/src/ctsrd/browser/browser.c#15 (text+ko) ====

@@ -123,7 +123,7 @@
 const int	colstart[] = {0, 267, 534};
 
 struct dent {
-	struct dirent	*entry;
+	struct dirent	 entry;
 	char		*desc;
 	u_int32_t	*icon;
 };
@@ -735,19 +735,35 @@
 }
 
 static int
+dentcmp(const void *v1, const void *v2)
+{
+        const struct dent *d1, *d2;
+
+        d1 = v1;
+        d2 = v2;
+ 
+        /* Sort .. first */
+        if (strcmp(d1->entry.d_name, "..") == 0)
+                return (-1);
+        if (strcmp(d2->entry.d_name, "..") == 0)
+                return (1);
+        return strcmp(d1->entry.d_name, d2->entry.d_name);
+}
+
+static int
 browsedir(int dfd)
 {
 	int action, topslot, j, curslot, maxdents, nfd, ndents, retfd;
 	DIR *dirp;
 	struct dirent *entry;
-	struct dent **dents, *dent;
+	struct dent *dents, *dent;
 
 	if ((dirp = fdopendir(dfd)) == NULL)
 		err(1, "fdopendir()");
 
 	ndents = 0;
 	maxdents = 1024;
-	dents = malloc(sizeof(struct dent *) * maxdents);
+	dents = malloc(sizeof(struct dent) * maxdents);
 	if (dents == NULL)
 		err(1, "malloc dents");
 
@@ -760,31 +776,28 @@
 		}
 		if (strcmp(".", entry->d_name) == 0)
 			continue;
-		dents[ndents] = malloc(sizeof(struct dent));
-		if (dents[ndents] == NULL)
-			err(1, "malloc dent[%d]", ndents);
-		memcpy(&(dents[ndents]->entry), &entry, sizeof(entry));
-		dents[ndents]->desc = NULL;
-		dents[ndents]->icon = NULL;
+		memcpy(&(dents[ndents].entry), entry, sizeof(*entry));
+		dents[ndents].desc = NULL;
+		dents[ndents].icon = NULL;
 		ndents++;
 	}
-
+	qsort(dents, ndents, sizeof(struct dent), &dentcmp);
 	
 	topslot = 0;
 render:
 	fb_fill_region(black, colstart[0], FROW, fb_width, NROW * RHEIGHT);
 	for(curslot = 0; curslot < NSLOTS && topslot + curslot < ndents;
 	    curslot++) {
-		dent = dents[topslot + curslot];
+		dent = &dents[topslot + curslot];
 		if (dent->desc == NULL)
-			dent->desc = strdup(get_desc(dfd, dent->entry));
+			dent->desc = strdup(get_desc(dfd, &(dent->entry)));
 		if (dent->icon == NULL)
 			dent->icon = get_icon(dent->desc);
 
 		if (verbose)
-			printf("%2d %20s %s\n", curslot, dent->entry->d_name,
+			printf("%2d %20s %s\n", curslot, dent->entry.d_name,
 			    dent->desc);
-		update_slot(curslot, dent->icon, dent->entry->d_name);
+		update_slot(curslot, dent->icon, dent->entry.d_name);
 	}
 	if (curslot == NSLOTS)
 		curslot--;
@@ -812,9 +825,9 @@
 		case ACT_REFRESH:
 			/* Reset descriptions and icons */ 
 			for (j = 0; j < ndents; j++) {
-				free(dents[j]->desc);
-				dents[j]->desc = NULL;
-				dents[j]->icon = NULL;
+				free(dents[j].desc);
+				dents[j].desc = NULL;
+				dents[j].icon = NULL;
 			}
 			goto render;
 		default:
@@ -822,22 +835,22 @@
 				errx(1, "invalid action");
 			if (topslot + action >= ndents)
 				continue;
-			if (dents[topslot + action]->entry->d_type == DT_DIR) {
+			if (dents[topslot + action].entry.d_type == DT_DIR) {
 				if ((nfd = openat(dfd,
-				    dents[topslot + action]->entry->d_name,
+				    dents[topslot + action].entry.d_name,
 				    O_RDONLY|O_DIRECTORY)) == -1)
 					goto render; /* XXX: display error */
 				retfd = nfd;
 				goto cleanup;
 			} else if (strcmp("image/png",
-			    dents[topslot + action]->desc) == 0) {
+			    dents[topslot + action].desc) == 0) {
 				show_png(dfd,
-				    dents[topslot + action]->entry->d_name);
+				    dents[topslot + action].entry.d_name);
 				goto render;
 			} else if (strcmp("text/plain",
-			    dents[topslot + action]->desc) == 0) {
+			    dents[topslot + action].desc) == 0) {
 				show_text_file(dfd,
-				    dents[topslot + action]->entry->d_name);
+				    dents[topslot + action].entry.d_name);
 				goto render;
 			} else {
 				if (verbose)
@@ -849,10 +862,8 @@
 	}
 
 cleanup:
-	for (j = 0; j < ndents; j++) {
-		free(dents[j]->desc);
-		free(dents[j]);
-	}
+	for (j = 0; j < ndents; j++)
+		free(dents[j].desc);
 	free(dents);
 
 	if (closedir(dirp) == -1)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201207241935.q6OJZA4J005529>