xref: /trunk/main/autodoc/source/parser/adoc/cx_a_std.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #include <precomp.h>
29 #include <adoc/cx_a_std.hxx>
30 
31 
32 // NOT FULLY DEFINED SERVICES
33 #include <adoc/cx_a_sub.hxx>
34 #include <x_parse.hxx>
35 #include <tools/tkpchars.hxx>
36 #include <adoc/tk_attag.hxx>
37 #include <adoc/tk_docw.hxx>
38 #include <tokens/tokdeal.hxx>
39 
40 
41 
42 namespace adoc {
43 
44 
45 const intt C_nStatusSize = 128;
46 const intt C_nCppInitialNrOfStati = 400;
47 
48 
49 const uintt nF_fin_Error = 1;
50 const uintt nF_fin_Ignore = 2;
51 const uintt nF_fin_LineStart = 3;
52 const uintt nF_fin_Eol = 4;
53 const uintt nF_fin_Eof = 5;
54 const uintt nF_fin_AnyWord = 6;
55 const uintt nF_fin_Whitespace = 7;
56 
57 const uintt nF_goto_AtTag = 20;
58 const uintt nF_goto_CheckStar = 21;
59 
60 DYN TextToken * TCF_DocWord(const char * text) { return new Tok_DocWord(text); }
61 
62 DYN TextToken * TCF_atstd_ATT(const char * ) { return new Tok_at_std(ary::info::atid_ATT); }
63 DYN TextToken * TCF_atstd_author(const char * ) { return new Tok_at_std(ary::info::atid_author); }
64 DYN TextToken * TCF_atstd_change(const char * ) { return new Tok_at_std(ary::info::atid_change); }
65 DYN TextToken * TCF_atstd_collab(const char * ) { return new Tok_at_std(ary::info::atid_collab); }
66 DYN TextToken * TCF_atstd_contact(const char * ) { return new Tok_at_std(ary::info::atid_contact); }
67 DYN TextToken * TCF_atstd_copyright(const char * ) { return new Tok_at_std(ary::info::atid_copyright); }
68 DYN TextToken * TCF_atstd_descr(const char * ) { return new Tok_at_std(ary::info::atid_descr); }
69 DYN TextToken * TCF_atstd_docdate(const char * ) { return new Tok_at_std(ary::info::atid_docdate); }
70 DYN TextToken * TCF_atstd_derive(const char * ) { return new Tok_at_std(ary::info::atid_derive); }
71 DYN TextToken * TCF_atstd_instance(const char * ) { return new Tok_at_std(ary::info::atid_instance); }
72 DYN TextToken * TCF_atstd_life(const char * ) { return new Tok_at_std(ary::info::atid_life); }
73 DYN TextToken * TCF_atstd_multi(const char * ) { return new Tok_at_std(ary::info::atid_multi); }
74 DYN TextToken * TCF_atstd_onerror(const char * ) { return new Tok_at_std(ary::info::atid_onerror); }
75 DYN TextToken * TCF_atstd_persist(const char * ) { return new Tok_at_std(ary::info::atid_persist); }
76 DYN TextToken * TCF_atstd_postcond(const char * ) { return new Tok_at_std(ary::info::atid_postcond); }
77 DYN TextToken * TCF_atstd_precond(const char * ) { return new Tok_at_std(ary::info::atid_precond); }
78 DYN TextToken * TCF_atstd_responsibility(const char * ) { return new Tok_at_std(ary::info::atid_resp); }
79 DYN TextToken * TCF_atstd_return(const char * ) { return new Tok_at_std(ary::info::atid_return); }
80 DYN TextToken * TCF_atstd_short(const char * ) { return new Tok_at_std(ary::info::atid_short); }
81 DYN TextToken * TCF_atstd_todo(const char * ) { return new Tok_at_std(ary::info::atid_todo); }
82 DYN TextToken * TCF_atstd_version(const char * ) { return new Tok_at_std(ary::info::atid_version); }
83 
84 DYN TextToken * TCF_at_base(const char *) { return new Tok_at_base; }
85 DYN TextToken * TCF_at_exception(const char *) { return new Tok_at_exception; }
86 DYN TextToken * TCF_at_impl(const char *) { return new Tok_at_impl; }
87 DYN TextToken * TCF_at_interface(const char *) { return new Tok_at_interface; }
88 DYN TextToken * TCF_at_key(const char *) { return new Tok_at_key; }
89 DYN TextToken * TCF_at_param(const char *) { return new Tok_at_param; }
90 DYN TextToken * TCF_at_see(const char *) { return new Tok_at_see; }
91 DYN TextToken * TCF_at_template(const char *) { return new Tok_at_template; }
92 DYN TextToken * TCF_at_internal(const char *) { return new Tok_at_internal; }
93 DYN TextToken * TCF_at_obsolete(const char *) { return new Tok_at_obsolete; }
94 DYN TextToken * TCF_at_module(const char *) { return new Tok_at_module; }
95 DYN TextToken * TCF_at_file(const char *) { return new Tok_at_file; }
96 DYN TextToken * TCF_at_gloss(const char *) { return new Tok_at_gloss; }
97 DYN TextToken * TCF_at_global(const char *) { return new Tok_at_global; }
98 DYN TextToken * TCF_at_include(const char *) { return new Tok_at_include; }
99 DYN TextToken * TCF_at_label(const char *) { return new Tok_at_label; }
100 DYN TextToken * TCF_at_since(const char *) { return new Tok_at_since; }
101 DYN TextToken * TCF_at_HTML(const char *) { return new Tok_at_HTML; }
102 DYN TextToken * TCF_at_NOHTML(const char *) { return new Tok_at_NOHTML; }
103 DYN TextToken * TCF_Whitespace(const char * i_sText);
104 DYN TextToken * TCF_EoDocu(const char *) { return new Tok_EoDocu; }
105 DYN TextToken * TCF_EoLine(const char *) { return new Tok_Eol; }
106 DYN TextToken * TCF_Eof(const char *) { return new Tok_Eof; }
107 
108 
109 
110 
111 Context_AdocStd::Context_AdocStd()
112     :   aStateMachine(C_nStatusSize, C_nCppInitialNrOfStati),
113         pDealer(0),
114         pParentContext(0),
115         pFollowUpContext(0),
116         pCx_LineStart(0),
117         pCx_CheckStar(0),
118         pCx_AtTagCompletion(0),
119         pNewToken(0),
120         bIsMultiline(false)
121 {
122     pCx_LineStart = new Cx_LineStart(*this);
123     pCx_CheckStar = new Cx_CheckStar(*this);
124     pCx_AtTagCompletion = new Cx_AtTagCompletion(*this);
125 
126     SetupStateMachine();
127 }
128 
129 void
130 Context_AdocStd::SetParentContext( TkpContext & io_rParentContext,
131                                    const char * )
132 {
133     pFollowUpContext = pParentContext = &io_rParentContext;
134     pCx_CheckStar->Set_End_FollowUpContext(io_rParentContext);
135 }
136 
137 Context_AdocStd::~Context_AdocStd()
138 {
139 }
140 
141 void
142 Context_AdocStd::AssignDealer( TokenDealer & o_rDealer )
143 {
144     pDealer = &o_rDealer;
145     pCx_LineStart->AssignDealer(o_rDealer);
146     pCx_CheckStar->AssignDealer(o_rDealer);
147     pCx_AtTagCompletion->AssignDealer(o_rDealer);
148 }
149 
150 void
151 Context_AdocStd::ReadCharChain( CharacterSource & io_rText )
152 {
153     csv_assert(pParentContext != 0);
154     pNewToken = 0;
155 
156     TextToken::F_CRTOK  fTokenCreateFunction = 0;
157     StmBoundsStatus & rBound = aStateMachine.GetCharChain(fTokenCreateFunction, io_rText);
158 
159     // !!!
160     //   The order of the next two lines is essential, because
161     //   pFollowUpContext may be changed by PerformStatusFunction() also,
162     //   which then MUST override the previous assignment.
163     pFollowUpContext = rBound.FollowUpContext();
164     PerformStatusFunction(rBound.StatusFunctionNr(), fTokenCreateFunction, io_rText);
165 }
166 
167 bool
168 Context_AdocStd::PassNewToken()
169 {
170     if (pNewToken)
171     {
172         pNewToken.Release()->DealOut(*pDealer);
173         return true;
174     }
175     return false;
176 }
177 
178 TkpContext &
179 Context_AdocStd::FollowUpContext()
180 {
181     csv_assert(pFollowUpContext != 0);
182     return *pFollowUpContext;
183 }
184 
185 void
186 Context_AdocStd::PerformStatusFunction( uintt               i_nStatusSignal,
187                                         F_CRTOK             i_fTokenCreateFunction,
188                                         CharacterSource &   io_rText )
189 {
190     switch (i_nStatusSignal)
191     {
192         case nF_fin_Error:
193         {
194             char cCC = io_rText.CurChar();
195             String sChar( &cCC, 1 );
196             throw X_Parser(X_Parser::x_InvalidChar, sChar, String ::Null_(), 0);
197         }   // no break, because of throw
198         case nF_fin_Ignore:
199             io_rText.CutToken();
200             pNewToken = 0;
201             break;
202         case nF_fin_LineStart:
203             csv_assert(i_fTokenCreateFunction != 0);
204             pNewToken = (*i_fTokenCreateFunction)(io_rText.CutToken());
205             break;
206         case nF_fin_Eol:
207             io_rText.CutToken();
208             pDealer->Deal_Eol();
209             if ( bIsMultiline )
210             {
211                 pNewToken = TCF_EoLine(0);
212                 pFollowUpContext = pCx_LineStart.Ptr();
213             }
214             else
215             {
216                 pNewToken = TCF_EoDocu(0);
217                 pFollowUpContext = pParentContext;
218             }
219             break;
220         case nF_fin_Eof:
221             pNewToken = TCF_Eof(0);
222             break;
223         case nF_fin_AnyWord:
224             if (i_fTokenCreateFunction != 0)
225                 pNewToken = (*i_fTokenCreateFunction)(io_rText.CutToken());
226             else
227                 pNewToken = TCF_DocWord(io_rText.CutToken());
228             break;
229         case nF_fin_Whitespace:
230             pNewToken = TCF_Whitespace(io_rText.CutToken());
231             break;
232         case nF_goto_AtTag:
233             pNewToken = 0;
234             pCx_AtTagCompletion->SetCurToken(i_fTokenCreateFunction);
235             break;
236         case nF_goto_CheckStar:
237             pNewToken = 0;
238             pCx_CheckStar->SetCanBeEnd( bIsMultiline );
239             break;
240         default:
241         {
242             char cCC = io_rText.CurChar();
243             String  sChar( &cCC, 1 );
244             throw X_Parser(X_Parser::x_InvalidChar, sChar, String::Null_(), 0);
245         }
246     }   // end switch (i_nStatusSignal)
247 }
248 
249 void
250 Context_AdocStd::SetupStateMachine()
251 {
252     // Besondere Array-Stati (kein Tokenabschluss oder Kontextwechsel):
253 //  const INT16 bas = 0;        // Base-Status
254     const INT16 wht = 1;        // Whitespace-Status
255     const INT16 awd = 2;        // Any-Word-Read-Status
256 
257     // Kontextwechsel-Stati:
258     const INT16 goto_CheckStar = 3;
259     const INT16 goto_AtTag = 4;
260 
261     // Tokenfinish-Stati:
262     const INT16 finError = 5;
263 //  const INT16 finIgnore = 6;
264     const INT16 finEol = 7;
265     const INT16 finEof = 8;
266     const INT16 finAnyWord = 9;
267     const INT16 finWhitespace = 10;
268 
269     // Konstanten zur Benutzung in der Tabelle:
270     const INT16 fof = finEof;
271     const INT16 err = finError;
272     const INT16 faw = finAnyWord;
273 //  const INT16 fig = finIgnore;
274     const INT16 fwh = finWhitespace;
275 
276     /// The '0's  will be replaced by calls of AddToken().
277 
278     const INT16 A_nTopStatus[C_nStatusSize] =
279     //  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
280     {fof,err,err,err,err,err,err,err,err,wht,  0,wht,wht,  0,err,err,
281      err,err,err,err,err,err,err,err,err,err,fof,err,err,err,err,err, // ... 31
282      wht,awd,awd,awd,awd,awd,awd,awd,awd,awd,  0,awd,awd,awd,awd,awd,
283      awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd, // ... 63
284        0,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,
285      awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd, // ... 95
286      awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,
287      awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd  // ... 127
288     };
289 
290     const INT16 A_nWhitespaceStatus[C_nStatusSize] =
291     //  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
292     {fof,err,err,err,err,err,err,err,err,wht,fwh,wht,wht,fwh,err,err,
293      err,err,err,err,err,err,err,err,err,err,fof,err,err,err,err,err, // ... 31
294      wht,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,
295      fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh, // ... 63
296      fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,
297      fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh, // ... 95
298      fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,
299      fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh,fwh  // ... 127
300     };
301 
302     const INT16 A_nWordStatus[C_nStatusSize] =
303     //  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
304     {faw,err,err,err,err,err,err,err,err,faw,faw,faw,faw,faw,err,err,
305      err,err,err,err,err,err,err,err,err,err,faw,err,err,err,err,err, // ... 31
306      faw,awd,awd,awd,awd,awd,awd,awd,awd,awd,faw,awd,awd,awd,awd,awd,
307      awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd, // ... 63
308      awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,
309      awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd, // ... 95
310      awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,
311      awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd  // ... 127
312     };
313 
314     const INT16 A_nAtTagDefStatus[C_nStatusSize] =
315     //  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
316     {faw,err,err,err,err,err,err,err,err,faw,faw,faw,faw,faw,err,err,
317      err,err,err,err,err,err,err,err,err,err,faw,err,err,err,err,err, // ... 31
318      faw,awd,awd,awd,awd,awd,awd,awd,awd,awd,faw,awd,awd,awd,awd,awd,
319      awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd, // ... 63
320      awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,
321      awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd, // ... 95
322      awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,
323      awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd,awd  // ... 127
324     };
325 
326     const INT16 A_nPunctDefStatus[C_nStatusSize] =
327     //  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
328     {err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,
329      err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,err, // 16 ...
330      err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,
331      err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,err, // 48 ...
332      err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,
333      err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,err, // 80 ...
334      err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,
335      err,err,err,err,err,err,err,err,err,err,err,err,err,err,err,err  // 112 ...
336     };
337 
338     DYN StmArrayStatus * dpStatusTop
339             = new StmArrayStatus( C_nStatusSize, A_nTopStatus, 0, true);
340     DYN StmArrayStatus * dpStatusWhite
341             = new StmArrayStatus( C_nStatusSize, A_nWhitespaceStatus, 0, true);
342     DYN StmArrayStatus * dpStatusWord
343             = new StmArrayStatus( C_nStatusSize, A_nWordStatus, TCF_DocWord, true);
344 
345     DYN StmBoundsStatus *   dpBst_goto_CheckStar
346             = new StmBoundsStatus( *this, *pCx_CheckStar, nF_goto_CheckStar, true );
347     DYN StmBoundsStatus *   dpBst_goto_AtTag
348             = new StmBoundsStatus( *this, *pCx_AtTagCompletion, nF_goto_AtTag, true );
349 
350     DYN StmBoundsStatus *   dpBst_finError
351             = new StmBoundsStatus( *this, TkpContext::Null_(), nF_fin_Error, true );
352     DYN StmBoundsStatus *   dpBst_finIgnore
353             = new StmBoundsStatus( *this, *this, nF_fin_Ignore, true);
354     DYN StmBoundsStatus *   dpBst_finEol
355             = new StmBoundsStatus( *this, *pCx_LineStart, nF_fin_Eol, false);
356     DYN StmBoundsStatus *   dpBst_finEof
357             = new StmBoundsStatus(  *this, TkpContext::Null_(), nF_fin_Eof, false);
358     DYN StmBoundsStatus *   dpBst_finAnyWord
359             = new StmBoundsStatus( *this, *this, nF_fin_AnyWord, true);
360     DYN StmBoundsStatus *   dpBst_finWhitespace
361             = new StmBoundsStatus( *this, *this, nF_fin_Whitespace, true);
362 
363     // dpMain aufbauen:
364     aStateMachine.AddStatus(dpStatusTop);
365     aStateMachine.AddStatus(dpStatusWhite);
366     aStateMachine.AddStatus(dpStatusWord);
367 
368     aStateMachine.AddStatus(dpBst_goto_CheckStar);
369     aStateMachine.AddStatus(dpBst_goto_AtTag);
370 
371     aStateMachine.AddStatus(dpBst_finError);
372     aStateMachine.AddStatus(dpBst_finIgnore);
373     aStateMachine.AddStatus(dpBst_finEol);
374     aStateMachine.AddStatus(dpBst_finEof);
375     aStateMachine.AddStatus(dpBst_finAnyWord);
376     aStateMachine.AddStatus(dpBst_finWhitespace);
377 
378     aStateMachine.AddToken( "*",        0,                  A_nPunctDefStatus, goto_CheckStar );
379     aStateMachine.AddToken( "@ATT",     TCF_atstd_ATT,      A_nAtTagDefStatus, goto_AtTag );
380     aStateMachine.AddToken( "@att",     TCF_atstd_ATT,      A_nAtTagDefStatus, goto_AtTag );
381     aStateMachine.AddToken( "@ATTENTION",
382                                         TCF_atstd_ATT,      A_nAtTagDefStatus, goto_AtTag );
383     aStateMachine.AddToken( "@attention",
384                                         TCF_atstd_ATT,      A_nAtTagDefStatus, goto_AtTag );
385     aStateMachine.AddToken( "@author",  TCF_atstd_author,   A_nAtTagDefStatus, goto_AtTag );
386     aStateMachine.AddToken( "@change",  TCF_atstd_change,   A_nAtTagDefStatus, goto_AtTag );
387     aStateMachine.AddToken( "@collab",  TCF_atstd_collab,   A_nAtTagDefStatus, goto_AtTag );
388     aStateMachine.AddToken( "@collaborator",
389                                         TCF_atstd_collab,   A_nAtTagDefStatus, goto_AtTag );
390     aStateMachine.AddToken( "@contact", TCF_atstd_contact,  A_nAtTagDefStatus, goto_AtTag );
391     aStateMachine.AddToken( "@copyright",TCF_atstd_copyright, A_nAtTagDefStatus, goto_AtTag );
392     aStateMachine.AddToken( "@descr",   TCF_atstd_descr,    A_nAtTagDefStatus, goto_AtTag );
393     aStateMachine.AddToken( "@docdate", TCF_atstd_docdate,  A_nAtTagDefStatus, goto_AtTag );
394     aStateMachine.AddToken( "@derive",  TCF_atstd_derive,   A_nAtTagDefStatus, goto_AtTag );
395     aStateMachine.AddToken( "@instance",TCF_atstd_instance, A_nAtTagDefStatus, goto_AtTag );
396     aStateMachine.AddToken( "@life",    TCF_atstd_life,     A_nAtTagDefStatus, goto_AtTag );
397     aStateMachine.AddToken( "@lifecycle",
398                                         TCF_atstd_life,     A_nAtTagDefStatus, goto_AtTag );
399     aStateMachine.AddToken( "@multi",   TCF_atstd_multi,    A_nAtTagDefStatus, goto_AtTag );
400     aStateMachine.AddToken( "@multiplicity",
401                                         TCF_atstd_multi,    A_nAtTagDefStatus, goto_AtTag );
402     aStateMachine.AddToken( "@onerror", TCF_atstd_onerror,  A_nAtTagDefStatus, goto_AtTag );
403     aStateMachine.AddToken( "@persist", TCF_atstd_persist,  A_nAtTagDefStatus, goto_AtTag );
404     aStateMachine.AddToken( "@postcond",TCF_atstd_postcond,A_nAtTagDefStatus, goto_AtTag );
405     aStateMachine.AddToken( "@precond", TCF_atstd_precond,  A_nAtTagDefStatus, goto_AtTag );
406     aStateMachine.AddToken( "@resp",    TCF_atstd_responsibility,
407                                                             A_nAtTagDefStatus, goto_AtTag );
408     aStateMachine.AddToken( "@responsibility",
409                                         TCF_atstd_return,   A_nAtTagDefStatus, goto_AtTag );
410     aStateMachine.AddToken( "@return",  TCF_atstd_return,   A_nAtTagDefStatus, goto_AtTag );
411     aStateMachine.AddToken( "@short",   TCF_atstd_short,    A_nAtTagDefStatus, goto_AtTag );
412     aStateMachine.AddToken( "@todo",    TCF_atstd_todo,     A_nAtTagDefStatus, goto_AtTag );
413     aStateMachine.AddToken( "@version", TCF_atstd_version,  A_nAtTagDefStatus, goto_AtTag );
414 
415     aStateMachine.AddToken( "@base",    TCF_at_base,        A_nAtTagDefStatus, goto_AtTag );
416     aStateMachine.AddToken( "@exception",TCF_at_exception,  A_nAtTagDefStatus, goto_AtTag );
417     aStateMachine.AddToken( "@impl",    TCF_at_impl,        A_nAtTagDefStatus, goto_AtTag );
418     aStateMachine.AddToken( "@key",     TCF_at_key,         A_nAtTagDefStatus, goto_AtTag );
419     aStateMachine.AddToken( "@param",   TCF_at_param,       A_nAtTagDefStatus, goto_AtTag );
420     aStateMachine.AddToken( "@see",     TCF_at_see,         A_nAtTagDefStatus, goto_AtTag );
421     aStateMachine.AddToken( "@seealso", TCF_at_see,         A_nAtTagDefStatus, goto_AtTag );
422     aStateMachine.AddToken( "@since",   TCF_at_since,       A_nAtTagDefStatus, goto_AtTag );
423     aStateMachine.AddToken( "@tpl",     TCF_at_template,    A_nAtTagDefStatus, goto_AtTag );
424     aStateMachine.AddToken( "@tplparam",
425                                         TCF_at_template,    A_nAtTagDefStatus, goto_AtTag );
426 
427     aStateMachine.AddToken( "@interface",TCF_at_interface,  A_nAtTagDefStatus, goto_AtTag );
428     aStateMachine.AddToken( "@internal",TCF_at_internal,    A_nAtTagDefStatus, goto_AtTag );
429     aStateMachine.AddToken( "@obsolete",TCF_at_obsolete,    A_nAtTagDefStatus, goto_AtTag );
430     aStateMachine.AddToken( "@deprecated",TCF_at_obsolete,  A_nAtTagDefStatus, goto_AtTag );
431 
432     aStateMachine.AddToken( "@module",  TCF_at_module,      A_nAtTagDefStatus, goto_AtTag );
433     aStateMachine.AddToken( "@file",    TCF_at_file,        A_nAtTagDefStatus, goto_AtTag );
434     aStateMachine.AddToken( "@gloss",   TCF_at_gloss,       A_nAtTagDefStatus, goto_AtTag );
435     aStateMachine.AddToken( "@global#", TCF_at_global,      A_nAtTagDefStatus, goto_AtTag );
436     aStateMachine.AddToken( "@include#",TCF_at_include,     A_nAtTagDefStatus, goto_AtTag );
437     aStateMachine.AddToken( "@#",       TCF_at_label,       A_nAtTagDefStatus, goto_AtTag );
438 
439     aStateMachine.AddToken( "@HTML",    TCF_at_HTML,        A_nAtTagDefStatus, goto_AtTag );
440     aStateMachine.AddToken( "@NOHTML",  TCF_at_NOHTML,      A_nAtTagDefStatus, goto_AtTag );
441 
442     aStateMachine.AddToken( "\r\n",     0,                  A_nPunctDefStatus, finEol );
443     aStateMachine.AddToken( "\n",       0,                  A_nPunctDefStatus, finEol );
444     aStateMachine.AddToken( "\r",       0,                  A_nPunctDefStatus, finEol );
445 };
446 
447 void
448 Context_AdocStd::SetMode_IsMultiLine( bool  i_bTrue )
449 {
450     bIsMultiline = i_bTrue;
451 }
452 
453 DYN TextToken *
454 TCF_Whitespace(const char * i_sText)
455 {
456     UINT8 nSize = static_cast<UINT8>(strlen(i_sText));
457     for ( const char * pTab = strchr(i_sText,'\t');
458           pTab != 0;
459           pTab = strchr(pTab+1,'\t') )
460     {
461         nSize += 3;
462     }
463 
464     return new Tok_Whitespace(nSize);
465 }
466 
467 
468 }   // namespace adoc
469 
470 
471 /*
472 @ATT[ENTION]
473 @author
474 @change[s]
475 @collab[orators]
476 @contact
477 @copyright
478 @descr
479 @devstat[e]
480 @docdate
481 @derive
482 @instance
483 @life[cycle]
484 @multi[plicity]
485 @onerror
486 @persist[ence]
487 @postcond
488 @precond
489 @return
490 @short
491 @todo
492 
493 @module
494 @file
495 @gloss[ary]
496 
497 
498 @base <BasisklassenName>
499 @exception <ExceptionName>
500 @impl[ements] <IDL-Construct>
501 @key[words]|[s]
502 @param <FunctionParameterName> [<Range of valid values>]
503 @see[also]
504 @templ[ate] <FormalTemplateParameterName>
505 
506 @internal
507 @obsolete
508 
509 @#<Label>
510 
511 @global#<Label> Global comment.
512 @include#<Label>
513 
514 
515 */
516 
517