equal
deleted
inserted
replaced
44 struct adr_name { |
44 struct adr_name { |
45 pthread_mutex_t an_lock; |
45 pthread_mutex_t an_lock; |
46 int an_refs; |
46 int an_refs; |
47 int an_count; |
47 int an_count; |
48 char *an_domain; |
48 char *an_domain; |
49 char **an_keys; |
49 char **an_keys; /* Unsorted keys */ |
50 char **an_values; |
50 char **an_values; /* Unsorted values */ |
|
51 char **an_skeys; /* Sorted keys */ |
|
52 char **an_svalues; /* Sorted values */ |
51 }; |
53 }; |
52 |
54 |
53 #define zalloc(x) calloc(1, x) |
55 #define zalloc(x) calloc(1, x) |
54 |
56 |
55 static void |
57 static void |
68 return (NULL); |
70 return (NULL); |
69 |
71 |
70 (void) pthread_mutex_init(&result->an_lock, NULL); |
72 (void) pthread_mutex_init(&result->an_lock, NULL); |
71 result->an_refs = 1; |
73 result->an_refs = 1; |
72 result->an_count = n; |
74 result->an_count = n; |
73 result->an_keys = zalloc(2 * n * sizeof (char *)); |
75 result->an_keys = zalloc(4 * n * sizeof (char *)); |
74 result->an_values = &result->an_keys[n]; |
76 result->an_values = &result->an_keys[n]; |
|
77 result->an_skeys = &result->an_keys[2 * n]; |
|
78 result->an_svalues = &result->an_keys[3 * n]; |
75 if (result->an_keys == NULL) { |
79 if (result->an_keys == NULL) { |
76 free(result); |
80 free(result); |
77 return (NULL); |
81 return (NULL); |
78 } |
82 } |
79 |
83 |
85 */ |
89 */ |
86 static adr_name_t * |
90 static adr_name_t * |
87 adr_name_normalize(adr_name_t *name) |
91 adr_name_normalize(adr_name_t *name) |
88 { |
92 { |
89 int c = name->an_count; |
93 int c = name->an_count; |
|
94 for (int i = 0; i < c; i++) { |
|
95 name->an_skeys[i] = name->an_keys[i]; |
|
96 name->an_svalues[i] = name->an_values[i]; |
|
97 } |
|
98 |
90 for (int i = 0; i < c - 1; i++) { |
99 for (int i = 0; i < c - 1; i++) { |
91 for (int j = i + 1; j < c; j++) { |
100 for (int j = i + 1; j < c; j++) { |
92 int res = strcmp(name->an_keys[i], name->an_keys[j]); |
101 int res = strcmp(name->an_skeys[i], name->an_skeys[j]); |
93 if (res == 0) { |
102 if (res == 0) { |
94 adr_name_free(name); |
103 adr_name_free(name); |
95 return (NULL); |
104 return (NULL); |
96 } |
105 } |
97 if (res > 0) { |
106 if (res > 0) { |
98 char *ktmp = name->an_keys[i]; |
107 char *ktmp = name->an_skeys[i]; |
99 char *vtmp = name->an_values[i]; |
108 char *vtmp = name->an_svalues[i]; |
100 name->an_keys[i] = name->an_keys[j]; |
109 name->an_skeys[i] = name->an_skeys[j]; |
101 name->an_values[i] = name->an_values[j]; |
110 name->an_svalues[i] = name->an_svalues[j]; |
102 name->an_keys[j] = ktmp; |
111 name->an_skeys[j] = ktmp; |
103 name->an_values[j] = vtmp; |
112 name->an_svalues[j] = vtmp; |
104 } |
113 } |
105 } |
114 } |
106 } |
115 } |
107 return (name); |
116 return (name); |
108 } |
117 } |
480 if (n1->an_count < n2->an_count) |
489 if (n1->an_count < n2->an_count) |
481 return (-1); |
490 return (-1); |
482 if (n1->an_count > n2->an_count) |
491 if (n1->an_count > n2->an_count) |
483 return (1); |
492 return (1); |
484 |
493 |
485 /* Assumes order is either normalized or significant. */ |
494 /* Compare pre-sorted key/value pairs */ |
486 for (int i = 0; i < n1->an_count; i++) { |
495 for (int i = 0; i < n1->an_count; i++) { |
487 res = strcmp(n1->an_keys[i], n2->an_keys[i]); |
496 res = strcmp(n1->an_skeys[i], n2->an_skeys[i]); |
488 if (res != 0) |
497 if (res != 0) |
489 return (res); |
498 return (res); |
490 res = strcmp(n1->an_values[i], n2->an_values[i]); |
499 res = strcmp(n1->an_svalues[i], n2->an_svalues[i]); |
491 if (res != 0) |
500 if (res != 0) |
492 return (res); |
501 return (res); |
493 } |
502 } |
494 |
503 |
495 return (0); |
504 return (0); |