OSDN Git Service

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