Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ GetByteCount() [2/7]

unsafe override int System.Text.UnicodeEncoding.GetByteCount ( char * chars,
int count,
EncoderNLS encoder )
inlinesealedpackagevirtual

Reimplemented from System.Text.Encoding.

Definition at line 343 of file UnicodeEncoding.cs.

344 {
345 int num = count << 1;
346 if (num < 0)
347 {
348 throw new ArgumentOutOfRangeException("count", SR.ArgumentOutOfRange_GetByteCountOverflow);
349 }
350 char* charStart = chars;
351 char* ptr = chars + count;
352 char c = '\0';
353 bool flag = false;
354 EncoderFallbackBuffer encoderFallbackBuffer = null;
355 if (encoder != null)
356 {
357 c = encoder._charLeftOver;
358 if (c > '\0')
359 {
360 num += 2;
361 }
362 if (encoder.InternalHasFallbackBuffer)
363 {
364 encoderFallbackBuffer = encoder.FallbackBuffer;
365 if (encoderFallbackBuffer.Remaining > 0)
366 {
367 throw new ArgumentException(SR.Format(SR.Argument_EncoderFallbackNotEmpty, EncodingName, encoder.Fallback?.GetType()));
368 }
369 encoderFallbackBuffer.InternalInitialize(charStart, ptr, encoder, setEncoder: false);
370 }
371 }
372 while (true)
373 {
374 char num2 = encoderFallbackBuffer?.InternalGetNextChar() ?? '\0';
375 char c2 = num2;
376 char* chars2;
377 if (num2 != 0 || chars < ptr)
378 {
379 if (c2 == '\0')
380 {
381 if ((bigEndian ^ BitConverter.IsLittleEndian) && ((ulong)chars & 7uL) == 0L && c == '\0')
382 {
383 ulong* ptr2 = (ulong*)(ptr - 3);
384 ulong* ptr3;
385 for (ptr3 = (ulong*)chars; ptr3 < ptr2; ptr3++)
386 {
387 if ((0x8000800080008000uL & *ptr3) == 0L)
388 {
389 continue;
390 }
391 ulong num3 = (0xF800F800F800F800uL & *ptr3) ^ 0xD800D800D800D800uL;
392 if ((num3 & 0xFFFF000000000000uL) == 0L || (num3 & 0xFFFF00000000L) == 0L || (num3 & 0xFFFF0000u) == 0L || (num3 & 0xFFFF) == 0L)
393 {
394 long num4 = -287953294993589248L & (long)(*ptr3);
395 if (!BitConverter.IsLittleEndian)
396 {
397 }
398 if (num4 != -2593835887162763264L)
399 {
400 break;
401 }
402 }
403 }
404 chars = (char*)ptr3;
405 if (chars >= ptr)
406 {
407 goto IL_0295;
408 }
409 }
410 c2 = *chars;
411 chars++;
412 }
413 else
414 {
415 num += 2;
416 }
417 if (c2 >= '\ud800' && c2 <= '\udfff')
418 {
419 if (c2 <= '\udbff')
420 {
421 if (c > '\0')
422 {
423 chars--;
424 num -= 2;
425 if (encoderFallbackBuffer == null)
426 {
427 encoderFallbackBuffer = ((encoder != null) ? encoder.FallbackBuffer : encoderFallback.CreateFallbackBuffer());
428 encoderFallbackBuffer.InternalInitialize(charStart, ptr, encoder, setEncoder: false);
429 }
430 chars2 = chars;
431 encoderFallbackBuffer.InternalFallback(c, ref chars2);
432 chars = chars2;
433 c = '\0';
434 }
435 else
436 {
437 c = c2;
438 }
439 }
440 else if (c == '\0')
441 {
442 num -= 2;
443 if (encoderFallbackBuffer == null)
444 {
445 encoderFallbackBuffer = ((encoder != null) ? encoder.FallbackBuffer : encoderFallback.CreateFallbackBuffer());
446 encoderFallbackBuffer.InternalInitialize(charStart, ptr, encoder, setEncoder: false);
447 }
448 chars2 = chars;
449 encoderFallbackBuffer.InternalFallback(c2, ref chars2);
450 chars = chars2;
451 }
452 else
453 {
454 c = '\0';
455 }
456 }
457 else if (c > '\0')
458 {
459 chars--;
460 if (encoderFallbackBuffer == null)
461 {
462 encoderFallbackBuffer = ((encoder != null) ? encoder.FallbackBuffer : encoderFallback.CreateFallbackBuffer());
463 encoderFallbackBuffer.InternalInitialize(charStart, ptr, encoder, setEncoder: false);
464 }
465 chars2 = chars;
466 encoderFallbackBuffer.InternalFallback(c, ref chars2);
467 chars = chars2;
468 num -= 2;
469 c = '\0';
470 }
471 continue;
472 }
473 goto IL_0295;
474 IL_0295:
475 if (c <= '\0')
476 {
477 break;
478 }
479 num -= 2;
480 if (encoder != null && !encoder.MustFlush)
481 {
482 break;
483 }
484 if (flag)
485 {
486 throw new ArgumentException(SR.Format(SR.Argument_RecursiveFallback, c), "chars");
487 }
488 if (encoderFallbackBuffer == null)
489 {
490 encoderFallbackBuffer = ((encoder != null) ? encoder.FallbackBuffer : encoderFallback.CreateFallbackBuffer());
491 encoderFallbackBuffer.InternalInitialize(charStart, ptr, encoder, setEncoder: false);
492 }
493 chars2 = chars;
494 encoderFallbackBuffer.InternalFallback(c, ref chars2);
495 chars = chars2;
496 c = '\0';
497 flag = true;
498 }
499 return num;
500 }
EncoderFallback encoderFallback
Definition Encoding.cs:341
virtual string EncodingName
Definition Encoding.cs:362

References System.Text.EncoderNLS._charLeftOver, System.SR.Argument_EncoderFallbackNotEmpty, System.SR.Argument_RecursiveFallback, System.SR.ArgumentOutOfRange_GetByteCountOverflow, System.Text.UnicodeEncoding.bigEndian, System.chars, System.count, System.Text.EncoderFallback.CreateFallbackBuffer(), System.Text.Encoding.encoderFallback, System.Text.Encoding.EncodingName, System.Text.EncoderNLS.Fallback, System.Text.EncoderNLS.FallbackBuffer, System.SR.Format(), System.Text.EncoderFallbackBuffer.InternalFallback(), System.Text.EncoderFallbackBuffer.InternalGetNextChar(), System.Text.EncoderNLS.InternalHasFallbackBuffer, System.Text.EncoderFallbackBuffer.InternalInitialize(), System.BitConverter.IsLittleEndian, System.L, System.Text.EncoderNLS.MustFlush, and System.Text.EncoderFallbackBuffer.Remaining.