1/* 2 * Copyright (C) 2008-2011, 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 && !UCONFIG_NO_BREAK_ITERATION 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 if (ucd != NULL) { 38 CollData *data = STATIC_CAST(CollData *, ucd); 39 40 CollData::close(data); 41 } 42} 43 44U_CAPI UCollator * U_EXPORT2 45ucd_getCollator(UCD *ucd) 46{ 47 CollData *data = STATIC_CAST(CollData *, ucd); 48 49 return data->getCollator(); 50} 51 52U_CAPI void U_EXPORT2 53ucd_freeCache() 54{ 55 CollData::freeCollDataCache(); 56} 57 58U_CAPI void U_EXPORT2 59ucd_flushCache() 60{ 61 CollData::flushCollDataCache(); 62} 63 64struct BMS 65{ 66 BoyerMooreSearch *bms; 67 const UnicodeString *targetString; 68}; 69 70U_CAPI BMS * U_EXPORT2 71bms_open(UCD *ucd, 72 const UChar *pattern, int32_t patternLength, 73 const UChar *target, int32_t targetLength, 74 UErrorCode *status) 75{ 76 BMS *bms = STATIC_CAST(BMS *, uprv_malloc(sizeof(BMS))); 77 78 if (bms == NULL) { 79 *status = U_MEMORY_ALLOCATION_ERROR; 80 return NULL; 81 } 82 83 CollData *data = (CollData *) ucd; 84 UnicodeString patternString(pattern, patternLength); 85 86 if (target != NULL) { 87 bms->targetString = new UnicodeString(target, targetLength); 88 89 if (bms->targetString == NULL) { 90 bms->bms = NULL; 91 *status = U_MEMORY_ALLOCATION_ERROR; 92 return bms; 93 } 94 } else { 95 bms->targetString = NULL; 96 } 97 98 bms->bms = new BoyerMooreSearch(data, patternString, bms->targetString, *status); 99 100 if (bms->bms == NULL) { 101 *status = U_MEMORY_ALLOCATION_ERROR; 102 } 103 104 return bms; 105} 106 107U_CAPI void U_EXPORT2 108bms_close(BMS *bms) 109{ 110 delete bms->bms; 111 112 delete bms->targetString; 113 114 uprv_free(bms); 115} 116 117U_CAPI UBool U_EXPORT2 118bms_empty(BMS *bms) 119{ 120 return bms->bms->empty(); 121} 122 123U_CAPI UCD * U_EXPORT2 124bms_getData(BMS *bms) 125{ 126 return STATIC_CAST(UCD *, bms->bms->getData()); 127} 128 129U_CAPI UBool U_EXPORT2 130bms_search(BMS *bms, int32_t offset, int32_t *start, int32_t *end) 131{ 132 return bms->bms->search(offset, *start, *end); 133} 134 135U_CAPI void U_EXPORT2 136bms_setTargetString(BMS *bms, const UChar *target, int32_t targetLength, UErrorCode *status) 137{ 138 if (U_FAILURE(*status)) { 139 return; 140 } 141 142 if (bms->targetString != NULL) { 143 delete bms->targetString; 144 } 145 146 if (target != NULL) { 147 bms->targetString = new UnicodeString(target, targetLength); 148 } else { 149 bms->targetString = NULL; 150 } 151 152 bms->bms->setTargetString(bms->targetString, *status); 153} 154 155#endif 156