Avoid using non-portable debian.h
[yaz-moved-to-github.git] / include / yaz / icu.h
1 /* This file is part of the YAZ toolkit.
2  * Copyright (C) Index Data.
3  * All rights reserved.
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  *     * Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *     * Redistributions in binary form must reproduce the above copyright
10  *       notice, this list of conditions and the following disclaimer in the
11  *       documentation and/or other materials provided with the distribution.
12  *     * Neither the name of Index Data nor the names of its contributors
13  *       may be used to endorse or promote products derived from this
14  *       software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 /** \file
29     \brief ICU utilities
30 */
31
32
33 #ifndef YAZ_ICU_H
34 #define YAZ_ICU_H
35
36 #include <yaz/yconfig.h>
37
38 #include <yaz/xmltypes.h>
39
40 #include <unicode/utypes.h>
41
42 YAZ_BEGIN_CDECL
43
44 /** \brief opaque ICU chain */
45 typedef struct icu_chain *yaz_icu_chain_t;
46
47 /** \brief destroys ICU chain */
48 YAZ_EXPORT void icu_chain_destroy(yaz_icu_chain_t chain);
49
50 /** \brief constructs ICU chain from XML specification
51     \param xml_node icu_chain XML node - with attribute locale in it
52     \param sort 1 if ICU chain is to deal with sort keys; 0 otherwise
53     \param status May include ICU error code on failure
54     \returns chain ptr or NULL on failure in which case status may hold info
55 */
56 YAZ_EXPORT yaz_icu_chain_t icu_chain_xml_config(const xmlNode *xml_node,
57                                                 int sort,
58                                                 UErrorCode *status);
59 /** \brief pass string to ICU for parsing/tokenization/etc
60     \param chain ICU chain to be used for parsing
61     \param src8cstr input C string (null-terminated)
62     \param status may include ICU error on failure
63     \retval 0 failure
64     \retval 1 success
65 */
66 YAZ_EXPORT int icu_chain_assign_cstr(yaz_icu_chain_t chain,
67                                      const char *src8cstr,
68                                      UErrorCode *status);
69
70 /** \brief returns one token (if any)
71     \param chain ICU chain
72     \param status may include ICU error on failure
73     \retval 0 error or end-of-tokens (no more tokens)
74     \retval >0 token number (1, 3, 3, ..)
75
76     This function tries to move to "next" token in assigned
77     C-string .. Or returns 0 if no more is to be found
78 */
79 YAZ_EXPORT int icu_chain_next_token(yaz_icu_chain_t chain,
80                                     UErrorCode *status);
81
82 /** \brief returns token number of last token processed
83     \brief chain ICU chain
84     \returns token number (numbered from 1)
85 */
86 YAZ_EXPORT int icu_chain_token_number(yaz_icu_chain_t chain);
87
88 /** \brief returns display token of last token processed
89     \param chain ICU chain
90     \returns display token string (C string)
91     This function returns display string for last token returned
92     by icu_chain_next_token.
93 */
94 YAZ_EXPORT const char * icu_chain_token_display(yaz_icu_chain_t chain);
95
96 /** \brief returns normalized token of last token processed
97     \param chain ICU chain
98     \returns normalized token string (C string)
99     This function returns normalized string for last token returned
100     by icu_chain_next_token.
101 */
102 YAZ_EXPORT const char * icu_chain_token_norm(yaz_icu_chain_t chain);
103
104 /** \brief returns sortkey token of last token processed
105     \param chain ICU chain
106     \returns sortkey token string (C string)
107     This function returns sortkey string for last token returned
108     by icu_chain_next_token.
109 */
110 YAZ_EXPORT const char * icu_chain_token_sortkey(yaz_icu_chain_t chain);
111
112 /** \brief returns token as it relates to original text (legacy)
113     \param chain ICU chain
114     \param start offset in original text
115     \param len number of uchars in original text
116 */
117 YAZ_EXPORT void icu_chain_get_org_info(yaz_icu_chain_t chain,
118                                        size_t *start, size_t *len);
119
120 /** \brief returns token as it relates to original text (2nd version)
121     \param chain ICU chain
122     \param start offset in original text
123     \param len number of uchars in original text
124     \param cstr if not-null, holds original string in there
125 */
126 YAZ_EXPORT void icu_chain_get_org_info2(yaz_icu_chain_t chain,
127                                         size_t *start, size_t *len,
128                                         const char **cstr);
129
130 /** \brief ICU tokenizer iterator type (opaque) */
131 typedef struct icu_iter *yaz_icu_iter_t;
132
133 /** \brief create ICU tokenizer iterator from chain
134     \param chain ICU chain
135     \returns ICU iterator
136 */
137 YAZ_EXPORT
138 yaz_icu_iter_t icu_iter_create(struct icu_chain *chain);
139
140 /** \brief starts iteration over string
141     \param iter ICU tokenizer iterator
142     \param src8cstr input string (0-terminated)
143
144     Call icu_iter_next to iterate over each token.
145 */
146 YAZ_EXPORT
147 void icu_iter_first(yaz_icu_iter_t iter, const char *src8cstr);
148
149 /** \brief iterates over one token
150     \param iter ICU tokenizer iterator
151     \retval 0 no more tokens (EOF)
152     \retval 1 got one token (use icu_iter_get..-functions)
153 */
154 YAZ_EXPORT
155 int icu_iter_next(yaz_icu_iter_t iter);
156
157 /** \brief destroy ICU tokenizer iterator
158     \param iter ICU tokenizer iterator
159 */
160 YAZ_EXPORT
161 void icu_iter_destroy(yaz_icu_iter_t iter);
162
163 /** \brief returns ICU normalized token
164     \param iter ICU tokenizer iterator
165     \returns string (0-terminated)
166 */
167 YAZ_EXPORT
168 const char *icu_iter_get_norm(yaz_icu_iter_t iter);
169
170 /** \brief returns ICU sortkey string
171     \param iter ICU tokenizer iterator
172     \returns string (0-terminated)
173 */
174 YAZ_EXPORT
175 const char *icu_iter_get_sortkey(yaz_icu_iter_t iter);
176
177 /** \brief returns ICU display string
178     \param iter ICU tokenizer iterator
179     \returns string (0-terminated)
180 */
181 YAZ_EXPORT
182 const char *icu_iter_get_display(yaz_icu_iter_t iter);
183
184 /** \brief returns ICU token count for iterator
185     \param iter ICU tokenizer iterator
186     \returns token count (1, 2, 3...)
187 */
188 YAZ_EXPORT
189 int icu_iter_get_token_number(yaz_icu_iter_t iter);
190
191 /** \brief returns ICU original token start (offset) and length (legacy)
192     \param iter ICU tokenizer iterator
193     \param start offset of last token in original text
194     \param len length of last token in original text
195 */
196 YAZ_EXPORT
197 void icu_iter_get_org_info(yaz_icu_iter_t iter, size_t *start, size_t *len);
198
199 /** \brief returns ICU original token start (offset) and length
200     \param iter ICU tokenizer iterator
201     \param start offset of last token in original text
202     \param len length of last token in original text
203     \param cstr if non-null: original string
204 */
205 YAZ_EXPORT
206 void icu_iter_get_org_info2(yaz_icu_iter_t iter, size_t *start, size_t *len,
207                             const char **cstr);
208
209 YAZ_END_CDECL
210
211 #endif /* YAZ_ICU_H */
212
213 /*
214  * Local variables:
215  * c-basic-offset: 4
216  * c-file-style: "Stroustrup"
217  * indent-tabs-mode: nil
218  * End:
219  * vim: shiftwidth=4 tabstop=8 expandtab
220  */
221