|  | /* | 
|  | ******************************************************************************* | 
|  | * | 
|  | *   © 2016 and later: Unicode, Inc. and others. | 
|  | *   License & terms of use: http://www.unicode.org/copyright.html | 
|  | * | 
|  | ******************************************************************************* | 
|  | ******************************************************************************* | 
|  | * | 
|  | *   Copyright (C) 2002, International Business Machines | 
|  | *   Corporation and others.  All Rights Reserved. | 
|  | * | 
|  | ******************************************************************************* | 
|  | */ | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <unicode/ustring.h> | 
|  | #include <unicode/ubrk.h> | 
|  |  | 
|  | U_CFUNC int c_main(void); | 
|  |  | 
|  | void printTextRange(UChar* str, int32_t start, int32_t end) | 
|  | { | 
|  | char    charBuf[1000]; | 
|  | UChar   savedEndChar; | 
|  |  | 
|  | savedEndChar = str[end]; | 
|  | str[end] = 0; | 
|  | u_austrncpy(charBuf, str+start, sizeof(charBuf)-1); | 
|  | charBuf[sizeof(charBuf)-1]=0; | 
|  | printf("string[%2d..%2d] \"%s\"\n", start, end-1, charBuf); | 
|  | str[end] = savedEndChar; | 
|  | } | 
|  |  | 
|  |  | 
|  |  | 
|  | /* Print each element in order: */ | 
|  | void printEachForward( UBreakIterator* boundary, UChar* str) { | 
|  | int32_t end; | 
|  | int32_t start = ubrk_first(boundary); | 
|  | for (end = ubrk_next(boundary); end != UBRK_DONE; start = end, end = | 
|  | ubrk_next(boundary)) { | 
|  | printTextRange(str, start, end ); | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | /* Print each element in reverse order: */ | 
|  | void printEachBackward( UBreakIterator* boundary, UChar* str) { | 
|  | int32_t start; | 
|  | int32_t end = ubrk_last(boundary); | 
|  | for (start = ubrk_previous(boundary); start != UBRK_DONE;  end = start, | 
|  | start =ubrk_previous(boundary)) { | 
|  | printTextRange( str, start, end ); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Print first element */ | 
|  | void printFirst(UBreakIterator* boundary, UChar* str) { | 
|  | int32_t end; | 
|  | int32_t start = ubrk_first(boundary); | 
|  | end = ubrk_next(boundary); | 
|  | printTextRange( str, start, end ); | 
|  | } | 
|  |  | 
|  | /* Print last element */ | 
|  | void printLast(UBreakIterator* boundary, UChar* str) { | 
|  | int32_t start; | 
|  | int32_t end = ubrk_last(boundary); | 
|  | start = ubrk_previous(boundary); | 
|  | printTextRange(str, start, end ); | 
|  | } | 
|  |  | 
|  | /* Print the element at a specified position */ | 
|  |  | 
|  | void printAt(UBreakIterator* boundary, int32_t pos , UChar* str) { | 
|  | int32_t start; | 
|  | int32_t end = ubrk_following(boundary, pos); | 
|  | start = ubrk_previous(boundary); | 
|  | printTextRange(str, start, end ); | 
|  | } | 
|  |  | 
|  | /* Creating and using text boundaries*/ | 
|  |  | 
|  | int c_main( void ) { | 
|  | UBreakIterator *boundary; | 
|  | char           cStringToExamine[] = "Aaa bbb ccc. Ddd eee fff."; | 
|  | UChar          stringToExamine[sizeof(cStringToExamine)+1]; | 
|  | UErrorCode     status = U_ZERO_ERROR; | 
|  |  | 
|  | printf("\n\n" | 
|  | "C Boundary Analysis\n" | 
|  | "-------------------\n\n"); | 
|  |  | 
|  | printf("Examining: %s\n", cStringToExamine); | 
|  | u_uastrcpy(stringToExamine, cStringToExamine); | 
|  |  | 
|  | /*print each sentence in forward and reverse order*/ | 
|  | boundary = ubrk_open(UBRK_SENTENCE, "en_us", stringToExamine, | 
|  | -1, &status); | 
|  | if (U_FAILURE(status)) { | 
|  | printf("ubrk_open error: %s\n", u_errorName(status)); | 
|  | exit(1); | 
|  | } | 
|  |  | 
|  | printf("\n----- Sentence Boundaries, forward: -----------\n"); | 
|  | printEachForward(boundary, stringToExamine); | 
|  | printf("\n----- Sentence Boundaries, backward: ----------\n"); | 
|  | printEachBackward(boundary, stringToExamine); | 
|  | ubrk_close(boundary); | 
|  |  | 
|  | /*print each word in order*/ | 
|  | boundary = ubrk_open(UBRK_WORD, "en_us", stringToExamine, | 
|  | u_strlen(stringToExamine), &status); | 
|  | printf("\n----- Word Boundaries, forward: -----------\n"); | 
|  | printEachForward(boundary, stringToExamine); | 
|  | printf("\n----- Word Boundaries, backward: ----------\n"); | 
|  | printEachBackward(boundary, stringToExamine); | 
|  | /*print first element*/ | 
|  | printf("\n----- first: -------------\n"); | 
|  | printFirst(boundary, stringToExamine); | 
|  | /*print last element*/ | 
|  | printf("\n----- last: --------------\n"); | 
|  | printLast(boundary, stringToExamine); | 
|  | /*print word at charpos 10 */ | 
|  | printf("\n----- at pos 10: ---------\n"); | 
|  | printAt(boundary, 10 , stringToExamine); | 
|  |  | 
|  | ubrk_close(boundary); | 
|  |  | 
|  | printf("\nEnd of C boundary analysis\n"); | 
|  | return 0; | 
|  | } |