Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
XmlEncodedRawTextWriter.cs
Go to the documentation of this file.
2using System.IO;
4using System.Text;
6
7namespace System.Xml;
8
10{
11 private readonly bool _useAsync;
12
13 protected byte[] _bufBytes;
14
15 protected Stream _stream;
16
18
19 protected int _bufPos = 1;
20
21 protected int _textPos = 1;
22
23 protected int _contentPos;
24
25 protected int _cdataPos;
26
27 protected int _attrEndPos;
28
29 protected int _bufLen = 6144;
30
31 protected bool _writeToNull;
32
33 protected bool _hadDoubleBracket;
34
35 protected bool _inAttributeValue;
36
37 protected int _bufBytesUsed;
38
39 protected char[] _bufChars;
40
41 protected Encoder _encoder;
42
44
45 protected bool _trackTextContent;
46
47 protected bool _inTextContent;
48
49 private int _lastMarkPos;
50
51 private int[] _textContentMarks;
52
54
56
57 protected bool _closeOutput;
58
59 protected bool _omitXmlDeclaration;
60
61 protected string _newLineChars;
62
63 protected bool _checkCharacters;
64
66
68
69 protected bool _autoXmlDeclaration;
70
71 protected bool _mergeCDataSections;
72
92
93 internal override bool SupportsNamespaceDeclarationInChunks => true;
94
96 {
97 _useAsync = settings.Async;
100 _newLineChars = settings.NewLineChars;
102 _closeOutput = settings.CloseOutput;
103 _standalone = settings.Standalone;
104 _outputMethod = settings.OutputMethod;
107 {
109 }
110 }
111
113 : this(settings)
114 {
115 _writer = writer;
117 if (settings.Async)
118 {
119 _bufLen = 65536;
120 }
121 _bufChars = new char[_bufLen + 32];
122 if (settings.AutoXmlDeclaration)
123 {
125 _autoXmlDeclaration = true;
126 }
127 }
128
130 : this(settings)
131 {
132 _stream = stream;
133 _encoding = settings.Encoding;
134 if (settings.Async)
135 {
136 _bufLen = 65536;
137 }
138 _bufChars = new char[_bufLen + 32];
139 _bufBytes = new byte[_bufChars.Length];
140 _bufBytesUsed = 0;
141 _trackTextContent = true;
142 _inTextContent = false;
143 _lastMarkPos = 0;
144 _textContentMarks = new int[64];
145 _textContentMarks[0] = 1;
148 _encoding = (Encoding)settings.Encoding.Clone();
151 if ((!stream.CanSeek || stream.Position == 0L) && preamble.Length != 0)
152 {
154 }
155 if (settings.AutoXmlDeclaration)
156 {
158 _autoXmlDeclaration = true;
159 }
160 }
161
163 {
165 {
167 {
169 }
170 RawText("<?xml version=\"");
171 RawText("1.0");
172 if (_encoding != null)
173 {
174 RawText("\" encoding=\"");
176 }
177 if (standalone != 0)
178 {
179 RawText("\" standalone=\"");
180 RawText((standalone == XmlStandalone.Yes) ? "yes" : "no");
181 }
182 RawText("\"?>");
183 }
184 }
185
186 internal override void WriteXmlDeclaration(string xmldecl)
187 {
189 {
191 }
192 }
193
194 public override void WriteDocType(string name, string pubid, string sysid, string subset)
195 {
197 {
199 }
200 RawText("<!DOCTYPE ");
201 RawText(name);
202 if (pubid != null)
203 {
204 RawText(" PUBLIC \"");
205 RawText(pubid);
206 RawText("\" \"");
207 if (sysid != null)
208 {
209 RawText(sysid);
210 }
211 _bufChars[_bufPos++] = '"';
212 }
213 else if (sysid != null)
214 {
215 RawText(" SYSTEM \"");
216 RawText(sysid);
217 _bufChars[_bufPos++] = '"';
218 }
219 else
220 {
221 _bufChars[_bufPos++] = ' ';
222 }
223 if (subset != null)
224 {
225 _bufChars[_bufPos++] = '[';
227 _bufChars[_bufPos++] = ']';
228 }
229 _bufChars[_bufPos++] = '>';
230 }
231
232 public override void WriteStartElement(string prefix, string localName, string ns)
233 {
235 {
237 }
238 _bufChars[_bufPos++] = '<';
239 if (prefix != null && prefix.Length != 0)
240 {
242 _bufChars[_bufPos++] = ':';
243 }
244 RawText(localName);
246 }
247
248 internal override void StartElementContent()
249 {
250 _bufChars[_bufPos++] = '>';
252 }
253
254 internal override void WriteEndElement(string prefix, string localName, string ns)
255 {
257 {
259 }
260 if (_contentPos != _bufPos)
261 {
262 _bufChars[_bufPos++] = '<';
263 _bufChars[_bufPos++] = '/';
264 if (prefix != null && prefix.Length != 0)
265 {
267 _bufChars[_bufPos++] = ':';
268 }
269 RawText(localName);
270 _bufChars[_bufPos++] = '>';
271 }
272 else
273 {
274 _bufPos--;
275 _bufChars[_bufPos++] = ' ';
276 _bufChars[_bufPos++] = '/';
277 _bufChars[_bufPos++] = '>';
278 }
279 }
280
281 internal override void WriteFullEndElement(string prefix, string localName, string ns)
282 {
284 {
286 }
287 _bufChars[_bufPos++] = '<';
288 _bufChars[_bufPos++] = '/';
289 if (prefix != null && prefix.Length != 0)
290 {
292 _bufChars[_bufPos++] = ':';
293 }
294 RawText(localName);
295 _bufChars[_bufPos++] = '>';
296 }
297
298 public override void WriteStartAttribute(string prefix, string localName, string ns)
299 {
301 {
303 }
304 if (_attrEndPos == _bufPos)
305 {
306 _bufChars[_bufPos++] = ' ';
307 }
308 if (prefix != null && prefix.Length > 0)
309 {
311 _bufChars[_bufPos++] = ':';
312 }
313 RawText(localName);
314 _bufChars[_bufPos++] = '=';
315 _bufChars[_bufPos++] = '"';
316 _inAttributeValue = true;
317 }
318
319 public override void WriteEndAttribute()
320 {
322 {
324 }
325 _bufChars[_bufPos++] = '"';
326 _inAttributeValue = false;
328 }
329
336
337 internal override void WriteStartNamespaceDeclaration(string prefix)
338 {
340 {
342 }
343 if (prefix.Length == 0)
344 {
345 RawText(" xmlns=\"");
346 }
347 else
348 {
349 RawText(" xmlns:");
351 _bufChars[_bufPos++] = '=';
352 _bufChars[_bufPos++] = '"';
353 }
354 _inAttributeValue = true;
356 {
358 }
359 }
360
361 internal override void WriteEndNamespaceDeclaration()
362 {
364 {
366 }
367 _inAttributeValue = false;
368 _bufChars[_bufPos++] = '"';
370 }
371
372 public override void WriteCData(string text)
373 {
375 {
377 }
379 {
380 _bufPos -= 3;
381 }
382 else
383 {
384 _bufChars[_bufPos++] = '<';
385 _bufChars[_bufPos++] = '!';
386 _bufChars[_bufPos++] = '[';
387 _bufChars[_bufPos++] = 'C';
388 _bufChars[_bufPos++] = 'D';
389 _bufChars[_bufPos++] = 'A';
390 _bufChars[_bufPos++] = 'T';
391 _bufChars[_bufPos++] = 'A';
392 _bufChars[_bufPos++] = '[';
393 }
395 _bufChars[_bufPos++] = ']';
396 _bufChars[_bufPos++] = ']';
397 _bufChars[_bufPos++] = '>';
400 }
401
402 public override void WriteComment(string text)
403 {
405 {
407 }
408 _bufChars[_bufPos++] = '<';
409 _bufChars[_bufPos++] = '!';
410 _bufChars[_bufPos++] = '-';
411 _bufChars[_bufPos++] = '-';
413 _bufChars[_bufPos++] = '-';
414 _bufChars[_bufPos++] = '-';
415 _bufChars[_bufPos++] = '>';
416 }
417
418 public override void WriteProcessingInstruction(string name, string text)
419 {
421 {
423 }
424 _bufChars[_bufPos++] = '<';
425 _bufChars[_bufPos++] = '?';
426 RawText(name);
427 if (text.Length > 0)
428 {
429 _bufChars[_bufPos++] = ' ';
431 }
432 _bufChars[_bufPos++] = '?';
433 _bufChars[_bufPos++] = '>';
434 }
435
436 public override void WriteEntityRef(string name)
437 {
439 {
441 }
442 _bufChars[_bufPos++] = '&';
443 RawText(name);
444 _bufChars[_bufPos++] = ';';
445 if (_bufPos > _bufLen)
446 {
447 FlushBuffer();
448 }
450 }
451
452 public override void WriteCharEntity(char ch)
453 {
454 int num = ch;
455 string s = num.ToString("X", NumberFormatInfo.InvariantInfo);
457 {
459 }
461 {
463 }
464 _bufChars[_bufPos++] = '&';
465 _bufChars[_bufPos++] = '#';
466 _bufChars[_bufPos++] = 'x';
467 RawText(s);
468 _bufChars[_bufPos++] = ';';
469 if (_bufPos > _bufLen)
470 {
471 FlushBuffer();
472 }
474 }
475
476 public unsafe override void WriteWhitespace(string ws)
477 {
479 {
481 }
482 fixed (char* ptr = ws)
483 {
484 char* pSrcEnd = ptr + ws.Length;
486 {
488 }
489 else
490 {
492 }
493 }
494 }
495
496 public unsafe override void WriteString(string text)
497 {
499 {
501 }
502 fixed (char* ptr = text)
503 {
504 char* pSrcEnd = ptr + text.Length;
506 {
508 }
509 else
510 {
512 }
513 }
514 }
515
516 public override void WriteSurrogateCharEntity(char lowChar, char highChar)
517 {
519 {
521 }
523 _bufChars[_bufPos++] = '&';
524 _bufChars[_bufPos++] = '#';
525 _bufChars[_bufPos++] = 'x';
526 RawText(num.ToString("X", NumberFormatInfo.InvariantInfo));
527 _bufChars[_bufPos++] = ';';
529 }
530
531 public unsafe override void WriteChars(char[] buffer, int index, int count)
532 {
534 {
536 }
537 fixed (char* ptr = &buffer[index])
538 {
540 {
542 }
543 else
544 {
546 }
547 }
548 }
549
550 public unsafe override void WriteRaw(char[] buffer, int index, int count)
551 {
553 {
555 }
556 fixed (char* ptr = &buffer[index])
557 {
559 }
561 }
562
563 public unsafe override void WriteRaw(string data)
564 {
566 {
568 }
569 fixed (char* ptr = data)
570 {
571 WriteRawWithCharChecking(ptr, ptr + data.Length);
572 }
574 }
575
576 public override void Close()
577 {
578 try
579 {
580 FlushBuffer();
581 FlushEncoder();
582 }
583 finally
584 {
585 _writeToNull = true;
586 if (_stream != null)
587 {
588 try
589 {
590 _stream.Flush();
591 }
592 finally
593 {
594 try
595 {
596 if (_closeOutput)
597 {
599 }
600 }
601 finally
602 {
603 _stream = null;
604 }
605 }
606 }
607 else if (_writer != null)
608 {
609 try
610 {
611 _writer.Flush();
612 }
613 finally
614 {
615 try
616 {
617 if (_closeOutput)
618 {
620 }
621 }
622 finally
623 {
624 _writer = null;
625 }
626 }
627 }
628 }
629 }
630
631 public override void Flush()
632 {
633 FlushBuffer();
634 FlushEncoder();
635 if (_stream != null)
636 {
637 _stream.Flush();
638 }
639 else if (_writer != null)
640 {
641 _writer.Flush();
642 }
643 }
644
645 protected virtual void FlushBuffer()
646 {
647 try
648 {
649 if (_writeToNull)
650 {
651 return;
652 }
653 if (_stream != null)
654 {
656 {
658 if (((uint)_lastMarkPos & (true ? 1u : 0u)) != 0)
659 {
660 _textContentMarks[1] = 1;
661 _lastMarkPos = 1;
662 }
663 else
664 {
665 _lastMarkPos = 0;
666 }
667 }
669 }
670 else if (_bufPos - 1 > 0)
671 {
673 }
674 }
675 catch
676 {
677 _writeToNull = true;
678 throw;
679 }
680 finally
681 {
682 _bufChars[0] = _bufChars[_bufPos - 1];
683 _textPos = ((_textPos == _bufPos) ? 1 : 0);
684 _attrEndPos = ((_attrEndPos == _bufPos) ? 1 : 0);
685 _contentPos = 0;
686 _cdataPos = 0;
687 _bufPos = 1;
688 }
689 }
690
692 {
693 while (startOffset < endOffset)
694 {
695 if (_charEntityFallback != null)
696 {
698 }
700 startOffset += charsUsed;
701 _bufBytesUsed += bytesUsed;
702 if (_bufBytesUsed >= _bufBytes.Length - 16)
703 {
705 _bufBytesUsed = 0;
706 }
707 }
709 {
711 _bufBytesUsed = 0;
712 }
713 }
714
715 private void FlushEncoder()
716 {
717 if (_stream != null)
718 {
719 _encoder.Convert(_bufChars, 1, 0, _bufBytes, 0, _bufBytes.Length, flush: true, out var _, out var bytesUsed, out var _);
720 if (bytesUsed != 0)
721 {
722 _stream.Write(_bufBytes, 0, bytesUsed);
723 }
724 }
725 }
726
727 protected unsafe void WriteAttributeTextBlock(char* pSrc, char* pSrcEnd)
728 {
729 fixed (char* ptr = _bufChars)
730 {
731 char* ptr2 = ptr + _bufPos;
732 int num = 0;
733 while (true)
734 {
735 char* ptr3 = ptr2 + (pSrcEnd - pSrc);
736 if (ptr3 > ptr + _bufLen)
737 {
738 ptr3 = ptr + _bufLen;
739 }
740 while (ptr2 < ptr3 && XmlCharType.IsAttributeValueChar((char)(num = *pSrc)))
741 {
742 *ptr2 = (char)num;
743 ptr2++;
744 pSrc++;
745 }
746 if (pSrc >= pSrcEnd)
747 {
748 break;
749 }
750 if (ptr2 >= ptr3)
751 {
752 _bufPos = (int)(ptr2 - ptr);
753 FlushBuffer();
754 ptr2 = ptr + 1;
755 continue;
756 }
757 switch (num)
758 {
759 case 38:
761 break;
762 case 60:
763 ptr2 = LtEntity(ptr2);
764 break;
765 case 62:
766 ptr2 = GtEntity(ptr2);
767 break;
768 case 34:
770 break;
771 case 39:
772 *ptr2 = (char)num;
773 ptr2++;
774 break;
775 case 9:
777 {
778 *ptr2 = (char)num;
779 ptr2++;
780 }
781 else
782 {
784 }
785 break;
786 case 13:
788 {
789 *ptr2 = (char)num;
790 ptr2++;
791 }
792 else
793 {
795 }
796 break;
797 case 10:
799 {
800 *ptr2 = (char)num;
801 ptr2++;
802 }
803 else
804 {
806 }
807 break;
808 default:
809 if (XmlCharType.IsSurrogate(num))
810 {
812 pSrc += 2;
813 }
814 else if (num <= 127 || num >= 65534)
815 {
816 ptr2 = InvalidXmlChar(num, ptr2, entitize: true);
817 pSrc++;
818 }
819 else
820 {
821 *ptr2 = (char)num;
822 ptr2++;
823 pSrc++;
824 }
825 continue;
826 }
827 pSrc++;
828 }
829 _bufPos = (int)(ptr2 - ptr);
830 }
831 }
832
833 protected unsafe void WriteElementTextBlock(char* pSrc, char* pSrcEnd)
834 {
835 fixed (char* ptr = _bufChars)
836 {
837 char* ptr2 = ptr + _bufPos;
838 int num = 0;
839 while (true)
840 {
841 char* ptr3 = ptr2 + (pSrcEnd - pSrc);
842 if (ptr3 > ptr + _bufLen)
843 {
844 ptr3 = ptr + _bufLen;
845 }
846 while (ptr2 < ptr3 && XmlCharType.IsAttributeValueChar((char)(num = *pSrc)))
847 {
848 *ptr2 = (char)num;
849 ptr2++;
850 pSrc++;
851 }
852 if (pSrc >= pSrcEnd)
853 {
854 break;
855 }
856 if (ptr2 >= ptr3)
857 {
858 _bufPos = (int)(ptr2 - ptr);
859 FlushBuffer();
860 ptr2 = ptr + 1;
861 continue;
862 }
863 switch (num)
864 {
865 case 38:
867 break;
868 case 60:
869 ptr2 = LtEntity(ptr2);
870 break;
871 case 62:
872 ptr2 = GtEntity(ptr2);
873 break;
874 case 9:
875 case 34:
876 case 39:
877 *ptr2 = (char)num;
878 ptr2++;
879 break;
880 case 10:
881 if (_newLineHandling == NewLineHandling.Replace)
882 {
884 break;
885 }
886 *ptr2 = (char)num;
887 ptr2++;
888 break;
889 case 13:
890 switch (_newLineHandling)
891 {
892 case NewLineHandling.Replace:
893 if (pSrc + 1 < pSrcEnd && pSrc[1] == '\n')
894 {
895 pSrc++;
896 }
898 break;
899 case NewLineHandling.Entitize:
901 break;
902 case NewLineHandling.None:
903 *ptr2 = (char)num;
904 ptr2++;
905 break;
906 }
907 break;
908 default:
909 if (XmlCharType.IsSurrogate(num))
910 {
912 pSrc += 2;
913 }
914 else if (num <= 127 || num >= 65534)
915 {
916 ptr2 = InvalidXmlChar(num, ptr2, entitize: true);
917 pSrc++;
918 }
919 else
920 {
921 *ptr2 = (char)num;
922 ptr2++;
923 pSrc++;
924 }
925 continue;
926 }
927 pSrc++;
928 }
929 _bufPos = (int)(ptr2 - ptr);
931 _contentPos = 0;
932 }
933 }
934
935 protected unsafe void RawText(string s)
936 {
937 fixed (char* ptr = s)
938 {
939 RawText(ptr, ptr + s.Length);
940 }
941 }
942
943 protected unsafe void RawText(char* pSrcBegin, char* pSrcEnd)
944 {
945 fixed (char* ptr = _bufChars)
946 {
947 char* ptr2 = ptr + _bufPos;
948 char* ptr3 = pSrcBegin;
949 int num = 0;
950 while (true)
951 {
952 char* ptr4 = ptr2 + (pSrcEnd - ptr3);
953 if (ptr4 > ptr + _bufLen)
954 {
955 ptr4 = ptr + _bufLen;
956 }
957 for (; ptr2 < ptr4; ptr2++)
958 {
959 if ((num = *ptr3) >= 55296)
960 {
961 break;
962 }
963 ptr3++;
964 *ptr2 = (char)num;
965 }
966 if (ptr3 >= pSrcEnd)
967 {
968 break;
969 }
970 if (ptr2 >= ptr4)
971 {
972 _bufPos = (int)(ptr2 - ptr);
973 FlushBuffer();
974 ptr2 = ptr + 1;
975 }
976 else if (XmlCharType.IsSurrogate(num))
977 {
979 ptr3 += 2;
980 }
981 else if (num <= 127 || num >= 65534)
982 {
983 ptr2 = InvalidXmlChar(num, ptr2, entitize: false);
984 ptr3++;
985 }
986 else
987 {
988 *ptr2 = (char)num;
989 ptr2++;
990 ptr3++;
991 }
992 }
993 _bufPos = (int)(ptr2 - ptr);
994 }
995 }
996
997 protected unsafe void WriteRawWithCharChecking(char* pSrcBegin, char* pSrcEnd)
998 {
999 fixed (char* ptr2 = _bufChars)
1000 {
1001 char* ptr = pSrcBegin;
1002 char* ptr3 = ptr2 + _bufPos;
1003 int num = 0;
1004 while (true)
1005 {
1006 char* ptr4 = ptr3 + (pSrcEnd - ptr);
1007 if (ptr4 > ptr2 + _bufLen)
1008 {
1009 ptr4 = ptr2 + _bufLen;
1010 }
1011 while (ptr3 < ptr4 && XmlCharType.IsTextChar((char)(num = *ptr)))
1012 {
1013 *ptr3 = (char)num;
1014 ptr3++;
1015 ptr++;
1016 }
1017 if (ptr >= pSrcEnd)
1018 {
1019 break;
1020 }
1021 if (ptr3 >= ptr4)
1022 {
1023 _bufPos = (int)(ptr3 - ptr2);
1024 FlushBuffer();
1025 ptr3 = ptr2 + 1;
1026 continue;
1027 }
1028 switch (num)
1029 {
1030 case 9:
1031 case 38:
1032 case 60:
1033 case 93:
1034 *ptr3 = (char)num;
1035 ptr3++;
1036 break;
1037 case 13:
1038 if (_newLineHandling == NewLineHandling.Replace)
1039 {
1040 if (ptr + 1 < pSrcEnd && ptr[1] == '\n')
1041 {
1042 ptr++;
1043 }
1045 }
1046 else
1047 {
1048 *ptr3 = (char)num;
1049 ptr3++;
1050 }
1051 break;
1052 case 10:
1053 if (_newLineHandling == NewLineHandling.Replace)
1054 {
1056 break;
1057 }
1058 *ptr3 = (char)num;
1059 ptr3++;
1060 break;
1061 default:
1062 if (XmlCharType.IsSurrogate(num))
1063 {
1065 ptr += 2;
1066 }
1067 else if (num <= 127 || num >= 65534)
1068 {
1069 ptr3 = InvalidXmlChar(num, ptr3, entitize: false);
1070 ptr++;
1071 }
1072 else
1073 {
1074 *ptr3 = (char)num;
1075 ptr3++;
1076 ptr++;
1077 }
1078 continue;
1079 }
1080 ptr++;
1081 }
1082 _bufPos = (int)(ptr3 - ptr2);
1083 }
1084 }
1085
1086 protected unsafe void WriteCommentOrPi(string text, int stopChar)
1087 {
1088 if (text.Length == 0)
1089 {
1090 if (_bufPos >= _bufLen)
1091 {
1092 FlushBuffer();
1093 }
1094 return;
1095 }
1096 fixed (char* ptr2 = text)
1097 {
1098 char[] bufChars = _bufChars;
1099 fixed (char[] array = bufChars)
1100 {
1101 char* ptr = (char*)((bufChars != null && array.Length != 0) ? Unsafe.AsPointer(ref array[0]) : null);
1102 char* ptr3 = ptr2;
1103 char* ptr4 = ptr2 + text.Length;
1104 char* ptr5 = ptr + _bufPos;
1105 int num = 0;
1106 while (true)
1107 {
1108 char* ptr6 = ptr5 + (ptr4 - ptr3);
1109 if (ptr6 > ptr + _bufLen)
1110 {
1111 ptr6 = ptr + _bufLen;
1112 }
1113 while (ptr5 < ptr6 && XmlCharType.IsTextChar((char)(num = *ptr3)) && num != stopChar)
1114 {
1115 *ptr5 = (char)num;
1116 ptr5++;
1117 ptr3++;
1118 }
1119 if (ptr3 >= ptr4)
1120 {
1121 break;
1122 }
1123 if (ptr5 >= ptr6)
1124 {
1125 _bufPos = (int)(ptr5 - ptr);
1126 FlushBuffer();
1127 ptr5 = ptr + 1;
1128 continue;
1129 }
1130 switch (num)
1131 {
1132 case 45:
1133 *ptr5 = '-';
1134 ptr5++;
1135 if (num == stopChar && (ptr3 + 1 == ptr4 || ptr3[1] == '-'))
1136 {
1137 *ptr5 = ' ';
1138 ptr5++;
1139 }
1140 break;
1141 case 63:
1142 *ptr5 = '?';
1143 ptr5++;
1144 if (num == stopChar && ptr3 + 1 < ptr4 && ptr3[1] == '>')
1145 {
1146 *ptr5 = ' ';
1147 ptr5++;
1148 }
1149 break;
1150 case 93:
1151 *ptr5 = ']';
1152 ptr5++;
1153 break;
1154 case 13:
1155 if (_newLineHandling == NewLineHandling.Replace)
1156 {
1157 if (ptr3 + 1 < ptr4 && ptr3[1] == '\n')
1158 {
1159 ptr3++;
1160 }
1162 }
1163 else
1164 {
1165 *ptr5 = (char)num;
1166 ptr5++;
1167 }
1168 break;
1169 case 10:
1170 if (_newLineHandling == NewLineHandling.Replace)
1171 {
1173 break;
1174 }
1175 *ptr5 = (char)num;
1176 ptr5++;
1177 break;
1178 case 9:
1179 case 38:
1180 case 60:
1181 *ptr5 = (char)num;
1182 ptr5++;
1183 break;
1184 default:
1185 if (XmlCharType.IsSurrogate(num))
1186 {
1188 ptr3 += 2;
1189 }
1190 else if (num <= 127 || num >= 65534)
1191 {
1192 ptr5 = InvalidXmlChar(num, ptr5, entitize: false);
1193 ptr3++;
1194 }
1195 else
1196 {
1197 *ptr5 = (char)num;
1198 ptr5++;
1199 ptr3++;
1200 }
1201 continue;
1202 }
1203 ptr3++;
1204 }
1205 _bufPos = (int)(ptr5 - ptr);
1206 }
1207 }
1208 }
1209
1210 protected unsafe void WriteCDataSection(string text)
1211 {
1212 if (text.Length == 0)
1213 {
1214 if (_bufPos >= _bufLen)
1215 {
1216 FlushBuffer();
1217 }
1218 return;
1219 }
1220 fixed (char* ptr2 = text)
1221 {
1222 char[] bufChars = _bufChars;
1223 fixed (char[] array = bufChars)
1224 {
1225 char* ptr = (char*)((bufChars != null && array.Length != 0) ? Unsafe.AsPointer(ref array[0]) : null);
1226 char* ptr3 = ptr2;
1227 char* ptr4 = ptr2 + text.Length;
1228 char* ptr5 = ptr + _bufPos;
1229 int num = 0;
1230 while (true)
1231 {
1232 char* ptr6 = ptr5 + (ptr4 - ptr3);
1233 if (ptr6 > ptr + _bufLen)
1234 {
1235 ptr6 = ptr + _bufLen;
1236 }
1237 while (ptr5 < ptr6 && XmlCharType.IsAttributeValueChar((char)(num = *ptr3)) && num != 93)
1238 {
1239 *ptr5 = (char)num;
1240 ptr5++;
1241 ptr3++;
1242 }
1243 if (ptr3 >= ptr4)
1244 {
1245 break;
1246 }
1247 if (ptr5 >= ptr6)
1248 {
1249 _bufPos = (int)(ptr5 - ptr);
1250 FlushBuffer();
1251 ptr5 = ptr + 1;
1252 continue;
1253 }
1254 switch (num)
1255 {
1256 case 62:
1257 if (_hadDoubleBracket && ptr5[-1] == ']')
1258 {
1261 }
1262 *ptr5 = '>';
1263 ptr5++;
1264 break;
1265 case 93:
1266 if (ptr5[-1] == ']')
1267 {
1268 _hadDoubleBracket = true;
1269 }
1270 else
1271 {
1272 _hadDoubleBracket = false;
1273 }
1274 *ptr5 = ']';
1275 ptr5++;
1276 break;
1277 case 13:
1278 if (_newLineHandling == NewLineHandling.Replace)
1279 {
1280 if (ptr3 + 1 < ptr4 && ptr3[1] == '\n')
1281 {
1282 ptr3++;
1283 }
1285 }
1286 else
1287 {
1288 *ptr5 = (char)num;
1289 ptr5++;
1290 }
1291 break;
1292 case 10:
1293 if (_newLineHandling == NewLineHandling.Replace)
1294 {
1296 break;
1297 }
1298 *ptr5 = (char)num;
1299 ptr5++;
1300 break;
1301 case 9:
1302 case 34:
1303 case 38:
1304 case 39:
1305 case 60:
1306 *ptr5 = (char)num;
1307 ptr5++;
1308 break;
1309 default:
1310 if (XmlCharType.IsSurrogate(num))
1311 {
1313 ptr3 += 2;
1314 }
1315 else if (num <= 127 || num >= 65534)
1316 {
1317 ptr5 = InvalidXmlChar(num, ptr5, entitize: false);
1318 ptr3++;
1319 }
1320 else
1321 {
1322 *ptr5 = (char)num;
1323 ptr5++;
1324 ptr3++;
1325 }
1326 continue;
1327 }
1328 ptr3++;
1329 }
1330 _bufPos = (int)(ptr5 - ptr);
1331 }
1332 }
1333 }
1334
1335 private unsafe static char* EncodeSurrogate(char* pSrc, char* pSrcEnd, char* pDst)
1336 {
1337 int num = *pSrc;
1338 if (num <= 56319)
1339 {
1340 if (pSrc + 1 < pSrcEnd)
1341 {
1342 int num2 = pSrc[1];
1344 {
1345 *pDst = (char)num;
1346 pDst[1] = (char)num2;
1347 pDst += 2;
1348 return pDst;
1349 }
1350 throw XmlConvert.CreateInvalidSurrogatePairException((char)num2, (char)num);
1351 }
1353 }
1355 }
1356
1357 private unsafe char* InvalidXmlChar(int ch, char* pDst, bool entitize)
1358 {
1359 if (_checkCharacters)
1360 {
1361 throw XmlConvert.CreateInvalidCharException((char)ch, '\0');
1362 }
1363 if (entitize)
1364 {
1365 return CharEntity(pDst, (char)ch);
1366 }
1367 *pDst = (char)ch;
1368 pDst++;
1369 return pDst;
1370 }
1371
1372 internal unsafe void EncodeChar(ref char* pSrc, char* pSrcEnd, ref char* pDst)
1373 {
1374 int num = *pSrc;
1375 if (XmlCharType.IsSurrogate(num))
1376 {
1378 pSrc += 2;
1379 }
1380 else if (num <= 127 || num >= 65534)
1381 {
1382 pDst = InvalidXmlChar(num, pDst, entitize: false);
1383 pSrc++;
1384 }
1385 else
1386 {
1387 *pDst = (char)num;
1388 pDst++;
1389 pSrc++;
1390 }
1391 }
1392
1393 protected void ChangeTextContentMark(bool value)
1394 {
1396 if (_lastMarkPos + 1 == _textContentMarks.Length)
1397 {
1399 }
1401 }
1402
1404 {
1405 int[] array = new int[_textContentMarks.Length * 2];
1408 }
1409
1410 protected unsafe char* WriteNewLine(char* pDst)
1411 {
1412 fixed (char* ptr = _bufChars)
1413 {
1414 _bufPos = (int)(pDst - ptr);
1416 return ptr + _bufPos;
1417 }
1418 }
1419
1420 protected unsafe static char* LtEntity(char* pDst)
1421 {
1422 *pDst = '&';
1423 pDst[1] = 'l';
1424 pDst[2] = 't';
1425 pDst[3] = ';';
1426 return pDst + 4;
1427 }
1428
1429 protected unsafe static char* GtEntity(char* pDst)
1430 {
1431 *pDst = '&';
1432 pDst[1] = 'g';
1433 pDst[2] = 't';
1434 pDst[3] = ';';
1435 return pDst + 4;
1436 }
1437
1438 protected unsafe static char* AmpEntity(char* pDst)
1439 {
1440 *pDst = '&';
1441 pDst[1] = 'a';
1442 pDst[2] = 'm';
1443 pDst[3] = 'p';
1444 pDst[4] = ';';
1445 return pDst + 5;
1446 }
1447
1448 protected unsafe static char* QuoteEntity(char* pDst)
1449 {
1450 *pDst = '&';
1451 pDst[1] = 'q';
1452 pDst[2] = 'u';
1453 pDst[3] = 'o';
1454 pDst[4] = 't';
1455 pDst[5] = ';';
1456 return pDst + 6;
1457 }
1458
1459 protected unsafe static char* TabEntity(char* pDst)
1460 {
1461 *pDst = '&';
1462 pDst[1] = '#';
1463 pDst[2] = 'x';
1464 pDst[3] = '9';
1465 pDst[4] = ';';
1466 return pDst + 5;
1467 }
1468
1469 protected unsafe static char* LineFeedEntity(char* pDst)
1470 {
1471 *pDst = '&';
1472 pDst[1] = '#';
1473 pDst[2] = 'x';
1474 pDst[3] = 'A';
1475 pDst[4] = ';';
1476 return pDst + 5;
1477 }
1478
1479 protected unsafe static char* CarriageReturnEntity(char* pDst)
1480 {
1481 *pDst = '&';
1482 pDst[1] = '#';
1483 pDst[2] = 'x';
1484 pDst[3] = 'D';
1485 pDst[4] = ';';
1486 return pDst + 5;
1487 }
1488
1489 private unsafe static char* CharEntity(char* pDst, char ch)
1490 {
1491 int num = ch;
1492 string text = num.ToString("X", NumberFormatInfo.InvariantInfo);
1493 *pDst = '&';
1494 pDst[1] = '#';
1495 pDst[2] = 'x';
1496 pDst += 3;
1497 fixed (char* ptr = text)
1498 {
1499 char* ptr2 = ptr;
1500 while ((*(pDst++) = *(ptr2++)) != 0)
1501 {
1502 }
1503 }
1504 pDst[-1] = ';';
1505 return pDst;
1506 }
1507
1508 protected unsafe static char* RawStartCData(char* pDst)
1509 {
1510 *pDst = '<';
1511 pDst[1] = '!';
1512 pDst[2] = '[';
1513 pDst[3] = 'C';
1514 pDst[4] = 'D';
1515 pDst[5] = 'A';
1516 pDst[6] = 'T';
1517 pDst[7] = 'A';
1518 pDst[8] = '[';
1519 return pDst + 9;
1520 }
1521
1522 protected unsafe static char* RawEndCData(char* pDst)
1523 {
1524 *pDst = ']';
1525 pDst[1] = ']';
1526 pDst[2] = '>';
1527 return pDst + 3;
1528 }
1529
1530 protected void ValidateContentChars(string chars, string propertyName, bool allowOnlyWhitespace)
1531 {
1533 {
1535 {
1537 }
1538 return;
1539 }
1540 string text = null;
1541 int num = 0;
1542 object[] args;
1543 while (true)
1544 {
1545 if (num >= chars.Length)
1546 {
1547 return;
1548 }
1549 if (!XmlCharType.IsTextChar(chars[num]))
1550 {
1551 switch (chars[num])
1552 {
1553 case '&':
1554 case '<':
1555 case ']':
1556 {
1560 break;
1561 }
1562 default:
1564 {
1565 if (num + 1 < chars.Length && XmlCharType.IsLowSurrogate(chars[num + 1]))
1566 {
1567 num++;
1568 goto IL_00f6;
1569 }
1571 }
1572 else
1573 {
1574 if (!XmlCharType.IsLowSurrogate(chars[num]))
1575 {
1576 goto IL_00f6;
1577 }
1579 }
1580 break;
1581 case '\t':
1582 case '\n':
1583 case '\r':
1584 goto IL_00f6;
1585 }
1586 break;
1587 }
1588 goto IL_00f6;
1589 IL_00f6:
1590 num++;
1591 }
1593 args = new string[2] { propertyName, text };
1595 }
1596
1597 protected void CheckAsyncCall()
1598 {
1599 if (!_useAsync)
1600 {
1602 }
1603 }
1604
1606 {
1609 {
1611 {
1613 }
1614 await RawTextAsync("<?xml version=\"").ConfigureAwait(continueOnCapturedContext: false);
1616 if (_encoding != null)
1617 {
1620 }
1621 if (standalone != 0)
1622 {
1623 await RawTextAsync("\" standalone=\"").ConfigureAwait(continueOnCapturedContext: false);
1624 await RawTextAsync((standalone == XmlStandalone.Yes) ? "yes" : "no").ConfigureAwait(continueOnCapturedContext: false);
1625 }
1627 }
1628 }
1629
1630 internal override Task WriteXmlDeclarationAsync(string xmldecl)
1631 {
1634 {
1636 }
1637 return Task.CompletedTask;
1638 }
1639
1640 protected override async ValueTask DisposeAsyncCore()
1641 {
1642 try
1643 {
1645 }
1646 finally
1647 {
1648 _writeToNull = true;
1649 if (_stream != null)
1650 {
1651 try
1652 {
1654 }
1655 finally
1656 {
1657 try
1658 {
1659 if (_closeOutput)
1660 {
1662 }
1663 }
1664 finally
1665 {
1666 _stream = null;
1667 }
1668 }
1669 }
1670 else if (_writer != null)
1671 {
1672 try
1673 {
1675 }
1676 finally
1677 {
1678 try
1679 {
1680 if (_closeOutput)
1681 {
1683 }
1684 }
1685 finally
1686 {
1687 _writer = null;
1688 }
1689 }
1690 }
1691 }
1692 }
1693
1694 public override async Task WriteDocTypeAsync(string name, string pubid, string sysid, string subset)
1695 {
1698 {
1700 }
1703 if (pubid != null)
1704 {
1708 if (sysid != null)
1709 {
1711 }
1712 _bufChars[_bufPos++] = '"';
1713 }
1714 else if (sysid != null)
1715 {
1718 _bufChars[_bufPos++] = '"';
1719 }
1720 else
1721 {
1722 _bufChars[_bufPos++] = ' ';
1723 }
1724 if (subset != null)
1725 {
1726 _bufChars[_bufPos++] = '[';
1728 _bufChars[_bufPos++] = ']';
1729 }
1730 _bufChars[_bufPos++] = '>';
1731 }
1732
1733 public override Task WriteStartElementAsync(string prefix, string localName, string ns)
1734 {
1737 {
1739 }
1740 _bufChars[_bufPos++] = '<';
1741 Task task = ((prefix == null || prefix.Length == 0) ? RawTextAsync(localName) : RawTextAsync(prefix, ":", localName));
1742 return task.CallVoidFuncWhenFinishAsync(delegate(XmlEncodedRawTextWriter thisRef)
1743 {
1744 thisRef.WriteStartElementAsync_SetAttEndPos();
1745 }, this);
1746 }
1747
1749 {
1751 }
1752
1753 internal override Task WriteEndElementAsync(string prefix, string localName, string ns)
1754 {
1757 {
1759 }
1760 if (_contentPos != _bufPos)
1761 {
1762 _bufChars[_bufPos++] = '<';
1763 _bufChars[_bufPos++] = '/';
1764 if (prefix != null && prefix.Length != 0)
1765 {
1766 return RawTextAsync(prefix, ":", localName, ">");
1767 }
1768 return RawTextAsync(localName, ">");
1769 }
1770 _bufPos--;
1771 _bufChars[_bufPos++] = ' ';
1772 _bufChars[_bufPos++] = '/';
1773 _bufChars[_bufPos++] = '>';
1774 return Task.CompletedTask;
1775 }
1776
1777 internal override Task WriteFullEndElementAsync(string prefix, string localName, string ns)
1778 {
1781 {
1783 }
1784 _bufChars[_bufPos++] = '<';
1785 _bufChars[_bufPos++] = '/';
1786 if (prefix != null && prefix.Length != 0)
1787 {
1788 return RawTextAsync(prefix, ":", localName, ">");
1789 }
1790 return RawTextAsync(localName, ">");
1791 }
1792
1793 protected internal override Task WriteStartAttributeAsync(string prefix, string localName, string ns)
1794 {
1797 {
1799 }
1800 if (_attrEndPos == _bufPos)
1801 {
1802 _bufChars[_bufPos++] = ' ';
1803 }
1804 Task task = ((prefix == null || prefix.Length <= 0) ? RawTextAsync(localName) : RawTextAsync(prefix, ":", localName));
1805 return task.CallVoidFuncWhenFinishAsync(delegate(XmlEncodedRawTextWriter thisRef)
1806 {
1807 thisRef.WriteStartAttribute_SetInAttribute();
1808 }, this);
1809 }
1810
1812 {
1813 _bufChars[_bufPos++] = '=';
1814 _bufChars[_bufPos++] = '"';
1815 _inAttributeValue = true;
1816 }
1817
1818 protected internal override Task WriteEndAttributeAsync()
1819 {
1822 {
1824 }
1825 _bufChars[_bufPos++] = '"';
1826 _inAttributeValue = false;
1828 return Task.CompletedTask;
1829 }
1830
1838
1840 {
1843 {
1845 }
1846 if (prefix.Length == 0)
1847 {
1849 }
1850 else
1851 {
1854 _bufChars[_bufPos++] = '=';
1855 _bufChars[_bufPos++] = '"';
1856 }
1857 _inAttributeValue = true;
1859 {
1861 }
1862 }
1863
1865 {
1868 {
1870 }
1871 _inAttributeValue = false;
1872 _bufChars[_bufPos++] = '"';
1874 return Task.CompletedTask;
1875 }
1876
1877 public override async Task WriteCDataAsync(string text)
1878 {
1881 {
1883 }
1885 {
1886 _bufPos -= 3;
1887 }
1888 else
1889 {
1890 _bufChars[_bufPos++] = '<';
1891 _bufChars[_bufPos++] = '!';
1892 _bufChars[_bufPos++] = '[';
1893 _bufChars[_bufPos++] = 'C';
1894 _bufChars[_bufPos++] = 'D';
1895 _bufChars[_bufPos++] = 'A';
1896 _bufChars[_bufPos++] = 'T';
1897 _bufChars[_bufPos++] = 'A';
1898 _bufChars[_bufPos++] = '[';
1899 }
1901 _bufChars[_bufPos++] = ']';
1902 _bufChars[_bufPos++] = ']';
1903 _bufChars[_bufPos++] = '>';
1904 _textPos = _bufPos;
1906 }
1907
1908 public override async Task WriteCommentAsync(string text)
1909 {
1912 {
1914 }
1915 _bufChars[_bufPos++] = '<';
1916 _bufChars[_bufPos++] = '!';
1917 _bufChars[_bufPos++] = '-';
1918 _bufChars[_bufPos++] = '-';
1920 _bufChars[_bufPos++] = '-';
1921 _bufChars[_bufPos++] = '-';
1922 _bufChars[_bufPos++] = '>';
1923 }
1924
1925 public override async Task WriteProcessingInstructionAsync(string name, string text)
1926 {
1929 {
1931 }
1932 _bufChars[_bufPos++] = '<';
1933 _bufChars[_bufPos++] = '?';
1935 if (text.Length > 0)
1936 {
1937 _bufChars[_bufPos++] = ' ';
1939 }
1940 _bufChars[_bufPos++] = '?';
1941 _bufChars[_bufPos++] = '>';
1942 }
1943
1944 public override async Task WriteEntityRefAsync(string name)
1945 {
1948 {
1950 }
1951 _bufChars[_bufPos++] = '&';
1953 _bufChars[_bufPos++] = ';';
1954 if (_bufPos > _bufLen)
1955 {
1957 }
1958 _textPos = _bufPos;
1959 }
1960
1961 public override async Task WriteCharEntityAsync(char ch)
1962 {
1964 int num = ch;
1965 string text = num.ToString("X", NumberFormatInfo.InvariantInfo);
1967 {
1969 }
1971 {
1973 }
1974 _bufChars[_bufPos++] = '&';
1975 _bufChars[_bufPos++] = '#';
1976 _bufChars[_bufPos++] = 'x';
1978 _bufChars[_bufPos++] = ';';
1979 if (_bufPos > _bufLen)
1980 {
1982 }
1983 _textPos = _bufPos;
1984 }
1985
1986 public override Task WriteWhitespaceAsync(string ws)
1987 {
1990 {
1992 }
1994 {
1996 }
1998 }
1999
2000 public override Task WriteStringAsync(string text)
2001 {
2004 {
2006 }
2008 {
2010 }
2012 }
2013
2015 {
2018 {
2020 }
2022 _bufChars[_bufPos++] = '&';
2023 _bufChars[_bufPos++] = '#';
2024 _bufChars[_bufPos++] = 'x';
2026 _bufChars[_bufPos++] = ';';
2027 _textPos = _bufPos;
2028 }
2029
2030 public override Task WriteCharsAsync(char[] buffer, int index, int count)
2031 {
2034 {
2036 }
2038 {
2040 }
2042 }
2043
2054
2055 public override async Task WriteRawAsync(string data)
2056 {
2059 {
2061 }
2063 _textPos = _bufPos;
2064 }
2065
2066 public override async Task FlushAsync()
2067 {
2071 if (_stream != null)
2072 {
2074 }
2075 else if (_writer != null)
2076 {
2078 }
2079 }
2080
2081 protected virtual async Task FlushBufferAsync()
2082 {
2083 _ = 1;
2084 try
2085 {
2086 if (_writeToNull)
2087 {
2088 return;
2089 }
2090 if (_stream != null)
2091 {
2093 {
2095 if (((uint)_lastMarkPos & (true ? 1u : 0u)) != 0)
2096 {
2097 _textContentMarks[1] = 1;
2098 _lastMarkPos = 1;
2099 }
2100 else
2101 {
2102 _lastMarkPos = 0;
2103 }
2104 }
2106 }
2107 else if (_bufPos - 1 > 0)
2108 {
2109 await _writer.WriteAsync(_bufChars.AsMemory(1, _bufPos - 1)).ConfigureAwait(continueOnCapturedContext: false);
2110 }
2111 }
2112 catch
2113 {
2114 _writeToNull = true;
2115 throw;
2116 }
2117 finally
2118 {
2119 _bufChars[0] = _bufChars[_bufPos - 1];
2120 _textPos = ((_textPos == _bufPos) ? 1 : 0);
2121 _attrEndPos = ((_attrEndPos == _bufPos) ? 1 : 0);
2122 _contentPos = 0;
2123 _cdataPos = 0;
2124 _bufPos = 1;
2125 }
2126 }
2127
2129 {
2130 while (startOffset < endOffset)
2131 {
2132 if (_charEntityFallback != null)
2133 {
2135 }
2137 startOffset += charsUsed;
2138 _bufBytesUsed += bytesUsed;
2139 if (_bufBytesUsed >= _bufBytes.Length - 16)
2140 {
2141 await _stream.WriteAsync(_bufBytes.AsMemory(0, _bufBytesUsed)).ConfigureAwait(continueOnCapturedContext: false);
2142 _bufBytesUsed = 0;
2143 }
2144 }
2146 {
2147 await _stream.WriteAsync(_bufBytes.AsMemory(0, _bufBytesUsed)).ConfigureAwait(continueOnCapturedContext: false);
2148 _bufBytesUsed = 0;
2149 }
2150 }
2151
2153 {
2154 if (_stream != null)
2155 {
2156 _encoder.Convert(_bufChars, 1, 0, _bufBytes, 0, _bufBytes.Length, flush: true, out var _, out var bytesUsed, out var _);
2157 if (bytesUsed != 0)
2158 {
2159 return _stream.WriteAsync(_bufBytes, 0, bytesUsed);
2160 }
2161 }
2162 return Task.CompletedTask;
2163 }
2164
2165 protected unsafe int WriteAttributeTextBlockNoFlush(char* pSrc, char* pSrcEnd)
2166 {
2167 char* ptr = pSrc;
2168 fixed (char* ptr2 = _bufChars)
2169 {
2170 char* ptr3 = ptr2 + _bufPos;
2171 int num = 0;
2172 while (true)
2173 {
2174 char* ptr4 = ptr3 + (pSrcEnd - pSrc);
2175 if (ptr4 > ptr2 + _bufLen)
2176 {
2177 ptr4 = ptr2 + _bufLen;
2178 }
2179 while (ptr3 < ptr4 && XmlCharType.IsAttributeValueChar((char)(num = *pSrc)))
2180 {
2181 *ptr3 = (char)num;
2182 ptr3++;
2183 pSrc++;
2184 }
2185 if (pSrc >= pSrcEnd)
2186 {
2187 break;
2188 }
2189 if (ptr3 >= ptr4)
2190 {
2191 _bufPos = (int)(ptr3 - ptr2);
2192 return (int)(pSrc - ptr);
2193 }
2194 switch (num)
2195 {
2196 case 38:
2197 ptr3 = AmpEntity(ptr3);
2198 break;
2199 case 60:
2200 ptr3 = LtEntity(ptr3);
2201 break;
2202 case 62:
2203 ptr3 = GtEntity(ptr3);
2204 break;
2205 case 34:
2207 break;
2208 case 39:
2209 *ptr3 = (char)num;
2210 ptr3++;
2211 break;
2212 case 9:
2214 {
2215 *ptr3 = (char)num;
2216 ptr3++;
2217 }
2218 else
2219 {
2220 ptr3 = TabEntity(ptr3);
2221 }
2222 break;
2223 case 13:
2225 {
2226 *ptr3 = (char)num;
2227 ptr3++;
2228 }
2229 else
2230 {
2232 }
2233 break;
2234 case 10:
2236 {
2237 *ptr3 = (char)num;
2238 ptr3++;
2239 }
2240 else
2241 {
2243 }
2244 break;
2245 default:
2246 if (XmlCharType.IsSurrogate(num))
2247 {
2249 pSrc += 2;
2250 }
2251 else if (num <= 127 || num >= 65534)
2252 {
2253 ptr3 = InvalidXmlChar(num, ptr3, entitize: true);
2254 pSrc++;
2255 }
2256 else
2257 {
2258 *ptr3 = (char)num;
2259 ptr3++;
2260 pSrc++;
2261 }
2262 continue;
2263 }
2264 pSrc++;
2265 }
2266 _bufPos = (int)(ptr3 - ptr2);
2267 }
2268 return -1;
2269 }
2270
2271 protected unsafe int WriteAttributeTextBlockNoFlush(char[] chars, int index, int count)
2272 {
2273 if (count == 0)
2274 {
2275 return -1;
2276 }
2277 fixed (char* ptr = &chars[index])
2278 {
2279 char* ptr2 = ptr;
2280 char* pSrcEnd = ptr2 + count;
2282 }
2283 }
2284
2285 protected unsafe int WriteAttributeTextBlockNoFlush(string text, int index, int count)
2286 {
2287 if (count == 0)
2288 {
2289 return -1;
2290 }
2291 fixed (char* ptr = text)
2292 {
2293 char* ptr2 = ptr + index;
2294 char* pSrcEnd = ptr2 + count;
2296 }
2297 }
2298
2300 {
2301 int curIndex = index;
2302 int leftCount = count;
2303 int writeLen;
2304 do
2305 {
2307 curIndex += writeLen;
2309 if (writeLen >= 0)
2310 {
2312 }
2313 }
2314 while (writeLen >= 0);
2315 }
2316
2318 {
2319 int num = 0;
2320 int num2 = 0;
2321 int length = text.Length;
2323 num2 += num;
2324 length -= num;
2325 if (num >= 0)
2326 {
2328 }
2329 return Task.CompletedTask;
2330 }
2331
2333 {
2335 int writeLen;
2336 do
2337 {
2339 curIndex += writeLen;
2341 if (writeLen >= 0)
2342 {
2344 }
2345 }
2346 while (writeLen >= 0);
2347 }
2348
2349 protected unsafe int WriteElementTextBlockNoFlush(char* pSrc, char* pSrcEnd, out bool needWriteNewLine)
2350 {
2351 needWriteNewLine = false;
2352 char* ptr = pSrc;
2353 fixed (char* ptr2 = _bufChars)
2354 {
2355 char* ptr3 = ptr2 + _bufPos;
2356 int num = 0;
2357 while (true)
2358 {
2359 char* ptr4 = ptr3 + (pSrcEnd - pSrc);
2360 if (ptr4 > ptr2 + _bufLen)
2361 {
2362 ptr4 = ptr2 + _bufLen;
2363 }
2364 while (ptr3 < ptr4 && XmlCharType.IsAttributeValueChar((char)(num = *pSrc)))
2365 {
2366 *ptr3 = (char)num;
2367 ptr3++;
2368 pSrc++;
2369 }
2370 if (pSrc >= pSrcEnd)
2371 {
2372 break;
2373 }
2374 if (ptr3 >= ptr4)
2375 {
2376 _bufPos = (int)(ptr3 - ptr2);
2377 return (int)(pSrc - ptr);
2378 }
2379 switch (num)
2380 {
2381 case 38:
2382 ptr3 = AmpEntity(ptr3);
2383 break;
2384 case 60:
2385 ptr3 = LtEntity(ptr3);
2386 break;
2387 case 62:
2388 ptr3 = GtEntity(ptr3);
2389 break;
2390 case 9:
2391 case 34:
2392 case 39:
2393 *ptr3 = (char)num;
2394 ptr3++;
2395 break;
2396 case 10:
2397 if (_newLineHandling == NewLineHandling.Replace)
2398 {
2399 _bufPos = (int)(ptr3 - ptr2);
2400 needWriteNewLine = true;
2401 return (int)(pSrc - ptr);
2402 }
2403 *ptr3 = (char)num;
2404 ptr3++;
2405 break;
2406 case 13:
2407 switch (_newLineHandling)
2408 {
2409 case NewLineHandling.Replace:
2410 if (pSrc + 1 < pSrcEnd && pSrc[1] == '\n')
2411 {
2412 pSrc++;
2413 }
2414 _bufPos = (int)(ptr3 - ptr2);
2415 needWriteNewLine = true;
2416 return (int)(pSrc - ptr);
2417 case NewLineHandling.Entitize:
2419 break;
2420 case NewLineHandling.None:
2421 *ptr3 = (char)num;
2422 ptr3++;
2423 break;
2424 }
2425 break;
2426 default:
2427 if (XmlCharType.IsSurrogate(num))
2428 {
2430 pSrc += 2;
2431 }
2432 else if (num <= 127 || num >= 65534)
2433 {
2434 ptr3 = InvalidXmlChar(num, ptr3, entitize: true);
2435 pSrc++;
2436 }
2437 else
2438 {
2439 *ptr3 = (char)num;
2440 ptr3++;
2441 pSrc++;
2442 }
2443 continue;
2444 }
2445 pSrc++;
2446 }
2447 _bufPos = (int)(ptr3 - ptr2);
2448 _textPos = _bufPos;
2449 _contentPos = 0;
2450 }
2451 return -1;
2452 }
2453
2454 protected unsafe int WriteElementTextBlockNoFlush(char[] chars, int index, int count, out bool needWriteNewLine)
2455 {
2456 needWriteNewLine = false;
2457 if (count == 0)
2458 {
2459 _contentPos = 0;
2460 return -1;
2461 }
2462 fixed (char* ptr = &chars[index])
2463 {
2464 char* ptr2 = ptr;
2465 char* pSrcEnd = ptr2 + count;
2467 }
2468 }
2469
2470 protected unsafe int WriteElementTextBlockNoFlush(string text, int index, int count, out bool needWriteNewLine)
2471 {
2472 needWriteNewLine = false;
2473 if (count == 0)
2474 {
2475 _contentPos = 0;
2476 return -1;
2477 }
2478 fixed (char* ptr = text)
2479 {
2480 char* ptr2 = ptr + index;
2481 char* pSrcEnd = ptr2 + count;
2483 }
2484 }
2485
2487 {
2488 int curIndex = index;
2489 int leftCount = count;
2490 bool needWriteNewLine = false;
2491 int writeLen;
2492 do
2493 {
2495 curIndex += writeLen;
2497 if (needWriteNewLine)
2498 {
2500 curIndex++;
2501 leftCount--;
2502 }
2503 else if (writeLen >= 0)
2504 {
2506 }
2507 }
2508 while (writeLen >= 0 || needWriteNewLine);
2509 }
2510
2512 {
2513 int num = 0;
2514 int num2 = 0;
2515 int length = text.Length;
2516 bool needWriteNewLine = false;
2518 num2 += num;
2519 length -= num;
2520 if (needWriteNewLine)
2521 {
2523 }
2524 if (num >= 0)
2525 {
2527 }
2528 return Task.CompletedTask;
2529 }
2530
2532 {
2533 bool needWriteNewLine = false;
2534 if (!newLine)
2535 {
2537 }
2538 else
2539 {
2541 curIndex++;
2542 leftCount--;
2543 }
2544 int writeLen;
2545 do
2546 {
2548 curIndex += writeLen;
2550 if (needWriteNewLine)
2551 {
2553 curIndex++;
2554 leftCount--;
2555 }
2556 else if (writeLen >= 0)
2557 {
2559 }
2560 }
2561 while (writeLen >= 0 || needWriteNewLine);
2562 }
2563
2564 protected unsafe int RawTextNoFlush(char* pSrcBegin, char* pSrcEnd)
2565 {
2566 fixed (char* ptr = _bufChars)
2567 {
2568 char* ptr2 = ptr + _bufPos;
2569 char* ptr3 = pSrcBegin;
2570 int num = 0;
2571 while (true)
2572 {
2573 char* ptr4 = ptr2 + (pSrcEnd - ptr3);
2574 if (ptr4 > ptr + _bufLen)
2575 {
2576 ptr4 = ptr + _bufLen;
2577 }
2578 for (; ptr2 < ptr4; ptr2++)
2579 {
2580 if ((num = *ptr3) >= 55296)
2581 {
2582 break;
2583 }
2584 ptr3++;
2585 *ptr2 = (char)num;
2586 }
2587 if (ptr3 >= pSrcEnd)
2588 {
2589 break;
2590 }
2591 if (ptr2 >= ptr4)
2592 {
2593 _bufPos = (int)(ptr2 - ptr);
2594 return (int)(ptr3 - pSrcBegin);
2595 }
2596 if (XmlCharType.IsSurrogate(num))
2597 {
2599 ptr3 += 2;
2600 }
2601 else if (num <= 127 || num >= 65534)
2602 {
2603 ptr2 = InvalidXmlChar(num, ptr2, entitize: false);
2604 ptr3++;
2605 }
2606 else
2607 {
2608 *ptr2 = (char)num;
2609 ptr2++;
2610 ptr3++;
2611 }
2612 }
2613 _bufPos = (int)(ptr2 - ptr);
2614 }
2615 return -1;
2616 }
2617
2618 protected unsafe int RawTextNoFlush(string text, int index, int count)
2619 {
2620 if (count == 0)
2621 {
2622 return -1;
2623 }
2624 fixed (char* ptr = text)
2625 {
2626 char* ptr2 = ptr + index;
2627 char* pSrcEnd = ptr2 + count;
2628 return RawTextNoFlush(ptr2, pSrcEnd);
2629 }
2630 }
2631
2632 protected Task RawTextAsync(string text)
2633 {
2634 int num = RawTextNoFlush(text, 0, text.Length);
2635 if (num < 0)
2636 {
2637 return Task.CompletedTask;
2638 }
2639 return _RawTextAsync(text, num, text.Length - num);
2640 }
2641
2642 protected Task RawTextAsync(string text1, string text2 = null, string text3 = null, string text4 = null)
2643 {
2644 int num = RawTextNoFlush(text1, 0, text1.Length);
2645 if (num >= 0)
2646 {
2647 return _RawTextAsync(text1, num, text1.Length - num, text2, text3, text4);
2648 }
2649 if (text2 != null)
2650 {
2651 num = RawTextNoFlush(text2, 0, text2.Length);
2652 if (num >= 0)
2653 {
2654 return _RawTextAsync(text2, num, text2.Length - num, text3, text4);
2655 }
2656 }
2657 if (text3 != null)
2658 {
2659 num = RawTextNoFlush(text3, 0, text3.Length);
2660 if (num >= 0)
2661 {
2662 return _RawTextAsync(text3, num, text3.Length - num, text4);
2663 }
2664 }
2665 if (text4 != null)
2666 {
2667 num = RawTextNoFlush(text4, 0, text4.Length);
2668 if (num >= 0)
2669 {
2670 return _RawTextAsync(text4, num, text4.Length - num);
2671 }
2672 }
2673 return Task.CompletedTask;
2674 }
2675
2676 private async Task _RawTextAsync(string text1, int curIndex1, int leftCount1, string text2 = null, string text3 = null, string text4 = null)
2677 {
2679 int writeLen;
2680 do
2681 {
2685 if (writeLen >= 0)
2686 {
2688 }
2689 }
2690 while (writeLen >= 0);
2691 if (text2 != null)
2692 {
2694 }
2695 }
2696
2698 {
2699 needWriteNewLine = false;
2700 fixed (char* ptr2 = _bufChars)
2701 {
2702 char* ptr = pSrcBegin;
2703 char* ptr3 = ptr2 + _bufPos;
2704 int num = 0;
2705 while (true)
2706 {
2707 char* ptr4 = ptr3 + (pSrcEnd - ptr);
2708 if (ptr4 > ptr2 + _bufLen)
2709 {
2710 ptr4 = ptr2 + _bufLen;
2711 }
2712 while (ptr3 < ptr4 && XmlCharType.IsTextChar((char)(num = *ptr)))
2713 {
2714 *ptr3 = (char)num;
2715 ptr3++;
2716 ptr++;
2717 }
2718 if (ptr >= pSrcEnd)
2719 {
2720 break;
2721 }
2722 if (ptr3 >= ptr4)
2723 {
2724 _bufPos = (int)(ptr3 - ptr2);
2725 return (int)(ptr - pSrcBegin);
2726 }
2727 switch (num)
2728 {
2729 case 9:
2730 case 38:
2731 case 60:
2732 case 93:
2733 *ptr3 = (char)num;
2734 ptr3++;
2735 break;
2736 case 13:
2737 if (_newLineHandling == NewLineHandling.Replace)
2738 {
2739 if (ptr + 1 < pSrcEnd && ptr[1] == '\n')
2740 {
2741 ptr++;
2742 }
2743 _bufPos = (int)(ptr3 - ptr2);
2744 needWriteNewLine = true;
2745 return (int)(ptr - pSrcBegin);
2746 }
2747 *ptr3 = (char)num;
2748 ptr3++;
2749 break;
2750 case 10:
2751 if (_newLineHandling == NewLineHandling.Replace)
2752 {
2753 _bufPos = (int)(ptr3 - ptr2);
2754 needWriteNewLine = true;
2755 return (int)(ptr - pSrcBegin);
2756 }
2757 *ptr3 = (char)num;
2758 ptr3++;
2759 break;
2760 default:
2761 if (XmlCharType.IsSurrogate(num))
2762 {
2764 ptr += 2;
2765 }
2766 else if (num <= 127 || num >= 65534)
2767 {
2768 ptr3 = InvalidXmlChar(num, ptr3, entitize: false);
2769 ptr++;
2770 }
2771 else
2772 {
2773 *ptr3 = (char)num;
2774 ptr3++;
2775 ptr++;
2776 }
2777 continue;
2778 }
2779 ptr++;
2780 }
2781 _bufPos = (int)(ptr3 - ptr2);
2782 }
2783 return -1;
2784 }
2785
2786 protected unsafe int WriteRawWithCharCheckingNoFlush(char[] chars, int index, int count, out bool needWriteNewLine)
2787 {
2788 needWriteNewLine = false;
2789 if (count == 0)
2790 {
2791 return -1;
2792 }
2793 fixed (char* ptr = &chars[index])
2794 {
2795 char* ptr2 = ptr;
2796 char* pSrcEnd = ptr2 + count;
2798 }
2799 }
2800
2801 protected unsafe int WriteRawWithCharCheckingNoFlush(string text, int index, int count, out bool needWriteNewLine)
2802 {
2803 needWriteNewLine = false;
2804 if (count == 0)
2805 {
2806 return -1;
2807 }
2808 fixed (char* ptr = text)
2809 {
2810 char* ptr2 = ptr + index;
2811 char* pSrcEnd = ptr2 + count;
2813 }
2814 }
2815
2817 {
2818 int curIndex = index;
2819 int leftCount = count;
2820 bool needWriteNewLine = false;
2821 int writeLen;
2822 do
2823 {
2825 curIndex += writeLen;
2827 if (needWriteNewLine)
2828 {
2830 curIndex++;
2831 leftCount--;
2832 }
2833 else if (writeLen >= 0)
2834 {
2836 }
2837 }
2838 while (writeLen >= 0 || needWriteNewLine);
2839 }
2840
2842 {
2843 int curIndex = 0;
2844 int leftCount = text.Length;
2845 bool needWriteNewLine = false;
2846 int writeLen;
2847 do
2848 {
2850 curIndex += writeLen;
2852 if (needWriteNewLine)
2853 {
2855 curIndex++;
2856 leftCount--;
2857 }
2858 else if (writeLen >= 0)
2859 {
2861 }
2862 }
2863 while (writeLen >= 0 || needWriteNewLine);
2864 }
2865
2866 protected unsafe int WriteCommentOrPiNoFlush(string text, int index, int count, int stopChar, out bool needWriteNewLine)
2867 {
2868 needWriteNewLine = false;
2869 if (count == 0)
2870 {
2871 return -1;
2872 }
2873 fixed (char* ptr = text)
2874 {
2875 char* ptr2 = ptr + index;
2876 char[] bufChars = _bufChars;
2877 fixed (char[] array = bufChars)
2878 {
2879 char* ptr3 = (char*)((bufChars != null && array.Length != 0) ? Unsafe.AsPointer(ref array[0]) : null);
2880 char* ptr4 = ptr2;
2881 char* ptr5 = ptr4;
2882 char* ptr6 = ptr2 + count;
2883 char* ptr7 = ptr3 + _bufPos;
2884 int num = 0;
2885 while (true)
2886 {
2887 char* ptr8 = ptr7 + (ptr6 - ptr4);
2888 if (ptr8 > ptr3 + _bufLen)
2889 {
2890 ptr8 = ptr3 + _bufLen;
2891 }
2892 while (ptr7 < ptr8 && XmlCharType.IsTextChar((char)(num = *ptr4)) && num != stopChar)
2893 {
2894 *ptr7 = (char)num;
2895 ptr7++;
2896 ptr4++;
2897 }
2898 if (ptr4 >= ptr6)
2899 {
2900 break;
2901 }
2902 if (ptr7 >= ptr8)
2903 {
2904 _bufPos = (int)(ptr7 - ptr3);
2905 return (int)(ptr4 - ptr5);
2906 }
2907 switch (num)
2908 {
2909 case 45:
2910 *ptr7 = '-';
2911 ptr7++;
2912 if (num == stopChar && (ptr4 + 1 == ptr6 || ptr4[1] == '-'))
2913 {
2914 *ptr7 = ' ';
2915 ptr7++;
2916 }
2917 break;
2918 case 63:
2919 *ptr7 = '?';
2920 ptr7++;
2921 if (num == stopChar && ptr4 + 1 < ptr6 && ptr4[1] == '>')
2922 {
2923 *ptr7 = ' ';
2924 ptr7++;
2925 }
2926 break;
2927 case 93:
2928 *ptr7 = ']';
2929 ptr7++;
2930 break;
2931 case 13:
2932 if (_newLineHandling == NewLineHandling.Replace)
2933 {
2934 if (ptr4 + 1 < ptr6 && ptr4[1] == '\n')
2935 {
2936 ptr4++;
2937 }
2938 _bufPos = (int)(ptr7 - ptr3);
2939 needWriteNewLine = true;
2940 return (int)(ptr4 - ptr5);
2941 }
2942 *ptr7 = (char)num;
2943 ptr7++;
2944 break;
2945 case 10:
2946 if (_newLineHandling == NewLineHandling.Replace)
2947 {
2948 _bufPos = (int)(ptr7 - ptr3);
2949 needWriteNewLine = true;
2950 return (int)(ptr4 - ptr5);
2951 }
2952 *ptr7 = (char)num;
2953 ptr7++;
2954 break;
2955 case 9:
2956 case 38:
2957 case 60:
2958 *ptr7 = (char)num;
2959 ptr7++;
2960 break;
2961 default:
2962 if (XmlCharType.IsSurrogate(num))
2963 {
2965 ptr4 += 2;
2966 }
2967 else if (num <= 127 || num >= 65534)
2968 {
2969 ptr7 = InvalidXmlChar(num, ptr7, entitize: false);
2970 ptr4++;
2971 }
2972 else
2973 {
2974 *ptr7 = (char)num;
2975 ptr7++;
2976 ptr4++;
2977 }
2978 continue;
2979 }
2980 ptr4++;
2981 }
2982 _bufPos = (int)(ptr7 - ptr3);
2983 }
2984 return -1;
2985 }
2986 }
2987
2989 {
2990 if (text.Length == 0)
2991 {
2992 if (_bufPos >= _bufLen)
2993 {
2995 }
2996 return;
2997 }
2998 int curIndex = 0;
2999 int leftCount = text.Length;
3000 bool needWriteNewLine = false;
3001 int writeLen;
3002 do
3003 {
3005 curIndex += writeLen;
3007 if (needWriteNewLine)
3008 {
3010 curIndex++;
3011 leftCount--;
3012 }
3013 else if (writeLen >= 0)
3014 {
3016 }
3017 }
3018 while (writeLen >= 0 || needWriteNewLine);
3019 }
3020
3021 protected unsafe int WriteCDataSectionNoFlush(string text, int index, int count, out bool needWriteNewLine)
3022 {
3023 needWriteNewLine = false;
3024 if (count == 0)
3025 {
3026 return -1;
3027 }
3028 fixed (char* ptr = text)
3029 {
3030 char* ptr2 = ptr + index;
3031 char[] bufChars = _bufChars;
3032 fixed (char[] array = bufChars)
3033 {
3034 char* ptr3 = (char*)((bufChars != null && array.Length != 0) ? Unsafe.AsPointer(ref array[0]) : null);
3035 char* ptr4 = ptr2;
3036 char* ptr5 = ptr2 + count;
3037 char* ptr6 = ptr4;
3038 char* ptr7 = ptr3 + _bufPos;
3039 int num = 0;
3040 while (true)
3041 {
3042 char* ptr8 = ptr7 + (ptr5 - ptr4);
3043 if (ptr8 > ptr3 + _bufLen)
3044 {
3045 ptr8 = ptr3 + _bufLen;
3046 }
3047 while (ptr7 < ptr8 && XmlCharType.IsAttributeValueChar((char)(num = *ptr4)) && num != 93)
3048 {
3049 *ptr7 = (char)num;
3050 ptr7++;
3051 ptr4++;
3052 }
3053 if (ptr4 >= ptr5)
3054 {
3055 break;
3056 }
3057 if (ptr7 >= ptr8)
3058 {
3059 _bufPos = (int)(ptr7 - ptr3);
3060 return (int)(ptr4 - ptr6);
3061 }
3062 switch (num)
3063 {
3064 case 62:
3065 if (_hadDoubleBracket && ptr7[-1] == ']')
3066 {
3069 }
3070 *ptr7 = '>';
3071 ptr7++;
3072 break;
3073 case 93:
3074 if (ptr7[-1] == ']')
3075 {
3076 _hadDoubleBracket = true;
3077 }
3078 else
3079 {
3080 _hadDoubleBracket = false;
3081 }
3082 *ptr7 = ']';
3083 ptr7++;
3084 break;
3085 case 13:
3086 if (_newLineHandling == NewLineHandling.Replace)
3087 {
3088 if (ptr4 + 1 < ptr5 && ptr4[1] == '\n')
3089 {
3090 ptr4++;
3091 }
3092 _bufPos = (int)(ptr7 - ptr3);
3093 needWriteNewLine = true;
3094 return (int)(ptr4 - ptr6);
3095 }
3096 *ptr7 = (char)num;
3097 ptr7++;
3098 break;
3099 case 10:
3100 if (_newLineHandling == NewLineHandling.Replace)
3101 {
3102 _bufPos = (int)(ptr7 - ptr3);
3103 needWriteNewLine = true;
3104 return (int)(ptr4 - ptr6);
3105 }
3106 *ptr7 = (char)num;
3107 ptr7++;
3108 break;
3109 case 9:
3110 case 34:
3111 case 38:
3112 case 39:
3113 case 60:
3114 *ptr7 = (char)num;
3115 ptr7++;
3116 break;
3117 default:
3118 if (XmlCharType.IsSurrogate(num))
3119 {
3121 ptr4 += 2;
3122 }
3123 else if (num <= 127 || num >= 65534)
3124 {
3125 ptr7 = InvalidXmlChar(num, ptr7, entitize: false);
3126 ptr4++;
3127 }
3128 else
3129 {
3130 *ptr7 = (char)num;
3131 ptr7++;
3132 ptr4++;
3133 }
3134 continue;
3135 }
3136 ptr4++;
3137 }
3138 _bufPos = (int)(ptr7 - ptr3);
3139 }
3140 return -1;
3141 }
3142 }
3143
3145 {
3146 if (text.Length == 0)
3147 {
3148 if (_bufPos >= _bufLen)
3149 {
3151 }
3152 return;
3153 }
3154 int curIndex = 0;
3155 int leftCount = text.Length;
3156 bool needWriteNewLine = false;
3157 int writeLen;
3158 do
3159 {
3161 curIndex += writeLen;
3163 if (needWriteNewLine)
3164 {
3166 curIndex++;
3167 leftCount--;
3168 }
3169 else if (writeLen >= 0)
3170 {
3172 }
3173 }
3174 while (writeLen >= 0 || needWriteNewLine);
3175 }
3176}
static unsafe void Copy(Array sourceArray, Array destinationArray, int length)
Definition Array.cs:624
static CultureInfo InvariantCulture
Task FlushAsync()
Definition Stream.cs:669
Task WriteAsync(byte[] buffer, int offset, int count)
Definition Stream.cs:914
void Dispose()
Definition Stream.cs:639
void Write(byte[] buffer, int offset, int count)
virtual ValueTask DisposeAsync()
Definition Stream.cs:654
virtual void Dispose(bool disposing)
virtual Task WriteAsync(char value)
virtual Task FlushAsync()
virtual void Write(char value)
virtual void Flush()
virtual ValueTask DisposeAsync()
static string Xml_IndentCharsNotWhitespace
Definition SR.cs:334
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string Xml_InvalidCharsInIndent
Definition SR.cs:332
static string Xml_InvalidSurrogateHighChar
Definition SR.cs:322
static string Xml_InvalidSurrogateMissingLowChar
Definition SR.cs:324
static string Xml_InvalidCharacter
Definition SR.cs:110
static string Xml_WriterAsyncNotSetException
Definition SR.cs:284
Definition SR.cs:7
virtual void Convert(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex, int byteCount, bool flush, out int charsUsed, out int bytesUsed, out bool completed)
Definition Encoder.cs:135
virtual ReadOnlySpan< byte > Preamble
Definition Encoding.cs:347
virtual string WebName
Definition Encoding.cs:386
virtual Encoder GetEncoder()
Definition Encoding.cs:1009
virtual object Clone()
Definition Encoding.cs:706
new ConfiguredTaskAwaitable< TResult > ConfigureAwait(bool continueOnCapturedContext)
Definition Task.cs:226
static Task CompletedTask
Definition Task.cs:1120
void Reset(int[] textContentMarks, int endMarkPos)
static bool IsSurrogate(int ch)
static bool IsAttributeValueChar(char ch)
static bool IsOnlyWhitespace(string str)
static bool IsTextChar(char ch)
static bool IsLowSurrogate(int ch)
static int CombineSurrogateChar(int lowChar, int highChar)
static bool IsCharData(char ch)
static bool IsHighSurrogate(int ch)
static Exception CreateInvalidCharException(char[] data, int length, int invCharPos, ExceptionType exceptionType)
static Exception CreateInvalidSurrogatePairException(char low, char hi)
static Exception CreateInvalidHighSurrogateCharException(char hi)
override async Task WriteRawAsync(char[] buffer, int index, int count)
readonly CharEntityEncoderFallback _charEntityFallback
override void WriteXmlDeclaration(XmlStandalone standalone)
unsafe int WriteAttributeTextBlockNoFlush(string text, int index, int count)
unsafe int WriteAttributeTextBlockNoFlush(char[] chars, int index, int count)
override async Task WriteCDataAsync(string text)
XmlEncodedRawTextWriter(XmlWriterSettings settings)
unsafe int WriteCommentOrPiNoFlush(string text, int index, int count, int stopChar, out bool needWriteNewLine)
unsafe int WriteCDataSectionNoFlush(string text, int index, int count, out bool needWriteNewLine)
static unsafe char * AmpEntity(char *pDst)
static unsafe char * LtEntity(char *pDst)
override async Task WriteDocTypeAsync(string name, string pubid, string sysid, string subset)
override void WriteStartElement(string prefix, string localName, string ns)
override void WriteNamespaceDeclaration(string prefix, string namespaceName)
override async Task WriteNamespaceDeclarationAsync(string prefix, string namespaceName)
override void WriteProcessingInstruction(string name, string text)
override Task WriteFullEndElementAsync(string prefix, string localName, string ns)
override async Task WriteSurrogateCharEntityAsync(char lowChar, char highChar)
unsafe void RawText(char *pSrcBegin, char *pSrcEnd)
async Task _WriteElementTextBlockAsync(bool newLine, string text, int curIndex, int leftCount)
override Task WriteEndElementAsync(string prefix, string localName, string ns)
unsafe void EncodeChar(ref char *pSrc, char *pSrcEnd, ref char *pDst)
override async Task WriteStartNamespaceDeclarationAsync(string prefix)
unsafe override void WriteRaw(char[] buffer, int index, int count)
unsafe int WriteElementTextBlockNoFlush(string text, int index, int count, out bool needWriteNewLine)
override void WriteSurrogateCharEntity(char lowChar, char highChar)
override void WriteEndElement(string prefix, string localName, string ns)
async Task EncodeCharsAsync(int startOffset, int endOffset, bool writeAllToStream)
unsafe override void WriteString(string text)
async Task _RawTextAsync(string text1, int curIndex1, int leftCount1, string text2=null, string text3=null, string text4=null)
override void WriteStartNamespaceDeclaration(string prefix)
unsafe int WriteRawWithCharCheckingNoFlush(string text, int index, int count, out bool needWriteNewLine)
unsafe int RawTextNoFlush(char *pSrcBegin, char *pSrcEnd)
override void WriteXmlDeclaration(string xmldecl)
async Task WriteRawWithCharCheckingAsync(string text)
unsafe void WriteCommentOrPi(string text, int stopChar)
override Task WriteStartElementAsync(string prefix, string localName, string ns)
override Task WriteCharsAsync(char[] buffer, int index, int count)
override void WriteStartAttribute(string prefix, string localName, string ns)
Task RawTextAsync(string text1, string text2=null, string text3=null, string text4=null)
unsafe char * InvalidXmlChar(int ch, char *pDst, bool entitize)
unsafe int RawTextNoFlush(string text, int index, int count)
override async Task WriteProcessingInstructionAsync(string name, string text)
static unsafe char * GtEntity(char *pDst)
override Task WriteStartAttributeAsync(string prefix, string localName, string ns)
async Task WriteElementTextBlockAsync(char[] chars, int index, int count)
override async Task WriteCharEntityAsync(char ch)
static unsafe char * QuoteEntity(char *pDst)
override Task WriteXmlDeclarationAsync(string xmldecl)
override async Task WriteCommentAsync(string text)
static unsafe char * LineFeedEntity(char *pDst)
unsafe void WriteElementTextBlock(char *pSrc, char *pSrcEnd)
unsafe int WriteElementTextBlockNoFlush(char *pSrc, char *pSrcEnd, out bool needWriteNewLine)
unsafe int WriteElementTextBlockNoFlush(char[] chars, int index, int count, out bool needWriteNewLine)
XmlEncodedRawTextWriter(Stream stream, XmlWriterSettings settings)
override async Task WriteRawAsync(string data)
async Task WriteAttributeTextBlockAsync(char[] chars, int index, int count)
unsafe override void WriteWhitespace(string ws)
static unsafe char * CharEntity(char *pDst, char ch)
unsafe void WriteAttributeTextBlock(char *pSrc, char *pSrcEnd)
static unsafe char * RawStartCData(char *pDst)
unsafe override void WriteChars(char[] buffer, int index, int count)
async Task _WriteAttributeTextBlockAsync(string text, int curIndex, int leftCount)
unsafe int WriteRawWithCharCheckingNoFlush(char[] chars, int index, int count, out bool needWriteNewLine)
override async Task WriteEntityRefAsync(string name)
async Task WriteRawWithCharCheckingAsync(char[] chars, int index, int count)
void ValidateContentChars(string chars, string propertyName, bool allowOnlyWhitespace)
unsafe void WriteRawWithCharChecking(char *pSrcBegin, char *pSrcEnd)
static unsafe char * RawEndCData(char *pDst)
void EncodeChars(int startOffset, int endOffset, bool writeAllToStream)
static unsafe char * TabEntity(char *pDst)
unsafe int WriteAttributeTextBlockNoFlush(char *pSrc, char *pSrcEnd)
override void WriteDocType(string name, string pubid, string sysid, string subset)
override async Task WriteXmlDeclarationAsync(XmlStandalone standalone)
async Task WriteCommentOrPiAsync(string text, int stopChar)
XmlEncodedRawTextWriter(TextWriter writer, XmlWriterSettings settings)
unsafe int WriteRawWithCharCheckingNoFlush(char *pSrcBegin, char *pSrcEnd, out bool needWriteNewLine)
unsafe override void WriteRaw(string data)
static unsafe char * CarriageReturnEntity(char *pDst)
override void WriteFullEndElement(string prefix, string localName, string ns)
static unsafe char * EncodeSurrogate(char *pSrc, char *pSrcEnd, char *pDst)
static string[] BuildCharExceptionArgs(string data, int invCharIndex)
ConfiguredValueTaskAwaitable ConfigureAwait(bool continueOnCapturedContext)
Definition ValueTask.cs:312