static void TestSetChar(){ static UChar input[]={0x0061, 0xd800, 0xdc00, 0xdbff, 0xdfff, 0x0062, 0xd841, 0xd7ff, 0xd841, 0xdc41, 0xdc00, 0x0000}; static uint16_t start_unsafe[]={0, 1, 1, 3, 3, 5, 6, 7, 8, 8, 9, 11}; static uint16_t start_safe[] ={0, 1, 1, 3, 3, 5, 6, 7, 8, 8, 10, 11}; static uint16_t limit_unsafe[]={0, 1, 3, 3, 5, 5, 6, 8, 8, 10, 10, 11}; static uint16_t limit_safe[] ={0, 1, 3, 3, 5, 5, 6, 7, 8, 10, 10, 11}; uint16_t i=0; uint16_t offset=0, setOffset=0; for(offset=0; offset<sizeof(input)/U_SIZEOF_UCHAR; offset++){ setOffset=offset; UTF16_SET_CHAR_START_UNSAFE(input, setOffset); if(setOffset != start_unsafe[i]){ log_err("ERROR: UTF16_SET_CHAR_START_UNSAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, start_unsafe[i], setOffset); } setOffset=offset; U16_SET_CP_START_UNSAFE(input, setOffset); if(setOffset != start_unsafe[i]){ log_err("ERROR: U16_SET_CHAR_START_UNSAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, start_unsafe[i], setOffset); } setOffset=offset; UTF16_SET_CHAR_START_SAFE(input, 0, setOffset); if(setOffset != start_safe[i]){ log_err("ERROR: UTF16_SET_CHAR_START_SAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, start_safe[i], setOffset); } setOffset=offset; U16_SET_CP_START(input, 0, setOffset); if(setOffset != start_safe[i]){ log_err("ERROR: U16_SET_CHAR_START failed for offset=%ld. Expected:%lx Got:%lx\n", offset, start_safe[i], setOffset); } if (offset > 0) { setOffset=offset; UTF16_SET_CHAR_LIMIT_UNSAFE(input, setOffset); if(setOffset != limit_unsafe[i]){ log_err("ERROR: UTF16_SET_CHAR_LIMIT_UNSAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, limit_unsafe[i], setOffset); } setOffset=offset; U16_SET_CP_LIMIT_UNSAFE(input, setOffset); if(setOffset != limit_unsafe[i]){ log_err("ERROR: U16_SET_CHAR_LIMIT_UNSAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, limit_unsafe[i], setOffset); } } setOffset=offset; U16_SET_CP_LIMIT(input,0, setOffset, sizeof(input)/U_SIZEOF_UCHAR); if(setOffset != limit_safe[i]){ log_err("ERROR: U16_SET_CHAR_LIMIT failed for offset=%ld. Expected:%lx Got:%lx\n", offset, limit_safe[i], setOffset); } i++; } }
/* keep this in sync with utf8tst.c's TestNulTerminated() */ static void TestNulTerminated() { static const UChar input[]={ /* 0 */ 0x61, /* 1 */ 0xd801, 0xdc01, /* 3 */ 0xdc01, /* 4 */ 0x62, /* 5 */ 0xd801, /* 6 */ 0x00 /* 7 */ }; static const UChar32 result[]={ 0x61, 0x10401, 0xdc01, 0x62, 0xd801, 0 }; UChar32 c, c2; int32_t i0, i=0, j, k, expectedIndex; int32_t cpIndex=0; do { i0=i; U16_NEXT(input, i, -1, c); if(c!=result[cpIndex]) { log_err("U16_NEXT(from %d)=U+%04x != U+%04x\n", i0, c, result[cpIndex]); } j=i0; U16_FWD_1(input, j, -1); if(j!=i) { log_err("U16_FWD_1() moved to index %d but U16_NEXT() moved to %d\n", j, i); } ++cpIndex; /* * Move by this many code points from the start. * U16_FWD_N() stops at the end of the string, that is, at the NUL if necessary. */ expectedIndex= (c==0) ? i-1 : i; k=0; U16_FWD_N(input, k, -1, cpIndex); if(k!=expectedIndex) { log_err("U16_FWD_N(code points from 0) moved to index %d but expected %d\n", k, expectedIndex); } } while(c!=0); i=0; do { j=i0=i; U16_NEXT(input, i, -1, c); do { U16_GET(input, 0, j, -1, c2); if(c2!=c) { log_err("U16_NEXT(from %d)=U+%04x != U+%04x=U16_GET(at %d)\n", i0, c, c2, j); } /* U16_SET_CP_LIMIT moves from a non-lead byte to the limit of the code point */ k=j+1; U16_SET_CP_LIMIT(input, 0, k, -1); if(k!=i) { log_err("U16_NEXT() moved to %d but U16_SET_CP_LIMIT(%d) moved to %d\n", i, j+1, k); } } while(++j<i); } while(c!=0); }