mf_wfile.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. /* Functions for finding files with wildcards */
  14. /*
  15.   The following file-name-test is supported:
  16.   - "name [[,] name...] ; Matches any of used filenames.
  17.   Each name can have "*" and/or "?"
  18.   wild-cards.
  19.   - [wildspec [,]] !wildspec2 ; File that matches wildspec and not
  20.   wildspec2.
  21. */
  22. #include "mysys_priv.h"
  23. #include <m_string.h>
  24. /* Store wildcard-string in a easyer format */
  25. WF_PACK *wf_comp(my_string str)
  26. {
  27.   uint ant;
  28.   int not_pos;
  29.   register my_string pos;
  30.   my_string buffer;
  31.   WF_PACK *ret;
  32.   DBUG_ENTER("wf_comp");
  33.   not_pos= -1; /* Skip space and '!' in front */
  34.   while (*str == ' ')
  35.     str++;
  36.   if (*str == '!')
  37.   {
  38.     not_pos=0;
  39.     while (*++str == ' ') {};
  40.   }
  41.   if (*str == 0) /* Empty == everything */
  42.     DBUG_RETURN((WF_PACK *) NULL);
  43.   ant=1; /* Count filespecs */
  44.   for (pos=str ; *pos ; pos++)
  45.     ant+= test(*pos == ' ' || *pos == ',');
  46.   if ((ret= (WF_PACK*) my_malloc((uint) ant*(sizeof(my_string*)+2)+
  47.  sizeof(WF_PACK)+ (uint) strlen(str)+1,
  48.  MYF(MY_WME)))
  49. == 0)
  50.     DBUG_RETURN((WF_PACK *) NULL);
  51.   ret->wild= (my_string*) (ret+1);
  52.   buffer= (my_string) (ret->wild+ant);
  53.   ant=0;
  54.   for (pos=str ; *pos ; str= pos)
  55.   {
  56.     ret->wild[ant++]=buffer;
  57.     while (*pos != ' ' && *pos != ',' && *pos != '!' && *pos)
  58.       *buffer++ = *pos++;
  59.     *buffer++ = '';
  60.     while (*pos == ' ' || *pos == ',' || *pos == '!' )
  61.       if (*pos++ == '!' && not_pos <0)
  62. not_pos=(int) ant;
  63.   }
  64.   ret->wilds=ant;
  65.   if (not_pos <0)
  66.     ret->not_pos=ant;
  67.   else
  68.     ret->not_pos=(uint) not_pos;
  69.   DBUG_PRINT("exit",("antal: %d  not_pos: %d",ret->wilds,ret->not_pos));
  70.   DBUG_RETURN(ret);
  71. } /* wf_comp */
  72. /* Test if a given filename is matched */
  73. int wf_test(register WF_PACK *wf_pack, register const char *name)
  74. {
  75.   reg2 uint i;
  76.   reg3 uint not_pos;
  77.   DBUG_ENTER("wf_test");
  78.   if (! wf_pack || wf_pack->wilds == 0)
  79.     DBUG_RETURN(0); /* Everything goes */
  80.   not_pos=wf_pack->not_pos;
  81.   for (i=0 ; i < not_pos; i++)
  82.     if (wild_compare(name,wf_pack->wild[i],0) == 0)
  83.       goto found;
  84.   if (i)
  85.     DBUG_RETURN(1); /* No-match */
  86. found:
  87. /* Test that it isn't in not-list */
  88.   for (i=not_pos ; i < wf_pack->wilds; i++)
  89.     if (wild_compare(name,wf_pack->wild[i],0) == 0)
  90.       DBUG_RETURN(1);
  91.   DBUG_RETURN(0);
  92. } /* wf_test */
  93. /* We need this because program don't know with malloc we used */
  94. void wf_end(WF_PACK *buffer)
  95. {
  96.   DBUG_ENTER("wf_end");
  97.   if (buffer)
  98.     my_free((gptr) buffer,MYF(0));
  99.   DBUG_VOID_RETURN;
  100. } /* wf_end */