-/* $Id: lexer.c,v 1.1 2003-01-06 08:20:27 adam Exp $
+/* $Id: lexer.c,v 1.4 2003-04-14 16:52:10 adam Exp $
Copyright (C) 2002-2003
Index Data Aps
See the file LICENSE.
*/
+
+static void putb(YYSTYPE *lval, CQL_parser cp, int c)
+{
+ if (lval->len+1 >= lval->size)
+ {
+ char *nb = nmem_malloc(cp->nmem, (lval->size = lval->len * 2 + 20));
+ memcpy (nb, lval->buf, lval->len);
+ lval->buf = nb;
+ }
+ if (c)
+ lval->buf[lval->len++] = c;
+ lval->buf[lval->len] = '\0';
+}
+
/*
* bison lexer for CQL.
*/
{
CQL_parser cp = (CQL_parser) vp;
int c;
+ lval->cql = 0;
+ lval->rel = 0;
+ lval->len = 0;
+ lval->size = 10;
+ lval->buf = nmem_malloc(cp->nmem, lval->size);
+ lval->buf[0] = '\0';
do
{
c = cp->getbyte(cp->client_data);
if (c == '\n')
return 0;
} while (isspace(c));
- lval->rel = 0;
- lval->len = 0;
if (strchr("()=></", c))
{
int c1;
- lval->buf[lval->len++] = c;
+ putb(lval, cp, c);
if (c == '>')
{
c1 = cp->getbyte(cp->client_data);
if (c1 == '=')
{
- lval->buf[lval->len++] = c1;
- lval->buf[lval->len] = 0;
+ putb(lval, cp, c1);
return GE;
}
else
c1 = cp->getbyte(cp->client_data);
if (c1 == '=')
{
- lval->buf[lval->len++] = c1;
- lval->buf[lval->len] = 0;
+ putb(lval, cp, c1);
return LE;
}
else if (c1 == '>')
{
- lval->buf[lval->len++] = c1;
- lval->buf[lval->len] = 0;
+ putb(lval, cp, c1);
return NE;
}
else
cp->ungetbyte(c1, cp->client_data);
}
- lval->buf[lval->len] = 0;
return c;
}
if (c == '"')
{
if (c == '\\')
c = cp->getbyte(cp->client_data);
- lval->buf[lval->len++] = c;
+ putb(lval, cp, c);
}
- lval->buf[lval->len] = 0;
+ putb(lval, cp, 0);
}
else
{
- lval->buf[lval->len++] = c;
+ putb(lval, cp, c);
while ((c = cp->getbyte(cp->client_data)) != 0 &&
!strchr(" \n()=<>/", c))
{
if (c == '\\')
c = cp->getbyte(cp->client_data);
- lval->buf[lval->len++] = c;
+ putb(lval, cp, c);
}
- lval->buf[lval->len] = 0;
#if YYDEBUG
printf ("got %s\n", lval->buf);
#endif