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