Home | History | Annotate | Download | only in break
      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