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