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