/**************************************************************
 *
 * 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
