--- 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);
}