1/* 2******************************************************************************* 3* 4* Copyright (C) 2002-2003, International Business Machines 5* Corporation and others. All Rights Reserved. 6* 7******************************************************************************* 8*/ 9 10#include <stdio.h> 11#include <unicode/brkiter.h> 12#include <stdlib.h> 13 14U_CFUNC int c_main(void); 15 16 17void printUnicodeString(const UnicodeString &s) { 18 char charBuf[1000]; 19 s.extract(0, s.length(), charBuf, sizeof(charBuf)-1, 0); 20 charBuf[sizeof(charBuf)-1] = 0; 21 printf("%s", charBuf); 22} 23 24 25void printTextRange( BreakIterator& iterator, 26 int32_t start, int32_t end ) 27{ 28 CharacterIterator *strIter = iterator.getText().clone(); 29 UnicodeString s; 30 strIter->getText(s); 31 32 printf(" %ld %ld\t", (long)start, (long)end); 33 printUnicodeString(UnicodeString(s, 0, start)); 34 printf("|"); 35 printUnicodeString(UnicodeString(s, start, end-start)); 36 printf("|"); 37 printUnicodeString(UnicodeString(s, end)); 38 puts(""); 39 delete strIter; 40} 41 42 43/* Print each element in order: */ 44void printEachForward( BreakIterator& boundary) 45{ 46 int32_t start = boundary.first(); 47 for (int32_t end = boundary.next(); 48 end != BreakIterator::DONE; 49 start = end, end = boundary.next()) 50 { 51 printTextRange( boundary, start, end ); 52 } 53} 54 55/* Print each element in reverse order: */ 56void printEachBackward( BreakIterator& boundary) 57{ 58 int32_t end = boundary.last(); 59 for (int32_t start = boundary.previous(); 60 start != BreakIterator::DONE; 61 end = start, start = boundary.previous()) 62 { 63 printTextRange( boundary, start, end ); 64 } 65} 66 67/* Print the first element */ 68void printFirst(BreakIterator& boundary) 69{ 70 int32_t start = boundary.first(); 71 int32_t end = boundary.next(); 72 printTextRange( boundary, start, end ); 73} 74 75/* Print the last element */ 76void printLast(BreakIterator& boundary) 77{ 78 int32_t end = boundary.last(); 79 int32_t start = boundary.previous(); 80 printTextRange( boundary, start, end ); 81} 82 83/* Print the element at a specified position */ 84void printAt(BreakIterator &boundary, int32_t pos ) 85{ 86 int32_t end = boundary.following(pos); 87 int32_t start = boundary.previous(); 88 printTextRange( boundary, start, end ); 89} 90 91/* Creating and using text boundaries */ 92int main( void ) 93{ 94 puts("ICU Break Iterator Sample Program\n"); 95 puts("C++ Break Iteration\n"); 96 BreakIterator* boundary; 97 UnicodeString stringToExamine("Aaa bbb ccc. Ddd eee fff."); 98 printf("Examining: "); 99 printUnicodeString(stringToExamine); 100 puts(""); 101 102 //print each sentence in forward and reverse order 103 UErrorCode status = U_ZERO_ERROR; 104 boundary = BreakIterator::createSentenceInstance( 105 Locale::getUS(), status ); 106 if (U_FAILURE(status)) { 107 printf("failed to create sentence break iterator. status = %s", 108 u_errorName(status)); 109 exit(1); 110 } 111 112 boundary->setText(stringToExamine); 113 puts("\n Sentence Boundaries... "); 114 puts("----- forward: -----------"); 115 printEachForward(*boundary); 116 puts("----- backward: ----------"); 117 printEachBackward(*boundary); 118 delete boundary; 119 120 //print each word in order 121 printf("\n Word Boundaries... \n"); 122 boundary = BreakIterator::createWordInstance( 123 Locale::getUS(), status); 124 boundary->setText(stringToExamine); 125 puts("----- forward: -----------"); 126 printEachForward(*boundary); 127 //print first element 128 puts("----- first: -------------"); 129 printFirst(*boundary); 130 //print last element 131 puts("----- last: --------------"); 132 printLast(*boundary); 133 //print word at charpos 10 134 puts("----- at pos 10: ---------"); 135 printAt(*boundary, 10 ); 136 137 delete boundary; 138 139 puts("\nEnd C++ Break Iteration"); 140 141 // Call the C version 142 return c_main(); 143} 144