1 /*
2 *******************************************************************************
3 *
4 *     Copyright (C) 2002-2011, International Business Machines
5 *     Corporation and others.    All Rights Reserved.
6 *
7 *******************************************************************************
8 */
9 
10 #include "unicode/uchriter.h"
11 #include "unicode/schriter.h"
12 #include "unicode/ustring.h"
13 #include <stdio.h>
14 #include <unicode/brkiter.h>
15 #include <unicode/ustdio.h>
16 #include <stdlib.h>
17 
18 static UFILE *out;
19 
printUnicodeString(const UnicodeString & s)20 void printUnicodeString(const UnicodeString &s)
21 {
22     u_fprintf(out, "%S", &s);
23 }
24 
printUChar(UChar32 ch)25 void printUChar(UChar32 ch)
26 {
27     if(ch < 127) {
28         u_fprintf(out, "%C", (UChar) ch);
29     } else if (ch == CharacterIterator::DONE) {
30         u_fprintf(out, "[CharacterIterator::DONE = 0xFFFF]");
31     } else {
32         u_fprintf(out, "[%X]", ch);
33     }
34 }
35 
36 class Test
37 {
38 public:
39     void TestUChariter();
40     void TestStringiter();
41 };
42 
TestUChariter()43 void Test::TestUChariter() {
44     const char testChars[] = "Now is the time for all good men to come "
45         "to the aid of their country.";
46 
47     UnicodeString testString(testChars,"");
48     const UChar *testText = testString.getTerminatedBuffer();
49 
50     UCharCharacterIterator iter(testText, u_strlen(testText));
51     UCharCharacterIterator* test2 = (UCharCharacterIterator*)iter.clone();
52 
53     u_fprintf(out, "testText = %s", testChars);
54 
55     if (iter != *test2 ) {
56         u_fprintf(out, "clone() or equals() failed: Two clones tested unequal\n");
57     }
58 
59     UnicodeString result1, result2;
60     // getting and comparing the text within the iterators
61     iter.getText(result1);
62     test2->getText(result2);
63     if (result1 != result2) {
64         u_fprintf(out, "iter.getText() != clone.getText()\n");
65     }
66 
67     u_fprintf(out, "\n");
68 
69     // Demonstrates seeking forward using the iterator.
70     u_fprintf(out, "Forward  = ");
71 
72     UChar c = iter.first();
73     printUChar(c);    // The first char
74     int32_t i = 0;
75 
76     if (iter.startIndex() != 0 || iter.endIndex() != u_strlen(testText)) {
77         u_fprintf(out, "startIndex() or endIndex() failed\n");
78     }
79 
80 
81     // Testing forward iteration...
82     do {
83         if (c == CharacterIterator::DONE && i != u_strlen(testText)) {
84             u_fprintf(out, "Iterator reached end prematurely");
85         }
86         else if (c != testText[i]) {
87             u_fprintf(out, "Character mismatch at position %d\n" + i);
88         }
89         if (iter.current() != c) {
90             u_fprintf(out, "current() isn't working right");
91         }
92         if (iter.getIndex() != i) {
93             u_fprintf(out, "getIndex() isn't working right\n");
94         }
95         if (c != CharacterIterator::DONE) {
96             c = iter.next();
97             i++;
98         }
99 
100         u_fprintf(out, "|");
101         printUChar(c);
102 
103     } while (c != CharacterIterator::DONE);
104 
105     delete test2;
106     u_fprintf(out, "\n");
107 }
108 
109 
TestStringiter()110 void Test::TestStringiter() {
111     const char testChars[] = "Now is the time for all good men to come "
112         "to the aid of their country.";
113 
114     UnicodeString testString(testChars,"");
115     const UChar *testText    = testString.getTerminatedBuffer();
116 
117     StringCharacterIterator iter(testText, u_strlen(testText));
118     StringCharacterIterator* test2 = (StringCharacterIterator*)iter.clone();
119 
120     if (iter != *test2 ) {
121         u_fprintf(out, "clone() or equals() failed: Two clones tested unequal\n");
122     }
123 
124     UnicodeString result1, result2;
125     // getting and comparing the text within the iterators
126     iter.getText(result1);
127     test2->getText(result2);
128     if (result1 != result2) {
129         u_fprintf(out, "getText() failed\n");
130     }
131 
132     u_fprintf(out, "Backwards: ");
133 
134     UChar c = iter.last();
135     int32_t i = iter.endIndex();
136 
137     printUChar(c);
138     i--; // already printed out the last char
139 
140     if (iter.startIndex() != 0 || iter.endIndex() != u_strlen(testText)) {
141         u_fprintf(out, "startIndex() or endIndex() failed\n");
142     }
143 
144     // Testing backward iteration over a range...
145     do {
146         if (c == CharacterIterator::DONE) {
147             u_fprintf(out, "Iterator reached end prematurely\n");
148         }
149         else if (c != testText[i]) {
150             u_fprintf(out, "Character mismatch at position %d\n", i);
151         }
152         if (iter.current() != c) {
153             u_fprintf(out, "current() isn't working right\n");
154         }
155         if (iter.getIndex() != i) {
156             u_fprintf(out, "getIndex() isn't working right [%d should be %d]\n", iter.getIndex(), i);
157         }
158         if (c != CharacterIterator::DONE) {
159             c = iter.previous();
160             i--;
161         }
162 
163         u_fprintf(out, "|");
164         printUChar(c);
165     } while (c != CharacterIterator::DONE);
166 
167     u_fprintf(out, "\n");
168     delete test2;
169 }
170 
171 /* Creating and using text boundaries */
main(void)172 int main( void )
173 {
174     UErrorCode status = U_ZERO_ERROR;
175 
176     out = u_finit(stdout, NULL, NULL);
177 
178     u_fprintf(out, "ICU Iteration Sample Program (C++)\n\n");
179 
180     Test t;
181 
182     u_fprintf(out, "\n");
183     u_fprintf(out, "Test::TestUCharIter()\n");
184 
185     t.TestUChariter();
186 
187     u_fprintf(out, "-----\n");
188     u_fprintf(out, "Test::TestStringchariter()\n");
189 
190     t.TestStringiter();
191 
192     u_fprintf(out, "-----\n");
193 
194     return 0;
195 }
196