Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
XmlUTF8NodeWriter.cs
Go to the documentation of this file.
1using System.IO;
2using System.Text;
4
5namespace System.Xml;
6
8{
9 private byte[] _entityChars;
10
11 private readonly bool[] _isEscapedAttributeChar;
12
13 private readonly bool[] _isEscapedElementChar;
14
15 private bool _inAttribute;
16
17 private const int bufferLength = 512;
18
19 private const int maxEntityLength = 32;
20
22
23 private char[] _chars;
24
25 private static readonly byte[] s_startDecl = new byte[30]
26 {
27 60, 63, 120, 109, 108, 32, 118, 101, 114, 115,
28 105, 111, 110, 61, 34, 49, 46, 48, 34, 32,
29 101, 110, 99, 111, 100, 105, 110, 103, 61, 34
30 };
31
32 private static readonly byte[] s_endDecl = new byte[3] { 34, 63, 62 };
33
34 private static readonly byte[] s_utf8Decl = new byte[38]
35 {
36 60, 63, 120, 109, 108, 32, 118, 101, 114, 115,
37 105, 111, 110, 61, 34, 49, 46, 48, 34, 32,
38 101, 110, 99, 111, 100, 105, 110, 103, 61, 34,
39 117, 116, 102, 45, 56, 34, 63, 62
40 };
41
42 private static readonly byte[] s_digits = new byte[16]
43 {
44 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
45 65, 66, 67, 68, 69, 70
46 };
47
48 private static readonly bool[] s_defaultIsEscapedAttributeChar = new bool[64]
49 {
50 true, true, true, true, true, true, true, true, true, true,
51 true, true, true, true, true, true, true, true, true, true,
52 true, true, true, true, true, true, true, true, true, true,
53 true, true, false, false, true, false, false, false, true, false,
54 false, false, false, false, false, false, false, false, false, false,
55 false, false, false, false, false, false, false, false, false, false,
56 true, false, true, false
57 };
58
59 private static readonly bool[] s_defaultIsEscapedElementChar = new bool[64]
60 {
61 true, true, true, true, true, true, true, true, true, false,
62 false, true, true, true, true, true, true, true, true, true,
63 true, true, true, true, true, true, true, true, true, true,
64 true, true, false, false, false, false, false, false, true, false,
65 false, false, false, false, false, false, false, false, false, false,
66 false, false, false, false, false, false, false, false, false, false,
67 true, false, true, false
68 };
69
74
81
82 public new void SetOutput(Stream stream, bool ownsStream, Encoding encoding)
83 {
84 Encoding encoding2 = null;
85 if (encoding != null && encoding.CodePage == Encoding.UTF8.CodePage)
86 {
87 encoding2 = encoding;
88 encoding = null;
89 }
90 base.SetOutput(stream, ownsStream, encoding2);
91 _encoding = encoding;
92 _inAttribute = false;
93 }
94
95 private byte[] GetCharEntityBuffer()
96 {
97 if (_entityChars == null)
98 {
99 _entityChars = new byte[32];
100 }
101 return _entityChars;
102 }
103
104 private char[] GetCharBuffer(int charCount)
105 {
106 if (charCount >= 256)
107 {
108 return new char[charCount];
109 }
110 if (_chars == null || _chars.Length < charCount)
111 {
112 _chars = new char[charCount];
113 }
114 return _chars;
115 }
116
117 public override void WriteDeclaration()
118 {
119 if (_encoding == null)
120 {
122 return;
123 }
126 {
127 WriteUTF8Chars("utf-16BE");
128 }
129 else
130 {
132 }
134 }
135
136 public override void WriteCData(string text)
137 {
138 byte[] buffer = GetBuffer(9, out var offset);
139 buffer[offset] = 60;
140 buffer[offset + 1] = 33;
141 buffer[offset + 2] = 91;
142 buffer[offset + 3] = 67;
143 buffer[offset + 4] = 68;
144 buffer[offset + 5] = 65;
145 buffer[offset + 6] = 84;
146 buffer[offset + 7] = 65;
147 buffer[offset + 8] = 91;
148 Advance(9);
151 buffer[offset] = 93;
152 buffer[offset + 1] = 93;
153 buffer[offset + 2] = 62;
154 Advance(3);
155 }
156
157 private void WriteStartComment()
158 {
159 int offset;
160 byte[] buffer = GetBuffer(4, out offset);
161 buffer[offset] = 60;
162 buffer[offset + 1] = 33;
163 buffer[offset + 2] = 45;
164 buffer[offset + 3] = 45;
165 Advance(4);
166 }
167
168 private void WriteEndComment()
169 {
170 int offset;
171 byte[] buffer = GetBuffer(3, out offset);
172 buffer[offset] = 45;
173 buffer[offset + 1] = 45;
174 buffer[offset + 2] = 62;
175 Advance(3);
176 }
177
178 public override void WriteComment(string text)
179 {
183 }
184
185 public override void WriteStartElement(string prefix, string localName)
186 {
187 WriteByte('<');
188 if (!string.IsNullOrEmpty(prefix))
189 {
191 WriteByte(':');
192 }
193 WriteLocalName(localName);
194 }
195
196 public override async Task WriteStartElementAsync(string prefix, string localName)
197 {
199 if (!string.IsNullOrEmpty(prefix))
200 {
203 }
204 WriteLocalName(localName);
205 }
206
207 public override void WriteStartElement(string prefix, XmlDictionaryString localName)
208 {
209 WriteStartElement(prefix, localName.Value);
210 }
211
212 public override void WriteStartElement(byte[] prefixBuffer, int prefixOffset, int prefixLength, byte[] localNameBuffer, int localNameOffset, int localNameLength)
213 {
214 WriteByte('<');
215 if (prefixLength != 0)
216 {
217 WritePrefix(prefixBuffer, prefixOffset, prefixLength);
218 WriteByte(':');
219 }
220 WriteLocalName(localNameBuffer, localNameOffset, localNameLength);
221 }
222
223 public override void WriteEndStartElement(bool isEmpty)
224 {
225 if (!isEmpty)
226 {
227 WriteByte('>');
228 }
229 else
230 {
231 WriteBytes('/', '>');
232 }
233 }
234
236 {
237 if (!isEmpty)
238 {
240 }
241 else
242 {
244 }
245 }
246
247 public override void WriteEndElement(string prefix, string localName)
248 {
249 WriteBytes('<', '/');
250 if (!string.IsNullOrEmpty(prefix))
251 {
253 WriteByte(':');
254 }
255 WriteLocalName(localName);
256 WriteByte('>');
257 }
258
259 public override async Task WriteEndElementAsync(string prefix, string localName)
260 {
262 if (!string.IsNullOrEmpty(prefix))
263 {
266 }
267 WriteLocalName(localName);
269 }
270
271 public override void WriteEndElement(byte[] prefixBuffer, int prefixOffset, int prefixLength, byte[] localNameBuffer, int localNameOffset, int localNameLength)
272 {
273 WriteBytes('<', '/');
274 if (prefixLength != 0)
275 {
276 WritePrefix(prefixBuffer, prefixOffset, prefixLength);
277 WriteByte(':');
278 }
279 WriteLocalName(localNameBuffer, localNameOffset, localNameLength);
280 WriteByte('>');
281 }
282
284 {
285 int offset;
286 byte[] buffer = GetBuffer(6, out offset);
287 buffer[offset] = 32;
288 buffer[offset + 1] = 120;
289 buffer[offset + 2] = 109;
290 buffer[offset + 3] = 108;
291 buffer[offset + 4] = 110;
292 buffer[offset + 5] = 115;
293 Advance(6);
294 _inAttribute = true;
295 }
296
297 public override void WriteXmlnsAttribute(string prefix, string ns)
298 {
300 if (!string.IsNullOrEmpty(prefix))
301 {
302 WriteByte(':');
304 }
305 WriteBytes('=', '"');
308 }
309
310 public override void WriteXmlnsAttribute(string prefix, XmlDictionaryString ns)
311 {
313 }
314
315 public override void WriteXmlnsAttribute(byte[] prefixBuffer, int prefixOffset, int prefixLength, byte[] nsBuffer, int nsOffset, int nsLength)
316 {
318 if (prefixLength != 0)
319 {
320 WriteByte(':');
321 WritePrefix(prefixBuffer, prefixOffset, prefixLength);
322 }
323 WriteBytes('=', '"');
324 WriteEscapedText(nsBuffer, nsOffset, nsLength);
326 }
327
328 public override void WriteStartAttribute(string prefix, string localName)
329 {
330 WriteByte(' ');
331 if (prefix.Length != 0)
332 {
334 WriteByte(':');
335 }
336 WriteLocalName(localName);
337 WriteBytes('=', '"');
338 _inAttribute = true;
339 }
340
341 public override void WriteStartAttribute(string prefix, XmlDictionaryString localName)
342 {
343 WriteStartAttribute(prefix, localName.Value);
344 }
345
346 public override void WriteStartAttribute(byte[] prefixBuffer, int prefixOffset, int prefixLength, byte[] localNameBuffer, int localNameOffset, int localNameLength)
347 {
348 WriteByte(' ');
349 if (prefixLength != 0)
350 {
351 WritePrefix(prefixBuffer, prefixOffset, prefixLength);
352 WriteByte(':');
353 }
354 WriteLocalName(localNameBuffer, localNameOffset, localNameLength);
355 WriteBytes('=', '"');
356 _inAttribute = true;
357 }
358
359 public override void WriteEndAttribute()
360 {
361 WriteByte('"');
362 _inAttribute = false;
363 }
364
366 {
368 _inAttribute = false;
369 }
370
371 private void WritePrefix(string prefix)
372 {
373 if (prefix.Length == 1)
374 {
376 }
377 else
378 {
380 }
381 }
382
383 private void WritePrefix(byte[] prefixBuffer, int prefixOffset, int prefixLength)
384 {
385 if (prefixLength == 1)
386 {
387 WriteUTF8Char(prefixBuffer[prefixOffset]);
388 }
389 else
390 {
391 WriteUTF8Chars(prefixBuffer, prefixOffset, prefixLength);
392 }
393 }
394
395 private void WriteLocalName(string localName)
396 {
397 WriteUTF8Chars(localName);
398 }
399
400 private void WriteLocalName(byte[] localNameBuffer, int localNameOffset, int localNameLength)
401 {
402 WriteUTF8Chars(localNameBuffer, localNameOffset, localNameLength);
403 }
404
406 {
407 WriteEscapedText(s.Value);
408 }
409
410 public unsafe override void WriteEscapedText(string s)
411 {
412 int length = s.Length;
413 if (length > 0)
414 {
415 fixed (char* chars = s)
416 {
418 }
419 }
420 }
421
422 public unsafe override void WriteEscapedText(char[] s, int offset, int count)
423 {
424 if (count > 0)
425 {
426 fixed (char* chars = &s[offset])
427 {
429 }
430 }
431 }
432
433 private unsafe void UnsafeWriteEscapedText(char* chars, int count)
434 {
436 int num = array.Length;
437 int num2 = 0;
438 for (int i = 0; i < count; i++)
439 {
440 char c = chars[i];
441 if ((c < num && array[(uint)c]) || c >= '\ufffe')
442 {
445 num2 = i + 1;
446 }
447 }
449 }
450
451 public override void WriteEscapedText(byte[] chars, int offset, int count)
452 {
454 int num = array.Length;
455 int num2 = 0;
456 for (int i = 0; i < count; i++)
457 {
458 byte b = chars[offset + i];
459 if (b < num && array[b])
460 {
463 num2 = i + 1;
464 }
465 else if (b == 239 && offset + i + 2 < count)
466 {
467 byte b2 = chars[offset + i + 1];
468 byte b3 = chars[offset + i + 2];
469 if (b2 == 191 && (b3 == 190 || b3 == 191))
470 {
472 WriteCharEntity((b3 == 190) ? 65534 : 65535);
473 num2 = i + 3;
474 }
475 }
476 }
478 }
479
480 public void WriteText(int ch)
481 {
483 }
484
485 public override void WriteText(byte[] chars, int offset, int count)
486 {
488 }
489
490 public unsafe override void WriteText(char[] chars, int offset, int count)
491 {
492 if (count > 0)
493 {
494 fixed (char* chars2 = &chars[offset])
495 {
497 }
498 }
499 }
500
501 public override void WriteText(string value)
502 {
504 }
505
506 public override void WriteText(XmlDictionaryString value)
507 {
508 WriteUTF8Chars(value.Value);
509 }
510
512 {
513 int offset;
514 byte[] buffer = GetBuffer(4, out offset);
515 buffer[offset] = 38;
516 buffer[offset + 1] = 108;
517 buffer[offset + 2] = 116;
518 buffer[offset + 3] = 59;
519 Advance(4);
520 }
521
523 {
524 int offset;
525 byte[] buffer = GetBuffer(4, out offset);
526 buffer[offset] = 38;
527 buffer[offset + 1] = 103;
528 buffer[offset + 2] = 116;
529 buffer[offset + 3] = 59;
530 Advance(4);
531 }
532
534 {
535 int offset;
536 byte[] buffer = GetBuffer(5, out offset);
537 buffer[offset] = 38;
538 buffer[offset + 1] = 97;
539 buffer[offset + 2] = 109;
540 buffer[offset + 3] = 112;
541 buffer[offset + 4] = 59;
542 Advance(5);
543 }
544
546 {
547 int offset;
548 byte[] buffer = GetBuffer(6, out offset);
549 buffer[offset] = 38;
550 buffer[offset + 1] = 97;
551 buffer[offset + 2] = 112;
552 buffer[offset + 3] = 111;
553 buffer[offset + 4] = 115;
554 buffer[offset + 5] = 59;
555 Advance(6);
556 }
557
559 {
560 int offset;
561 byte[] buffer = GetBuffer(6, out offset);
562 buffer[offset] = 38;
563 buffer[offset + 1] = 113;
564 buffer[offset + 2] = 117;
565 buffer[offset + 3] = 111;
566 buffer[offset + 4] = 116;
567 buffer[offset + 5] = 59;
568 Advance(6);
569 }
570
571 private void WriteHexCharEntity(int ch)
572 {
574 int num = 32;
575 charEntityBuffer[--num] = 59;
576 num -= ToBase16(charEntityBuffer, num, (uint)ch);
577 charEntityBuffer[--num] = 120;
578 charEntityBuffer[--num] = 35;
579 charEntityBuffer[--num] = 38;
580 WriteUTF8Chars(charEntityBuffer, num, 32 - num);
581 }
582
583 public override void WriteCharEntity(int ch)
584 {
585 switch (ch)
586 {
587 case 60:
589 break;
590 case 62:
592 break;
593 case 38:
595 break;
596 case 39:
598 break;
599 case 34:
601 break;
602 default:
604 break;
605 }
606 }
607
608 private int ToBase16(byte[] chars, int offset, uint value)
609 {
610 int num = 0;
611 do
612 {
613 num++;
614 chars[--offset] = s_digits[value & 0xF];
615 value /= 16;
616 }
617 while (value != 0);
618 return num;
619 }
620
621 public override void WriteBoolText(bool value)
622 {
623 int offset;
624 byte[] buffer = GetBuffer(5, out offset);
626 }
627
628 public override void WriteDecimalText(decimal value)
629 {
630 int offset;
631 byte[] buffer = GetBuffer(40, out offset);
633 }
634
635 public override void WriteDoubleText(double value)
636 {
637 int offset;
638 byte[] buffer = GetBuffer(32, out offset);
640 }
641
642 public override void WriteFloatText(float value)
643 {
644 int offset;
645 byte[] buffer = GetBuffer(16, out offset);
647 }
648
649 public override void WriteDateTimeText(DateTime value)
650 {
651 int offset;
652 byte[] buffer = GetBuffer(64, out offset);
654 }
655
656 public override void WriteUniqueIdText(UniqueId value)
657 {
658 if (value.IsGuid)
659 {
660 int charArrayLength = value.CharArrayLength;
662 value.ToCharArray(charBuffer, 0);
664 }
665 else
666 {
667 WriteEscapedText(value.ToString());
668 }
669 }
670
671 public override void WriteInt32Text(int value)
672 {
673 int offset;
674 byte[] buffer = GetBuffer(16, out offset);
676 }
677
678 public override void WriteInt64Text(long value)
679 {
680 int offset;
681 byte[] buffer = GetBuffer(32, out offset);
683 }
684
685 public override void WriteUInt64Text(ulong value)
686 {
687 int offset;
688 byte[] buffer = GetBuffer(32, out offset);
690 }
691
692 public override void WriteGuidText(Guid value)
693 {
694 WriteText(value.ToString());
695 }
696
697 public override void WriteBase64Text(byte[] trailBytes, int trailByteCount, byte[] buffer, int offset, int count)
698 {
699 if (trailByteCount > 0)
700 {
702 }
704 }
705
714
715 private void InternalWriteBase64Text(byte[] buffer, int offset, int count)
716 {
718 while (count >= 3)
719 {
720 int num = Math.Min(384, count - count % 3);
721 int count2 = num / 3 * 4;
722 int offset2;
725 offset += num;
726 count -= num;
727 }
728 if (count > 0)
729 {
730 int offset3;
731 byte[] buffer3 = GetBuffer(4, out offset3);
733 }
734 }
735
737 {
739 while (count >= 3)
740 {
741 int byteCount = Math.Min(384, count - count % 3);
742 int count2 = byteCount / 3 * 4;
744 byte[] bytes = bytesWithOffset.Bytes;
745 int offset2 = bytesWithOffset.Offset;
747 offset += byteCount;
748 count -= byteCount;
749 }
750 if (count > 0)
751 {
754 int offset3 = bytesWithOffset2.Offset;
756 }
757 }
758
759 public override void WriteTimeSpanText(TimeSpan value)
760 {
762 }
763
764 public override void WriteStartListText()
765 {
766 }
767
768 public override void WriteListSeparator()
769 {
770 WriteByte(' ');
771 }
772
773 public override void WriteEndListText()
774 {
775 }
776
777 public override void WriteQualifiedName(string prefix, XmlDictionaryString localName)
778 {
779 if (prefix.Length != 0)
780 {
782 WriteByte(':');
783 }
784 WriteText(localName);
785 }
786}
static byte Min(byte val1, byte val2)
Definition Math.cs:912
unsafe override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex)
static Encoding BigEndianUnicode
Definition Encoding.cs:521
static Encoding UTF8
Definition Encoding.cs:526
virtual string WebName
Definition Encoding.cs:386
virtual int CodePage
Definition Encoding.cs:515
new ConfiguredTaskAwaitable< TResult > ConfigureAwait(bool continueOnCapturedContext)
Definition Task.cs:226
static string ToString(bool value)
static Base64Encoding Base64Encoding
static int ToChars(byte[] buffer, int offset, int count, char[] chars, int charOffset)
unsafe void UnsafeWriteUTF8Chars(char *chars, int charCount)
byte[] GetBuffer(int count, out int offset)
void WriteUTF8Chars(byte[] chars, int charOffset, int charCount)
async Task< BytesWithOffset > GetBufferAsync(int count)
Task WriteBytesAsync(byte b1, byte b2)
static readonly byte[] s_digits
static readonly byte[] s_endDecl
override void WriteEndStartElement(bool isEmpty)
override void WriteStartElement(string prefix, XmlDictionaryString localName)
override void WriteXmlnsAttribute(string prefix, XmlDictionaryString ns)
override void WriteStartAttribute(string prefix, XmlDictionaryString localName)
override void WriteText(string value)
override void WriteQualifiedName(string prefix, XmlDictionaryString localName)
override void WriteEscapedText(XmlDictionaryString s)
override void WriteComment(string text)
override void WriteDateTimeText(DateTime value)
void InternalWriteBase64Text(byte[] buffer, int offset, int count)
void WriteLocalName(byte[] localNameBuffer, int localNameOffset, int localNameLength)
override async Task WriteBase64TextAsync(byte[] trailBytes, int trailByteCount, byte[] buffer, int offset, int count)
unsafe override void WriteText(char[] chars, int offset, int count)
new void SetOutput(Stream stream, bool ownsStream, Encoding encoding)
void WriteLocalName(string localName)
void WritePrefix(byte[] prefixBuffer, int prefixOffset, int prefixLength)
override void WriteUniqueIdText(UniqueId value)
static readonly bool[] s_defaultIsEscapedAttributeChar
static readonly bool[] s_defaultIsEscapedElementChar
unsafe override void WriteEscapedText(char[] s, int offset, int count)
override void WriteBoolText(bool value)
override void WriteDoubleText(double value)
override async Task WriteEndStartElementAsync(bool isEmpty)
char[] GetCharBuffer(int charCount)
override void WriteStartElement(string prefix, string localName)
override void WriteCharEntity(int ch)
override void WriteUInt64Text(ulong value)
override void WriteStartAttribute(string prefix, string localName)
override void WriteTimeSpanText(TimeSpan value)
static readonly byte[] s_startDecl
override void WriteEndElement(byte[] prefixBuffer, int prefixOffset, int prefixLength, byte[] localNameBuffer, int localNameOffset, int localNameLength)
override void WriteText(XmlDictionaryString value)
override void WriteInt32Text(int value)
override async Task WriteEndElementAsync(string prefix, string localName)
override void WriteEndElement(string prefix, string localName)
override void WriteCData(string text)
unsafe void UnsafeWriteEscapedText(char *chars, int count)
XmlUTF8NodeWriter(bool[] isEscapedAttributeChar, bool[] isEscapedElementChar)
override async Task WriteEndAttributeAsync()
override void WriteStartElement(byte[] prefixBuffer, int prefixOffset, int prefixLength, byte[] localNameBuffer, int localNameOffset, int localNameLength)
override void WriteXmlnsAttribute(byte[] prefixBuffer, int prefixOffset, int prefixLength, byte[] nsBuffer, int nsOffset, int nsLength)
async Task InternalWriteBase64TextAsync(byte[] buffer, int offset, int count)
unsafe override void WriteEscapedText(string s)
override void WriteStartAttribute(byte[] prefixBuffer, int prefixOffset, int prefixLength, byte[] localNameBuffer, int localNameOffset, int localNameLength)
override void WriteDecimalText(decimal value)
override async Task WriteStartElementAsync(string prefix, string localName)
override void WriteEscapedText(byte[] chars, int offset, int count)
override void WriteInt64Text(long value)
int ToBase16(byte[] chars, int offset, uint value)
static readonly byte[] s_utf8Decl
readonly bool[] _isEscapedAttributeChar
override void WriteXmlnsAttribute(string prefix, string ns)
override void WriteBase64Text(byte[] trailBytes, int trailByteCount, byte[] buffer, int offset, int count)
override void WriteGuidText(Guid value)
override void WriteFloatText(float value)
override void WriteText(byte[] chars, int offset, int count)