| Viewing file:  break.cpp (4.12 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
/********************************************************************************
 *
 *   © 2016 and later: Unicode, Inc. and others.
 *   License & terms of use: http://www.unicode.org/copyright.html#License
 *
 *******************************************************************************
 *******************************************************************************
 *
 *   Copyright (C) 2002-2003, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
 */
 
 #include <stdio.h>
 #include <unicode/brkiter.h>
 #include <stdlib.h>
 
 using namespace icu;
 
 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;
 printf("%s", charBuf);
 }
 
 
 void printTextRange( BreakIterator& iterator,
 int32_t start, int32_t end )
 {
 CharacterIterator *strIter = iterator.getText().clone();
 UnicodeString  s;
 strIter->getText(s);
 
 printf(" %ld %ld\t", (long)start, (long)end);
 printUnicodeString(UnicodeString(s, 0, start));
 printf("|");
 printUnicodeString(UnicodeString(s, start, end-start));
 printf("|");
 printUnicodeString(UnicodeString(s, end));
 puts("");
 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 )
 {
 puts("ICU Break Iterator Sample Program\n");
 puts("C++ Break Iteration\n");
 BreakIterator* boundary;
 UnicodeString stringToExamine("Aaa bbb ccc. Ddd eee fff.");
 printf("Examining: ");
 printUnicodeString(stringToExamine);
 puts("");
 
 //print each sentence in forward and reverse order
 UErrorCode status = U_ZERO_ERROR;
 boundary = BreakIterator::createSentenceInstance(
 Locale::getUS(), status );
 if (U_FAILURE(status)) {
 printf("failed to create sentence break iterator.  status = %s",
 u_errorName(status));
 exit(1);
 }
 
 boundary->setText(stringToExamine);
 puts("\n Sentence Boundaries... ");
 puts("----- forward: -----------");
 printEachForward(*boundary);
 puts("----- backward: ----------");
 printEachBackward(*boundary);
 delete boundary;
 
 //print each word in order
 printf("\n Word Boundaries... \n");
 boundary = BreakIterator::createWordInstance(
 Locale::getUS(), status);
 boundary->setText(stringToExamine);
 puts("----- forward: -----------");
 printEachForward(*boundary);
 //print first element
 puts("----- first: -------------");
 printFirst(*boundary);
 //print last element
 puts("----- last: --------------");
 printLast(*boundary);
 //print word at charpos 10
 puts("----- at pos 10: ---------");
 printAt(*boundary, 10 );
 
 delete boundary;
 
 puts("\nEnd C++ Break Iteration");
 
 // Call the C version
 return c_main();
 }
 
 |