xref: /PHP-7.0/ext/phar/phar_path_check.c (revision 478f119a)
1 /* Generated by re2c 0.13.5 */
2 #line 1 "ext/phar/phar_path_check.re"
3 /*
4   +----------------------------------------------------------------------+
5   | phar php single-file executable PHP extension                        |
6   +----------------------------------------------------------------------+
7   | Copyright (c) 2007-2017 The PHP Group                                |
8   +----------------------------------------------------------------------+
9   | This source file is subject to version 3.01 of the PHP license,      |
10   | that is bundled with this package in the file LICENSE, and is        |
11   | available through the world-wide-web at the following url:           |
12   | http://www.php.net/license/3_01.txt.                                 |
13   | If you did not receive a copy of the PHP license and are unable to   |
14   | obtain it through the world-wide-web, please send a note to          |
15   | license@php.net so we can mail you a copy immediately.               |
16   +----------------------------------------------------------------------+
17   | Authors: Marcus Boerger <helly@php.net>                              |
18   +----------------------------------------------------------------------+
19 */
20 
21 /* $Id$ */
22 
23 #include "phar_internal.h"
24 
phar_path_check(char ** s,int * len,const char ** error)25 phar_path_check_result phar_path_check(char **s, int *len, const char **error)
26 {
27 	const unsigned char *p = (const unsigned char*)*s;
28 	const unsigned char *m;
29 
30 	if (*len == 1 && *p == '.') {
31 		*error = "current directory reference";
32 		return pcr_err_curr_dir;
33 	} else if (*len == 2 && p[0] == '.' && p[1] == '.') {
34 		*error = "upper directory reference";
35 		return pcr_err_up_dir;
36 	}
37 
38 #define YYCTYPE         unsigned char
39 #define YYCURSOR        p
40 #define YYLIMIT         p+*len
41 #define YYMARKER        m
42 #define YYFILL(n)
43 
44 loop:
45 
46 #line 47 "ext/phar/phar_path_check.c"
47 {
48 	YYCTYPE yych;
49 	unsigned int yyaccept = 0;
50 
51 	if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
52 	yych = *YYCURSOR;
53 	if (yych <= '[') {
54 		if (yych <= ')') {
55 			if (yych <= '\t') {
56 				if (yych <= 0x00) goto yy21;
57 				goto yy23;
58 			} else {
59 				if (yych <= '\n') goto yy2;
60 				if (yych <= 0x19) goto yy23;
61 				goto yy11;
62 			}
63 		} else {
64 			if (yych <= '/') {
65 				if (yych <= '*') goto yy7;
66 				if (yych <= '.') goto yy11;
67 				goto yy3;
68 			} else {
69 				if (yych == '?') goto yy9;
70 				goto yy11;
71 			}
72 		}
73 	} else {
74 		if (yych <= 0xEC) {
75 			if (yych <= 0xC1) {
76 				if (yych <= '\\') goto yy5;
77 				if (yych <= 0x7F) goto yy11;
78 				goto yy23;
79 			} else {
80 				if (yych <= 0xDF) goto yy12;
81 				if (yych <= 0xE0) goto yy14;
82 				goto yy15;
83 			}
84 		} else {
85 			if (yych <= 0xF0) {
86 				if (yych <= 0xED) goto yy16;
87 				if (yych <= 0xEF) goto yy17;
88 				goto yy18;
89 			} else {
90 				if (yych <= 0xF3) goto yy19;
91 				if (yych <= 0xF4) goto yy20;
92 				goto yy23;
93 			}
94 		}
95 	}
96 yy2:
97 	YYCURSOR = YYMARKER;
98 	if (yyaccept <= 0) {
99 		goto yy4;
100 	} else {
101 		goto yy13;
102 	}
103 yy3:
104 	yyaccept = 0;
105 	yych = *(YYMARKER = ++YYCURSOR);
106 	if (yych <= '-') goto yy4;
107 	if (yych <= '.') goto yy35;
108 	if (yych <= '/') goto yy36;
109 yy4:
110 #line 88 "ext/phar/phar_path_check.re"
111 	{
112 			goto loop;
113 		}
114 #line 115 "ext/phar/phar_path_check.c"
115 yy5:
116 	++YYCURSOR;
117 #line 72 "ext/phar/phar_path_check.re"
118 	{
119 			*error = "back-slash";
120 			return pcr_err_back_slash;
121 		}
122 #line 123 "ext/phar/phar_path_check.c"
123 yy7:
124 	++YYCURSOR;
125 #line 76 "ext/phar/phar_path_check.re"
126 	{
127 			*error = "star";
128 			return pcr_err_star;
129 		}
130 #line 131 "ext/phar/phar_path_check.c"
131 yy9:
132 	++YYCURSOR;
133 #line 80 "ext/phar/phar_path_check.re"
134 	{
135 			if (**s == '/') {
136 				(*s)++;
137 			}
138 			*len = (p - (const unsigned char*)*s) -1;
139 			*error = NULL;
140 			return pcr_use_query;
141 		}
142 #line 143 "ext/phar/phar_path_check.c"
143 yy11:
144 	yych = *++YYCURSOR;
145 	goto yy4;
146 yy12:
147 	++YYCURSOR;
148 	if ((yych = *YYCURSOR) <= 0x7F) goto yy13;
149 	if (yych <= 0xBF) goto yy26;
150 yy13:
151 #line 104 "ext/phar/phar_path_check.re"
152 	{
153 			*error ="illegal character";
154 			return pcr_err_illegal_char;
155 		}
156 #line 157 "ext/phar/phar_path_check.c"
157 yy14:
158 	yyaccept = 1;
159 	yych = *(YYMARKER = ++YYCURSOR);
160 	if (yych <= 0x9F) goto yy13;
161 	if (yych <= 0xBF) goto yy34;
162 	goto yy13;
163 yy15:
164 	yyaccept = 1;
165 	yych = *(YYMARKER = ++YYCURSOR);
166 	if (yych <= 0x7F) goto yy13;
167 	if (yych <= 0xBF) goto yy33;
168 	goto yy13;
169 yy16:
170 	yyaccept = 1;
171 	yych = *(YYMARKER = ++YYCURSOR);
172 	if (yych <= 0x7F) goto yy13;
173 	if (yych <= 0x9F) goto yy32;
174 	goto yy13;
175 yy17:
176 	yyaccept = 1;
177 	yych = *(YYMARKER = ++YYCURSOR);
178 	if (yych <= 0x7F) goto yy13;
179 	if (yych <= 0xBF) goto yy31;
180 	goto yy13;
181 yy18:
182 	yyaccept = 1;
183 	yych = *(YYMARKER = ++YYCURSOR);
184 	if (yych <= 0x8F) goto yy13;
185 	if (yych <= 0xBF) goto yy29;
186 	goto yy13;
187 yy19:
188 	yyaccept = 1;
189 	yych = *(YYMARKER = ++YYCURSOR);
190 	if (yych <= 0x7F) goto yy13;
191 	if (yych <= 0xBF) goto yy27;
192 	goto yy13;
193 yy20:
194 	yyaccept = 1;
195 	yych = *(YYMARKER = ++YYCURSOR);
196 	if (yych <= 0x7F) goto yy13;
197 	if (yych <= 0x8F) goto yy24;
198 	goto yy13;
199 yy21:
200 	++YYCURSOR;
201 #line 91 "ext/phar/phar_path_check.re"
202 	{
203 			if (**s == '/') {
204 				(*s)++;
205 				(*len)--;
206 			}
207 			if ((p - (const unsigned char*)*s) - 1 != *len)
208 			{
209 				*error ="illegal character";
210 				return pcr_err_illegal_char;
211 			}
212 			*error = NULL;
213 			return pcr_is_ok;
214 		}
215 #line 216 "ext/phar/phar_path_check.c"
216 yy23:
217 	yych = *++YYCURSOR;
218 	goto yy13;
219 yy24:
220 	yych = *++YYCURSOR;
221 	if (yych <= 0x7F) goto yy2;
222 	if (yych >= 0xC0) goto yy2;
223 	yych = *++YYCURSOR;
224 	if (yych <= 0x7F) goto yy2;
225 	if (yych >= 0xC0) goto yy2;
226 yy26:
227 	yych = *++YYCURSOR;
228 	goto yy4;
229 yy27:
230 	yych = *++YYCURSOR;
231 	if (yych <= 0x7F) goto yy2;
232 	if (yych >= 0xC0) goto yy2;
233 	yych = *++YYCURSOR;
234 	if (yych <= 0x7F) goto yy2;
235 	if (yych <= 0xBF) goto yy26;
236 	goto yy2;
237 yy29:
238 	yych = *++YYCURSOR;
239 	if (yych <= 0x7F) goto yy2;
240 	if (yych >= 0xC0) goto yy2;
241 	yych = *++YYCURSOR;
242 	if (yych <= 0x7F) goto yy2;
243 	if (yych <= 0xBF) goto yy26;
244 	goto yy2;
245 yy31:
246 	yych = *++YYCURSOR;
247 	if (yych <= 0x7F) goto yy2;
248 	if (yych <= 0xBF) goto yy26;
249 	goto yy2;
250 yy32:
251 	yych = *++YYCURSOR;
252 	if (yych <= 0x7F) goto yy2;
253 	if (yych <= 0xBF) goto yy26;
254 	goto yy2;
255 yy33:
256 	yych = *++YYCURSOR;
257 	if (yych <= 0x7F) goto yy2;
258 	if (yych <= 0xBF) goto yy26;
259 	goto yy2;
260 yy34:
261 	yych = *++YYCURSOR;
262 	if (yych <= 0x7F) goto yy2;
263 	if (yych <= 0xBF) goto yy26;
264 	goto yy2;
265 yy35:
266 	yych = *++YYCURSOR;
267 	if (yych <= 0x00) goto yy39;
268 	if (yych <= '-') goto yy2;
269 	if (yych <= '.') goto yy38;
270 	if (yych <= '/') goto yy39;
271 	goto yy2;
272 yy36:
273 	++YYCURSOR;
274 #line 60 "ext/phar/phar_path_check.re"
275 	{
276 			*error = "double slash";
277 			return pcr_err_double_slash;
278 		}
279 #line 280 "ext/phar/phar_path_check.c"
280 yy38:
281 	yych = *++YYCURSOR;
282 	if (yych <= 0x00) goto yy41;
283 	if (yych == '/') goto yy41;
284 	goto yy2;
285 yy39:
286 	++YYCURSOR;
287 #line 68 "ext/phar/phar_path_check.re"
288 	{
289 			*error = "current directory reference";
290 			return pcr_err_curr_dir;
291 		}
292 #line 293 "ext/phar/phar_path_check.c"
293 yy41:
294 	++YYCURSOR;
295 #line 64 "ext/phar/phar_path_check.re"
296 	{
297 			*error = "upper directory reference";
298 			return pcr_err_up_dir;
299 		}
300 #line 301 "ext/phar/phar_path_check.c"
301 }
302 #line 108 "ext/phar/phar_path_check.re"
303 
304 }
305