ustr_imp.h revision b13da9df870a61b11249bf741347908dbea0edd8
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru**********************************************************************
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Copyright (C) 1999-2007, International Business Machines
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru**********************************************************************
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   file name:  ustr_imp.h
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   encoding:   US-ASCII
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   tab size:   8 (not used)
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   indentation:4
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   created on: 2001jan30
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   created by: Markus W. Scherer
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef __USTR_IMP_H__
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define __USTR_IMP_H__
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uiter.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucase.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** Simple declaration for u_strToTitle() to avoid including unicode/ubrk.h. */
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef UBRK_TYPEDEF_UBREAK_ITERATOR
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define UBRK_TYPEDEF_UBREAK_ITERATOR
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    typedef void UBreakIterator;
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Compare two strings in code point order or code unit order.
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Works in strcmp style (both lengths -1),
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * strncmp style (lengths equal and >=0, flag TRUE),
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and memcmp/UnicodeString style (at least one length >=0).
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_strCompare(const UChar *s1, int32_t length1,
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                const UChar *s2, int32_t length2,
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UBool strncmpStyle, UBool codePointOrder);
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Internal API, used by u_strcasecmp() etc.
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Compare strings case-insensitively,
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * in code point order or code unit order.
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC int32_t
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_strcmpFold(const UChar *s1, int32_t length1,
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             const UChar *s2, int32_t length2,
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             uint32_t options,
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             UErrorCode *pErrorCode);
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Are the Unicode properties loaded?
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This must be used before internal functions are called that do
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * not perform this check.
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Generate a debug assertion failure if data is not loaded, to flag the fact
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   that u_init() wasn't called first, before trying to access character properties.
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC UBool
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_haveProperties(UErrorCode *pErrorCode);
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  * Load the Unicode property data.
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  * Intended primarily for use from u_init().
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  * Has no effect if property data is already loaded.
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  * NOT thread safe.
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  * @internal
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  */
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*U_CFUNC int8_t
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_loadPropsData(UErrorCode *errorCode);*/
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Type of a function that may be passed to the internal case mapping functions
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or similar for growing the destination buffer.
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef UBool U_CALLCONV
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUGrowBuffer(void *context,      /* opaque pointer for this function */
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UChar **pBuffer,    /* in/out destination buffer pointer */
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t *pCapacity, /* in/out buffer capacity in numbers of UChars */
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t reqCapacity,/* requested capacity */
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t length);    /* number of UChars to be copied to new buffer */
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Default implementation of UGrowBuffer.
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Takes a static buffer as context, allocates a new buffer,
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and releases the old one if it is not the same as the one passed as context.
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool /* U_CALLCONV U_EXPORT2 */
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_growBufferFromStatic(void *context,
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       UChar **pBuffer, int32_t *pCapacity, int32_t reqCapacity,
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       int32_t length);
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Internal string casing functions implementing
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ustring.h/ustrcase.c and UnicodeString case mapping functions.
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustruct UCaseMap {
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UCaseProps *csp;
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator *iter;  /* We adopt the iterator, so we own it. */
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char locale[32];
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t locCache;
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t options;
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef __UCASEMAP_H__
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef struct UCaseMap UCaseMap;
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TO_LOWER,
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TO_UPPER,
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TO_TITLE,
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FOLD_CASE
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC int32_t
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruustr_toLower(const UCaseProps *csp,
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             UChar *dest, int32_t destCapacity,
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             const UChar *src, int32_t srcLength,
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             const char *locale,
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             UErrorCode *pErrorCode);
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC int32_t
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruustr_toUpper(const UCaseProps *csp,
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             UChar *dest, int32_t destCapacity,
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             const UChar *src, int32_t srcLength,
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             const char *locale,
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             UErrorCode *pErrorCode);
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC int32_t
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruustr_toTitle(const UCaseProps *csp,
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             UChar *dest, int32_t destCapacity,
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             const UChar *src, int32_t srcLength,
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             UBreakIterator *titleIter,
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             const char *locale, uint32_t options,
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             UErrorCode *pErrorCode);
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Internal case folding function.
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC int32_t
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruustr_foldCase(const UCaseProps *csp,
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar *dest, int32_t destCapacity,
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              const UChar *src, int32_t srcLength,
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              uint32_t options,
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UErrorCode *pErrorCode);
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NUL-terminate a UChar * string if possible.
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * If length  < destCapacity then NUL-terminate.
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * If length == destCapacity then do not terminate but set U_STRING_NOT_TERMINATED_WARNING.
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * If length  > destCapacity then do not terminate but set U_BUFFER_OVERFLOW_ERROR.
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param dest Destination buffer, can be NULL if destCapacity==0.
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param destCapacity Number of UChars available at dest.
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param length Number of UChars that were (to be) written to dest.
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param pErrorCode ICU error code.
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return length
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_terminateUChars(UChar *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode);
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NUL-terminate a char * string if possible.
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Same as u_terminateUChars() but for a different string type.
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_terminateChars(char *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode);
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NUL-terminate a UChar32 * string if possible.
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Same as u_terminateUChars() but for a different string type.
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_terminateUChar32s(UChar32 *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode);
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NUL-terminate a wchar_t * string if possible.
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Same as u_terminateUChars() but for a different string type.
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_terminateWChars(wchar_t *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode);
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
212