/* ******************************************************************************* * * Copyright (C) 2002-2003, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* */ #include #include #include U_CFUNC int c_main(void); 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 printTextRange( BreakIterator& iterator, int32_t start, int32_t end ) { CharacterIterator *strIter = iterator.getText().clone(); UnicodeString s; strIter->getText(s); cout << " " << start << " " << end << " |" ; printUnicodeString(s); cout << "|" << '\n'; delete strIter; } /* Print each element in order: */ void printEachForward( BreakIterator& boundary) { int32_t start = boundary.first(); for (int32_t end = boundary.next(); end != BreakIterator::DONE; start = end, end = boundary.next()) { printTextRange( boundary, start, end ); } } /* Print each element in reverse order: */ void printEachBackward( BreakIterator& boundary) { int32_t end = boundary.last(); for (int32_t start = boundary.previous(); start != BreakIterator::DONE; end = start, start = boundary.previous()) { printTextRange( boundary, start, end ); } } /* Print the first element */ void printFirst(BreakIterator& boundary) { int32_t start = boundary.first(); int32_t end = boundary.next(); printTextRange( boundary, start, end ); } /* Print the last element */ void printLast(BreakIterator& boundary) { int32_t end = boundary.last(); int32_t start = boundary.previous(); printTextRange( boundary, start, end ); } /* Print the element at a specified position */ void printAt(BreakIterator &boundary, int32_t pos ) { int32_t end = boundary.following(pos); int32_t start = boundary.previous(); printTextRange( boundary, start, end ); } /* Creating and using text boundaries */ int main( void ) { cout << "ICU Break Iterator Sample Program\n\n"; cout << "C++ Break Iteration\n\n"; BreakIterator* boundary; UnicodeString stringToExamine("Aaa bbb ccc. Ddd eee fff."); cout << "Examining: "; printUnicodeString(stringToExamine); cout << endl; //print each sentence in forward and reverse order UErrorCode status = U_ZERO_ERROR; boundary = BreakIterator::createSentenceInstance( Locale::getUS(), status ); if (U_FAILURE(status)) { cout << "failed to create sentence break iterator. status = " << u_errorName(status); exit(1); } boundary->setText(stringToExamine); cout << "\n Sentence Boundaries... \n"; cout << "----- forward: -----------" << '\n'; printEachForward(*boundary); cout << "----- backward: ----------" << '\n'; printEachBackward(*boundary); delete boundary; //print each word in order cout << "\n Word Boundaries... \n"; boundary = BreakIterator::createWordInstance( Locale::getUS(), status); boundary->setText(stringToExamine); cout << "----- forward: -----------" << '\n'; printEachForward(*boundary); //print first element cout << "----- first: -------------" << '\n'; printFirst(*boundary); //print last element cout << "----- last: --------------" << '\n'; printLast(*boundary); //print word at charpos 10 cout << "----- at pos 10: ---------" << '\n'; printAt(*boundary, 10 ); delete boundary; cout.flush(); // Call the C version return c_main(); }