e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
254 lines
7.7 KiB
C#
254 lines
7.7 KiB
C#
//------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------
|
|
namespace System.Xml
|
|
{
|
|
using System.Runtime;
|
|
|
|
enum PrefixHandleType
|
|
{
|
|
Empty,
|
|
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
|
|
Buffer,
|
|
Max,
|
|
}
|
|
|
|
class PrefixHandle
|
|
{
|
|
XmlBufferReader bufferReader;
|
|
PrefixHandleType type;
|
|
int offset;
|
|
int length;
|
|
static string[] prefixStrings = { "", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };
|
|
static byte[] prefixBuffer = { (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z' };
|
|
|
|
public PrefixHandle(XmlBufferReader bufferReader)
|
|
{
|
|
this.bufferReader = bufferReader;
|
|
}
|
|
|
|
public void SetValue(PrefixHandleType type)
|
|
{
|
|
Fx.Assert(type != PrefixHandleType.Buffer, "");
|
|
this.type = type;
|
|
}
|
|
|
|
public void SetValue(PrefixHandle prefix)
|
|
{
|
|
this.type = prefix.type;
|
|
this.offset = prefix.offset;
|
|
this.length = prefix.length;
|
|
}
|
|
|
|
public void SetValue(int offset, int length)
|
|
{
|
|
if (length == 0)
|
|
{
|
|
SetValue(PrefixHandleType.Empty);
|
|
return;
|
|
}
|
|
|
|
if (length == 1)
|
|
{
|
|
byte ch = bufferReader.GetByte(offset);
|
|
if (ch >= 'a' && ch <= 'z')
|
|
{
|
|
SetValue(GetAlphaPrefix(ch - 'a'));
|
|
return;
|
|
}
|
|
}
|
|
|
|
this.type = PrefixHandleType.Buffer;
|
|
this.offset = offset;
|
|
this.length = length;
|
|
}
|
|
|
|
public bool IsEmpty
|
|
{
|
|
get
|
|
{
|
|
return type == PrefixHandleType.Empty;
|
|
}
|
|
}
|
|
|
|
public bool IsXmlns
|
|
{
|
|
get
|
|
{
|
|
if (type != PrefixHandleType.Buffer)
|
|
return false;
|
|
if (this.length != 5)
|
|
return false;
|
|
byte[] buffer = bufferReader.Buffer;
|
|
int offset = this.offset;
|
|
return buffer[offset + 0] == 'x' &&
|
|
buffer[offset + 1] == 'm' &&
|
|
buffer[offset + 2] == 'l' &&
|
|
buffer[offset + 3] == 'n' &&
|
|
buffer[offset + 4] == 's';
|
|
}
|
|
}
|
|
|
|
public bool IsXml
|
|
{
|
|
get
|
|
{
|
|
if (type != PrefixHandleType.Buffer)
|
|
return false;
|
|
if (this.length != 3)
|
|
return false;
|
|
byte[] buffer = bufferReader.Buffer;
|
|
int offset = this.offset;
|
|
return buffer[offset + 0] == 'x' &&
|
|
buffer[offset + 1] == 'm' &&
|
|
buffer[offset + 2] == 'l';
|
|
}
|
|
}
|
|
|
|
public bool TryGetShortPrefix(out PrefixHandleType type)
|
|
{
|
|
type = this.type;
|
|
return (type != PrefixHandleType.Buffer);
|
|
}
|
|
|
|
public static string GetString(PrefixHandleType type)
|
|
{
|
|
Fx.Assert(type != PrefixHandleType.Buffer, "");
|
|
return prefixStrings[(int)type];
|
|
}
|
|
|
|
public static PrefixHandleType GetAlphaPrefix(int index)
|
|
{
|
|
Fx.Assert(index >= 0 && index < 26, "");
|
|
return (PrefixHandleType)(PrefixHandleType.A + index);
|
|
}
|
|
|
|
public static byte[] GetString(PrefixHandleType type, out int offset, out int length)
|
|
{
|
|
Fx.Assert(type != PrefixHandleType.Buffer, "");
|
|
if (type == PrefixHandleType.Empty)
|
|
{
|
|
offset = 0;
|
|
length = 0;
|
|
}
|
|
else
|
|
{
|
|
length = 1;
|
|
offset = (int)(type - PrefixHandleType.A);
|
|
}
|
|
return prefixBuffer;
|
|
}
|
|
|
|
public string GetString(XmlNameTable nameTable)
|
|
{
|
|
PrefixHandleType type = this.type;
|
|
if (type != PrefixHandleType.Buffer)
|
|
return GetString(type);
|
|
else
|
|
return bufferReader.GetString(offset, length, nameTable);
|
|
}
|
|
|
|
public string GetString()
|
|
{
|
|
PrefixHandleType type = this.type;
|
|
if (type != PrefixHandleType.Buffer)
|
|
return GetString(type);
|
|
else
|
|
return bufferReader.GetString(offset, length);
|
|
}
|
|
|
|
public byte[] GetString(out int offset, out int length)
|
|
{
|
|
PrefixHandleType type = this.type;
|
|
if (type != PrefixHandleType.Buffer)
|
|
return GetString(type, out offset, out length);
|
|
else
|
|
{
|
|
offset = this.offset;
|
|
length = this.length;
|
|
return bufferReader.Buffer;
|
|
}
|
|
}
|
|
|
|
public int CompareTo(PrefixHandle that)
|
|
{
|
|
return GetString().CompareTo(that.GetString());
|
|
}
|
|
|
|
bool Equals2(PrefixHandle prefix2)
|
|
{
|
|
PrefixHandleType type1 = this.type;
|
|
PrefixHandleType type2 = prefix2.type;
|
|
if (type1 != type2)
|
|
return false;
|
|
if (type1 != PrefixHandleType.Buffer)
|
|
return true;
|
|
if (this.bufferReader == prefix2.bufferReader)
|
|
return bufferReader.Equals2(this.offset, this.length, prefix2.offset, prefix2.length);
|
|
else
|
|
return bufferReader.Equals2(this.offset, this.length, prefix2.bufferReader, prefix2.offset, prefix2.length);
|
|
}
|
|
|
|
bool Equals2(string prefix2)
|
|
{
|
|
PrefixHandleType type = this.type;
|
|
if (type != PrefixHandleType.Buffer)
|
|
return GetString(type) == prefix2;
|
|
return bufferReader.Equals2(this.offset, this.length, prefix2);
|
|
}
|
|
|
|
bool Equals2(XmlDictionaryString prefix2)
|
|
{
|
|
return Equals2(prefix2.Value);
|
|
}
|
|
|
|
static public bool operator ==(PrefixHandle prefix1, string prefix2)
|
|
{
|
|
return prefix1.Equals2(prefix2);
|
|
}
|
|
|
|
static public bool operator !=(PrefixHandle prefix1, string prefix2)
|
|
{
|
|
return !prefix1.Equals2(prefix2);
|
|
}
|
|
|
|
static public bool operator ==(PrefixHandle prefix1, XmlDictionaryString prefix2)
|
|
{
|
|
return prefix1.Equals2(prefix2);
|
|
}
|
|
|
|
static public bool operator !=(PrefixHandle prefix1, XmlDictionaryString prefix2)
|
|
{
|
|
return !prefix1.Equals2(prefix2);
|
|
}
|
|
|
|
static public bool operator ==(PrefixHandle prefix1, PrefixHandle prefix2)
|
|
{
|
|
return prefix1.Equals2(prefix2);
|
|
}
|
|
|
|
static public bool operator !=(PrefixHandle prefix1, PrefixHandle prefix2)
|
|
{
|
|
return !prefix1.Equals2(prefix2);
|
|
}
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
PrefixHandle that = obj as PrefixHandle;
|
|
if (object.ReferenceEquals(that, null))
|
|
return false;
|
|
return this == that;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return GetString();
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return GetString().GetHashCode();
|
|
}
|
|
}
|
|
}
|