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