• 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#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 
20 U_CFUNC int c_main(void);
21 
22 
printUnicodeString(const UnicodeString & s)23 void 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 
printTextRange(BreakIterator & iterator,int32_t start,int32_t end)31 void 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: */
printEachForward(BreakIterator & boundary)50 void 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: */
printEachBackward(BreakIterator & boundary)62 void 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 */
printFirst(BreakIterator & boundary)74 void 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 */
printLast(BreakIterator & boundary)82 void 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 */
printAt(BreakIterator & boundary,int32_t pos)90 void 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 */
main(void)98 int 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