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