/************************************************************** * * 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 #include // NOT FULLY DEFINED SERVICES #include #include #include #include #include #include #include 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( "