1 /*=============================================================================
\r
5 ===============================================================================
\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.
\r
8 / Redistribution and use in source and binary forms, with or without
\r
9 / modification, are permitted provided that the following conditions
\r
12 / 1. Redistributions of source code must retain the above copyright
\r
13 / notice, this list of conditions and the following disclaimer.
\r
14 / 2. Redistributions in binary form must reproduce the above copyright
\r
15 / notice, this list of conditions and the following disclaimer in the
\r
16 / documentation and/or other materials provided with the distribution.
\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
\r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
\r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
\r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
\r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
\r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
\r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
\r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
\r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
\r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
28 /============================================================================*/
\r
34 //#include <winsock.h>
\r
35 #include <winsock2.h>
\r
36 #include <windowsx.h>
\r
42 /*===== プロトタイプ =====*/
\r
44 static int CheckNameMatch(char *str, char *regexp);
\r
48 /*----- ワイルドカードにマッチするかどうかを返す ------------------------------
\r
52 * char *regexp : ワイルドカード検索式
\r
56 * FFFTP_SUCCESS/FFFTP_FAIL
\r
59 * VAX VMSの時は ; 以降は無視する
\r
60 *----------------------------------------------------------------------------*/
\r
62 int CheckFname(char *str, char *regexp)
\r
65 char p1[FMAX_PATH+1];
\r
66 char p2[FMAX_PATH+1];
\r
72 /* VAX VMSの時のための処理 */
\r
73 if(AskHostType() == HTYPE_VMS)
\r
75 if((p = strchr(p2, ';')) != NULL)
\r
79 /* *? とか ** とかを削除 */
\r
80 for(p = p1; *p != NUL; p++)
\r
82 while((*p == '*') && ((*(p+1) == '?') || (*(p+1) == '*')))
\r
83 memmove(p+1, p+2, strlen(p+2)+1);
\r
86 if((strcmp(p1, "*.*") == 0) || (strcmp(p1, "????????.???") == 0))
\r
89 Sts = FFFTP_SUCCESS;
\r
90 if(strcmp(p1, "*") != 0)
\r
92 if(strcmp(p1, "*.") == 0)
\r
94 p = strchr(p2, '.');
\r
95 if((p != NULL) && (*(p+1) != NUL))
\r
99 Sts = CheckNameMatch(p2, p1);
\r
105 /*----- ワイルドカード検索サブルーチン ----------------------------------------
\r
109 * char *regexp : ワイルドカード検索式
\r
113 * FFFTP_SUCCESS/FFFTP_FAIL
\r
114 *----------------------------------------------------------------------------*/
\r
116 static int CheckNameMatch(char *str, char *regexp)
\r
120 for(p = regexp; (*p != NUL) && (*str != NUL); )
\r
130 /* Look for a character matching the one after the '*' */
\r
133 return FFFTP_SUCCESS; /* Automatic match */
\r
136 while((*str != NUL) && (toupper(*p)!=toupper(*str)))
\r
138 if(CheckNameMatch(str, p))
\r
139 return FFFTP_SUCCESS;
\r
148 if(toupper(*str) != toupper(*p))
\r
156 if((*p == NUL) && (*str == NUL))
\r
157 return FFFTP_SUCCESS;
\r
159 if ((*p != NUL) && (str[0] == '.') && (str[1] == 0))
\r
160 return(FFFTP_SUCCESS);
\r
162 if ((*str == NUL) && (*p == '?'))
\r
169 if((*str == NUL) && (*p == '*') && (p[1] == '\0'))
\r
170 return FFFTP_SUCCESS;
\r