usr/src/lib/libadr/common/adr_name.c
changeset 604 20d9acfeb7fb
parent 573 f0add9469f92
child 650 265ab927a268
--- a/usr/src/lib/libadr/common/adr_name.c	Mon Nov 22 10:50:58 2010 -0500
+++ b/usr/src/lib/libadr/common/adr_name.c	Tue Nov 23 15:54:20 2010 -0800
@@ -46,8 +46,10 @@
 	int an_refs;
 	int an_count;
 	char *an_domain;
-	char **an_keys;
-	char **an_values;
+	char **an_keys;		/* Unsorted keys */
+	char **an_values;	/* Unsorted values */
+	char **an_skeys;	/* Sorted keys */
+	char **an_svalues;	/* Sorted values */
 };
 
 #define	zalloc(x)	calloc(1, x)
@@ -70,8 +72,10 @@
 	(void) pthread_mutex_init(&result->an_lock, NULL);
 	result->an_refs = 1;
 	result->an_count = n;
-	result->an_keys = zalloc(2 * n * sizeof (char *));
+	result->an_keys = zalloc(4 * n * sizeof (char *));
 	result->an_values = &result->an_keys[n];
+	result->an_skeys = &result->an_keys[2 * n];
+	result->an_svalues = &result->an_keys[3 * n];
 	if (result->an_keys == NULL) {
 		free(result);
 		return (NULL);
@@ -87,20 +91,25 @@
 adr_name_normalize(adr_name_t *name)
 {
 	int c = name->an_count;
+	for (int i = 0; i < c; i++) {
+		name->an_skeys[i] = name->an_keys[i];
+		name->an_svalues[i] = name->an_values[i];
+	}
+
 	for (int i = 0; i < c - 1; i++) {
 		for (int j = i + 1; j < c; j++) {
-			int res = strcmp(name->an_keys[i], name->an_keys[j]);
+			int res = strcmp(name->an_skeys[i], name->an_skeys[j]);
 			if (res == 0) {
 				adr_name_free(name);
 				return (NULL);
 			}
 			if (res > 0) {
-				char *ktmp = name->an_keys[i];
-				char *vtmp = name->an_values[i];
-				name->an_keys[i] = name->an_keys[j];
-				name->an_values[i] = name->an_values[j];
-				name->an_keys[j] = ktmp;
-				name->an_values[j] = vtmp;
+				char *ktmp = name->an_skeys[i];
+				char *vtmp = name->an_svalues[i];
+				name->an_skeys[i] = name->an_skeys[j];
+				name->an_svalues[i] = name->an_svalues[j];
+				name->an_skeys[j] = ktmp;
+				name->an_svalues[j] = vtmp;
 			}
 		}
 	}
@@ -482,12 +491,12 @@
 	if (n1->an_count > n2->an_count)
 		return (1);
 
-	/* Assumes order is either normalized or significant. */
+	/* Compare pre-sorted key/value pairs */
 	for (int i = 0; i < n1->an_count; i++) {
-		res = strcmp(n1->an_keys[i], n2->an_keys[i]);
+		res = strcmp(n1->an_skeys[i], n2->an_skeys[i]);
 		if (res != 0)
 			return (res);
-		res = strcmp(n1->an_values[i], n2->an_values[i]);
+		res = strcmp(n1->an_svalues[i], n2->an_svalues[i]);
 		if (res != 0)
 			return (res);
 	}