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

◆ GetBytes() [2/9]

unsafe override int System.Text.SBCSCodePageEncoding.GetBytes ( char * chars,
int charCount,
byte * bytes,
int byteCount,
System::Text::EncoderNLS encoder )
inlinevirtual

Reimplemented from System.Text.EncodingNLS.

Definition at line 306 of file SBCSCodePageEncoding.cs.

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 }
new EncoderFallbackBuffer FallbackBuffer
Definition EncoderNLS.cs:26
EncoderFallback EncoderFallback
Definition Encoding.cs:460

References System.Text.SBCSCodePageEncoding._mapUnicodeToBytes, System.Text.EncoderFallbackBufferHelper.bFallingBack, System.Text.EncoderFallbackBufferHelper.bUsedEncoder, System.byteCount, System.bytes, System.charCount, System.chars, System.Text.BaseCodePageEncoding.CheckMemorySection(), System.Text.EncoderReplacementFallback.DefaultString, System.Text.EncoderFallbackBufferHelper.InternalFallback(), System.Text.EncoderFallbackBufferHelper.InternalGetNextChar(), System.Text.EncoderFallbackBufferHelper.InternalInitialize(), System.Text.EncoderFallbackBufferHelper.InternalReset(), System.Text.EncoderReplacementFallback.MaxCharCount, System.Text.EncoderFallbackBuffer.Remaining, and System.Text.EncodingNLS.ThrowBytesOverflow().