ossp-pkg/l2/l2_spec_scan.l
1.4
%{
/*
** L2 - OSSP Logging Library
** Copyright (c) 2001 The OSSP Project (http://www.ossp.org/)
** Copyright (c) 2001 Cable & Wireless Deutschland (http://www.cw.com/de/)
**
** This file is part of OSSP L2, a flexible logging library which
** can be found at http://www.ossp.org/pkg/l2/.
**
** Permission to use, copy, modify, and distribute this software for
** any purpose with or without fee is hereby granted, provided that
** the above copyright notice and this permission notice appear in all
** copies.
**
** 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR
** 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.
**
** l2_spec_scan.l: GNU Flex (Lex-style) scanner specification
**
** ATTENTION: This requires GNU Flex 2.5.6-dev-2001.11.01 or newer!
*/
#include "l2.h" /* for l2_xxx() */
#include "l2_spec.h" /* for l2_spec_ctx_t */
#include "l2_spec_parse.h" /* for T_XXXX */
/* how to find our own context */
#define CTX ((l2_spec_ctx_t *)yyget_extra(yy_globals))
/* provide own input handling */
#define YY_NO_UNPUT 1
#undef YY_INPUT
#define YY_INPUT(buf,result,max_size) (result = yyinput(CTX, buf, max_size))
static int yyinput(l2_spec_ctx_t *ctx, char *buf, int max_size);
%}
/* scanner options */
%pointer
%option reentrant-bison
%option never-interactive
%option noyywrap
/* scanner states */
%x str
%%
/* local variables */
char caStr[2048];
char *cpStr = NULL;
/* whitespaces */
[ \t\n]+ {
/* NOOP */
}
/* C-style strings ("...") */
\" {
cpStr = caStr;
BEGIN(str);
}
<str>\" {
BEGIN(INITIAL);
*cpStr = '\0';
yylval->cpValue = strdup(caStr);
return T_STRING;
}
<str>\n {
l2_env_errorinfo(CTX->env, L2_ERR_ARG, "%s", "Unterminated string");
CTX->rv = L2_ERR_ARG;
}
<str>\\[0-7]{1,3} {
unsigned int result;
(void)sscanf(yytext+1, "%o", &result);
if (result > 0xff) {
l2_env_errorinfo(CTX->env, L2_ERR_ARG, "%s", "Escape sequence out of bound");
CTX->rv = L2_ERR_ARG;
}
else
*cpStr++ = result;
}
<str>\\[0-9]+ {
l2_env_errorinfo(CTX->env, L2_ERR_ARG, "%s", "Bad escape sequence");
CTX->rv = L2_ERR_ARG;
}
<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 != '\0')
*cpStr++ = *cp++;
}
<str>. {
*cpStr++ = yytext[1];
}
/* operators */
"->" {
return T_OP_ARROW;
}
/* identifiers */
[a-zA-Z][a-zA-Z0-9_-]* {
yylval->cpValue = strdup(yytext);
return T_ID;
}
/* anything else is returned as is... */
.|\n {
return yytext[0];
}
%%
/* buffer-based input routine */
static int yyinput(l2_spec_ctx_t *ctx, char *buf, int max_size)
{
int n;
n = (ctx->inputbuf + ctx->inputlen - ctx->inputptr);
if (n > max_size)
n = max_size;
if (n <= 0)
return YY_NULL;
memcpy(buf, ctx->inputptr, n);
ctx->inputptr += n;
return n;
}