ptr_cmp.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /*
  14.   get_ptr_compare(len) returns a pointer to a optimal byte-compare function
  15.   for a array of stringpointer where all strings have size len.
  16.   The bytes are compare as unsigned chars.
  17.   */
  18. #include "mysys_priv.h"
  19. static int ptr_compare(uint *compare_length, uchar **a, uchar **b);
  20. static int ptr_compare_0(uint *compare_length, uchar **a, uchar **b);
  21. static int ptr_compare_1(uint *compare_length, uchar **a, uchar **b);
  22. static int ptr_compare_2(uint *compare_length, uchar **a, uchar **b);
  23. static int ptr_compare_3(uint *compare_length, uchar **a, uchar **b);
  24. /* Get a pointer to a optimal byte-compare function for a given size */
  25. qsort2_cmp get_ptr_compare (uint size)
  26. {
  27.   if (size < 4)
  28.     return (qsort2_cmp) ptr_compare;
  29.   switch (size & 3) {
  30.     case 0: return (qsort2_cmp) ptr_compare_0;
  31.     case 1: return (qsort2_cmp) ptr_compare_1;
  32.     case 2: return (qsort2_cmp) ptr_compare_2;
  33.     case 3: return (qsort2_cmp) ptr_compare_3;
  34.     }
  35.   return 0; /* Impossible */
  36. }
  37. /*
  38.   Compare to keys to see witch is smaller.
  39.   Loop unrolled to make it quick !!
  40. */
  41. #define cmp(N) if (first[N] != last[N]) return (int) first[N] - (int) last[N]
  42. static int ptr_compare(uint *compare_length, uchar **a, uchar **b)
  43. {
  44.   reg3 int length= *compare_length;
  45.   reg1 uchar *first,*last;
  46.   first= *a; last= *b;
  47.   while (--length)
  48.   {
  49.     if (*first++ != *last++)
  50.       return (int) first[-1] - (int) last[-1];
  51.   }
  52.   return (int) first[0] - (int) last[0];
  53. }
  54. static int ptr_compare_0(uint *compare_length,uchar **a, uchar **b)
  55. {
  56.   reg3 int length= *compare_length;
  57.   reg1 uchar *first,*last;
  58.   first= *a; last= *b;
  59.  loop:
  60.   cmp(0);
  61.   cmp(1);
  62.   cmp(2);
  63.   cmp(3);
  64.   if ((length-=4))
  65.   {
  66.     first+=4;
  67.     last+=4;
  68.     goto loop;
  69.   }
  70.   return (0);
  71. }
  72. static int ptr_compare_1(uint *compare_length,uchar **a, uchar **b)
  73. {
  74.   reg3 int length= *compare_length-1;
  75.   reg1 uchar *first,*last;
  76.   first= *a+1; last= *b+1;
  77.   cmp(-1);
  78.  loop:
  79.   cmp(0);
  80.   cmp(1);
  81.   cmp(2);
  82.   cmp(3);
  83.   if ((length-=4))
  84.   {
  85.     first+=4;
  86.     last+=4;
  87.     goto loop;
  88.   }
  89.   return (0);
  90. }
  91. static int ptr_compare_2(uint *compare_length,uchar **a, uchar **b)
  92. {
  93.   reg3 int length= *compare_length-2;
  94.   reg1 uchar *first,*last;
  95.   first= *a +2 ; last= *b +2;
  96.   cmp(-2);
  97.   cmp(-1);
  98.  loop:
  99.   cmp(0);
  100.   cmp(1);
  101.   cmp(2);
  102.   cmp(3);
  103.   if ((length-=4))
  104.   {
  105.     first+=4;
  106.     last+=4;
  107.     goto loop;
  108.   }
  109.   return (0);
  110. }
  111. static int ptr_compare_3(uint *compare_length,uchar **a, uchar **b)
  112. {
  113.   reg3 int length= *compare_length-3;
  114.   reg1 uchar *first,*last;
  115.   first= *a +3 ; last= *b +3;
  116.   cmp(-3);
  117.   cmp(-2);
  118.   cmp(-1);
  119.  loop:
  120.   cmp(0);
  121.   cmp(1);
  122.   cmp(2);
  123.   cmp(3);
  124.   if ((length-=4))
  125.   {
  126.     first+=4;
  127.     last+=4;
  128.     goto loop;
  129.   }
  130.   return (0);
  131. }