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 26 U_NAMESPACE_USE 27 28 U_CAPI UCD * U_EXPORT2 29 ucd_open(UCollator *coll, UErrorCode *status) 30 { 31 return STATIC_CAST(UCD *, CollData::open(coll, *status)); 32 } 33 34 U_CAPI void U_EXPORT2 35 ucd_close(UCD *ucd) 36 { 37 if (ucd != NULL) { 38 CollData *data = STATIC_CAST(CollData *, ucd); 39 40 CollData::close(data); 41 } 42 } 43 44 U_CAPI UCollator * U_EXPORT2 45 ucd_getCollator(UCD *ucd) 46 { 47 CollData *data = STATIC_CAST(CollData *, ucd); 48 49 return data->getCollator(); 50 } 51 52 U_CAPI void U_EXPORT2 53 ucd_freeCache() 54 { 55 CollData::freeCollDataCache(); 56 } 57 58 U_CAPI void U_EXPORT2 59 ucd_flushCache() 60 { 61 CollData::flushCollDataCache(); 62 } 63 64 struct BMS 65 { 66 BoyerMooreSearch *bms; 67 const UnicodeString *targetString; 68 }; 69 70 U_CAPI BMS * U_EXPORT2 71 bms_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 107 U_CAPI void U_EXPORT2 108 bms_close(BMS *bms) 109 { 110 delete bms->bms; 111 112 delete bms->targetString; 113 114 uprv_free(bms); 115 } 116 117 U_CAPI UBool U_EXPORT2 118 bms_empty(BMS *bms) 119 { 120 return bms->bms->empty(); 121 } 122 123 U_CAPI UCD * U_EXPORT2 124 bms_getData(BMS *bms) 125 { 126 return STATIC_CAST(UCD *, bms->bms->getData()); 127 } 128 129 U_CAPI UBool U_EXPORT2 130 bms_search(BMS *bms, int32_t offset, int32_t *start, int32_t *end) 131 { 132 return bms->bms->search(offset, *start, *end); 133 } 134 135 U_CAPI void U_EXPORT2 136 bms_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