2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <utils_i18n_alpha_idx.h>
18 #include <utils_i18n_private.h>
22 #include <unicode/locid.h>
23 #include <unicode/alphaindex.h>
25 int i18n_alpha_idx_create(const char *language, const char *country,
26 i18n_alpha_idx_h *index)
28 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
30 Locale locale(language, country, 0, 0);
31 UErrorCode status = U_ZERO_ERROR;
33 *index = new AlphabeticIndex(locale, status);
34 retv_if(*index == NULL, I18N_ERROR_OUT_OF_MEMORY);
36 return _i18n_error_mapping(status);
39 int i18n_alpha_idx_destroy(i18n_alpha_idx_h index)
41 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
43 delete ((AlphabeticIndex *) index);
45 return I18N_ERROR_NONE;
48 int i18n_alpha_idx_add_labels(i18n_alpha_idx_h index,
49 const char *language, const char *country)
51 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
53 Locale locale(language, country, 0, 0);
54 UErrorCode status = U_ZERO_ERROR;
56 ((AlphabeticIndex *) index)->addLabels(locale, status);
58 return _i18n_error_mapping(status);
61 int i18n_alpha_idx_add_record(i18n_alpha_idx_h index, const char *name,
64 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
65 retv_if(name == NULL, I18N_ERROR_INVALID_PARAMETER);
67 const UnicodeString _name(name);
68 UErrorCode status = U_ZERO_ERROR;
70 ((AlphabeticIndex *) index)->addRecord(_name, data, status);
72 return _i18n_error_mapping(status);
75 int i18n_alpha_idx_get_next_bucket(i18n_alpha_idx_h index, bool *available)
77 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
79 UErrorCode status = U_ZERO_ERROR;
81 if (available != NULL)
82 *available = ((AlphabeticIndex *) index)->nextBucket(status);
84 ((AlphabeticIndex *) index)->nextBucket(status);
86 return _i18n_error_mapping(status);
89 int i18n_alpha_idx_get_next_record(i18n_alpha_idx_h index, bool *available)
91 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
93 UErrorCode status = U_ZERO_ERROR;
95 if (available != NULL)
96 *available = ((AlphabeticIndex *) index)->nextRecord(status);
98 ((AlphabeticIndex *) index)->nextRecord(status);
100 return _i18n_error_mapping(status);
103 int i18n_alpha_idx_get_bucket_record_count(i18n_alpha_idx_h index,
104 int32_t *records_count)
106 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
107 retv_if(records_count == NULL, I18N_ERROR_INVALID_PARAMETER);
109 *records_count = ((AlphabeticIndex *) index)->getBucketRecordCount();
111 return I18N_ERROR_NONE;
114 int i18n_alpha_idx_get_bucket_label(i18n_alpha_idx_h index,
117 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
118 retv_if(label == NULL, I18N_ERROR_INVALID_PARAMETER);
120 UnicodeString _label = ((AlphabeticIndex *) index)->getBucketLabel();
122 std::string _label_string;
123 _label.toUTF8String(_label_string);
125 *label = strdup(_label_string.c_str());
126 retv_if(*label == NULL, I18N_ERROR_OUT_OF_MEMORY);
128 return I18N_ERROR_NONE;
131 const void *i18n_alpha_idx_get_record_data(i18n_alpha_idx_h index)
134 set_last_result(I18N_ERROR_INVALID_PARAMETER);
138 return ((AlphabeticIndex *) index)->getRecordData();
141 int i18n_alpha_idx_get_inflow_label(i18n_alpha_idx_h index,
144 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
145 retv_if(label == NULL, I18N_ERROR_INVALID_PARAMETER);
147 UnicodeString _label = ((AlphabeticIndex *) index)->getInflowLabel();
149 std::string _label_string;
150 _label.toUTF8String(_label_string);
152 *label = strdup(_label_string.c_str());
153 retv_if(*label == NULL, I18N_ERROR_OUT_OF_MEMORY);
155 return I18N_ERROR_NONE;
158 int i18n_alpha_idx_set_inflow_label(i18n_alpha_idx_h index,
161 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
162 retv_if(label == NULL, I18N_ERROR_INVALID_PARAMETER);
164 const UnicodeString inflow_label(label);
165 UErrorCode status = U_ZERO_ERROR;
167 ((AlphabeticIndex *) index)->setInflowLabel(inflow_label, status);
169 return _i18n_error_mapping(status);
172 int i18n_alpha_idx_get_overflow_label(i18n_alpha_idx_h index,
175 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
176 retv_if(label == NULL, I18N_ERROR_INVALID_PARAMETER);
178 const UnicodeString overflow_label = ((AlphabeticIndex *) index)->getOverflowLabel();
180 std::string _label_string;
181 overflow_label.toUTF8String(_label_string);
183 *label = strdup(_label_string.c_str());
184 retv_if(*label == NULL, I18N_ERROR_OUT_OF_MEMORY);
186 return I18N_ERROR_NONE;
189 int i18n_alpha_idx_set_overflow_label(i18n_alpha_idx_h index,
192 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
193 retv_if(label == NULL, I18N_ERROR_INVALID_PARAMETER);
195 const UnicodeString overflow_label(label);
196 UErrorCode status = U_ZERO_ERROR;
198 ((AlphabeticIndex *) index)->setOverflowLabel(overflow_label, status);
200 return _i18n_error_mapping(status);
203 int i18n_alpha_idx_get_underflow_label(i18n_alpha_idx_h index,
206 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
207 retv_if(label == NULL, I18N_ERROR_INVALID_PARAMETER);
209 const UnicodeString overflow_label = ((AlphabeticIndex *) index)->getUnderflowLabel();
211 std::string _label_string;
212 overflow_label.toUTF8String(_label_string);
214 *label = strdup(_label_string.c_str());
215 retv_if(*label == NULL, I18N_ERROR_OUT_OF_MEMORY);
217 return I18N_ERROR_NONE;
220 int i18n_alpha_idx_set_underflow_label(i18n_alpha_idx_h index,
223 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
224 retv_if(label == NULL, I18N_ERROR_INVALID_PARAMETER);
226 const UnicodeString underflow_label(label);
227 UErrorCode status = U_ZERO_ERROR;
229 ((AlphabeticIndex *) index)->setUnderflowLabel(underflow_label, status);
231 return _i18n_error_mapping(status);
234 int i18n_alpha_idx_get_max_label_count(i18n_alpha_idx_h index,
235 int32_t *max_label_count)
237 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
238 retv_if(max_label_count == NULL, I18N_ERROR_INVALID_PARAMETER);
240 *max_label_count = ((AlphabeticIndex *) index)->getMaxLabelCount();
242 return I18N_ERROR_NONE;
245 int i18n_alpha_idx_set_max_label_count(i18n_alpha_idx_h index,
246 int32_t max_label_count)
248 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
250 UErrorCode status = U_ZERO_ERROR;
252 ((AlphabeticIndex *) index)->setMaxLabelCount(max_label_count, status);
254 return _i18n_error_mapping(status);
257 int i18n_alpha_idx_clear_records(i18n_alpha_idx_h index)
259 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
261 UErrorCode status = U_ZERO_ERROR;
263 ((AlphabeticIndex *) index)->clearRecords(status);
265 return _i18n_error_mapping(status);
268 int i18n_alpha_idx_get_bucket_count(i18n_alpha_idx_h index,
269 int32_t *bucket_count)
271 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
272 retv_if(bucket_count == NULL, I18N_ERROR_INVALID_PARAMETER);
274 UErrorCode status = U_ZERO_ERROR;
276 *bucket_count = ((AlphabeticIndex *) index)->getBucketCount(status);
278 return _i18n_error_mapping(status);
281 int i18n_alpha_idx_get_record_count(i18n_alpha_idx_h index,
282 int32_t *record_count)
284 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
285 retv_if(record_count == NULL, I18N_ERROR_INVALID_PARAMETER);
287 UErrorCode status = U_ZERO_ERROR;
289 *record_count = ((AlphabeticIndex *) index)->getRecordCount(status);
291 return _i18n_error_mapping(status);
294 int i18n_alpha_idx_get_bucket_index(i18n_alpha_idx_h index,
295 const char *item_name,
296 int32_t *bucket_index)
298 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
299 retv_if(item_name == NULL, I18N_ERROR_INVALID_PARAMETER);
300 retv_if(bucket_index == NULL, I18N_ERROR_INVALID_PARAMETER);
302 UnicodeString _item_name(item_name);
303 UErrorCode status = U_ZERO_ERROR;
305 *bucket_index = ((AlphabeticIndex *) index)->getBucketIndex(_item_name, status);
307 return _i18n_error_mapping(status);
310 int i18n_alpha_idx_get_current_bucket_index(i18n_alpha_idx_h index,
311 int32_t *bucket_index)
313 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
314 retv_if(bucket_index == NULL, I18N_ERROR_INVALID_PARAMETER);
316 *bucket_index = ((AlphabeticIndex *) index)->getBucketIndex();
318 return I18N_ERROR_NONE;
321 int i18n_alpha_idx_get_bucket_label_type(i18n_alpha_idx_h index,
322 i18n_alpha_idx_label_type_e *type)
324 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
325 retv_if(type == NULL, I18N_ERROR_INVALID_PARAMETER);
327 *type = (i18n_alpha_idx_label_type_e) ((AlphabeticIndex *) index)->getBucketLabelType();
329 return I18N_ERROR_NONE;
332 int i18n_alpha_idx_get_record_name(i18n_alpha_idx_h index,
335 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
336 retv_if(record_name == NULL, I18N_ERROR_INVALID_PARAMETER);
338 const UnicodeString _record_name = ((AlphabeticIndex *) index)->getRecordName();
340 std::string _record_name_string;
341 _record_name.toUTF8String(_record_name_string);
343 *record_name = strdup(_record_name_string.c_str());
344 retv_if(*record_name == NULL, I18N_ERROR_OUT_OF_MEMORY);
346 if (_record_name.isEmpty()) {
349 return I18N_ERROR_INDEX_OUTOFBOUNDS;
352 return I18N_ERROR_NONE;
355 int i18n_alpha_idx_reset_bucket_iter(i18n_alpha_idx_h index)
357 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
359 UErrorCode status = U_ZERO_ERROR;
361 ((AlphabeticIndex *) index)->resetBucketIterator(status);
363 return _i18n_error_mapping(status);
366 int i18n_alpha_idx_reset_record_iter(i18n_alpha_idx_h index)
368 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
370 ((AlphabeticIndex *) index)->resetRecordIterator();
372 return I18N_ERROR_NONE;
375 int i18n_alpha_idx_create_from_locale_id(const char *locale_id, i18n_alpha_idx_h *index)
377 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
379 Locale locale(locale_id, 0, 0, 0);
380 UErrorCode status = U_ZERO_ERROR;
382 *index = new AlphabeticIndex(locale, status);
383 retv_if(*index == NULL, I18N_ERROR_OUT_OF_MEMORY);
385 return _i18n_error_mapping(status);
388 int i18n_alpha_idx_add_labels_with_locale_id(i18n_alpha_idx_h index,
389 const char *locale_id)
391 retv_if(index == NULL, I18N_ERROR_INVALID_PARAMETER);
393 Locale locale(locale_id, 0, 0, 0);
394 UErrorCode status = U_ZERO_ERROR;
396 ((AlphabeticIndex *) index)->addLabels(locale, status);
398 return _i18n_error_mapping(status);