public OutStream writeXml(string s, long mask)
{
bool escNewlines = (mask & m_xmlEscNewlines) != 0;
bool escQuotes = (mask & m_xmlEscQuotes) != 0;
bool escUnicode = (mask & m_xmlEscUnicode) != 0;
int len = s.Length;
for (int i=0; i<len; ++i)
{
int ch = s[i];
switch (ch)
{
// table switch on control chars
case 0: case 1: case 2: case 3: case 4: case 5: case 6:
case 7: case 8: /*case 9: case 10:*/ case 11: case 12: /*case 13:*/
case 14: case 15: case 16: case 17: case 18: case 19: case 20:
case 21: case 22: case 23: case 24: case 25: case 26: case 27:
case 28: case 29: case 30: case 31:
writeXmlEsc(ch);
break;
// newlines
case '\n': case '\r':
if (!escNewlines)
writeChar((char)ch);
else
writeXmlEsc(ch);
break;
// space
case ' ':
writeChar(' ');
break;
// table switch on common ASCII chars
case '!': case '#': case '$': case '%': case '(': case ')': case '*':
case '+': case ',': case '-': case '.': case '/': case '0': case '1':
case '2': case '3': case '4': case '5': case '6': case '7': case '8':
case '9': case ':': case ';': case '=': case '?': case '@': case 'A':
case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H':
case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O':
case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V':
case 'W': case 'X': case 'Y': case 'Z': case '[': case '\\': case ']':
case '^': case '_': case '`': case 'a': case 'b': case 'c': case 'd':
case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k':
case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y':
case 'z': case '{': case '|': case '}': case '~':
writeChar((char)ch);
break;
// XML control characters
case '<':
writeChars("<");
break;
case '>':
if (i > 0 && s[i-1] != ']') writeChar('>');
else writeChars(">");
break;
case '&':
writeChars("&");
break;
case '"':
if (!escQuotes) writeChar((char)ch);
else writeChars(""");
break;
case '\'':
if (!escQuotes) writeChar((char)ch);
else writeChars("'");
break;
// default
default:
if (ch <= 0xf7 || !escUnicode)
writeChar((char)ch);
else
writeXmlEsc(ch);
break;
}
}
return this;
}