Home | History | Annotate | Download | only in i18n
      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