0415a45eefa66d79bbff6491fd30fe39e912a691
[yaz-moved-to-github.git] / cql / lexer.c
1 /* $Id: lexer.c,v 1.2 2003-04-11 15:53:39 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     do
32     {
33         c = cp->getbyte(cp->client_data);
34         if (c == 0)
35             return 0;
36         if (c == '\n')
37             return 0;
38     } while (isspace(c));
39     lval->rel = 0;
40     lval->len = 0;
41     lval->size = 10;
42     lval->buf = nmem_malloc(cp->nmem, lval->size);
43     if (strchr("()=></", c))
44     {
45         int c1;
46         putb(lval, cp, c);
47         if (c == '>')
48         {
49             c1 = cp->getbyte(cp->client_data);
50             if (c1 == '=')
51             {
52                 putb(lval, cp, c1);
53                 return GE;
54             }
55             else
56                 cp->ungetbyte(c1, cp->client_data);
57         }
58         else if (c == '<')
59         {
60             c1 = cp->getbyte(cp->client_data);
61             if (c1 == '=')
62             {
63                 putb(lval, cp, c1);
64                 return LE;
65             }
66             else if (c1 == '>')
67             {
68                 putb(lval, cp, c1);
69                 return NE;
70             }
71             else
72                 cp->ungetbyte(c1, cp->client_data);
73         }
74         return c;
75     }
76     if (c == '"')
77     {
78         while ((c = cp->getbyte(cp->client_data)) != EOF && c != '"')
79         {
80             if (c == '\\')
81                 c = cp->getbyte(cp->client_data);
82             putb(lval, cp, c);
83         }
84         putb(lval, cp, 0);
85     }
86     else
87     {
88         putb(lval, cp, c);
89         while ((c = cp->getbyte(cp->client_data)) != 0 &&
90                !strchr(" \n()=<>/", c))
91         {
92             if (c == '\\')
93                 c = cp->getbyte(cp->client_data);
94             putb(lval, cp, c);
95         }
96 #if YYDEBUG
97         printf ("got %s\n", lval->buf);
98 #endif
99         if (c != 0)
100             cp->ungetbyte(c, cp->client_data);
101         if (!strcmp(lval->buf, "and"))
102             return AND;
103         if (!strcmp(lval->buf, "or"))
104             return OR;
105         if (!strcmp(lval->buf, "not"))
106             return NOT;
107         if (!strcmp(lval->buf, "exact"))
108             return EXACT;
109         if (!strcmp(lval->buf, "all"))
110             return ALL;
111         if (!strncmp(lval->buf, "prox", 4))
112             return PROX;
113         if (!strcmp(lval->buf, "any"))
114             return ANY;
115         if (!strcmp(lval->buf, "scr"))
116             return SCR;
117     }
118     return TERM;
119 }