private void AdvanceState(Token token)
{
if ((int)_currentState >= (int)State.Closed)
{
if (_currentState == State.Closed || _currentState == State.Error)
{
throw new InvalidOperationException(SR.Xml_ClosedOrError);
}
else
{
throw new InvalidOperationException(SR.Format(SR.Xml_WrongToken, tokenName[(int)token], GetStateName(_currentState)));
}
}
Advance:
State newState = _stateTable[((int)token << 4) + (int)_currentState];
// [ (int)token * 16 + (int)currentState ];
if ((int)newState >= (int)State.Error)
{
switch (newState)
{
case State.Error:
ThrowInvalidStateTransition(token, _currentState);
break;
case State.StartContent:
StartElementContent();
newState = State.Content;
break;
case State.StartContentEle:
StartElementContent();
newState = State.Element;
break;
case State.StartContentB64:
StartElementContent();
newState = State.B64Content;
break;
case State.StartDoc:
WriteStartDocument();
newState = State.Document;
break;
case State.StartDocEle:
WriteStartDocument();
newState = State.Element;
break;
case State.EndAttrSEle:
WriteEndAttribute();
StartElementContent();
newState = State.Element;
break;
case State.EndAttrEEle:
WriteEndAttribute();
StartElementContent();
newState = State.Content;
break;
case State.EndAttrSCont:
WriteEndAttribute();
StartElementContent();
newState = State.Content;
break;
case State.EndAttrSAttr:
WriteEndAttribute();
newState = State.Attribute;
break;
case State.PostB64Cont:
if (_rawWriter != null)
{
_rawWriter.WriteEndBase64();
}
_currentState = State.Content;
goto Advance;
case State.PostB64Attr:
if (_rawWriter != null)
{
_rawWriter.WriteEndBase64();
}
_currentState = State.Attribute;
goto Advance;
case State.PostB64RootAttr:
if (_rawWriter != null)
{
_rawWriter.WriteEndBase64();
}
_currentState = State.RootLevelAttr;
goto Advance;
case State.StartFragEle:
StartFragment();
newState = State.Element;
break;
case State.StartFragCont:
StartFragment();
newState = State.Content;
break;
case State.StartFragB64:
StartFragment();
newState = State.B64Content;
break;
case State.StartRootLevelAttr:
WriteEndAttribute();
newState = State.RootLevelAttr;
break;
default:
Debug.Assert(false, "We should not get to this point.");
break;
}
}
_currentState = newState;
}