From: Erik Rozendaal Date: Thu, 24 Feb 2005 13:55:10 +0000 (+0000) Subject: rr.c: (ldns_rr_list_sort) Use qsort(3) instead of bubble sort. X-Git-Tag: release-0.50~377 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=53b4f0576f7259c206f48ebc1581ebafafb16c8e;p=thirdparty%2Fldns.git rr.c: (ldns_rr_list_sort) Use qsort(3) instead of bubble sort. --- diff --git a/ldns/rr.h b/ldns/rr.h index 34b9388d..b762a9db 100644 --- a/ldns/rr.h +++ b/ldns/rr.h @@ -266,8 +266,8 @@ ldns_rdf_type ldns_rr_descriptor_field_type(const ldns_rr_descriptor *, size_t); ldns_rr_type ldns_rr_get_type_by_name(char *); ldns_rr_class ldns_get_class_by_name(char *); size_t ldns_rr_uncompressed_size(ldns_rr *); -int ldns_rr_compare(const void *, const void *); -void ldns_rr_list_sort(ldns_rr_list **); +int ldns_rr_compare(const ldns_rr *rr1, const ldns_rr *rr2); +void ldns_rr_list_sort(ldns_rr_list *); diff --git a/rr.c b/rr.c index 6657b782..df5496d7 100644 --- a/rr.c +++ b/rr.c @@ -614,47 +614,25 @@ ldns_get_class_by_name(char *name) return 0; } +static int +qsort_rr_compare(const void *a, const void *b) +{ + const ldns_rr *rr1 = * (const ldns_rr **) a; + const ldns_rr *rr2 = * (const ldns_rr **) b; + return ldns_rr_compare(rr1, rr2); +} + /** * sort an rr_list. the sorting is done inband * \param[in] unsorted the rr_list to be sorted */ void -ldns_rr_list_sort(ldns_rr_list **unsorted) +ldns_rr_list_sort(ldns_rr_list *unsorted) { - /* we have a small amount of data (usually) go with the good - * old bubble sort ;-) */ - uint16_t rr_count; - uint16_t i,j; - ldns_rr *ri, *rj; - - rr_count = ldns_rr_list_rr_count(*unsorted); - for(i = 0; i < rr_count; i++) { - ri = ldns_rr_list_rr(*unsorted, i); - for(j = i; j < rr_count; j++) { - rj = ldns_rr_list_rr(*unsorted, j); - - switch(ldns_rr_compare(ri, rj)) { - /* equal */ - case 0: - /* equal - nop */ - case -1: - /* i before j - nop */ - break; - case 1: - /* switch */ - (*unsorted)->_rrs[i] = rj; - (*unsorted)->_rrs[j] = ri; - break; - } - } - } - - /* - qsort((void *)(*unsorted)->_rrs, rr_count, sizeof(ldns_rr), - ldns_rr_compare); - ...segfaults... - */ - + qsort(unsorted->_rrs, + ldns_rr_list_rr_count(unsorted), + sizeof(ldns_rr *), + qsort_rr_compare); } @@ -667,7 +645,7 @@ ldns_rr_list_sort(ldns_rr_list **unsorted) * +1 if rr2 comes before rr1 */ int -ldns_rr_compare(const void *rr1, const void *rr2) +ldns_rr_compare(const ldns_rr *rr1, const ldns_rr *rr2) { ldns_buffer *rr1_buf; ldns_buffer *rr2_buf; @@ -675,8 +653,8 @@ ldns_rr_compare(const void *rr1, const void *rr2) size_t rr2_len; size_t i; - rr1_len = ldns_rr_uncompressed_size((ldns_rr*)rr1); - rr2_len = ldns_rr_uncompressed_size((ldns_rr*)rr2); + rr1_len = ldns_rr_uncompressed_size(rr1); + rr2_len = ldns_rr_uncompressed_size(rr2); if (rr1_len < rr2_len) { return -1; @@ -688,10 +666,10 @@ ldns_rr_compare(const void *rr1, const void *rr2) rr1_buf = ldns_buffer_new(rr1_len); rr2_buf = ldns_buffer_new(rr2_len); - if (ldns_rr2buffer_wire(rr1_buf, (ldns_rr*)rr1, LDNS_SECTION_ANY) != LDNS_STATUS_OK) { + if (ldns_rr2buffer_wire(rr1_buf, rr1, LDNS_SECTION_ANY) != LDNS_STATUS_OK) { return 0; /* XXX uhm, tja */ } - if (ldns_rr2buffer_wire(rr2_buf, (ldns_rr*)rr2, LDNS_SECTION_ANY) != LDNS_STATUS_OK) { + if (ldns_rr2buffer_wire(rr2_buf, rr2, LDNS_SECTION_ANY) != LDNS_STATUS_OK) { return 0; } /* now compare the buffer's byte for byte */ diff --git a/run-test9.c b/run-test9.c index 1b55eced..35f70963 100644 --- a/run-test9.c +++ b/run-test9.c @@ -12,20 +12,25 @@ #include int -main(void) +main(int argc, char **argv) { ldns_resolver *res; ldns_rdf *qname; ldns_rdf *nameserver; ldns_pkt *pkt; ldns_rr_list *bla; - + const char *nameserver_address = "127.0.0.1"; + + if (argc >= 2) { + nameserver_address = argv[1]; + } + /* init */ res = ldns_resolver_new(); if (!res) return -1; - nameserver = ldns_rdf_new_frm_str("127.0.0.1", LDNS_RDF_TYPE_A); + nameserver = ldns_rdf_new_frm_str(nameserver_address, LDNS_RDF_TYPE_A); if (ldns_resolver_push_nameserver(res, nameserver) != LDNS_STATUS_OK) { printf("error push nameserver\n"); return -1; @@ -44,7 +49,7 @@ main(void) ldns_rr_list_print(stdout, bla); - ldns_rr_list_sort(&bla); + ldns_rr_list_sort(bla); printf("sorted\n"); ldns_rr_list_print(stdout, bla);