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
33 #include <winsock.h>
\r
34 #include <windowsx.h>
\r
40 /*===== プロトタイプ =====*/
\r
42 static int CheckNameMatch(char *str, char *regexp);
\r
46 /*----- ワイルドカードにマッチするかどうかを返す ------------------------------
\r
50 * char *regexp : ワイルドカード検索式
\r
54 * FFFTP_SUCCESS/FFFTP_FAIL
\r
57 * VAX VMSの時は ; 以降は無視する
\r
58 *----------------------------------------------------------------------------*/
\r
60 int CheckFname(char *str, char *regexp)
\r
63 char p1[FMAX_PATH+1];
\r
64 char p2[FMAX_PATH+1];
\r
70 /* VAX VMSの時のための処理 */
\r
71 if(AskHostType() == HTYPE_VMS)
\r
73 if((p = strchr(p2, ';')) != NULL)
\r
77 /* *? とか ** とかを削除 */
\r
78 for(p = p1; *p != NUL; p++)
\r
80 while((*p == '*') && ((*(p+1) == '?') || (*(p+1) == '*')))
\r
81 memmove(p+1, p+2, strlen(p+2)+1);
\r
84 if((strcmp(p1, "*.*") == 0) || (strcmp(p1, "????????.???") == 0))
\r
87 Sts = FFFTP_SUCCESS;
\r
88 if(strcmp(p1, "*") != 0)
\r
90 if(strcmp(p1, "*.") == 0)
\r
92 p = strchr(p2, '.');
\r
93 if((p != NULL) && (*(p+1) != NUL))
\r
97 Sts = CheckNameMatch(p2, p1);
\r
103 /*----- ワイルドカード検索サブルーチン ----------------------------------------
\r
107 * char *regexp : ワイルドカード検索式
\r
111 * FFFTP_SUCCESS/FFFTP_FAIL
\r
112 *----------------------------------------------------------------------------*/
\r
114 static int CheckNameMatch(char *str, char *regexp)
\r
118 for(p = regexp; (*p != NUL) && (*str != NUL); )
\r
128 /* Look for a character matching the one after the '*' */
\r
131 return FFFTP_SUCCESS; /* Automatic match */
\r
134 while((*str != NUL) && (toupper(*p)!=toupper(*str)))
\r
136 if(CheckNameMatch(str, p))
\r
137 return FFFTP_SUCCESS;
\r
146 if(toupper(*str) != toupper(*p))
\r
154 if((*p == NUL) && (*str == NUL))
\r
155 return FFFTP_SUCCESS;
\r
157 if ((*p != NUL) && (str[0] == '.') && (str[1] == 0))
\r
158 return(FFFTP_SUCCESS);
\r
160 if ((*str == NUL) && (*p == '?'))
\r
167 if((*str == NUL) && (*p == '*') && (p[1] == '\0'))
\r
168 return FFFTP_SUCCESS;
\r