1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System.Diagnostics;
using System.Diagnostics.Contracts;
using System.Security;
using System.Text;
namespace System.Globalization
{
public partial class TextInfo
{
[NonSerialized]
private Tristate _needsTurkishCasing = Tristate.NotInitialized;
//////////////////////////////////////////////////////////////////////////
////
//// TextInfo Constructors
////
//// Implements CultureInfo.TextInfo.
////
//////////////////////////////////////////////////////////////////////////
internal unsafe TextInfo(CultureData cultureData)
{
_cultureData = cultureData;
_cultureName = _cultureData.CultureName;
_textInfoName = _cultureData.STEXTINFO;
FinishInitialization(_textInfoName);
}
private void FinishInitialization(string textInfoName)
{
}
private unsafe string ChangeCase(string s, bool toUpper)
{
Debug.Assert(s != null);
if (s.Length == 0)
{
return string.Empty;
}
string result = string.FastAllocateString(s.Length);
fixed (char* pSource = s)
{
fixed (char* pResult = result)
{
if (IsAsciiCasingSameAsInvariant && s.IsAscii())
{
int length = s.Length;
char* a = pSource, b = pResult;
if (toUpper)
{
while (length-- != 0)
{
*b++ = ToUpperAsciiInvariant(*a++);
}
}
else
{
while (length-- != 0)
{
*b++ = ToLowerAsciiInvariant(*a++);
}
}
}
else
{
ChangeCase(pSource, s.Length, pResult, result.Length, toUpper);
}
}
}
return result;
}
private unsafe char ChangeCase(char c, bool toUpper)
{
char dst = default(char);
ChangeCase(&c, 1, &dst, 1, toUpper);
return dst;
}
// -----------------------------
// ---- PAL layer ends here ----
// -----------------------------
private bool NeedsTurkishCasing(string localeName)
{
Debug.Assert(localeName != null);
return CultureInfo.GetCultureInfo(localeName).CompareInfo.Compare("\u0131", "I", CompareOptions.IgnoreCase) == 0;
}
private bool IsInvariant { get { return _cultureName.Length == 0; } }
internal unsafe void ChangeCase(char* src, int srcLen, char* dstBuffer, int dstBufferCapacity, bool bToUpper)
{
if (IsInvariant)
{
Interop.GlobalizationInterop.ChangeCaseInvariant(src, srcLen, dstBuffer, dstBufferCapacity, bToUpper);
}
else
{
if (_needsTurkishCasing == Tristate.NotInitialized)
{
_needsTurkishCasing = NeedsTurkishCasing(_textInfoName) ? Tristate.True : Tristate.False;
}
if (_needsTurkishCasing == Tristate.True)
{
Interop.GlobalizationInterop.ChangeCaseTurkish(src, srcLen, dstBuffer, dstBufferCapacity, bToUpper);
}
else
{
Interop.GlobalizationInterop.ChangeCase(src, srcLen, dstBuffer, dstBufferCapacity, bToUpper);
}
}
}
}
}
|