kernel/eka/euser/unicode/collate.cpp
branchRCL_3
changeset 256 c1f20ce4abcf
parent 0 a41df078684a
child 257 3e88ff8f41d5
equal deleted inserted replaced
249:a179b74831c9 256:c1f20ce4abcf
    24 
    24 
    25 // maximum size of string which has its own sort key
    25 // maximum size of string which has its own sort key
    26 // 16 instead of 8, in case all supplementary characters
    26 // 16 instead of 8, in case all supplementary characters
    27 static const TInt KKeyedStringBufferSize = 16;
    27 static const TInt KKeyedStringBufferSize = 16;
    28 
    28 
    29 
       
    30 inline TText16 GetHighSurrogate(TUint aChar)
       
    31 /**
       
    32 Retrieve the high surrogate of a supplementary character.
       
    33 
       
    34 @param aChar The 32-bit code point value of a Unicode character.
       
    35 
       
    36 @return High surrogate of aChar, if aChar is a supplementary character; 
       
    37         aChar itself, if aChar is not a supplementary character.
       
    38 */
       
    39 	{
       
    40 	return STATIC_CAST(TText16, 0xD7C0 + (aChar >> 10));
       
    41 	}
       
    42 
       
    43 inline TText16 GetLowSurrogate(TUint aChar)
       
    44 /**
       
    45 Retrieve the low surrogate of a supplementary character.
       
    46 
       
    47 @param aChar The 32-bit code point value of a Unicode character.
       
    48 
       
    49 @return Low surrogate of aChar, if aChar is a supplementary character; 
       
    50         zero, if aChar is not a supplementary character.
       
    51 */
       
    52 	{
       
    53 	return STATIC_CAST(TText16, 0xDC00 | (aChar & 0x3FF));
       
    54 	}
       
    55 
       
    56 inline TUint JoinSurrogate(TText16 aHighSurrogate, TText16 aLowSurrogate)
       
    57 /**
       
    58 Combine a high surrogate and a low surrogate into a supplementary character.
       
    59 
       
    60 @return The 32-bit code point value of the generated Unicode supplementary
       
    61         character.
       
    62 */
       
    63 	{
       
    64 	return ((aHighSurrogate - 0xD7F7) << 10) + aLowSurrogate;
       
    65 	}
       
    66 
       
    67 // Creates a one or two collation keys sequence corresponding to the input character.
    29 // Creates a one or two collation keys sequence corresponding to the input character.
    68 // Returns the number of keys output.
    30 // Returns the number of keys output.
    69 static TInt CreateDefaultCollationKeySequence(TInt aChar, TCollationKey* aBuffer)
    31 static TInt CreateDefaultCollationKeySequence(TInt aChar, TCollationKey* aBuffer)
    70 	{
    32 	{
    71 	if (aChar >= 0x3400 && aChar <= 0x9FFF)	// CJK
    33 	if (aChar >= 0x3400 && aChar <= 0x9FFF)	// CJK
    98 		if ((p < start) || (p > end)) 
    60 		if ((p < start) || (p > end)) 
    99 			{
    61 			{
   100 			break;
    62 			break;
   101 			}
    63 			}
   102 		TInt c = *p >> 16;
    64 		TInt c = *p >> 16;
   103 		if (IsHighSurrogate( (TText16)c ))
    65 		if (TChar::IsHighSurrogate( (TText16)c ))
   104 			{
    66 			{
   105 			if ((p < end) && (IsLowSurrogate( (TText16)((*(p+1))>>16) )))
    67 			if ((p < end) && (TChar::IsLowSurrogate( (TText16)((*(p+1))>>16) )))
   106 				{
    68 				{
   107 				currentCharLength = 2;
    69 				currentCharLength = 2;
   108 				c = JoinSurrogate( (TText16)(*p>>16), (TText16)((*(p+1))>>16) );
    70 				c = TChar::JoinSurrogate( (TText16)(*p>>16), (TText16)((*(p+1))>>16) );
   109 				}
    71 				}
   110 			}
    72 			}
   111 		else if (IsLowSurrogate( (TText16)c ))
    73 		else if (TChar::IsLowSurrogate( (TText16)c ))
   112 			{
    74 			{
   113 			if ((p > start) && (IsHighSurrogate( (TText16)((*(p-1))>>16) )))
    75 			if ((p > start) && (TChar::IsHighSurrogate( (TText16)((*(p-1))>>16) )))
   114 				{
    76 				{
   115 				p--;
    77 				p--;
   116 				pivot = pivot - 1;
    78 				pivot = pivot - 1;
   117 				currentCharLength = 2;
    79 				currentCharLength = 2;
   118 				c = JoinSurrogate( (TText16)(*p>>16), (TText16)((*(p+1))>>16) );
    80 				c = TChar::JoinSurrogate( (TText16)(*p>>16), (TText16)((*(p+1))>>16) );
   119 				}
    81 				}
   120 			}
    82 			}
   121 		else
    83 		else
   122 			{
    84 			{
   123 			currentCharLength = 1;
    85 			currentCharLength = 1;
   656 			{
   618 			{
   657 			text[textLen++] = static_cast <TText> (cur_char);
   619 			text[textLen++] = static_cast <TText> (cur_char);
   658 			}
   620 			}
   659 		else 
   621 		else 
   660 			{
   622 			{
   661 			text[textLen++] = GetHighSurrogate(cur_char);
   623 			text[textLen++] = TChar::GetHighSurrogate(cur_char);
   662 			text[textLen++] = GetLowSurrogate(cur_char);
   624 			text[textLen++] = TChar::GetLowSurrogate(cur_char);
   663 			}
   625 			}
   664 		TBool possible_prefix = ETrue;
   626 		TBool possible_prefix = ETrue;
   665 		for(TInt i = 1; (i < KKeyedStringBufferSize) && possible_prefix; i++)
   627 		for(TInt i = 1; (i < KKeyedStringBufferSize) && possible_prefix; i++)
   666 			{
   628 			{
   667 			++moved;
   629 			++moved;
   674 				{
   636 				{
   675 				text[textLen++] = static_cast <TText> (c);
   637 				text[textLen++] = static_cast <TText> (c);
   676 				}
   638 				}
   677 			else
   639 			else
   678 				{
   640 				{
   679 				text[textLen++] = GetHighSurrogate(c);
   641 				text[textLen++] = TChar::GetHighSurrogate(c);
   680 				text[textLen++] = GetLowSurrogate(c);
   642 				text[textLen++] = TChar::GetLowSurrogate(c);
   681 				}
   643 				}
   682 			TInt cur_index = -1;
   644 			TInt cur_index = -1;
   683             ::GetStringKey(aTable, text, textLen, cur_index, possible_prefix);
   645             ::GetStringKey(aTable, text, textLen, cur_index, possible_prefix);
   684 			if(cur_index != -1)
   646 			if(cur_index != -1)
   685 				{
   647 				{