ssl_expr_scan.l revision 26a4456dd6f1a5d7d7fff766551461a578687c4a
/* _ _
** _ __ ___ ___ __| | ___ ___| |
** | '_ ` _ \ / _ \ / _` | / __/ __| |
** | | | | | | (_) | (_| | \__ \__ \ | mod_ssl - Apache Interface to OpenSSL
** |_| |_| |_|\___/ \__,_|___|___/___/_| http://www.modssl.org/
** |_____|
** ssl_expr_scan.l
** Expression Scanner
*/
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000-2004 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*/
/* ``Killing for peace is
like fucking for virginity.''
-- Unknown */
/* _________________________________________________________________
**
** Expression Scanner
** _________________________________________________________________
*/
%{
#include "mod_ssl.h"
#include "ssl_expr_parse.h"
#define YY_NO_UNPUT 1
#define MAX_STR_LEN 2048
%}
/* %option stack */
%x str
%x regex regex_flags
%%
char caStr[MAX_STR_LEN];
char caRegex[MAX_STR_LEN];
/*
* Whitespaces
*/
[ \t\n]+ {
/* NOP */
}
/*
* C-style strings ("...")
*/
\" {
cpStr = caStr;
BEGIN(str);
}
<str>\" {
BEGIN(INITIAL);
*cpStr = NUL;
yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caStr);
return T_STRING;
}
<str>\n {
}
<str>\\[0-7]{1,3} {
int result;
(void)sscanf(yytext+1, "%o", &result);
if (result > 0xff)
else
*cpStr++ = result;
}
<str>\\[0-9]+ {
}
<str>\\n { *cpStr++ = '\n'; }
<str>\\r { *cpStr++ = '\r'; }
<str>\\t { *cpStr++ = '\t'; }
<str>\\b { *cpStr++ = '\b'; }
<str>\\f { *cpStr++ = '\f'; }
<str>\\(.|\n) {
*cpStr++ = yytext[1];
}
<str>[^\\\n\"]+ {
char *cp = yytext;
while (*cp != NUL)
*cpStr++ = *cp++;
}
<str>. {
*cpStr++ = yytext[1];
}
/*
* Regular Expression
*/
"m". {
cRegexDel = yytext[1];
cpRegex = caRegex;
BEGIN(regex);
}
<regex>.|\n {
if (yytext[0] == cRegexDel) {
*cpRegex = NUL;
BEGIN(regex_flags);
}
else {
*cpRegex++ = yytext[0];
}
}
<regex_flags>i {
yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caRegex);
BEGIN(INITIAL);
return T_REGEX_I;
}
<regex_flags>.|\n {
yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caRegex);
yyless(0);
BEGIN(INITIAL);
return T_REGEX;
}
<regex_flags><<EOF>> {
yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caRegex);
BEGIN(INITIAL);
return T_REGEX;
}
/*
* Operators
*/
"==" { return T_OP_EQ; }
"!=" { return T_OP_NE; }
"<" { return T_OP_LT; }
"<=" { return T_OP_LE; }
">" { return T_OP_GT; }
">=" { return T_OP_GE; }
"=~" { return T_OP_REG; }
"!~" { return T_OP_NRE; }
"&&" { return T_OP_AND; }
"||" { return T_OP_OR; }
"!" { return T_OP_NOT; }
/*
* Functions
*/
/*
* Specials
*/
"true" { return T_TRUE; }
"false" { return T_FALSE; }
/*
* Digits
*/
[0-9]+ {
yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, yytext);
return T_DIGIT;
}
/*
* Identifiers
*/
[a-zA-Z][a-zA-Z0-9_:-]* {
yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, yytext);
return T_ID;
}
/*
* Anything else is returned as is...
*/
.|\n {
return yytext[0];
}
%%
int yyinput(char *buf, int max_size)
{
int n;
if ((n = MIN(max_size, ssl_expr_info.inputbuf
+ ssl_expr_info.inputlen
- ssl_expr_info.inputptr)) <= 0)
return YY_NULL;
memcpy(buf, ssl_expr_info.inputptr, n);
ssl_expr_info.inputptr += n;
return n;
}