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