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