LTP GCOV extension - code coverage report
Current view: directory - src/cpp/dev/idlc/back/lang_cpp - info.cpp
Test: YAORB-0.2.info
Date: 2006-02-27 Instrumented lines: 99
Code covered: 85.9 % Executed lines: 85

       1                 : //==============================================================================
       2                 : // File <$/src/cpp/dev/idlc/back/lang_cpp/info.cpp>
       3                 : // This file is part of YaOrb : Yet Another Object Request Broker,
       4                 : // Copyright (c) 2000-2003, 2006, Marc Alff.
       5                 : //
       6                 : // This program is free software; you can redistribute it and/or
       7                 : // modify it under the terms of the GNU General Public License
       8                 : // as published by the Free Software Foundation; either version 2
       9                 : // of the License, or (at your option) any later version.
      10                 : //
      11                 : // This program is distributed in the hope that it will be useful,
      12                 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13                 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14                 : // GNU General Public License for more details.
      15                 : //
      16                 : // You should have received a copy of the GNU General Public License
      17                 : // along with this program; if not, write to the Free Software
      18                 : // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
      19                 : //
      20                 : //==============================================================================
      21                 : 
      22                 : // Portability
      23                 : #include "yaorb/config.h"
      24                 : #include "src/cpp/prod/port/port_stdc.h"
      25                 : 
      26                 : #include <stdio.h>
      27                 : 
      28                 : #include "src/cpp/dev/idlc/back/lang_cpp/info.h"
      29                 : #include "src/cpp/dev/idlc/symbol.h"
      30                 : #include "src/cpp/prod/tool/Assert.h"
      31                 : #include "src/cpp/prod/tool/StringTokenizer.h"
      32                 : 
      33                 : struct CppKeyWords
      34               0 : {
      35                 :    const char* keyword ;
      36                 :    String escape ;
      37                 : } ;
      38                 : 
      39              33 : static String _stubPattern = "%s_Stub" ;
      40              33 : static String _skelPattern = "POA_%s" ;
      41              33 : static String _implPattern = "%s_Impl" ;
      42                 : 
      43              33 : static const CppKeyWords KeyWordTab[] =
      44                 : {
      45                 :    // Reference : OMG 99-07-45, section 1.43, page 1-166.
      46                 : 
      47                 :    { "and"             , "_cxx_and"             },
      48                 :    { "and_eq"          , "_cxx_and_eq"          },
      49                 :    { "asm"             , "_cxx_asm"             },
      50                 :    { "auto"            , "_cxx_auto"            },
      51                 :    { "bitand"          , "_cxx_bitand"          },
      52                 :    { "bitor"           , "_cxx_bitor"           },
      53                 :    { "bool"            , "_cxx_bool"            },
      54                 :    { "break"           , "_cxx_break"           },
      55                 :    { "case"            , "_cxx_case"            },
      56                 :    { "catch"           , "_cxx_catch"           },
      57                 :    { "char"            , "_cxx_char"            },
      58                 :    { "class"           , "_cxx_class"           },
      59                 :    { "compl"           , "_cxx_compl"           },
      60                 :    { "const"           , "_cxx_const"           },
      61                 :    { "const_cast"      , "_cxx_const_cast"      },
      62                 :    { "continue"        , "_cxx_continue"        },
      63                 :    { "default"         , "_cxx_default"         },
      64                 :    { "delete"          , "_cxx_delete"          },
      65                 :    { "do"              , "_cxx_do"              },
      66                 :    { "double"          , "_cxx_double"          },
      67                 :    { "dynamic_cast"    , "_cxx_dynamic_cast"    },
      68                 :    { "else"            , "_cxx_else"            },
      69                 :    { "enum"            , "_cxx_enum"            },
      70                 :    { "explicit"        , "_cxx_explicit"        },
      71                 :    { "export"          , "_cxx_export"          },
      72                 :    { "extern"          , "_cxx_extern"          },
      73                 :    { "false"           , "_cxx_false"           },
      74                 :    { "float"           , "_cxx_float"           },
      75                 :    { "for"             , "_cxx_for"             },
      76                 :    { "friend"          , "_cxx_friend"          },
      77                 :    { "goto"            , "_cxx_goto"            },
      78                 :    { "if"              , "_cxx_if"              },
      79                 :    { "inline"          , "_cxx_inline"          },
      80                 :    { "int"             , "_cxx_int"             },
      81                 :    { "long"            , "_cxx_long"            },
      82                 :    { "mutable"         , "_cxx_mutable"         },
      83                 :    { "namespace"       , "_cxx_namespace"       },
      84                 :    { "new"             , "_cxx_new"             },
      85                 :    { "not"             , "_cxx_not"             },
      86                 :    { "not_eq"          , "_cxx_not_eq"          },
      87                 :    { "operator"        , "_cxx_operator"        },
      88                 :    { "or"              , "_cxx_or"              },
      89                 :    { "or_eq"           , "_cxx_or_eq"           },
      90                 :    { "private"         , "_cxx_private"         },
      91                 :    { "protected"       , "_cxx_protected"       },
      92                 :    { "public"          , "_cxx_public"          },
      93                 :    { "register"        , "_cxx_register"        },
      94                 :    { "reinterpret_cast", "_cxx_reinterpret_cast"},
      95                 :    { "return"          , "_cxx_return"          },
      96                 :    { "short"           , "_cxx_short"           },
      97                 :    { "signed"          , "_cxx_signed"          },
      98                 :    { "sizeof"          , "_cxx_sizeof"          },
      99                 :    { "static"          , "_cxx_static"          },
     100                 :    { "static_cast"     , "_cxx_static_cast"     },
     101                 :    { "struct"          , "_cxx_struct"          },
     102                 :    { "switch"          , "_cxx_switch"          },
     103                 :    { "template"        , "_cxx_template"        },
     104                 :    { "this"            , "_cxx_this"            },
     105                 :    { "throw"           , "_cxx_throw"           },
     106                 :    { "true"            , "_cxx_true"            },
     107                 :    { "try"             , "_cxx_try"             },
     108                 :    { "typedef"         , "_cxx_typedef"         },
     109                 :    { "typeid"          , "_cxx_typeid"          },
     110                 :    { "typename"        , "_cxx_typename"        },
     111                 :    { "union"           , "_cxx_union"           },
     112                 :    { "unsigned"        , "_cxx_unsigned"        },
     113                 :    { "using"           , "_cxx_using"           },
     114                 :    { "virtual"         , "_cxx_virtual"         },
     115                 :    { "void"            , "_cxx_void"            },
     116                 :    { "volatile"        , "_cxx_volatile"        },
     117                 :    { "wchar_t"         , "_cxx_wchar_t"         },
     118                 :    { "while"           , "_cxx_while"           },
     119                 :    { "xor"             , "_cxx_xor"             },
     120                 :    { "xor_eq"          , "_cxx_xor_eq"          },
     121                 :    { NULL              , ""                     }
     122              33 : } ;
     123                 : 
     124                 : static const char* const PseudoTab[] =
     125                 : {
     126                 :    "PortableServer::POAManager",
     127                 :    "PortableServer::AdapterActivator",
     128                 :    "PortableServer::ServantManager",
     129                 :    "PortableServer::ServantActivator",
     130                 :    "PortableServer::ServantLocator",
     131                 :    "PortableServer::POA",
     132                 :    "PortableServer::Current",
     133                 :    "CORBA::TypeCode",
     134                 :    "CORBA::Environment",
     135                 :    "CORBA::ORB",
     136                 :    NULL
     137                 : } ;
     138                 : 
     139                 : // Temporary sprintf operations.
     140                 : // FIXME : Overflow will crash.
     141                 : static const int SPRINTF_TMP_SIZE = 132 ;
     142                 : 
     143            5444 : static String CppName(const String& idlName)
     144                 : {
     145                 :    const CppKeyWords *entry ;
     146                 : 
     147                 :    entry = & KeyWordTab[0] ;
     148                 : 
     149          408101 :    while (entry->keyword != NULL)
     150                 :    {
     151          402661 :       if (idlName == entry->keyword)
     152                 :       {
     153               4 :          return entry->escape ;
     154                 :       }
     155                 : 
     156          402657 :       entry ++ ;
     157                 :    }
     158                 : 
     159            5440 :    return idlName ;
     160                 : }
     161                 : 
     162            2736 : static bool IsPseudo(const String& name)
     163                 : {
     164                 :    const char * const *entry ;
     165                 : 
     166                 :    entry = & PseudoTab[0] ;
     167                 : 
     168           30033 :    while (*entry != NULL)
     169                 :    {
     170           27310 :       if (name == *entry)
     171                 :       {
     172                 :          return true ;
     173                 :       }
     174                 : 
     175                 :       entry ++ ;
     176                 :    }
     177                 : 
     178                 :    return false ;
     179                 : }
     180                 : 
     181           10428 : static String StubName(const String& cppName)
     182                 : {
     183                 :    char buf[SPRINTF_TMP_SIZE] ;
     184           10428 :    const char* format = _stubPattern ;
     185           10428 :    const char* data = cppName ;
     186                 : 
     187           10428 :    sprintf(buf, format, data) ;
     188                 : 
     189           10428 :    return buf ;
     190                 : }
     191                 : 
     192            2708 : static String StubFullName(const String& fullName)
     193                 : {
     194                 :    // Convert foo:bar::op into foo_Stub::bar_Stub::op_Stub
     195                 : 
     196            2708 :    String result ;
     197            2708 :    String token ;
     198            2708 :    StringTokenizer parser(fullName, "::") ;
     199                 :    bool first = true ;
     200                 : 
     201           10400 :    while (parser.hasMoreTokens() == true)
     202                 :    {
     203            7692 :       if (first == false)
     204                 :       {
     205            4984 :          result += "::" ;
     206                 :       }
     207                 : 
     208            7692 :       token = parser.nextToken() ;
     209            7692 :       result += StubName(token) ;
     210                 :       first = false ;
     211                 :    }
     212                 : 
     213               0 :    return result ;
     214                 : }
     215                 : 
     216           10428 : static String SkelName(const String& cppName)
     217                 : {
     218                 :    char buf[SPRINTF_TMP_SIZE] ;
     219           10428 :    const char* format = _skelPattern ;
     220           10428 :    const char* data = cppName ;
     221                 : 
     222           10428 :    sprintf(buf, format, data) ;
     223                 : 
     224           10428 :    return buf ;
     225                 : }
     226                 : 
     227            2708 : static String SkelFullName(const String& fullName)
     228                 : {
     229                 :    // Convert foo:bar::op into POA_foo::POA_bar::POA_op
     230                 : 
     231            2708 :    String result ;
     232            2708 :    String token ;
     233            2708 :    StringTokenizer parser(fullName, "::") ;
     234                 :    bool first = true ;
     235                 : 
     236           10400 :    while (parser.hasMoreTokens() == true)
     237                 :    {
     238            7692 :       if (first == false)
     239                 :       {
     240            4984 :          result += "::" ;
     241                 :       }
     242                 : 
     243            7692 :       token = parser.nextToken() ;
     244            7692 :       result += SkelName(token) ;
     245                 :       first = false ;
     246                 :    }
     247                 : 
     248               0 :    return result ;
     249                 : }
     250                 : 
     251           10428 : static String ImplName(const String& cppName)
     252                 : {
     253                 :    char buf[SPRINTF_TMP_SIZE] ;
     254           10428 :    const char* format = _implPattern ;
     255           10428 :    const char* data = cppName ;
     256                 : 
     257           10428 :    sprintf(buf, format, data) ;
     258                 : 
     259           10428 :    return buf ;
     260                 : }
     261                 : 
     262            2708 : static String ImplFullName(const String& fullName)
     263                 : {
     264                 :    // Convert foo:bar::op into foo_impl::bar_impl::op_impl
     265                 : 
     266            2708 :    String result ;
     267            2708 :    String token ;
     268            2708 :    StringTokenizer parser(fullName, "::") ;
     269                 :    bool first = true ;
     270                 : 
     271           10400 :    while (parser.hasMoreTokens() == true)
     272                 :    {
     273            7692 :       if (first == false)
     274                 :       {
     275            4984 :          result += "::" ;
     276                 :       }
     277                 : 
     278            7692 :       token = parser.nextToken() ;
     279            7692 :       result += ImplName(token) ;
     280                 :       first = false ;
     281                 :    }
     282                 : 
     283               0 :    return result ;
     284                 : }
     285                 : 
     286              28 : CppInfo::CppInfo(const String& name)
     287                 : :
     288                 :    _isPseudo(false),
     289                 :    _hasFixedLengthStorage(true),
     290                 :    _hasPtrType(false),
     291                 :    _hasVarType(false),
     292                 :    _isConst(false),
     293                 :    _isPointer(false),
     294                 :    _isVar(false),
     295                 :    _cppName(),
     296                 :    _cppStubName(),
     297                 :    _cppSkelName(),
     298                 :    _cppImplName(),
     299                 :    _cppFullName(),
     300                 :    _cppStubFullName(),
     301                 :    _cppSkelFullName(),
     302              28 :    _cppImplFullName()
     303                 : {
     304              28 :    if (IsPseudo(name))
     305                 :    {
     306               0 :       _isPseudo = true ;
     307                 :    }
     308                 : 
     309              28 :    _cppName = CppName(name) ;
     310              28 :    _cppStubName = StubName(_cppName) ;
     311              28 :    _cppSkelName = SkelName(_cppName) ;
     312              28 :    _cppImplName = ImplName(_cppName) ;
     313              28 :    _cppFullName = _cppName ;
     314              28 :    _cppStubFullName = _cppStubName ;
     315              28 :    _cppSkelFullName = _cppSkelName ;
     316              28 :    _cppImplFullName = _cppImplName ;
     317               0 : }
     318                 : 
     319            2708 : CppInfo::CppInfo(Symbol *sym)
     320                 : :
     321                 :    _isPseudo(false),
     322                 :    _hasFixedLengthStorage(true),
     323                 :    _hasPtrType(false),
     324                 :    _hasVarType(false),
     325                 :    _isConst(false),
     326                 :    _isPointer(false),
     327                 :    _isVar(false),
     328                 :    _cppName(),
     329                 :    _cppStubName(),
     330                 :    _cppSkelName(),
     331                 :    _cppImplName(),
     332                 :    _cppFullName(),
     333                 :    _cppStubFullName(),
     334                 :    _cppSkelFullName(),
     335            2708 :    _cppImplFullName()
     336                 : {
     337            2708 :    const String& name = sym->GetName() ;
     338            2708 :    _cppName = CppName(name) ;
     339            2708 :    _cppStubName = StubName(_cppName) ;
     340            2708 :    _cppSkelName = SkelName(_cppName) ;
     341            2708 :    _cppImplName = ImplName(_cppName) ;
     342                 : 
     343            2708 :    const String& fullName = sym->GetFullyQualifiedName() ;
     344                 : 
     345            2708 :    if (IsPseudo(fullName))
     346                 :    {
     347              13 :       _isPseudo = true ;
     348                 :    }
     349                 : 
     350            2708 :    _cppFullName = CppName(fullName) ;
     351            2708 :    _cppStubFullName = StubFullName(_cppFullName) ;
     352            2708 :    _cppSkelFullName = SkelFullName(_cppFullName) ;
     353            2708 :    _cppImplFullName = ImplFullName(_cppFullName) ;
     354               0 : }
     355                 : 
     356              28 : CppInfo::~CppInfo()
     357              28 : {}
     358                 : 
     359               0 : void CppInfo::SetStubPattern(const String& pattern)
     360                 : {
     361               0 :    _stubPattern = pattern ;
     362                 : }
     363                 : 
     364               0 : void CppInfo::SetSkelPattern(const String& pattern)
     365                 : {
     366               0 :    _skelPattern = pattern ;
     367                 : }
     368                 : 
     369               0 : void CppInfo::SetImplPattern(const String& pattern)
     370                 : {
     371               0 :    _implPattern = pattern ;
     372              33 : }
     373              33 : 

Generated by: LTP GCOV extension version 1.4