1/* -*- c-basic-offset: 2 -*- */
2/*
3 Copyright(C) 2009-2016 Brazil
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License version 2.1 as published by the Free Software Foundation.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with this library; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17*/
18
19#pragma once
20
21#include "grn.h"
22#include "grn_str.h"
23#include "grn_db.h"
24
25#define ASIZE 256U
26#define MAX_SNIP_TAG_COUNT 512U
27#define MAX_SNIP_COND_COUNT 32U
28#define MAX_SNIP_RESULT_COUNT 16U
29
30#ifdef __cplusplus
31extern "C"
32{
33#endif
34
35#define SNIPCOND_NONSTOP 0
36#define SNIPCOND_STOP 1
37#define SNIPCOND_ACROSS 2
38
39#define GRN_QUERY_SCAN_ALLOCCONDS 0x0002
40
41typedef struct _snip_cond
42{
43 /* initial parameters */
44 const char *opentag;
45 const char *closetag;
46 size_t opentag_len;
47 size_t closetag_len;
48 grn_obj *keyword;
49
50 /* Tuned BM pre */
51 size_t bmBc[ASIZE];
52 size_t shift;
53
54 /* Tuned BM temporal result */
55 size_t found;
56 size_t last_found;
57 size_t last_offset;
58 size_t start_offset;
59 size_t end_offset;
60 size_t found_alpha_head;
61
62 /* search result */
63 int count;
64
65 /* stop flag */
66 int_least8_t stopflag;
67} snip_cond;
68
69typedef struct
70{
71 size_t start_offset;
72 size_t end_offset;
73 snip_cond *cond;
74} _snip_tag_result;
75
76typedef struct
77{
78 size_t start_offset;
79 size_t end_offset;
80 unsigned int first_tag_result_idx;
81 unsigned int last_tag_result_idx;
82 unsigned int tag_count;
83} _snip_result;
84
85typedef struct _grn_snip
86{
87 grn_db_obj obj;
88 grn_encoding encoding;
89 int flags;
90 size_t width;
91 unsigned int max_results;
92 const char *defaultopentag;
93 const char *defaultclosetag;
94 size_t defaultopentag_len;
95 size_t defaultclosetag_len;
96
97 grn_snip_mapping *mapping;
98
99 snip_cond cond[MAX_SNIP_COND_COUNT];
100 unsigned int cond_len;
101
102 unsigned int tag_count;
103 unsigned int snip_count;
104
105 const char *string;
106 grn_obj *nstr;
107
108 _snip_result snip_result[MAX_SNIP_RESULT_COUNT];
109 _snip_tag_result tag_result[MAX_SNIP_TAG_COUNT];
110
111 size_t max_tagged_len;
112
113 grn_obj *normalizer;
114} grn_snip;
115
116grn_rc grn_snip_close(grn_ctx *ctx, grn_snip *snip);
117grn_rc grn_snip_cond_init(grn_ctx *ctx, snip_cond *sc, const char *keyword, unsigned int keyword_len,
118 grn_encoding enc, grn_obj *normalizer, int flags);
119void grn_snip_cond_reinit(snip_cond *cond);
120grn_rc grn_snip_cond_close(grn_ctx *ctx, snip_cond *cond);
121void grn_bm_tunedbm(grn_ctx *ctx, snip_cond *cond, grn_obj *string, int flags);
122
123#ifdef __cplusplus
124}
125#endif
126