OSDN Git Service

Add support for MLSD responses from some broken hosts.
[ffftp/ffftp.git] / wildcard.c
1 /*=============================================================================\r
2 *\r
3 *                                                       ワイルドカード検索\r
4 *\r
5 ===============================================================================\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.\r
7 /\r
8 / Redistribution and use in source and binary forms, with or without \r
9 / modification, are permitted provided that the following conditions \r
10 / are met:\r
11 /\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
17 /\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
29 \r
30 #define STRICT\r
31 #include <stdio.h>\r
32 #include <stdlib.h>\r
33 // IPv6対応\r
34 //#include <winsock.h>\r
35 #include <winsock2.h>\r
36 #include <windowsx.h>\r
37 \r
38 #include "common.h"\r
39 #include "jreusr.h"\r
40 \r
41 \r
42 /*===== プロトタイプ =====*/\r
43 \r
44 static int CheckNameMatch(char *str, char *regexp);\r
45 \r
46 \r
47 \r
48 /*----- ワイルドカードにマッチするかどうかを返す ------------------------------\r
49 *\r
50 *       Parameter\r
51 *               char *str : 文字列\r
52 *               char *regexp : ワイルドカード検索式\r
53 *\r
54 *       Return Value\r
55 *               int ステータス\r
56 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
57 *\r
58 *       Note\r
59 *               VAX VMSの時は ; 以降は無視する\r
60 *----------------------------------------------------------------------------*/\r
61 \r
62 int CheckFname(char *str, char *regexp)\r
63 {\r
64         int Sts;\r
65         char p1[FMAX_PATH+1];\r
66         char p2[FMAX_PATH+1];\r
67         char *p;\r
68 \r
69         strcpy(p1, regexp);\r
70         strcpy(p2, str);\r
71 \r
72         /* VAX VMSの時のための処理 */\r
73         if(AskHostType() == HTYPE_VMS)\r
74         {\r
75                 if((p = strchr(p2, ';')) != NULL)\r
76                         *p = NUL;\r
77         }\r
78 \r
79         /* *? とか ** とかを削除 */\r
80         for(p = p1; *p != NUL; p++)\r
81         {\r
82                 while((*p == '*') && ((*(p+1) == '?') || (*(p+1) == '*')))\r
83                         memmove(p+1, p+2, strlen(p+2)+1);\r
84         }\r
85 \r
86         if((strcmp(p1, "*.*") == 0) || (strcmp(p1, "????????.???") == 0))\r
87                 strcpy(p1, "*");\r
88 \r
89         Sts = FFFTP_SUCCESS;\r
90         if(strcmp(p1, "*") != 0)\r
91         {\r
92                 if(strcmp(p1, "*.") == 0)\r
93                 {\r
94                         p = strchr(p2, '.');\r
95                         if((p != NULL) && (*(p+1) != NUL))\r
96                                 Sts = FFFTP_FAIL;\r
97                 }\r
98                 else\r
99                         Sts = CheckNameMatch(p2, p1);\r
100         }\r
101         return(Sts);\r
102 }\r
103 \r
104 \r
105 /*----- ワイルドカード検索サブルーチン ----------------------------------------\r
106 *\r
107 *       Parameter\r
108 *               char *str : 文字列\r
109 *               char *regexp : ワイルドカード検索式\r
110 *\r
111 *       Return Value\r
112 *               int ステータス\r
113 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
114 *----------------------------------------------------------------------------*/\r
115 \r
116 static int CheckNameMatch(char *str, char *regexp)\r
117 {\r
118         char *p;\r
119 \r
120         for(p = regexp; (*p != NUL) && (*str != NUL); )\r
121         {\r
122                 switch(*p)\r
123                 {\r
124                         case '?':\r
125                                 str++;\r
126                                 p++;\r
127                                 break;\r
128 \r
129                         case '*':\r
130                                 /* Look for a character matching the one after the '*' */\r
131                                 p++;\r
132                                 if(*p == NUL)\r
133                                         return FFFTP_SUCCESS; /* Automatic match */\r
134                                 while(*str != NUL)\r
135                                 {\r
136                                         while((*str != NUL) && (toupper(*p)!=toupper(*str)))\r
137                                                 str++;\r
138                                         if(CheckNameMatch(str, p))\r
139                                                 return FFFTP_SUCCESS;\r
140                                         if(*str == NUL)\r
141                                                 return FFFTP_FAIL;\r
142                                         else\r
143                                                 str++;\r
144                                 }\r
145                                 return FFFTP_FAIL;\r
146 \r
147                         default:\r
148                                 if(toupper(*str) != toupper(*p))\r
149                                         return FFFTP_FAIL;\r
150                                 str++;\r
151                                 p++;\r
152                                 break;\r
153                 }\r
154         }\r
155 \r
156         if((*p == NUL) && (*str == NUL))\r
157                 return FFFTP_SUCCESS;\r
158 \r
159         if ((*p != NUL) && (str[0] == '.') && (str[1] == 0))\r
160                 return(FFFTP_SUCCESS);\r
161   \r
162         if ((*str == NUL) && (*p == '?'))\r
163         {\r
164                 while (*p == '?')\r
165                         p++;\r
166                 return(*p == NUL);\r
167         }\r
168 \r
169         if((*str == NUL) && (*p == '*') && (p[1] == '\0'))\r
170                 return FFFTP_SUCCESS;\r
171 \r
172         return FFFTP_FAIL;\r
173 }\r
174 \r