164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others.
264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius*   Copyright (C) 2004-2012, International Business Machines
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   file name:  ucase.h
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   encoding:   US-ASCII
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   tab size:   8 (not used)
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   indentation:4
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   created on: 2004aug30
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   created by: Markus W. Scherer
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Low-level Unicode character/string case mapping code.
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef __UCASE_H__
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define __UCASE_H__
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uset.h"
2683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#include "putilimp.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uset_imp.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "udataswp.h"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#ifdef __cplusplus
3183a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_NAMESPACE_BEGIN
3283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
3383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusclass UnicodeString;
3483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
3583a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_NAMESPACE_END
3683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#endif
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* library API -------------------------------------------------------------- */
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4083a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_CDECL_BEGIN
4183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustruct UCaseProps;
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef struct UCaseProps UCaseProps;
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4583a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_CDECL_END
4683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const UCaseProps * U_EXPORT2
4827f654740f2a26ad62a5c155af9199af9e69b889clairehoucase_getSingleton(void);
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC void U_EXPORT2
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_addPropertyStarts(const UCaseProps *csp, const USetAdder *sa, UErrorCode *pErrorCode);
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Requires non-NULL locale ID but otherwise does the equivalent of
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * checking for language codes as if uloc_getLanguage() were called:
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Accepts both 2- and 3-letter codes and accepts case variants.
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC int32_t
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_getCaseLocale(const char *locale, int32_t *locCache);
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
61c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/* Casing locale types for ucase_getCaseLocale */
62c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruenum {
63c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UCASE_LOC_UNKNOWN,
64c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UCASE_LOC_ROOT,
65c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UCASE_LOC_TURKISH,
66c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UCASE_LOC_LITHUANIAN,
6764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    UCASE_LOC_GREEK,
68c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UCASE_LOC_DUTCH
69c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru};
70c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Bit mask for getting just the options from a string compare options word
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * that are relevant for case-insensitive string comparison.
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * See uchar.h. Also include _STRNCMP_STYLE and U_COMPARE_CODE_POINT_ORDER.
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define _STRCASECMP_OPTIONS_MASK 0xffff
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Bit mask for getting just the options from a string compare options word
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * that are relevant for case folding (of a single string or code point).
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * See uchar.h.
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define _FOLD_CASE_OPTIONS_MASK 0xff
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* single-code point functions */
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UChar32 U_EXPORT2
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_tolower(const UCaseProps *csp, UChar32 c);
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UChar32 U_EXPORT2
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_toupper(const UCaseProps *csp, UChar32 c);
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UChar32 U_EXPORT2
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_totitle(const UCaseProps *csp, UChar32 c);
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UChar32 U_EXPORT2
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_fold(const UCaseProps *csp, UChar32 c, uint32_t options);
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Adds all simple case mappings and the full case folding for c to sa,
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and also adds special case closure mappings.
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * c itself is not added.
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * For example, the mappings
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * - for s include long s
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * - for sharp s include ss
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * - for k include the Kelvin sign
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC void U_EXPORT2
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_addCaseClosure(const UCaseProps *csp, UChar32 c, const USetAdder *sa);
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Maps the string to single code points and adds the associated case closure
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * mappings.
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The string is mapped to code points if it is their full case folding string.
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * In other words, this performs a reverse full case folding and then
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * adds the case closure items of the resulting code points.
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * If the string is found and its closure applied, then
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the string itself is added as well as part of its code points' closure.
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * It must be length>=0.
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return TRUE if the string was found
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC UBool U_EXPORT2
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_addStringCaseClosure(const UCaseProps *csp, const UChar *s, int32_t length, const USetAdder *sa);
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
12883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#ifdef __cplusplus
12983a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_NAMESPACE_BEGIN
13083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
13183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius/**
13283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius * Iterator over characters with more than one code point in the full default Case_Folding.
13383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius */
13483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusclass U_COMMON_API FullCaseFoldingIterator {
13583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliuspublic:
13683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    /** Constructor. */
13783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    FullCaseFoldingIterator();
13883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    /**
13983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius     * Returns the next (cp, full) pair where "full" is cp's full default Case_Folding.
14083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius     * Returns a negative cp value at the end of the iteration.
14183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius     */
14283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    UChar32 next(UnicodeString &full);
14383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusprivate:
14483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    FullCaseFoldingIterator(const FullCaseFoldingIterator &);  // no copy
14583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    FullCaseFoldingIterator &operator=(const FullCaseFoldingIterator &);  // no assignment
14683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
14783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    const UChar *unfold;
14883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    int32_t unfoldRows;
14983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    int32_t unfoldRowWidth;
15083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    int32_t unfoldStringWidth;
15183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    int32_t currentRow;
15283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    int32_t rowCpIndex;
15383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius};
15483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
15583a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_NAMESPACE_END
15683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#endif
15783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** @return UCASE_NONE, UCASE_LOWER, UCASE_UPPER, UCASE_TITLE */
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_getType(const UCaseProps *csp, UChar32 c);
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
16264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert/** @return like ucase_getType() but also sets UCASE_IGNORABLE if c is case-ignorable */
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_getTypeOrIgnorable(const UCaseProps *csp, UChar32 c);
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_isSoftDotted(const UCaseProps *csp, UChar32 c);
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_isCaseSensitive(const UCaseProps *csp, UChar32 c);
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* string case mapping functions */
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17483a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_CDECL_BEGIN
17583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Iterator function for string case mappings, which need to look at the
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * context (surrounding text) of a given character for conditional mappings.
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The iterator only needs to go backward or forward away from the
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * character in question. It does not use any indexes on this interface.
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * It does not support random access or an arbitrary change of
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * iteration direction.
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The code point being case-mapped itself is never returned by
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * this iterator.
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param context A pointer to the iterator's working data.
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param dir If <0 then start iterating backward from the character;
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *            if >0 then start iterating forward from the character;
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *            if 0 then continue iterating in the current direction.
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return Next code point, or <0 when the iteration is done.
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef UChar32 U_CALLCONV
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCaseContextIterator(void *context, int8_t dir);
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Sample struct which may be used by some implementations of
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * UCaseContextIterator.
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustruct UCaseContext {
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void *p;
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t start, index, limit;
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t cpStart, cpLimit;
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int8_t dir;
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int8_t b1, b2, b3;
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef struct UCaseContext UCaseContext;
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21083a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_CDECL_END
21183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
21283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define UCASECONTEXT_INITIALIZER { NULL,  0, 0, 0,  0, 0,  0,  0, 0, 0 }
21383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * For string case mappings, a single character (a code point) is mapped
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * either to itself (in which case in-place mapping functions do nothing),
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * or to another single code point, or to a string.
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Aside from the string contents, these are indicated with a single int32_t
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * value as follows:
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Mapping to self: Negative values (~self instead of -self to support U+0000)
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Mapping to another code point: Positive values >UCASE_MAX_STRING_LENGTH
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Mapping to a string: The string length (0..UCASE_MAX_STRING_LENGTH) is
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * returned. Note that the string result may indeed have zero length.
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_MAX_STRING_LENGTH=0x1f
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Get the full lowercase mapping for c.
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param csp Case mapping properties.
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param c Character to be mapped.
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param iter Character iterator, used for context-sensitive mappings.
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *             See UCaseContextIterator for details.
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *             If iter==NULL then a context-independent result is returned.
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param context Pointer to be passed into iter.
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param pString If the mapping result is a string, then the pointer is
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                written to *pString.
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param locale Locale ID for locale-dependent mappings.
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param locCache Initialize to 0; may be used to cache the result of parsing
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                 the locale ID for subsequent calls.
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                 Can be NULL.
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return Output code point or string length, see UCASE_MAX_STRING_LENGTH.
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCaseContextIterator
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see UCASE_MAX_STRING_LENGTH
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_toFullLower(const UCaseProps *csp, UChar32 c,
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  UCaseContextIterator *iter, void *context,
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  const UChar **pString,
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  const char *locale, int32_t *locCache);
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_toFullUpper(const UCaseProps *csp, UChar32 c,
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  UCaseContextIterator *iter, void *context,
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  const UChar **pString,
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  const char *locale, int32_t *locCache);
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_toFullTitle(const UCaseProps *csp, UChar32 c,
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  UCaseContextIterator *iter, void *context,
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  const UChar **pString,
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  const char *locale, int32_t *locCache);
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_toFullFolding(const UCaseProps *csp, UChar32 c,
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    const UChar **pString,
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    uint32_t options);
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC int32_t U_EXPORT2
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucase_hasBinaryProperty(UChar32 c, UProperty which);
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef int32_t U_CALLCONV
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCaseMapFull(const UCaseProps *csp, UChar32 c,
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             UCaseContextIterator *iter, void *context,
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             const UChar **pString,
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             const char *locale, int32_t *locCache);
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* file definitions --------------------------------------------------------- */
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_DATA_NAME "ucase"
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_DATA_TYPE "icu"
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* format "cAsE" */
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_FMT_0 0x63
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_FMT_1 0x41
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_FMT_2 0x53
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_FMT_3 0x45
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* indexes into indexes[] */
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_IX_INDEX_TOP,
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_IX_LENGTH,
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_IX_TRIE_SIZE,
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_IX_EXC_LENGTH,
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_IX_UNFOLD_LENGTH,
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_IX_MAX_FULL_LENGTH=15,
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_IX_TOP=16
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* definitions for 16-bit case properties word ------------------------------ */
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2-bit constants for types of cased characters */
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_TYPE_MASK     3
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_NONE,
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_LOWER,
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_UPPER,
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_TITLE
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_GET_TYPE(props) ((props)&UCASE_TYPE_MASK)
32883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define UCASE_GET_TYPE_AND_IGNORABLE(props) ((props)&7)
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
33083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define UCASE_IGNORABLE         4
33183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define UCASE_SENSITIVE         8
33283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define UCASE_EXCEPTION         0x10
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
33483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define UCASE_DOT_MASK      0x60
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_NO_DOT=0,         /* normal characters with cc=0 */
33783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    UCASE_SOFT_DOTTED=0x20, /* soft-dotted characters with cc=0 */
33883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    UCASE_ABOVE=0x40,       /* "above" accents with cc=230 */
33983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    UCASE_OTHER_ACCENT=0x60 /* other accent character (0<cc!=230) */
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
34283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius/* no exception: bits 15..7 are a 9-bit signed case mapping delta */
34383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define UCASE_DELTA_SHIFT   7
34483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define UCASE_DELTA_MASK    0xff80
34583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define UCASE_MAX_DELTA     0xff
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_MIN_DELTA     (-UCASE_MAX_DELTA-1)
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
34883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#if U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC
34983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#   define UCASE_GET_DELTA(props) ((int16_t)(props)>>UCASE_DELTA_SHIFT)
35083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#else
35183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#   define UCASE_GET_DELTA(props) (int16_t)(((props)&0x8000) ? (((props)>>UCASE_DELTA_SHIFT)|0xfe00) : ((uint16_t)(props)>>UCASE_DELTA_SHIFT))
35283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#endif
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
35483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius/* exception: bits 15..5 are an unsigned 11-bit index into the exceptions array */
35583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define UCASE_EXC_SHIFT     5
35683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define UCASE_EXC_MASK      0xffe0
35783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define UCASE_MAX_EXCEPTIONS ((UCASE_EXC_MASK>>UCASE_EXC_SHIFT)+1)
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* definitions for 16-bit main exceptions word ------------------------------ */
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* first 8 bits indicate values in optional slots */
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_EXC_LOWER,
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_EXC_FOLD,
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_EXC_UPPER,
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_EXC_TITLE,
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_EXC_4,            /* reserved */
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_EXC_5,            /* reserved */
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_EXC_CLOSURE,
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_EXC_FULL_MAPPINGS,
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_EXC_ALL_SLOTS     /* one past the last slot */
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* each slot is 2 uint16_t instead of 1 */
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_EXC_DOUBLE_SLOTS      0x100
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
37783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius/* reserved: exception bits 11..9 */
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* UCASE_EXC_DOT_MASK=UCASE_DOT_MASK<<UCASE_EXC_DOT_SHIFT */
38083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define UCASE_EXC_DOT_SHIFT     7
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* normally stored in the main word, but pushed out for larger exception indexes */
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_EXC_DOT_MASK      0x3000
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_EXC_NO_DOT=0,
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_EXC_SOFT_DOTTED=0x1000,
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_EXC_ABOVE=0x2000,         /* "above" accents with cc=230 */
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_EXC_OTHER_ACCENT=0x3000   /* other character (0<cc!=230) */
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* complex/conditional mappings */
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_EXC_CONDITIONAL_SPECIAL   0x4000
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_EXC_CONDITIONAL_FOLD      0x8000
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* definitions for lengths word for full case mappings */
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_FULL_LOWER    0xf
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_FULL_FOLDING  0xf0
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_FULL_UPPER    0xf00
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_FULL_TITLE    0xf000
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* maximum lengths */
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_FULL_MAPPINGS_MAX_LENGTH (4*0xf)
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCASE_CLOSURE_MAX_LENGTH 0xf
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* constants for reverse case folding ("unfold") data */
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_UNFOLD_ROWS,
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_UNFOLD_ROW_WIDTH,
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCASE_UNFOLD_STRING_WIDTH
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
413