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