Home | History | Annotate | Download | only in i18n
      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 && !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     CollData *data = STATIC_CAST(CollData *, ucd);
     38 
     39     CollData::close(data);
     40 }
     41 
     42 U_CAPI UCollator * U_EXPORT2
     43 ucd_getCollator(UCD *ucd)
     44 {
     45     CollData *data = STATIC_CAST(CollData *, ucd);
     46 
     47     return data->getCollator();
     48 }
     49 
     50 U_CAPI void U_EXPORT2
     51 ucd_freeCache()
     52 {
     53     CollData::freeCollDataCache();
     54 }
     55 
     56 U_CAPI void U_EXPORT2
     57 ucd_flushCache()
     58 {
     59     CollData::flushCollDataCache();
     60 }
     61 
     62 struct BMS
     63 {
     64     BoyerMooreSearch *bms;
     65     const UnicodeString *targetString;
     66 };
     67 
     68 U_CAPI BMS * U_EXPORT2
     69 bms_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 
    105 U_CAPI void U_EXPORT2
    106 bms_close(BMS *bms)
    107 {
    108     delete bms->bms;
    109 
    110     delete bms->targetString;
    111 
    112     uprv_free(bms);
    113 }
    114 
    115 U_CAPI UBool U_EXPORT2
    116 bms_empty(BMS *bms)
    117 {
    118     return bms->bms->empty();
    119 }
    120 
    121 U_CAPI UCD * U_EXPORT2
    122 bms_getData(BMS *bms)
    123 {
    124     return STATIC_CAST(UCD *, bms->bms->getData());
    125 }
    126 
    127 U_CAPI UBool U_EXPORT2
    128 bms_search(BMS *bms, int32_t offset, int32_t *start, int32_t *end)
    129 {
    130     return bms->bms->search(offset, *start, *end);
    131 }
    132 
    133 U_CAPI void U_EXPORT2
    134 bms_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