usr/src/lib/libadr/common/adr_name.c
changeset 604 20d9acfeb7fb
parent 573 f0add9469f92
child 650 265ab927a268
equal deleted inserted replaced
603:71a20acea802 604:20d9acfeb7fb
    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);