178bc99aaSAndrew Rist /**************************************************************
278bc99aaSAndrew Rist  *
378bc99aaSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
478bc99aaSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
578bc99aaSAndrew Rist  * distributed with this work for additional information
678bc99aaSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
778bc99aaSAndrew Rist  * to you under the Apache License, Version 2.0 (the
878bc99aaSAndrew Rist  * "License"); you may not use this file except in compliance
978bc99aaSAndrew Rist  * with the License.  You may obtain a copy of the License at
1078bc99aaSAndrew Rist  *
1178bc99aaSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
1278bc99aaSAndrew Rist  *
1378bc99aaSAndrew Rist  * Unless required by applicable law or agreed to in writing,
1478bc99aaSAndrew Rist  * software distributed under the License is distributed on an
1578bc99aaSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1678bc99aaSAndrew Rist  * KIND, either express or implied.  See the License for the
1778bc99aaSAndrew Rist  * specific language governing permissions and limitations
1878bc99aaSAndrew Rist  * under the License.
1978bc99aaSAndrew Rist  *
2078bc99aaSAndrew Rist  *************************************************************/
21cdf0e10cSrcweir 
22cdf0e10cSrcweir #include <precomp.h>
23cdf0e10cSrcweir #include <s2_dsapi/docu_pe2.hxx>
24cdf0e10cSrcweir 
25cdf0e10cSrcweir 
26cdf0e10cSrcweir // NOT FULLY DEFINED SERVICES
27cdf0e10cSrcweir #include <cctype>
28cdf0e10cSrcweir #include <ary/doc/d_oldidldocu.hxx>
29cdf0e10cSrcweir #include <ary_i/d_token.hxx>
30cdf0e10cSrcweir #include <parser/parserinfo.hxx>
31cdf0e10cSrcweir #include <adc_cl.hxx>
32cdf0e10cSrcweir #include <adc_msg.hxx>
33cdf0e10cSrcweir #include <../parser/inc/x_docu.hxx>
34cdf0e10cSrcweir #include <s2_dsapi/dsapitok.hxx>
35cdf0e10cSrcweir #include <s2_dsapi/tk_atag2.hxx>
36cdf0e10cSrcweir #include <s2_dsapi/tk_html.hxx>
37cdf0e10cSrcweir #include <s2_dsapi/tk_docw2.hxx>
38cdf0e10cSrcweir #include <s2_dsapi/tk_xml.hxx>
39cdf0e10cSrcweir 
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #ifdef UNX
42cdf0e10cSrcweir #define strnicmp strncasecmp
43cdf0e10cSrcweir #endif
44cdf0e10cSrcweir 
45cdf0e10cSrcweir 
46cdf0e10cSrcweir namespace csi
47cdf0e10cSrcweir {
48cdf0e10cSrcweir namespace dsapi
49cdf0e10cSrcweir {
50cdf0e10cSrcweir 
51cdf0e10cSrcweir 
52cdf0e10cSrcweir const char *		AtTagTitle(
53cdf0e10cSrcweir 						const Tok_AtTag & 	i_rToken );
54cdf0e10cSrcweir 
55cdf0e10cSrcweir 
SapiDocu_PE(ParserInfo & io_rPositionInfo)56cdf0e10cSrcweir SapiDocu_PE::SapiDocu_PE(ParserInfo & io_rPositionInfo)
57cdf0e10cSrcweir 	:	pDocu(0),
58cdf0e10cSrcweir 		eState(e_none),
59cdf0e10cSrcweir 		pPositionInfo(&io_rPositionInfo),
60cdf0e10cSrcweir 		fCurTokenAddFunction(&SapiDocu_PE::AddDocuToken2Void),
61cdf0e10cSrcweir 		pCurAtTag(0),
62cdf0e10cSrcweir 		sCurDimAttribute(),
63cdf0e10cSrcweir 		sCurAtSeeType_byXML(200)
64cdf0e10cSrcweir {
65cdf0e10cSrcweir }
66cdf0e10cSrcweir 
~SapiDocu_PE()67cdf0e10cSrcweir SapiDocu_PE::~SapiDocu_PE()
68cdf0e10cSrcweir {
69cdf0e10cSrcweir }
70cdf0e10cSrcweir 
71cdf0e10cSrcweir void
ProcessToken(DYN csi::dsapi::Token & let_drToken)72cdf0e10cSrcweir SapiDocu_PE::ProcessToken( DYN csi::dsapi::Token & let_drToken )
73cdf0e10cSrcweir {
74cdf0e10cSrcweir 	if (IsComplete())
75cdf0e10cSrcweir 	{
76cdf0e10cSrcweir 		pDocu = 0;
77cdf0e10cSrcweir 		eState = e_none;
78cdf0e10cSrcweir 	}
79cdf0e10cSrcweir 
80cdf0e10cSrcweir 	if ( eState == e_none )
81cdf0e10cSrcweir 	{
82cdf0e10cSrcweir 		pDocu = new ary::doc::OldIdlDocu;
83cdf0e10cSrcweir 		eState = st_short;
84cdf0e10cSrcweir 		fCurTokenAddFunction = &SapiDocu_PE::AddDocuToken2Short;
85cdf0e10cSrcweir 	}
86cdf0e10cSrcweir 
87cdf0e10cSrcweir 	csv_assert(pDocu);
88cdf0e10cSrcweir 
89cdf0e10cSrcweir 	let_drToken.Trigger(*this);
90cdf0e10cSrcweir 	delete &let_drToken;
91cdf0e10cSrcweir }
92cdf0e10cSrcweir 
93cdf0e10cSrcweir void
Process_AtTag(const Tok_AtTag & i_rToken)94cdf0e10cSrcweir SapiDocu_PE::Process_AtTag(	const Tok_AtTag & i_rToken )
95cdf0e10cSrcweir {
96cdf0e10cSrcweir 	if (NOT pCurAtTag)
97cdf0e10cSrcweir 	{
98cdf0e10cSrcweir 		eState = st_attags;
99cdf0e10cSrcweir 		fCurTokenAddFunction = &SapiDocu_PE::AddDocuToken2CurAtTag;
100cdf0e10cSrcweir 	}
101cdf0e10cSrcweir 	else
102cdf0e10cSrcweir 	{
103cdf0e10cSrcweir 		csv_assert(eState == st_attags);
104cdf0e10cSrcweir 		pDocu->AddAtTag(*pCurAtTag.Release());
105cdf0e10cSrcweir 	}
106cdf0e10cSrcweir 
107cdf0e10cSrcweir 	if (i_rToken.Id() == Tok_AtTag::param)
108cdf0e10cSrcweir 	{
109cdf0e10cSrcweir 		pCurAtTag = new DT_ParameterAtTag;
110cdf0e10cSrcweir 		fCurTokenAddFunction = &SapiDocu_PE::SetCurParameterAtTagName;
111cdf0e10cSrcweir 	}
112cdf0e10cSrcweir 	else if (i_rToken.Id() == Tok_AtTag::see)
113cdf0e10cSrcweir 	{
114cdf0e10cSrcweir 		pCurAtTag = new DT_SeeAlsoAtTag;
115cdf0e10cSrcweir 		fCurTokenAddFunction = &SapiDocu_PE::SetCurSeeAlsoAtTagLinkText;
116cdf0e10cSrcweir 	}
117cdf0e10cSrcweir 	else if (i_rToken.Id() == Tok_AtTag::deprecated)
118cdf0e10cSrcweir 	{
119cdf0e10cSrcweir     	pDocu->SetDeprecated();
120cdf0e10cSrcweir 		pCurAtTag = new DT_StdAtTag("");    // Dummy that will not be used.
121cdf0e10cSrcweir 		fCurTokenAddFunction = &SapiDocu_PE::AddDocuToken2Deprecated;
122cdf0e10cSrcweir 	}
123cdf0e10cSrcweir 	else if (i_rToken.Id() == Tok_AtTag::since)
124cdf0e10cSrcweir 	{
125cdf0e10cSrcweir 		pCurAtTag = new DT_SinceAtTag;
126cdf0e10cSrcweir 		fCurTokenAddFunction = &SapiDocu_PE::SetCurSinceAtTagVersion_OOo;
127cdf0e10cSrcweir 	}
128cdf0e10cSrcweir 	else
129cdf0e10cSrcweir 	{
130cdf0e10cSrcweir 		pCurAtTag = new DT_StdAtTag( AtTagTitle(i_rToken) );
131cdf0e10cSrcweir 		fCurTokenAddFunction = &SapiDocu_PE::AddDocuToken2CurAtTag;
132cdf0e10cSrcweir 	}
133cdf0e10cSrcweir }
134cdf0e10cSrcweir 
135cdf0e10cSrcweir void
Process_HtmlTag(const Tok_HtmlTag & i_rToken)136cdf0e10cSrcweir SapiDocu_PE::Process_HtmlTag( const Tok_HtmlTag & i_rToken )
137cdf0e10cSrcweir {
138cdf0e10cSrcweir 	if (eState == st_short AND i_rToken.IsParagraphStarter())
139cdf0e10cSrcweir 	{
140cdf0e10cSrcweir 		eState = st_description;
141cdf0e10cSrcweir         fCurTokenAddFunction = &SapiDocu_PE::AddDocuToken2Description;
142cdf0e10cSrcweir 	}
143cdf0e10cSrcweir 
144cdf0e10cSrcweir 	// Workaround special for some errors in API docu:
145cdf0e10cSrcweir 	if ( strnicmp("<true",i_rToken.Text(),5 ) == 0 )
146cdf0e10cSrcweir 	{
147cdf0e10cSrcweir 	    if ( strcmp("<TRUE/>",i_rToken.Text()) != 0 )
148cdf0e10cSrcweir             TheMessages().Out_InvalidConstSymbol( i_rToken.Text(),
149cdf0e10cSrcweir                                               pPositionInfo->CurFile(),
150cdf0e10cSrcweir                                               pPositionInfo->CurLine() );
151cdf0e10cSrcweir 		(this->*fCurTokenAddFunction)( *new DT_TextToken("<b>true</b>") );
152cdf0e10cSrcweir 		return;
153cdf0e10cSrcweir 	}
154cdf0e10cSrcweir 	else if ( strnicmp("<false",i_rToken.Text(),6 ) == 0 )
155cdf0e10cSrcweir 	{
156cdf0e10cSrcweir 	    if ( strcmp("<FALSE/>",i_rToken.Text()) != 0 )
157cdf0e10cSrcweir             TheMessages().Out_InvalidConstSymbol( i_rToken.Text(),
158cdf0e10cSrcweir                                               pPositionInfo->CurFile(),
159cdf0e10cSrcweir                                               pPositionInfo->CurLine() );
160cdf0e10cSrcweir 		(this->*fCurTokenAddFunction)( *new DT_TextToken("<b>false</b>") );
161cdf0e10cSrcweir 		return;
162cdf0e10cSrcweir 	}
163cdf0e10cSrcweir 	else if ( strnicmp("<NULL",i_rToken.Text(),5 ) == 0 )
164cdf0e10cSrcweir 	{
165cdf0e10cSrcweir 	    if ( strcmp("<NULL/>",i_rToken.Text()) != 0 )
166cdf0e10cSrcweir             TheMessages().Out_InvalidConstSymbol( i_rToken.Text(),
167cdf0e10cSrcweir                                               pPositionInfo->CurFile(),
168cdf0e10cSrcweir                                               pPositionInfo->CurLine() );
169cdf0e10cSrcweir 		(this->*fCurTokenAddFunction)( *new DT_TextToken("<b>null</b>") );
170cdf0e10cSrcweir 		return;
171cdf0e10cSrcweir 	}
172cdf0e10cSrcweir 	else if ( strnicmp("<void",i_rToken.Text(),5 ) == 0 )
173cdf0e10cSrcweir 	{
174cdf0e10cSrcweir 	    if ( strcmp("<void/>",i_rToken.Text()) != 0 )
175cdf0e10cSrcweir             TheMessages().Out_InvalidConstSymbol( i_rToken.Text(),
176cdf0e10cSrcweir                                               pPositionInfo->CurFile(),
177cdf0e10cSrcweir                                               pPositionInfo->CurLine() );
178cdf0e10cSrcweir 		(this->*fCurTokenAddFunction)( *new DT_TextToken("<b>void</b>") );
179cdf0e10cSrcweir 		return;
180cdf0e10cSrcweir 	}
181cdf0e10cSrcweir 
182cdf0e10cSrcweir 	(this->*fCurTokenAddFunction)( *new DT_Style(i_rToken.Text(),false) );
183cdf0e10cSrcweir }
184cdf0e10cSrcweir 
185cdf0e10cSrcweir void
Process_XmlConst(const Tok_XmlConst & i_rToken)186cdf0e10cSrcweir SapiDocu_PE::Process_XmlConst( const Tok_XmlConst & i_rToken )
187cdf0e10cSrcweir {
188cdf0e10cSrcweir 	(this->*fCurTokenAddFunction)(*new DT_MupConst(i_rToken.Text()));
189cdf0e10cSrcweir }
190cdf0e10cSrcweir 
191cdf0e10cSrcweir void
Process_XmlLink_BeginTag(const Tok_XmlLink_BeginTag & i_rToken)192cdf0e10cSrcweir SapiDocu_PE::Process_XmlLink_BeginTag( const Tok_XmlLink_BeginTag & i_rToken )
193cdf0e10cSrcweir {
194cdf0e10cSrcweir 	switch (i_rToken.Id())
195cdf0e10cSrcweir 	{
196cdf0e10cSrcweir 		case Tok_XmlLink_Tag::e_const:
197cdf0e10cSrcweir 			(this->*fCurTokenAddFunction)(*new DT_Style("<b>",false));
198cdf0e10cSrcweir 			break;
199cdf0e10cSrcweir 		case Tok_XmlLink_Tag::member:
200cdf0e10cSrcweir 			(this->*fCurTokenAddFunction)(*new DT_MupMember(i_rToken.Scope()));
201cdf0e10cSrcweir 			break;
202cdf0e10cSrcweir 		case Tok_XmlLink_Tag::type:
203cdf0e10cSrcweir 			(this->*fCurTokenAddFunction)(*new DT_MupType(i_rToken.Scope()));
204cdf0e10cSrcweir 			break;
205cdf0e10cSrcweir 		default:
206cdf0e10cSrcweir 		    //  Do nothing.
207cdf0e10cSrcweir 		    ;
208cdf0e10cSrcweir 	}
209cdf0e10cSrcweir 
210cdf0e10cSrcweir     if ( i_rToken.Dim().length() > 0 )
211cdf0e10cSrcweir         sCurDimAttribute = i_rToken.Dim();
212cdf0e10cSrcweir     else
213cdf0e10cSrcweir         sCurDimAttribute.clear();
214cdf0e10cSrcweir }
215cdf0e10cSrcweir 
216cdf0e10cSrcweir void
Process_XmlLink_EndTag(const Tok_XmlLink_EndTag & i_rToken)217cdf0e10cSrcweir SapiDocu_PE::Process_XmlLink_EndTag( const Tok_XmlLink_EndTag & i_rToken )
218cdf0e10cSrcweir {
219cdf0e10cSrcweir 	switch (i_rToken.Id())
220cdf0e10cSrcweir 	{
221cdf0e10cSrcweir 		case Tok_XmlLink_Tag::e_const:
222cdf0e10cSrcweir 			(this->*fCurTokenAddFunction)(*new DT_Style("</b>",false));
223cdf0e10cSrcweir 			break;
224cdf0e10cSrcweir 		case Tok_XmlLink_Tag::member:
225cdf0e10cSrcweir 			(this->*fCurTokenAddFunction)(*new DT_MupMember(true));
226cdf0e10cSrcweir 			break;
227cdf0e10cSrcweir 		case Tok_XmlLink_Tag::type:
228cdf0e10cSrcweir 			(this->*fCurTokenAddFunction)(*new DT_MupType(true));
229cdf0e10cSrcweir 			break;
230cdf0e10cSrcweir 		default:
231cdf0e10cSrcweir 		    //  Do nothing.
232cdf0e10cSrcweir 		    ;
233cdf0e10cSrcweir 	}
234cdf0e10cSrcweir     if ( sCurDimAttribute.length() > 0 )
235cdf0e10cSrcweir     {
236cdf0e10cSrcweir         (this->*fCurTokenAddFunction)( *new DT_TextToken(sCurDimAttribute.c_str()) );
237cdf0e10cSrcweir         sCurDimAttribute.clear();
238cdf0e10cSrcweir     }
239cdf0e10cSrcweir }
240cdf0e10cSrcweir 
241cdf0e10cSrcweir void
Process_XmlFormat_BeginTag(const Tok_XmlFormat_BeginTag & i_rToken)242cdf0e10cSrcweir SapiDocu_PE::Process_XmlFormat_BeginTag( const Tok_XmlFormat_BeginTag & i_rToken )
243cdf0e10cSrcweir {
244cdf0e10cSrcweir 	switch (i_rToken.Id())
245cdf0e10cSrcweir 	{
246cdf0e10cSrcweir 		case Tok_XmlFormat_Tag::code:
247cdf0e10cSrcweir 			(this->*fCurTokenAddFunction)(*new DT_Style("<code>",false));
248cdf0e10cSrcweir 			break;
249cdf0e10cSrcweir 		case Tok_XmlFormat_Tag::listing:
250cdf0e10cSrcweir 			(this->*fCurTokenAddFunction)(*new DT_Style("<pre>",true));
251cdf0e10cSrcweir 			break;
252cdf0e10cSrcweir 		case Tok_XmlFormat_Tag::atom:
253cdf0e10cSrcweir 			(this->*fCurTokenAddFunction)(*new DT_Style("<code>",true));
254cdf0e10cSrcweir 			break;
255cdf0e10cSrcweir 		default:
256cdf0e10cSrcweir 		    //  Do nothing.
257cdf0e10cSrcweir 		    ;
258cdf0e10cSrcweir 	}
259cdf0e10cSrcweir     if ( i_rToken.Dim().length() > 0 )
260cdf0e10cSrcweir         sCurDimAttribute = i_rToken.Dim();
261cdf0e10cSrcweir     else
262cdf0e10cSrcweir         sCurDimAttribute.clear();
263cdf0e10cSrcweir }
264cdf0e10cSrcweir 
265cdf0e10cSrcweir void
Process_XmlFormat_EndTag(const Tok_XmlFormat_EndTag & i_rToken)266cdf0e10cSrcweir SapiDocu_PE::Process_XmlFormat_EndTag( const Tok_XmlFormat_EndTag & i_rToken )
267cdf0e10cSrcweir {
268cdf0e10cSrcweir 	switch (i_rToken.Id())
269cdf0e10cSrcweir 	{
270cdf0e10cSrcweir 		case Tok_XmlFormat_Tag::code:
271cdf0e10cSrcweir 			(this->*fCurTokenAddFunction)(*new DT_Style("</code>",false));
272cdf0e10cSrcweir 			break;
273cdf0e10cSrcweir 		case Tok_XmlFormat_Tag::listing:
274cdf0e10cSrcweir 			(this->*fCurTokenAddFunction)(*new DT_Style("</pre>",true));
275cdf0e10cSrcweir 			break;
276cdf0e10cSrcweir 		case Tok_XmlFormat_Tag::atom:
277cdf0e10cSrcweir 			(this->*fCurTokenAddFunction)(*new DT_Style("</code>",true));
278cdf0e10cSrcweir 			break;
279cdf0e10cSrcweir 		default:
280cdf0e10cSrcweir 		    //  Do nothing.
281cdf0e10cSrcweir 		    ;
282cdf0e10cSrcweir 	}
283cdf0e10cSrcweir     if ( sCurDimAttribute.length() > 0 )
284cdf0e10cSrcweir     {
285cdf0e10cSrcweir         (this->*fCurTokenAddFunction)( *new DT_TextToken(sCurDimAttribute.c_str()) );
286cdf0e10cSrcweir         sCurDimAttribute.clear();
287cdf0e10cSrcweir     }
288cdf0e10cSrcweir }
289cdf0e10cSrcweir 
290cdf0e10cSrcweir void
Process_Word(const Tok_Word & i_rToken)291cdf0e10cSrcweir SapiDocu_PE::Process_Word( const Tok_Word &	i_rToken )
292cdf0e10cSrcweir {
293cdf0e10cSrcweir 	(this->*fCurTokenAddFunction)(*new DT_TextToken(i_rToken.Text()));
294cdf0e10cSrcweir }
295cdf0e10cSrcweir 
296cdf0e10cSrcweir void
Process_Comma()297cdf0e10cSrcweir SapiDocu_PE::Process_Comma()
298cdf0e10cSrcweir {
299cdf0e10cSrcweir 	csv_assert(1==7);
300cdf0e10cSrcweir //	(this->*fCurTokenAddFunction)(*new DT_Comma(i_rToken.Text()));
301cdf0e10cSrcweir }
302cdf0e10cSrcweir 
303cdf0e10cSrcweir void
Process_DocuEnd()304cdf0e10cSrcweir SapiDocu_PE::Process_DocuEnd()
305cdf0e10cSrcweir {
306cdf0e10cSrcweir 	eState = st_complete;
307cdf0e10cSrcweir 	if (pCurAtTag)
308cdf0e10cSrcweir 		pDocu->AddAtTag(*pCurAtTag.Release());
309cdf0e10cSrcweir 	fCurTokenAddFunction = &SapiDocu_PE::AddDocuToken2Void;
310cdf0e10cSrcweir }
311cdf0e10cSrcweir 
312cdf0e10cSrcweir void
Process_EOL()313cdf0e10cSrcweir SapiDocu_PE::Process_EOL()
314cdf0e10cSrcweir {
315cdf0e10cSrcweir 	(this->*fCurTokenAddFunction)(*new DT_EOL);
316cdf0e10cSrcweir }
317cdf0e10cSrcweir 
318cdf0e10cSrcweir void
Process_White()319cdf0e10cSrcweir SapiDocu_PE::Process_White()
320cdf0e10cSrcweir {
321cdf0e10cSrcweir 	(this->*fCurTokenAddFunction)(*new DT_White);
322cdf0e10cSrcweir }
323cdf0e10cSrcweir 
324cdf0e10cSrcweir DYN ary::doc::OldIdlDocu *
ReleaseJustParsedDocu()325cdf0e10cSrcweir SapiDocu_PE::ReleaseJustParsedDocu()
326cdf0e10cSrcweir {
327cdf0e10cSrcweir 	if (IsComplete())
328cdf0e10cSrcweir 	{
329cdf0e10cSrcweir 		eState = e_none;
330cdf0e10cSrcweir 		return pDocu.Release();
331cdf0e10cSrcweir 	}
332cdf0e10cSrcweir 	return 0;
333cdf0e10cSrcweir }
334cdf0e10cSrcweir 
335cdf0e10cSrcweir 
336cdf0e10cSrcweir bool
IsComplete() const337cdf0e10cSrcweir SapiDocu_PE::IsComplete() const
338cdf0e10cSrcweir {
339cdf0e10cSrcweir 	return eState == st_complete;
340cdf0e10cSrcweir }
341cdf0e10cSrcweir 
342cdf0e10cSrcweir void
AddDocuToken2Void(DYN ary::inf::DocuToken & let_drNewToken)343cdf0e10cSrcweir SapiDocu_PE::AddDocuToken2Void( DYN ary::inf::DocuToken & let_drNewToken )
344cdf0e10cSrcweir {
345cdf0e10cSrcweir 	delete &let_drNewToken;
346cdf0e10cSrcweir }
347cdf0e10cSrcweir 
348cdf0e10cSrcweir void
AddDocuToken2Short(DYN ary::inf::DocuToken & let_drNewToken)349cdf0e10cSrcweir SapiDocu_PE::AddDocuToken2Short( DYN ary::inf::DocuToken & let_drNewToken )
350cdf0e10cSrcweir {
351cdf0e10cSrcweir 	csv_assert(pDocu);
352cdf0e10cSrcweir 	pDocu->AddToken2Short(let_drNewToken);
353cdf0e10cSrcweir }
354cdf0e10cSrcweir 
355cdf0e10cSrcweir void
AddDocuToken2Description(DYN ary::inf::DocuToken & let_drNewToken)356cdf0e10cSrcweir SapiDocu_PE::AddDocuToken2Description( DYN ary::inf::DocuToken & let_drNewToken )
357cdf0e10cSrcweir {
358cdf0e10cSrcweir 	csv_assert(pDocu);
359cdf0e10cSrcweir 	pDocu->AddToken2Description(let_drNewToken);
360cdf0e10cSrcweir }
361cdf0e10cSrcweir 
362cdf0e10cSrcweir void
AddDocuToken2Deprecated(DYN ary::inf::DocuToken & let_drNewToken)363cdf0e10cSrcweir SapiDocu_PE::AddDocuToken2Deprecated( DYN ary::inf::DocuToken & let_drNewToken )
364cdf0e10cSrcweir {
365cdf0e10cSrcweir 	csv_assert(pDocu);
366cdf0e10cSrcweir 	pDocu->AddToken2DeprecatedText(let_drNewToken);
367cdf0e10cSrcweir }
368cdf0e10cSrcweir 
369cdf0e10cSrcweir void
AddDocuToken2CurAtTag(DYN ary::inf::DocuToken & let_drNewToken)370cdf0e10cSrcweir SapiDocu_PE::AddDocuToken2CurAtTag( DYN ary::inf::DocuToken & let_drNewToken )
371cdf0e10cSrcweir {
372cdf0e10cSrcweir 	csv_assert(pCurAtTag);
373cdf0e10cSrcweir 	pCurAtTag->AddToken(let_drNewToken);
374cdf0e10cSrcweir }
375cdf0e10cSrcweir 
376cdf0e10cSrcweir void
SetCurParameterAtTagName(DYN ary::inf::DocuToken & let_drNewToken)377cdf0e10cSrcweir SapiDocu_PE::SetCurParameterAtTagName( DYN ary::inf::DocuToken & let_drNewToken )
378cdf0e10cSrcweir {
379cdf0e10cSrcweir     if (let_drNewToken.IsWhiteOnly())
380cdf0e10cSrcweir     {
381cdf0e10cSrcweir         delete &let_drNewToken;
382cdf0e10cSrcweir         return;
383cdf0e10cSrcweir     }
384cdf0e10cSrcweir 
385cdf0e10cSrcweir 	csv_assert(pCurAtTag);
386cdf0e10cSrcweir 	DT_TextToken * dpText = dynamic_cast< DT_TextToken* >(&let_drNewToken);
387cdf0e10cSrcweir 	if (dpText != 0)
388cdf0e10cSrcweir 		pCurAtTag->SetName(dpText->GetText());
389cdf0e10cSrcweir 	else
390cdf0e10cSrcweir 		pCurAtTag->SetName("parameter ?");
391cdf0e10cSrcweir 	delete &let_drNewToken;
392cdf0e10cSrcweir 	fCurTokenAddFunction = &SapiDocu_PE::AddDocuToken2CurAtTag;
393cdf0e10cSrcweir }
394cdf0e10cSrcweir 
395cdf0e10cSrcweir void
SetCurSeeAlsoAtTagLinkText(DYN ary::inf::DocuToken & let_drNewToken)396cdf0e10cSrcweir SapiDocu_PE::SetCurSeeAlsoAtTagLinkText( DYN ary::inf::DocuToken & let_drNewToken )
397cdf0e10cSrcweir {
398cdf0e10cSrcweir 	csv_assert(pCurAtTag);
399cdf0e10cSrcweir 
400cdf0e10cSrcweir     if (let_drNewToken.IsWhiteOnly())
401cdf0e10cSrcweir     {
402cdf0e10cSrcweir         delete &let_drNewToken;
403cdf0e10cSrcweir         return;
404cdf0e10cSrcweir     }
405cdf0e10cSrcweir 
406cdf0e10cSrcweir 	DT_TextToken * pText = dynamic_cast< DT_TextToken* >(&let_drNewToken);
407cdf0e10cSrcweir 	if (pText != 0)
408cdf0e10cSrcweir 		pCurAtTag->SetName(pText->GetText());
409cdf0e10cSrcweir     else
410cdf0e10cSrcweir     {
411cdf0e10cSrcweir     	DT_MupType *
412cdf0e10cSrcweir     	    pTypeBegin = dynamic_cast< DT_MupType* >(&let_drNewToken);
413cdf0e10cSrcweir     	DT_MupMember *
414cdf0e10cSrcweir     	    pMemberBegin = dynamic_cast< DT_MupMember* >(&let_drNewToken);
415cdf0e10cSrcweir         if (pTypeBegin != 0 OR pMemberBegin != 0)
416cdf0e10cSrcweir         {
417cdf0e10cSrcweir             sCurAtSeeType_byXML.reset();
418cdf0e10cSrcweir 
419cdf0e10cSrcweir             sCurAtSeeType_byXML
420cdf0e10cSrcweir                 << ( pTypeBegin != 0
421cdf0e10cSrcweir                         ?   pTypeBegin->Scope()
422cdf0e10cSrcweir                         :   pMemberBegin->Scope() );
423cdf0e10cSrcweir 
424cdf0e10cSrcweir             if (sCurAtSeeType_byXML.tellp() > 0)
425cdf0e10cSrcweir             {
426cdf0e10cSrcweir                 sCurAtSeeType_byXML
427cdf0e10cSrcweir                     << "::";
428cdf0e10cSrcweir             }
429cdf0e10cSrcweir         	delete &let_drNewToken;
430cdf0e10cSrcweir         	fCurTokenAddFunction = &SapiDocu_PE::SetCurSeeAlsoAtTagLinkText_2;
431cdf0e10cSrcweir         	return;
432cdf0e10cSrcweir         }
433cdf0e10cSrcweir         else
434cdf0e10cSrcweir         {
435cdf0e10cSrcweir     		pCurAtTag->SetName("? (no identifier found)");
436cdf0e10cSrcweir         }
437cdf0e10cSrcweir     }
438cdf0e10cSrcweir 	delete &let_drNewToken;
439cdf0e10cSrcweir 	fCurTokenAddFunction = &SapiDocu_PE::AddDocuToken2CurAtTag;
440cdf0e10cSrcweir }
441cdf0e10cSrcweir 
442cdf0e10cSrcweir void
SetCurSeeAlsoAtTagLinkText_2(DYN ary::inf::DocuToken & let_drNewToken)443cdf0e10cSrcweir SapiDocu_PE::SetCurSeeAlsoAtTagLinkText_2( DYN ary::inf::DocuToken & let_drNewToken )
444cdf0e10cSrcweir {
445cdf0e10cSrcweir 	csv_assert(pCurAtTag);
446cdf0e10cSrcweir 
447cdf0e10cSrcweir     if (let_drNewToken.IsWhiteOnly())
448cdf0e10cSrcweir     {
449cdf0e10cSrcweir         delete &let_drNewToken;
450cdf0e10cSrcweir         return;
451cdf0e10cSrcweir     }
452cdf0e10cSrcweir 
453cdf0e10cSrcweir 	DT_TextToken *
454cdf0e10cSrcweir 	    pText = dynamic_cast< DT_TextToken* >(&let_drNewToken);
455cdf0e10cSrcweir 	if (pText != 0)
456cdf0e10cSrcweir 	{
457cdf0e10cSrcweir 		sCurAtSeeType_byXML
458cdf0e10cSrcweir 		    << pText->GetText();
459cdf0e10cSrcweir 		pCurAtTag->SetName(sCurAtSeeType_byXML.c_str());
460cdf0e10cSrcweir 	}
461cdf0e10cSrcweir     else
462cdf0e10cSrcweir     {
463cdf0e10cSrcweir         pCurAtTag->SetName("? (no identifier found)");
464cdf0e10cSrcweir     }
465cdf0e10cSrcweir 	sCurAtSeeType_byXML.reset();
466cdf0e10cSrcweir 	delete &let_drNewToken;
467cdf0e10cSrcweir 	fCurTokenAddFunction = &SapiDocu_PE::SetCurSeeAlsoAtTagLinkText_3;
468cdf0e10cSrcweir }
469cdf0e10cSrcweir 
470cdf0e10cSrcweir void
SetCurSeeAlsoAtTagLinkText_3(DYN ary::inf::DocuToken & let_drNewToken)471cdf0e10cSrcweir SapiDocu_PE::SetCurSeeAlsoAtTagLinkText_3( DYN ary::inf::DocuToken & let_drNewToken )
472cdf0e10cSrcweir {
473cdf0e10cSrcweir 	csv_assert(pCurAtTag);
474cdf0e10cSrcweir 
475cdf0e10cSrcweir     if (let_drNewToken.IsWhiteOnly())
476cdf0e10cSrcweir     {
477cdf0e10cSrcweir         delete &let_drNewToken;
478cdf0e10cSrcweir         return;
479cdf0e10cSrcweir     }
480cdf0e10cSrcweir 
481cdf0e10cSrcweir     /// Could emit warning, but don't because this parser is obsolete.
482cdf0e10cSrcweir //	Tok_XmlLink_BeginTag *
483cdf0e10cSrcweir //	    pLinkEnd = dynamic_cast< Tok_XmlLink_EndTag* >(&let_drNewToken);
484cdf0e10cSrcweir //	if (pLinkEnd == 0)
485cdf0e10cSrcweir //	{
486cdf0e10cSrcweir //	    warn_aboutMissingClosingTag();
487cdf0e10cSrcweir //	}
488cdf0e10cSrcweir 
489cdf0e10cSrcweir 	delete &let_drNewToken;
490cdf0e10cSrcweir 	fCurTokenAddFunction = &SapiDocu_PE::AddDocuToken2CurAtTag;
491cdf0e10cSrcweir }
492cdf0e10cSrcweir 
493cdf0e10cSrcweir const String
494*a87170c6SJürgen Schmidt     C_sSinceFormat("Correct version format: \"OpenOffice <major>.<minor>[.<micro> if micro is not 0]\".");
495cdf0e10cSrcweir 
496cdf0e10cSrcweir void
SetCurSinceAtTagVersion_OOo(DYN ary::inf::DocuToken & let_drNewToken)497cdf0e10cSrcweir SapiDocu_PE::SetCurSinceAtTagVersion_OOo( DYN ary::inf::DocuToken & let_drNewToken )
498cdf0e10cSrcweir {
499cdf0e10cSrcweir 	csv_assert(pCurAtTag);
500cdf0e10cSrcweir 
501cdf0e10cSrcweir     DT_TextToken * pToken = dynamic_cast< DT_TextToken* >(&let_drNewToken);
502cdf0e10cSrcweir     if (pToken == 0)
503cdf0e10cSrcweir     {
504cdf0e10cSrcweir     	delete &let_drNewToken;
505cdf0e10cSrcweir         return;
506cdf0e10cSrcweir     }
507cdf0e10cSrcweir 
508cdf0e10cSrcweir     const String
509cdf0e10cSrcweir         sVersion(pToken->GetText());
510*a87170c6SJürgen Schmidt //    if (NOT CheckVersionSyntax_OOo(sVersion))
511*a87170c6SJürgen Schmidt     if (sVersion != "OpenOffice")
512cdf0e10cSrcweir     {
513cdf0e10cSrcweir         Cerr() << "Version information in @since tag has incorrect format.\n"
514cdf0e10cSrcweir                << "Found: \"" << sVersion << "\"\n"
515cdf0e10cSrcweir                << C_sSinceFormat
516cdf0e10cSrcweir                << Endl();
517cdf0e10cSrcweir         exit(1);
518cdf0e10cSrcweir     }
519cdf0e10cSrcweir 
520cdf0e10cSrcweir     const autodoc::CommandLine &
521cdf0e10cSrcweir         rCommandLine = autodoc::CommandLine::Get_();
522cdf0e10cSrcweir     if (NOT rCommandLine.DoesTransform_SinceTag())
523cdf0e10cSrcweir         pCurAtTag->AddToken(let_drNewToken);
524cdf0e10cSrcweir 
525cdf0e10cSrcweir     fCurTokenAddFunction = &SapiDocu_PE::SetCurSinceAtTagVersion_Number;
526cdf0e10cSrcweir }
527cdf0e10cSrcweir 
528cdf0e10cSrcweir void
SetCurSinceAtTagVersion_Number(DYN ary::inf::DocuToken & let_drNewToken)529cdf0e10cSrcweir SapiDocu_PE::SetCurSinceAtTagVersion_Number( DYN ary::inf::DocuToken & let_drNewToken )
530cdf0e10cSrcweir {
531cdf0e10cSrcweir 	csv_assert(pCurAtTag);
532cdf0e10cSrcweir 
533cdf0e10cSrcweir     DT_TextToken * pToken = dynamic_cast< DT_TextToken* >(&let_drNewToken);
534cdf0e10cSrcweir     if (pToken == 0)
535cdf0e10cSrcweir     {
536cdf0e10cSrcweir         if (dynamic_cast< DT_White* >(&let_drNewToken) != 0)
537cdf0e10cSrcweir         {
538cdf0e10cSrcweir             String &
539cdf0e10cSrcweir                 sValue = pCurAtTag->Access_Text().Access_TextOfFirstToken();
540cdf0e10cSrcweir             StreamLock
541cdf0e10cSrcweir                 sHelp(1000);
542cdf0e10cSrcweir             sValue = sHelp() << sValue << " " << c_str;
543cdf0e10cSrcweir         }
544cdf0e10cSrcweir 
545cdf0e10cSrcweir     	delete &let_drNewToken;
546cdf0e10cSrcweir         return;
547cdf0e10cSrcweir     }
548cdf0e10cSrcweir 
549cdf0e10cSrcweir     const String
550cdf0e10cSrcweir         sVersion(pToken->GetText());
551cdf0e10cSrcweir     if (NOT CheckVersionSyntax_Number(sVersion))
552cdf0e10cSrcweir     {
553cdf0e10cSrcweir         Cerr() << "Version information in @since tag has incorrect format.\n"
554cdf0e10cSrcweir                << "Found: \"" << sVersion << "\"\n"
555cdf0e10cSrcweir                << C_sSinceFormat
556cdf0e10cSrcweir                << Endl();
557cdf0e10cSrcweir         exit(1);
558cdf0e10cSrcweir     }
559cdf0e10cSrcweir 
560cdf0e10cSrcweir     const autodoc::CommandLine &
561cdf0e10cSrcweir         rCommandLine = autodoc::CommandLine::Get_();
562cdf0e10cSrcweir     if ( rCommandLine.DoesTransform_SinceTag())
563cdf0e10cSrcweir     {
564cdf0e10cSrcweir         pCurAtTag->AddToken(let_drNewToken);
565cdf0e10cSrcweir 
566cdf0e10cSrcweir         if (rCommandLine.DisplayOf_SinceTagValue(sVersion).empty())
567cdf0e10cSrcweir         {
568cdf0e10cSrcweir             // This is the numbered part, but we don't know it.
569cdf0e10cSrcweir         	delete &let_drNewToken;
570cdf0e10cSrcweir 
571cdf0e10cSrcweir             StreamLock
572cdf0e10cSrcweir                 sl(200);
573cdf0e10cSrcweir             sl()
574cdf0e10cSrcweir                 << "Since-value '"
575cdf0e10cSrcweir                 << sVersion
576cdf0e10cSrcweir                 << "' not found in translation table.";
577cdf0e10cSrcweir             throw X_Docu("since", sl().c_str());
578cdf0e10cSrcweir         }
579cdf0e10cSrcweir     }
580cdf0e10cSrcweir     else
581cdf0e10cSrcweir     {
582cdf0e10cSrcweir         AddDocuToken2SinceAtTag(let_drNewToken);
583cdf0e10cSrcweir     }
584cdf0e10cSrcweir     fCurTokenAddFunction = &SapiDocu_PE::AddDocuToken2SinceAtTag;
585cdf0e10cSrcweir }
586cdf0e10cSrcweir 
587cdf0e10cSrcweir void
AddDocuToken2SinceAtTag(DYN ary::inf::DocuToken & let_drNewToken)588cdf0e10cSrcweir SapiDocu_PE::AddDocuToken2SinceAtTag( DYN ary::inf::DocuToken & let_drNewToken )
589cdf0e10cSrcweir {
590cdf0e10cSrcweir 	csv_assert(pCurAtTag);
591cdf0e10cSrcweir     String &
592cdf0e10cSrcweir         sValue = pCurAtTag->Access_Text().Access_TextOfFirstToken();
593cdf0e10cSrcweir     StreamLock
594cdf0e10cSrcweir         sHelp(1000);
595cdf0e10cSrcweir 
596cdf0e10cSrcweir     DT_TextToken *
597cdf0e10cSrcweir         pToken = dynamic_cast< DT_TextToken* >(&let_drNewToken);
598cdf0e10cSrcweir     if (pToken != 0)
599cdf0e10cSrcweir     {
600cdf0e10cSrcweir         sValue = sHelp() << sValue << pToken->GetText() << c_str;
601cdf0e10cSrcweir     }
602cdf0e10cSrcweir     else if (dynamic_cast< DT_White* >(&let_drNewToken) != 0)
603cdf0e10cSrcweir     {
604cdf0e10cSrcweir         sValue = sHelp() << sValue << " " << c_str;
605cdf0e10cSrcweir     }
606cdf0e10cSrcweir   	delete &let_drNewToken;
607cdf0e10cSrcweir }
608cdf0e10cSrcweir 
609cdf0e10cSrcweir bool
CheckVersionSyntax_Number(const String & i_versionPart2)610cdf0e10cSrcweir SapiDocu_PE::CheckVersionSyntax_Number(const String & i_versionPart2)
611cdf0e10cSrcweir {
612cdf0e10cSrcweir     if (i_versionPart2.length () == 0)
613cdf0e10cSrcweir         return false;
614cdf0e10cSrcweir 
615cdf0e10cSrcweir     const char
616cdf0e10cSrcweir         pt = '.';
617cdf0e10cSrcweir     unsigned int countDigit = 0;
618cdf0e10cSrcweir     unsigned int countPoint = 0;
619cdf0e10cSrcweir     const char *
620cdf0e10cSrcweir         pFirstPoint = 0;
621cdf0e10cSrcweir     const char *
622cdf0e10cSrcweir         pLastPoint = 0;
623cdf0e10cSrcweir 
624cdf0e10cSrcweir     for ( const char * p = i_versionPart2.begin();
625cdf0e10cSrcweir           *p != 0;
626cdf0e10cSrcweir           ++p )
627cdf0e10cSrcweir     {
628cdf0e10cSrcweir         if ( std::isdigit(*p) )
629cdf0e10cSrcweir             ++countDigit;
630cdf0e10cSrcweir         else if (*p == pt)
631cdf0e10cSrcweir         {
632cdf0e10cSrcweir             if (countPoint == 0)
633cdf0e10cSrcweir                 pFirstPoint = p;
634cdf0e10cSrcweir             pLastPoint = p;
635cdf0e10cSrcweir             ++countPoint;
636cdf0e10cSrcweir         }
637cdf0e10cSrcweir     }
638cdf0e10cSrcweir 
639cdf0e10cSrcweir     if (    countDigit + countPoint == i_versionPart2.length()         // only digits and points
640cdf0e10cSrcweir         AND pFirstPoint != 0 AND countPoint < 3                         // 1 or 2 points
641cdf0e10cSrcweir         AND pFirstPoint + 1 != pLastPoint                               // there are digits between two points
642cdf0e10cSrcweir         AND *i_versionPart2.begin() != pt AND *(pLastPoint + 1) != 0    // points are surrounded by digits
643cdf0e10cSrcweir         AND (*(pLastPoint + 1) != '0' OR pLastPoint == pFirstPoint) )   // the first micro-digit is not 0
644cdf0e10cSrcweir     {
645cdf0e10cSrcweir         return true;
646cdf0e10cSrcweir     }
647cdf0e10cSrcweir     return false;
648cdf0e10cSrcweir }
649cdf0e10cSrcweir 
650cdf0e10cSrcweir const char *
AtTagTitle(const Tok_AtTag & i_rToken)651cdf0e10cSrcweir AtTagTitle( const Tok_AtTag & i_rToken )
652cdf0e10cSrcweir {
653cdf0e10cSrcweir 	switch (i_rToken.Id())
654cdf0e10cSrcweir 	{
655cdf0e10cSrcweir 		case Tok_AtTag::author:		return "";
656cdf0e10cSrcweir 		case Tok_AtTag::see:	    return "See also";
657cdf0e10cSrcweir 		case Tok_AtTag::param:	    return "Parameters";
658cdf0e10cSrcweir 		case Tok_AtTag::e_return:	return "Returns";
659cdf0e10cSrcweir 		case Tok_AtTag::e_throw:	return "Throws";
660cdf0e10cSrcweir 		case Tok_AtTag::example:	return "Example";
661cdf0e10cSrcweir 		case Tok_AtTag::deprecated:	return "Deprecated";
662cdf0e10cSrcweir 		case Tok_AtTag::suspicious:	return "";
663cdf0e10cSrcweir 		case Tok_AtTag::missing:	return "";
664cdf0e10cSrcweir 		case Tok_AtTag::incomplete:	return "";
665cdf0e10cSrcweir 		case Tok_AtTag::version:	return "";
666cdf0e10cSrcweir 		case Tok_AtTag::guarantees:	return "Guarantees";
667cdf0e10cSrcweir 		case Tok_AtTag::exception:	return "Exception";
668cdf0e10cSrcweir 		case Tok_AtTag::since:	    return "Since version";
669cdf0e10cSrcweir 		default:
670cdf0e10cSrcweir 		    //  See below.
671cdf0e10cSrcweir 		    ;
672cdf0e10cSrcweir 	}
673cdf0e10cSrcweir 	return i_rToken.Text();
674cdf0e10cSrcweir }
675cdf0e10cSrcweir 
676cdf0e10cSrcweir 
677cdf0e10cSrcweir 
678cdf0e10cSrcweir }   // namespace dsapi
679cdf0e10cSrcweir }   // namespace csi
680cdf0e10cSrcweir 
681