int wf_test(register WF_PACK *wf_pack, register const char *name)
{
  reg2 uint i;
  reg3 uint not_pos;
  DBUG_ENTER("wf_test");

  if (! wf_pack || wf_pack->wilds == 0)
    DBUG_RETURN(0);			/* Everything goes */

  not_pos=wf_pack->not_pos;
  for (i=0 ; i < not_pos; i++)
    if (wild_compare(name,wf_pack->wild[i],0) == 0)
      goto found;
  if (i)
    DBUG_RETURN(1);			/* No-match */

found:
/* Test that it isn't in not-list */

  for (i=not_pos ; i < wf_pack->wilds; i++)
    if (wild_compare(name,wf_pack->wild[i],0) == 0)
      DBUG_RETURN(1);
  DBUG_RETURN(0);
} /* wf_test */
예제 #2
0
파일: mf_wcomp.c 프로젝트: Aisun/SQLAdvisor
int wild_compare(register const char *str, register const char *wildstr,
                 pbool str_is_pattern)
{
  char cmp;
  DBUG_ENTER("wild_compare");

  while (*wildstr)
  {
    while (*wildstr && *wildstr != wild_many && *wildstr != wild_one)
    {
      if (*wildstr == wild_prefix && wildstr[1])
      {
	wildstr++;
        if (str_is_pattern && *str++ != wild_prefix)
          DBUG_RETURN(1);
      }
      if (*wildstr++ != *str++)
        DBUG_RETURN(1);
    }
    if (! *wildstr )
      DBUG_RETURN(*str != 0);
    if (*wildstr++ == wild_one)
    {
      if (! *str || (str_is_pattern && *str == wild_many))
        DBUG_RETURN(1);                     /* One char; skip */
      if (*str++ == wild_prefix && str_is_pattern && *str)
        str++;
    }
    else
    {						/* Found '*' */
      while (str_is_pattern && *str == wild_many)
        str++;
      for (; *wildstr ==  wild_many || *wildstr == wild_one; wildstr++)
        if (*wildstr == wild_many)
        {
          while (str_is_pattern && *str == wild_many)
            str++;
        }
        else
        {
          if (str_is_pattern && *str == wild_prefix && str[1])
            str+=2;
          else if (! *str++)
            DBUG_RETURN (1);
        }
      if (!*wildstr)
        DBUG_RETURN(0);		/* '*' as last char: OK */
      if ((cmp= *wildstr) == wild_prefix && wildstr[1] && !str_is_pattern)
        cmp=wildstr[1];
      for (;;str++)
      {
        while (*str && *str != cmp)
          str++;
        if (!*str)
          DBUG_RETURN (1);
	if (wild_compare(str,wildstr,str_is_pattern) == 0)
          DBUG_RETURN (0);
      }
      /* We will never come here */
    }
  }
  DBUG_RETURN (*str != 0);
} /* wild_compare */