mf_wfile.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17. /* Functions for finding files with wildcards */
  18. /*
  19.   The following file-name-test is supported:
  20.   - "name [[,] name...] ; Matches any of used filenames.
  21.   Each name can have "*" and/or "?"
  22.   wild-cards.
  23.   - [wildspec [,]] !wildspec2 ; File that matches wildspec and not
  24.   wildspec2.
  25. */
  26. #include "mysys_priv.h"
  27. #include <m_string.h>
  28. /* Store wildcard-string in a easyer format */
  29. WF_PACK *wf_comp(my_string str)
  30. {
  31.   uint ant;
  32.   int not_pos;
  33.   register my_string pos;
  34.   my_string buffer;
  35.   WF_PACK *ret;
  36.   DBUG_ENTER("wf_comp");
  37.   not_pos= -1; /* Skipp space and '!' in front */
  38.   while (*str == ' ')
  39.     str++;
  40.   if (*str == '!')
  41.   {
  42.     not_pos=0;
  43.     while (*++str == ' ') {};
  44.   }
  45.   if (*str == 0) /* Empty == everything */
  46.     DBUG_RETURN((WF_PACK *) NULL);
  47.   ant=1; /* Count filespecs */
  48.   for (pos=str ; *pos ; pos++)
  49.     ant+= test(*pos == ' ' || *pos == ',');
  50. #ifdef FN_UPPER_CASE
  51.     caseup(str,(int) (pos-str));
  52. #endif
  53. #ifdef FN_LOWER_CASE
  54.     casedn(str,(int) (pos-str));
  55. #endif
  56.   if ((ret= (WF_PACK*) my_malloc((uint) ant*(sizeof(my_string*)+2)+
  57.  sizeof(WF_PACK)+ (uint) strlen(str)+1,
  58.  MYF(MY_WME)))
  59. == 0)
  60.     DBUG_RETURN((WF_PACK *) NULL);
  61.   ret->wild= (my_string*) (ret+1);
  62.   buffer= (my_string) (ret->wild+ant);
  63.   ant=0;
  64.   for (pos=str ; *pos ; str= pos)
  65.   {
  66.     ret->wild[ant++]=buffer;
  67.     while (*pos != ' ' && *pos != ',' && *pos != '!' && *pos)
  68.       *buffer++ = *pos++;
  69.     *buffer++ = '';
  70.     while (*pos == ' ' || *pos == ',' || *pos == '!' )
  71.       if (*pos++ == '!' && not_pos <0)
  72. not_pos=(int) ant;
  73.   }
  74.   ret->wilds=ant;
  75.   if (not_pos <0)
  76.     ret->not_pos=ant;
  77.   else
  78.     ret->not_pos=(uint) not_pos;
  79.   DBUG_PRINT("exit",("antal: %d  not_pos: %d",ret->wilds,ret->not_pos));
  80.   DBUG_RETURN(ret);
  81. } /* wf_comp */
  82. /* Test if a given filename is matched */
  83. int wf_test(register WF_PACK *wf_pack, register const char *name)
  84. {
  85.   reg2 uint i;
  86.   reg3 uint not_pos;
  87.   DBUG_ENTER("wf_test");
  88.   if (! wf_pack || wf_pack->wilds == 0)
  89.     DBUG_RETURN(0); /* Everything goes */
  90.   not_pos=wf_pack->not_pos;
  91.   for (i=0 ; i < not_pos; i++)
  92.     if (wild_compare(name,wf_pack->wild[i]) == 0)
  93.       goto found;
  94.   if (i)
  95.     DBUG_RETURN(1); /* No-match */
  96. found:
  97. /* Test that it isn't in not-list */
  98.   for (i=not_pos ; i < wf_pack->wilds; i++)
  99.     if (wild_compare(name,wf_pack->wild[i]) == 0)
  100.       DBUG_RETURN(1);
  101.   DBUG_RETURN(0);
  102. } /* wf_test */
  103. /* We need this because program don't know with malloc we used */
  104. void wf_end(WF_PACK *buffer)
  105. {
  106.   DBUG_ENTER("wf_end");
  107.   if (buffer)
  108.     my_free((gptr) buffer,MYF(0));
  109.   DBUG_VOID_RETURN;
  110. } /* wf_end */