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