Fix bug with unset member of lex token
[yaz-moved-to-github.git] / cql / lexer.c
1 /* $Id: lexer.c,v 1.3 2003-04-14 15:40:03 adam Exp $
2    Copyright (C) 2002-2003
3    Index Data Aps
4
5 This file is part of the YAZ toolkit.
6
7 See the file LICENSE.
8 */
9
10 static void putb(YYSTYPE *lval, CQL_parser cp, int c)
11 {
12     if (lval->len >= lval->size)
13     {
14         char *nb = nmem_malloc(cp->nmem, (lval->size = lval->len * 2 + 20));
15         memcpy (nb, lval->buf, lval->len);
16         lval->buf = nb;
17     }
18     if (c)
19         lval->buf[lval->len++] = c;
20     lval->buf[lval->len] = '\0';
21 }
22
23 /*
24  * bison lexer for CQL.
25  */
26
27 int yylex(YYSTYPE *lval, void *vp)
28 {
29     CQL_parser cp = (CQL_parser) vp;
30     int c;
31     lval->cql = 0;
32     lval->rel = 0;
33     lval->rel = 0;
34     lval->len = 0;
35     lval->size = 10;
36     lval->buf = nmem_malloc(cp->nmem, lval->size);
37     lval->buf[0] = '\0';
38     do
39     {
40         c = cp->getbyte(cp->client_data);
41         if (c == 0)
42             return 0;
43         if (c == '\n')
44             return 0;
45     } while (isspace(c));
46     if (strchr("()=></", c))
47     {
48         int c1;
49         putb(lval, cp, c);
50         if (c == '>')
51         {
52             c1 = cp->getbyte(cp->client_data);
53             if (c1 == '=')
54             {
55                 putb(lval, cp, c1);
56                 return GE;
57             }
58             else
59                 cp->ungetbyte(c1, cp->client_data);
60         }
61         else if (c == '<')
62         {
63             c1 = cp->getbyte(cp->client_data);
64             if (c1 == '=')
65             {
66                 putb(lval, cp, c1);
67                 return LE;
68             }
69             else if (c1 == '>')
70             {
71                 putb(lval, cp, c1);
72                 return NE;
73             }
74             else
75                 cp->ungetbyte(c1, cp->client_data);
76         }
77         return c;
78     }
79     if (c == '"')
80     {
81         while ((c = cp->getbyte(cp->client_data)) != EOF && c != '"')
82         {
83             if (c == '\\')
84                 c = cp->getbyte(cp->client_data);
85             putb(lval, cp, c);
86         }
87         putb(lval, cp, 0);
88     }
89     else
90     {
91         putb(lval, cp, c);
92         while ((c = cp->getbyte(cp->client_data)) != 0 &&
93                !strchr(" \n()=<>/", c))
94         {
95             if (c == '\\')
96                 c = cp->getbyte(cp->client_data);
97             putb(lval, cp, c);
98         }
99 #if YYDEBUG
100         printf ("got %s\n", lval->buf);
101 #endif
102         if (c != 0)
103             cp->ungetbyte(c, cp->client_data);
104         if (!strcmp(lval->buf, "and"))
105             return AND;
106         if (!strcmp(lval->buf, "or"))
107             return OR;
108         if (!strcmp(lval->buf, "not"))
109             return NOT;
110         if (!strcmp(lval->buf, "exact"))
111             return EXACT;
112         if (!strcmp(lval->buf, "all"))
113             return ALL;
114         if (!strncmp(lval->buf, "prox", 4))
115             return PROX;
116         if (!strcmp(lval->buf, "any"))
117             return ANY;
118         if (!strcmp(lval->buf, "scr"))
119             return SCR;
120     }
121     return TERM;
122 }