| /* |
| ******************************************************************************* |
| * |
| * © 2016 and later: Unicode, Inc. and others. |
| * License & terms of use: http://www.unicode.org/copyright.html |
| * |
| ******************************************************************************* |
| ******************************************************************************* |
| * |
| * Copyright (C) 2002-2011, International Business Machines |
| * Corporation and others. All Rights Reserved. |
| * |
| ******************************************************************************* |
| */ |
| |
| #include "unicode/uchriter.h" |
| #include "unicode/schriter.h" |
| #include "unicode/ustring.h" |
| #include <stdio.h> |
| #include <unicode/brkiter.h> |
| #include <unicode/ustdio.h> |
| #include <stdlib.h> |
| |
| static UFILE *out; |
| |
| using icu::CharacterIterator; |
| using icu::StringCharacterIterator; |
| using icu::UCharCharacterIterator; |
| using icu::UnicodeString; |
| |
| void printUnicodeString(const UnicodeString &s) |
| { |
| u_fprintf(out, "%S", &s); |
| } |
| |
| void printUChar(UChar32 ch) |
| { |
| if(ch < 127) { |
| u_fprintf(out, "%C", (UChar) ch); |
| } else if (ch == CharacterIterator::DONE) { |
| u_fprintf(out, "[CharacterIterator::DONE = 0xFFFF]"); |
| } else { |
| u_fprintf(out, "[%X]", 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 = iter.clone(); |
| |
| u_fprintf(out, "testText = %s", testChars); |
| |
| if (iter != *test2 ) { |
| u_fprintf(out, "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) { |
| u_fprintf(out, "iter.getText() != clone.getText()\n"); |
| } |
| |
| u_fprintf(out, "\n"); |
| |
| // Demonstrates seeking forward using the iterator. |
| u_fprintf(out, "Forward = "); |
| |
| UChar c = iter.first(); |
| printUChar(c); // The first char |
| int32_t i = 0; |
| |
| if (iter.startIndex() != 0 || iter.endIndex() != u_strlen(testText)) { |
| u_fprintf(out, "startIndex() or endIndex() failed\n"); |
| } |
| |
| |
| // Testing forward iteration... |
| do { |
| if (c == CharacterIterator::DONE && i != u_strlen(testText)) { |
| u_fprintf(out, "Iterator reached end prematurely"); |
| } |
| else if (c != testText[i]) { |
| u_fprintf(out, "Character mismatch at position %d\n" + i); |
| } |
| if (iter.current() != c) { |
| u_fprintf(out, "current() isn't working right"); |
| } |
| if (iter.getIndex() != i) { |
| u_fprintf(out, "getIndex() isn't working right\n"); |
| } |
| if (c != CharacterIterator::DONE) { |
| c = iter.next(); |
| i++; |
| } |
| |
| u_fprintf(out, "|"); |
| printUChar(c); |
| |
| } while (c != CharacterIterator::DONE); |
| |
| delete test2; |
| u_fprintf(out, "\n"); |
| } |
| |
| |
| 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 = iter.clone(); |
| |
| if (iter != *test2 ) { |
| u_fprintf(out, "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) { |
| u_fprintf(out, "getText() failed\n"); |
| } |
| |
| u_fprintf(out, "Backwards: "); |
| |
| UChar c = iter.last(); |
| int32_t i = iter.endIndex(); |
| |
| printUChar(c); |
| i--; // already printed out the last char |
| |
| if (iter.startIndex() != 0 || iter.endIndex() != u_strlen(testText)) { |
| u_fprintf(out, "startIndex() or endIndex() failed\n"); |
| } |
| |
| // Testing backward iteration over a range... |
| do { |
| if (c == CharacterIterator::DONE) { |
| u_fprintf(out, "Iterator reached end prematurely\n"); |
| } |
| else if (c != testText[i]) { |
| u_fprintf(out, "Character mismatch at position %d\n", i); |
| } |
| if (iter.current() != c) { |
| u_fprintf(out, "current() isn't working right\n"); |
| } |
| if (iter.getIndex() != i) { |
| u_fprintf(out, "getIndex() isn't working right [%d should be %d]\n", iter.getIndex(), i); |
| } |
| if (c != CharacterIterator::DONE) { |
| c = iter.previous(); |
| i--; |
| } |
| |
| u_fprintf(out, "|"); |
| printUChar(c); |
| } while (c != CharacterIterator::DONE); |
| |
| u_fprintf(out, "\n"); |
| delete test2; |
| } |
| |
| /* Creating and using text boundaries */ |
| int main( void ) |
| { |
| UErrorCode status = U_ZERO_ERROR; |
| |
| out = u_finit(stdout, NULL, NULL); |
| |
| u_fprintf(out, "ICU Iteration Sample Program (C++)\n\n"); |
| |
| Test t; |
| |
| u_fprintf(out, "\n"); |
| u_fprintf(out, "Test::TestUCharIter()\n"); |
| |
| t.TestUChariter(); |
| |
| u_fprintf(out, "-----\n"); |
| u_fprintf(out, "Test::TestStringchariter()\n"); |
| |
| t.TestStringiter(); |
| |
| u_fprintf(out, "-----\n"); |
| |
| return 0; |
| } |