svn commit: r190284 - head/bin/sh

Stefan Farfeleder stefanf at FreeBSD.org
Sun Mar 22 14:09:23 PDT 2009


Author: stefanf
Date: Sun Mar 22 21:09:22 2009
New Revision: 190284
URL: http://svn.freebsd.org/changeset/base/190284

Log:
  - Apply the r190270 changes to printing of single aliases too.
  - Sort the aliases before printing them.

Modified:
  head/bin/sh/alias.c

Modified: head/bin/sh/alias.c
==============================================================================
--- head/bin/sh/alias.c	Sun Mar 22 21:00:58 2009	(r190283)
+++ head/bin/sh/alias.c	Sun Mar 22 21:09:22 2009	(r190284)
@@ -50,6 +50,7 @@ __FBSDID("$FreeBSD$");
 #define ATABSIZE 39
 
 STATIC struct alias *atab[ATABSIZE];
+STATIC int aliases;
 
 STATIC void setalias(char *, char *);
 STATIC int unalias(const char *);
@@ -106,6 +107,7 @@ setalias(char *name, char *val)
 	ap->flag = 0;
 	ap->next = *app;
 	*app = ap;
+	aliases++;
 	INTON;
 }
 
@@ -135,6 +137,7 @@ unalias(const char *name)
 				ckfree(ap);
 				INTON;
 			}
+			aliases--;
 			return (0);
 		}
 	}
@@ -168,6 +171,7 @@ rmaliases(void)
 			ckfree(tmp);
 		}
 	}
+	aliases = 0;
 	INTON;
 }
 
@@ -187,9 +191,47 @@ lookupalias(char *name, int check)
 	return (NULL);
 }
 
-/*
- * TODO - sort output
- */
+static int
+comparealiases(const void *p1, const void *p2)
+{
+	const struct alias *const *a1 = p1;
+	const struct alias *const *a2 = p2;
+
+	return strcmp((*a1)->name, (*a2)->name);
+}
+
+static void
+printalias(const struct alias *a)
+{
+	char *p;
+
+	out1fmt("%s=", a->name);
+	/* Don't print the space added above. */
+	p = a->val + strlen(a->val) - 1;
+	*p = '\0';
+	out1qstr(a->val);
+	*p = ' ';
+	out1c('\n');
+}
+
+static void
+printaliases(void)
+{
+	int i, j;
+	struct alias **sorted, *ap;
+
+	sorted = ckmalloc(aliases * sizeof(*sorted));
+	j = 0;
+	for (i = 0; i < ATABSIZE; i++)
+		for (ap = atab[i]; ap; ap = ap->next)
+			if (*ap->name != '\0')
+				sorted[j++] = ap;
+	qsort(sorted, aliases, sizeof(*sorted), comparealiases);
+	for (i = 0; i < aliases; i++)
+		printalias(sorted[i]);
+	ckfree(sorted);
+}
+
 int
 aliascmd(int argc, char **argv)
 {
@@ -198,21 +240,7 @@ aliascmd(int argc, char **argv)
 	struct alias *ap;
 
 	if (argc == 1) {
-		int i;
-
-		for (i = 0; i < ATABSIZE; i++)
-			for (ap = atab[i]; ap; ap = ap->next) {
-				if (*ap->name != '\0') {
-					out1fmt("%s=", ap->name);
-					/* Don't print the space added
-					 * above. */
-					v = ap->val + strlen(ap->val) - 1;
-					*v = '\0';
-					out1qstr(ap->val);
-					*v = ' ';
-					out1c('\n');
-				}
-			}
+		printaliases();
 		return (0);
 	}
 	while ((n = *++argv) != NULL) {
@@ -220,11 +248,8 @@ aliascmd(int argc, char **argv)
 			if ((ap = lookupalias(n, 0)) == NULL) {
 				outfmt(out2, "alias: %s not found\n", n);
 				ret = 1;
-			} else {
-				out1fmt("alias %s=", n);
-				out1qstr(ap->val);
-				out1c('\n');
-			}
+			} else
+				printalias(ap);
 		else {
 			*v++ = '\0';
 			setalias(n, v);


More information about the svn-src-all mailing list