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