/* * Copyright (C) 2008-2009, International Business Machines Corporation and Others. * All rights reserved. */ #include "unicode/utypes.h" #include "cmemory.h" #include "unicode/bms.h" #include "unicode/unistr.h" #include "unicode/colldata.h" #include "unicode/bmsearch.h" #if !UCONFIG_NO_COLLATION && !UCONFIG_NO_BREAK_ITERATION //#define USE_SAFE_CASTS #ifdef USE_SAFE_CASTS #define STATIC_CAST(type,value) static_cast(value) #define CONST_CAST(type,value) const_cast(value) #else #define STATIC_CAST(type,value) (type) (value) #define CONST_CAST(type,value) (type) (value) #endif U_NAMESPACE_USE U_CAPI UCD * U_EXPORT2 ucd_open(UCollator *coll, UErrorCode *status) { return STATIC_CAST(UCD *, CollData::open(coll, *status)); } U_CAPI void U_EXPORT2 ucd_close(UCD *ucd) { CollData *data = STATIC_CAST(CollData *, ucd); CollData::close(data); } U_CAPI UCollator * U_EXPORT2 ucd_getCollator(UCD *ucd) { CollData *data = STATIC_CAST(CollData *, ucd); return data->getCollator(); } U_CAPI void U_EXPORT2 ucd_freeCache() { CollData::freeCollDataCache(); } U_CAPI void U_EXPORT2 ucd_flushCache() { CollData::flushCollDataCache(); } struct BMS { BoyerMooreSearch *bms; const UnicodeString *targetString; }; U_CAPI BMS * U_EXPORT2 bms_open(UCD *ucd, const UChar *pattern, int32_t patternLength, const UChar *target, int32_t targetLength, UErrorCode *status) { BMS *bms = STATIC_CAST(BMS *, uprv_malloc(sizeof(BMS))); if (bms == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; return NULL; } CollData *data = (CollData *) ucd; UnicodeString patternString(pattern, patternLength); if (target != NULL) { bms->targetString = new UnicodeString(target, targetLength); if (bms->targetString == NULL) { bms->bms = NULL; *status = U_MEMORY_ALLOCATION_ERROR; return bms; } } else { bms->targetString = NULL; } bms->bms = new BoyerMooreSearch(data, patternString, bms->targetString, *status); if (bms->bms == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; } return bms; } U_CAPI void U_EXPORT2 bms_close(BMS *bms) { delete bms->bms; delete bms->targetString; uprv_free(bms); } U_CAPI UBool U_EXPORT2 bms_empty(BMS *bms) { return bms->bms->empty(); } U_CAPI UCD * U_EXPORT2 bms_getData(BMS *bms) { return STATIC_CAST(UCD *, bms->bms->getData()); } U_CAPI UBool U_EXPORT2 bms_search(BMS *bms, int32_t offset, int32_t *start, int32_t *end) { return bms->bms->search(offset, *start, *end); } U_CAPI void U_EXPORT2 bms_setTargetString(BMS *bms, const UChar *target, int32_t targetLength, UErrorCode *status) { if (U_FAILURE(*status)) { return; } if (bms->targetString != NULL) { delete bms->targetString; } if (target != NULL) { bms->targetString = new UnicodeString(target, targetLength); } else { bms->targetString = NULL; } bms->bms->setTargetString(bms->targetString, *status); } #endif