ferret 0.10.14 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- data/TODO +3 -0
- data/ext/analysis.c +5 -0
- data/ext/compound_io.c +46 -24
- data/ext/except.c +14 -0
- data/ext/except.h +29 -17
- data/ext/ferret.c +22 -1
- data/ext/ferret.h +2 -1
- data/ext/fs_store.c +9 -12
- data/ext/global.c +80 -0
- data/ext/global.h +10 -0
- data/ext/hash.c +0 -7
- data/ext/hash.h +0 -8
- data/ext/index.c +1289 -625
- data/ext/index.h +59 -14
- data/ext/q_boolean.c +12 -5
- data/ext/q_parser.c +570 -372
- data/ext/r_analysis.c +16 -16
- data/ext/r_index.c +41 -43
- data/ext/r_qparser.c +37 -36
- data/ext/r_search.c +10 -10
- data/ext/r_store.c +7 -7
- data/ext/ram_store.c +4 -3
- data/ext/search.c +3 -2
- data/ext/store.c +35 -19
- data/ext/store.h +3 -5
- data/lib/ferret/index.rb +4 -4
- data/lib/ferret_version.rb +1 -1
- data/test/threading/thread_safety_read_write_test.rb +76 -0
- data/test/threading/thread_safety_test.rb +17 -21
- data/test/unit/index/tc_index.rb +6 -2
- data/test/unit/index/tc_index_writer.rb +2 -2
- data/test/unit/query_parser/tc_query_parser.rb +20 -5
- data/test/unit/search/tc_index_searcher.rb +3 -1
- data/test/unit/search/tm_searcher.rb +3 -1
- metadata +3 -2
data/ext/index.h
CHANGED
@@ -14,6 +14,7 @@
|
|
14
14
|
|
15
15
|
typedef struct IndexReader IndexReader;
|
16
16
|
typedef struct MultiReader MultiReader;
|
17
|
+
typedef struct Deleter Deleter;
|
17
18
|
|
18
19
|
/****************************************************************************
|
19
20
|
*
|
@@ -130,6 +131,7 @@ extern void fi_deref(FieldInfo *fi);
|
|
130
131
|
****************************************************************************/
|
131
132
|
|
132
133
|
#define FIELD_INFOS_INIT_CAPA 4
|
134
|
+
/* carry changes over to dummy_fis in test/test_segments.c */
|
133
135
|
typedef struct FieldInfos
|
134
136
|
{
|
135
137
|
int store;
|
@@ -147,8 +149,8 @@ extern FieldInfo *fis_add_field(FieldInfos *fis, FieldInfo *fi);
|
|
147
149
|
extern FieldInfo *fis_get_field(FieldInfos *fis, const char *name);
|
148
150
|
extern int fis_get_field_num(FieldInfos *fis, const char *name);
|
149
151
|
extern FieldInfo *fis_get_or_add_field(FieldInfos *fis, const char *name);
|
150
|
-
extern void fis_write(FieldInfos *fis,
|
151
|
-
extern FieldInfos *fis_read(
|
152
|
+
extern void fis_write(FieldInfos *fis, OutStream *os);
|
153
|
+
extern FieldInfos *fis_read(InStream *is);
|
152
154
|
extern char *fis_to_s(FieldInfos *fis);
|
153
155
|
extern void fis_deref(FieldInfos *fis);
|
154
156
|
|
@@ -159,19 +161,26 @@ extern void fis_deref(FieldInfos *fis);
|
|
159
161
|
****************************************************************************/
|
160
162
|
|
161
163
|
#define SEGMENT_NAME_MAX_LENGTH 100
|
164
|
+
#define SEGMENTS_FILE_NAME "segments"
|
162
165
|
|
163
166
|
typedef struct SegmentInfo
|
164
167
|
{
|
168
|
+
int ref_cnt;
|
165
169
|
char *name;
|
166
|
-
int doc_cnt;
|
167
170
|
Store *store;
|
171
|
+
int doc_cnt;
|
172
|
+
int del_gen;
|
173
|
+
int *norm_gens;
|
174
|
+
int norm_gens_size;
|
175
|
+
bool use_compound_file;
|
168
176
|
} SegmentInfo;
|
169
177
|
|
170
178
|
extern SegmentInfo *si_new(char *name, int doc_cnt, Store *store);
|
171
|
-
extern void
|
179
|
+
extern void si_deref(SegmentInfo *si);
|
172
180
|
extern bool si_has_deletions(SegmentInfo *si);
|
173
181
|
extern bool si_uses_compound_file(SegmentInfo *si);
|
174
182
|
extern bool si_has_separate_norms(SegmentInfo *si);
|
183
|
+
extern void si_advance_norm_gen(SegmentInfo *si, int field_num);
|
175
184
|
|
176
185
|
/****************************************************************************
|
177
186
|
*
|
@@ -181,25 +190,32 @@ extern bool si_has_separate_norms(SegmentInfo *si);
|
|
181
190
|
|
182
191
|
typedef struct SegmentInfos
|
183
192
|
{
|
193
|
+
FieldInfos *fis;
|
184
194
|
f_u64 counter;
|
185
195
|
f_u64 version;
|
186
|
-
|
196
|
+
f_i64 generation;
|
197
|
+
f_i32 format;
|
187
198
|
Store *store;
|
188
199
|
SegmentInfo **segs;
|
189
200
|
int size;
|
190
201
|
int capa;
|
191
202
|
} SegmentInfos;
|
192
203
|
|
193
|
-
extern
|
204
|
+
extern char *fn_for_generation(char *buf, char *base, char *ext, f_i64 gen);
|
205
|
+
|
206
|
+
extern SegmentInfos *sis_new(FieldInfos *fis);
|
194
207
|
extern SegmentInfo *sis_new_segment(SegmentInfos *sis, int dcnt, Store *store);
|
195
208
|
extern SegmentInfo *sis_add_si(SegmentInfos *sis, SegmentInfo *si);
|
196
209
|
extern void sis_del_at(SegmentInfos *sis, int at);
|
197
210
|
extern void sis_del_from_to(SegmentInfos *sis, int from, int to);
|
198
211
|
extern void sis_clear(SegmentInfos *sis);
|
199
212
|
extern SegmentInfos *sis_read(Store *store);
|
200
|
-
extern void sis_write(SegmentInfos *sis, Store *store);
|
213
|
+
extern void sis_write(SegmentInfos *sis, Store *store, Deleter *deleter);
|
201
214
|
extern f_u64 sis_read_current_version(Store *store);
|
202
215
|
extern void sis_destroy(SegmentInfos *sis);
|
216
|
+
extern f_i64 sis_current_segment_generation(Store *store);
|
217
|
+
extern char *sis_curr_seg_file_name(char *buf, Store *store);
|
218
|
+
extern void sis_put(SegmentInfos *sis, FILE *stream);
|
203
219
|
|
204
220
|
/****************************************************************************
|
205
221
|
*
|
@@ -394,7 +410,7 @@ typedef struct SegmentTermDocEnum SegmentTermDocEnum;
|
|
394
410
|
struct SegmentTermDocEnum
|
395
411
|
{
|
396
412
|
TermDocEnum tde;
|
397
|
-
void (*seek_prox)(SegmentTermDocEnum *stde,
|
413
|
+
void (*seek_prox)(SegmentTermDocEnum *stde, off_t prx_ptr);
|
398
414
|
void (*skip_prox)(SegmentTermDocEnum *stde);
|
399
415
|
TermInfosReader *tir;
|
400
416
|
InStream *frq_in;
|
@@ -409,11 +425,11 @@ struct SegmentTermDocEnum
|
|
409
425
|
int skip_interval;
|
410
426
|
int skip_count;
|
411
427
|
int skip_doc;
|
412
|
-
int frq_ptr;
|
413
|
-
int prx_ptr;
|
414
|
-
int skip_ptr;
|
415
428
|
int prx_cnt;
|
416
429
|
int position;
|
430
|
+
off_t frq_ptr;
|
431
|
+
off_t prx_ptr;
|
432
|
+
off_t skip_ptr;
|
417
433
|
bool have_skipped : 1;
|
418
434
|
};
|
419
435
|
|
@@ -683,6 +699,31 @@ extern void fw_add_postings(FieldsWriter *fw,
|
|
683
699
|
int offset_count);
|
684
700
|
extern void fw_write_tv_index(FieldsWriter *fw);
|
685
701
|
|
702
|
+
/****************************************************************************
|
703
|
+
*
|
704
|
+
* Deleter
|
705
|
+
*
|
706
|
+
* A utility class (used by both IndexReader and IndexWriter) to keep track of
|
707
|
+
* files that need to be deleted because they are no longer referenced by the
|
708
|
+
* index.
|
709
|
+
*
|
710
|
+
****************************************************************************/
|
711
|
+
|
712
|
+
struct Deleter
|
713
|
+
{
|
714
|
+
Store *store;
|
715
|
+
SegmentInfos *sis;
|
716
|
+
HashSet *pending;
|
717
|
+
};
|
718
|
+
|
719
|
+
extern Deleter *deleter_new(SegmentInfos *sis, Store *store);
|
720
|
+
extern void deleter_destroy(Deleter *dlr);
|
721
|
+
extern void deleter_clear_pending_files(Deleter *dlr);
|
722
|
+
extern void deleter_delete_file(Deleter *dlr, char *file_name);
|
723
|
+
extern void deleter_find_deletable_files(Deleter *dlr);
|
724
|
+
extern void deleter_commit_pending_files(Deleter *dlr);
|
725
|
+
extern void deleter_delete_files(Deleter *dlr, char **files, int file_cnt);
|
726
|
+
|
686
727
|
/****************************************************************************
|
687
728
|
*
|
688
729
|
* IndexReader
|
@@ -718,9 +759,11 @@ struct IndexReader
|
|
718
759
|
uchar val);
|
719
760
|
void (*delete_doc_i)(IndexReader *ir, int doc_num);
|
720
761
|
void (*undelete_all_i)(IndexReader *ir);
|
762
|
+
void (*set_deleter_i)(IndexReader *ir, Deleter *dlr);
|
721
763
|
void (*commit_i)(IndexReader *ir);
|
722
764
|
void (*close_i)(IndexReader *ir);
|
723
765
|
int ref_cnt;
|
766
|
+
Deleter *deleter;
|
724
767
|
Store *store;
|
725
768
|
Lock *write_lock;
|
726
769
|
SegmentInfos *sis;
|
@@ -824,7 +867,7 @@ typedef struct IndexWriter IndexWriter;
|
|
824
867
|
typedef struct DocWriter
|
825
868
|
{
|
826
869
|
Store *store;
|
827
|
-
|
870
|
+
SegmentInfo *si;
|
828
871
|
FieldInfos *fis;
|
829
872
|
TermVectorsWriter *tvw;
|
830
873
|
FieldsWriter *fw;
|
@@ -843,10 +886,10 @@ typedef struct DocWriter
|
|
843
886
|
int max_buffered_docs;
|
844
887
|
} DocWriter;
|
845
888
|
|
846
|
-
extern DocWriter *dw_open(IndexWriter *is,
|
889
|
+
extern DocWriter *dw_open(IndexWriter *is, SegmentInfo *si);
|
847
890
|
extern void dw_close(DocWriter *dw);
|
848
891
|
extern void dw_add_doc(DocWriter *dw, Document *doc);
|
849
|
-
extern void dw_new_segment(DocWriter *dw,
|
892
|
+
extern void dw_new_segment(DocWriter *dw, SegmentInfo *si);
|
850
893
|
|
851
894
|
/****************************************************************************
|
852
895
|
*
|
@@ -871,9 +914,11 @@ struct IndexWriter
|
|
871
914
|
DocWriter *dw;
|
872
915
|
Similarity *similarity;
|
873
916
|
Lock *write_lock;
|
917
|
+
Deleter *deleter;
|
874
918
|
};
|
875
919
|
|
876
920
|
extern void index_create(Store *store, FieldInfos *fis);
|
921
|
+
extern bool index_is_locked(Store *store);
|
877
922
|
extern IndexWriter *iw_open(Store *store, volatile Analyzer *analyzer,
|
878
923
|
const Config *config);
|
879
924
|
extern void iw_delete_term(IndexWriter *iw, const char *field,
|
data/ext/q_boolean.c
CHANGED
@@ -1326,10 +1326,11 @@ static MatchVector *bq_get_matchv_i(Query *self, MatchVector *mv,
|
|
1326
1326
|
static Query *bq_rewrite(Query *self, IndexReader *ir)
|
1327
1327
|
{
|
1328
1328
|
int i;
|
1329
|
-
|
1329
|
+
const int clause_cnt = BQ(self)->clause_cnt;
|
1330
1330
|
bool rewritten = false;
|
1331
|
+
bool has_non_prohibited_clause = false;
|
1331
1332
|
|
1332
|
-
if (
|
1333
|
+
if (clause_cnt == 1) {
|
1333
1334
|
/* optimize 1-clause queries */
|
1334
1335
|
BooleanClause *clause = BQ(self)->clauses[0];
|
1335
1336
|
if (! clause->is_prohibited) {
|
@@ -1357,18 +1358,21 @@ static Query *bq_rewrite(Query *self, IndexReader *ir)
|
|
1357
1358
|
|
1358
1359
|
self->ref_cnt++;
|
1359
1360
|
/* replace each clause's query with its rewritten query */
|
1360
|
-
for (i = 0; i <
|
1361
|
+
for (i = 0; i < clause_cnt; i++) {
|
1361
1362
|
BooleanClause *clause = BQ(self)->clauses[i];
|
1362
1363
|
Query *rq = clause->query->rewrite(clause->query, ir);
|
1364
|
+
/* check for at least one non-prohibited clause */
|
1365
|
+
if (clause->is_prohibited == false) has_non_prohibited_clause = true;
|
1363
1366
|
if (rq != clause->query) {
|
1364
1367
|
if (!rewritten) {
|
1365
1368
|
int j;
|
1366
1369
|
Query *new_self = q_new(BooleanQuery);
|
1367
1370
|
memcpy(new_self, self, sizeof(BooleanQuery));
|
1368
|
-
BQ(new_self)->clauses = ALLOC_N(BooleanClause *,
|
1371
|
+
BQ(new_self)->clauses = ALLOC_N(BooleanClause *,
|
1372
|
+
BQ(self)->clause_capa);
|
1369
1373
|
memcpy(BQ(new_self)->clauses, BQ(self)->clauses,
|
1370
1374
|
BQ(self)->clause_capa * sizeof(BooleanClause *));
|
1371
|
-
for (j = 0; j <
|
1375
|
+
for (j = 0; j < clause_cnt; j++) {
|
1372
1376
|
REF(BQ(self)->clauses[j]);
|
1373
1377
|
}
|
1374
1378
|
self->ref_cnt--;
|
@@ -1382,6 +1386,9 @@ static Query *bq_rewrite(Query *self, IndexReader *ir)
|
|
1382
1386
|
DEREF(rq);
|
1383
1387
|
}
|
1384
1388
|
}
|
1389
|
+
if (clause_cnt > 0 && !has_non_prohibited_clause) {
|
1390
|
+
bq_add_query_nr(self, maq_new(), BC_MUST);
|
1391
|
+
}
|
1385
1392
|
|
1386
1393
|
return self;
|
1387
1394
|
}
|
data/ext/q_parser.c
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
-
/* A Bison parser, made by GNU Bison 2.
|
1
|
+
/* A Bison parser, made by GNU Bison 2.3. */
|
2
2
|
|
3
|
-
/* Skeleton
|
4
|
-
|
3
|
+
/* Skeleton implementation for Bison's Yacc-like parsers in C
|
4
|
+
|
5
|
+
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
|
6
|
+
Free Software Foundation, Inc.
|
5
7
|
|
6
8
|
This program is free software; you can redistribute it and/or modify
|
7
9
|
it under the terms of the GNU General Public License as published by
|
@@ -18,13 +20,21 @@
|
|
18
20
|
Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
19
21
|
Boston, MA 02110-1301, USA. */
|
20
22
|
|
21
|
-
/* As a special exception,
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
/* As a special exception, you may create a larger work that contains
|
24
|
+
part or all of the Bison parser skeleton and distribute that work
|
25
|
+
under terms of your choice, so long as that work isn't itself a
|
26
|
+
parser generator using the skeleton or a modified version thereof
|
27
|
+
as a parser skeleton. Alternatively, if you modify or redistribute
|
28
|
+
the parser skeleton itself, you may (at your option) remove this
|
29
|
+
special exception, which will cause the skeleton and the resulting
|
30
|
+
Bison output files to be licensed under the GNU General Public
|
31
|
+
License without this special exception.
|
32
|
+
|
33
|
+
This special exception was added by the Free Software Foundation in
|
34
|
+
version 2.2 of Bison. */
|
25
35
|
|
26
|
-
/*
|
27
|
-
|
36
|
+
/* C LALR(1) parser skeleton written by Richard Stallman, by
|
37
|
+
simplifying the original so-called "semantic" parser. */
|
28
38
|
|
29
39
|
/* All symbols defined below should begin with yy or YY, to avoid
|
30
40
|
infringing on user name space. This should be done even for local
|
@@ -37,7 +47,7 @@
|
|
37
47
|
#define YYBISON 1
|
38
48
|
|
39
49
|
/* Bison version. */
|
40
|
-
#define YYBISON_VERSION "2.
|
50
|
+
#define YYBISON_VERSION "2.3"
|
41
51
|
|
42
52
|
/* Skeleton name. */
|
43
53
|
#define YYSKELETON_NAME "yacc.c"
|
@@ -125,18 +135,20 @@ int qp_default_fuzzy_pre_len = 0;
|
|
125
135
|
# define YYTOKEN_TABLE 0
|
126
136
|
#endif
|
127
137
|
|
128
|
-
#if ! defined
|
138
|
+
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
139
|
+
typedef union YYSTYPE
|
129
140
|
#line 26 "src/q_parser.y"
|
130
|
-
|
141
|
+
{
|
131
142
|
Query *query;
|
132
143
|
BooleanClause *bcls;
|
133
144
|
BCArray *bclss;
|
134
145
|
HashSet *hashset;
|
135
146
|
Phrase *phrase;
|
136
147
|
char *str;
|
137
|
-
}
|
138
|
-
/* Line
|
139
|
-
#line
|
148
|
+
}
|
149
|
+
/* Line 193 of yacc.c. */
|
150
|
+
#line 151 "y.tab.c"
|
151
|
+
YYSTYPE;
|
140
152
|
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
141
153
|
# define YYSTYPE_IS_DECLARED 1
|
142
154
|
# define YYSTYPE_IS_TRIVIAL 1
|
@@ -199,23 +211,56 @@ static Query *get_r_q(QParser *qp, char *field, char *from, char *to,
|
|
199
211
|
} while (0)
|
200
212
|
|
201
213
|
|
202
|
-
/* Line
|
203
|
-
#line
|
214
|
+
/* Line 216 of yacc.c. */
|
215
|
+
#line 216 "y.tab.c"
|
204
216
|
|
205
|
-
#
|
206
|
-
#
|
217
|
+
#ifdef short
|
218
|
+
# undef short
|
207
219
|
#endif
|
208
|
-
|
209
|
-
#
|
220
|
+
|
221
|
+
#ifdef YYTYPE_UINT8
|
222
|
+
typedef YYTYPE_UINT8 yytype_uint8;
|
223
|
+
#else
|
224
|
+
typedef unsigned char yytype_uint8;
|
210
225
|
#endif
|
211
|
-
|
212
|
-
#
|
213
|
-
|
226
|
+
|
227
|
+
#ifdef YYTYPE_INT8
|
228
|
+
typedef YYTYPE_INT8 yytype_int8;
|
229
|
+
#elif (defined __STDC__ || defined __C99__FUNC__ \
|
230
|
+
|| defined __cplusplus || defined _MSC_VER)
|
231
|
+
typedef signed char yytype_int8;
|
232
|
+
#else
|
233
|
+
typedef short int yytype_int8;
|
214
234
|
#endif
|
215
|
-
|
216
|
-
#
|
235
|
+
|
236
|
+
#ifdef YYTYPE_UINT16
|
237
|
+
typedef YYTYPE_UINT16 yytype_uint16;
|
238
|
+
#else
|
239
|
+
typedef unsigned short int yytype_uint16;
|
217
240
|
#endif
|
218
241
|
|
242
|
+
#ifdef YYTYPE_INT16
|
243
|
+
typedef YYTYPE_INT16 yytype_int16;
|
244
|
+
#else
|
245
|
+
typedef short int yytype_int16;
|
246
|
+
#endif
|
247
|
+
|
248
|
+
#ifndef YYSIZE_T
|
249
|
+
# ifdef __SIZE_TYPE__
|
250
|
+
# define YYSIZE_T __SIZE_TYPE__
|
251
|
+
# elif defined size_t
|
252
|
+
# define YYSIZE_T size_t
|
253
|
+
# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
|
254
|
+
|| defined __cplusplus || defined _MSC_VER)
|
255
|
+
# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
|
256
|
+
# define YYSIZE_T size_t
|
257
|
+
# else
|
258
|
+
# define YYSIZE_T unsigned int
|
259
|
+
# endif
|
260
|
+
#endif
|
261
|
+
|
262
|
+
#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
|
263
|
+
|
219
264
|
#ifndef YY_
|
220
265
|
# if YYENABLE_NLS
|
221
266
|
# if ENABLE_NLS
|
@@ -228,7 +273,32 @@ static Query *get_r_q(QParser *qp, char *field, char *from, char *to,
|
|
228
273
|
# endif
|
229
274
|
#endif
|
230
275
|
|
231
|
-
|
276
|
+
/* Suppress unused-variable warnings by "using" E. */
|
277
|
+
#if ! defined lint || defined __GNUC__
|
278
|
+
# define YYUSE(e) ((void) (e))
|
279
|
+
#else
|
280
|
+
# define YYUSE(e) /* empty */
|
281
|
+
#endif
|
282
|
+
|
283
|
+
/* Identity function, used to suppress warnings about constant conditions. */
|
284
|
+
#ifndef lint
|
285
|
+
# define YYID(n) (n)
|
286
|
+
#else
|
287
|
+
#if (defined __STDC__ || defined __C99__FUNC__ \
|
288
|
+
|| defined __cplusplus || defined _MSC_VER)
|
289
|
+
static int
|
290
|
+
YYID (int i)
|
291
|
+
#else
|
292
|
+
static int
|
293
|
+
YYID (i)
|
294
|
+
int i;
|
295
|
+
#endif
|
296
|
+
{
|
297
|
+
return i;
|
298
|
+
}
|
299
|
+
#endif
|
300
|
+
|
301
|
+
#if ! defined yyoverflow || YYERROR_VERBOSE
|
232
302
|
|
233
303
|
/* The parser invokes alloca or malloc; define the necessary symbols. */
|
234
304
|
|
@@ -236,64 +306,76 @@ static Query *get_r_q(QParser *qp, char *field, char *from, char *to,
|
|
236
306
|
# if YYSTACK_USE_ALLOCA
|
237
307
|
# ifdef __GNUC__
|
238
308
|
# define YYSTACK_ALLOC __builtin_alloca
|
309
|
+
# elif defined __BUILTIN_VA_ARG_INCR
|
310
|
+
# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
|
311
|
+
# elif defined _AIX
|
312
|
+
# define YYSTACK_ALLOC __alloca
|
313
|
+
# elif defined _MSC_VER
|
314
|
+
# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
|
315
|
+
# define alloca _alloca
|
239
316
|
# else
|
240
317
|
# define YYSTACK_ALLOC alloca
|
241
|
-
# if defined (__STDC__
|
318
|
+
# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
|
319
|
+
|| defined __cplusplus || defined _MSC_VER)
|
242
320
|
# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
|
243
|
-
#
|
321
|
+
# ifndef _STDLIB_H
|
322
|
+
# define _STDLIB_H 1
|
323
|
+
# endif
|
244
324
|
# endif
|
245
325
|
# endif
|
246
326
|
# endif
|
247
327
|
# endif
|
248
328
|
|
249
329
|
# ifdef YYSTACK_ALLOC
|
250
|
-
/* Pacify GCC's `empty if-body' warning.
|
251
|
-
# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
|
330
|
+
/* Pacify GCC's `empty if-body' warning. */
|
331
|
+
# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
|
252
332
|
# ifndef YYSTACK_ALLOC_MAXIMUM
|
253
333
|
/* The OS might guarantee only one guard page at the bottom of the stack,
|
254
334
|
and a page size can be as small as 4096 bytes. So we cannot safely
|
255
335
|
invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
|
256
336
|
to allow for a few compiler-allocated temporary stack slots. */
|
257
|
-
# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa
|
337
|
+
# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
|
258
338
|
# endif
|
259
339
|
# else
|
260
340
|
# define YYSTACK_ALLOC YYMALLOC
|
261
341
|
# define YYSTACK_FREE YYFREE
|
262
342
|
# ifndef YYSTACK_ALLOC_MAXIMUM
|
263
|
-
# define YYSTACK_ALLOC_MAXIMUM
|
343
|
+
# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
|
264
344
|
# endif
|
265
|
-
#
|
266
|
-
|
345
|
+
# if (defined __cplusplus && ! defined _STDLIB_H \
|
346
|
+
&& ! ((defined YYMALLOC || defined malloc) \
|
347
|
+
&& (defined YYFREE || defined free)))
|
348
|
+
# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
|
349
|
+
# ifndef _STDLIB_H
|
350
|
+
# define _STDLIB_H 1
|
351
|
+
# endif
|
267
352
|
# endif
|
268
353
|
# ifndef YYMALLOC
|
269
354
|
# define YYMALLOC malloc
|
270
|
-
# if
|
271
|
-
|
355
|
+
# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
|
356
|
+
|| defined __cplusplus || defined _MSC_VER)
|
272
357
|
void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
|
273
358
|
# endif
|
274
359
|
# endif
|
275
360
|
# ifndef YYFREE
|
276
361
|
# define YYFREE free
|
277
|
-
# if
|
278
|
-
|
362
|
+
# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
|
363
|
+
|| defined __cplusplus || defined _MSC_VER)
|
279
364
|
void free (void *); /* INFRINGES ON USER NAME SPACE */
|
280
365
|
# endif
|
281
366
|
# endif
|
282
|
-
# ifdef __cplusplus
|
283
|
-
}
|
284
|
-
# endif
|
285
367
|
# endif
|
286
|
-
#endif /* ! defined
|
368
|
+
#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
|
287
369
|
|
288
370
|
|
289
|
-
#if (! defined
|
290
|
-
&& (! defined
|
291
|
-
|| (defined
|
371
|
+
#if (! defined yyoverflow \
|
372
|
+
&& (! defined __cplusplus \
|
373
|
+
|| (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
|
292
374
|
|
293
375
|
/* A type that is properly aligned for any stack member. */
|
294
376
|
union yyalloc
|
295
377
|
{
|
296
|
-
|
378
|
+
yytype_int16 yyss;
|
297
379
|
YYSTYPE yyvs;
|
298
380
|
};
|
299
381
|
|
@@ -303,13 +385,13 @@ union yyalloc
|
|
303
385
|
/* The size of an array large to enough to hold all stacks, each with
|
304
386
|
N elements. */
|
305
387
|
# define YYSTACK_BYTES(N) \
|
306
|
-
((N) * (sizeof (
|
388
|
+
((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
|
307
389
|
+ YYSTACK_GAP_MAXIMUM)
|
308
390
|
|
309
391
|
/* Copy COUNT objects from FROM to TO. The source and destination do
|
310
392
|
not overlap. */
|
311
393
|
# ifndef YYCOPY
|
312
|
-
# if defined
|
394
|
+
# if defined __GNUC__ && 1 < __GNUC__
|
313
395
|
# define YYCOPY(To, From, Count) \
|
314
396
|
__builtin_memcpy (To, From, (Count) * sizeof (*(From)))
|
315
397
|
# else
|
@@ -320,7 +402,7 @@ union yyalloc
|
|
320
402
|
for (yyi = 0; yyi < (Count); yyi++) \
|
321
403
|
(To)[yyi] = (From)[yyi]; \
|
322
404
|
} \
|
323
|
-
while (0)
|
405
|
+
while (YYID (0))
|
324
406
|
# endif
|
325
407
|
# endif
|
326
408
|
|
@@ -338,28 +420,22 @@ union yyalloc
|
|
338
420
|
yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
|
339
421
|
yyptr += yynewbytes / sizeof (*yyptr); \
|
340
422
|
} \
|
341
|
-
while (0)
|
423
|
+
while (YYID (0))
|
342
424
|
|
343
425
|
#endif
|
344
426
|
|
345
|
-
|
346
|
-
typedef signed char yysigned_char;
|
347
|
-
#else
|
348
|
-
typedef short int yysigned_char;
|
349
|
-
#endif
|
350
|
-
|
351
|
-
/* YYFINAL -- State number of the termination state. */
|
427
|
+
/* YYFINAL -- State number of the termination state. */
|
352
428
|
#define YYFINAL 39
|
353
429
|
/* YYLAST -- Last index in YYTABLE. */
|
354
430
|
#define YYLAST 126
|
355
431
|
|
356
|
-
/* YYNTOKENS -- Number of terminals.
|
432
|
+
/* YYNTOKENS -- Number of terminals. */
|
357
433
|
#define YYNTOKENS 26
|
358
|
-
/* YYNNTS -- Number of nonterminals.
|
434
|
+
/* YYNNTS -- Number of nonterminals. */
|
359
435
|
#define YYNNTS 16
|
360
|
-
/* YYNRULES -- Number of rules.
|
436
|
+
/* YYNRULES -- Number of rules. */
|
361
437
|
#define YYNRULES 51
|
362
|
-
/* YYNRULES -- Number of states.
|
438
|
+
/* YYNRULES -- Number of states. */
|
363
439
|
#define YYNSTATES 80
|
364
440
|
|
365
441
|
/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
|
@@ -370,7 +446,7 @@ union yyalloc
|
|
370
446
|
((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
|
371
447
|
|
372
448
|
/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
|
373
|
-
static const
|
449
|
+
static const yytype_uint8 yytranslate[] =
|
374
450
|
{
|
375
451
|
0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
376
452
|
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
@@ -404,7 +480,7 @@ static const unsigned char yytranslate[] =
|
|
404
480
|
#if YYDEBUG
|
405
481
|
/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
|
406
482
|
YYRHS. */
|
407
|
-
static const
|
483
|
+
static const yytype_uint8 yyprhs[] =
|
408
484
|
{
|
409
485
|
0, 0, 3, 4, 6, 8, 12, 16, 19, 22,
|
410
486
|
25, 27, 29, 33, 35, 38, 42, 44, 46, 48,
|
@@ -414,8 +490,8 @@ static const unsigned char yyprhs[] =
|
|
414
490
|
158, 162
|
415
491
|
};
|
416
492
|
|
417
|
-
/* YYRHS -- A `-1'-separated list of the rules' RHS.
|
418
|
-
static const
|
493
|
+
/* YYRHS -- A `-1'-separated list of the rules' RHS. */
|
494
|
+
static const yytype_int8 yyrhs[] =
|
419
495
|
{
|
420
496
|
27, 0, -1, -1, 28, -1, 29, -1, 28, 7,
|
421
497
|
29, -1, 28, 6, 29, -1, 28, 29, -1, 9,
|
@@ -437,7 +513,7 @@ static const yysigned_char yyrhs[] =
|
|
437
513
|
};
|
438
514
|
|
439
515
|
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
|
440
|
-
static const
|
516
|
+
static const yytype_uint8 yyrline[] =
|
441
517
|
{
|
442
518
|
0, 102, 102, 103, 105, 106, 107, 108, 110, 111,
|
443
519
|
112, 114, 115, 117, 118, 119, 120, 121, 122, 123,
|
@@ -450,7 +526,7 @@ static const unsigned char yyrline[] =
|
|
450
526
|
|
451
527
|
#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
|
452
528
|
/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
|
453
|
-
First, the terminals, then, starting at YYNTOKENS, nonterminals.
|
529
|
+
First, the terminals, then, starting at YYNTOKENS, nonterminals. */
|
454
530
|
static const char *const yytname[] =
|
455
531
|
{
|
456
532
|
"$end", "error", "$undefined", "QWRD", "WILD_STR", "LOW", "OR", "AND",
|
@@ -464,7 +540,7 @@ static const char *const yytname[] =
|
|
464
540
|
# ifdef YYPRINT
|
465
541
|
/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
|
466
542
|
token YYLEX-NUM. */
|
467
|
-
static const
|
543
|
+
static const yytype_uint16 yytoknum[] =
|
468
544
|
{
|
469
545
|
0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
|
470
546
|
58, 265, 94, 40, 41, 126, 42, 124, 34, 60,
|
@@ -473,7 +549,7 @@ static const unsigned short int yytoknum[] =
|
|
473
549
|
# endif
|
474
550
|
|
475
551
|
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
|
476
|
-
static const
|
552
|
+
static const yytype_uint8 yyr1[] =
|
477
553
|
{
|
478
554
|
0, 26, 27, 27, 28, 28, 28, 28, 29, 29,
|
479
555
|
29, 30, 30, 31, 31, 31, 31, 31, 31, 31,
|
@@ -484,7 +560,7 @@ static const unsigned char yyr1[] =
|
|
484
560
|
};
|
485
561
|
|
486
562
|
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
|
487
|
-
static const
|
563
|
+
static const yytype_uint8 yyr2[] =
|
488
564
|
{
|
489
565
|
0, 2, 0, 1, 1, 3, 3, 2, 2, 2,
|
490
566
|
1, 1, 3, 1, 2, 3, 1, 1, 1, 1,
|
@@ -497,7 +573,7 @@ static const unsigned char yyr2[] =
|
|
497
573
|
/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
|
498
574
|
STATE-NUM when YYTABLE doesn't specify something else to do. Zero
|
499
575
|
means the default is an error. */
|
500
|
-
static const
|
576
|
+
static const yytype_uint8 yydefact[] =
|
501
577
|
{
|
502
578
|
2, 20, 23, 0, 0, 0, 26, 0, 0, 0,
|
503
579
|
0, 0, 0, 3, 4, 10, 11, 13, 19, 16,
|
@@ -509,8 +585,8 @@ static const unsigned char yydefact[] =
|
|
509
585
|
39, 0, 38, 40, 41, 42, 43, 25, 28, 32
|
510
586
|
};
|
511
587
|
|
512
|
-
/* YYDEFGOTO[NTERM-NUM].
|
513
|
-
static const
|
588
|
+
/* YYDEFGOTO[NTERM-NUM]. */
|
589
|
+
static const yytype_int8 yydefgoto[] =
|
514
590
|
{
|
515
591
|
-1, 12, 13, 14, 15, 16, 17, 18, 19, 77,
|
516
592
|
28, 78, 20, 21, 32, 22
|
@@ -519,7 +595,7 @@ static const yysigned_char yydefgoto[] =
|
|
519
595
|
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
|
520
596
|
STATE-NUM. */
|
521
597
|
#define YYPACT_NINF -30
|
522
|
-
static const
|
598
|
+
static const yytype_int8 yypact[] =
|
523
599
|
{
|
524
600
|
83, -4, -30, 102, 102, 64, -30, 7, -2, -1,
|
525
601
|
6, 15, 31, 45, -30, -30, 29, -30, -30, -30,
|
@@ -532,7 +608,7 @@ static const yysigned_char yypact[] =
|
|
532
608
|
};
|
533
609
|
|
534
610
|
/* YYPGOTO[NTERM-NUM]. */
|
535
|
-
static const
|
611
|
+
static const yytype_int8 yypgoto[] =
|
536
612
|
{
|
537
613
|
-30, -30, 89, -13, 56, -29, -30, -30, -30, -30,
|
538
614
|
-30, -30, -30, -30, -30, -30
|
@@ -543,7 +619,7 @@ static const yysigned_char yypgoto[] =
|
|
543
619
|
number is the opposite. If zero, do what YYDEFACT says.
|
544
620
|
If YYTABLE_NINF, syntax error. */
|
545
621
|
#define YYTABLE_NINF -30
|
546
|
-
static const
|
622
|
+
static const yytype_int8 yytable[] =
|
547
623
|
{
|
548
624
|
42, 33, 35, 59, 61, 44, -29, 55, 56, 37,
|
549
625
|
29, 23, 45, -29, 42, 66, 73, 74, 38, 68,
|
@@ -560,7 +636,7 @@ static const yysigned_char yytable[] =
|
|
560
636
|
7, 8, 9, 10, 0, 0, 11
|
561
637
|
};
|
562
638
|
|
563
|
-
static const
|
639
|
+
static const yytype_int8 yycheck[] =
|
564
640
|
{
|
565
641
|
13, 3, 3, 3, 3, 10, 10, 22, 23, 3,
|
566
642
|
3, 15, 17, 17, 27, 44, 22, 23, 3, 48,
|
@@ -579,7 +655,7 @@ static const yysigned_char yycheck[] =
|
|
579
655
|
|
580
656
|
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
|
581
657
|
symbol of state STATE-NUM. */
|
582
|
-
static const
|
658
|
+
static const yytype_uint8 yystos[] =
|
583
659
|
{
|
584
660
|
0, 3, 4, 8, 9, 13, 16, 18, 19, 20,
|
585
661
|
21, 24, 27, 28, 29, 30, 31, 32, 33, 34,
|
@@ -616,7 +692,7 @@ do \
|
|
616
692
|
yychar = (Token); \
|
617
693
|
yylval = (Value); \
|
618
694
|
yytoken = YYTRANSLATE (yychar); \
|
619
|
-
YYPOPSTACK; \
|
695
|
+
YYPOPSTACK (1); \
|
620
696
|
goto yybackup; \
|
621
697
|
} \
|
622
698
|
else \
|
@@ -624,7 +700,7 @@ do \
|
|
624
700
|
yyerror (qp, YY_("syntax error: cannot back up")); \
|
625
701
|
YYERROR; \
|
626
702
|
} \
|
627
|
-
while (0)
|
703
|
+
while (YYID (0))
|
628
704
|
|
629
705
|
|
630
706
|
#define YYTERROR 1
|
@@ -639,7 +715,7 @@ while (0)
|
|
639
715
|
#ifndef YYLLOC_DEFAULT
|
640
716
|
# define YYLLOC_DEFAULT(Current, Rhs, N) \
|
641
717
|
do \
|
642
|
-
if (N)
|
718
|
+
if (YYID (N)) \
|
643
719
|
{ \
|
644
720
|
(Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
|
645
721
|
(Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
|
@@ -653,7 +729,7 @@ while (0)
|
|
653
729
|
(Current).first_column = (Current).last_column = \
|
654
730
|
YYRHSLOC (Rhs, 0).last_column; \
|
655
731
|
} \
|
656
|
-
while (0)
|
732
|
+
while (YYID (0))
|
657
733
|
#endif
|
658
734
|
|
659
735
|
|
@@ -665,8 +741,8 @@ while (0)
|
|
665
741
|
# if YYLTYPE_IS_TRIVIAL
|
666
742
|
# define YY_LOCATION_PRINT(File, Loc) \
|
667
743
|
fprintf (File, "%d.%d-%d.%d", \
|
668
|
-
|
669
|
-
|
744
|
+
(Loc).first_line, (Loc).first_column, \
|
745
|
+
(Loc).last_line, (Loc).last_column)
|
670
746
|
# else
|
671
747
|
# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
|
672
748
|
# endif
|
@@ -693,36 +769,99 @@ while (0)
|
|
693
769
|
do { \
|
694
770
|
if (yydebug) \
|
695
771
|
YYFPRINTF Args; \
|
696
|
-
} while (0)
|
772
|
+
} while (YYID (0))
|
697
773
|
|
698
|
-
# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
|
699
|
-
do {
|
700
|
-
if (yydebug)
|
701
|
-
{
|
702
|
-
YYFPRINTF (stderr, "%s ", Title);
|
703
|
-
|
704
|
-
|
705
|
-
YYFPRINTF (stderr, "\n");
|
706
|
-
}
|
707
|
-
} while (0)
|
774
|
+
# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
|
775
|
+
do { \
|
776
|
+
if (yydebug) \
|
777
|
+
{ \
|
778
|
+
YYFPRINTF (stderr, "%s ", Title); \
|
779
|
+
yy_symbol_print (stderr, \
|
780
|
+
Type, Value, qp); \
|
781
|
+
YYFPRINTF (stderr, "\n"); \
|
782
|
+
} \
|
783
|
+
} while (YYID (0))
|
784
|
+
|
785
|
+
|
786
|
+
/*--------------------------------.
|
787
|
+
| Print this symbol on YYOUTPUT. |
|
788
|
+
`--------------------------------*/
|
789
|
+
|
790
|
+
/*ARGSUSED*/
|
791
|
+
#if (defined __STDC__ || defined __C99__FUNC__ \
|
792
|
+
|| defined __cplusplus || defined _MSC_VER)
|
793
|
+
static void
|
794
|
+
yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, QParser *qp)
|
795
|
+
#else
|
796
|
+
static void
|
797
|
+
yy_symbol_value_print (yyoutput, yytype, yyvaluep, qp)
|
798
|
+
FILE *yyoutput;
|
799
|
+
int yytype;
|
800
|
+
YYSTYPE const * const yyvaluep;
|
801
|
+
QParser *qp;
|
802
|
+
#endif
|
803
|
+
{
|
804
|
+
if (!yyvaluep)
|
805
|
+
return;
|
806
|
+
YYUSE (qp);
|
807
|
+
# ifdef YYPRINT
|
808
|
+
if (yytype < YYNTOKENS)
|
809
|
+
YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
|
810
|
+
# else
|
811
|
+
YYUSE (yyoutput);
|
812
|
+
# endif
|
813
|
+
switch (yytype)
|
814
|
+
{
|
815
|
+
default:
|
816
|
+
break;
|
817
|
+
}
|
818
|
+
}
|
819
|
+
|
820
|
+
|
821
|
+
/*--------------------------------.
|
822
|
+
| Print this symbol on YYOUTPUT. |
|
823
|
+
`--------------------------------*/
|
824
|
+
|
825
|
+
#if (defined __STDC__ || defined __C99__FUNC__ \
|
826
|
+
|| defined __cplusplus || defined _MSC_VER)
|
827
|
+
static void
|
828
|
+
yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, QParser *qp)
|
829
|
+
#else
|
830
|
+
static void
|
831
|
+
yy_symbol_print (yyoutput, yytype, yyvaluep, qp)
|
832
|
+
FILE *yyoutput;
|
833
|
+
int yytype;
|
834
|
+
YYSTYPE const * const yyvaluep;
|
835
|
+
QParser *qp;
|
836
|
+
#endif
|
837
|
+
{
|
838
|
+
if (yytype < YYNTOKENS)
|
839
|
+
YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
|
840
|
+
else
|
841
|
+
YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
|
842
|
+
|
843
|
+
yy_symbol_value_print (yyoutput, yytype, yyvaluep, qp);
|
844
|
+
YYFPRINTF (yyoutput, ")");
|
845
|
+
}
|
708
846
|
|
709
847
|
/*------------------------------------------------------------------.
|
710
848
|
| yy_stack_print -- Print the state stack from its BOTTOM up to its |
|
711
849
|
| TOP (included). |
|
712
850
|
`------------------------------------------------------------------*/
|
713
851
|
|
714
|
-
#if defined
|
852
|
+
#if (defined __STDC__ || defined __C99__FUNC__ \
|
853
|
+
|| defined __cplusplus || defined _MSC_VER)
|
715
854
|
static void
|
716
|
-
yy_stack_print (
|
855
|
+
yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
|
717
856
|
#else
|
718
857
|
static void
|
719
858
|
yy_stack_print (bottom, top)
|
720
|
-
|
721
|
-
|
859
|
+
yytype_int16 *bottom;
|
860
|
+
yytype_int16 *top;
|
722
861
|
#endif
|
723
862
|
{
|
724
863
|
YYFPRINTF (stderr, "Stack now");
|
725
|
-
for (
|
864
|
+
for (; bottom <= top; ++bottom)
|
726
865
|
YYFPRINTF (stderr, " %d", *bottom);
|
727
866
|
YYFPRINTF (stderr, "\n");
|
728
867
|
}
|
@@ -731,37 +870,46 @@ yy_stack_print (bottom, top)
|
|
731
870
|
do { \
|
732
871
|
if (yydebug) \
|
733
872
|
yy_stack_print ((Bottom), (Top)); \
|
734
|
-
} while (0)
|
873
|
+
} while (YYID (0))
|
735
874
|
|
736
875
|
|
737
876
|
/*------------------------------------------------.
|
738
877
|
| Report that the YYRULE is going to be reduced. |
|
739
878
|
`------------------------------------------------*/
|
740
879
|
|
741
|
-
#if defined
|
880
|
+
#if (defined __STDC__ || defined __C99__FUNC__ \
|
881
|
+
|| defined __cplusplus || defined _MSC_VER)
|
742
882
|
static void
|
743
|
-
yy_reduce_print (int yyrule)
|
883
|
+
yy_reduce_print (YYSTYPE *yyvsp, int yyrule, QParser *qp)
|
744
884
|
#else
|
745
885
|
static void
|
746
|
-
yy_reduce_print (yyrule)
|
886
|
+
yy_reduce_print (yyvsp, yyrule, qp)
|
887
|
+
YYSTYPE *yyvsp;
|
747
888
|
int yyrule;
|
889
|
+
QParser *qp;
|
748
890
|
#endif
|
749
891
|
{
|
892
|
+
int yynrhs = yyr2[yyrule];
|
750
893
|
int yyi;
|
751
894
|
unsigned long int yylno = yyrline[yyrule];
|
752
|
-
YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu)
|
753
|
-
|
754
|
-
/*
|
755
|
-
for (yyi =
|
756
|
-
|
757
|
-
|
895
|
+
YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
|
896
|
+
yyrule - 1, yylno);
|
897
|
+
/* The symbols being reduced. */
|
898
|
+
for (yyi = 0; yyi < yynrhs; yyi++)
|
899
|
+
{
|
900
|
+
fprintf (stderr, " $%d = ", yyi + 1);
|
901
|
+
yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
|
902
|
+
&(yyvsp[(yyi + 1) - (yynrhs)])
|
903
|
+
, qp);
|
904
|
+
fprintf (stderr, "\n");
|
905
|
+
}
|
758
906
|
}
|
759
907
|
|
760
908
|
# define YY_REDUCE_PRINT(Rule) \
|
761
909
|
do { \
|
762
910
|
if (yydebug) \
|
763
|
-
yy_reduce_print (Rule);
|
764
|
-
} while (0)
|
911
|
+
yy_reduce_print (yyvsp, Rule, qp); \
|
912
|
+
} while (YYID (0))
|
765
913
|
|
766
914
|
/* Nonzero means print parse trace. It is left uninitialized so that
|
767
915
|
multiple parsers can coexist. */
|
@@ -795,42 +943,44 @@ int yydebug;
|
|
795
943
|
#if YYERROR_VERBOSE
|
796
944
|
|
797
945
|
# ifndef yystrlen
|
798
|
-
# if defined
|
946
|
+
# if defined __GLIBC__ && defined _STRING_H
|
799
947
|
# define yystrlen strlen
|
800
948
|
# else
|
801
949
|
/* Return the length of YYSTR. */
|
950
|
+
#if (defined __STDC__ || defined __C99__FUNC__ \
|
951
|
+
|| defined __cplusplus || defined _MSC_VER)
|
802
952
|
static YYSIZE_T
|
803
|
-
# if defined (__STDC__) || defined (__cplusplus)
|
804
953
|
yystrlen (const char *yystr)
|
805
|
-
#
|
954
|
+
#else
|
955
|
+
static YYSIZE_T
|
806
956
|
yystrlen (yystr)
|
807
|
-
|
808
|
-
#
|
957
|
+
const char *yystr;
|
958
|
+
#endif
|
809
959
|
{
|
810
|
-
|
811
|
-
|
812
|
-
while (*yys++ != '\0')
|
960
|
+
YYSIZE_T yylen;
|
961
|
+
for (yylen = 0; yystr[yylen]; yylen++)
|
813
962
|
continue;
|
814
|
-
|
815
|
-
return yys - yystr - 1;
|
963
|
+
return yylen;
|
816
964
|
}
|
817
965
|
# endif
|
818
966
|
# endif
|
819
967
|
|
820
968
|
# ifndef yystpcpy
|
821
|
-
# if defined
|
969
|
+
# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
|
822
970
|
# define yystpcpy stpcpy
|
823
971
|
# else
|
824
972
|
/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
|
825
973
|
YYDEST. */
|
974
|
+
#if (defined __STDC__ || defined __C99__FUNC__ \
|
975
|
+
|| defined __cplusplus || defined _MSC_VER)
|
826
976
|
static char *
|
827
|
-
# if defined (__STDC__) || defined (__cplusplus)
|
828
977
|
yystpcpy (char *yydest, const char *yysrc)
|
829
|
-
#
|
978
|
+
#else
|
979
|
+
static char *
|
830
980
|
yystpcpy (yydest, yysrc)
|
831
|
-
|
832
|
-
|
833
|
-
#
|
981
|
+
char *yydest;
|
982
|
+
const char *yysrc;
|
983
|
+
#endif
|
834
984
|
{
|
835
985
|
char *yyd = yydest;
|
836
986
|
const char *yys = yysrc;
|
@@ -856,7 +1006,7 @@ yytnamerr (char *yyres, const char *yystr)
|
|
856
1006
|
{
|
857
1007
|
if (*yystr == '"')
|
858
1008
|
{
|
859
|
-
|
1009
|
+
YYSIZE_T yyn = 0;
|
860
1010
|
char const *yyp = yystr;
|
861
1011
|
|
862
1012
|
for (;;)
|
@@ -891,65 +1041,136 @@ yytnamerr (char *yyres, const char *yystr)
|
|
891
1041
|
}
|
892
1042
|
# endif
|
893
1043
|
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
#if defined (__STDC__) || defined (__cplusplus)
|
904
|
-
static void
|
905
|
-
yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
|
906
|
-
#else
|
907
|
-
static void
|
908
|
-
yysymprint (yyoutput, yytype, yyvaluep)
|
909
|
-
FILE *yyoutput;
|
910
|
-
int yytype;
|
911
|
-
YYSTYPE *yyvaluep;
|
912
|
-
#endif
|
1044
|
+
/* Copy into YYRESULT an error message about the unexpected token
|
1045
|
+
YYCHAR while in state YYSTATE. Return the number of bytes copied,
|
1046
|
+
including the terminating null byte. If YYRESULT is null, do not
|
1047
|
+
copy anything; just return the number of bytes that would be
|
1048
|
+
copied. As a special case, return 0 if an ordinary "syntax error"
|
1049
|
+
message will do. Return YYSIZE_MAXIMUM if overflow occurs during
|
1050
|
+
size calculation. */
|
1051
|
+
static YYSIZE_T
|
1052
|
+
yysyntax_error (char *yyresult, int yystate, int yychar)
|
913
1053
|
{
|
914
|
-
|
915
|
-
(void) yyvaluep;
|
1054
|
+
int yyn = yypact[yystate];
|
916
1055
|
|
917
|
-
if (
|
918
|
-
|
1056
|
+
if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
|
1057
|
+
return 0;
|
919
1058
|
else
|
920
|
-
|
1059
|
+
{
|
1060
|
+
int yytype = YYTRANSLATE (yychar);
|
1061
|
+
YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
|
1062
|
+
YYSIZE_T yysize = yysize0;
|
1063
|
+
YYSIZE_T yysize1;
|
1064
|
+
int yysize_overflow = 0;
|
1065
|
+
enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
|
1066
|
+
char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
|
1067
|
+
int yyx;
|
1068
|
+
|
1069
|
+
# if 0
|
1070
|
+
/* This is so xgettext sees the translatable formats that are
|
1071
|
+
constructed on the fly. */
|
1072
|
+
YY_("syntax error, unexpected %s");
|
1073
|
+
YY_("syntax error, unexpected %s, expecting %s");
|
1074
|
+
YY_("syntax error, unexpected %s, expecting %s or %s");
|
1075
|
+
YY_("syntax error, unexpected %s, expecting %s or %s or %s");
|
1076
|
+
YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
|
1077
|
+
# endif
|
1078
|
+
char *yyfmt;
|
1079
|
+
char const *yyf;
|
1080
|
+
static char const yyunexpected[] = "syntax error, unexpected %s";
|
1081
|
+
static char const yyexpecting[] = ", expecting %s";
|
1082
|
+
static char const yyor[] = " or %s";
|
1083
|
+
char yyformat[sizeof yyunexpected
|
1084
|
+
+ sizeof yyexpecting - 1
|
1085
|
+
+ ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
|
1086
|
+
* (sizeof yyor - 1))];
|
1087
|
+
char const *yyprefix = yyexpecting;
|
1088
|
+
|
1089
|
+
/* Start YYX at -YYN if negative to avoid negative indexes in
|
1090
|
+
YYCHECK. */
|
1091
|
+
int yyxbegin = yyn < 0 ? -yyn : 0;
|
1092
|
+
|
1093
|
+
/* Stay within bounds of both yycheck and yytname. */
|
1094
|
+
int yychecklim = YYLAST - yyn + 1;
|
1095
|
+
int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
|
1096
|
+
int yycount = 1;
|
1097
|
+
|
1098
|
+
yyarg[0] = yytname[yytype];
|
1099
|
+
yyfmt = yystpcpy (yyformat, yyunexpected);
|
1100
|
+
|
1101
|
+
for (yyx = yyxbegin; yyx < yyxend; ++yyx)
|
1102
|
+
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
|
1103
|
+
{
|
1104
|
+
if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
|
1105
|
+
{
|
1106
|
+
yycount = 1;
|
1107
|
+
yysize = yysize0;
|
1108
|
+
yyformat[sizeof yyunexpected - 1] = '\0';
|
1109
|
+
break;
|
1110
|
+
}
|
1111
|
+
yyarg[yycount++] = yytname[yyx];
|
1112
|
+
yysize1 = yysize + yytnamerr (0, yytname[yyx]);
|
1113
|
+
yysize_overflow |= (yysize1 < yysize);
|
1114
|
+
yysize = yysize1;
|
1115
|
+
yyfmt = yystpcpy (yyfmt, yyprefix);
|
1116
|
+
yyprefix = yyor;
|
1117
|
+
}
|
921
1118
|
|
1119
|
+
yyf = YY_(yyformat);
|
1120
|
+
yysize1 = yysize + yystrlen (yyf);
|
1121
|
+
yysize_overflow |= (yysize1 < yysize);
|
1122
|
+
yysize = yysize1;
|
922
1123
|
|
923
|
-
|
924
|
-
|
925
|
-
|
926
|
-
|
927
|
-
|
928
|
-
|
929
|
-
|
930
|
-
|
1124
|
+
if (yysize_overflow)
|
1125
|
+
return YYSIZE_MAXIMUM;
|
1126
|
+
|
1127
|
+
if (yyresult)
|
1128
|
+
{
|
1129
|
+
/* Avoid sprintf, as that infringes on the user's name space.
|
1130
|
+
Don't have undefined behavior even if the translation
|
1131
|
+
produced a string with the wrong number of "%s"s. */
|
1132
|
+
char *yyp = yyresult;
|
1133
|
+
int yyi = 0;
|
1134
|
+
while ((*yyp = *yyf) != '\0')
|
1135
|
+
{
|
1136
|
+
if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
|
1137
|
+
{
|
1138
|
+
yyp += yytnamerr (yyp, yyarg[yyi++]);
|
1139
|
+
yyf += 2;
|
1140
|
+
}
|
1141
|
+
else
|
1142
|
+
{
|
1143
|
+
yyp++;
|
1144
|
+
yyf++;
|
1145
|
+
}
|
1146
|
+
}
|
1147
|
+
}
|
1148
|
+
return yysize;
|
931
1149
|
}
|
932
|
-
YYFPRINTF (yyoutput, ")");
|
933
1150
|
}
|
1151
|
+
#endif /* YYERROR_VERBOSE */
|
1152
|
+
|
934
1153
|
|
935
|
-
#endif /* ! YYDEBUG */
|
936
1154
|
/*-----------------------------------------------.
|
937
1155
|
| Release the memory associated to this symbol. |
|
938
1156
|
`-----------------------------------------------*/
|
939
1157
|
|
940
|
-
|
1158
|
+
/*ARGSUSED*/
|
1159
|
+
#if (defined __STDC__ || defined __C99__FUNC__ \
|
1160
|
+
|| defined __cplusplus || defined _MSC_VER)
|
941
1161
|
static void
|
942
|
-
yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
|
1162
|
+
yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, QParser *qp)
|
943
1163
|
#else
|
944
1164
|
static void
|
945
|
-
yydestruct (yymsg, yytype, yyvaluep)
|
1165
|
+
yydestruct (yymsg, yytype, yyvaluep, qp)
|
946
1166
|
const char *yymsg;
|
947
1167
|
int yytype;
|
948
1168
|
YYSTYPE *yyvaluep;
|
1169
|
+
QParser *qp;
|
949
1170
|
#endif
|
950
1171
|
{
|
951
|
-
|
952
|
-
(
|
1172
|
+
YYUSE (yyvaluep);
|
1173
|
+
YYUSE (qp);
|
953
1174
|
|
954
1175
|
if (!yymsg)
|
955
1176
|
yymsg = "Deleting";
|
@@ -959,7 +1180,7 @@ yydestruct (yymsg, yytype, yyvaluep)
|
|
959
1180
|
{
|
960
1181
|
|
961
1182
|
default:
|
962
|
-
|
1183
|
+
break;
|
963
1184
|
}
|
964
1185
|
}
|
965
1186
|
|
@@ -967,13 +1188,13 @@ yydestruct (yymsg, yytype, yyvaluep)
|
|
967
1188
|
/* Prevent warnings from -Wmissing-prototypes. */
|
968
1189
|
|
969
1190
|
#ifdef YYPARSE_PARAM
|
970
|
-
#
|
1191
|
+
#if defined __STDC__ || defined __cplusplus
|
971
1192
|
int yyparse (void *YYPARSE_PARAM);
|
972
|
-
#
|
1193
|
+
#else
|
973
1194
|
int yyparse ();
|
974
|
-
#
|
1195
|
+
#endif
|
975
1196
|
#else /* ! YYPARSE_PARAM */
|
976
|
-
#if defined
|
1197
|
+
#if defined __STDC__ || defined __cplusplus
|
977
1198
|
int yyparse (QParser *qp);
|
978
1199
|
#else
|
979
1200
|
int yyparse ();
|
@@ -990,14 +1211,18 @@ int yyparse ();
|
|
990
1211
|
`----------*/
|
991
1212
|
|
992
1213
|
#ifdef YYPARSE_PARAM
|
993
|
-
#
|
994
|
-
|
995
|
-
|
996
|
-
|
997
|
-
|
998
|
-
|
1214
|
+
#if (defined __STDC__ || defined __C99__FUNC__ \
|
1215
|
+
|| defined __cplusplus || defined _MSC_VER)
|
1216
|
+
int
|
1217
|
+
yyparse (void *YYPARSE_PARAM)
|
1218
|
+
#else
|
1219
|
+
int
|
1220
|
+
yyparse (YYPARSE_PARAM)
|
1221
|
+
void *YYPARSE_PARAM;
|
1222
|
+
#endif
|
999
1223
|
#else /* ! YYPARSE_PARAM */
|
1000
|
-
#if defined
|
1224
|
+
#if (defined __STDC__ || defined __C99__FUNC__ \
|
1225
|
+
|| defined __cplusplus || defined _MSC_VER)
|
1001
1226
|
int
|
1002
1227
|
yyparse (QParser *qp)
|
1003
1228
|
#else
|
@@ -1023,6 +1248,12 @@ int yynerrs;
|
|
1023
1248
|
int yyerrstatus;
|
1024
1249
|
/* Look-ahead token as an internal (translated) token number. */
|
1025
1250
|
int yytoken = 0;
|
1251
|
+
#if YYERROR_VERBOSE
|
1252
|
+
/* Buffer for error messages, and its allocated size. */
|
1253
|
+
char yymsgbuf[128];
|
1254
|
+
char *yymsg = yymsgbuf;
|
1255
|
+
YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
|
1256
|
+
#endif
|
1026
1257
|
|
1027
1258
|
/* Three stacks and their tools:
|
1028
1259
|
`yyss': related to states,
|
@@ -1033,9 +1264,9 @@ int yynerrs;
|
|
1033
1264
|
to reallocate them elsewhere. */
|
1034
1265
|
|
1035
1266
|
/* The state stack. */
|
1036
|
-
|
1037
|
-
|
1038
|
-
|
1267
|
+
yytype_int16 yyssa[YYINITDEPTH];
|
1268
|
+
yytype_int16 *yyss = yyssa;
|
1269
|
+
yytype_int16 *yyssp;
|
1039
1270
|
|
1040
1271
|
/* The semantic value stack. */
|
1041
1272
|
YYSTYPE yyvsa[YYINITDEPTH];
|
@@ -1044,7 +1275,7 @@ int yynerrs;
|
|
1044
1275
|
|
1045
1276
|
|
1046
1277
|
|
1047
|
-
#define YYPOPSTACK (yyvsp
|
1278
|
+
#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
|
1048
1279
|
|
1049
1280
|
YYSIZE_T yystacksize = YYINITDEPTH;
|
1050
1281
|
|
@@ -1053,9 +1284,9 @@ int yynerrs;
|
|
1053
1284
|
YYSTYPE yyval;
|
1054
1285
|
|
1055
1286
|
|
1056
|
-
/*
|
1057
|
-
|
1058
|
-
int yylen;
|
1287
|
+
/* The number of symbols on the RHS of the reduced rule.
|
1288
|
+
Keep to zero when no symbol should be popped. */
|
1289
|
+
int yylen = 0;
|
1059
1290
|
|
1060
1291
|
YYDPRINTF ((stderr, "Starting parse\n"));
|
1061
1292
|
|
@@ -1079,8 +1310,7 @@ int yynerrs;
|
|
1079
1310
|
`------------------------------------------------------------*/
|
1080
1311
|
yynewstate:
|
1081
1312
|
/* In all cases, when you get here, the value and location stacks
|
1082
|
-
have just been pushed.
|
1083
|
-
*/
|
1313
|
+
have just been pushed. So pushing a state here evens the stacks. */
|
1084
1314
|
yyssp++;
|
1085
1315
|
|
1086
1316
|
yysetstate:
|
@@ -1093,11 +1323,11 @@ int yynerrs;
|
|
1093
1323
|
|
1094
1324
|
#ifdef yyoverflow
|
1095
1325
|
{
|
1096
|
-
/* Give user a chance to reallocate the stack.
|
1326
|
+
/* Give user a chance to reallocate the stack. Use copies of
|
1097
1327
|
these so that the &'s don't force the real ones into
|
1098
1328
|
memory. */
|
1099
1329
|
YYSTYPE *yyvs1 = yyvs;
|
1100
|
-
|
1330
|
+
yytype_int16 *yyss1 = yyss;
|
1101
1331
|
|
1102
1332
|
|
1103
1333
|
/* Each stack pointer address is followed by the size of the
|
@@ -1125,7 +1355,7 @@ int yynerrs;
|
|
1125
1355
|
yystacksize = YYMAXDEPTH;
|
1126
1356
|
|
1127
1357
|
{
|
1128
|
-
|
1358
|
+
yytype_int16 *yyss1 = yyss;
|
1129
1359
|
union yyalloc *yyptr =
|
1130
1360
|
(union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
|
1131
1361
|
if (! yyptr)
|
@@ -1160,12 +1390,10 @@ int yynerrs;
|
|
1160
1390
|
`-----------*/
|
1161
1391
|
yybackup:
|
1162
1392
|
|
1163
|
-
/* Do appropriate processing given the current state.
|
1164
|
-
|
1165
|
-
/* yyresume: */
|
1393
|
+
/* Do appropriate processing given the current state. Read a
|
1394
|
+
look-ahead token if we need one and don't already have one. */
|
1166
1395
|
|
1167
1396
|
/* First try to decide what to do without reference to look-ahead token. */
|
1168
|
-
|
1169
1397
|
yyn = yypact[yystate];
|
1170
1398
|
if (yyn == YYPACT_NINF)
|
1171
1399
|
goto yydefault;
|
@@ -1207,22 +1435,21 @@ yybackup:
|
|
1207
1435
|
if (yyn == YYFINAL)
|
1208
1436
|
YYACCEPT;
|
1209
1437
|
|
1438
|
+
/* Count tokens shifted since error; after three, turn off error
|
1439
|
+
status. */
|
1440
|
+
if (yyerrstatus)
|
1441
|
+
yyerrstatus--;
|
1442
|
+
|
1210
1443
|
/* Shift the look-ahead token. */
|
1211
1444
|
YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
|
1212
1445
|
|
1213
|
-
/* Discard the token
|
1446
|
+
/* Discard the shifted token unless it is eof. */
|
1214
1447
|
if (yychar != YYEOF)
|
1215
1448
|
yychar = YYEMPTY;
|
1216
1449
|
|
1450
|
+
yystate = yyn;
|
1217
1451
|
*++yyvsp = yylval;
|
1218
1452
|
|
1219
|
-
|
1220
|
-
/* Count tokens shifted since error; after three, turn off error
|
1221
|
-
status. */
|
1222
|
-
if (yyerrstatus)
|
1223
|
-
yyerrstatus--;
|
1224
|
-
|
1225
|
-
yystate = yyn;
|
1226
1453
|
goto yynewstate;
|
1227
1454
|
|
1228
1455
|
|
@@ -1264,47 +1491,47 @@ yyreduce:
|
|
1264
1491
|
|
1265
1492
|
case 3:
|
1266
1493
|
#line 103 "src/q_parser.y"
|
1267
|
-
{ qp->result = (yyval.query) = get_bool_q((yyvsp[
|
1494
|
+
{ qp->result = (yyval.query) = get_bool_q((yyvsp[(1) - (1)].bclss)); }
|
1268
1495
|
break;
|
1269
1496
|
|
1270
1497
|
case 4:
|
1271
1498
|
#line 105 "src/q_parser.y"
|
1272
|
-
{ (yyval.bclss) = first_cls((yyvsp[
|
1499
|
+
{ (yyval.bclss) = first_cls((yyvsp[(1) - (1)].bcls)); }
|
1273
1500
|
break;
|
1274
1501
|
|
1275
1502
|
case 5:
|
1276
1503
|
#line 106 "src/q_parser.y"
|
1277
|
-
{ (yyval.bclss) = add_and_cls((yyvsp[-
|
1504
|
+
{ (yyval.bclss) = add_and_cls((yyvsp[(1) - (3)].bclss), (yyvsp[(3) - (3)].bcls)); }
|
1278
1505
|
break;
|
1279
1506
|
|
1280
1507
|
case 6:
|
1281
1508
|
#line 107 "src/q_parser.y"
|
1282
|
-
{ (yyval.bclss) = add_or_cls((yyvsp[-
|
1509
|
+
{ (yyval.bclss) = add_or_cls((yyvsp[(1) - (3)].bclss), (yyvsp[(3) - (3)].bcls)); }
|
1283
1510
|
break;
|
1284
1511
|
|
1285
1512
|
case 7:
|
1286
1513
|
#line 108 "src/q_parser.y"
|
1287
|
-
{ (yyval.bclss) = add_default_cls(qp, (yyvsp[-
|
1514
|
+
{ (yyval.bclss) = add_default_cls(qp, (yyvsp[(1) - (2)].bclss), (yyvsp[(2) - (2)].bcls)); }
|
1288
1515
|
break;
|
1289
1516
|
|
1290
1517
|
case 8:
|
1291
1518
|
#line 110 "src/q_parser.y"
|
1292
|
-
{ (yyval.bcls) = get_bool_cls((yyvsp[
|
1519
|
+
{ (yyval.bcls) = get_bool_cls((yyvsp[(2) - (2)].query), BC_MUST); }
|
1293
1520
|
break;
|
1294
1521
|
|
1295
1522
|
case 9:
|
1296
1523
|
#line 111 "src/q_parser.y"
|
1297
|
-
{ (yyval.bcls) = get_bool_cls((yyvsp[
|
1524
|
+
{ (yyval.bcls) = get_bool_cls((yyvsp[(2) - (2)].query), BC_MUST_NOT); }
|
1298
1525
|
break;
|
1299
1526
|
|
1300
1527
|
case 10:
|
1301
1528
|
#line 112 "src/q_parser.y"
|
1302
|
-
{ (yyval.bcls) = get_bool_cls((yyvsp[
|
1529
|
+
{ (yyval.bcls) = get_bool_cls((yyvsp[(1) - (1)].query), BC_SHOULD); }
|
1303
1530
|
break;
|
1304
1531
|
|
1305
1532
|
case 12:
|
1306
1533
|
#line 115 "src/q_parser.y"
|
1307
|
-
{ if ((yyvsp[-
|
1534
|
+
{ if ((yyvsp[(1) - (3)].query)) sscanf((yyvsp[(3) - (3)].str),"%f",&((yyvsp[(1) - (3)].query)->boost)); (yyval.query)=(yyvsp[(1) - (3)].query); }
|
1308
1535
|
break;
|
1309
1536
|
|
1310
1537
|
case 14:
|
@@ -1314,27 +1541,27 @@ yyreduce:
|
|
1314
1541
|
|
1315
1542
|
case 15:
|
1316
1543
|
#line 119 "src/q_parser.y"
|
1317
|
-
{ (yyval.query) = get_bool_q((yyvsp[-
|
1544
|
+
{ (yyval.query) = get_bool_q((yyvsp[(2) - (3)].bclss)); }
|
1318
1545
|
break;
|
1319
1546
|
|
1320
1547
|
case 20:
|
1321
1548
|
#line 125 "src/q_parser.y"
|
1322
|
-
{ FLDS((yyval.query), get_term_q(qp, field, (yyvsp[
|
1549
|
+
{ FLDS((yyval.query), get_term_q(qp, field, (yyvsp[(1) - (1)].str))); }
|
1323
1550
|
break;
|
1324
1551
|
|
1325
1552
|
case 21:
|
1326
1553
|
#line 126 "src/q_parser.y"
|
1327
|
-
{ FLDS((yyval.query), get_fuzzy_q(qp, field, (yyvsp[-
|
1554
|
+
{ FLDS((yyval.query), get_fuzzy_q(qp, field, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str))); }
|
1328
1555
|
break;
|
1329
1556
|
|
1330
1557
|
case 22:
|
1331
1558
|
#line 127 "src/q_parser.y"
|
1332
|
-
{ FLDS((yyval.query), get_fuzzy_q(qp, field, (yyvsp[-
|
1559
|
+
{ FLDS((yyval.query), get_fuzzy_q(qp, field, (yyvsp[(1) - (2)].str), NULL)); }
|
1333
1560
|
break;
|
1334
1561
|
|
1335
1562
|
case 23:
|
1336
1563
|
#line 129 "src/q_parser.y"
|
1337
|
-
{ FLDS((yyval.query), get_wild_q(qp, field, (yyvsp[
|
1564
|
+
{ FLDS((yyval.query), get_wild_q(qp, field, (yyvsp[(1) - (1)].str))); }
|
1338
1565
|
break;
|
1339
1566
|
|
1340
1567
|
case 24:
|
@@ -1344,7 +1571,7 @@ yyreduce:
|
|
1344
1571
|
|
1345
1572
|
case 25:
|
1346
1573
|
#line 132 "src/q_parser.y"
|
1347
|
-
{ (yyval.query) = (yyvsp[-
|
1574
|
+
{ (yyval.query) = (yyvsp[(3) - (4)].query); }
|
1348
1575
|
break;
|
1349
1576
|
|
1350
1577
|
case 26:
|
@@ -1359,27 +1586,27 @@ yyreduce:
|
|
1359
1586
|
|
1360
1587
|
case 28:
|
1361
1588
|
#line 134 "src/q_parser.y"
|
1362
|
-
{ (yyval.query) = (yyvsp[-
|
1589
|
+
{ (yyval.query) = (yyvsp[(4) - (5)].query); }
|
1363
1590
|
break;
|
1364
1591
|
|
1365
1592
|
case 29:
|
1366
1593
|
#line 136 "src/q_parser.y"
|
1367
|
-
{ (yyval.hashset) = first_field(qp, (yyvsp[
|
1594
|
+
{ (yyval.hashset) = first_field(qp, (yyvsp[(1) - (1)].str)); }
|
1368
1595
|
break;
|
1369
1596
|
|
1370
1597
|
case 30:
|
1371
1598
|
#line 137 "src/q_parser.y"
|
1372
|
-
{ (yyval.hashset) = add_field(qp, (yyvsp[
|
1599
|
+
{ (yyval.hashset) = add_field(qp, (yyvsp[(3) - (3)].str));}
|
1373
1600
|
break;
|
1374
1601
|
|
1375
1602
|
case 31:
|
1376
1603
|
#line 139 "src/q_parser.y"
|
1377
|
-
{ (yyval.query) = get_phrase_q(qp, (yyvsp[-
|
1604
|
+
{ (yyval.query) = get_phrase_q(qp, (yyvsp[(2) - (3)].phrase), NULL); }
|
1378
1605
|
break;
|
1379
1606
|
|
1380
1607
|
case 32:
|
1381
1608
|
#line 140 "src/q_parser.y"
|
1382
|
-
{ (yyval.query) = get_phrase_q(qp, (yyvsp[-
|
1609
|
+
{ (yyval.query) = get_phrase_q(qp, (yyvsp[(2) - (5)].phrase), (yyvsp[(5) - (5)].str)); }
|
1383
1610
|
break;
|
1384
1611
|
|
1385
1612
|
case 33:
|
@@ -1394,7 +1621,7 @@ yyreduce:
|
|
1394
1621
|
|
1395
1622
|
case 35:
|
1396
1623
|
#line 144 "src/q_parser.y"
|
1397
|
-
{ (yyval.phrase) = ph_first_word((yyvsp[
|
1624
|
+
{ (yyval.phrase) = ph_first_word((yyvsp[(1) - (1)].str)); }
|
1398
1625
|
break;
|
1399
1626
|
|
1400
1627
|
case 36:
|
@@ -1404,90 +1631,88 @@ yyreduce:
|
|
1404
1631
|
|
1405
1632
|
case 37:
|
1406
1633
|
#line 146 "src/q_parser.y"
|
1407
|
-
{ (yyval.phrase) = ph_add_word((yyvsp[-
|
1634
|
+
{ (yyval.phrase) = ph_add_word((yyvsp[(1) - (2)].phrase), (yyvsp[(2) - (2)].str)); }
|
1408
1635
|
break;
|
1409
1636
|
|
1410
1637
|
case 38:
|
1411
1638
|
#line 147 "src/q_parser.y"
|
1412
|
-
{ (yyval.phrase) = ph_add_word((yyvsp[-
|
1639
|
+
{ (yyval.phrase) = ph_add_word((yyvsp[(1) - (3)].phrase), NULL); }
|
1413
1640
|
break;
|
1414
1641
|
|
1415
1642
|
case 39:
|
1416
1643
|
#line 148 "src/q_parser.y"
|
1417
|
-
{ (yyval.phrase) = ph_add_multi_word((yyvsp[-
|
1644
|
+
{ (yyval.phrase) = ph_add_multi_word((yyvsp[(1) - (3)].phrase), (yyvsp[(3) - (3)].str)); }
|
1418
1645
|
break;
|
1419
1646
|
|
1420
1647
|
case 40:
|
1421
1648
|
#line 150 "src/q_parser.y"
|
1422
|
-
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[-
|
1649
|
+
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), true, true)); }
|
1423
1650
|
break;
|
1424
1651
|
|
1425
1652
|
case 41:
|
1426
1653
|
#line 151 "src/q_parser.y"
|
1427
|
-
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[-
|
1654
|
+
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), true, false)); }
|
1428
1655
|
break;
|
1429
1656
|
|
1430
1657
|
case 42:
|
1431
1658
|
#line 152 "src/q_parser.y"
|
1432
|
-
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[-
|
1659
|
+
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), false, true)); }
|
1433
1660
|
break;
|
1434
1661
|
|
1435
1662
|
case 43:
|
1436
1663
|
#line 153 "src/q_parser.y"
|
1437
|
-
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[-
|
1664
|
+
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), false, false)); }
|
1438
1665
|
break;
|
1439
1666
|
|
1440
1667
|
case 44:
|
1441
1668
|
#line 154 "src/q_parser.y"
|
1442
|
-
{ FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[-
|
1669
|
+
{ FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (3)].str), false, false)); }
|
1443
1670
|
break;
|
1444
1671
|
|
1445
1672
|
case 45:
|
1446
1673
|
#line 155 "src/q_parser.y"
|
1447
|
-
{ FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[-
|
1674
|
+
{ FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (3)].str), false, true)); }
|
1448
1675
|
break;
|
1449
1676
|
|
1450
1677
|
case 46:
|
1451
1678
|
#line 156 "src/q_parser.y"
|
1452
|
-
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[-
|
1679
|
+
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (3)].str), NULL,true, false)); }
|
1453
1680
|
break;
|
1454
1681
|
|
1455
1682
|
case 47:
|
1456
1683
|
#line 157 "src/q_parser.y"
|
1457
|
-
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[-
|
1684
|
+
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (3)].str), NULL,false, false)); }
|
1458
1685
|
break;
|
1459
1686
|
|
1460
1687
|
case 48:
|
1461
1688
|
#line 158 "src/q_parser.y"
|
1462
|
-
{ FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[
|
1689
|
+
{ FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (2)].str), false, false)); }
|
1463
1690
|
break;
|
1464
1691
|
|
1465
1692
|
case 49:
|
1466
1693
|
#line 159 "src/q_parser.y"
|
1467
|
-
{ FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[
|
1694
|
+
{ FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(3) - (3)].str), false, true)); }
|
1468
1695
|
break;
|
1469
1696
|
|
1470
1697
|
case 50:
|
1471
1698
|
#line 160 "src/q_parser.y"
|
1472
|
-
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[
|
1699
|
+
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(3) - (3)].str), NULL,true, false)); }
|
1473
1700
|
break;
|
1474
1701
|
|
1475
1702
|
case 51:
|
1476
1703
|
#line 161 "src/q_parser.y"
|
1477
|
-
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[
|
1704
|
+
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (2)].str), NULL,false, false)); }
|
1478
1705
|
break;
|
1479
1706
|
|
1480
1707
|
|
1708
|
+
/* Line 1267 of yacc.c. */
|
1709
|
+
#line 1710 "y.tab.c"
|
1481
1710
|
default: break;
|
1482
1711
|
}
|
1712
|
+
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
|
1483
1713
|
|
1484
|
-
|
1485
|
-
|
1486
|
-
|
1487
|
-
yyvsp -= yylen;
|
1488
|
-
yyssp -= yylen;
|
1489
|
-
|
1490
|
-
|
1714
|
+
YYPOPSTACK (yylen);
|
1715
|
+
yylen = 0;
|
1491
1716
|
YY_STACK_PRINT (yyss, yyssp);
|
1492
1717
|
|
1493
1718
|
*++yyvsp = yyval;
|
@@ -1516,110 +1741,41 @@ yyerrlab:
|
|
1516
1741
|
if (!yyerrstatus)
|
1517
1742
|
{
|
1518
1743
|
++yynerrs;
|
1519
|
-
#if YYERROR_VERBOSE
|
1520
|
-
|
1521
|
-
|
1522
|
-
|
1523
|
-
|
1524
|
-
|
1525
|
-
|
1526
|
-
|
1527
|
-
|
1528
|
-
|
1529
|
-
|
1530
|
-
|
1531
|
-
|
1532
|
-
|
1533
|
-
|
1534
|
-
|
1535
|
-
/* This is so xgettext sees the translatable formats that are
|
1536
|
-
constructed on the fly. */
|
1537
|
-
YY_("syntax error, unexpected %s");
|
1538
|
-
YY_("syntax error, unexpected %s, expecting %s");
|
1539
|
-
YY_("syntax error, unexpected %s, expecting %s or %s");
|
1540
|
-
YY_("syntax error, unexpected %s, expecting %s or %s or %s");
|
1541
|
-
YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
|
1542
|
-
#endif
|
1543
|
-
char *yyfmt;
|
1544
|
-
char const *yyf;
|
1545
|
-
static char const yyunexpected[] = "syntax error, unexpected %s";
|
1546
|
-
static char const yyexpecting[] = ", expecting %s";
|
1547
|
-
static char const yyor[] = " or %s";
|
1548
|
-
char yyformat[sizeof yyunexpected
|
1549
|
-
+ sizeof yyexpecting - 1
|
1550
|
-
+ ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
|
1551
|
-
* (sizeof yyor - 1))];
|
1552
|
-
char const *yyprefix = yyexpecting;
|
1553
|
-
|
1554
|
-
/* Start YYX at -YYN if negative to avoid negative indexes in
|
1555
|
-
YYCHECK. */
|
1556
|
-
int yyxbegin = yyn < 0 ? -yyn : 0;
|
1557
|
-
|
1558
|
-
/* Stay within bounds of both yycheck and yytname. */
|
1559
|
-
int yychecklim = YYLAST - yyn;
|
1560
|
-
int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
|
1561
|
-
int yycount = 1;
|
1562
|
-
|
1563
|
-
yyarg[0] = yytname[yytype];
|
1564
|
-
yyfmt = yystpcpy (yyformat, yyunexpected);
|
1565
|
-
|
1566
|
-
for (yyx = yyxbegin; yyx < yyxend; ++yyx)
|
1567
|
-
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
|
1744
|
+
#if ! YYERROR_VERBOSE
|
1745
|
+
yyerror (qp, YY_("syntax error"));
|
1746
|
+
#else
|
1747
|
+
{
|
1748
|
+
YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
|
1749
|
+
if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
|
1750
|
+
{
|
1751
|
+
YYSIZE_T yyalloc = 2 * yysize;
|
1752
|
+
if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
|
1753
|
+
yyalloc = YYSTACK_ALLOC_MAXIMUM;
|
1754
|
+
if (yymsg != yymsgbuf)
|
1755
|
+
YYSTACK_FREE (yymsg);
|
1756
|
+
yymsg = (char *) YYSTACK_ALLOC (yyalloc);
|
1757
|
+
if (yymsg)
|
1758
|
+
yymsg_alloc = yyalloc;
|
1759
|
+
else
|
1568
1760
|
{
|
1569
|
-
|
1570
|
-
|
1571
|
-
yycount = 1;
|
1572
|
-
yysize = yysize0;
|
1573
|
-
yyformat[sizeof yyunexpected - 1] = '\0';
|
1574
|
-
break;
|
1575
|
-
}
|
1576
|
-
yyarg[yycount++] = yytname[yyx];
|
1577
|
-
yysize1 = yysize + yytnamerr (0, yytname[yyx]);
|
1578
|
-
yysize_overflow |= yysize1 < yysize;
|
1579
|
-
yysize = yysize1;
|
1580
|
-
yyfmt = yystpcpy (yyfmt, yyprefix);
|
1581
|
-
yyprefix = yyor;
|
1761
|
+
yymsg = yymsgbuf;
|
1762
|
+
yymsg_alloc = sizeof yymsgbuf;
|
1582
1763
|
}
|
1764
|
+
}
|
1583
1765
|
|
1584
|
-
|
1585
|
-
|
1586
|
-
|
1587
|
-
|
1588
|
-
|
1589
|
-
|
1590
|
-
|
1591
|
-
|
1592
|
-
|
1593
|
-
/* Avoid sprintf, as that infringes on the user's name space.
|
1594
|
-
Don't have undefined behavior even if the translation
|
1595
|
-
produced a string with the wrong number of "%s"s. */
|
1596
|
-
char *yyp = yymsg;
|
1597
|
-
int yyi = 0;
|
1598
|
-
while ((*yyp = *yyf))
|
1599
|
-
{
|
1600
|
-
if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
|
1601
|
-
{
|
1602
|
-
yyp += yytnamerr (yyp, yyarg[yyi++]);
|
1603
|
-
yyf += 2;
|
1604
|
-
}
|
1605
|
-
else
|
1606
|
-
{
|
1607
|
-
yyp++;
|
1608
|
-
yyf++;
|
1609
|
-
}
|
1610
|
-
}
|
1611
|
-
yyerror (qp, yymsg);
|
1612
|
-
YYSTACK_FREE (yymsg);
|
1613
|
-
}
|
1614
|
-
else
|
1615
|
-
{
|
1616
|
-
yyerror (qp, YY_("syntax error"));
|
1766
|
+
if (0 < yysize && yysize <= yymsg_alloc)
|
1767
|
+
{
|
1768
|
+
(void) yysyntax_error (yymsg, yystate, yychar);
|
1769
|
+
yyerror (qp, yymsg);
|
1770
|
+
}
|
1771
|
+
else
|
1772
|
+
{
|
1773
|
+
yyerror (qp, YY_("syntax error"));
|
1774
|
+
if (yysize != 0)
|
1617
1775
|
goto yyexhaustedlab;
|
1618
|
-
|
1619
|
-
|
1620
|
-
|
1621
|
-
#endif /* YYERROR_VERBOSE */
|
1622
|
-
yyerror (qp, YY_("syntax error"));
|
1776
|
+
}
|
1777
|
+
}
|
1778
|
+
#endif
|
1623
1779
|
}
|
1624
1780
|
|
1625
1781
|
|
@@ -1630,14 +1786,15 @@ yyerrlab:
|
|
1630
1786
|
error, discard it. */
|
1631
1787
|
|
1632
1788
|
if (yychar <= YYEOF)
|
1633
|
-
|
1789
|
+
{
|
1634
1790
|
/* Return failure if at end of input. */
|
1635
1791
|
if (yychar == YYEOF)
|
1636
1792
|
YYABORT;
|
1637
|
-
|
1793
|
+
}
|
1638
1794
|
else
|
1639
1795
|
{
|
1640
|
-
yydestruct ("Error: discarding",
|
1796
|
+
yydestruct ("Error: discarding",
|
1797
|
+
yytoken, &yylval, qp);
|
1641
1798
|
yychar = YYEMPTY;
|
1642
1799
|
}
|
1643
1800
|
}
|
@@ -1655,11 +1812,14 @@ yyerrorlab:
|
|
1655
1812
|
/* Pacify compilers like GCC when the user code never invokes
|
1656
1813
|
YYERROR and the label yyerrorlab therefore never appears in user
|
1657
1814
|
code. */
|
1658
|
-
if (0)
|
1815
|
+
if (/*CONSTCOND*/ 0)
|
1659
1816
|
goto yyerrorlab;
|
1660
1817
|
|
1661
|
-
|
1662
|
-
|
1818
|
+
/* Do not reclaim the symbols of the rule which action triggered
|
1819
|
+
this YYERROR. */
|
1820
|
+
YYPOPSTACK (yylen);
|
1821
|
+
yylen = 0;
|
1822
|
+
YY_STACK_PRINT (yyss, yyssp);
|
1663
1823
|
yystate = *yyssp;
|
1664
1824
|
goto yyerrlab1;
|
1665
1825
|
|
@@ -1689,8 +1849,9 @@ yyerrlab1:
|
|
1689
1849
|
YYABORT;
|
1690
1850
|
|
1691
1851
|
|
1692
|
-
yydestruct ("Error: popping",
|
1693
|
-
|
1852
|
+
yydestruct ("Error: popping",
|
1853
|
+
yystos[yystate], yyvsp, qp);
|
1854
|
+
YYPOPSTACK (1);
|
1694
1855
|
yystate = *yyssp;
|
1695
1856
|
YY_STACK_PRINT (yyss, yyssp);
|
1696
1857
|
}
|
@@ -1701,7 +1862,7 @@ yyerrlab1:
|
|
1701
1862
|
*++yyvsp = yylval;
|
1702
1863
|
|
1703
1864
|
|
1704
|
-
/* Shift the error token.
|
1865
|
+
/* Shift the error token. */
|
1705
1866
|
YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
|
1706
1867
|
|
1707
1868
|
yystate = yyn;
|
@@ -1735,18 +1896,27 @@ yyexhaustedlab:
|
|
1735
1896
|
yyreturn:
|
1736
1897
|
if (yychar != YYEOF && yychar != YYEMPTY)
|
1737
1898
|
yydestruct ("Cleanup: discarding lookahead",
|
1738
|
-
yytoken, &yylval);
|
1899
|
+
yytoken, &yylval, qp);
|
1900
|
+
/* Do not reclaim the symbols of the rule which action triggered
|
1901
|
+
this YYABORT or YYACCEPT. */
|
1902
|
+
YYPOPSTACK (yylen);
|
1903
|
+
YY_STACK_PRINT (yyss, yyssp);
|
1739
1904
|
while (yyssp != yyss)
|
1740
1905
|
{
|
1741
1906
|
yydestruct ("Cleanup: popping",
|
1742
|
-
yystos[*yyssp], yyvsp);
|
1743
|
-
YYPOPSTACK;
|
1907
|
+
yystos[*yyssp], yyvsp, qp);
|
1908
|
+
YYPOPSTACK (1);
|
1744
1909
|
}
|
1745
1910
|
#ifndef yyoverflow
|
1746
1911
|
if (yyss != yyssa)
|
1747
1912
|
YYSTACK_FREE (yyss);
|
1748
1913
|
#endif
|
1749
|
-
|
1914
|
+
#if YYERROR_VERBOSE
|
1915
|
+
if (yymsg != yymsgbuf)
|
1916
|
+
YYSTACK_FREE (yymsg);
|
1917
|
+
#endif
|
1918
|
+
/* Make sure YYID is used. */
|
1919
|
+
return YYID (yyresult);
|
1750
1920
|
}
|
1751
1921
|
|
1752
1922
|
|
@@ -1754,7 +1924,7 @@ yyreturn:
|
|
1754
1924
|
|
1755
1925
|
|
1756
1926
|
const char *special_char = "&:()[]{}!\"~^|<>=*?+-";
|
1757
|
-
const char *not_word = " \t
|
1927
|
+
const char *not_word = " \t()[]{}!\"~^|<>=";
|
1758
1928
|
|
1759
1929
|
static int get_word(YYSTYPE *lvalp, QParser *qp)
|
1760
1930
|
{
|
@@ -1772,10 +1942,10 @@ static int get_word(YYSTYPE *lvalp, QParser *qp)
|
|
1772
1942
|
|
1773
1943
|
qp->qstrp--; /* need to back up one character */
|
1774
1944
|
|
1775
|
-
while (!strchr(not_word, (c
|
1945
|
+
while (!strchr(not_word, (c = *qp->qstrp++))) {
|
1776
1946
|
switch (c) {
|
1777
1947
|
case '\\':
|
1778
|
-
if ((c
|
1948
|
+
if ((c = *qp->qstrp) == '\0') {
|
1779
1949
|
*bufp++ = '\\';
|
1780
1950
|
}
|
1781
1951
|
else {
|
@@ -1783,6 +1953,16 @@ static int get_word(YYSTYPE *lvalp, QParser *qp)
|
|
1783
1953
|
qp->qstrp++;
|
1784
1954
|
}
|
1785
1955
|
break;
|
1956
|
+
case ':':
|
1957
|
+
if ((*qp->qstrp) == ':') {
|
1958
|
+
qp->qstrp++;
|
1959
|
+
*bufp++ = ':';
|
1960
|
+
*bufp++ = ':';
|
1961
|
+
}
|
1962
|
+
else {
|
1963
|
+
goto get_word_done;
|
1964
|
+
}
|
1965
|
+
break;
|
1786
1966
|
case '*': case '?':
|
1787
1967
|
is_wild = true;
|
1788
1968
|
/* fall through */
|
@@ -1798,6 +1978,7 @@ static int get_word(YYSTYPE *lvalp, QParser *qp)
|
|
1798
1978
|
bufp = buf + MAX_WORD_SIZE;
|
1799
1979
|
}
|
1800
1980
|
}
|
1981
|
+
get_word_done:
|
1801
1982
|
qp->qstrp--;
|
1802
1983
|
/* check for keywords. There are only four so we have a bit of a hack which
|
1803
1984
|
* just checks for all of them. */
|
@@ -1915,7 +2096,14 @@ static Query *get_bool_q(BCArray *bca)
|
|
1915
2096
|
}
|
1916
2097
|
else if (clause_count == 1) {
|
1917
2098
|
BooleanClause *bc = bca->clauses[0];
|
1918
|
-
|
2099
|
+
if (bc->is_prohibited) {
|
2100
|
+
q = bq_new(false);
|
2101
|
+
bq_add_query_nr(q, bc->query, BC_MUST_NOT);
|
2102
|
+
bq_add_query_nr(q, maq_new(), BC_MUST);
|
2103
|
+
}
|
2104
|
+
else {
|
2105
|
+
q = bc->query;
|
2106
|
+
}
|
1919
2107
|
free(bc);
|
1920
2108
|
free(bca->clauses);
|
1921
2109
|
}
|
@@ -2287,6 +2475,15 @@ static Query *get_r_q(QParser *qp, char *field, char *from, char *to,
|
|
2287
2475
|
bool inc_lower, bool inc_upper)
|
2288
2476
|
{
|
2289
2477
|
Query *rq;
|
2478
|
+
if (qp->wild_lower) {
|
2479
|
+
if (from) {
|
2480
|
+
lower_str(from);
|
2481
|
+
}
|
2482
|
+
if (to) {
|
2483
|
+
lower_str(to);
|
2484
|
+
}
|
2485
|
+
}
|
2486
|
+
/*
|
2290
2487
|
if (from) {
|
2291
2488
|
TokenStream *stream = get_cached_ts(qp, field, from);
|
2292
2489
|
Token *token = ts_next(stream);
|
@@ -2297,10 +2494,9 @@ static Query *get_r_q(QParser *qp, char *field, char *from, char *to,
|
|
2297
2494
|
Token *token = ts_next(stream);
|
2298
2495
|
to = token ? estrdup(token->text) : NULL;
|
2299
2496
|
}
|
2497
|
+
*/
|
2300
2498
|
|
2301
2499
|
rq = rq_new(field, from, to, inc_lower, inc_upper);
|
2302
|
-
if (from) free(from);
|
2303
|
-
if (to) free(to);
|
2304
2500
|
return rq;
|
2305
2501
|
}
|
2306
2502
|
|
@@ -2475,7 +2671,7 @@ Query *qp_get_bad_query(QParser *qp, char *str)
|
|
2475
2671
|
|
2476
2672
|
Query *qp_parse(QParser *self, char *qstr)
|
2477
2673
|
{
|
2478
|
-
Query *result;
|
2674
|
+
Query *result = NULL;
|
2479
2675
|
mutex_lock(&self->mutex);
|
2480
2676
|
if (self->clean_str) {
|
2481
2677
|
self->qstrp = self->qstr = qp_clean_str(qstr);
|
@@ -2486,9 +2682,12 @@ Query *qp_parse(QParser *self, char *qstr)
|
|
2486
2682
|
self->fields = self->def_fields;
|
2487
2683
|
self->result = NULL;
|
2488
2684
|
|
2489
|
-
|
2490
|
-
|
2491
|
-
|
2685
|
+
TRY
|
2686
|
+
yyparse(self);
|
2687
|
+
result = self->result;
|
2688
|
+
XCATCHALL
|
2689
|
+
if (self->handle_parse_errors) HANDLED();
|
2690
|
+
XENDTRY
|
2492
2691
|
if (!result && self->handle_parse_errors) {
|
2493
2692
|
result = qp_get_bad_query(self, self->qstr);
|
2494
2693
|
}
|
@@ -2503,4 +2702,3 @@ Query *qp_parse(QParser *self, char *qstr)
|
|
2503
2702
|
return result;
|
2504
2703
|
}
|
2505
2704
|
|
2506
|
-
|