1 /* This file is part of the YAZ toolkit.
2 * Copyright (C) 1995-2009 Index Data
3 * See the file LICENSE for details.
8 * \brief ICU character case (u_strToUpper, etc)
16 #include <yaz/xmalloc.h>
18 #include <yaz/icu_I18N.h>
31 struct icu_casemap * icu_casemap_create(char action, UErrorCode *status)
33 struct icu_casemap * casemap
34 = (struct icu_casemap *) xmalloc(sizeof(struct icu_casemap));
35 casemap->action = action;
37 switch (casemap->action)
49 icu_casemap_destroy(casemap);
55 void icu_casemap_destroy(struct icu_casemap * casemap)
60 int icu_casemap_casemap(struct icu_casemap * casemap,
61 struct icu_buf_utf16 * dest16,
62 struct icu_buf_utf16 * src16,
69 return icu_utf16_casemap(dest16, src16, locale,
70 casemap->action, status);
73 int icu_utf16_casemap(struct icu_buf_utf16 * dest16,
74 struct icu_buf_utf16 * src16,
75 const char *locale, char action,
78 int32_t dest16_len = 0;
80 if (!src16->utf16_len)
81 { /* guarding for empty source string */
83 dest16->utf16[0] = (UChar) 0;
84 dest16->utf16_len = 0;
92 dest16_len = u_strToLower(dest16->utf16, dest16->utf16_cap,
93 src16->utf16, src16->utf16_len,
98 dest16_len = u_strToUpper(dest16->utf16, dest16->utf16_cap,
99 src16->utf16, src16->utf16_len,
104 dest16_len = u_strToTitle(dest16->utf16, dest16->utf16_cap,
105 src16->utf16, src16->utf16_len,
110 dest16_len = u_strFoldCase(dest16->utf16, dest16->utf16_cap,
111 src16->utf16, src16->utf16_len,
112 U_FOLD_CASE_DEFAULT, status);
116 return U_UNSUPPORTED_ERROR;
120 /* check for buffer overflow, resize and retry */
121 if (*status == U_BUFFER_OVERFLOW_ERROR
122 && dest16 != src16 /* do not resize if in-place conversion */
125 icu_buf_utf16_resize(dest16, dest16_len * 2);
126 *status = U_ZERO_ERROR;
131 dest16_len = u_strToLower(dest16->utf16, dest16->utf16_cap,
132 src16->utf16, src16->utf16_len,
137 dest16_len = u_strToUpper(dest16->utf16, dest16->utf16_cap,
138 src16->utf16, src16->utf16_len,
143 dest16_len = u_strToTitle(dest16->utf16, dest16->utf16_cap,
144 src16->utf16, src16->utf16_len,
149 dest16_len = u_strFoldCase(dest16->utf16, dest16->utf16_cap,
150 src16->utf16, src16->utf16_len,
151 U_FOLD_CASE_DEFAULT, status);
155 return U_UNSUPPORTED_ERROR;
160 if (U_SUCCESS(*status)
161 && dest16_len <= dest16->utf16_cap)
162 dest16->utf16_len = dest16_len;
166 dest16->utf16[0] = (UChar) 0;
167 dest16->utf16_len = 0;
174 #endif /* YAZ_HAVE_ICU */
179 * c-file-style: "Stroustrup"
180 * indent-tabs-mode: nil
182 * vim: shiftwidth=4 tabstop=8 expandtab