home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / mysys / mf_wfile.c < prev    next >
C/C++ Source or Header  |  2000-08-31  |  3KB  |  134 lines

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