1/*
2* Copyright (C) 1996-2004, International Business Machines Corporation and others. All Rights Reserved.
3*****************************************************************************************
4*/
5
6#ifndef UBRK_H
7#define UBRK_H
8
9#include "unicode/utypes.h"
10#include "unicode/uloc.h"
11
12/**
13 * A text-break iterator.
14 *  For usage in C programs.
15 */
16#ifndef UBRK_TYPEDEF_UBREAK_ITERATOR
17#   define UBRK_TYPEDEF_UBREAK_ITERATOR
18    /**
19     *  Opaque type representing an ICU Break iterator object.
20     *  @stable ICU 2.0
21     */
22    typedef void UBreakIterator;
23#endif
24
25#if !UCONFIG_NO_BREAK_ITERATION
26
27#include "unicode/parseerr.h"
28
29/**
30 * \file
31 * \brief C API: BreakIterator
32 *
33 * <h2> BreakIterator C API </h2>
34 *
35 * The BreakIterator C API defines  methods for finding the location
36 * of boundaries in text. Pointer to a UBreakIterator maintain a
37 * current position and scan over text returning the index of characters
38 * where boundaries occur.
39 * <P>
40 * Line boundary analysis determines where a text string can be broken
41 * when line-wrapping. The mechanism correctly handles punctuation and
42 * hyphenated words.
43 * <P>
44 * Sentence boundary analysis allows selection with correct
45 * interpretation of periods within numbers and abbreviations, and
46 * trailing punctuation marks such as quotation marks and parentheses.
47 * <P>
48 * Word boundary analysis is used by search and replace functions, as
49 * well as within text editing applications that allow the user to
50 * select words with a double click. Word selection provides correct
51 * interpretation of punctuation marks within and following
52 * words. Characters that are not part of a word, such as symbols or
53 * punctuation marks, have word-breaks on both sides.
54 * <P>
55 * Character boundary analysis allows users to interact with
56 * characters as they expect to, for example, when moving the cursor
57 * through a text string. Character boundary analysis provides correct
58 * navigation of through character strings, regardless of how the
59 * character is stored.  For example, an accented character might be
60 * stored as a base character and a diacritical mark. What users
61 * consider to be a character can differ between languages.
62 * <P>
63 * Title boundary analysis locates all positions,
64 * typically starts of words, that should be set to Title Case
65 * when title casing the text.
66 * <P>
67 *
68 * This is the interface for all text boundaries.
69 * <P>
70 * Examples:
71 * <P>
72 * Helper function to output text
73 * <pre>
74 * \code
75 *    void printTextRange(UChar* str, int32_t start, int32_t end ) {
76 *         UChar* result;
77 *         UChar* temp;
78 *         const char* res;
79 *         temp=(UChar*)malloc(sizeof(UChar) * ((u_strlen(str)-start)+1));
80 *         result=(UChar*)malloc(sizeof(UChar) * ((end-start)+1));
81 *         u_strcpy(temp, &str[start]);
82 *         u_strncpy(result, temp, end-start);
83 *         res=(char*)malloc(sizeof(char) * (u_strlen(result)+1));
84 *         u_austrcpy(res, result);
85 *         printf("%s\n", res);
86 *    }
87 * \endcode
88 * </pre>
89 * Print each element in order:
90 * <pre>
91 * \code
92 *    void printEachForward( UBreakIterator* boundary, UChar* str) {
93 *       int32_t end;
94 *       int32_t start = ubrk_first(boundary);
95 *       for (end = ubrk_next(boundary)); end != UBRK_DONE; start = end, end = ubrk_next(boundary)) {
96 *             printTextRange(str, start, end );
97 *         }
98 *    }
99 * \endcode
100 * </pre>
101 * Print each element in reverse order:
102 * <pre>
103 * \code
104 *    void printEachBackward( UBreakIterator* boundary, UChar* str) {
105 *       int32_t start;
106 *       int32_t end = ubrk_last(boundary);
107 *       for (start = ubrk_previous(boundary); start != UBRK_DONE;  end = start, start =ubrk_previous(boundary)) {
108 *             printTextRange( str, start, end );
109 *         }
110 *    }
111 * \endcode
112 * </pre>
113 * Print first element
114 * <pre>
115 * \code
116 *    void printFirst(UBreakIterator* boundary, UChar* str) {
117 *        int32_t end;
118 *        int32_t start = ubrk_first(boundary);
119 *        end = ubrk_next(boundary);
120 *        printTextRange( str, start, end );
121 *    }
122 * \endcode
123 * </pre>
124 * Print last element
125 * <pre>
126 * \code
127 *    void printLast(UBreakIterator* boundary, UChar* str) {
128 *        int32_t start;
129 *        int32_t end = ubrk_last(boundary);
130 *        start = ubrk_previous(boundary);
131 *        printTextRange(str, start, end );
132 *    }
133 * \endcode
134 * </pre>
135 * Print the element at a specified position
136 * <pre>
137 * \code
138 *    void printAt(UBreakIterator* boundary, int32_t pos , UChar* str) {
139 *        int32_t start;
140 *        int32_t end = ubrk_following(boundary, pos);
141 *        start = ubrk_previous(boundary);
142 *        printTextRange(str, start, end );
143 *    }
144 * \endcode
145 * </pre>
146 * Creating and using text boundaries
147 * <pre>
148 * \code
149 *       void BreakIterator_Example( void ) {
150 *           UBreakIterator* boundary;
151 *           UChar *stringToExamine;
152 *           stringToExamine=(UChar*)malloc(sizeof(UChar) * (strlen("Aaa bbb ccc. Ddd eee fff.")+1) );
153 *           u_uastrcpy(stringToExamine, "Aaa bbb ccc. Ddd eee fff.");
154 *           printf("Examining: "Aaa bbb ccc. Ddd eee fff.");
155 *
156 *           //print each sentence in forward and reverse order
157 *           boundary = ubrk_open(UBRK_SENTENCE, "en_us", stringToExamine, u_strlen(stringToExamine), &status);
158 *           printf("----- forward: -----------\n");
159 *           printEachForward(boundary, stringToExamine);
160 *           printf("----- backward: ----------\n");
161 *           printEachBackward(boundary, stringToExamine);
162 *           ubrk_close(boundary);
163 *
164 *           //print each word in order
165 *           boundary = ubrk_open(UBRK_WORD, "en_us", stringToExamine, u_strlen(stringToExamine), &status);
166 *           printf("----- forward: -----------\n");
167 *           printEachForward(boundary, stringToExamine);
168 *           printf("----- backward: ----------\n");
169 *           printEachBackward(boundary, stringToExamine);
170 *           //print first element
171 *           printf("----- first: -------------\n");
172 *           printFirst(boundary, stringToExamine);
173 *           //print last element
174 *           printf("----- last: --------------\n");
175 *           printLast(boundary, stringToExamine);
176 *           //print word at charpos 10
177 *           printf("----- at pos 10: ---------\n");
178 *           printAt(boundary, 10 , stringToExamine);
179 *
180 *           ubrk_close(boundary);
181 *       }
182 * \endcode
183 * </pre>
184 */
185
186/** The possible types of text boundaries.  @stable ICU 2.0 */
187typedef enum UBreakIteratorType {
188  /** Character breaks  @stable ICU 2.0 */
189  UBRK_CHARACTER,
190  /** Word breaks @stable ICU 2.0 */
191  UBRK_WORD,
192  /** Line breaks @stable ICU 2.0 */
193  UBRK_LINE,
194  /** Sentence breaks @stable ICU 2.0 */
195  UBRK_SENTENCE,
196
197#ifndef U_HIDE_DEPRECATED_API
198  /**
199   * Title Case breaks
200   * The iterator created using this type locates title boundaries as described for
201   * Unicode 3.2 only. For Unicode 4.0 and above title boundary iteration,
202   * please use Word Boundary iterator.
203   *
204   * @deprecated ICU 2.8 Use the word break iterator for titlecasing for Unicode 4 and later.
205   */
206  UBRK_TITLE
207#endif /* U_HIDE_DEPRECATED_API */
208
209} UBreakIteratorType;
210
211/** Value indicating all text boundaries have been returned.
212 *  @stable ICU 2.0
213 */
214#define UBRK_DONE ((int32_t) -1)
215
216
217/**
218 *  Enum constants for the word break tags returned by
219 *  getRuleStatus().  A range of values is defined for each category of
220 *  word, to allow for further subdivisions of a category in future releases.
221 *  Applications should check for tag values falling within the range, rather
222 *  than for single individual values.
223 *  @stable ICU 2.2
224*/
225typedef enum UWordBreak {
226    /** Tag value for "words" that do not fit into any of other categories.
227     *  Includes spaces and most punctuation. */
228    UBRK_WORD_NONE           = 0,
229    /** Upper bound for tags for uncategorized words. */
230    UBRK_WORD_NONE_LIMIT     = 100,
231    /** Tag value for words that appear to be numbers, lower limit.    */
232    UBRK_WORD_NUMBER         = 100,
233    /** Tag value for words that appear to be numbers, upper limit.    */
234    UBRK_WORD_NUMBER_LIMIT   = 200,
235    /** Tag value for words that contain letters, excluding
236     *  hiragana, katakana or ideographic characters, lower limit.    */
237    UBRK_WORD_LETTER         = 200,
238    /** Tag value for words containing letters, upper limit  */
239    UBRK_WORD_LETTER_LIMIT   = 300,
240    /** Tag value for words containing kana characters, lower limit */
241    UBRK_WORD_KANA           = 300,
242    /** Tag value for words containing kana characters, upper limit */
243    UBRK_WORD_KANA_LIMIT     = 400,
244    /** Tag value for words containing ideographic characters, lower limit */
245    UBRK_WORD_IDEO           = 400,
246    /** Tag value for words containing ideographic characters, upper limit */
247    UBRK_WORD_IDEO_LIMIT     = 500
248} UWordBreak;
249
250/**
251 *  Enum constants for the line break tags returned by getRuleStatus().
252 *  A range of values is defined for each category of
253 *  word, to allow for further subdivisions of a category in future releases.
254 *  Applications should check for tag values falling within the range, rather
255 *  than for single individual values.
256 *  @draft ICU 2.8
257*/
258typedef enum ULineBreakTag {
259    /** Tag value for soft line breaks, positions at which a line break
260      *  is acceptable but not required                */
261    UBRK_LINE_SOFT            = 0,
262    /** Upper bound for soft line breaks.              */
263    UBRK_LINE_SOFT_LIMIT      = 100,
264    /** Tag value for a hard, or mandatory line break  */
265    UBRK_LINE_HARD            = 100,
266    /** Upper bound for hard line breaks.              */
267    UBRK_LINE_HARD_LIMIT      = 200
268} ULineBreakTag;
269
270
271
272/**
273 *  Enum constants for the sentence break tags returned by getRuleStatus().
274 *  A range of values is defined for each category of
275 *  sentence, to allow for further subdivisions of a category in future releases.
276 *  Applications should check for tag values falling within the range, rather
277 *  than for single individual values.
278 *  @draft ICU 2.8
279*/
280typedef enum USentenceBreakTag {
281    /** Tag value for for sentences  ending with a sentence terminator
282      * ('.', '?', '!', etc.) character, possibly followed by a
283      * hard separator (CR, LF, PS, etc.)
284      */
285    UBRK_SENTENCE_TERM       = 0,
286    /** Upper bound for tags for sentences ended by sentence terminators.    */
287    UBRK_SENTENCE_TERM_LIMIT = 100,
288    /** Tag value for for sentences that do not contain an ending
289      * sentence terminator ('.', '?', '!', etc.) character, but
290      * are ended only by a hard separator (CR, LF, PS, etc.) or end of input.
291      */
292    UBRK_SENTENCE_SEP        = 100,
293    /** Upper bound for tags for sentences ended by a separator.              */
294    UBRK_SENTENCE_SEP_LIMIT  = 200
295    /** Tag value for a hard, or mandatory line break  */
296} USentenceBreakTag;
297
298
299/**
300 * Open a new UBreakIterator for locating text boundaries for a specified locale.
301 * A UBreakIterator may be used for detecting character, line, word,
302 * and sentence breaks in text.
303 * @param type The type of UBreakIterator to open: one of UBRK_CHARACTER, UBRK_WORD,
304 * UBRK_LINE, UBRK_SENTENCE
305 * @param locale The locale specifying the text-breaking conventions.
306 * @param text The text to be iterated over.
307 * @param textLength The number of characters in text, or -1 if null-terminated.
308 * @param status A UErrorCode to receive any errors.
309 * @return A UBreakIterator for the specified locale.
310 * @see ubrk_openRules
311 * @stable ICU 2.0
312 */
313U_STABLE UBreakIterator* U_EXPORT2
314ubrk_open(UBreakIteratorType type,
315      const char *locale,
316      const UChar *text,
317      int32_t textLength,
318      UErrorCode *status);
319
320/**
321 * Open a new UBreakIterator for locating text boundaries using specified breaking rules.
322 * The rule syntax is ... (TBD)
323 * @param rules A set of rules specifying the text breaking conventions.
324 * @param rulesLength The number of characters in rules, or -1 if null-terminated.
325 * @param text The text to be iterated over.  May be null, in which case ubrk_setText() is
326 *        used to specify the text to be iterated.
327 * @param textLength The number of characters in text, or -1 if null-terminated.
328 * @param parseErr   Receives position and context information for any syntax errors
329 *                   detected while parsing the rules.
330 * @param status A UErrorCode to receive any errors.
331 * @return A UBreakIterator for the specified rules.
332 * @see ubrk_open
333 * @stable ICU 2.2
334 */
335U_STABLE UBreakIterator* U_EXPORT2
336ubrk_openRules(const UChar     *rules,
337               int32_t         rulesLength,
338               const UChar     *text,
339               int32_t          textLength,
340               UParseError     *parseErr,
341               UErrorCode      *status);
342
343/**
344 * Thread safe cloning operation
345 * @param bi iterator to be cloned
346 * @param stackBuffer user allocated space for the new clone. If NULL new memory will be allocated.
347 *  If buffer is not large enough, new memory will be allocated.
348 *  Clients can use the U_BRK_SAFECLONE_BUFFERSIZE. This will probably be enough to avoid memory allocations.
349 * @param pBufferSize pointer to size of allocated space.
350 *  If *pBufferSize == 0, a sufficient size for use in cloning will
351 *  be returned ('pre-flighting')
352 *  If *pBufferSize is not enough for a stack-based safe clone,
353 *  new memory will be allocated.
354 * @param status to indicate whether the operation went on smoothly or there were errors
355 *  An informational status value, U_SAFECLONE_ALLOCATED_ERROR, is used if any allocations were necessary.
356 * @return pointer to the new clone
357 * @stable ICU 2.0
358 */
359U_STABLE UBreakIterator * U_EXPORT2
360ubrk_safeClone(
361          const UBreakIterator *bi,
362          void *stackBuffer,
363          int32_t *pBufferSize,
364          UErrorCode *status);
365
366/**
367  * A recommended size (in bytes) for the memory buffer to be passed to ubrk_saveClone().
368  * @stable ICU 2.0
369  */
370#define U_BRK_SAFECLONE_BUFFERSIZE 512
371
372/**
373* Close a UBreakIterator.
374* Once closed, a UBreakIterator may no longer be used.
375* @param bi The break iterator to close.
376 * @stable ICU 2.0
377*/
378U_STABLE void U_EXPORT2
379ubrk_close(UBreakIterator *bi);
380
381/**
382 * Sets an existing iterator to point to a new piece of text
383 * @param bi The iterator to use
384 * @param text The text to be set
385 * @param textLength The length of the text
386 * @param status The error code
387 * @stable ICU 2.0
388 */
389U_STABLE void U_EXPORT2
390ubrk_setText(UBreakIterator* bi,
391             const UChar*    text,
392             int32_t         textLength,
393             UErrorCode*     status);
394
395/**
396 * Determine the most recently-returned text boundary.
397 *
398 * @param bi The break iterator to use.
399 * @return The character index most recently returned by \ref ubrk_next, \ref ubrk_previous,
400 * \ref ubrk_first, or \ref ubrk_last.
401 * @stable ICU 2.0
402 */
403U_STABLE int32_t U_EXPORT2
404ubrk_current(const UBreakIterator *bi);
405
406/**
407 * Determine the text boundary following the current text boundary.
408 *
409 * @param bi The break iterator to use.
410 * @return The character index of the next text boundary, or UBRK_DONE
411 * if all text boundaries have been returned.
412 * @see ubrk_previous
413 * @stable ICU 2.0
414 */
415U_STABLE int32_t U_EXPORT2
416ubrk_next(UBreakIterator *bi);
417
418/**
419 * Determine the text boundary preceding the current text boundary.
420 *
421 * @param bi The break iterator to use.
422 * @return The character index of the preceding text boundary, or UBRK_DONE
423 * if all text boundaries have been returned.
424 * @see ubrk_next
425 * @stable ICU 2.0
426 */
427U_STABLE int32_t U_EXPORT2
428ubrk_previous(UBreakIterator *bi);
429
430/**
431 * Determine the index of the first character in the text being scanned.
432 * This is not always the same as index 0 of the text.
433 * @param bi The break iterator to use.
434 * @return The character index of the first character in the text being scanned.
435 * @see ubrk_last
436 * @stable ICU 2.0
437 */
438U_STABLE int32_t U_EXPORT2
439ubrk_first(UBreakIterator *bi);
440
441/**
442 * Determine the index immediately <EM>beyond</EM> the last character in the text being
443 * scanned.
444 * This is not the same as the last character.
445 * @param bi The break iterator to use.
446 * @return The character offset immediately <EM>beyond</EM> the last character in the
447 * text being scanned.
448 * @see ubrk_first
449 * @stable ICU 2.0
450 */
451U_STABLE int32_t U_EXPORT2
452ubrk_last(UBreakIterator *bi);
453
454/**
455 * Determine the text boundary preceding the specified offset.
456 * The value returned is always smaller than offset, or UBRK_DONE.
457 * @param bi The break iterator to use.
458 * @param offset The offset to begin scanning.
459 * @return The text boundary preceding offset, or UBRK_DONE.
460 * @see ubrk_following
461 * @stable ICU 2.0
462 */
463U_STABLE int32_t U_EXPORT2
464ubrk_preceding(UBreakIterator *bi,
465           int32_t offset);
466
467/**
468 * Determine the text boundary following the specified offset.
469 * The value returned is always greater than offset, or UBRK_DONE.
470 * @param bi The break iterator to use.
471 * @param offset The offset to begin scanning.
472 * @return The text boundary following offset, or UBRK_DONE.
473 * @see ubrk_preceding
474 * @stable ICU 2.0
475 */
476U_STABLE int32_t U_EXPORT2
477ubrk_following(UBreakIterator *bi,
478           int32_t offset);
479
480/**
481* Get a locale for which text breaking information is available.
482* A UBreakIterator in a locale returned by this function will perform the correct
483* text breaking for the locale.
484* @param index The index of the desired locale.
485* @return A locale for which number text breaking information is available, or 0 if none.
486* @see ubrk_countAvailable
487* @stable ICU 2.0
488*/
489U_STABLE const char* U_EXPORT2
490ubrk_getAvailable(int32_t index);
491
492/**
493* Determine how many locales have text breaking information available.
494* This function is most useful as determining the loop ending condition for
495* calls to \ref ubrk_getAvailable.
496* @return The number of locales for which text breaking information is available.
497* @see ubrk_getAvailable
498* @stable ICU 2.0
499*/
500U_STABLE int32_t U_EXPORT2
501ubrk_countAvailable(void);
502
503
504/**
505* Returns true if the specfied position is a boundary position.  As a side
506* effect, leaves the iterator pointing to the first boundary position at
507* or after "offset".
508* @param bi The break iterator to use.
509* @param offset the offset to check.
510* @return True if "offset" is a boundary position.
511* @stable ICU 2.0
512*/
513U_STABLE  UBool U_EXPORT2
514ubrk_isBoundary(UBreakIterator *bi, int32_t offset);
515
516/**
517 * Return the status from the break rule that determined the most recently
518 * returned break position.  The values appear in the rule source
519 * within brackets, {123}, for example.  For rules that do not specify a
520 * status, a default value of 0 is returned.
521 * <p>
522 * For word break iterators, the possible values are defined in enum UWordBreak.
523 * @stable ICU 2.2
524 */
525U_STABLE  int32_t U_EXPORT2
526ubrk_getRuleStatus(UBreakIterator *bi);
527
528/**
529 * Get the statuses from the break rules that determined the most recently
530 * returned break position.  The values appear in the rule source
531 * within brackets, {123}, for example.  The default status value for rules
532 * that do not explicitly provide one is zero.
533 * <p>
534 * For word break iterators, the possible values are defined in enum UWordBreak.
535 * @param bi        The break iterator to use
536 * @param fillInVec an array to be filled in with the status values.
537 * @param capacity  the length of the supplied vector.  A length of zero causes
538 *                  the function to return the number of status values, in the
539 *                  normal way, without attemtping to store any values.
540 * @param status    receives error codes.
541 * @return          The number of rule status values from rules that determined
542 *                  the most recent boundary returned by the break iterator.
543 * @draft ICU 3.0
544 */
545U_DRAFT  int32_t U_EXPORT2
546ubrk_getRuleStatusVec(UBreakIterator *bi, int32_t *fillInVec, int32_t capacity, UErrorCode *status);
547
548/**
549 * Return the locale of the break iterator. You can choose between the valid and
550 * the actual locale.
551 * @param bi break iterator
552 * @param type locale type (valid or actual)
553 * @param status error code
554 * @return locale string
555 * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback
556 */
557U_DRAFT const char* U_EXPORT2
558ubrk_getLocaleByType(const UBreakIterator *bi, ULocDataLocaleType type, UErrorCode* status);
559
560
561#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
562
563#endif
564