]>
Commit | Line | Data |
---|---|---|
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 | ||
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 | { | |
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 | ||
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 |