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