ICU-4475 fix for ASCII resolution

X-SVN-Rev: 17560
This commit is contained in:
Ram Viswanadha 2005-05-05 20:59:04 +00:00
parent 39b2b6a3bf
commit e53233979c
2 changed files with 38 additions and 20 deletions

View file

@ -205,7 +205,7 @@ _internal_toASCII(const UChar* src, int32_t srcLength,
UChar b1Stack[MAX_LABEL_BUFFER_SIZE], b2Stack[MAX_LABEL_BUFFER_SIZE];
//initialize pointers to stack buffers
UChar *b1 = b1Stack, *b2 = b2Stack;
int32_t b1Len, b2Len,
int32_t b1Len=0, b2Len,
b1Capacity = MAX_LABEL_BUFFER_SIZE,
b2Capacity = MAX_LABEL_BUFFER_SIZE ,
reqLength=0;
@ -224,30 +224,48 @@ _internal_toASCII(const UChar* src, int32_t srcLength,
UBool useSTD3ASCIIRules = (UBool)((options & UIDNA_USE_STD3_RULES) != 0);
int32_t failPos = -1;
// step 2
b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Capacity, namePrepOptions, parseError, status);
if(*status == U_BUFFER_OVERFLOW_ERROR){
// redo processing of string
// we do not have enough room so grow the buffer
b1 = (UChar*) uprv_malloc(b1Len * U_SIZEOF_UCHAR);
if(b1==NULL){
*status = U_MEMORY_ALLOCATION_ERROR;
goto CLEANUP;
}
if(srcLength == -1){
srcLength = u_strlen(src);
}
*status = U_ZERO_ERROR; // reset error
// step 1
for( j=0;j<srcLength;j++){
if(src[j] > 0x7F){
srcIsASCII = FALSE;
}
b1[b1Len++] = src[j];
}
// step 2 is performed only if the source contains non ASCII
if(srcIsASCII == FALSE){
b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Len, namePrepOptions, parseError, status);
// step 2
b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Capacity, namePrepOptions, parseError, status);
if(*status == U_BUFFER_OVERFLOW_ERROR){
// redo processing of string
// we do not have enough room so grow the buffer
b1 = (UChar*) uprv_malloc(b1Len * U_SIZEOF_UCHAR);
if(b1==NULL){
*status = U_MEMORY_ALLOCATION_ERROR;
goto CLEANUP;
}
*status = U_ZERO_ERROR; // reset error
b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Len, namePrepOptions, parseError, status);
}
}
// error bail out
if(U_FAILURE(*status)){
goto CLEANUP;
}
// step 3 & 4
// for step 3 & 4
srcIsASCII = TRUE;
for( j=0;j<b1Len;j++){
// check if output of usprep_prepare is all ASCII
if(b1[j] > 0x7F){
srcIsASCII = FALSE;
}else if(isLDHChar(b1[j])==FALSE){ // if the char is in ASCII range verify that it is an LDH character
@ -255,7 +273,6 @@ _internal_toASCII(const UChar* src, int32_t srcLength,
failPos = j;
}
}
if(useSTD3ASCIIRules == TRUE){
// verify 3a and 3b
// 3(a) Verify the absence of non-LDH ASCII code points; that is, the
@ -282,6 +299,7 @@ _internal_toASCII(const UChar* src, int32_t srcLength,
goto CLEANUP;
}
}
// Step 4: if the source is ASCII then proceed to step 8
if(srcIsASCII){
if(b1Len <= destCapacity){
uprv_memmove(dest, b1, b1Len * U_SIZEOF_UCHAR);
@ -341,7 +359,7 @@ _internal_toASCII(const UChar* src, int32_t srcLength,
goto CLEANUP;
}
}
// step 8: verify the length of lable
if(reqLength > MAX_LABEL_LENGTH){
*status = U_IDNA_LABEL_TOO_LONG_ERROR;
}

View file

@ -159,9 +159,9 @@ _uRegexErrorName[U_REGEX_ERROR_LIMIT - U_REGEX_ERROR_START] = {
static const char * const
_uIDNAErrorName[U_IDNA_ERROR_LIMIT - U_IDNA_ERROR_START] = {
"U_IDNA_ERROR_START",
"U_IDNA_PROHIBITED_ERROR",
"U_IDNA_UNASSIGNED_ERROR",
"U_IDNA_CHECK_BIDI_ERROR",
"U_STRINGPREP_PROHIBITED_ERROR",
"U_STRINGPREP_UNASSIGNED_ERROR",
"U_STRINGPREP_CHECK_BIDI_ERROR",
"U_IDNA_STD3_ASCII_RULES_ERROR",
"U_IDNA_ACE_PREFIX_ERROR",
"U_IDNA_VERIFICATION_ERROR",