1 | // © 2017 and later: Unicode, Inc. and others. |
2 | // License & terms of use: http://www.unicode.org/copyright.html |
3 | |
4 | // casemap.h |
5 | // created: 2017jan12 Markus W. Scherer |
6 | |
7 | #ifndef __CASEMAP_H__ |
8 | #define __CASEMAP_H__ |
9 | |
10 | #include "unicode/utypes.h" |
11 | |
12 | #if U_SHOW_CPLUSPLUS_API |
13 | |
14 | #include "unicode/stringpiece.h" |
15 | #include "unicode/uobject.h" |
16 | |
17 | /** |
18 | * \file |
19 | * \brief C++ API: Low-level C++ case mapping functions. |
20 | */ |
21 | |
22 | U_NAMESPACE_BEGIN |
23 | |
24 | class BreakIterator; |
25 | class ByteSink; |
26 | class Edits; |
27 | |
28 | /** |
29 | * Low-level C++ case mapping functions. |
30 | * |
31 | * @stable ICU 59 |
32 | */ |
33 | class U_COMMON_API CaseMap final : public UMemory { |
34 | public: |
35 | /** |
36 | * Lowercases a UTF-16 string and optionally records edits. |
37 | * Casing is locale-dependent and context-sensitive. |
38 | * The result may be longer or shorter than the original. |
39 | * The source string and the destination buffer must not overlap. |
40 | * |
41 | * @param locale The locale ID. ("" = root locale, nullptr = default locale.) |
42 | * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. |
43 | * @param src The original string. |
44 | * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. |
45 | * @param dest A buffer for the result string. The result will be NUL-terminated if |
46 | * the buffer is large enough. |
47 | * The contents is undefined in case of failure. |
48 | * @param destCapacity The size of the buffer (number of char16_ts). If it is 0, then |
49 | * dest may be nullptr and the function will only return the length of the result |
50 | * without writing any of the result string. |
51 | * @param edits Records edits for index mapping, working with styled text, |
52 | * and getting only changes (if any). |
53 | * The Edits contents is undefined if any error occurs. |
54 | * This function calls edits->reset() first unless |
55 | * options includes U_EDITS_NO_RESET. edits can be nullptr. |
56 | * @param errorCode Reference to an in/out error code value |
57 | * which must not indicate a failure before the function call. |
58 | * @return The length of the result string, if successful. |
59 | * When the result would be longer than destCapacity, |
60 | * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. |
61 | * |
62 | * @see u_strToLower |
63 | * @stable ICU 59 |
64 | */ |
65 | static int32_t toLower( |
66 | const char *locale, uint32_t options, |
67 | const char16_t *src, int32_t srcLength, |
68 | char16_t *dest, int32_t destCapacity, Edits *edits, |
69 | UErrorCode &errorCode); |
70 | |
71 | /** |
72 | * Uppercases a UTF-16 string and optionally records edits. |
73 | * Casing is locale-dependent and context-sensitive. |
74 | * The result may be longer or shorter than the original. |
75 | * The source string and the destination buffer must not overlap. |
76 | * |
77 | * @param locale The locale ID. ("" = root locale, nullptr = default locale.) |
78 | * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. |
79 | * @param src The original string. |
80 | * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. |
81 | * @param dest A buffer for the result string. The result will be NUL-terminated if |
82 | * the buffer is large enough. |
83 | * The contents is undefined in case of failure. |
84 | * @param destCapacity The size of the buffer (number of char16_ts). If it is 0, then |
85 | * dest may be nullptr and the function will only return the length of the result |
86 | * without writing any of the result string. |
87 | * @param edits Records edits for index mapping, working with styled text, |
88 | * and getting only changes (if any). |
89 | * The Edits contents is undefined if any error occurs. |
90 | * This function calls edits->reset() first unless |
91 | * options includes U_EDITS_NO_RESET. edits can be nullptr. |
92 | * @param errorCode Reference to an in/out error code value |
93 | * which must not indicate a failure before the function call. |
94 | * @return The length of the result string, if successful. |
95 | * When the result would be longer than destCapacity, |
96 | * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. |
97 | * |
98 | * @see u_strToUpper |
99 | * @stable ICU 59 |
100 | */ |
101 | static int32_t toUpper( |
102 | const char *locale, uint32_t options, |
103 | const char16_t *src, int32_t srcLength, |
104 | char16_t *dest, int32_t destCapacity, Edits *edits, |
105 | UErrorCode &errorCode); |
106 | |
107 | #if !UCONFIG_NO_BREAK_ITERATION |
108 | |
109 | /** |
110 | * Titlecases a UTF-16 string and optionally records edits. |
111 | * Casing is locale-dependent and context-sensitive. |
112 | * The result may be longer or shorter than the original. |
113 | * The source string and the destination buffer must not overlap. |
114 | * |
115 | * Titlecasing uses a break iterator to find the first characters of words |
116 | * that are to be titlecased. It titlecases those characters and lowercases |
117 | * all others. (This can be modified with options bits.) |
118 | * |
119 | * @param locale The locale ID. ("" = root locale, nullptr = default locale.) |
120 | * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, |
121 | * U_TITLECASE_NO_LOWERCASE, |
122 | * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, |
123 | * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. |
124 | * @param iter A break iterator to find the first characters of words that are to be titlecased. |
125 | * It is set to the source string (setText()) |
126 | * and used one or more times for iteration (first() and next()). |
127 | * If nullptr, then a word break iterator for the locale is used |
128 | * (or something equivalent). |
129 | * @param src The original string. |
130 | * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. |
131 | * @param dest A buffer for the result string. The result will be NUL-terminated if |
132 | * the buffer is large enough. |
133 | * The contents is undefined in case of failure. |
134 | * @param destCapacity The size of the buffer (number of char16_ts). If it is 0, then |
135 | * dest may be nullptr and the function will only return the length of the result |
136 | * without writing any of the result string. |
137 | * @param edits Records edits for index mapping, working with styled text, |
138 | * and getting only changes (if any). |
139 | * The Edits contents is undefined if any error occurs. |
140 | * This function calls edits->reset() first unless |
141 | * options includes U_EDITS_NO_RESET. edits can be nullptr. |
142 | * @param errorCode Reference to an in/out error code value |
143 | * which must not indicate a failure before the function call. |
144 | * @return The length of the result string, if successful. |
145 | * When the result would be longer than destCapacity, |
146 | * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. |
147 | * |
148 | * @see u_strToTitle |
149 | * @see ucasemap_toTitle |
150 | * @stable ICU 59 |
151 | */ |
152 | static int32_t toTitle( |
153 | const char *locale, uint32_t options, BreakIterator *iter, |
154 | const char16_t *src, int32_t srcLength, |
155 | char16_t *dest, int32_t destCapacity, Edits *edits, |
156 | UErrorCode &errorCode); |
157 | |
158 | #endif // UCONFIG_NO_BREAK_ITERATION |
159 | |
160 | /** |
161 | * Case-folds a UTF-16 string and optionally records edits. |
162 | * |
163 | * Case folding is locale-independent and not context-sensitive, |
164 | * but there is an option for whether to include or exclude mappings for dotted I |
165 | * and dotless i that are marked with 'T' in CaseFolding.txt. |
166 | * |
167 | * The result may be longer or shorter than the original. |
168 | * The source string and the destination buffer must not overlap. |
169 | * |
170 | * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, |
171 | * U_FOLD_CASE_DEFAULT, U_FOLD_CASE_EXCLUDE_SPECIAL_I. |
172 | * @param src The original string. |
173 | * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. |
174 | * @param dest A buffer for the result string. The result will be NUL-terminated if |
175 | * the buffer is large enough. |
176 | * The contents is undefined in case of failure. |
177 | * @param destCapacity The size of the buffer (number of char16_ts). If it is 0, then |
178 | * dest may be nullptr and the function will only return the length of the result |
179 | * without writing any of the result string. |
180 | * @param edits Records edits for index mapping, working with styled text, |
181 | * and getting only changes (if any). |
182 | * The Edits contents is undefined if any error occurs. |
183 | * This function calls edits->reset() first unless |
184 | * options includes U_EDITS_NO_RESET. edits can be nullptr. |
185 | * @param errorCode Reference to an in/out error code value |
186 | * which must not indicate a failure before the function call. |
187 | * @return The length of the result string, if successful. |
188 | * When the result would be longer than destCapacity, |
189 | * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. |
190 | * |
191 | * @see u_strFoldCase |
192 | * @stable ICU 59 |
193 | */ |
194 | static int32_t fold( |
195 | uint32_t options, |
196 | const char16_t *src, int32_t srcLength, |
197 | char16_t *dest, int32_t destCapacity, Edits *edits, |
198 | UErrorCode &errorCode); |
199 | |
200 | /** |
201 | * Lowercases a UTF-8 string and optionally records edits. |
202 | * Casing is locale-dependent and context-sensitive. |
203 | * The result may be longer or shorter than the original. |
204 | * |
205 | * @param locale The locale ID. ("" = root locale, nullptr = default locale.) |
206 | * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. |
207 | * @param src The original string. |
208 | * @param sink A ByteSink to which the result string is written. |
209 | * sink.Flush() is called at the end. |
210 | * @param edits Records edits for index mapping, working with styled text, |
211 | * and getting only changes (if any). |
212 | * The Edits contents is undefined if any error occurs. |
213 | * This function calls edits->reset() first unless |
214 | * options includes U_EDITS_NO_RESET. edits can be nullptr. |
215 | * @param errorCode Reference to an in/out error code value |
216 | * which must not indicate a failure before the function call. |
217 | * |
218 | * @see ucasemap_utf8ToLower |
219 | * @stable ICU 60 |
220 | */ |
221 | static void utf8ToLower( |
222 | const char *locale, uint32_t options, |
223 | StringPiece src, ByteSink &sink, Edits *edits, |
224 | UErrorCode &errorCode); |
225 | |
226 | /** |
227 | * Uppercases a UTF-8 string and optionally records edits. |
228 | * Casing is locale-dependent and context-sensitive. |
229 | * The result may be longer or shorter than the original. |
230 | * |
231 | * @param locale The locale ID. ("" = root locale, nullptr = default locale.) |
232 | * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. |
233 | * @param src The original string. |
234 | * @param sink A ByteSink to which the result string is written. |
235 | * sink.Flush() is called at the end. |
236 | * @param edits Records edits for index mapping, working with styled text, |
237 | * and getting only changes (if any). |
238 | * The Edits contents is undefined if any error occurs. |
239 | * This function calls edits->reset() first unless |
240 | * options includes U_EDITS_NO_RESET. edits can be nullptr. |
241 | * @param errorCode Reference to an in/out error code value |
242 | * which must not indicate a failure before the function call. |
243 | * |
244 | * @see ucasemap_utf8ToUpper |
245 | * @stable ICU 60 |
246 | */ |
247 | static void utf8ToUpper( |
248 | const char *locale, uint32_t options, |
249 | StringPiece src, ByteSink &sink, Edits *edits, |
250 | UErrorCode &errorCode); |
251 | |
252 | #if !UCONFIG_NO_BREAK_ITERATION |
253 | |
254 | /** |
255 | * Titlecases a UTF-8 string and optionally records edits. |
256 | * Casing is locale-dependent and context-sensitive. |
257 | * The result may be longer or shorter than the original. |
258 | * |
259 | * Titlecasing uses a break iterator to find the first characters of words |
260 | * that are to be titlecased. It titlecases those characters and lowercases |
261 | * all others. (This can be modified with options bits.) |
262 | * |
263 | * @param locale The locale ID. ("" = root locale, nullptr = default locale.) |
264 | * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, |
265 | * U_TITLECASE_NO_LOWERCASE, |
266 | * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, |
267 | * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. |
268 | * @param iter A break iterator to find the first characters of words that are to be titlecased. |
269 | * It is set to the source string (setUText()) |
270 | * and used one or more times for iteration (first() and next()). |
271 | * If nullptr, then a word break iterator for the locale is used |
272 | * (or something equivalent). |
273 | * @param src The original string. |
274 | * @param sink A ByteSink to which the result string is written. |
275 | * sink.Flush() is called at the end. |
276 | * @param edits Records edits for index mapping, working with styled text, |
277 | * and getting only changes (if any). |
278 | * The Edits contents is undefined if any error occurs. |
279 | * This function calls edits->reset() first unless |
280 | * options includes U_EDITS_NO_RESET. edits can be nullptr. |
281 | * @param errorCode Reference to an in/out error code value |
282 | * which must not indicate a failure before the function call. |
283 | * |
284 | * @see ucasemap_utf8ToTitle |
285 | * @stable ICU 60 |
286 | */ |
287 | static void utf8ToTitle( |
288 | const char *locale, uint32_t options, BreakIterator *iter, |
289 | StringPiece src, ByteSink &sink, Edits *edits, |
290 | UErrorCode &errorCode); |
291 | |
292 | #endif // UCONFIG_NO_BREAK_ITERATION |
293 | |
294 | /** |
295 | * Case-folds a UTF-8 string and optionally records edits. |
296 | * |
297 | * Case folding is locale-independent and not context-sensitive, |
298 | * but there is an option for whether to include or exclude mappings for dotted I |
299 | * and dotless i that are marked with 'T' in CaseFolding.txt. |
300 | * |
301 | * The result may be longer or shorter than the original. |
302 | * |
303 | * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. |
304 | * @param src The original string. |
305 | * @param sink A ByteSink to which the result string is written. |
306 | * sink.Flush() is called at the end. |
307 | * @param edits Records edits for index mapping, working with styled text, |
308 | * and getting only changes (if any). |
309 | * The Edits contents is undefined if any error occurs. |
310 | * This function calls edits->reset() first unless |
311 | * options includes U_EDITS_NO_RESET. edits can be nullptr. |
312 | * @param errorCode Reference to an in/out error code value |
313 | * which must not indicate a failure before the function call. |
314 | * |
315 | * @see ucasemap_utf8FoldCase |
316 | * @stable ICU 60 |
317 | */ |
318 | static void utf8Fold( |
319 | uint32_t options, |
320 | StringPiece src, ByteSink &sink, Edits *edits, |
321 | UErrorCode &errorCode); |
322 | |
323 | /** |
324 | * Lowercases a UTF-8 string and optionally records edits. |
325 | * Casing is locale-dependent and context-sensitive. |
326 | * The result may be longer or shorter than the original. |
327 | * The source string and the destination buffer must not overlap. |
328 | * |
329 | * @param locale The locale ID. ("" = root locale, nullptr = default locale.) |
330 | * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. |
331 | * @param src The original string. |
332 | * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. |
333 | * @param dest A buffer for the result string. The result will be NUL-terminated if |
334 | * the buffer is large enough. |
335 | * The contents is undefined in case of failure. |
336 | * @param destCapacity The size of the buffer (number of bytes). If it is 0, then |
337 | * dest may be nullptr and the function will only return the length of the result |
338 | * without writing any of the result string. |
339 | * @param edits Records edits for index mapping, working with styled text, |
340 | * and getting only changes (if any). |
341 | * The Edits contents is undefined if any error occurs. |
342 | * This function calls edits->reset() first unless |
343 | * options includes U_EDITS_NO_RESET. edits can be nullptr. |
344 | * @param errorCode Reference to an in/out error code value |
345 | * which must not indicate a failure before the function call. |
346 | * @return The length of the result string, if successful. |
347 | * When the result would be longer than destCapacity, |
348 | * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. |
349 | * |
350 | * @see ucasemap_utf8ToLower |
351 | * @stable ICU 59 |
352 | */ |
353 | static int32_t utf8ToLower( |
354 | const char *locale, uint32_t options, |
355 | const char *src, int32_t srcLength, |
356 | char *dest, int32_t destCapacity, Edits *edits, |
357 | UErrorCode &errorCode); |
358 | |
359 | /** |
360 | * Uppercases a UTF-8 string and optionally records edits. |
361 | * Casing is locale-dependent and context-sensitive. |
362 | * The result may be longer or shorter than the original. |
363 | * The source string and the destination buffer must not overlap. |
364 | * |
365 | * @param locale The locale ID. ("" = root locale, nullptr = default locale.) |
366 | * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. |
367 | * @param src The original string. |
368 | * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. |
369 | * @param dest A buffer for the result string. The result will be NUL-terminated if |
370 | * the buffer is large enough. |
371 | * The contents is undefined in case of failure. |
372 | * @param destCapacity The size of the buffer (number of bytes). If it is 0, then |
373 | * dest may be nullptr and the function will only return the length of the result |
374 | * without writing any of the result string. |
375 | * @param edits Records edits for index mapping, working with styled text, |
376 | * and getting only changes (if any). |
377 | * The Edits contents is undefined if any error occurs. |
378 | * This function calls edits->reset() first unless |
379 | * options includes U_EDITS_NO_RESET. edits can be nullptr. |
380 | * @param errorCode Reference to an in/out error code value |
381 | * which must not indicate a failure before the function call. |
382 | * @return The length of the result string, if successful. |
383 | * When the result would be longer than destCapacity, |
384 | * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. |
385 | * |
386 | * @see ucasemap_utf8ToUpper |
387 | * @stable ICU 59 |
388 | */ |
389 | static int32_t utf8ToUpper( |
390 | const char *locale, uint32_t options, |
391 | const char *src, int32_t srcLength, |
392 | char *dest, int32_t destCapacity, Edits *edits, |
393 | UErrorCode &errorCode); |
394 | |
395 | #if !UCONFIG_NO_BREAK_ITERATION |
396 | |
397 | /** |
398 | * Titlecases a UTF-8 string and optionally records edits. |
399 | * Casing is locale-dependent and context-sensitive. |
400 | * The result may be longer or shorter than the original. |
401 | * The source string and the destination buffer must not overlap. |
402 | * |
403 | * Titlecasing uses a break iterator to find the first characters of words |
404 | * that are to be titlecased. It titlecases those characters and lowercases |
405 | * all others. (This can be modified with options bits.) |
406 | * |
407 | * @param locale The locale ID. ("" = root locale, nullptr = default locale.) |
408 | * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, |
409 | * U_TITLECASE_NO_LOWERCASE, |
410 | * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, |
411 | * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. |
412 | * @param iter A break iterator to find the first characters of words that are to be titlecased. |
413 | * It is set to the source string (setUText()) |
414 | * and used one or more times for iteration (first() and next()). |
415 | * If nullptr, then a word break iterator for the locale is used |
416 | * (or something equivalent). |
417 | * @param src The original string. |
418 | * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. |
419 | * @param dest A buffer for the result string. The result will be NUL-terminated if |
420 | * the buffer is large enough. |
421 | * The contents is undefined in case of failure. |
422 | * @param destCapacity The size of the buffer (number of bytes). If it is 0, then |
423 | * dest may be nullptr and the function will only return the length of the result |
424 | * without writing any of the result string. |
425 | * @param edits Records edits for index mapping, working with styled text, |
426 | * and getting only changes (if any). |
427 | * The Edits contents is undefined if any error occurs. |
428 | * This function calls edits->reset() first unless |
429 | * options includes U_EDITS_NO_RESET. edits can be nullptr. |
430 | * @param errorCode Reference to an in/out error code value |
431 | * which must not indicate a failure before the function call. |
432 | * @return The length of the result string, if successful. |
433 | * When the result would be longer than destCapacity, |
434 | * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. |
435 | * |
436 | * @see ucasemap_utf8ToTitle |
437 | * @stable ICU 59 |
438 | */ |
439 | static int32_t utf8ToTitle( |
440 | const char *locale, uint32_t options, BreakIterator *iter, |
441 | const char *src, int32_t srcLength, |
442 | char *dest, int32_t destCapacity, Edits *edits, |
443 | UErrorCode &errorCode); |
444 | |
445 | #endif // UCONFIG_NO_BREAK_ITERATION |
446 | |
447 | /** |
448 | * Case-folds a UTF-8 string and optionally records edits. |
449 | * |
450 | * Case folding is locale-independent and not context-sensitive, |
451 | * but there is an option for whether to include or exclude mappings for dotted I |
452 | * and dotless i that are marked with 'T' in CaseFolding.txt. |
453 | * |
454 | * The result may be longer or shorter than the original. |
455 | * The source string and the destination buffer must not overlap. |
456 | * |
457 | * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, |
458 | * U_FOLD_CASE_DEFAULT, U_FOLD_CASE_EXCLUDE_SPECIAL_I. |
459 | * @param src The original string. |
460 | * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. |
461 | * @param dest A buffer for the result string. The result will be NUL-terminated if |
462 | * the buffer is large enough. |
463 | * The contents is undefined in case of failure. |
464 | * @param destCapacity The size of the buffer (number of bytes). If it is 0, then |
465 | * dest may be nullptr and the function will only return the length of the result |
466 | * without writing any of the result string. |
467 | * @param edits Records edits for index mapping, working with styled text, |
468 | * and getting only changes (if any). |
469 | * The Edits contents is undefined if any error occurs. |
470 | * This function calls edits->reset() first unless |
471 | * options includes U_EDITS_NO_RESET. edits can be nullptr. |
472 | * @param errorCode Reference to an in/out error code value |
473 | * which must not indicate a failure before the function call. |
474 | * @return The length of the result string, if successful. |
475 | * When the result would be longer than destCapacity, |
476 | * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. |
477 | * |
478 | * @see ucasemap_utf8FoldCase |
479 | * @stable ICU 59 |
480 | */ |
481 | static int32_t utf8Fold( |
482 | uint32_t options, |
483 | const char *src, int32_t srcLength, |
484 | char *dest, int32_t destCapacity, Edits *edits, |
485 | UErrorCode &errorCode); |
486 | |
487 | private: |
488 | CaseMap() = delete; |
489 | CaseMap(const CaseMap &other) = delete; |
490 | CaseMap &operator=(const CaseMap &other) = delete; |
491 | }; |
492 | |
493 | U_NAMESPACE_END |
494 | |
495 | #endif /* U_SHOW_CPLUSPLUS_API */ |
496 | |
497 | #endif // __CASEMAP_H__ |
498 | |