summaryrefslogtreecommitdiffstats
path: root/strings/ctype-unidata.h
diff options
context:
space:
mode:
Diffstat (limited to 'strings/ctype-unidata.h')
-rw-r--r--strings/ctype-unidata.h150
1 files changed, 150 insertions, 0 deletions
diff --git a/strings/ctype-unidata.h b/strings/ctype-unidata.h
new file mode 100644
index 00000000..0bcf96c0
--- /dev/null
+++ b/strings/ctype-unidata.h
@@ -0,0 +1,150 @@
+#ifndef CTYPE_UNIDATA_H_INCLUDED
+#define CTYPE_UNIDATA_H_INCLUDED
+/*
+ Copyright (c) 2018, 2023 MariaDB Corporation
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+
+extern const uint16 weight_general_ci_page00[256];
+extern const uint16 *weight_general_ci_index[256];
+extern const uint16 weight_general_mysql500_ci_page00[256];
+extern const uint16 *weight_general_mysql500_ci_index[256];
+
+extern const MY_CASEFOLD_CHARACTER u300_casefold_page00[256];
+
+static inline my_wc_t my_u300_tolower_7bit(uchar ch)
+{
+ return u300_casefold_page00[ch].tolower;
+}
+
+static inline my_wc_t my_u300_toupper_7bit(uchar ch)
+{
+ return u300_casefold_page00[ch].toupper;
+}
+
+
+static inline my_wc_t my_general_ci_bmp_char_to_weight(my_wc_t wc)
+{
+ const uint16 *page;
+ DBUG_ASSERT((wc >> 8) < array_elements(weight_general_ci_index));
+ page= weight_general_ci_index[wc >> 8];
+ return page ? page[wc & 0xFF] : wc;
+}
+
+
+static inline my_wc_t my_general_ci_char_to_weight(my_wc_t wc)
+{
+ if ((wc >> 8) < array_elements(weight_general_ci_index))
+ return my_general_ci_bmp_char_to_weight(wc);
+ return MY_CS_REPLACEMENT_CHARACTER;
+}
+
+
+static inline my_wc_t my_general_mysql500_ci_bmp_char_to_weight(my_wc_t wc)
+{
+ const uint16 *page;
+ DBUG_ASSERT((wc >> 8) < array_elements(weight_general_mysql500_ci_index));
+ page= weight_general_mysql500_ci_index[wc >> 8];
+ return page ? page[wc & 0xFF] : wc;
+}
+
+
+static inline void my_tosort_unicode_bmp(MY_CASEFOLD_INFO *uni_plane,
+ my_wc_t *wc)
+{
+ const uint16 *page;
+ DBUG_ASSERT(*wc <= uni_plane->maxchar);
+ if ((page= uni_plane->simple_weight[*wc >> 8]))
+ *wc= page[*wc & 0xFF];
+}
+
+
+static inline void my_tosort_unicode(MY_CASEFOLD_INFO *uni_plane,
+ my_wc_t *wc)
+{
+ if (*wc <= uni_plane->maxchar)
+ {
+ const uint16 *page;
+ if ((page= uni_plane->simple_weight[*wc >> 8]))
+ *wc= page[*wc & 0xFF];
+ }
+ else
+ {
+ *wc= MY_CS_REPLACEMENT_CHARACTER;
+ }
+}
+
+
+static inline void
+my_tolower_unicode_bmp(MY_CASEFOLD_INFO *uni_plane, my_wc_t *wc)
+{
+ const MY_CASEFOLD_CHARACTER *page;
+ DBUG_ASSERT(*wc <= uni_plane->maxchar);
+ if ((page= uni_plane->page[*wc >> 8]))
+ *wc= page[*wc & 0xFF].tolower;
+}
+
+
+static inline void
+my_toupper_unicode_bmp(MY_CASEFOLD_INFO *uni_plane, my_wc_t *wc)
+{
+ const MY_CASEFOLD_CHARACTER *page;
+ DBUG_ASSERT(*wc <= uni_plane->maxchar);
+ if ((page= uni_plane->page[*wc >> 8]))
+ *wc= page[*wc & 0xFF].toupper;
+}
+
+
+static inline void
+my_tolower_unicode(MY_CASEFOLD_INFO *uni_plane, my_wc_t *wc)
+{
+ if (*wc <= uni_plane->maxchar)
+ {
+ const MY_CASEFOLD_CHARACTER *page;
+ if ((page= uni_plane->page[(*wc >> 8)]))
+ *wc= page[*wc & 0xFF].tolower;
+ }
+}
+
+
+static inline void
+my_toupper_unicode(MY_CASEFOLD_INFO *uni_plane, my_wc_t *wc)
+{
+ if (*wc <= uni_plane->maxchar)
+ {
+ const MY_CASEFOLD_CHARACTER *page;
+ if ((page= uni_plane->page[(*wc >> 8)]))
+ *wc= page[*wc & 0xFF].toupper;
+ }
+}
+
+
+extern MY_CASEFOLD_INFO my_casefold_default;
+extern MY_CASEFOLD_INFO my_casefold_turkish;
+extern MY_CASEFOLD_INFO my_casefold_mysql500;
+extern MY_CASEFOLD_INFO my_casefold_unicode520;
+extern MY_CASEFOLD_INFO my_casefold_unicode1400;
+extern MY_CASEFOLD_INFO my_casefold_unicode1400tr;
+
+
+size_t my_strxfrm_pad_nweights_unicode(uchar *str, uchar *strend, size_t nweights);
+size_t my_strxfrm_pad_unicode(uchar *str, uchar *strend);
+
+
+#define PUT_WC_BE2_HAVE_1BYTE(dst, de, wc) \
+ do { *dst++= (uchar) (wc >> 8); if (dst < de) *dst++= (uchar) (wc & 0xFF); } while(0)
+
+#endif /* CTYPE_UNIDATA_H_INCLUDED */