00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00142 #ifndef __UTF_OLD_H__
00143 #define __UTF_OLD_H__
00144
00145 #include "unicode/utf.h"
00146 #include "unicode/utf8.h"
00147 #include "unicode/utf16.h"
00148
00160 #ifndef U_HIDE_OBSOLETE_UTF_OLD_H
00161 # define U_HIDE_OBSOLETE_UTF_OLD_H 0
00162 #endif
00163
00164 #if !defined(U_HIDE_DEPRECATED_API) && !U_HIDE_OBSOLETE_UTF_OLD_H
00165
00166
00167
00168 #ifdef U_USE_UTF_DEPRECATES
00169
00176 typedef int32_t UTextOffset;
00177 #endif
00178
00180 #define UTF_SIZE 16
00181
00188 #define UTF_SAFE
00189
00190 #undef UTF_UNSAFE
00191
00192 #undef UTF_STRICT
00193
00208 #define UTF8_ERROR_VALUE_1 0x15
00209
00215 #define UTF8_ERROR_VALUE_2 0x9f
00216
00223 #define UTF_ERROR_VALUE 0xffff
00224
00231 #define UTF_IS_ERROR(c) \
00232 (((c)&0xfffe)==0xfffe || (c)==UTF8_ERROR_VALUE_1 || (c)==UTF8_ERROR_VALUE_2)
00233
00239 #define UTF_IS_VALID(c) \
00240 (UTF_IS_UNICODE_CHAR(c) && \
00241 (c)!=UTF8_ERROR_VALUE_1 && (c)!=UTF8_ERROR_VALUE_2)
00242
00247 #define UTF_IS_SURROGATE(uchar) (((uchar)&0xfffff800)==0xd800)
00248
00254 #define UTF_IS_UNICODE_NONCHAR(c) \
00255 ((c)>=0xfdd0 && \
00256 ((uint32_t)(c)<=0xfdef || ((c)&0xfffe)==0xfffe) && \
00257 (uint32_t)(c)<=0x10ffff)
00258
00274 #define UTF_IS_UNICODE_CHAR(c) \
00275 ((uint32_t)(c)<0xd800 || \
00276 ((uint32_t)(c)>0xdfff && \
00277 (uint32_t)(c)<=0x10ffff && \
00278 !UTF_IS_UNICODE_NONCHAR(c)))
00279
00280
00281
00293 #ifdef U_UTF8_IMPL
00294
00295 #elif defined(U_STATIC_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION)
00296 U_CFUNC const uint8_t utf8_countTrailBytes[];
00297 #else
00298 U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[];
00299 #endif
00300
00305 #define UTF8_COUNT_TRAIL_BYTES(leadByte) (utf8_countTrailBytes[(uint8_t)leadByte])
00306
00311 #define UTF8_MASK_LEAD_BYTE(leadByte, countTrailBytes) ((leadByte)&=(1<<(6-(countTrailBytes)))-1)
00312
00314 #define UTF8_IS_SINGLE(uchar) (((uchar)&0x80)==0)
00315
00316 #define UTF8_IS_LEAD(uchar) ((uint8_t)((uchar)-0xc0)<0x3e)
00317
00318 #define UTF8_IS_TRAIL(uchar) (((uchar)&0xc0)==0x80)
00319
00321 #define UTF8_NEED_MULTIPLE_UCHAR(c) ((uint32_t)(c)>0x7f)
00322
00336 #if 1
00337 # define UTF8_CHAR_LENGTH(c) \
00338 ((uint32_t)(c)<=0x7f ? 1 : \
00339 ((uint32_t)(c)<=0x7ff ? 2 : \
00340 ((uint32_t)((c)-0x10000)>0xfffff ? 3 : 4) \
00341 ) \
00342 )
00343 #else
00344 # define UTF8_CHAR_LENGTH(c) \
00345 ((uint32_t)(c)<=0x7f ? 1 : \
00346 ((uint32_t)(c)<=0x7ff ? 2 : \
00347 ((uint32_t)(c)<=0xffff ? 3 : \
00348 ((uint32_t)(c)<=0x10ffff ? 4 : \
00349 ((uint32_t)(c)<=0x3ffffff ? 5 : \
00350 ((uint32_t)(c)<=0x7fffffff ? 6 : 3) \
00351 ) \
00352 ) \
00353 ) \
00354 ) \
00355 )
00356 #endif
00357
00359 #define UTF8_MAX_CHAR_LENGTH 4
00360
00362 #define UTF8_ARRAY_SIZE(size) ((5*(size))/2)
00363
00365 #define UTF8_GET_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
00366 int32_t _utf8_get_char_unsafe_index=(int32_t)(i); \
00367 UTF8_SET_CHAR_START_UNSAFE(s, _utf8_get_char_unsafe_index); \
00368 UTF8_NEXT_CHAR_UNSAFE(s, _utf8_get_char_unsafe_index, c); \
00369 } UPRV_BLOCK_MACRO_END
00370
00372 #define UTF8_GET_CHAR_SAFE(s, start, i, length, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
00373 int32_t _utf8_get_char_safe_index=(int32_t)(i); \
00374 UTF8_SET_CHAR_START_SAFE(s, start, _utf8_get_char_safe_index); \
00375 UTF8_NEXT_CHAR_SAFE(s, _utf8_get_char_safe_index, length, c, strict); \
00376 } UPRV_BLOCK_MACRO_END
00377
00379 #define UTF8_NEXT_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
00380 (c)=(s)[(i)++]; \
00381 if((uint8_t)((c)-0xc0)<0x35) { \
00382 uint8_t __count=UTF8_COUNT_TRAIL_BYTES(c); \
00383 UTF8_MASK_LEAD_BYTE(c, __count); \
00384 switch(__count) { \
00385 \
00386 case 3: \
00387 (c)=((c)<<6)|((s)[(i)++]&0x3f); \
00388 case 2: \
00389 (c)=((c)<<6)|((s)[(i)++]&0x3f); \
00390 case 1: \
00391 (c)=((c)<<6)|((s)[(i)++]&0x3f); \
00392 \
00393 break; \
00394 } \
00395 } \
00396 } UPRV_BLOCK_MACRO_END
00397
00399 #define UTF8_APPEND_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
00400 if((uint32_t)(c)<=0x7f) { \
00401 (s)[(i)++]=(uint8_t)(c); \
00402 } else { \
00403 if((uint32_t)(c)<=0x7ff) { \
00404 (s)[(i)++]=(uint8_t)(((c)>>6)|0xc0); \
00405 } else { \
00406 if((uint32_t)(c)<=0xffff) { \
00407 (s)[(i)++]=(uint8_t)(((c)>>12)|0xe0); \
00408 } else { \
00409 (s)[(i)++]=(uint8_t)(((c)>>18)|0xf0); \
00410 (s)[(i)++]=(uint8_t)((((c)>>12)&0x3f)|0x80); \
00411 } \
00412 (s)[(i)++]=(uint8_t)((((c)>>6)&0x3f)|0x80); \
00413 } \
00414 (s)[(i)++]=(uint8_t)(((c)&0x3f)|0x80); \
00415 } \
00416 } UPRV_BLOCK_MACRO_END
00417
00419 #define UTF8_FWD_1_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
00420 (i)+=1+UTF8_COUNT_TRAIL_BYTES((s)[i]); \
00421 } UPRV_BLOCK_MACRO_END
00422
00424 #define UTF8_FWD_N_UNSAFE(s, i, n) UPRV_BLOCK_MACRO_BEGIN { \
00425 int32_t __N=(n); \
00426 while(__N>0) { \
00427 UTF8_FWD_1_UNSAFE(s, i); \
00428 --__N; \
00429 } \
00430 } UPRV_BLOCK_MACRO_END
00431
00433 #define UTF8_SET_CHAR_START_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
00434 while(UTF8_IS_TRAIL((s)[i])) { --(i); } \
00435 } UPRV_BLOCK_MACRO_END
00436
00438 #define UTF8_NEXT_CHAR_SAFE(s, i, length, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
00439 (c)=(s)[(i)++]; \
00440 if((c)>=0x80) { \
00441 if(UTF8_IS_LEAD(c)) { \
00442 (c)=utf8_nextCharSafeBody(s, &(i), (int32_t)(length), c, strict); \
00443 } else { \
00444 (c)=UTF8_ERROR_VALUE_1; \
00445 } \
00446 } \
00447 } UPRV_BLOCK_MACRO_END
00448
00450 #define UTF8_APPEND_CHAR_SAFE(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
00451 if((uint32_t)(c)<=0x7f) { \
00452 (s)[(i)++]=(uint8_t)(c); \
00453 } else { \
00454 (i)=utf8_appendCharSafeBody(s, (int32_t)(i), (int32_t)(length), c, NULL); \
00455 } \
00456 } UPRV_BLOCK_MACRO_END
00457
00459 #define UTF8_FWD_1_SAFE(s, i, length) U8_FWD_1(s, i, length)
00460
00462 #define UTF8_FWD_N_SAFE(s, i, length, n) U8_FWD_N(s, i, length, n)
00463
00465 #define UTF8_SET_CHAR_START_SAFE(s, start, i) U8_SET_CP_START(s, start, i)
00466
00468 #define UTF8_PREV_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
00469 (c)=(s)[--(i)]; \
00470 if(UTF8_IS_TRAIL(c)) { \
00471 uint8_t __b, __count=1, __shift=6; \
00472 \
00473 \
00474 (c)&=0x3f; \
00475 for(;;) { \
00476 __b=(s)[--(i)]; \
00477 if(__b>=0xc0) { \
00478 UTF8_MASK_LEAD_BYTE(__b, __count); \
00479 (c)|=(UChar32)__b<<__shift; \
00480 break; \
00481 } else { \
00482 (c)|=(UChar32)(__b&0x3f)<<__shift; \
00483 ++__count; \
00484 __shift+=6; \
00485 } \
00486 } \
00487 } \
00488 } UPRV_BLOCK_MACRO_END
00489
00491 #define UTF8_BACK_1_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
00492 while(UTF8_IS_TRAIL((s)[--(i)])) {} \
00493 } UPRV_BLOCK_MACRO_END
00494
00496 #define UTF8_BACK_N_UNSAFE(s, i, n) UPRV_BLOCK_MACRO_BEGIN { \
00497 int32_t __N=(n); \
00498 while(__N>0) { \
00499 UTF8_BACK_1_UNSAFE(s, i); \
00500 --__N; \
00501 } \
00502 } UPRV_BLOCK_MACRO_END
00503
00505 #define UTF8_SET_CHAR_LIMIT_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
00506 UTF8_BACK_1_UNSAFE(s, i); \
00507 UTF8_FWD_1_UNSAFE(s, i); \
00508 } UPRV_BLOCK_MACRO_END
00509
00511 #define UTF8_PREV_CHAR_SAFE(s, start, i, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
00512 (c)=(s)[--(i)]; \
00513 if((c)>=0x80) { \
00514 if((c)<=0xbf) { \
00515 (c)=utf8_prevCharSafeBody(s, start, &(i), c, strict); \
00516 } else { \
00517 (c)=UTF8_ERROR_VALUE_1; \
00518 } \
00519 } \
00520 } UPRV_BLOCK_MACRO_END
00521
00523 #define UTF8_BACK_1_SAFE(s, start, i) U8_BACK_1(s, start, i)
00524
00526 #define UTF8_BACK_N_SAFE(s, start, i, n) U8_BACK_N(s, start, i, n)
00527
00529 #define UTF8_SET_CHAR_LIMIT_SAFE(s, start, i, length) U8_SET_CP_LIMIT(s, start, i, length)
00530
00531
00532
00534 #define UTF_IS_FIRST_SURROGATE(uchar) (((uchar)&0xfffffc00)==0xd800)
00535
00537 #define UTF_IS_SECOND_SURROGATE(uchar) (((uchar)&0xfffffc00)==0xdc00)
00538
00540 #define UTF_IS_SURROGATE_FIRST(c) (((c)&0x400)==0)
00541
00543 #define UTF_SURROGATE_OFFSET ((0xd800<<10UL)+0xdc00-0x10000)
00544
00546 #define UTF16_GET_PAIR_VALUE(first, second) \
00547 (((first)<<10UL)+(second)-UTF_SURROGATE_OFFSET)
00548
00550 #define UTF_FIRST_SURROGATE(supplementary) (UChar)(((supplementary)>>10)+0xd7c0)
00551
00553 #define UTF_SECOND_SURROGATE(supplementary) (UChar)(((supplementary)&0x3ff)|0xdc00)
00554
00556 #define UTF16_LEAD(supplementary) UTF_FIRST_SURROGATE(supplementary)
00557
00559 #define UTF16_TRAIL(supplementary) UTF_SECOND_SURROGATE(supplementary)
00560
00562 #define UTF16_IS_SINGLE(uchar) !UTF_IS_SURROGATE(uchar)
00563
00565 #define UTF16_IS_LEAD(uchar) UTF_IS_FIRST_SURROGATE(uchar)
00566
00568 #define UTF16_IS_TRAIL(uchar) UTF_IS_SECOND_SURROGATE(uchar)
00569
00571 #define UTF16_NEED_MULTIPLE_UCHAR(c) ((uint32_t)(c)>0xffff)
00572
00574 #define UTF16_CHAR_LENGTH(c) ((uint32_t)(c)<=0xffff ? 1 : 2)
00575
00577 #define UTF16_MAX_CHAR_LENGTH 2
00578
00580 #define UTF16_ARRAY_SIZE(size) (size)
00581
00593 #define UTF16_GET_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
00594 (c)=(s)[i]; \
00595 if(UTF_IS_SURROGATE(c)) { \
00596 if(UTF_IS_SURROGATE_FIRST(c)) { \
00597 (c)=UTF16_GET_PAIR_VALUE((c), (s)[(i)+1]); \
00598 } else { \
00599 (c)=UTF16_GET_PAIR_VALUE((s)[(i)-1], (c)); \
00600 } \
00601 } \
00602 } UPRV_BLOCK_MACRO_END
00603
00605 #define UTF16_GET_CHAR_SAFE(s, start, i, length, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
00606 (c)=(s)[i]; \
00607 if(UTF_IS_SURROGATE(c)) { \
00608 uint16_t __c2; \
00609 if(UTF_IS_SURROGATE_FIRST(c)) { \
00610 if((i)+1<(length) && UTF_IS_SECOND_SURROGATE(__c2=(s)[(i)+1])) { \
00611 (c)=UTF16_GET_PAIR_VALUE((c), __c2); \
00612 \
00613 } else if(strict) {\
00614 \
00615 (c)=UTF_ERROR_VALUE; \
00616 } \
00617 } else { \
00618 if((i)-1>=(start) && UTF_IS_FIRST_SURROGATE(__c2=(s)[(i)-1])) { \
00619 (c)=UTF16_GET_PAIR_VALUE(__c2, (c)); \
00620 \
00621 } else if(strict) {\
00622 \
00623 (c)=UTF_ERROR_VALUE; \
00624 } \
00625 } \
00626 } else if((strict) && !UTF_IS_UNICODE_CHAR(c)) { \
00627 (c)=UTF_ERROR_VALUE; \
00628 } \
00629 } UPRV_BLOCK_MACRO_END
00630
00632 #define UTF16_NEXT_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
00633 (c)=(s)[(i)++]; \
00634 if(UTF_IS_FIRST_SURROGATE(c)) { \
00635 (c)=UTF16_GET_PAIR_VALUE((c), (s)[(i)++]); \
00636 } \
00637 } UPRV_BLOCK_MACRO_END
00638
00640 #define UTF16_APPEND_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
00641 if((uint32_t)(c)<=0xffff) { \
00642 (s)[(i)++]=(uint16_t)(c); \
00643 } else { \
00644 (s)[(i)++]=(uint16_t)(((c)>>10)+0xd7c0); \
00645 (s)[(i)++]=(uint16_t)(((c)&0x3ff)|0xdc00); \
00646 } \
00647 } UPRV_BLOCK_MACRO_END
00648
00650 #define UTF16_FWD_1_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
00651 if(UTF_IS_FIRST_SURROGATE((s)[(i)++])) { \
00652 ++(i); \
00653 } \
00654 } UPRV_BLOCK_MACRO_END
00655
00657 #define UTF16_FWD_N_UNSAFE(s, i, n) UPRV_BLOCK_MACRO_BEGIN { \
00658 int32_t __N=(n); \
00659 while(__N>0) { \
00660 UTF16_FWD_1_UNSAFE(s, i); \
00661 --__N; \
00662 } \
00663 } UPRV_BLOCK_MACRO_END
00664
00666 #define UTF16_SET_CHAR_START_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
00667 if(UTF_IS_SECOND_SURROGATE((s)[i])) { \
00668 --(i); \
00669 } \
00670 } UPRV_BLOCK_MACRO_END
00671
00673 #define UTF16_NEXT_CHAR_SAFE(s, i, length, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
00674 (c)=(s)[(i)++]; \
00675 if(UTF_IS_FIRST_SURROGATE(c)) { \
00676 uint16_t __c2; \
00677 if((i)<(length) && UTF_IS_SECOND_SURROGATE(__c2=(s)[(i)])) { \
00678 ++(i); \
00679 (c)=UTF16_GET_PAIR_VALUE((c), __c2); \
00680 \
00681 } else if(strict) {\
00682 \
00683 (c)=UTF_ERROR_VALUE; \
00684 } \
00685 } else if((strict) && !UTF_IS_UNICODE_CHAR(c)) { \
00686 \
00687 (c)=UTF_ERROR_VALUE; \
00688 } \
00689 } UPRV_BLOCK_MACRO_END
00690
00692 #define UTF16_APPEND_CHAR_SAFE(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
00693 if((uint32_t)(c)<=0xffff) { \
00694 (s)[(i)++]=(uint16_t)(c); \
00695 } else if((uint32_t)(c)<=0x10ffff) { \
00696 if((i)+1<(length)) { \
00697 (s)[(i)++]=(uint16_t)(((c)>>10)+0xd7c0); \
00698 (s)[(i)++]=(uint16_t)(((c)&0x3ff)|0xdc00); \
00699 } else { \
00700 (s)[(i)++]=UTF_ERROR_VALUE; \
00701 } \
00702 } else { \
00703 (s)[(i)++]=UTF_ERROR_VALUE; \
00704 } \
00705 } UPRV_BLOCK_MACRO_END
00706
00708 #define UTF16_FWD_1_SAFE(s, i, length) U16_FWD_1(s, i, length)
00709
00711 #define UTF16_FWD_N_SAFE(s, i, length, n) U16_FWD_N(s, i, length, n)
00712
00714 #define UTF16_SET_CHAR_START_SAFE(s, start, i) U16_SET_CP_START(s, start, i)
00715
00717 #define UTF16_PREV_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
00718 (c)=(s)[--(i)]; \
00719 if(UTF_IS_SECOND_SURROGATE(c)) { \
00720 (c)=UTF16_GET_PAIR_VALUE((s)[--(i)], (c)); \
00721 } \
00722 } UPRV_BLOCK_MACRO_END
00723
00725 #define UTF16_BACK_1_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
00726 if(UTF_IS_SECOND_SURROGATE((s)[--(i)])) { \
00727 --(i); \
00728 } \
00729 } UPRV_BLOCK_MACRO_END
00730
00732 #define UTF16_BACK_N_UNSAFE(s, i, n) UPRV_BLOCK_MACRO_BEGIN { \
00733 int32_t __N=(n); \
00734 while(__N>0) { \
00735 UTF16_BACK_1_UNSAFE(s, i); \
00736 --__N; \
00737 } \
00738 } UPRV_BLOCK_MACRO_END
00739
00741 #define UTF16_SET_CHAR_LIMIT_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
00742 if(UTF_IS_FIRST_SURROGATE((s)[(i)-1])) { \
00743 ++(i); \
00744 } \
00745 } UPRV_BLOCK_MACRO_END
00746
00748 #define UTF16_PREV_CHAR_SAFE(s, start, i, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
00749 (c)=(s)[--(i)]; \
00750 if(UTF_IS_SECOND_SURROGATE(c)) { \
00751 uint16_t __c2; \
00752 if((i)>(start) && UTF_IS_FIRST_SURROGATE(__c2=(s)[(i)-1])) { \
00753 --(i); \
00754 (c)=UTF16_GET_PAIR_VALUE(__c2, (c)); \
00755 \
00756 } else if(strict) {\
00757 \
00758 (c)=UTF_ERROR_VALUE; \
00759 } \
00760 } else if((strict) && !UTF_IS_UNICODE_CHAR(c)) { \
00761 \
00762 (c)=UTF_ERROR_VALUE; \
00763 } \
00764 } UPRV_BLOCK_MACRO_END
00765
00767 #define UTF16_BACK_1_SAFE(s, start, i) U16_BACK_1(s, start, i)
00768
00770 #define UTF16_BACK_N_SAFE(s, start, i, n) U16_BACK_N(s, start, i, n)
00771
00773 #define UTF16_SET_CHAR_LIMIT_SAFE(s, start, i, length) U16_SET_CP_LIMIT(s, start, i, length)
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00793 #define UTF32_IS_SAFE(c, strict) \
00794 (!(strict) ? \
00795 (uint32_t)(c)<=0x10ffff : \
00796 UTF_IS_UNICODE_CHAR(c))
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00809 #define UTF32_IS_SINGLE(uchar) 1
00810
00811 #define UTF32_IS_LEAD(uchar) 0
00812
00813 #define UTF32_IS_TRAIL(uchar) 0
00814
00815
00816
00818 #define UTF32_NEED_MULTIPLE_UCHAR(c) 0
00819
00820 #define UTF32_CHAR_LENGTH(c) 1
00821
00822 #define UTF32_MAX_CHAR_LENGTH 1
00823
00824
00825
00827 #define UTF32_ARRAY_SIZE(size) (size)
00828
00830 #define UTF32_GET_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
00831 (c)=(s)[i]; \
00832 } UPRV_BLOCK_MACRO_END
00833
00835 #define UTF32_GET_CHAR_SAFE(s, start, i, length, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
00836 (c)=(s)[i]; \
00837 if(!UTF32_IS_SAFE(c, strict)) { \
00838 (c)=UTF_ERROR_VALUE; \
00839 } \
00840 } UPRV_BLOCK_MACRO_END
00841
00842
00843
00845 #define UTF32_NEXT_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
00846 (c)=(s)[(i)++]; \
00847 } UPRV_BLOCK_MACRO_END
00848
00850 #define UTF32_APPEND_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
00851 (s)[(i)++]=(c); \
00852 } UPRV_BLOCK_MACRO_END
00853
00855 #define UTF32_FWD_1_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
00856 ++(i); \
00857 } UPRV_BLOCK_MACRO_END
00858
00860 #define UTF32_FWD_N_UNSAFE(s, i, n) UPRV_BLOCK_MACRO_BEGIN { \
00861 (i)+=(n); \
00862 } UPRV_BLOCK_MACRO_END
00863
00865 #define UTF32_SET_CHAR_START_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
00866 } UPRV_BLOCK_MACRO_END
00867
00869 #define UTF32_NEXT_CHAR_SAFE(s, i, length, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
00870 (c)=(s)[(i)++]; \
00871 if(!UTF32_IS_SAFE(c, strict)) { \
00872 (c)=UTF_ERROR_VALUE; \
00873 } \
00874 } UPRV_BLOCK_MACRO_END
00875
00877 #define UTF32_APPEND_CHAR_SAFE(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \
00878 if((uint32_t)(c)<=0x10ffff) { \
00879 (s)[(i)++]=(c); \
00880 } else { \
00881 (s)[(i)++]=0xfffd; \
00882 } \
00883 } UPRV_BLOCK_MACRO_END
00884
00886 #define UTF32_FWD_1_SAFE(s, i, length) UPRV_BLOCK_MACRO_BEGIN { \
00887 ++(i); \
00888 } UPRV_BLOCK_MACRO_END
00889
00891 #define UTF32_FWD_N_SAFE(s, i, length, n) UPRV_BLOCK_MACRO_BEGIN { \
00892 if(((i)+=(n))>(length)) { \
00893 (i)=(length); \
00894 } \
00895 } UPRV_BLOCK_MACRO_END
00896
00898 #define UTF32_SET_CHAR_START_SAFE(s, start, i) UPRV_BLOCK_MACRO_BEGIN { \
00899 } UPRV_BLOCK_MACRO_END
00900
00901
00902
00904 #define UTF32_PREV_CHAR_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \
00905 (c)=(s)[--(i)]; \
00906 } UPRV_BLOCK_MACRO_END
00907
00909 #define UTF32_BACK_1_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
00910 --(i); \
00911 } UPRV_BLOCK_MACRO_END
00912
00914 #define UTF32_BACK_N_UNSAFE(s, i, n) UPRV_BLOCK_MACRO_BEGIN { \
00915 (i)-=(n); \
00916 } UPRV_BLOCK_MACRO_END
00917
00919 #define UTF32_SET_CHAR_LIMIT_UNSAFE(s, i) UPRV_BLOCK_MACRO_BEGIN { \
00920 } UPRV_BLOCK_MACRO_END
00921
00923 #define UTF32_PREV_CHAR_SAFE(s, start, i, c, strict) UPRV_BLOCK_MACRO_BEGIN { \
00924 (c)=(s)[--(i)]; \
00925 if(!UTF32_IS_SAFE(c, strict)) { \
00926 (c)=UTF_ERROR_VALUE; \
00927 } \
00928 } UPRV_BLOCK_MACRO_END
00929
00931 #define UTF32_BACK_1_SAFE(s, start, i) UPRV_BLOCK_MACRO_BEGIN { \
00932 --(i); \
00933 } UPRV_BLOCK_MACRO_END
00934
00936 #define UTF32_BACK_N_SAFE(s, start, i, n) UPRV_BLOCK_MACRO_BEGIN { \
00937 (i)-=(n); \
00938 if((i)<(start)) { \
00939 (i)=(start); \
00940 } \
00941 } UPRV_BLOCK_MACRO_END
00942
00944 #define UTF32_SET_CHAR_LIMIT_SAFE(s, i, length) UPRV_BLOCK_MACRO_BEGIN { \
00945 } UPRV_BLOCK_MACRO_END
00946
00947
00948
00954 #define UTF_ARRAY_SIZE(size) UTF16_ARRAY_SIZE(size)
00955
00957 #define UTF_GET_CHAR_UNSAFE(s, i, c) UTF16_GET_CHAR_UNSAFE(s, i, c)
00958
00960 #define UTF_GET_CHAR_SAFE(s, start, i, length, c, strict) UTF16_GET_CHAR_SAFE(s, start, i, length, c, strict)
00961
00962
00964 #define UTF_NEXT_CHAR_UNSAFE(s, i, c) UTF16_NEXT_CHAR_UNSAFE(s, i, c)
00965
00967 #define UTF_NEXT_CHAR_SAFE(s, i, length, c, strict) UTF16_NEXT_CHAR_SAFE(s, i, length, c, strict)
00968
00969
00971 #define UTF_APPEND_CHAR_UNSAFE(s, i, c) UTF16_APPEND_CHAR_UNSAFE(s, i, c)
00972
00974 #define UTF_APPEND_CHAR_SAFE(s, i, length, c) UTF16_APPEND_CHAR_SAFE(s, i, length, c)
00975
00976
00978 #define UTF_FWD_1_UNSAFE(s, i) UTF16_FWD_1_UNSAFE(s, i)
00979
00981 #define UTF_FWD_1_SAFE(s, i, length) UTF16_FWD_1_SAFE(s, i, length)
00982
00983
00985 #define UTF_FWD_N_UNSAFE(s, i, n) UTF16_FWD_N_UNSAFE(s, i, n)
00986
00988 #define UTF_FWD_N_SAFE(s, i, length, n) UTF16_FWD_N_SAFE(s, i, length, n)
00989
00990
00992 #define UTF_SET_CHAR_START_UNSAFE(s, i) UTF16_SET_CHAR_START_UNSAFE(s, i)
00993
00995 #define UTF_SET_CHAR_START_SAFE(s, start, i) UTF16_SET_CHAR_START_SAFE(s, start, i)
00996
00997
00999 #define UTF_PREV_CHAR_UNSAFE(s, i, c) UTF16_PREV_CHAR_UNSAFE(s, i, c)
01000
01002 #define UTF_PREV_CHAR_SAFE(s, start, i, c, strict) UTF16_PREV_CHAR_SAFE(s, start, i, c, strict)
01003
01004
01006 #define UTF_BACK_1_UNSAFE(s, i) UTF16_BACK_1_UNSAFE(s, i)
01007
01009 #define UTF_BACK_1_SAFE(s, start, i) UTF16_BACK_1_SAFE(s, start, i)
01010
01011
01013 #define UTF_BACK_N_UNSAFE(s, i, n) UTF16_BACK_N_UNSAFE(s, i, n)
01014
01016 #define UTF_BACK_N_SAFE(s, start, i, n) UTF16_BACK_N_SAFE(s, start, i, n)
01017
01018
01020 #define UTF_SET_CHAR_LIMIT_UNSAFE(s, i) UTF16_SET_CHAR_LIMIT_UNSAFE(s, i)
01021
01023 #define UTF_SET_CHAR_LIMIT_SAFE(s, start, i, length) UTF16_SET_CHAR_LIMIT_SAFE(s, start, i, length)
01024
01025
01026
01032 #define UTF_IS_SINGLE(uchar) U16_IS_SINGLE(uchar)
01033
01039 #define UTF_IS_LEAD(uchar) U16_IS_LEAD(uchar)
01040
01046 #define UTF_IS_TRAIL(uchar) U16_IS_TRAIL(uchar)
01047
01053 #define UTF_NEED_MULTIPLE_UCHAR(c) UTF16_NEED_MULTIPLE_UCHAR(c)
01054
01060 #define UTF_CHAR_LENGTH(c) U16_LENGTH(c)
01061
01067 #define UTF_MAX_CHAR_LENGTH U16_MAX_LENGTH
01068
01078 #define UTF_GET_CHAR(s, start, i, length, c) U16_GET(s, start, i, length, c)
01079
01091 #define UTF_NEXT_CHAR(s, i, length, c) U16_NEXT(s, i, length, c)
01092
01104 #define UTF_APPEND_CHAR(s, i, length, c) UTF16_APPEND_CHAR_SAFE(s, i, length, c)
01105
01115 #define UTF_FWD_1(s, i, length) U16_FWD_1(s, i, length)
01116
01126 #define UTF_FWD_N(s, i, length, n) U16_FWD_N(s, i, length, n)
01127
01142 #define UTF_SET_CHAR_START(s, start, i) U16_SET_CP_START(s, start, i)
01143
01155 #define UTF_PREV_CHAR(s, start, i, c) U16_PREV(s, start, i, c)
01156
01168 #define UTF_BACK_1(s, start, i) U16_BACK_1(s, start, i)
01169
01181 #define UTF_BACK_N(s, start, i, n) U16_BACK_N(s, start, i, n)
01182
01197 #define UTF_SET_CHAR_LIMIT(s, start, i, length) U16_SET_CP_LIMIT(s, start, i, length)
01198
01199 #endif // !U_HIDE_DEPRECATED_API && !U_HIDE_OBSOLETE_UTF_OLD_H
01200
01201 #endif