X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=cql%2Flexer.c;h=8ac8591f13ecfb1fe8c9476b912c596cdf2d50fe;hb=5381b2f81bb793e364cd5b2a910e026ce84d9d05;hp=8a26522370426d9d0d8792d8538bcb90fcb06cbd;hpb=4d531a1a9131d69c3b6c27fbac42837e22cff61c;p=yaz-moved-to-github.git diff --git a/cql/lexer.c b/cql/lexer.c index 8a26522..8ac8591 100644 --- a/cql/lexer.c +++ b/cql/lexer.c @@ -1,4 +1,4 @@ -/* $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 @@ -6,6 +6,20 @@ This file is part of the YAZ toolkit. 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. */ @@ -14,6 +28,12 @@ int yylex(YYSTYPE *lval, void *vp) { 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); @@ -22,19 +42,16 @@ int yylex(YYSTYPE *lval, void *vp) if (c == '\n') return 0; } while (isspace(c)); - lval->rel = 0; - lval->len = 0; if (strchr("()=>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 @@ -45,20 +62,17 @@ int yylex(YYSTYPE *lval, void *vp) 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 == '"') @@ -67,21 +81,20 @@ int yylex(YYSTYPE *lval, void *vp) { 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