LCOV - code coverage report
Current view: top level - libreoffice/autodoc/source/parser_i/idoc - docu_pe2.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 262 308 85.1 %
Date: 2012-12-27 Functions: 33 35 94.3 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10