/*
* 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<type>(value)
#define CONST_CAST(type,value) const_cast<type>(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