1/*
2*******************************************************************************
3*
4*   © 2016 and later: Unicode, Inc. and others.
5*   License & terms of use: http://www.unicode.org/copyright.html#License
6*
7*******************************************************************************
8*******************************************************************************
9*
10*   Copyright (C) 2002-2003, International Business Machines
11*   Corporation and others.  All Rights Reserved.
12*
13*******************************************************************************
14*/
15
16#include <stdio.h>
17#include <unicode/brkiter.h>
18#include <stdlib.h>
19
20U_CFUNC int c_main(void);
21
22
23void printUnicodeString(const UnicodeString &s) {
24    char charBuf[1000];
25    s.extract(0, s.length(), charBuf, sizeof(charBuf)-1, 0);
26    charBuf[sizeof(charBuf)-1] = 0;
27    printf("%s", charBuf);
28}
29
30
31void printTextRange( BreakIterator& iterator,
32                    int32_t start, int32_t end )
33{
34    CharacterIterator *strIter = iterator.getText().clone();
35    UnicodeString  s;
36    strIter->getText(s);
37
38    printf(" %ld %ld\t", (long)start, (long)end);
39    printUnicodeString(UnicodeString(s, 0, start));
40    printf("|");
41    printUnicodeString(UnicodeString(s, start, end-start));
42    printf("|");
43    printUnicodeString(UnicodeString(s, end));
44    puts("");
45    delete strIter;
46}
47
48
49/* Print each element in order: */
50void printEachForward( BreakIterator& boundary)
51{
52    int32_t start = boundary.first();
53    for (int32_t end = boundary.next();
54         end != BreakIterator::DONE;
55         start = end, end = boundary.next())
56    {
57        printTextRange( boundary, start, end );
58    }
59}
60
61/* Print each element in reverse order: */
62void printEachBackward( BreakIterator& boundary)
63{
64    int32_t end = boundary.last();
65    for (int32_t start = boundary.previous();
66         start != BreakIterator::DONE;
67         end = start, start = boundary.previous())
68    {
69        printTextRange( boundary, start, end );
70    }
71}
72
73/* Print the first element */
74void printFirst(BreakIterator& boundary)
75{
76    int32_t start = boundary.first();
77    int32_t end = boundary.next();
78    printTextRange( boundary, start, end );
79}
80
81/* Print the last element */
82void printLast(BreakIterator& boundary)
83{
84    int32_t end = boundary.last();
85    int32_t start = boundary.previous();
86    printTextRange( boundary, start, end );
87}
88
89/* Print the element at a specified position */
90void printAt(BreakIterator &boundary, int32_t pos )
91{
92    int32_t end = boundary.following(pos);
93    int32_t start = boundary.previous();
94    printTextRange( boundary, start, end );
95}
96
97/* Creating and using text boundaries */
98int main( void )
99{
100    puts("ICU Break Iterator Sample Program\n");
101    puts("C++ Break Iteration\n");
102    BreakIterator* boundary;
103    UnicodeString stringToExamine("Aaa bbb ccc. Ddd eee fff.");
104    printf("Examining: ");
105    printUnicodeString(stringToExamine);
106    puts("");
107
108    //print each sentence in forward and reverse order
109    UErrorCode status = U_ZERO_ERROR;
110    boundary = BreakIterator::createSentenceInstance(
111        Locale::getUS(), status );
112    if (U_FAILURE(status)) {
113        printf("failed to create sentence break iterator.  status = %s",
114            u_errorName(status));
115        exit(1);
116    }
117
118    boundary->setText(stringToExamine);
119    puts("\n Sentence Boundaries... ");
120    puts("----- forward: -----------");
121    printEachForward(*boundary);
122    puts("----- backward: ----------");
123    printEachBackward(*boundary);
124    delete boundary;
125
126    //print each word in order
127    printf("\n Word Boundaries... \n");
128    boundary = BreakIterator::createWordInstance(
129        Locale::getUS(), status);
130    boundary->setText(stringToExamine);
131    puts("----- forward: -----------");
132    printEachForward(*boundary);
133    //print first element
134    puts("----- first: -------------");
135    printFirst(*boundary);
136    //print last element
137    puts("----- last: --------------");
138    printLast(*boundary);
139    //print word at charpos 10
140    puts("----- at pos 10: ---------");
141    printAt(*boundary, 10 );
142
143    delete boundary;
144
145    puts("\nEnd C++ Break Iteration");
146
147    // Call the C version
148    return c_main();
149}
150