1b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/*
2b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Copyright (C) 2008-2011, International Business Machines Corporation and Others.
3b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * All rights reserved.
4b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */
5b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
6b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/utypes.h"
7b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "cmemory.h"
8b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/bms.h"
9b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/unistr.h"
10b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/colldata.h"
11b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/bmsearch.h"
12b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
13b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_BREAK_ITERATION
15b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
16b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
17b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//#define USE_SAFE_CASTS
18b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#ifdef USE_SAFE_CASTS
19b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define STATIC_CAST(type,value) static_cast<type>(value)
20b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define CONST_CAST(type,value) const_cast<type>(value)
21b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#else
22b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define STATIC_CAST(type,value) (type) (value)
23b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define CONST_CAST(type,value) (type) (value)
24b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#endif
25b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_USE
2750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
28b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CAPI UCD * U_EXPORT2
29b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruucd_open(UCollator *coll, UErrorCode *status)
30b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
31b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return STATIC_CAST(UCD *, CollData::open(coll, *status));
32b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
33b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
34b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CAPI void U_EXPORT2
35b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruucd_close(UCD *ucd)
36b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
37b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (ucd != NULL) {
38b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        CollData *data = STATIC_CAST(CollData *, ucd);
39b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
40b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        CollData::close(data);
41b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
42b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
43b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
44b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CAPI UCollator * U_EXPORT2
45b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruucd_getCollator(UCD *ucd)
46b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
47b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    CollData *data = STATIC_CAST(CollData *, ucd);
48b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
49b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return data->getCollator();
50b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
51b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
52b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CAPI void U_EXPORT2
53b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruucd_freeCache()
54b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
55b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    CollData::freeCollDataCache();
56b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
57b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
58b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CAPI void U_EXPORT2
59b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruucd_flushCache()
60b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
61b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    CollData::flushCollDataCache();
62b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
63b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
64b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustruct BMS
65b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
66b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    BoyerMooreSearch *bms;
67b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const UnicodeString *targetString;
68b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru};
69b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
70b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CAPI BMS * U_EXPORT2
71b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querubms_open(UCD *ucd,
72b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         const UChar *pattern, int32_t patternLength,
73b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         const UChar *target,  int32_t targetLength,
74b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         UErrorCode  *status)
75b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
76b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    BMS *bms = STATIC_CAST(BMS *, uprv_malloc(sizeof(BMS)));
77b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
78b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (bms == NULL) {
79b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        *status = U_MEMORY_ALLOCATION_ERROR;
80b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return NULL;
81b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
82b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
83b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    CollData *data = (CollData *) ucd;
84b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UnicodeString patternString(pattern, patternLength);
85b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
86b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (target != NULL) {
87b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        bms->targetString = new UnicodeString(target, targetLength);
88b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
89b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (bms->targetString == NULL) {
90b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            bms->bms = NULL;
91b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            *status = U_MEMORY_ALLOCATION_ERROR;
92b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            return bms;
93b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
94b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    } else {
95b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        bms->targetString = NULL;
96b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
97b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
98b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    bms->bms = new BoyerMooreSearch(data, patternString, bms->targetString, *status);
99b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
100b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (bms->bms == NULL) {
101b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        *status = U_MEMORY_ALLOCATION_ERROR;
102b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
103b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
104b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return bms;
105b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
106b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
107b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CAPI void U_EXPORT2
108b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querubms_close(BMS *bms)
109b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
110b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    delete bms->bms;
111b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
112b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    delete bms->targetString;
113b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
114b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    uprv_free(bms);
115b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
116b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
117b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CAPI UBool U_EXPORT2
118b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querubms_empty(BMS *bms)
119b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
120b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return bms->bms->empty();
121b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
122b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
123b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CAPI UCD * U_EXPORT2
124b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querubms_getData(BMS *bms)
125b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
126b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return STATIC_CAST(UCD *, bms->bms->getData());
127b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
128b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
129b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CAPI UBool U_EXPORT2
130b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querubms_search(BMS *bms, int32_t offset, int32_t *start, int32_t *end)
131b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
132b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return bms->bms->search(offset, *start, *end);
133b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
134b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CAPI void U_EXPORT2
136b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querubms_setTargetString(BMS *bms, const UChar *target, int32_t targetLength, UErrorCode *status)
137b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
138b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (U_FAILURE(*status)) {
139b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
140b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
141b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (bms->targetString != NULL) {
143b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        delete bms->targetString;
144b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
145b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
146b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (target != NULL) {
147b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        bms->targetString = new UnicodeString(target, targetLength);
148b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    } else {
149b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        bms->targetString = NULL;
150b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
151b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
152b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    bms->bms->setTargetString(bms->targetString, *status);
153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
155b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#endif
156