[BACK]Return to qsort.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libc / stdlib

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/lib/libc/stdlib/qsort.c between version 1.22 and 1.23

version 1.22, 2012/05/26 21:47:05 version 1.23, 2017/05/19 19:48:19
Line 1 
Line 1 
 /*      $NetBSD$        */  /*      $NetBSD$        */
   
 /*-  /*-
  * Copyright (c) 1992, 1993   * Copyright (c) 1992, 1993
  *      The Regents of the University of California.  All rights reserved.   *      The Regents of the University of California.  All rights reserved.
Line 102  qsort(void *a, size_t n, size_t es,
Line 101  qsort(void *a, size_t n, size_t es,
     int (*cmp)(const void *, const void *))      int (*cmp)(const void *, const void *))
 {  {
         char *pa, *pb, *pc, *pd, *pl, *pm, *pn;          char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
         size_t d, r;          size_t d, r, s;
         int swaptype, cmp_result;          int swaptype, cmp_result;
   
         _DIAGASSERT(a != NULL || n == 0 || es == 0);          _DIAGASSERT(a != NULL || n == 0 || es == 0);
Line 159  loop: SWAPINIT(a, es);
Line 158  loop: SWAPINIT(a, es);
         vecswap(a, pb - r, r);          vecswap(a, pb - r, r);
         r = min((size_t)(pd - pc), pn - pd - es);          r = min((size_t)(pd - pc), pn - pd - es);
         vecswap(pb, pn - r, r);          vecswap(pb, pn - r, r);
         if ((r = pb - pa) > es)          /*
                 qsort(a, r / es, es, cmp);           * To save stack space we sort the smaller side of the partition first
         if ((r = pd - pc) > es) {           * using recursion and eliminate tail recursion for the larger side.
                 /* Iterate rather than recurse to save stack space */           */
                 a = pn - r;          r = pb - pa;
                 n = r / es;          s = pd - pc;
                 goto loop;          if (r < s) {
                   /* Recurse for 1st side, iterate for 2nd side. */
                   if (s > es) {
                           if (r > es)
                                   qsort(a, r / es, es, cmp);
                           a = pn - s;
                           n = s / es;
                           goto loop;
                   }
           } else {
                   /* Recurse for 2nd side, iterate for 1st side. */
                   if (r > es) {
                           if (s > es)
                                   qsort(pn - s, s / es, es, cmp);
                           n = r / es;
                           goto loop;
                   }
         }          }
 /*              qsort(pn - r, r / es, es, cmp);*/  
 }  }

Legend:
Removed from v.1.22  
changed lines
  Added in v.1.23

CVSweb <webmaster@jp.NetBSD.org>