1/* 2******************************************************************************* 3* 4* Copyright (C) 2002, International Business Machines 5* Corporation and others. All Rights Reserved. 6* 7******************************************************************************* 8*/ 9 10#include <stdio.h> 11#include <stdlib.h> 12#include <unicode/ustring.h> 13#include <unicode/ubrk.h> 14 15U_CFUNC int c_main(void); 16 17void printTextRange(UChar* str, int32_t start, int32_t end) 18{ 19 char charBuf[1000]; 20 UChar savedEndChar; 21 22 savedEndChar = str[end]; 23 str[end] = 0; 24 u_austrncpy(charBuf, str+start, sizeof(charBuf)-1); 25 charBuf[sizeof(charBuf)-1]=0; 26 printf("string[%2d..%2d] \"%s\"\n", start, end-1, charBuf); 27 str[end] = savedEndChar; 28} 29 30 31 32/* Print each element in order: */ 33void printEachForward( UBreakIterator* boundary, UChar* str) { 34 int32_t end; 35 int32_t start = ubrk_first(boundary); 36 for (end = ubrk_next(boundary); end != UBRK_DONE; start = end, end = 37 ubrk_next(boundary)) { 38 printTextRange(str, start, end ); 39 } 40} 41 42 43/* Print each element in reverse order: */ 44void printEachBackward( UBreakIterator* boundary, UChar* str) { 45 int32_t start; 46 int32_t end = ubrk_last(boundary); 47 for (start = ubrk_previous(boundary); start != UBRK_DONE; end = start, 48 start =ubrk_previous(boundary)) { 49 printTextRange( str, start, end ); 50 } 51} 52 53/* Print first element */ 54void printFirst(UBreakIterator* boundary, UChar* str) { 55 int32_t end; 56 int32_t start = ubrk_first(boundary); 57 end = ubrk_next(boundary); 58 printTextRange( str, start, end ); 59} 60 61/* Print last element */ 62void printLast(UBreakIterator* boundary, UChar* str) { 63 int32_t start; 64 int32_t end = ubrk_last(boundary); 65 start = ubrk_previous(boundary); 66 printTextRange(str, start, end ); 67} 68 69/* Print the element at a specified position */ 70 71void printAt(UBreakIterator* boundary, int32_t pos , UChar* str) { 72 int32_t start; 73 int32_t end = ubrk_following(boundary, pos); 74 start = ubrk_previous(boundary); 75 printTextRange(str, start, end ); 76} 77 78/* Creating and using text boundaries*/ 79 80int c_main( void ) { 81 UBreakIterator *boundary; 82 char cStringToExamine[] = "Aaa bbb ccc. Ddd eee fff."; 83 UChar stringToExamine[sizeof(cStringToExamine)+1]; 84 UErrorCode status = U_ZERO_ERROR; 85 86 printf("\n\n" 87 "C Boundary Analysis\n" 88 "-------------------\n\n"); 89 90 printf("Examining: %s\n", cStringToExamine); 91 u_uastrcpy(stringToExamine, cStringToExamine); 92 93 /*print each sentence in forward and reverse order*/ 94 boundary = ubrk_open(UBRK_SENTENCE, "en_us", stringToExamine, 95 -1, &status); 96 if (U_FAILURE(status)) { 97 printf("ubrk_open error: %s\n", u_errorName(status)); 98 exit(1); 99 } 100 101 printf("\n----- Sentence Boundaries, forward: -----------\n"); 102 printEachForward(boundary, stringToExamine); 103 printf("\n----- Sentence Boundaries, backward: ----------\n"); 104 printEachBackward(boundary, stringToExamine); 105 ubrk_close(boundary); 106 107 /*print each word in order*/ 108 boundary = ubrk_open(UBRK_WORD, "en_us", stringToExamine, 109 u_strlen(stringToExamine), &status); 110 printf("\n----- Word Boundaries, forward: -----------\n"); 111 printEachForward(boundary, stringToExamine); 112 printf("\n----- Word Boundaries, backward: ----------\n"); 113 printEachBackward(boundary, stringToExamine); 114 /*print first element*/ 115 printf("\n----- first: -------------\n"); 116 printFirst(boundary, stringToExamine); 117 /*print last element*/ 118 printf("\n----- last: --------------\n"); 119 printLast(boundary, stringToExamine); 120 /*print word at charpos 10 */ 121 printf("\n----- at pos 10: ---------\n"); 122 printAt(boundary, 10 , stringToExamine); 123 124 ubrk_close(boundary); 125 126 printf("\nEnd of C boundary analysis\n"); 127 return 0; 128} 129