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