/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/

#include <precomp.h>
#include <s2_dsapi/cx_dsapi.hxx>


// NOT FULLY DEFINED SERVICES
#include <x_parse2.hxx>
#include <tools/tkpchars.hxx>
#include <s2_dsapi/tk_atag2.hxx>
#include <s2_dsapi/tk_docw2.hxx>
#include <s2_dsapi/tk_xml.hxx>
#include <s2_dsapi/cx_docu2.hxx>
#include <s2_dsapi/tokrecv.hxx>


namespace csi
{
namespace dsapi
{


const intt C_nStatusSize = 128;
const intt C_nCppInitialNrOfStati = 400;


const uintt nF_fin_Error = 1;
const uintt nF_fin_Ignore = 2;
const uintt nF_fin_Eof = 3;
const uintt nF_fin_AnyWord = 4;
const uintt nF_fin_AtTag = 5;
const uintt nF_fin_EndSign = 6;
const uintt nF_goto_EoHtml = 7;
const uintt nF_goto_EoXmlConst = 8;
const uintt nF_goto_EoXmlLink_BeginTag = 9;
const uintt nF_goto_EoXmlLink_EndTag = 10;
const uintt nF_goto_EoXmlFormat_BeginTag = 11;
const uintt nF_goto_EoXmlFormat_EndTag = 12;
const uintt nF_goto_CheckStar = 13;
const uintt nF_fin_Comma = 14;
const uintt nF_fin_White = 15;

const UINT16 nTok_at_author = 100 + Tok_AtTag::author;
const UINT16 nTok_at_see = 100 + Tok_AtTag::see;
const UINT16 nTok_at_param = 100 + Tok_AtTag::param;
const UINT16 nTok_at_return = 100 + Tok_AtTag::e_return;
const UINT16 nTok_at_throws = 100 + Tok_AtTag::e_throw;
const UINT16 nTok_at_example = 100 + Tok_AtTag::example;
const UINT16 nTok_at_deprecated = 100 + Tok_AtTag::deprecated;
const UINT16 nTok_at_suspicious = 100 + Tok_AtTag::suspicious;
const UINT16 nTok_at_missing = 100 + Tok_AtTag::missing;
const UINT16 nTok_at_incomplete = 100 + Tok_AtTag::incomplete;
const UINT16 nTok_at_version = 100 + Tok_AtTag::version;
const UINT16 nTok_at_guarantees = 100 + Tok_AtTag::guarantees;
const UINT16 nTok_at_exception = 100 + Tok_AtTag::exception;
const UINT16 nTok_at_since = 100 + Tok_AtTag::since;

const UINT16 nTok_const_TRUE = 200 + Tok_XmlConst::e_true;
const UINT16 nTok_const_FALSE = 200 + Tok_XmlConst::e_false;
const UINT16 nTok_const_NULL = 200 + Tok_XmlConst::e_null;
const UINT16 nTok_const_void = 200 + Tok_XmlConst::e_void;

const UINT16 nTok_link_typeB = 300 + Tok_XmlLink_BeginTag::type;
const UINT16 nTok_link_typeE = 325 + Tok_XmlLink_EndTag::type;
const UINT16 nTok_link_memberB = 300 + Tok_XmlLink_BeginTag::member;
const UINT16 nTok_link_membeE = 325 + Tok_XmlLink_EndTag::member;
const UINT16 nTok_link_constB = 300 + Tok_XmlLink_BeginTag::e_const;
const UINT16 nTok_link_constE = 325 + Tok_XmlLink_EndTag::e_const;

const UINT16 nTok_format_listingB = 350 + Tok_XmlFormat_BeginTag::listing;
const UINT16 nTok_format_listingE = 375 + Tok_XmlFormat_EndTag::listing;
const UINT16 nTok_format_codeB = 350 + Tok_XmlFormat_BeginTag::code;
const UINT16 nTok_format_codeE = 375 + Tok_XmlFormat_EndTag::code;
const UINT16 nTok_format_atomB = 350 + Tok_XmlFormat_BeginTag::atom;
const UINT16 nTok_format_atomE = 375 + Tok_XmlFormat_EndTag::atom;


const UINT16 nTok_html_parastart = 400;

const UINT16 nTok_MLDocuEnd = 501;
const UINT16 nTok_EOL = 502;


Context_Docu::Context_Docu( Token_Receiver & o_rReceiver )
	:	aStateMachine(C_nStatusSize, C_nCppInitialNrOfStati),
		pReceiver(&o_rReceiver),
		pParentContext(0),
		pCx_EoHtml(0),
		pCx_EoXmlConst(0),
		pCx_EoXmlLink_BeginTag(0),
		pCx_EoXmlLink_EndTag(0),
		pCx_EoXmlFormat_BeginTag(0),
		pCx_EoXmlFormat_EndTag(0),
		pCx_CheckStar(0),
		pNewToken(0),
		pFollowUpContext(0),
		bIsMultiline(false)
{
	pCx_EoHtml = new Cx_EoHtml(o_rReceiver, *this);
	pCx_EoXmlConst = new Cx_EoXmlConst(o_rReceiver, *this);
	pCx_EoXmlLink_BeginTag = new Cx_EoXmlLink_BeginTag(o_rReceiver, *this);
	pCx_EoXmlLink_EndTag = new Cx_EoXmlLink_EndTag(o_rReceiver, *this);
	pCx_EoXmlFormat_BeginTag = new Cx_EoXmlFormat_BeginTag(o_rReceiver, *this);
	pCx_EoXmlFormat_EndTag = new Cx_EoXmlFormat_EndTag(o_rReceiver, *this);
	pCx_CheckStar = new Cx_CheckStar(*pReceiver,*this);

	SetupStateMachine();
}

void
Context_Docu::SetParentContext( TkpContext & io_rParentContext,
								const char * )
{
	pFollowUpContext = pParentContext = &io_rParentContext;
	pCx_CheckStar->Set_End_FolloUpContext(io_rParentContext);
}

Context_Docu::~Context_Docu()
{
}

void
Context_Docu::ReadCharChain( CharacterSource & io_rText )
{
	csv_assert(pParentContext != 0);

	pNewToken = 0;

	UINT16 nTokenId = 0;
	StmBoundsStatu2 & rBound = aStateMachine.GetCharChain(nTokenId, io_rText);

	// !!!
	// 	 The order of the next two lines is essential, because
	//   pFollowUpContext may be changed by PerformStatusFunction() also,
	//   which then MUST override the previous assignment.
	pFollowUpContext = rBound.FollowUpContext();
	PerformStatusFunction(rBound.StatusFunctionNr(), nTokenId, io_rText);
}

bool
Context_Docu::PassNewToken()
{
	if (pNewToken)
	{
		pReceiver->Receive(*pNewToken.Release());
		return true;
	}
	return false;
}

TkpContext &
Context_Docu::FollowUpContext()
{
	csv_assert(pFollowUpContext != 0);
	return *pFollowUpContext;
}

void
Context_Docu::PerformStatusFunction( uintt				i_nStatusSignal,
									 UINT16 	      	i_nTokenId,
									 CharacterSource &	io_rText )
{
	switch (i_nStatusSignal)
	{
		case nF_fin_White:
			io_rText.CutToken();
			pNewToken = new Tok_White;
            break;
		case nF_fin_Error:
			throw X_AutodocParser(X_AutodocParser::x_InvalidChar);
            // no break because of throw
		case nF_fin_Ignore:
			pNewToken = 0;
			io_rText.CutToken();
			break;
		case nF_fin_Eof:
			if (bIsMultiline)
				throw X_AutodocParser(X_AutodocParser::x_UnexpectedEOF);
			else
				io_rText.CutToken();
				pNewToken = new Tok_EOF;
			break;
		case nF_fin_AnyWord:
			pNewToken = new Tok_Word(io_rText.CutToken());
			break;
		case nF_fin_AtTag:
			io_rText.CutToken();
			pNewToken = new Tok_AtTag( i_nTokenId - 100 );
			break;
		case nF_fin_Comma:
			io_rText.CutToken();
			pNewToken = new Tok_Comma;
			break;
		case nF_fin_EndSign:
			io_rText.CutToken();
			switch (i_nTokenId)
			{
				case nTok_MLDocuEnd:
					if (bIsMultiline)
					{
						pNewToken = new Tok_DocuEnd;
						pFollowUpContext = pParentContext;
					}
					else
					{
						pNewToken = new Tok_Word(io_rText.CutToken());
						pFollowUpContext = this;
					}
					break;
				case nTok_EOL:
					if (bIsMultiline)
					{
						pNewToken = new Tok_EOL;
						pFollowUpContext = this;
					}
					else
					{
						pNewToken = new Tok_DocuEnd;
						pFollowUpContext = pParentContext;
					}
					pReceiver->Increment_CurLine();
					break;
				default:
					csv_assert(false);
			}
			break;
		case nF_goto_EoHtml:
			pCx_EoHtml->SetIfIsStartOfParagraph(i_nTokenId == nTok_html_parastart);
			break;
		case nF_goto_EoXmlConst:
			pCx_EoXmlConst->SetTokenId(i_nTokenId - 200);
			break;
		case nF_goto_EoXmlLink_BeginTag:
			pCx_EoXmlLink_BeginTag->SetTokenId(i_nTokenId - 300);
			break;
		case nF_goto_EoXmlLink_EndTag:
			pCx_EoXmlLink_EndTag->SetTokenId(i_nTokenId - 325);
			break;
		case nF_goto_EoXmlFormat_BeginTag:
			pCx_EoXmlFormat_BeginTag->SetTokenId(i_nTokenId - 350);
			break;
		case nF_goto_EoXmlFormat_EndTag:
			pCx_EoXmlFormat_EndTag->SetTokenId(i_nTokenId - 375);
			break;
		case nF_goto_CheckStar:
			pCx_CheckStar->SetIsEnd( bIsMultiline );
			break;
		default:
			csv_assert(false);
	}	// end switch (i_nStatusSignal)
}

void
Context_Docu::SetupStateMachine()
{
	// Besondere Array-Stati (kein Tokenabschluss oder Kontextwechsel):
//	const INT16	bas = 0;		// Base-Status
	const INT16	wht = 1;		// Whitespace-overlook-Status
	const INT16	awd = 2;        // Any-Word-Read-Status

	// Kontextwechsel-Stati:
	const INT16	goto_EoHtml = 3;
	const INT16	goto_EoXmlConst = 4;
	const INT16	goto_EoXmlLink_BeginTag = 5;
	const INT16	goto_EoXmlLink_EndTag = 6;
	const INT16	goto_EoXmlFormat_BeginTag = 7;
	const INT16	goto_EoXmlFormat_EndTag = 8;
	const INT16	goto_CheckStar = 9;

	// Tokenfinish-Stati:
	const INT16 finError = 10;
//	const INT16 finIgnore = 11;
	const INT16 finEof = 12;
	const INT16 finAnyWord = 13;
	const INT16 finAtTag = 14;
	const INT16 finEndSign = 15;
//	const INT16 finComma = 16;
	const INT16 finWhite = 17;

	// Konstanten zur Benutzung in der Tabelle:
	const INT16 ght = goto_EoHtml;
/*
	const INT16 gxc = goto_EoXmlConst;
	const INT16 glb = goto_EoXmlLink_TagBegin;
	const INT16 gle = goto_EoXmlLink_TagEnd;
	const INT16 gfb = goto_EoXmlFormat_TagBegin;
	const INT16 gfe = goto_EoXmlFormat_TagEnd;
*/
	const INT16 err = finError;
	const INT16 faw = finAnyWord;
//	const INT16 fig = finIgnore;
//	const INT16 fes = finEndSign;
	const INT16 fof = finEof;
//	const INT16 fat = finAtTag;
    const INT16 fwh = finWhite;

	/// The '0's  will be replaced by calls of AddToken().

	const INT16 A_nTopStatus[C_nStatusSize] =
	//  0	1	2	3	4	5	6	7	8	9  10  11  12  13  14  15
	{fof,err,err,err,err,err,err,err,err,wht,  0,wht,wht,  0,err,err,
	 err,err,err,err,err,err,err,err,err,err,fof,err,err,err,err,err, // ... 31
	 wht,awd,awd,awd,awd,awd,awd,awd,awd,awd,  0,awd,awd,awd,awd,awd,
	 awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,  0,awd,awd,awd, // ... 63
	   0,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,
	 awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd, // ... 95
	 awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,
	 awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd  // ... 127
	};

	const INT16 A_nWhitespaceStatus[C_nStatusSize] =
  //   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
	{fof,err,err,err,err,err,err,err,err,wht,fwh,wht,wht,fwh,err,err,
	 err,err,err,err,err,err,err,err,err,err,fof,err,err,err,err,err, // ... 31
	 wht,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,
	 fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh, // ... 63
	 fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,
	 fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh, // ... 95
	 fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,
	 fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh  // ... 127
	};

	const INT16 A_nWordStatus[C_nStatusSize] =
	// 	0	1	2	3	4	5	6	7	8	9  10  11  12  13  14  15
	{faw,err,err,err,err,err,err,err,err,faw,faw,faw,faw,faw,err,err,
	 err,err,err,err,err,err,err,err,err,err,faw,err,err,err,err,err, // ... 31
	 faw,awd,awd,awd,awd,awd,awd,awd,awd,awd,faw,awd,awd,awd,awd,awd,
	 awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,faw,awd,awd,awd, // ... 63
	 faw,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,
	 awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd, // ... 95
	 awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,
	 awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd  // ... 127
	};

	const INT16 A_nAtTagDefStatus[C_nStatusSize] =
	// 	0	1	2	3	4	5	6	7	8	9  10  11  12  13  14  15
	{faw,err,err,err,err,err,err,err,err,faw,faw,faw,faw,faw,err,err,
	 err,err,err,err,err,err,err,err,err,err,faw,err,err,err,err,err, // ... 31
	 faw,awd,awd,awd,awd,awd,awd,awd,awd,awd,faw,awd,awd,awd,awd,awd,
	 awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,faw,awd,faw,awd,awd,awd, // ... 63
	 awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,
	 awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd, // ... 95
	 awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,
	 awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd  // ... 127
	};

	const INT16 A_nHtmlDefStatus[C_nStatusSize] =
	// 	0	1	2	3	4	5	6	7	8	9  10  11  12  13  14  15
	{ght,err,err,err,err,err,err,err,err,ght,ght,ght,ght,ght,err,err,
	 err,err,err,err,err,err,err,err,err,err,ght,err,err,err,err,err, // ... 31
	 ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,
	 ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght, // ... 63
	 ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,
	 ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght, // ... 95
	 ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,
	 ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght,ght  // ... 127
	};

	const INT16 A_nPunctDefStatus[C_nStatusSize] =
	// 	0	1	2	3	4	5	6	7	8	9  10  11  12  13  14  15
	{err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,
	 err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,err, // 16 ...
	 err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,
	 err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,err, // 48 ...
	 err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,
	 err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,err, // 80 ...
	 err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,
	 err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,err  // 112 ...
	};

	DYN StmArrayStatu2 * dpStatusTop
			= new StmArrayStatu2( C_nStatusSize, A_nTopStatus, 0, true);
	DYN StmArrayStatu2 * dpStatusWhite
			= new StmArrayStatu2( C_nStatusSize, A_nWhitespaceStatus, 0, true);
	DYN StmArrayStatu2 * dpStatusWord
			= new StmArrayStatu2( C_nStatusSize, A_nWordStatus, 0, true);

	DYN StmBoundsStatu2 *  	dpBst_goto_EoHtml
			= new StmBoundsStatu2( *this, *pCx_EoHtml, nF_goto_EoHtml, true );
	DYN StmBoundsStatu2 *  	dpBst_goto_EoXmlConst
			= new StmBoundsStatu2( *this, *pCx_EoXmlConst, nF_goto_EoXmlConst, true );
	DYN StmBoundsStatu2 *  	dpBst_goto_EoXmlLink_BeginTag
			= new StmBoundsStatu2( *this, *pCx_EoXmlLink_BeginTag, nF_goto_EoXmlLink_BeginTag, true );
	DYN StmBoundsStatu2 *  	dpBst_goto_EoXmlLink_EndTag
			= new StmBoundsStatu2( *this, *pCx_EoXmlLink_EndTag, nF_goto_EoXmlLink_EndTag, true );
	DYN StmBoundsStatu2 *  	dpBst_goto_EoXmlFormat_BeginTag
			= new StmBoundsStatu2( *this, *pCx_EoXmlFormat_BeginTag, nF_goto_EoXmlFormat_BeginTag, true );
	DYN StmBoundsStatu2 *  	dpBst_goto_EoXmlFormat_EndTag
			= new StmBoundsStatu2( *this, *pCx_EoXmlFormat_EndTag, nF_goto_EoXmlFormat_EndTag, true );
	DYN StmBoundsStatu2 *  	dpBst_goto_CheckStar
			= new StmBoundsStatu2( *this, *pCx_CheckStar, nF_goto_CheckStar, true );


	DYN StmBoundsStatu2 *  	dpBst_finError
			= new StmBoundsStatu2( *this, TkpContext_Null2_(), nF_fin_Error, true );
	DYN StmBoundsStatu2 *  	dpBst_finIgnore
			= new StmBoundsStatu2( *this, *this, nF_fin_Ignore, true);
	DYN StmBoundsStatu2 *  	dpBst_finEof
			= new StmBoundsStatu2(  *this, TkpContext_Null2_(), nF_fin_Eof, false);
	DYN StmBoundsStatu2 *  	dpBst_finAnyWord
			= new StmBoundsStatu2( *this, *this, nF_fin_AnyWord, true);
	DYN StmBoundsStatu2 *  	dpBst_finAtTag
			= new StmBoundsStatu2( *this, *this, nF_fin_AtTag, false);
	DYN StmBoundsStatu2 *  	dpBst_finEndSign
			= new StmBoundsStatu2( *this, *pParentContext, nF_fin_EndSign, false);
	DYN StmBoundsStatu2 *  	dpBst_fin_Comma
			= new StmBoundsStatu2( *this, *this, nF_fin_Comma, false );
	DYN StmBoundsStatu2 *  	dpBst_finWhite
			= new StmBoundsStatu2( *this, *this, nF_fin_White, false);


	// dpMain aufbauen:
	aStateMachine.AddStatus(dpStatusTop);
	aStateMachine.AddStatus(dpStatusWhite);
	aStateMachine.AddStatus(dpStatusWord);

	aStateMachine.AddStatus(dpBst_goto_EoHtml);
	aStateMachine.AddStatus(dpBst_goto_EoXmlConst);
	aStateMachine.AddStatus(dpBst_goto_EoXmlLink_BeginTag);
	aStateMachine.AddStatus(dpBst_goto_EoXmlLink_EndTag);
	aStateMachine.AddStatus(dpBst_goto_EoXmlFormat_BeginTag);
	aStateMachine.AddStatus(dpBst_goto_EoXmlFormat_EndTag);
	aStateMachine.AddStatus(dpBst_goto_CheckStar);

	aStateMachine.AddStatus(dpBst_finError);
	aStateMachine.AddStatus(dpBst_finIgnore);
	aStateMachine.AddStatus(dpBst_finEof);
	aStateMachine.AddStatus(dpBst_finAnyWord);
	aStateMachine.AddStatus(dpBst_finAtTag);
	aStateMachine.AddStatus(dpBst_finEndSign);
	aStateMachine.AddStatus(dpBst_fin_Comma);
	aStateMachine.AddStatus(dpBst_finWhite);


	aStateMachine.AddToken( "@author",	nTok_at_author,		 A_nAtTagDefStatus,	finAtTag );
	aStateMachine.AddToken( "@param",   nTok_at_param,       A_nAtTagDefStatus, finAtTag );
	aStateMachine.AddToken( "@throws",  nTok_at_throws,      A_nAtTagDefStatus, finAtTag );
	aStateMachine.AddToken( "@see",     nTok_at_see,         A_nAtTagDefStatus, finAtTag );
	aStateMachine.AddToken( "@since",   nTok_at_since,       A_nAtTagDefStatus, finAtTag );
	aStateMachine.AddToken( "@example", nTok_at_example,     A_nAtTagDefStatus, finAtTag );
	aStateMachine.AddToken( "@return",  nTok_at_return,      A_nAtTagDefStatus, finAtTag );
	aStateMachine.AddToken( "@returns", nTok_at_return,      A_nAtTagDefStatus, finAtTag );
	aStateMachine.AddToken( "@deprecated",
										nTok_at_deprecated,  A_nAtTagDefStatus, finAtTag );
	aStateMachine.AddToken( "@suspicious",
										nTok_at_suspicious,  A_nAtTagDefStatus, finAtTag );
	aStateMachine.AddToken( "@missing", nTok_at_missing,     A_nAtTagDefStatus, finAtTag );
	aStateMachine.AddToken( "@incomplete",
										nTok_at_incomplete,  A_nAtTagDefStatus, finAtTag );
	aStateMachine.AddToken( "@version", nTok_at_version,     A_nAtTagDefStatus, finAtTag );
	aStateMachine.AddToken( "@guarantees",
										nTok_at_guarantees,  A_nAtTagDefStatus, finAtTag );
	aStateMachine.AddToken( "@exception",
										nTok_at_exception,   A_nAtTagDefStatus, finAtTag );

	aStateMachine.AddToken( "<",        0,                   A_nHtmlDefStatus,  goto_EoHtml );
	aStateMachine.AddToken( "*",        0,                   A_nPunctDefStatus, goto_CheckStar );
//	aStateMachine.AddToken( ",",        0,                   A_nPunctDefStatus, finComma );

	aStateMachine.AddToken( "<type",    nTok_link_typeB,     A_nHtmlDefStatus,  goto_EoXmlLink_BeginTag );
	aStateMachine.AddToken( "</type",   nTok_link_typeE,     A_nHtmlDefStatus,  goto_EoXmlLink_EndTag );
	aStateMachine.AddToken( "<member",  nTok_link_memberB,   A_nHtmlDefStatus,  goto_EoXmlLink_BeginTag );
	aStateMachine.AddToken( "</member", nTok_link_membeE,    A_nHtmlDefStatus,  goto_EoXmlLink_EndTag );
	aStateMachine.AddToken( "<const",   nTok_link_constB,    A_nHtmlDefStatus,  goto_EoXmlLink_BeginTag );
	aStateMachine.AddToken( "</const",  nTok_link_constE,    A_nHtmlDefStatus,	goto_EoXmlLink_EndTag );

	aStateMachine.AddToken( "<listing", nTok_format_listingB,A_nHtmlDefStatus,	goto_EoXmlFormat_BeginTag );
	aStateMachine.AddToken( "</listing",nTok_format_listingE,A_nHtmlDefStatus,  goto_EoXmlFormat_EndTag );
	aStateMachine.AddToken( "<code",   	nTok_format_codeB,	 A_nHtmlDefStatus,  goto_EoXmlFormat_BeginTag  );
	aStateMachine.AddToken( "</code",   nTok_format_codeE,   A_nHtmlDefStatus,  goto_EoXmlFormat_EndTag );
	aStateMachine.AddToken( "<atom",   	nTok_format_atomB,	 A_nHtmlDefStatus,  goto_EoXmlFormat_BeginTag  );
	aStateMachine.AddToken( "</atom",   nTok_format_atomE,   A_nHtmlDefStatus,  goto_EoXmlFormat_EndTag );

	aStateMachine.AddToken( "<TRUE/",   nTok_const_TRUE,	 A_nHtmlDefStatus,	goto_EoXmlConst );
	aStateMachine.AddToken( "<true/",   nTok_const_TRUE,	 A_nHtmlDefStatus,	goto_EoXmlConst );
	aStateMachine.AddToken( "<FALSE/",  nTok_const_FALSE,    A_nHtmlDefStatus,	goto_EoXmlConst );
	aStateMachine.AddToken( "<false/",  nTok_const_FALSE,    A_nHtmlDefStatus,	goto_EoXmlConst );
	aStateMachine.AddToken( "<NULL/",   nTok_const_NULL,     A_nHtmlDefStatus,  goto_EoXmlConst );
	aStateMachine.AddToken( "<void/",   nTok_const_void,     A_nHtmlDefStatus,  goto_EoXmlConst );

	aStateMachine.AddToken( "<p",       nTok_html_parastart, A_nHtmlDefStatus,	goto_EoHtml );
	aStateMachine.AddToken( "<pre",     nTok_html_parastart, A_nHtmlDefStatus,	goto_EoHtml );
	aStateMachine.AddToken( "<dl",      nTok_html_parastart, A_nHtmlDefStatus,  goto_EoHtml );
	aStateMachine.AddToken( "<ul",      nTok_html_parastart, A_nHtmlDefStatus,  goto_EoHtml );
	aStateMachine.AddToken( "<ol",      nTok_html_parastart, A_nHtmlDefStatus,  goto_EoHtml );
	aStateMachine.AddToken( "<table",   nTok_html_parastart, A_nHtmlDefStatus,  goto_EoHtml );
	aStateMachine.AddToken( "<P",       nTok_html_parastart, A_nHtmlDefStatus,  goto_EoHtml );
	aStateMachine.AddToken( "<PRE",     nTok_html_parastart, A_nHtmlDefStatus,  goto_EoHtml );
	aStateMachine.AddToken( "<DL",      nTok_html_parastart, A_nHtmlDefStatus,  goto_EoHtml );
	aStateMachine.AddToken( "<UL",      nTok_html_parastart, A_nHtmlDefStatus,  goto_EoHtml );
	aStateMachine.AddToken( "<OL",      nTok_html_parastart, A_nHtmlDefStatus,  goto_EoHtml );
	aStateMachine.AddToken( "<TABLE",   nTok_html_parastart, A_nHtmlDefStatus,  goto_EoHtml );

	aStateMachine.AddToken( "\r\n",	    nTok_EOL,            A_nPunctDefStatus,	finEndSign );
	aStateMachine.AddToken( "\n",       nTok_EOL,            A_nPunctDefStatus,	finEndSign );
	aStateMachine.AddToken( "\r",       nTok_EOL,            A_nPunctDefStatus,	finEndSign );
};

void
Context_Docu::SetMode_IsMultiLine( bool	i_bTrue )
{
	bIsMultiline = i_bTrue;
}


}   // namespace dsapi
}   // namespace csi

