]> git.saurik.com Git - apple/icu.git/blame - icuSources/i18n/bms.cpp
ICU-491.11.1.tar.gz
[apple/icu.git] / icuSources / i18n / bms.cpp
CommitLineData
729e4ab9 1/*
4388f060 2 * Copyright (C) 2008-2011, International Business Machines Corporation and Others.
729e4ab9
A
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
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{
4388f060
A
37 if (ucd != NULL) {
38 CollData *data = STATIC_CAST(CollData *, ucd);
729e4ab9 39
4388f060
A
40 CollData::close(data);
41 }
729e4ab9
A
42}
43
44U_CAPI UCollator * U_EXPORT2
45ucd_getCollator(UCD *ucd)
46{
47 CollData *data = STATIC_CAST(CollData *, ucd);
48
49 return data->getCollator();
50}
51
52U_CAPI void U_EXPORT2
53ucd_freeCache()
54{
55 CollData::freeCollDataCache();
56}
57
58U_CAPI void U_EXPORT2
59ucd_flushCache()
60{
61 CollData::flushCollDataCache();
62}
63
64struct BMS
65{
66 BoyerMooreSearch *bms;
67 const UnicodeString *targetString;
68};
69
70U_CAPI BMS * U_EXPORT2
71bms_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
107U_CAPI void U_EXPORT2
108bms_close(BMS *bms)
109{
110 delete bms->bms;
111
112 delete bms->targetString;
113
114 uprv_free(bms);
115}
116
117U_CAPI UBool U_EXPORT2
118bms_empty(BMS *bms)
119{
120 return bms->bms->empty();
121}
122
123U_CAPI UCD * U_EXPORT2
124bms_getData(BMS *bms)
125{
126 return STATIC_CAST(UCD *, bms->bms->getData());
127}
128
129U_CAPI UBool U_EXPORT2
130bms_search(BMS *bms, int32_t offset, int32_t *start, int32_t *end)
131{
132 return bms->bms->search(offset, *start, *end);
133}
134
135U_CAPI void U_EXPORT2
136bms_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