1/* 2******************************************************************************* 3* 4* Copyright (C) 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 24static UFILE *out; 25 26void printUnicodeString(const UnicodeString &s) 27{ 28 u_fprintf(out, "%S", &s); 29} 30 31void 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 42class Test 43{ 44public: 45 void TestUChariter(); 46 void TestStringiter(); 47}; 48 49void 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 116void 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 */ 178int 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