/* ******************************************************************************* * * Copyright (C) 2002-2003, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* */ #include "unicode/uchriter.h" #include "unicode/schriter.h" #include "unicode/ustring.h" #include #include #include #include void printUnicodeString(const UnicodeString &s) { char charBuf[1000]; s.extract(0, s.length(), charBuf, sizeof(charBuf)-1, 0); charBuf[sizeof(charBuf)-1] = 0; cout << charBuf; } void printUChar(UChar32 ch) { char charBuf[1000]; charBuf[sizeof(charBuf)-1] = 0; if(ch < 127) { cout << (char) ch; } else if (ch == CharacterIterator::DONE) { cout << "[CharacterIterator::DONE = 0xFFFF]"; } else { cout << "[" << ch << "]"; } } class Test { public: void TestUChariter(); void TestStringiter(); }; void Test::TestUChariter() { const char testChars[] = "Now is the time for all good men to come " "to the aid of their country."; UnicodeString testString(testChars,""); const UChar *testText = testString.getTerminatedBuffer(); UCharCharacterIterator iter(testText, u_strlen(testText)); UCharCharacterIterator* test2 = (UCharCharacterIterator*)iter.clone(); cout << "testText = " << testChars; if (iter != *test2 ) { printf("clone() or equals() failed: Two clones tested unequal\n"); } UnicodeString result1, result2; // getting and comparing the text within the iterators iter.getText(result1); test2->getText(result2); if (result1 != result2) { printf("iter.getText() != clone.getText()\n"); } cout << endl; // Demonstrates seeking forward using the iterator. cout << "Forward = "; UChar c = iter.first(); printUChar(c); // The first char int32_t i = 0; if (iter.startIndex() != 0 || iter.endIndex() != u_strlen(testText)) { printf("startIndex() or endIndex() failed\n"); } // Testing forward iteration... do { if (c == CharacterIterator::DONE && i != u_strlen(testText)) { printf("Iterator reached end prematurely"); } else if (c != testText[i]) { printf("Character mismatch at position %d\n" + i); } if (iter.current() != c) { printf("current() isn't working right"); } if (iter.getIndex() != i) { printf("getIndex() isn't working right\n"); } if (c != CharacterIterator::DONE) { c = iter.next(); i++; } cout << "|"; printUChar(c); } while (c != CharacterIterator::DONE); delete test2; cout << endl; } void Test::TestStringiter() { const char testChars[] = "Now is the time for all good men to come " "to the aid of their country."; UnicodeString testString(testChars,""); const UChar *testText = testString.getTerminatedBuffer(); StringCharacterIterator iter(testText, u_strlen(testText)); StringCharacterIterator* test2 = (StringCharacterIterator*)iter.clone(); if (iter != *test2 ) { printf("clone() or equals() failed: Two clones tested unequal\n"); } UnicodeString result1, result2; // getting and comparing the text within the iterators iter.getText(result1); test2->getText(result2); if (result1 != result2) { printf("getText() failed\n"); } cout << "Backwards: "; UChar c = iter.last(); printUChar(c); int32_t i = iter.endIndex(); i--; // already printed out the last char if (iter.startIndex() != 0 || iter.endIndex() != u_strlen(testText)) { printf("startIndex() or endIndex() failed\n"); } // Testing backward iteration over a range... do { if (c == CharacterIterator::DONE) { printf("Iterator reached end prematurely\n"); } else if (c != testText[i]) { printf("Character mismatch at position %d\n" + i); } if (iter.current() != c) { printf("current() isn't working right\n"); } if (iter.getIndex() != i) { printf("getIndex() isn't working right [%d should be %d]\n", iter.getIndex(), i); } if (c != CharacterIterator::DONE) { c = iter.previous(); i--; } cout << "|"; printUChar(c); } while (c != CharacterIterator::DONE); cout << endl; delete test2; } /* Creating and using text boundaries */ int main( void ) { cout << "ICU Iterator Sample Program (C++)\n\n"; Test t; cout << endl; cout << "Test::TestUCharIter()" << endl; t.TestUChariter(); cout << "-----" << endl; cout << "Test::TestStringchariter()" << endl; t.TestStringiter(); cout << "-----" << endl; return 0; }