diff --git a/icu4c/source/samples/citer/citer.cpp b/icu4c/source/samples/citer/citer.cpp new file mode 100644 index 0000000000..7561e74dbb --- /dev/null +++ b/icu4c/source/samples/citer/citer.cpp @@ -0,0 +1,183 @@ +/* +******************************************************************************* +* +* 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; +} diff --git a/icu4c/source/samples/citer/readme.txt b/icu4c/source/samples/citer/readme.txt new file mode 100644 index 0000000000..2519e74228 --- /dev/null +++ b/icu4c/source/samples/citer/readme.txt @@ -0,0 +1,59 @@ +Copyright (c) 2003, International Business Machines Corporation and others. All Rights Reserved. +citer: Character Iteration + +This sample demonstrates + Using ICU to determine the linguistic boundaries within text + + +Files: + citer.cpp Main source file in C++ + citer.dsw Windows MSVC workspace. Double-click this to get started. + citer.dsp Windows MSVC project file + +To Build citer on Windows + 1. Install and build ICU + 2. In MSVC, open the workspace file icu\samples\citer\citer.dsw + 3. Choose a Debug or Release build. + 4. Build. + +To Run on Windows + 1. Start a command shell window + 2. Add ICU's bin directory to the path, e.g. + set PATH=c:\icu\bin;%PATH% + (Use the path to where ever ICU is on your system.) + 3. cd into the citer directory, e.g. + cd c:\icu\source\samples\citer\debug + 4. Run it + citer + +To Build on Unixes + 1. Build ICU. + Specify an ICU install directory when running configure, + using the --prefix option. The steps to build ICU will look something + like this: + cd /source + runConfigureICU --prefix [other options] + gmake all + + 2. Install ICU, + gmake install + + 3. Compile + cd /source/samples/citer + gmake ICU_PREFIX=/source/samples/citer + + gmake ICU_PREFIX= check + -or- + + export LD_LIBRARY_PATH=/lib:.:$LD_LIBRARY_PATH + citer + + + Note: The name of the LD_LIBRARY_PATH variable is different on some systems. + If in doubt, run the sample using "gmake check", and note the name of + the variable that is used there. LD_LIBRARY_PATH is the correct name + for Linux and Solaris. +