]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
rr.c: (ldns_rr_list_sort) Use qsort(3) instead of bubble sort.
authorErik Rozendaal <erik@NLnetLabs.nl>
Thu, 24 Feb 2005 13:55:10 +0000 (13:55 +0000)
committerErik Rozendaal <erik@NLnetLabs.nl>
Thu, 24 Feb 2005 13:55:10 +0000 (13:55 +0000)
ldns/rr.h
rr.c
run-test9.c

index 34b9388d163179d833816aca7e5f1a2350d9d32d..b762a9db4d0c9d81f19c9753b07030fa39bed990 100644 (file)
--- 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 6657b78239480445e14a3dc9990792c01780f48b..df5496d78ef345055dcdddb9a07cd986abf1df97 100644 (file)
--- 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 */
index 1b55eced918cac8a0d7f2f3f43926997d6c29cb9..35f70963083de22de16fa511abadc23e1666356e 100644 (file)
 #include <ldns/host2str.h>
 
 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);