1 : %{
2 : /*
3 : +----------------------------------------------------------------------+
4 : | Zend Engine |
5 : +----------------------------------------------------------------------+
6 : | Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
7 : +----------------------------------------------------------------------+
8 : | This source file is subject to version 2.00 of the Zend license, |
9 : | that is bundled with this package in the file LICENSE, and is |
10 : | available through the world-wide-web at the following url: |
11 : | http://www.zend.com/license/2_00.txt. |
12 : | If you did not receive a copy of the Zend license and are unable to |
13 : | obtain it through the world-wide-web, please send a note to |
14 : | license@zend.com so we can mail you a copy immediately. |
15 : +----------------------------------------------------------------------+
16 : | Author: Zeev Suraski <zeev@zend.com> |
17 : +----------------------------------------------------------------------+
18 : */
19 :
20 : /* $Id: zend_ini_scanner.l,v 1.41.2.2.2.1 2006/09/19 20:33:12 dmitry Exp $ */
21 :
22 : #define yyleng SCNG(yy_leng)
23 : #define yytext SCNG(yy_text)
24 : #define yytext_ptr SCNG(yy_text)
25 : #define yyin SCNG(yy_in)
26 : #define yyout SCNG(yy_out)
27 : #define yy_last_accepting_state SCNG(_yy_last_accepting_state)
28 : #define yy_last_accepting_cpos SCNG(_yy_last_accepting_cpos)
29 : #define yy_more_flag SCNG(_yy_more_flag)
30 : #define yy_more_len SCNG(_yy_more_len)
31 :
32 : #include <errno.h>
33 : #include "zend.h"
34 : #include "zend_globals.h"
35 : #include <zend_ini_parser.h>
36 : #include "zend_ini_scanner.h"
37 :
38 : #undef YYSTYPE
39 : #define YYSTYPE zval
40 :
41 : #define YY_DECL int ini_lex(zval *ini_lval TSRMLS_DC)
42 :
43 : /* Globals Macros */
44 : #define SCNG INI_SCNG
45 : #ifdef ZTS
46 : ZEND_API ts_rsrc_id ini_scanner_globals_id;
47 : #else
48 : ZEND_API zend_scanner_globals ini_scanner_globals;
49 : #endif
50 :
51 :
52 : static char *ini_filename;
53 :
54 : void init_ini_scanner(TSRMLS_D)
55 0 : {
56 0 : SCNG(lineno)=1;
57 0 : }
58 :
59 :
60 : int zend_ini_scanner_get_lineno(TSRMLS_D)
61 0 : {
62 0 : return SCNG(lineno);
63 : }
64 :
65 :
66 : char *zend_ini_scanner_get_filename(TSRMLS_D)
67 0 : {
68 0 : return ini_filename;
69 : }
70 :
71 :
72 : int zend_ini_open_file_for_scanning(zend_file_handle *fh TSRMLS_DC)
73 0 : {
74 0 : if (FAILURE == zend_stream_fixup(fh TSRMLS_CC)) {
75 0 : return FAILURE;
76 : }
77 :
78 0 : init_ini_scanner(TSRMLS_C);
79 0 : yyin = fh;
80 0 : yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE TSRMLS_CC) TSRMLS_CC);
81 0 : ini_filename = fh->filename;
82 0 : return SUCCESS;
83 : }
84 :
85 :
86 : int zend_ini_prepare_string_for_scanning(char *str TSRMLS_DC)
87 219 : {
88 219 : int len = strlen(str);
89 :
90 219 : yyin = NULL;
91 219 : yy_scan_buffer(str, len + 2 TSRMLS_CC);
92 219 : ini_filename = NULL;
93 219 : return SUCCESS;
94 : }
95 :
96 :
97 : void zend_ini_close_file(zend_file_handle *fh TSRMLS_DC)
98 0 : {
99 0 : zend_stream_close(fh);
100 0 : }
101 :
102 : %}
103 :
104 : NEWLINE ("\r"|"\n"|"\r\n")
105 :
106 : %option noyywrap
107 : %option never-interactive
108 :
109 : %%
110 :
111 : <INITIAL>[ ]*[\[][ ]*[\]][ ]* {
112 0 : return BRACK;
113 : }
114 :
115 : <INITIAL>[ ]*("true"|"on"|"yes")[ ]* {
116 0 : ini_lval->value.str.val = zend_strndup("1", 1);
117 0 : ini_lval->value.str.len = 1;
118 0 : ini_lval->type = IS_STRING;
119 0 : return CFG_TRUE;
120 : }
121 :
122 :
123 : <INITIAL>[ ]*("false"|"off"|"no"|"none")[ ]* {
124 218 : ini_lval->value.str.val = zend_strndup("", 0);
125 218 : ini_lval->value.str.len = 0;
126 218 : ini_lval->type = IS_STRING;
127 218 : return CFG_FALSE;
128 : }
129 :
130 : <INITIAL>[[][^\]\n]+[\]][ ]*{NEWLINE}? {
131 : /* SECTION */
132 :
133 : /* eat trailing ] and spaces */
134 0 : while (yyleng>0 && (yytext[yyleng-1]=='\n' || yytext[yyleng-1]=='\r' || yytext[yyleng-1]==']' || yytext[yyleng-1]==' ')) {
135 0 : yyleng--;
136 0 : yytext[yyleng]=0;
137 : }
138 :
139 0 : SCNG(lineno)++;
140 :
141 : /* eat leading [ */
142 0 : yytext++;
143 0 : yyleng--;
144 :
145 0 : ini_lval->value.str.val = zend_strndup(yytext, yyleng);
146 0 : ini_lval->value.str.len = yyleng;
147 0 : ini_lval->type = IS_STRING;
148 0 : return SECTION;
149 : }
150 :
151 :
152 : <INITIAL>["][^"]*["] {
153 221 : char *p = yytext;
154 :
155 : /* ENCAPSULATED TC_STRING */
156 :
157 442 : while ((p = strpbrk(p, "\r\n"))) {
158 0 : if (*p == '\r' && *(p + 1) == '\n') {
159 0 : p++;
160 : }
161 0 : SCNG(lineno)++;
162 0 : p++;
163 : }
164 :
165 : /* eat trailing " */
166 221 : yytext[yyleng-1]=0;
167 :
168 : /* eat leading " */
169 221 : yytext++;
170 :
171 221 : ini_lval->value.str.val = zend_strndup(yytext, yyleng - 2);
172 221 : ini_lval->value.str.len = yyleng - 2;
173 221 : ini_lval->type = IS_STRING;
174 221 : return TC_ENCAPSULATED_STRING;
175 : }
176 :
177 : <INITIAL>[&|~$(){}!] {
178 0 : return yytext[0];
179 : }
180 :
181 : <INITIAL>"${" {
182 0 : return TC_DOLLAR_CURLY;
183 : }
184 :
185 : <INITIAL>"}" {
186 0 : ini_lval->value.lval = (long) yytext[0];
187 0 : return yytext[0];
188 : }
189 :
190 : <INITIAL>[^=\n\r\t;|&$~(){}!"\[]+ {
191 : /* STRING */
192 : register int i;
193 :
194 : /* eat trailing whitespace */
195 6560 : for (i=yyleng-1; i>=0; i--) {
196 6560 : if (yytext[i]==' ' || yytext[i]=='\t') {
197 0 : yytext[i]=0;
198 0 : yyleng--;
199 : } else {
200 : break;
201 : }
202 : }
203 : /* eat leading whitespace */
204 13120 : while (yytext[0]) {
205 6560 : if (yytext[0]==' ' || yytext[0]=='\t') {
206 0 : yytext++;
207 0 : yyleng--;
208 : } else {
209 : break;
210 : }
211 : }
212 6560 : if (yyleng!=0) {
213 6560 : ini_lval->value.str.val = zend_strndup(yytext, yyleng);
214 6560 : ini_lval->value.str.len = yyleng;
215 6560 : ini_lval->type = IS_STRING;
216 6560 : return TC_STRING;
217 : } else {
218 : /* whitespace */
219 : }
220 : }
221 0 :
222 : <INITIAL>[=\n] {
223 8744 : if (yytext[0] == '\n') {
224 4372 : SCNG(lineno)++;
225 : }
226 8744 : return yytext[0];
227 : }
228 :
229 : <INITIAL>{NEWLINE} {
230 0 : SCNG(lineno)++;
231 0 : return '\n';
232 : }
233 :
234 : <INITIAL>[;][^\r\n]*{NEWLINE}? {
235 : /* comment */
236 0 : SCNG(lineno)++;
237 0 : return '\n';
238 : }
239 :
240 : <INITIAL>[ \t] {
241 : /* eat whitespace */
242 : }
243 0 :
244 : <INITIAL>. {
245 : #if DEBUG
246 : php_error(E_NOTICE,"Unexpected character on line %d: '%s' (ASCII %d)\n", yylineno, yytext, yytext[0]);
247 : #endif
248 : }
249 0 :
250 : <<EOF>> {
251 219 : yy_delete_buffer(YY_CURRENT_BUFFER TSRMLS_CC);
252 219 : yyterminate();
253 : }
|