ICU-8569 Terminate the UTF-7 byte buffer with MINUS when flushing
X-SVN-Rev: 30175
This commit is contained in:
parent
5ef5a3bed2
commit
96a2328093
@ -1,6 +1,6 @@
|
||||
/*
|
||||
**********************************************************************
|
||||
* Copyright (C) 2002-2010, International Business Machines
|
||||
* Copyright (C) 2002-2011, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
**********************************************************************
|
||||
* file name: ucnv_u7.c
|
||||
@ -688,14 +688,26 @@ unicodeMode:
|
||||
|
||||
if(pArgs->flush && source>=sourceLimit) {
|
||||
/* flush remaining bits to the target */
|
||||
if(!inDirectMode && base64Counter!=0) {
|
||||
if(!inDirectMode) {
|
||||
if (base64Counter!=0) {
|
||||
if(target<targetLimit) {
|
||||
*target++=toBase64[bits];
|
||||
if(offsets!=NULL) {
|
||||
*offsets++=sourceIndex-1;
|
||||
}
|
||||
} else {
|
||||
cnv->charErrorBuffer[cnv->charErrorBufferLength++]=toBase64[bits];
|
||||
*pErrorCode=U_BUFFER_OVERFLOW_ERROR;
|
||||
}
|
||||
}
|
||||
/* Add final MINUS to terminate unicodeMode */
|
||||
if(target<targetLimit) {
|
||||
*target++=toBase64[bits];
|
||||
*target++=MINUS;
|
||||
if(offsets!=NULL) {
|
||||
*offsets++=sourceIndex-1;
|
||||
}
|
||||
} else {
|
||||
cnv->charErrorBuffer[cnv->charErrorBufferLength++]=toBase64[bits];
|
||||
cnv->charErrorBuffer[cnv->charErrorBufferLength++]=MINUS;
|
||||
*pErrorCode=U_BUFFER_OVERFLOW_ERROR;
|
||||
}
|
||||
}
|
||||
|
@ -469,9 +469,9 @@ static ETestConvertResult testConvertFromU( const UChar *source, int sourceLen,
|
||||
if(expectLen != targ-junkout) {
|
||||
log_err("Expected %d chars out, got %d %s\n", expectLen, targ-junkout, gNuConvTestName);
|
||||
log_verbose("Expected %d chars out, got %d %s\n", expectLen, targ-junkout, gNuConvTestName);
|
||||
printf("\nGot:");
|
||||
fprintf(stderr, "Got:\n");
|
||||
printSeqErr((const unsigned char*)junkout, (int32_t)(targ-junkout));
|
||||
printf("\nExpected:");
|
||||
fprintf(stderr, "Expected:\n");
|
||||
printSeqErr((const unsigned char*)expect, expectLen);
|
||||
return TC_MISMATCH;
|
||||
}
|
||||
@ -502,9 +502,9 @@ static ETestConvertResult testConvertFromU( const UChar *source, int sourceLen,
|
||||
} else {
|
||||
log_err("String does not match u->%s\n", gNuConvTestName);
|
||||
printUSeqErr(source, sourceLen);
|
||||
printf("\nGot:");
|
||||
fprintf(stderr, "Got:\n");
|
||||
printSeqErr((const unsigned char *)junkout, expectLen);
|
||||
printf("\nExpected:");
|
||||
fprintf(stderr, "Expected:\n");
|
||||
printSeqErr((const unsigned char *)expect, expectLen);
|
||||
|
||||
return TC_MISMATCH;
|
||||
@ -955,12 +955,12 @@ static void TestNewConvertWithBufferSizes(int32_t outsize, int32_t insize )
|
||||
Hi Mom -+Jjo--!
|
||||
A+ImIDkQ.
|
||||
+-
|
||||
+ZeVnLIqe
|
||||
+ZeVnLIqe-
|
||||
*/
|
||||
0x48, 0x69, 0x20, 0x4d, 0x6f, 0x6d, 0x20, 0x2d, 0x2b, 0x4a, 0x6a, 0x6f, 0x2d, 0x2d, 0x21,
|
||||
0x41, 0x2b, 0x49, 0x6d, 0x49, 0x44, 0x6b, 0x51, 0x2e,
|
||||
0x2b, 0x2d,
|
||||
0x2b, 0x5a, 0x65, 0x56, 0x6e, 0x4c, 0x49, 0x71, 0x65
|
||||
0x2b, 0x5a, 0x65, 0x56, 0x6e, 0x4c, 0x49, 0x71, 0x65, 0x2d
|
||||
};
|
||||
static const UChar unicode[] = {
|
||||
/*
|
||||
@ -984,7 +984,7 @@ static void TestNewConvertWithBufferSizes(int32_t outsize, int32_t insize )
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 9, 10,
|
||||
11, 12, 12, 12, 13, 13, 13, 13, 14,
|
||||
15, 15,
|
||||
16, 16, 16, 17, 17, 17, 18, 18, 18
|
||||
16, 16, 16, 17, 17, 17, 18, 18, 18, 18
|
||||
};
|
||||
|
||||
/* same but escaping set O (the exclamation mark) */
|
||||
@ -993,12 +993,12 @@ static void TestNewConvertWithBufferSizes(int32_t outsize, int32_t insize )
|
||||
Hi Mom -+Jjo--+ACE-
|
||||
A+ImIDkQ.
|
||||
+-
|
||||
+ZeVnLIqe
|
||||
+ZeVnLIqe-
|
||||
*/
|
||||
0x48, 0x69, 0x20, 0x4d, 0x6f, 0x6d, 0x20, 0x2d, 0x2b, 0x4a, 0x6a, 0x6f, 0x2d, 0x2d, 0x2b, 0x41, 0x43, 0x45, 0x2d,
|
||||
0x41, 0x2b, 0x49, 0x6d, 0x49, 0x44, 0x6b, 0x51, 0x2e,
|
||||
0x2b, 0x2d,
|
||||
0x2b, 0x5a, 0x65, 0x56, 0x6e, 0x4c, 0x49, 0x71, 0x65
|
||||
0x2b, 0x5a, 0x65, 0x56, 0x6e, 0x4c, 0x49, 0x71, 0x65, 0x2d
|
||||
};
|
||||
static const int32_t toUnicodeOffsetsR[] = {
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 9, 13, 15,
|
||||
@ -1010,7 +1010,7 @@ static void TestNewConvertWithBufferSizes(int32_t outsize, int32_t insize )
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 9, 10, 10, 10, 10, 10,
|
||||
11, 12, 12, 12, 13, 13, 13, 13, 14,
|
||||
15, 15,
|
||||
16, 16, 16, 17, 17, 17, 18, 18, 18
|
||||
16, 16, 16, 17, 17, 17, 18, 18, 18, 18
|
||||
};
|
||||
|
||||
testConvertFromU(unicode, sizeof(unicode)/U_SIZEOF_UCHAR, utf7, sizeof(utf7), "UTF-7", fromUnicodeOffsets,FALSE);
|
||||
|
14
icu4c/source/test/testdata/conversion.txt
vendored
14
icu4c/source/test/testdata/conversion.txt
vendored
@ -973,6 +973,13 @@ conversion:table(nofallback) {
|
||||
:intvector{},
|
||||
:int{0}, :int{0}, "illegal", ".", :bin{ 0e }
|
||||
}
|
||||
{
|
||||
"UTF-7",
|
||||
:bin{ 2b414b4d2d492b414b4d4170412d },
|
||||
"\u00a3I\u00a3\u00a4",
|
||||
:intvector{ 1,5,7,9 },
|
||||
:int{0}, :int{0}, "", ".", :bin{""}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1778,6 +1785,13 @@ conversion:table(nofallback) {
|
||||
:intvector{ 0,0,0,0,2,2,3,3,4,4 },
|
||||
:int{1}, :int{0}, "", "0", ""
|
||||
}
|
||||
{
|
||||
"UTF-7",
|
||||
"\u00a3I\u00a3\u00a4",
|
||||
:bin{ 2b414b4d2d492b414b4d4170412d },
|
||||
:intvector{ 0,0,0,0,0,1,2,2,2,3,3,3,3,3 },
|
||||
:int{1}, :int{0}, "", "0", ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user