| /************************************************************************** |
| * |
| * Copyright (C) 2001, International Business Machines |
| * Corporation and others. All Rights Reserved. |
| * |
| *************************************************************************** |
| * file name: colex.cpp |
| * |
| * created on: 2001June8 |
| * created by: Helena Shih |
| * |
| * Sample code for the ICU Search C++ routines. |
| */ |
| #include <stdio.h> |
| #include "unicode/utypes.h" |
| #include "unicode/unistr.h" |
| #include "unicode/locid.h" |
| |
| #include "strsrch.h" |
| |
| int main() |
| { |
| UErrorCode status = U_ZERO_ERROR; |
| UnicodeString target("A quick fox jumped over the lazy dog.", ""); |
| UnicodeString easyPatterns[] = {"FoX", "CAT", "jump", "under" }; |
| int exactOffsets[] = { -1, -1, 12, -1 }; |
| int tertiaryOffsets[] = { 8, -1, 12, -1 }; |
| UnicodeString monkeyTarget("abcdefgh"); |
| UnicodeString monkeyTarget2("ijklmnop"); |
| |
| int i, j; |
| int pos = 0; |
| StringSearch *searchIter = new StringSearch(easyPatterns[0], target, status); |
| fprintf(stdout, "\n"); |
| if (U_FAILURE(status)) |
| { |
| fprintf(stderr, "Failed to create a StringSearch object for the default locale.\n"); |
| } |
| fprintf(stdout, "Try with default normalization mode and strength.\n"); |
| i = 0; |
| while (TRUE) |
| { |
| status = U_ZERO_ERROR; |
| searchIter->reset(); |
| pos = searchIter->next(); |
| if ( pos != exactOffsets[i] ) |
| fprintf(stdout, "Exact match failed at the index %d pattern.\n", i); |
| |
| i ++; |
| if (i == 4) { |
| break; |
| } |
| |
| searchIter->setPattern(easyPatterns[i], status); |
| if (U_FAILURE(status)) |
| { |
| fprintf(stderr, "Failed to set a pattern for %d element.\n", i); |
| continue; |
| } |
| } |
| fprintf(stdout, "Try now with strength == primary.\n"); |
| status = U_ZERO_ERROR; |
| searchIter->setStrength(Collator::PRIMARY, status); |
| if (U_FAILURE(status)) |
| { |
| fprintf(stderr, "Failed to set strength of the string search object.\n"); |
| } |
| searchIter->reset(); |
| searchIter->setPattern(easyPatterns[0], status); |
| if (U_FAILURE(status)) |
| { |
| fprintf(stderr, "Failed to set a pattern for the first element.\n"); |
| } |
| pos = searchIter->first(); |
| if (pos != tertiaryOffsets[0]) |
| fprintf(stdout, "Tertiary match failed at the first pattern.\n"); |
| for (i = 1; i < 4; i++) |
| { |
| status = U_ZERO_ERROR; |
| searchIter->setPattern(easyPatterns[i], status); |
| searchIter->reset(); |
| pos = searchIter->next(); |
| if (pos != tertiaryOffsets[i]) |
| fprintf(stdout, "Tertiary match failed at index %d pattern.\n", i); |
| } |
| // Going backwards |
| searchIter->reset(); |
| searchIter->setPattern(easyPatterns[--i], status); |
| if (U_FAILURE(status)) |
| { |
| fprintf(stderr, "Failed to set a pattern for the last element.\n"); |
| } |
| pos = searchIter->last(); |
| if (pos != tertiaryOffsets[i]) |
| fprintf(stdout, "Tertiary match failed at the last pattern.\n"); |
| for (; i >= 1 ; --i) |
| { |
| status = U_ZERO_ERROR; |
| searchIter->setPattern(easyPatterns[i-1], status); |
| searchIter->reset(); |
| pos = searchIter->previous(); |
| if (pos != tertiaryOffsets[i-1]) |
| fprintf(stdout, "Walking backwards: tertiary match failed at index %d pattern.\n", i); |
| } |
| status = U_ZERO_ERROR; |
| searchIter->setTarget(monkeyTarget); |
| if (U_FAILURE(status)) |
| { |
| fprintf(stderr, "Failed to set a pattern for the monkey target.\n"); |
| goto cleanup; |
| } |
| searchIter->setStrength(Collator::TERTIARY, status); |
| // change direction again |
| searchIter->reset(); |
| searchIter->setPattern(monkeyTarget, status); |
| if (U_FAILURE(status)) |
| { |
| fprintf(stderr, "Failed to set a pattern as monkey test itself.\n"); |
| } |
| pos = searchIter->first(); |
| if (pos == -1) |
| fprintf(stdout, "Matching monkey test itself failed.\n"); |
| for (i = 0; i < monkeyTarget.length() - 1; i++) |
| { |
| // will always find its substring |
| for (j = i+1; j < monkeyTarget.length(); j++) |
| { |
| UnicodeString temp; |
| status = U_ZERO_ERROR; |
| searchIter->reset(); |
| monkeyTarget.extract(i, j, temp); |
| searchIter->setPattern(temp, status); |
| if (U_FAILURE(status)) |
| { |
| fprintf(stderr, "Failed to set a pattern for the %d -th monkey pattern of length %d.\n", i, j); |
| continue; |
| } |
| pos = searchIter->next(); |
| if (pos == -1) |
| fprintf(stdout, "Monkey match failed at index %d in monkey pattern of length %d.\n", i, j); |
| } |
| } |
| status = U_ZERO_ERROR; |
| searchIter->setTarget(monkeyTarget2); |
| if (U_FAILURE(status)) |
| { |
| fprintf(stderr, "Failed to set a pattern for the monkey target2.\n"); |
| goto cleanup; |
| } |
| for (i = 0; i < monkeyTarget.length() - 1; i++) |
| { |
| // will never find the match |
| UnicodeString temp; |
| status = U_ZERO_ERROR; |
| monkeyTarget.extract(i, monkeyTarget.length(), temp); |
| searchIter->reset(); |
| searchIter->setPattern(temp, status); |
| if (U_FAILURE(status)) |
| { |
| fprintf(stderr, "Failed to set a pattern for the monkey pattern at offset index %d.\n", i); |
| continue; |
| } |
| pos = searchIter->next(); |
| if (pos != -1) |
| fprintf(stdout, "Monkey mismatch failed at index %d in monkey pattern.\n", i); |
| } |
| |
| cleanup: |
| delete searchIter; |
| return 0; |
| } |
| |