mirror of
https://github.com/apache/httpd.git
synced 2025-11-06 16:49:32 +03:00
update license to 2003. Happy New Year! ;-)) git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@98573 13f79535-47bb-0310-9956-ffa450edef68
259 lines
6.3 KiB
Plaintext
259 lines
6.3 KiB
Plaintext
/* _ _
|
|
** _ __ ___ ___ __| | ___ ___| |
|
|
** | '_ ` _ \ / _ \ / _` | / __/ __| |
|
|
** | | | | | | (_) | (_| | \__ \__ \ | 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-2003 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
|
|
* the documentation and/or other materials provided with the
|
|
* 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
|
|
int yyinput(char *buf, int max_size);
|
|
|
|
#undef YY_INPUT
|
|
#define YY_INPUT(buf,result,max_size) \
|
|
(result = yyinput(buf, max_size))
|
|
|
|
#define MAX_STR_LEN 2048
|
|
%}
|
|
|
|
%pointer
|
|
/* %option stack */
|
|
%option never-interactive
|
|
%option noyywrap
|
|
%x str
|
|
%x regex regex_flags
|
|
|
|
%%
|
|
|
|
char caStr[MAX_STR_LEN];
|
|
char *cpStr = NULL;
|
|
char caRegex[MAX_STR_LEN];
|
|
char *cpRegex = NULL;
|
|
char cRegexDel = NUL;
|
|
|
|
/*
|
|
* 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 {
|
|
yyerror("Unterminated string");
|
|
}
|
|
<str>\\[0-7]{1,3} {
|
|
int result;
|
|
|
|
(void)sscanf(yytext+1, "%o", &result);
|
|
if (result > 0xff)
|
|
yyerror("Escape sequence out of bound");
|
|
else
|
|
*cpStr++ = result;
|
|
}
|
|
<str>\\[0-9]+ {
|
|
yyerror("Bad escape sequence");
|
|
}
|
|
<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
|
|
*/
|
|
"eq" { return T_OP_EQ; }
|
|
"==" { return T_OP_EQ; }
|
|
"ne" { return T_OP_NE; }
|
|
"!=" { return T_OP_NE; }
|
|
"lt" { return T_OP_LT; }
|
|
"<" { return T_OP_LT; }
|
|
"le" { return T_OP_LE; }
|
|
"<=" { return T_OP_LE; }
|
|
"gt" { return T_OP_GT; }
|
|
">" { return T_OP_GT; }
|
|
"ge" { return T_OP_GE; }
|
|
">=" { return T_OP_GE; }
|
|
"=~" { return T_OP_REG; }
|
|
"!~" { return T_OP_NRE; }
|
|
"and" { return T_OP_AND; }
|
|
"&&" { return T_OP_AND; }
|
|
"or" { return T_OP_OR; }
|
|
"||" { return T_OP_OR; }
|
|
"not" { return T_OP_NOT; }
|
|
"!" { return T_OP_NOT; }
|
|
"in" { return T_OP_IN; }
|
|
|
|
/*
|
|
* Functions
|
|
*/
|
|
"file" { return T_FUNC_FILE; }
|
|
|
|
/*
|
|
* 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;
|
|
}
|
|
|