#line 43 "util_expr_scan.l"
#include "util_expr_private.h"
#include "util_expr_parse.h"
+#include "http_main.h"
+#include "http_log.h"
#undef YY_INPUT
#define YY_INPUT(buf,result,max_size) \
} \
}
+/*
+ * XXX: It would be nice if we could recover somehow, e.g. via
+ * XXX: longjmp. It is not clear if the scanner is in any state
+ * XXX: to be cleaned up, though.
+ */
+#define YY_FATAL_ERROR(msg) \
+ do { \
+ ap_log_error(APLOG_MARK, APLOG_CRIT, 0, ap_server_conf, \
+ "expr parser fatal error (BUG?): " \
+ "%s, exiting", msg); \
+ abort(); \
+ } while (0)
+
#define YY_EXTRA_TYPE ap_expr_parse_ctx_t*
#define PERROR(msg) do { yyextra->error2 = msg ; return T_ERROR; } while (0)
PERROR("String too long"); \
} while (0)
-#line 615 "util_expr_scan.c"
+#line 630 "util_expr_scan.c"
#define INITIAL 0
#define str 1
register int yy_act;
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-#line 78 "util_expr_scan.l"
+#line 93 "util_expr_scan.l"
char regex_buf[MAX_STRING_LEN];
/*
* Whitespaces
*/
-#line 886 "util_expr_scan.c"
+#line 901 "util_expr_scan.c"
yylval = yylval_param;
case 1:
/* rule 1 can match eol */
YY_RULE_SETUP
-#line 103 "util_expr_scan.l"
+#line 118 "util_expr_scan.l"
{
/* NOP */
}
*/
case 2:
YY_RULE_SETUP
-#line 110 "util_expr_scan.l"
+#line 125 "util_expr_scan.l"
{
str_ptr = str_buf;
str_del = yytext[0];
YY_BREAK
case 3:
YY_RULE_SETUP
-#line 116 "util_expr_scan.l"
+#line 131 "util_expr_scan.l"
{
if (yytext[0] == str_del) {
if (YY_START == var) {
case 4:
/* rule 4 can match eol */
YY_RULE_SETUP
-#line 138 "util_expr_scan.l"
+#line 153 "util_expr_scan.l"
{
PERROR("Unterminated string or variable");
}
YY_BREAK
case YY_STATE_EOF(var):
case YY_STATE_EOF(vararg):
-#line 141 "util_expr_scan.l"
+#line 156 "util_expr_scan.l"
{
PERROR("Unterminated string or variable");
}
YY_BREAK
case YY_STATE_EOF(str):
-#line 144 "util_expr_scan.l"
+#line 159 "util_expr_scan.l"
{
if (!(yyextra->flags & AP_EXPR_FLAG_STRING_RESULT)) {
PERROR("Unterminated string or variable");
YY_BREAK
case 5:
YY_RULE_SETUP
-#line 157 "util_expr_scan.l"
+#line 172 "util_expr_scan.l"
{
int result;
YY_BREAK
case 6:
YY_RULE_SETUP
-#line 168 "util_expr_scan.l"
+#line 183 "util_expr_scan.l"
{
PERROR("Bad escape sequence");
}
YY_BREAK
case 7:
YY_RULE_SETUP
-#line 171 "util_expr_scan.l"
+#line 186 "util_expr_scan.l"
{ STR_APPEND('\n'); }
YY_BREAK
case 8:
YY_RULE_SETUP
-#line 172 "util_expr_scan.l"
+#line 187 "util_expr_scan.l"
{ STR_APPEND('\r'); }
YY_BREAK
case 9:
YY_RULE_SETUP
-#line 173 "util_expr_scan.l"
+#line 188 "util_expr_scan.l"
{ STR_APPEND('\t'); }
YY_BREAK
case 10:
YY_RULE_SETUP
-#line 174 "util_expr_scan.l"
+#line 189 "util_expr_scan.l"
{ STR_APPEND('\b'); }
YY_BREAK
case 11:
YY_RULE_SETUP
-#line 175 "util_expr_scan.l"
+#line 190 "util_expr_scan.l"
{ STR_APPEND('\f'); }
YY_BREAK
case 12:
/* rule 12 can match eol */
YY_RULE_SETUP
-#line 176 "util_expr_scan.l"
+#line 191 "util_expr_scan.l"
{ STR_APPEND(yytext[1]); }
YY_BREAK
/* regexp backref inside string/arg */
case 13:
YY_RULE_SETUP
-#line 179 "util_expr_scan.l"
+#line 194 "util_expr_scan.l"
{
if (str_ptr != str_buf) {
/* return what we have so far and scan '$x' again */
YY_BREAK
case 14:
YY_RULE_SETUP
-#line 194 "util_expr_scan.l"
+#line 209 "util_expr_scan.l"
{
char *cp = yytext;
while (*cp != '\0') {
/* variable inside string/arg */
case 15:
YY_RULE_SETUP
-#line 203 "util_expr_scan.l"
+#line 218 "util_expr_scan.l"
{
if (str_ptr != str_buf) {
/* return what we have so far and scan '%{' again */
YY_BREAK
case 16:
YY_RULE_SETUP
-#line 218 "util_expr_scan.l"
+#line 233 "util_expr_scan.l"
{
STR_APPEND(yytext[0]);
}
YY_BREAK
case 17:
YY_RULE_SETUP
-#line 222 "util_expr_scan.l"
+#line 237 "util_expr_scan.l"
{
STR_APPEND(yytext[0]);
}
YY_BREAK
case 18:
YY_RULE_SETUP
-#line 226 "util_expr_scan.l"
+#line 241 "util_expr_scan.l"
{
yy_push_state(var, yyscanner);
return T_VAR_BEGIN;
YY_BREAK
case 19:
YY_RULE_SETUP
-#line 231 "util_expr_scan.l"
+#line 246 "util_expr_scan.l"
{
yylval->num = yytext[1] - '0';
return T_REGEX_BACKREF;
*/
case 20:
YY_RULE_SETUP
-#line 239 "util_expr_scan.l"
+#line 254 "util_expr_scan.l"
{
yylval->cpVal = apr_pstrdup(yyextra->pool, yytext);
return T_ID;
YY_BREAK
case 21:
YY_RULE_SETUP
-#line 244 "util_expr_scan.l"
+#line 259 "util_expr_scan.l"
{
yy_pop_state(yyscanner);
return T_VAR_END;
YY_BREAK
case 22:
YY_RULE_SETUP
-#line 249 "util_expr_scan.l"
+#line 264 "util_expr_scan.l"
{
BEGIN(vararg);
return yytext[0];
case 23:
/* rule 23 can match eol */
YY_RULE_SETUP
-#line 254 "util_expr_scan.l"
+#line 269 "util_expr_scan.l"
{
char *msg = apr_psprintf(yyextra->pool,
"Invalid character in variable name '%c'", yytext[0]);
YY_BREAK
case 24:
YY_RULE_SETUP
-#line 260 "util_expr_scan.l"
+#line 275 "util_expr_scan.l"
{
if (str_ptr != str_buf) {
/* return what we have so far and scan '}' again */
*/
case 25:
YY_RULE_SETUP
-#line 278 "util_expr_scan.l"
+#line 293 "util_expr_scan.l"
{
regex_del = yytext[1];
regex_ptr = regex_buf;
YY_BREAK
case 26:
YY_RULE_SETUP
-#line 283 "util_expr_scan.l"
+#line 298 "util_expr_scan.l"
{
regex_del = yytext[0];
regex_ptr = regex_buf;
case 27:
/* rule 27 can match eol */
YY_RULE_SETUP
-#line 288 "util_expr_scan.l"
+#line 303 "util_expr_scan.l"
{
if (yytext[0] == regex_del) {
*regex_ptr = '\0';
YY_BREAK
case 28:
YY_RULE_SETUP
-#line 299 "util_expr_scan.l"
+#line 314 "util_expr_scan.l"
{
yylval->cpVal = apr_pstrdup(yyextra->pool, regex_buf);
BEGIN(INITIAL);
case 29:
/* rule 29 can match eol */
YY_RULE_SETUP
-#line 304 "util_expr_scan.l"
+#line 319 "util_expr_scan.l"
{
yylval->cpVal = apr_pstrdup(yyextra->pool, regex_buf);
yyless(0);
}
YY_BREAK
case YY_STATE_EOF(regex_flags):
-#line 310 "util_expr_scan.l"
+#line 325 "util_expr_scan.l"
{
yylval->cpVal = apr_pstrdup(yyextra->pool, regex_buf);
BEGIN(INITIAL);
*/
case 30:
YY_RULE_SETUP
-#line 319 "util_expr_scan.l"
+#line 334 "util_expr_scan.l"
{ return T_OP_STR_EQ; }
YY_BREAK
case 31:
YY_RULE_SETUP
-#line 320 "util_expr_scan.l"
+#line 335 "util_expr_scan.l"
{ return T_OP_STR_NE; }
YY_BREAK
case 32:
YY_RULE_SETUP
-#line 321 "util_expr_scan.l"
+#line 336 "util_expr_scan.l"
{ return T_OP_STR_LT; }
YY_BREAK
case 33:
YY_RULE_SETUP
-#line 322 "util_expr_scan.l"
+#line 337 "util_expr_scan.l"
{ return T_OP_STR_LE; }
YY_BREAK
case 34:
YY_RULE_SETUP
-#line 323 "util_expr_scan.l"
+#line 338 "util_expr_scan.l"
{ return T_OP_STR_GT; }
YY_BREAK
case 35:
YY_RULE_SETUP
-#line 324 "util_expr_scan.l"
+#line 339 "util_expr_scan.l"
{ return T_OP_STR_GE; }
YY_BREAK
case 36:
YY_RULE_SETUP
-#line 325 "util_expr_scan.l"
+#line 340 "util_expr_scan.l"
{ return T_OP_REG; }
YY_BREAK
case 37:
YY_RULE_SETUP
-#line 326 "util_expr_scan.l"
+#line 341 "util_expr_scan.l"
{ return T_OP_NRE; }
YY_BREAK
case 38:
YY_RULE_SETUP
-#line 327 "util_expr_scan.l"
+#line 342 "util_expr_scan.l"
{ return T_OP_AND; }
YY_BREAK
case 39:
YY_RULE_SETUP
-#line 328 "util_expr_scan.l"
+#line 343 "util_expr_scan.l"
{ return T_OP_AND; }
YY_BREAK
case 40:
YY_RULE_SETUP
-#line 329 "util_expr_scan.l"
+#line 344 "util_expr_scan.l"
{ return T_OP_OR; }
YY_BREAK
case 41:
YY_RULE_SETUP
-#line 330 "util_expr_scan.l"
+#line 345 "util_expr_scan.l"
{ return T_OP_OR; }
YY_BREAK
case 42:
YY_RULE_SETUP
-#line 331 "util_expr_scan.l"
+#line 346 "util_expr_scan.l"
{ return T_OP_NOT; }
YY_BREAK
case 43:
YY_RULE_SETUP
-#line 332 "util_expr_scan.l"
+#line 347 "util_expr_scan.l"
{ return T_OP_NOT; }
YY_BREAK
case 44:
YY_RULE_SETUP
-#line 333 "util_expr_scan.l"
+#line 348 "util_expr_scan.l"
{ return T_OP_CONCAT; }
YY_BREAK
case 45:
YY_RULE_SETUP
-#line 334 "util_expr_scan.l"
+#line 349 "util_expr_scan.l"
{ return T_OP_IN; }
YY_BREAK
case 46:
YY_RULE_SETUP
-#line 335 "util_expr_scan.l"
+#line 350 "util_expr_scan.l"
{ return T_OP_EQ; }
YY_BREAK
case 47:
YY_RULE_SETUP
-#line 336 "util_expr_scan.l"
+#line 351 "util_expr_scan.l"
{ return T_OP_NE; }
YY_BREAK
case 48:
YY_RULE_SETUP
-#line 337 "util_expr_scan.l"
+#line 352 "util_expr_scan.l"
{ return T_OP_GE; }
YY_BREAK
case 49:
YY_RULE_SETUP
-#line 338 "util_expr_scan.l"
+#line 353 "util_expr_scan.l"
{ return T_OP_LE; }
YY_BREAK
case 50:
YY_RULE_SETUP
-#line 339 "util_expr_scan.l"
+#line 354 "util_expr_scan.l"
{ return T_OP_GT; }
YY_BREAK
case 51:
YY_RULE_SETUP
-#line 340 "util_expr_scan.l"
+#line 355 "util_expr_scan.l"
{ return T_OP_LT; }
YY_BREAK
/* for compatibility with ssl_expr */
case 52:
YY_RULE_SETUP
-#line 343 "util_expr_scan.l"
+#line 358 "util_expr_scan.l"
{ return T_OP_LT; }
YY_BREAK
case 53:
YY_RULE_SETUP
-#line 344 "util_expr_scan.l"
+#line 359 "util_expr_scan.l"
{ return T_OP_LE; }
YY_BREAK
case 54:
YY_RULE_SETUP
-#line 345 "util_expr_scan.l"
+#line 360 "util_expr_scan.l"
{ return T_OP_GT; }
YY_BREAK
case 55:
YY_RULE_SETUP
-#line 346 "util_expr_scan.l"
+#line 361 "util_expr_scan.l"
{ return T_OP_GE; }
YY_BREAK
case 56:
YY_RULE_SETUP
-#line 347 "util_expr_scan.l"
+#line 362 "util_expr_scan.l"
{ return T_OP_NE; }
YY_BREAK
case 57:
YY_RULE_SETUP
-#line 348 "util_expr_scan.l"
+#line 363 "util_expr_scan.l"
{ return T_OP_EQ; }
YY_BREAK
case 58:
YY_RULE_SETUP
-#line 349 "util_expr_scan.l"
+#line 364 "util_expr_scan.l"
{ return T_OP_IN; }
YY_BREAK
case 59:
YY_RULE_SETUP
-#line 351 "util_expr_scan.l"
+#line 366 "util_expr_scan.l"
{
yylval->cpVal = apr_pstrdup(yyextra->pool, yytext + 1);
return T_OP_UNARY;
YY_BREAK
case 60:
YY_RULE_SETUP
-#line 356 "util_expr_scan.l"
+#line 371 "util_expr_scan.l"
{
yylval->cpVal = apr_pstrdup(yyextra->pool, yytext + 1);
return T_OP_BINARY;
*/
case 61:
YY_RULE_SETUP
-#line 364 "util_expr_scan.l"
+#line 379 "util_expr_scan.l"
{ return T_TRUE; }
YY_BREAK
case 62:
YY_RULE_SETUP
-#line 365 "util_expr_scan.l"
+#line 380 "util_expr_scan.l"
{ return T_FALSE; }
YY_BREAK
/*
*/
case 63:
YY_RULE_SETUP
-#line 370 "util_expr_scan.l"
+#line 385 "util_expr_scan.l"
{
yylval->cpVal = apr_pstrdup(yyextra->pool, yytext);
return T_DIGIT;
*/
case 64:
YY_RULE_SETUP
-#line 378 "util_expr_scan.l"
+#line 393 "util_expr_scan.l"
{
yylval->cpVal = apr_pstrdup(yyextra->pool, yytext);
return T_ID;
*/
case 65:
YY_RULE_SETUP
-#line 386 "util_expr_scan.l"
+#line 401 "util_expr_scan.l"
{
return yytext[0];
}
case 66:
/* rule 66 can match eol */
YY_RULE_SETUP
-#line 393 "util_expr_scan.l"
+#line 408 "util_expr_scan.l"
{
char *msg = apr_psprintf(yyextra->pool, "Parse error near '%c'", yytext[0]);
PERROR(msg);
YY_BREAK
case 67:
YY_RULE_SETUP
-#line 398 "util_expr_scan.l"
+#line 413 "util_expr_scan.l"
YY_FATAL_ERROR( "flex scanner jammed" );
YY_BREAK
-#line 1523 "util_expr_scan.c"
+#line 1538 "util_expr_scan.c"
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(regex):
yyterminate();
#define YYTABLES_NAME "yytables"
-#line 398 "util_expr_scan.l"
+#line 413 "util_expr_scan.l"