1/* 2 * Copyright (C) 2008-2009, International Business Machines Corporation and Others. 3 * All rights reserved. 4 */ 5 6#include "unicode/utypes.h" 7#include "cmemory.h" 8#include "unicode/bms.h" 9#include "unicode/unistr.h" 10#include "unicode/colldata.h" 11#include "unicode/bmsearch.h" 12 13 14#if !UCONFIG_NO_COLLATION 15 16 17//#define USE_SAFE_CASTS 18#ifdef USE_SAFE_CASTS 19#define STATIC_CAST(type,value) static_cast<type>(value) 20#define CONST_CAST(type,value) const_cast<type>(value) 21#else 22#define STATIC_CAST(type,value) (type) (value) 23#define CONST_CAST(type,value) (type) (value) 24#endif 25 26U_NAMESPACE_USE 27 28U_CAPI UCD * U_EXPORT2 29ucd_open(UCollator *coll, UErrorCode *status) 30{ 31 return STATIC_CAST(UCD *, CollData::open(coll, *status)); 32} 33 34U_CAPI void U_EXPORT2 35ucd_close(UCD *ucd) 36{ 37 CollData *data = STATIC_CAST(CollData *, ucd); 38 39 CollData::close(data); 40} 41 42U_CAPI UCollator * U_EXPORT2 43ucd_getCollator(UCD *ucd) 44{ 45 CollData *data = STATIC_CAST(CollData *, ucd); 46 47 return data->getCollator(); 48} 49 50U_CAPI void U_EXPORT2 51ucd_freeCache() 52{ 53 CollData::freeCollDataCache(); 54} 55 56U_CAPI void U_EXPORT2 57ucd_flushCache() 58{ 59 CollData::flushCollDataCache(); 60} 61 62struct BMS 63{ 64 BoyerMooreSearch *bms; 65 const UnicodeString *targetString; 66}; 67 68U_CAPI BMS * U_EXPORT2 69bms_open(UCD *ucd, 70 const UChar *pattern, int32_t patternLength, 71 const UChar *target, int32_t targetLength, 72 UErrorCode *status) 73{ 74 BMS *bms = STATIC_CAST(BMS *, uprv_malloc(sizeof(BMS))); 75 76 if (bms == NULL) { 77 *status = U_MEMORY_ALLOCATION_ERROR; 78 return NULL; 79 } 80 81 CollData *data = (CollData *) ucd; 82 UnicodeString patternString(pattern, patternLength); 83 84 if (target != NULL) { 85 bms->targetString = new UnicodeString(target, targetLength); 86 87 if (bms->targetString == NULL) { 88 bms->bms = NULL; 89 *status = U_MEMORY_ALLOCATION_ERROR; 90 return bms; 91 } 92 } else { 93 bms->targetString = NULL; 94 } 95 96 bms->bms = new BoyerMooreSearch(data, patternString, bms->targetString, *status); 97 98 if (bms->bms == NULL) { 99 *status = U_MEMORY_ALLOCATION_ERROR; 100 } 101 102 return bms; 103} 104 105U_CAPI void U_EXPORT2 106bms_close(BMS *bms) 107{ 108 delete bms->bms; 109 110 delete bms->targetString; 111 112 uprv_free(bms); 113} 114 115U_CAPI UBool U_EXPORT2 116bms_empty(BMS *bms) 117{ 118 return bms->bms->empty(); 119} 120 121U_CAPI UCD * U_EXPORT2 122bms_getData(BMS *bms) 123{ 124 return STATIC_CAST(UCD *, bms->bms->getData()); 125} 126 127U_CAPI UBool U_EXPORT2 128bms_search(BMS *bms, int32_t offset, int32_t *start, int32_t *end) 129{ 130 return bms->bms->search(offset, *start, *end); 131} 132 133U_CAPI void U_EXPORT2 134bms_setTargetString(BMS *bms, const UChar *target, int32_t targetLength, UErrorCode *status) 135{ 136 if (U_FAILURE(*status)) { 137 return; 138 } 139 140 if (bms->targetString != NULL) { 141 delete bms->targetString; 142 } 143 144 if (target != NULL) { 145 bms->targetString = new UnicodeString(target, targetLength); 146 } else { 147 bms->targetString = NULL; 148 } 149 150 bms->bms->setTargetString(bms->targetString, *status); 151} 152 153#endif 154