mf_wcomp.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. /* Funktions for comparing with wild-cards */
  14. #include "mysys_priv.h"
  15. /* Test if a string is "comparable" to a wild-card string */
  16. /* returns 0 if the strings are "comparable" */
  17. char wild_many='*';
  18. char wild_one='?';
  19. char wild_prefix=0; /* QQ this can potentially cause a SIGSEGV */
  20. int wild_compare(register const char *str, register const char *wildstr,
  21.                  pbool str_is_pattern)
  22. {
  23.   char cmp;
  24.   DBUG_ENTER("wild_compare");
  25.   while (*wildstr)
  26.   {
  27.     while (*wildstr && *wildstr != wild_many && *wildstr != wild_one)
  28.     {
  29.       if (*wildstr == wild_prefix && wildstr[1])
  30.       {
  31. wildstr++;
  32.         if (str_is_pattern && *str++ != wild_prefix)
  33.           DBUG_RETURN(1);
  34.       }
  35.       if (*wildstr++ != *str++)
  36.         DBUG_RETURN(1);
  37.     }
  38.     if (! *wildstr )
  39.       DBUG_RETURN(*str != 0);
  40.     if (*wildstr++ == wild_one)
  41.     {
  42.       if (! *str || (str_is_pattern && *str == wild_many))
  43.         DBUG_RETURN(1);                     /* One char; skip */
  44.       if (*str++ == wild_prefix && str_is_pattern && *str)
  45.         str++;
  46.     }
  47.     else
  48.     { /* Found '*' */
  49.       while (str_is_pattern && *str == wild_many)
  50.         str++;
  51.       for (; *wildstr ==  wild_many || *wildstr == wild_one; wildstr++)
  52.         if (*wildstr == wild_many)
  53.         {
  54.           while (str_is_pattern && *str == wild_many)
  55.             str++;
  56.         }
  57.         else
  58.         {
  59.           if (str_is_pattern && *str == wild_prefix && str[1])
  60.             str+=2;
  61.           else if (! *str++)
  62.             DBUG_RETURN (1);
  63.         }
  64.       if (!*wildstr)
  65.         DBUG_RETURN(0); /* '*' as last char: OK */
  66.       if ((cmp= *wildstr) == wild_prefix && wildstr[1] && !str_is_pattern)
  67.         cmp=wildstr[1];
  68.       for (;;str++)
  69.       {
  70.         while (*str && *str != cmp)
  71.           str++;
  72.         if (!*str)
  73.           DBUG_RETURN (1);
  74. if (wild_compare(str,wildstr,str_is_pattern) == 0)
  75.           DBUG_RETURN (0);
  76.       }
  77.       /* We will never come here */
  78.     }
  79.   }
  80.   DBUG_RETURN (*str != 0);
  81. } /* wild_compare */