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 14 U_CFUNC int c_main(void); 15 16 17 void 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 25 void 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: */ 44 void 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: */ 56 void 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 */ 68 void 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 */ 76 void 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 */ 84 void 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 */ 92 int 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