Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
SBCSCodePageEncoding.cs
Go to the documentation of this file.
2using System.IO;
5
6namespace System.Text;
7
9{
10 private unsafe char* _mapBytesToUnicode = null;
11
12 private unsafe byte* _mapUnicodeToBytes = null;
13
14 private byte _byteUnknown;
15
16 private char _charUnknown;
17
18 private static object s_InternalSyncObject;
19
20 private static object InternalSyncObject
21 {
22 get
23 {
24 if (s_InternalSyncObject == null)
25 {
26 object value = new object();
27 Interlocked.CompareExchange<object>(ref s_InternalSyncObject, value, (object)null);
28 }
30 }
31 }
32
33 public override bool IsSingleByte => true;
34
35 public SBCSCodePageEncoding(int codePage)
36 : this(codePage, codePage)
37 {
38 }
39
40 public unsafe SBCSCodePageEncoding(int codePage, int dataCodePage)
41 : base(codePage, dataCodePage)
42 {
43 }
44
45 internal unsafe static ushort ReadUInt16(byte* pByte)
46 {
48 {
49 return *(ushort*)pByte;
50 }
51 return BinaryPrimitives.ReverseEndianness(*(ushort*)pByte);
52 }
53
54 protected unsafe override void LoadManagedCodePage()
55 {
56 fixed (byte* ptr = &m_codePageHeader[0])
57 {
58 CodePageHeader* ptr2 = (CodePageHeader*)ptr;
59 if (ptr2->ByteCount != 1)
60 {
62 }
63 _byteUnknown = (byte)ptr2->ByteReplace;
65 int num = 66052 + iExtraBytes;
66 byte* nativeMemory = GetNativeMemory(num);
67 Unsafe.InitBlockUnaligned(nativeMemory, 0, (uint)num);
68 char* ptr3 = (char*)nativeMemory;
69 byte* ptr4 = nativeMemory + 512;
70 byte[] array = new byte[512];
72 {
75 }
76 fixed (byte* ptr5 = &array[0])
77 {
78 for (int i = 0; i < 256; i++)
79 {
80 char c = (char)ReadUInt16(ptr5 + 2 * i);
81 if (c != 0 || i == 0)
82 {
83 ptr3[i] = c;
84 if (c != '\ufffd')
85 {
86 ptr4[(int)c] = (byte)i;
87 }
88 }
89 else
90 {
91 ptr3[i] = '\ufffd';
92 }
93 }
94 }
95 _mapBytesToUnicode = ptr3;
96 _mapUnicodeToBytes = ptr4;
97 }
98 }
99
100 protected unsafe override void ReadBestFitTable()
101 {
102 lock (InternalSyncObject)
103 {
104 if (arrayUnicodeBestFit != null)
105 {
106 return;
107 }
108 byte[] array = new byte[m_dataSize - 512];
110 {
113 }
114 fixed (byte* ptr = array)
115 {
116 byte* ptr2 = ptr;
117 char[] array2 = new char[256];
118 for (int i = 0; i < 256; i++)
119 {
120 array2[i] = _mapBytesToUnicode[i];
121 }
122 ushort num;
123 while ((num = ReadUInt16(ptr2)) != 0)
124 {
125 ptr2 += 2;
126 array2[num] = (char)ReadUInt16(ptr2);
127 ptr2 += 2;
128 }
129 arrayBytesBestFit = array2;
130 ptr2 += 2;
131 byte* ptr3 = ptr2;
132 int num2 = 0;
133 int num3 = ReadUInt16(ptr2);
134 ptr2 += 2;
135 while (num3 < 65536)
136 {
137 byte b = *ptr2;
138 ptr2++;
139 switch (b)
140 {
141 case 1:
142 num3 = ReadUInt16(ptr2);
143 ptr2 += 2;
144 continue;
145 case 2:
146 case 3:
147 case 4:
148 case 5:
149 case 6:
150 case 7:
151 case 8:
152 case 9:
153 case 10:
154 case 11:
155 case 12:
156 case 13:
157 case 14:
158 case 15:
159 case 16:
160 case 17:
161 case 18:
162 case 19:
163 case 20:
164 case 21:
165 case 22:
166 case 23:
167 case 24:
168 case 25:
169 case 26:
170 case 27:
171 case 28:
172 case 29:
173 case 31:
174 num3 += b;
175 continue;
176 }
177 if (b > 0)
178 {
179 num2++;
180 }
181 num3++;
182 }
183 array2 = new char[num2 * 2];
184 ptr2 = ptr3;
185 num3 = ReadUInt16(ptr2);
186 ptr2 += 2;
187 num2 = 0;
188 while (num3 < 65536)
189 {
190 byte b2 = *ptr2;
191 ptr2++;
192 switch (b2)
193 {
194 case 1:
195 num3 = ReadUInt16(ptr2);
196 ptr2 += 2;
197 continue;
198 case 2:
199 case 3:
200 case 4:
201 case 5:
202 case 6:
203 case 7:
204 case 8:
205 case 9:
206 case 10:
207 case 11:
208 case 12:
209 case 13:
210 case 14:
211 case 15:
212 case 16:
213 case 17:
214 case 18:
215 case 19:
216 case 20:
217 case 21:
218 case 22:
219 case 23:
220 case 24:
221 case 25:
222 case 26:
223 case 27:
224 case 28:
225 case 29:
226 case 31:
227 num3 += b2;
228 continue;
229 }
230 if (b2 == 30)
231 {
232 b2 = *ptr2;
233 ptr2++;
234 }
235 if (b2 > 0)
236 {
237 array2[num2++] = (char)num3;
238 array2[num2++] = _mapBytesToUnicode[(int)b2];
239 }
240 num3++;
241 }
242 arrayUnicodeBestFit = array2;
243 }
244 }
245 }
246
247 public unsafe override int GetByteCount(char* chars, int count, System.Text.EncoderNLS encoder)
248 {
250 EncoderReplacementFallback encoderReplacementFallback = null;
251 char c = '\0';
252 if (encoder != null)
253 {
254 c = encoder.charLeftOver;
255 encoderReplacementFallback = encoder.Fallback as EncoderReplacementFallback;
256 }
257 else
258 {
259 encoderReplacementFallback = base.EncoderFallback as EncoderReplacementFallback;
260 }
261 if (encoderReplacementFallback != null && encoderReplacementFallback.MaxCharCount == 1)
262 {
263 if (c > '\0')
264 {
265 count++;
266 }
267 return count;
268 }
269 EncoderFallbackBuffer encoderFallbackBuffer = null;
270 int num = 0;
271 char* ptr = chars + count;
272 EncoderFallbackBufferHelper encoderFallbackBufferHelper = new EncoderFallbackBufferHelper(encoderFallbackBuffer);
273 if (c > '\0')
274 {
275 encoderFallbackBuffer = encoder.FallbackBuffer;
276 encoderFallbackBufferHelper = new EncoderFallbackBufferHelper(encoderFallbackBuffer);
277 encoderFallbackBufferHelper.InternalInitialize(chars, ptr, encoder, _setEncoder: false);
278 encoderFallbackBufferHelper.InternalFallback(c, ref chars);
279 }
280 char c2;
281 while ((c2 = ((encoderFallbackBuffer != null) ? encoderFallbackBufferHelper.InternalGetNextChar() : '\0')) != 0 || chars < ptr)
282 {
283 if (c2 == '\0')
284 {
285 c2 = *chars;
286 chars++;
287 }
288 if (_mapUnicodeToBytes[(int)c2] == 0 && c2 != 0)
289 {
290 if (encoderFallbackBuffer == null)
291 {
292 encoderFallbackBuffer = ((encoder != null) ? encoder.FallbackBuffer : base.EncoderFallback.CreateFallbackBuffer());
293 encoderFallbackBufferHelper = new EncoderFallbackBufferHelper(encoderFallbackBuffer);
294 encoderFallbackBufferHelper.InternalInitialize(ptr - count, ptr, encoder, _setEncoder: false);
295 }
296 encoderFallbackBufferHelper.InternalFallback(c2, ref chars);
297 }
298 else
299 {
300 num++;
301 }
302 }
303 return num;
304 }
305
306 public unsafe override int GetBytes(char* chars, int charCount, byte* bytes, int byteCount, System.Text.EncoderNLS encoder)
307 {
309 EncoderReplacementFallback encoderReplacementFallback = null;
310 char c = '\0';
311 if (encoder != null)
312 {
313 c = encoder.charLeftOver;
314 encoderReplacementFallback = encoder.Fallback as EncoderReplacementFallback;
315 }
316 else
317 {
318 encoderReplacementFallback = base.EncoderFallback as EncoderReplacementFallback;
319 }
320 char* ptr = chars + charCount;
321 byte* ptr2 = bytes;
322 char* ptr3 = chars;
323 if (encoderReplacementFallback != null && encoderReplacementFallback.MaxCharCount == 1)
324 {
325 byte b = _mapUnicodeToBytes[(int)encoderReplacementFallback.DefaultString[0]];
326 if (b != 0)
327 {
328 if (c > '\0')
329 {
330 if (byteCount == 0)
331 {
332 ThrowBytesOverflow(encoder, nothingEncoded: true);
333 }
334 *(bytes++) = b;
335 byteCount--;
336 }
337 if (byteCount < charCount)
338 {
339 ThrowBytesOverflow(encoder, byteCount < 1);
340 ptr = chars + byteCount;
341 }
342 while (chars < ptr)
343 {
344 char c2 = *chars;
345 chars++;
346 byte b2 = _mapUnicodeToBytes[(int)c2];
347 if (b2 == 0 && c2 != 0)
348 {
349 *bytes = b;
350 }
351 else
352 {
353 *bytes = b2;
354 }
355 bytes++;
356 }
357 if (encoder != null)
358 {
359 encoder.charLeftOver = '\0';
360 encoder.m_charsUsed = (int)(chars - ptr3);
361 }
362 return (int)(bytes - ptr2);
363 }
364 }
365 EncoderFallbackBuffer encoderFallbackBuffer = null;
366 byte* ptr4 = bytes + byteCount;
367 EncoderFallbackBufferHelper encoderFallbackBufferHelper = new EncoderFallbackBufferHelper(encoderFallbackBuffer);
368 if (c > '\0')
369 {
370 encoderFallbackBuffer = encoder.FallbackBuffer;
371 encoderFallbackBufferHelper = new EncoderFallbackBufferHelper(encoderFallbackBuffer);
372 encoderFallbackBufferHelper.InternalInitialize(chars, ptr, encoder, _setEncoder: true);
373 encoderFallbackBufferHelper.InternalFallback(c, ref chars);
374 if (encoderFallbackBuffer.Remaining > ptr4 - bytes)
375 {
376 ThrowBytesOverflow(encoder, nothingEncoded: true);
377 }
378 }
379 char c3;
380 while ((c3 = ((encoderFallbackBuffer != null) ? encoderFallbackBufferHelper.InternalGetNextChar() : '\0')) != 0 || chars < ptr)
381 {
382 if (c3 == '\0')
383 {
384 c3 = *chars;
385 chars++;
386 }
387 byte b3 = _mapUnicodeToBytes[(int)c3];
388 if (b3 == 0 && c3 != 0)
389 {
390 if (encoderFallbackBuffer == null)
391 {
392 encoderFallbackBuffer = ((encoder != null) ? encoder.FallbackBuffer : base.EncoderFallback.CreateFallbackBuffer());
393 encoderFallbackBufferHelper = new EncoderFallbackBufferHelper(encoderFallbackBuffer);
394 encoderFallbackBufferHelper.InternalInitialize(ptr - charCount, ptr, encoder, _setEncoder: true);
395 }
396 encoderFallbackBufferHelper.InternalFallback(c3, ref chars);
397 if (encoderFallbackBuffer.Remaining > ptr4 - bytes)
398 {
399 chars--;
400 encoderFallbackBufferHelper.InternalReset();
401 ThrowBytesOverflow(encoder, chars == ptr3);
402 break;
403 }
404 continue;
405 }
406 if (bytes >= ptr4)
407 {
408 if (encoderFallbackBuffer == null || !encoderFallbackBufferHelper.bFallingBack)
409 {
410 chars--;
411 }
412 ThrowBytesOverflow(encoder, chars == ptr3);
413 break;
414 }
415 *bytes = b3;
416 bytes++;
417 }
418 if (encoder != null)
419 {
420 if (encoderFallbackBuffer != null && !encoderFallbackBufferHelper.bUsedEncoder)
421 {
422 encoder.charLeftOver = '\0';
423 }
424 encoder.m_charsUsed = (int)(chars - ptr3);
425 }
426 return (int)(bytes - ptr2);
427 }
428
429 public unsafe override int GetCharCount(byte* bytes, int count, System.Text.DecoderNLS decoder)
430 {
432 bool flag = false;
433 DecoderReplacementFallback decoderReplacementFallback = null;
434 if (decoder == null)
435 {
436 decoderReplacementFallback = base.DecoderFallback as DecoderReplacementFallback;
437 flag = base.DecoderFallback is InternalDecoderBestFitFallback;
438 }
439 else
440 {
441 decoderReplacementFallback = decoder.Fallback as DecoderReplacementFallback;
442 flag = decoder.Fallback is InternalDecoderBestFitFallback;
443 }
444 if (flag || (decoderReplacementFallback != null && decoderReplacementFallback.MaxCharCount == 1))
445 {
446 return count;
447 }
448 DecoderFallbackBuffer decoderFallbackBuffer = null;
449 DecoderFallbackBufferHelper decoderFallbackBufferHelper = new DecoderFallbackBufferHelper(decoderFallbackBuffer);
450 int num = count;
451 byte[] array = new byte[1];
452 byte* ptr = bytes + count;
453 while (bytes < ptr)
454 {
455 char c = _mapBytesToUnicode[(int)(*bytes)];
456 bytes++;
457 if (c == '\ufffd')
458 {
459 if (decoderFallbackBuffer == null)
460 {
461 decoderFallbackBuffer = ((decoder != null) ? decoder.FallbackBuffer : base.DecoderFallback.CreateFallbackBuffer());
462 decoderFallbackBufferHelper = new DecoderFallbackBufferHelper(decoderFallbackBuffer);
463 decoderFallbackBufferHelper.InternalInitialize(ptr - count, null);
464 }
465 array[0] = *(bytes - 1);
466 num--;
467 num += decoderFallbackBufferHelper.InternalFallback(array, bytes);
468 }
469 }
470 return num;
471 }
472
473 public unsafe override int GetChars(byte* bytes, int byteCount, char* chars, int charCount, System.Text.DecoderNLS decoder)
474 {
476 bool flag = false;
477 byte* ptr = bytes + byteCount;
478 byte* ptr2 = bytes;
479 char* ptr3 = chars;
480 DecoderReplacementFallback decoderReplacementFallback = null;
481 if (decoder == null)
482 {
483 decoderReplacementFallback = base.DecoderFallback as DecoderReplacementFallback;
484 flag = base.DecoderFallback is InternalDecoderBestFitFallback;
485 }
486 else
487 {
488 decoderReplacementFallback = decoder.Fallback as DecoderReplacementFallback;
489 flag = decoder.Fallback is InternalDecoderBestFitFallback;
490 }
491 if (flag || (decoderReplacementFallback != null && decoderReplacementFallback.MaxCharCount == 1))
492 {
493 char c = decoderReplacementFallback?.DefaultString[0] ?? '?';
494 if (charCount < byteCount)
495 {
496 ThrowCharsOverflow(decoder, charCount < 1);
497 ptr = bytes + charCount;
498 }
499 while (bytes < ptr)
500 {
501 char c2;
502 if (flag)
503 {
504 if (arrayBytesBestFit == null)
505 {
507 }
509 }
510 else
511 {
512 c2 = _mapBytesToUnicode[(int)(*bytes)];
513 }
514 bytes++;
515 if (c2 == '\ufffd')
516 {
517 *chars = c;
518 }
519 else
520 {
521 *chars = c2;
522 }
523 chars++;
524 }
525 if (decoder != null)
526 {
527 decoder.m_bytesUsed = (int)(bytes - ptr2);
528 }
529 return (int)(chars - ptr3);
530 }
531 DecoderFallbackBuffer decoderFallbackBuffer = null;
532 byte[] array = new byte[1];
533 char* ptr4 = chars + charCount;
534 DecoderFallbackBufferHelper decoderFallbackBufferHelper = new DecoderFallbackBufferHelper(null);
535 while (bytes < ptr)
536 {
537 char c3 = _mapBytesToUnicode[(int)(*bytes)];
538 bytes++;
539 if (c3 == '\ufffd')
540 {
541 if (decoderFallbackBuffer == null)
542 {
543 decoderFallbackBuffer = ((decoder != null) ? decoder.FallbackBuffer : base.DecoderFallback.CreateFallbackBuffer());
544 decoderFallbackBufferHelper = new DecoderFallbackBufferHelper(decoderFallbackBuffer);
545 decoderFallbackBufferHelper.InternalInitialize(ptr - byteCount, ptr4);
546 }
547 array[0] = *(bytes - 1);
548 if (!decoderFallbackBufferHelper.InternalFallback(array, bytes, ref chars))
549 {
550 bytes--;
551 decoderFallbackBufferHelper.InternalReset();
552 ThrowCharsOverflow(decoder, bytes == ptr2);
553 break;
554 }
555 }
556 else
557 {
558 if (chars >= ptr4)
559 {
560 bytes--;
561 ThrowCharsOverflow(decoder, bytes == ptr2);
562 break;
563 }
564 *chars = c3;
565 chars++;
566 }
567 }
568 if (decoder != null)
569 {
570 decoder.m_bytesUsed = (int)(bytes - ptr2);
571 }
572 return (int)(chars - ptr3);
573 }
574
575 public override int GetMaxByteCount(int charCount)
576 {
577 if (charCount < 0)
578 {
580 }
581 long num = (long)charCount + 1L;
582 if (base.EncoderFallback.MaxCharCount > 1)
583 {
584 num *= base.EncoderFallback.MaxCharCount;
585 }
586 if (num > int.MaxValue)
587 {
589 }
590 return (int)num;
591 }
592
593 public override int GetMaxCharCount(int byteCount)
594 {
595 if (byteCount < 0)
596 {
598 }
599 long num = byteCount;
600 if (base.DecoderFallback.MaxCharCount > 1)
601 {
602 num *= base.DecoderFallback.MaxCharCount;
603 }
604 if (num > int.MaxValue)
605 {
607 }
608 return (int)num;
609 }
610}
static readonly bool IsLittleEndian
static sbyte ReverseEndianness(sbyte value)
static unsafe void InitBlockUnaligned(void *startAddress, byte value, uint byteCount)
Definition Unsafe.cs:133
static string NotSupported_NoCodepageData
Definition SR.cs:1688
static string ArgumentOutOfRange_GetCharCountOverflow
Definition SR.cs:90
static string ArgumentOutOfRange_GetByteCountOverflow
Definition SR.cs:88
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string ArgumentOutOfRange_NeedNonNegNum
Definition SR.cs:32
Definition SR.cs:7
unsafe byte * GetNativeMemory(int iSize)
virtual int CodePage
Definition Encoding.cs:515
unsafe override int GetByteCount(char *chars, int count, System.Text.EncoderNLS encoder)
static unsafe ushort ReadUInt16(byte *pByte)
override int GetMaxCharCount(int byteCount)
unsafe override int GetChars(byte *bytes, int byteCount, char *chars, int charCount, System.Text.DecoderNLS decoder)
unsafe override int GetBytes(char *chars, int charCount, byte *bytes, int byteCount, System.Text.EncoderNLS encoder)
override int GetMaxByteCount(int charCount)
unsafe override int GetCharCount(byte *bytes, int count, System.Text.DecoderNLS decoder)
unsafe SBCSCodePageEncoding(int codePage, int dataCodePage)
unsafe override void LoadManagedCodePage()
static int CompareExchange(ref int location1, int value, int comparand)
unsafe bool InternalFallback(byte[] bytes, byte *pBytes, ref char *chars)
unsafe void InternalInitialize(byte *_byteStart, char *_charEnd)
unsafe void InternalInitialize(char *_charStart, char *_charEnd, System.Text.EncoderNLS _encoder, bool _setEncoder)
unsafe bool InternalFallback(char ch, ref char *chars)