LCOV - code coverage report
Current view: top level - registry/tools - regcompare.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 237 906 26.2 %
Date: 2012-08-25 Functions: 21 36 58.3 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 272 1862 14.6 %

           Branch data     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                 :            : 
      21                 :            : #include "registry/registry.hxx"
      22                 :            : #include "registry/reader.hxx"
      23                 :            : #include "registry/version.h"
      24                 :            : #include "fileurl.hxx"
      25                 :            : #include "options.hxx"
      26                 :            : 
      27                 :            : #include <rtl/ustring.hxx>
      28                 :            : #include <osl/diagnose.h>
      29                 :            : 
      30                 :            : #include <stdio.h>
      31                 :            : #include <string.h>
      32                 :            : 
      33                 :            : #include <set>
      34                 :            : #include <vector>
      35                 :            : #include <string>
      36                 :            : 
      37                 :            : using namespace rtl;
      38                 :            : using namespace registry::tools;
      39                 :            : 
      40                 :            : typedef std::set< rtl::OUString > StringSet;
      41                 :            : 
      42         [ -  + ]:          2 : class Options_Impl : public Options
      43                 :            : {
      44                 :            : public:
      45                 :          2 :     explicit Options_Impl(char const * program)
      46                 :            :         : Options(program),
      47                 :            :           m_bFullCheck(false),
      48                 :            :           m_bForceOutput(false),
      49                 :            :           m_bUnoTypeCheck(false),
      50 [ +  - ][ +  - ]:          2 :           m_checkUnpublished(false)
                 [ +  - ]
      51                 :          2 :         {}
      52                 :            : 
      53                 :          4 :     std::string const & getRegName1() const { return m_regName1; }
      54                 :          4 :     std::string const & getRegName2() const { return m_regName2; }
      55                 :            : 
      56                 :          2 :     bool isStartKeyValid() const { return (!m_startKey.isEmpty()); }
      57                 :          0 :     OUString const & getStartKey() const { return m_startKey; }
      58                 :            :     bool matchedWithExcludeKey( const OUString& keyName) const;
      59                 :            : 
      60                 :      10367 :     bool fullCheck() const { return m_bFullCheck; }
      61                 :      25350 :     bool forceOutput() const { return m_bForceOutput; }
      62                 :          6 :     bool unoTypeCheck() const { return m_bUnoTypeCheck; }
      63                 :          9 :     bool checkUnpublished() const { return m_checkUnpublished; }
      64                 :            : 
      65                 :            : protected:
      66                 :            :     bool setRegName_Impl(char c, std::string const & param);
      67                 :            : 
      68                 :            :     virtual void printUsage_Impl() const;
      69                 :            :     virtual bool initOptions_Impl (std::vector< std::string > & rArgs);
      70                 :            : 
      71                 :            :     std::string m_regName1;
      72                 :            :     std::string m_regName2;
      73                 :            :     OUString    m_startKey;
      74                 :            :     StringSet   m_excludeKeys;
      75                 :            :     bool m_bFullCheck;
      76                 :            :     bool m_bForceOutput;
      77                 :            :     bool m_bUnoTypeCheck;
      78                 :            :     bool m_checkUnpublished;
      79                 :            : };
      80                 :            : 
      81                 :            : #define U2S( s ) OUStringToOString(s, RTL_TEXTENCODING_UTF8).getStr()
      82                 :            : 
      83                 :          0 : inline rtl::OUString makeOUString (std::string const & s)
      84                 :            : {
      85                 :          0 :     return rtl::OUString(s.c_str(), s.size(), RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
      86                 :            : }
      87                 :            : 
      88                 :          0 : inline rtl::OUString shortName(rtl::OUString const & fullName)
      89                 :            : {
      90                 :          0 :     return fullName.copy(fullName.lastIndexOf('/') + 1);
      91                 :            : }
      92                 :            : 
      93                 :          4 : bool Options_Impl::setRegName_Impl(char c, std::string const & param)
      94                 :            : {
      95                 :          4 :     bool one = (c == '1'), two = (c == '2');
      96         [ +  + ]:          4 :     if (one)
      97                 :          2 :         m_regName1 = param;
      98         [ +  + ]:          4 :     if (two)
      99                 :          2 :         m_regName2 = param;
     100 [ +  + ][ +  - ]:          4 :     return (one || two);
     101                 :            : }
     102                 :            : 
     103                 :            : //virtual
     104                 :          0 : void Options_Impl::printUsage_Impl() const
     105                 :            : {
     106                 :          0 :     std::string const & rProgName = getProgramName();
     107                 :            :     fprintf(stderr,
     108                 :            :             "Usage: %s -r1<filename> -r2<filename> [-options] | @<filename>\n", rProgName.c_str()
     109                 :          0 :             );
     110                 :            :     fprintf(stderr,
     111                 :            :             "    -r1<filename>  = filename specifies the name of the first registry.\n"
     112                 :            :             "    -r2<filename>  = filename specifies the name of the second registry.\n"
     113                 :            :             "    @<filename>    = filename specifies a command file.\n"
     114                 :            :             "Options:\n"
     115                 :            :             "    -s<name>  = name specifies the name of a start key. If no start key\n"
     116                 :            :             "     |S<name>   is specified the comparison starts with the root key.\n"
     117                 :            :             "    -x<name>  = name specifies the name of a key which won't be compared. All\n"
     118                 :            :             "     |X<name>   subkeys won't be compared also. This option can be used more than once.\n"
     119                 :            :             "    -f|F      = force the detailed output of any diffenrences. Default\n"
     120                 :            :             "                is that only the number of differences is returned.\n"
     121                 :            :             "    -c|C      = make a complete check, that means any differences will be\n"
     122                 :            :             "                detected. Default is only a compatibility check that means\n"
     123                 :            :             "                only UNO typelibrary entries will be checked.\n"
     124                 :            :             "    -t|T      = make an UNO type compatiblity check. This means that registry 2\n"
     125                 :            :             "                will be checked against registry 1. If a interface in r2 contains\n"
     126                 :            :             "                more methods or the methods are in a different order as in r1, r2 is\n"
     127                 :            :             "                incompatible to r1. But if a service in r2 supports more properties as\n"
     128                 :            :             "                in r1 and the new properties are 'optional' it is compatible.\n"
     129                 :            :             "    -u|U      = additionally check types that are unpublished in registry 1.\n"
     130                 :            :             "    -h|-?     = print this help message and exit.\n"
     131                 :          0 :             );
     132                 :            :     fprintf(stderr,
     133                 :            :             "\n%s Version 1.0\n\n", rProgName.c_str()
     134                 :          0 :             );
     135                 :          0 : }
     136                 :            : 
     137                 :            : // virtual
     138                 :          2 : bool Options_Impl::initOptions_Impl (std::vector< std::string > & rArgs)
     139                 :            : {
     140 [ +  - ][ +  - ]:          2 :     std::vector< std::string >::const_iterator first = rArgs.begin(), last = rArgs.end();
     141 [ +  - ][ +  - ]:         10 :     for (; first != last; ++first)
                 [ +  + ]
     142                 :            :     {
     143 [ +  - ][ +  - ]:          8 :         if ((*first)[0] != '-')
                 [ -  + ]
     144                 :            :         {
     145 [ #  # ][ #  # ]:          0 :             return badOption("invalid", (*first).c_str());
     146                 :            :         }
     147 [ +  - ][ +  - ]:          8 :         switch ((*first)[1])
           [ +  -  -  +  
             -  +  -  -  
                      - ]
     148                 :            :         {
     149                 :            :         case 'r':
     150                 :            :         case 'R':
     151                 :            :             {
     152 [ +  - ][ +  - ]:          4 :                 if (!((++first != last) && ((*first)[0] != '-')))
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
                 [ -  + ]
     153                 :            :                 {
     154 [ #  # ][ #  # ]:          0 :                     return badOption("invalid", (*first).c_str());
     155                 :            :                 }
     156                 :            : 
     157 [ +  - ][ +  - ]:          4 :                 std::string option(*first), param;
                 [ +  - ]
     158         [ +  - ]:          4 :                 if (option.size() == 1)
     159                 :            :                 {
     160                 :            :                     // "-r<n><space><param>"
     161 [ +  - ][ +  - ]:          4 :                     if (!((++first != last) && ((*first)[0] != '-')))
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
                 [ -  + ]
     162                 :            :                     {
     163 [ #  # ][ #  # ]:          0 :                         return badOption("invalid", (*first).c_str());
     164                 :            :                     }
     165 [ +  - ][ +  - ]:          4 :                     param = (*first);
     166                 :            :                 }
     167                 :            :                 else
     168                 :            :                 {
     169                 :            :                     // "-r<n><param>"
     170 [ #  # ][ #  # ]:          0 :                     param = std::string(&(option[1]), option.size() - 1);
                 [ #  # ]
     171                 :            :                 }
     172 [ +  - ][ +  - ]:          4 :                 if (!setRegName_Impl(option[0], param))
                 [ -  + ]
     173                 :            :                 {
     174         [ #  # ]:          4 :                     return badOption("invalid", option.c_str());
     175                 :            :                 }
     176 [ -  + ][ -  + ]:          4 :                 break;
     177                 :            :             }
     178                 :            :         case 's':
     179                 :            :         case 'S':
     180                 :            :             {
     181 [ #  # ][ #  # ]:          0 :                 if (!((++first != last) && ((*first)[0] != '-')))
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     182                 :            :                 {
     183 [ #  # ][ #  # ]:          0 :                     return badOption("invalid", (*first).c_str());
     184                 :            :                 }
     185 [ #  # ][ #  # ]:          0 :                 m_startKey = makeOUString(*first);
     186                 :          0 :                 break;
     187                 :            :             }
     188                 :            :         case 'x':
     189                 :            :         case 'X':
     190                 :            :             {
     191 [ #  # ][ #  # ]:          0 :                 if (!((++first != last) && ((*first)[0] != '-')))
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     192                 :            :                 {
     193 [ #  # ][ #  # ]:          0 :                     return badOption("invalid", (*first).c_str());
     194                 :            :                 }
     195 [ #  # ][ #  # ]:          0 :                 m_excludeKeys.insert(makeOUString(*first));
                 [ #  # ]
     196                 :          0 :                 break;
     197                 :            :             }
     198                 :            :         case 'f':
     199                 :            :         case 'F':
     200                 :            :             {
     201 [ +  - ][ -  + ]:          2 :                 if ((*first).size() > 2)
     202                 :            :                 {
     203 [ #  # ][ #  # ]:          0 :                     return badOption("invalid", (*first).c_str());
     204                 :            :                 }
     205                 :          2 :                 m_bForceOutput = sal_True;
     206                 :          2 :                 break;
     207                 :            :             }
     208                 :            :         case 'c':
     209                 :            :         case 'C':
     210                 :            :             {
     211 [ #  # ][ #  # ]:          0 :                 if ((*first).size() > 2)
     212                 :            :                 {
     213 [ #  # ][ #  # ]:          0 :                     return badOption("invalid", (*first).c_str());
     214                 :            :                 }
     215                 :          0 :                 m_bFullCheck = sal_True;
     216                 :          0 :                 break;
     217                 :            :             }
     218                 :            :         case 't':
     219                 :            :         case 'T':
     220                 :            :             {
     221 [ +  - ][ -  + ]:          2 :                 if ((*first).size() > 2)
     222                 :            :                 {
     223 [ #  # ][ #  # ]:          0 :                     return badOption("invalid", (*first).c_str());
     224                 :            :                 }
     225                 :          2 :                 m_bUnoTypeCheck = sal_True;
     226                 :          2 :                 break;
     227                 :            :             }
     228                 :            :         case 'u':
     229                 :            :         case 'U':
     230                 :            :             {
     231 [ #  # ][ #  # ]:          0 :                 if ((*first).size() > 2)
     232                 :            :                 {
     233 [ #  # ][ #  # ]:          0 :                     return badOption("invalid", (*first).c_str());
     234                 :            :                 }
     235                 :          0 :                 m_checkUnpublished = true;
     236                 :          0 :                 break;
     237                 :            :             }
     238                 :            :         case 'h':
     239                 :            :         case '?':
     240                 :            :             {
     241 [ #  # ][ #  # ]:          0 :                 if ((*first).size() > 2)
     242                 :            :                 {
     243 [ #  # ][ #  # ]:          0 :                     return badOption("invalid", (*first).c_str());
     244                 :            :                 }
     245         [ #  # ]:          0 :                 return printUsage();
     246                 :            :                 // break; // Unreachable
     247                 :            :             }
     248                 :            :         default:
     249                 :            :             {
     250 [ #  # ][ #  # ]:          0 :                 return badOption("unknown", (*first).c_str());
     251                 :            :                 // break; // Unreachable
     252                 :            :             }
     253                 :            :         }
     254                 :            :     }
     255                 :            : 
     256         [ -  + ]:          2 :     if ( m_regName1.empty() )
     257                 :            :     {
     258         [ #  # ]:          0 :         return badOption("missing", "-r1");
     259                 :            :     }
     260         [ -  + ]:          2 :     if ( m_regName2.empty() )
     261                 :            :     {
     262         [ #  # ]:          0 :         return badOption("missing", "-r2");
     263                 :            :     }
     264                 :          2 :     return true;
     265                 :            : }
     266                 :            : 
     267                 :       8770 : bool Options_Impl::matchedWithExcludeKey( const OUString& keyName) const
     268                 :            : {
     269         [ -  + ]:       8770 :     if (!m_excludeKeys.empty())
     270                 :            :     {
     271                 :          0 :         StringSet::const_iterator first = m_excludeKeys.begin(), last = m_excludeKeys.end();
     272         [ #  # ]:          0 :         for (; first != last; ++first)
     273                 :            :         {
     274         [ #  # ]:          0 :             if (keyName.indexOf(*first) == 0)
     275                 :          0 :                 return true;
     276                 :            :         }
     277                 :            :     }
     278                 :       8770 :     return false;
     279                 :            : }
     280                 :            : 
     281                 :          0 : static char const * getTypeClass(RTTypeClass typeClass)
     282                 :            : {
     283   [ #  #  #  #  :          0 :     switch (typeClass)
          #  #  #  #  #  
                      # ]
     284                 :            :     {
     285                 :            :         case RT_TYPE_INTERFACE:
     286                 :          0 :             return "INTERFACE";
     287                 :            :         case RT_TYPE_MODULE:
     288                 :          0 :             return "MODULE";
     289                 :            :         case RT_TYPE_STRUCT:
     290                 :          0 :             return "STRUCT";
     291                 :            :         case RT_TYPE_ENUM:
     292                 :          0 :             return "ENUM";
     293                 :            :         case RT_TYPE_EXCEPTION:
     294                 :          0 :             return "EXCEPTION";
     295                 :            :         case RT_TYPE_TYPEDEF:
     296                 :          0 :             return "TYPEDEF";
     297                 :            :         case RT_TYPE_SERVICE:
     298                 :          0 :             return "SERVICE";
     299                 :            :         case RT_TYPE_OBJECT:
     300                 :          0 :             return "OBJECT";
     301                 :            :         case RT_TYPE_CONSTANTS:
     302                 :          0 :             return "CONSTANTS";
     303                 :            :         default:
     304                 :          0 :             return "INVALID";
     305                 :            :     }
     306                 :            : }
     307                 :            : 
     308                 :          0 : static OString getFieldAccess(RTFieldAccess fieldAccess)
     309                 :            : {
     310                 :          0 :     OString ret;
     311                 :            :     if ( (fieldAccess & RT_ACCESS_INVALID) == RT_ACCESS_INVALID )
     312                 :            :     {
     313                 :          0 :         ret += OString("INVALID");
     314                 :            :     }
     315         [ #  # ]:          0 :     if ( (fieldAccess & RT_ACCESS_READONLY) == RT_ACCESS_READONLY )
     316                 :            :     {
     317         [ #  # ]:          0 :         ret += OString(ret.isEmpty() ? "READONLY" : ",READONLY");
     318                 :            :     }
     319         [ #  # ]:          0 :     if ( (fieldAccess & RT_ACCESS_OPTIONAL) == RT_ACCESS_OPTIONAL )
     320                 :            :     {
     321         [ #  # ]:          0 :         ret += OString(ret.isEmpty() ? "OPTIONAL" : ",OPTIONAL");
     322                 :            :     }
     323         [ #  # ]:          0 :     if ( (fieldAccess & RT_ACCESS_MAYBEVOID) == RT_ACCESS_MAYBEVOID )
     324                 :            :     {
     325         [ #  # ]:          0 :         ret += OString(ret.isEmpty() ? "MAYBEVOID" : ",MAYBEVOID");
     326                 :            :     }
     327         [ #  # ]:          0 :     if ( (fieldAccess & RT_ACCESS_BOUND) == RT_ACCESS_BOUND )
     328                 :            :     {
     329         [ #  # ]:          0 :         ret += OString(ret.isEmpty() ? "BOUND" : ",BOUND");
     330                 :            :     }
     331         [ #  # ]:          0 :     if ( (fieldAccess & RT_ACCESS_CONSTRAINED) == RT_ACCESS_CONSTRAINED )
     332                 :            :     {
     333         [ #  # ]:          0 :         ret += OString(ret.isEmpty() ? "CONSTRAINED" : ",CONSTRAINED");
     334                 :            :     }
     335         [ #  # ]:          0 :     if ( (fieldAccess & RT_ACCESS_TRANSIENT) == RT_ACCESS_TRANSIENT )
     336                 :            :     {
     337         [ #  # ]:          0 :         ret += OString(ret.isEmpty() ? "TRANSIENT" : ",TRANSIENT");
     338                 :            :     }
     339         [ #  # ]:          0 :     if ( (fieldAccess & RT_ACCESS_MAYBEAMBIGUOUS) == RT_ACCESS_MAYBEAMBIGUOUS )
     340                 :            :     {
     341         [ #  # ]:          0 :         ret += OString(ret.isEmpty() ? "MAYBEAMBIGUOUS" : ",MAYBEAMBIGUOUS");
     342                 :            :     }
     343         [ #  # ]:          0 :     if ( (fieldAccess & RT_ACCESS_MAYBEDEFAULT) == RT_ACCESS_MAYBEDEFAULT )
     344                 :            :     {
     345         [ #  # ]:          0 :         ret += OString(ret.isEmpty() ? "MAYBEDEFAULT" : ",MAYBEDEFAULT");
     346                 :            :     }
     347         [ #  # ]:          0 :     if ( (fieldAccess & RT_ACCESS_REMOVEABLE) == RT_ACCESS_REMOVEABLE )
     348                 :            :     {
     349         [ #  # ]:          0 :         ret += OString(ret.isEmpty() ? "REMOVEABLE" : ",REMOVEABLE");
     350                 :            :     }
     351         [ #  # ]:          0 :     if ( (fieldAccess & RT_ACCESS_ATTRIBUTE) == RT_ACCESS_ATTRIBUTE )
     352                 :            :     {
     353         [ #  # ]:          0 :         ret += OString(ret.isEmpty() ? "ATTRIBUTE" : ",ATTRIBUTE");
     354                 :            :     }
     355         [ #  # ]:          0 :     if ( (fieldAccess & RT_ACCESS_PROPERTY) == RT_ACCESS_PROPERTY )
     356                 :            :     {
     357         [ #  # ]:          0 :         ret += OString(ret.isEmpty() ? "PROPERTY" : ",PROPERTY");
     358                 :            :     }
     359         [ #  # ]:          0 :     if ( (fieldAccess & RT_ACCESS_CONST) == RT_ACCESS_CONST )
     360                 :            :     {
     361         [ #  # ]:          0 :         ret += OString(ret.isEmpty() ? "CONST" : ",CONST");
     362                 :            :     }
     363         [ #  # ]:          0 :     if ( (fieldAccess & RT_ACCESS_READWRITE) == RT_ACCESS_READWRITE )
     364                 :            :     {
     365         [ #  # ]:          0 :         ret += OString(ret.isEmpty() ? "READWRITE" : ",READWRITE");
     366                 :            :     }
     367                 :          0 :     return ret;
     368                 :            : }
     369                 :            : 
     370                 :          0 : static char const * getConstValueType(RTConstValue& constValue)
     371                 :            : {
     372   [ #  #  #  #  :          0 :     switch (constValue.m_type)
          #  #  #  #  #  
                      # ]
     373                 :            :     {
     374                 :            :         case RT_TYPE_BOOL:
     375                 :          0 :             return "sal_Bool";
     376                 :            :         case RT_TYPE_BYTE:
     377                 :          0 :             return "sal_uInt8";
     378                 :            :         case RT_TYPE_INT16:
     379                 :          0 :             return "sal_Int16";
     380                 :            :         case RT_TYPE_UINT16:
     381                 :          0 :             return "sal_uInt16";
     382                 :            :         case RT_TYPE_INT32:
     383                 :          0 :             return "sal_Int32";
     384                 :            :         case RT_TYPE_UINT32:
     385                 :          0 :             return "sal_uInt32";
     386                 :            : //      case RT_TYPE_INT64:
     387                 :            : //          return "sal_Int64";
     388                 :            : //      case RT_TYPE_UINT64:
     389                 :            : //          return "sal_uInt64";
     390                 :            :         case RT_TYPE_FLOAT:
     391                 :          0 :             return "float";
     392                 :            :         case RT_TYPE_DOUBLE:
     393                 :          0 :             return "double";
     394                 :            :         case RT_TYPE_STRING:
     395                 :          0 :             return "sal_Unicode*";
     396                 :            :         default:
     397                 :          0 :             return "NONE";
     398                 :            :     }
     399                 :            : }
     400                 :            : 
     401                 :          0 : static void printConstValue(RTConstValue& constValue)
     402                 :            : {
     403   [ #  #  #  #  :          0 :     switch (constValue.m_type)
          #  #  #  #  #  
                   #  # ]
     404                 :            :     {
     405                 :            :         case RT_TYPE_NONE:
     406                 :          0 :             fprintf(stdout, "none");
     407                 :          0 :             break;
     408                 :            :         case RT_TYPE_BOOL:
     409         [ #  # ]:          0 :             fprintf(stdout, "%s", constValue.m_value.aBool ? "TRUE" : "FALSE");
     410                 :          0 :             break;
     411                 :            :         case RT_TYPE_BYTE:
     412                 :          0 :             fprintf(stdout, "%d", constValue.m_value.aByte);
     413                 :          0 :             break;
     414                 :            :         case RT_TYPE_INT16:
     415                 :          0 :             fprintf(stdout, "%d", constValue.m_value.aShort);
     416                 :          0 :             break;
     417                 :            :         case RT_TYPE_UINT16:
     418                 :          0 :             fprintf(stdout, "%d", constValue.m_value.aUShort);
     419                 :          0 :             break;
     420                 :            :         case RT_TYPE_INT32:
     421                 :            :             fprintf(
     422                 :            :                 stdout, "%ld",
     423                 :          0 :                 sal::static_int_cast< long >(constValue.m_value.aLong));
     424                 :          0 :             break;
     425                 :            :         case RT_TYPE_UINT32:
     426                 :            :             fprintf(
     427                 :            :                 stdout, "%lu",
     428                 :            :                 sal::static_int_cast< unsigned long >(
     429                 :          0 :                     constValue.m_value.aULong));
     430                 :          0 :             break;
     431                 :            : //      case RT_TYPE_INT64:
     432                 :            : //          fprintf(stdout, "%d", constValue.m_value.aHyper);
     433                 :            : //      case RT_TYPE_UINT64:
     434                 :            : //          fprintf(stdout, "%d", constValue.m_value.aUHyper);
     435                 :            :         case RT_TYPE_FLOAT:
     436                 :          0 :             fprintf(stdout, "%f", constValue.m_value.aFloat);
     437                 :          0 :             break;
     438                 :            :         case RT_TYPE_DOUBLE:
     439                 :          0 :             fprintf(stdout, "%f", constValue.m_value.aDouble);
     440                 :          0 :             break;
     441                 :            :         case RT_TYPE_STRING:
     442                 :            :             fprintf(
     443                 :            :                 stdout, "%s",
     444                 :            :                 (rtl::OUStringToOString(
     445                 :            :                     constValue.m_value.aString, RTL_TEXTENCODING_UTF8).
     446 [ #  # ][ #  # ]:          0 :                  getStr()));
     447                 :          0 :             break;
     448                 :            :         default:
     449                 :          0 :             break;
     450                 :            :     }
     451                 :          0 : }
     452                 :            : 
     453                 :          0 : static void dumpTypeClass(sal_Bool & rbDump, RTTypeClass typeClass, OUString const & keyName)
     454                 :            : {
     455         [ #  # ]:          0 :     if (rbDump)
     456         [ #  # ]:          0 :         fprintf(stdout, "%s: %s\n", getTypeClass(typeClass), U2S(keyName));
     457                 :          0 :     rbDump = sal_False;
     458                 :          0 : }
     459                 :            : 
     460                 :       1964 : static sal_uInt32 checkConstValue(Options_Impl const & options,
     461                 :            :                                   const OUString& keyName,
     462                 :            :                                   RTTypeClass typeClass,
     463                 :            :                                   sal_Bool & bDump,
     464                 :            :                                   RTConstValue& constValue1,
     465                 :            :                                   RTConstValue& constValue2,
     466                 :            :                                   sal_uInt16 index1)
     467                 :            : {
     468   [ +  -  -  -  :       1964 :     switch (constValue1.m_type)
          -  -  -  -  -  
                -  -  - ]
     469                 :            :     {
     470                 :            :         case RT_TYPE_INVALID:
     471                 :       1964 :             break;
     472                 :            :         case RT_TYPE_BOOL:
     473         [ #  # ]:          0 :             if (constValue1.m_value.aBool != constValue2.m_value.aBool)
     474                 :            :             {
     475 [ #  # ][ #  # ]:          0 :                 if ( options.forceOutput() && !options.unoTypeCheck() )
                 [ #  # ]
     476                 :            :                 {
     477                 :          0 :                     dumpTypeClass(bDump, typeClass, keyName);
     478                 :            :                     fprintf(stdout, "  Field %d: Value1 = %s  !=  Value2 = %s\n", index1,
     479                 :            :                             constValue1.m_value.aBool ? "TRUE" : "FALSE",
     480 [ #  # ][ #  # ]:          0 :                             constValue2.m_value.aBool ? "TRUE" : "FALSE");
     481                 :            :                 }
     482                 :          0 :                 return 1;
     483                 :            :             }
     484                 :          0 :             break;
     485                 :            :         case RT_TYPE_BYTE:
     486         [ #  # ]:          0 :             if (constValue1.m_value.aByte != constValue2.m_value.aByte)
     487                 :            :             {
     488 [ #  # ][ #  # ]:          0 :                 if ( options.forceOutput() && !options.unoTypeCheck() )
                 [ #  # ]
     489                 :            :                 {
     490                 :          0 :                     dumpTypeClass(bDump, typeClass, keyName);
     491                 :            :                     fprintf(stdout, "  Field %d: Value1 = %d  !=  Value2 = %d\n", index1,
     492                 :          0 :                             constValue1.m_value.aByte, constValue2.m_value.aByte);
     493                 :            :                 }
     494                 :          0 :                 return 1;
     495                 :            :             }
     496                 :          0 :             break;
     497                 :            :         case RT_TYPE_INT16:
     498         [ #  # ]:          0 :             if (constValue1.m_value.aShort != constValue2.m_value.aShort)
     499                 :            :             {
     500 [ #  # ][ #  # ]:          0 :                 if ( options.forceOutput() && !options.unoTypeCheck() )
                 [ #  # ]
     501                 :            :                 {
     502                 :          0 :                     dumpTypeClass(bDump, typeClass, keyName);
     503                 :            :                     fprintf(stdout, "  Field %d: Value1 = %d  !=  Value2 = %d\n", index1,
     504                 :          0 :                             constValue1.m_value.aShort, constValue2.m_value.aShort);
     505                 :            :                 }
     506                 :          0 :                 return 1;
     507                 :            :             }
     508                 :          0 :             break;
     509                 :            :         case RT_TYPE_UINT16:
     510         [ #  # ]:          0 :             if (constValue1.m_value.aUShort != constValue2.m_value.aUShort)
     511                 :            :             {
     512 [ #  # ][ #  # ]:          0 :                 if ( options.forceOutput() && !options.unoTypeCheck() )
                 [ #  # ]
     513                 :            :                 {
     514                 :          0 :                     dumpTypeClass(bDump, typeClass, keyName);
     515                 :            :                     fprintf(stdout, "  Field %d: Value1 = %d  !=  Value2 = %d\n", index1,
     516                 :          0 :                             constValue1.m_value.aUShort, constValue2.m_value.aUShort);
     517                 :            :                 }
     518                 :          0 :                 return 1;
     519                 :            :             }
     520                 :          0 :             break;
     521                 :            :         case RT_TYPE_INT32:
     522         [ #  # ]:          0 :             if (constValue1.m_value.aLong != constValue2.m_value.aLong)
     523                 :            :             {
     524 [ #  # ][ #  # ]:          0 :                 if ( options.forceOutput() && !options.unoTypeCheck() )
                 [ #  # ]
     525                 :            :                 {
     526                 :          0 :                     dumpTypeClass(bDump, typeClass, keyName);
     527                 :            :                     fprintf(stdout, "  Field %d: Value1 = %ld  !=  Value2 = %ld\n", index1,
     528                 :            :                             sal::static_int_cast< long >(constValue1.m_value.aLong),
     529                 :          0 :                             sal::static_int_cast< long >(constValue2.m_value.aLong));
     530                 :            :                 }
     531                 :          0 :                 return 1;
     532                 :            :             }
     533                 :          0 :             break;
     534                 :            :         case RT_TYPE_UINT32:
     535         [ #  # ]:          0 :             if (constValue1.m_value.aULong != constValue2.m_value.aULong)
     536                 :            :             {
     537 [ #  # ][ #  # ]:          0 :                 if ( options.forceOutput() && !options.unoTypeCheck() )
                 [ #  # ]
     538                 :            :                 {
     539                 :          0 :                     dumpTypeClass(bDump, typeClass, keyName);
     540                 :            :                     fprintf(stdout, "  Field %d: Value1 = %lu  !=  Value2 = %lu\n", index1,
     541                 :            :                             sal::static_int_cast< unsigned long >(constValue1.m_value.aULong),
     542                 :          0 :                             sal::static_int_cast< unsigned long >(constValue2.m_value.aULong));
     543                 :            :                 }
     544                 :          0 :                 return 1;
     545                 :            :             }
     546                 :          0 :             break;
     547                 :            :         case RT_TYPE_INT64:
     548         [ #  # ]:          0 :             if (constValue1.m_value.aHyper != constValue2.m_value.aHyper)
     549                 :            :             {
     550 [ #  # ][ #  # ]:          0 :                 if ( options.forceOutput() && !options.unoTypeCheck() )
                 [ #  # ]
     551                 :            :                 {
     552                 :          0 :                     dumpTypeClass(bDump, typeClass, keyName);
     553                 :            :                     fprintf(
     554                 :            :                         stdout, "  Field %d: Value1 = %s  !=  Value2 = %s\n",
     555                 :            :                         index1,
     556                 :            :                         rtl::OUStringToOString(
     557                 :            :                             rtl::OUString::valueOf(constValue1.m_value.aHyper),
     558                 :            :                             RTL_TEXTENCODING_ASCII_US).getStr(),
     559                 :            :                         rtl::OUStringToOString(
     560                 :            :                             rtl::OUString::valueOf(constValue2.m_value.aHyper),
     561 [ #  # ][ #  # ]:          0 :                             RTL_TEXTENCODING_ASCII_US).getStr());
                 [ #  # ]
     562                 :            :                 }
     563                 :          0 :                 return 1;
     564                 :            :             }
     565                 :          0 :             break;
     566                 :            :         case RT_TYPE_UINT64:
     567         [ #  # ]:          0 :             if (constValue1.m_value.aUHyper != constValue2.m_value.aUHyper)
     568                 :            :             {
     569 [ #  # ][ #  # ]:          0 :                 if ( options.forceOutput() && !options.unoTypeCheck() )
                 [ #  # ]
     570                 :            :                 {
     571                 :          0 :                     dumpTypeClass(bDump, typeClass, keyName);
     572                 :            :                     fprintf(
     573                 :            :                         stdout, "  Field %d: Value1 = %s  !=  Value2 = %s\n",
     574                 :            :                         index1,
     575                 :            :                         rtl::OUStringToOString(
     576                 :            :                             rtl::OUString::valueOf(
     577                 :            :                                 static_cast< sal_Int64 >(
     578                 :            :                                     constValue1.m_value.aUHyper)),
     579                 :            :                             RTL_TEXTENCODING_ASCII_US).getStr(),
     580                 :            :                         rtl::OUStringToOString(
     581                 :            :                             rtl::OUString::valueOf(
     582                 :            :                                 static_cast< sal_Int64 >(
     583                 :            :                                     constValue2.m_value.aUHyper)),
     584 [ #  # ][ #  # ]:          0 :                             RTL_TEXTENCODING_ASCII_US).getStr());
                 [ #  # ]
     585                 :            :                         // printing the unsigned values as signed should be
     586                 :            :                         // acceptable...
     587                 :            :                 }
     588                 :          0 :                 return 1;
     589                 :            :             }
     590                 :          0 :             break;
     591                 :            :         case RT_TYPE_FLOAT:
     592         [ #  # ]:          0 :             if (constValue1.m_value.aFloat != constValue2.m_value.aFloat)
     593                 :            :             {
     594 [ #  # ][ #  # ]:          0 :                 if ( options.forceOutput() && !options.unoTypeCheck() )
                 [ #  # ]
     595                 :            :                 {
     596                 :          0 :                     dumpTypeClass(bDump, typeClass, keyName);
     597                 :            :                     fprintf(stdout, "  Field %d: Value1 = %f  !=  Value2 = %f\n", index1,
     598                 :          0 :                             constValue1.m_value.aFloat, constValue2.m_value.aFloat);
     599                 :            :                 }
     600                 :          0 :                 return 1;
     601                 :            :             }
     602                 :          0 :             break;
     603                 :            :         case RT_TYPE_DOUBLE:
     604         [ #  # ]:          0 :             if (constValue1.m_value.aDouble != constValue2.m_value.aDouble)
     605                 :            :             {
     606 [ #  # ][ #  # ]:          0 :                 if ( options.forceOutput() && !options.unoTypeCheck() )
                 [ #  # ]
     607                 :            :                 {
     608                 :          0 :                     dumpTypeClass(bDump, typeClass, keyName);
     609                 :            :                     fprintf(stdout, "  Field %d: Value1 = %f  !=  Value2 = %f\n", index1,
     610                 :          0 :                             constValue1.m_value.aDouble, constValue2.m_value.aDouble);
     611                 :            :                 }
     612                 :          0 :                 return 1;
     613                 :            :             }
     614                 :          0 :             break;
     615                 :            :         default:
     616                 :            :             OSL_ASSERT(false);
     617                 :          0 :             break;
     618                 :            :     }
     619                 :       1964 :     return 0;
     620                 :            : }
     621                 :            : 
     622                 :            : enum verbosity_t {SILENT, REPORT};
     623                 :      10342 : static sal_uInt32 checkField(Options_Impl const & options,
     624                 :            :                              const OUString& keyName,
     625                 :            :                              RTTypeClass typeClass,
     626                 :            :                              sal_Bool & bDump,
     627                 :            :                              typereg::Reader& reader1,
     628                 :            :                              typereg::Reader& reader2,
     629                 :            :                              sal_uInt16 index1,
     630                 :            :                              sal_uInt16 index2,
     631                 :            :                              verbosity_t const eVerbosity)
     632                 :            : {
     633                 :      10342 :     sal_uInt32 nError = 0;
     634 [ +  - ][ +  + ]:      10342 :     if ( reader1.getFieldName(index1) != reader2.getFieldName(index2) )
     635                 :            :     {
     636 [ +  - ][ -  + ]:      10104 :         if (options.forceOutput() && (REPORT == eVerbosity))
                 [ -  + ]
     637                 :            :         {
     638                 :          0 :             dumpTypeClass (bDump, typeClass, keyName);
     639                 :            :             fprintf(stdout, "  Field %d: Name1 = %s  !=  Name2 = %s\n", index1,
     640 [ #  # ][ #  # ]:          0 :                     U2S(reader1.getFieldName(index1)), U2S(reader2.getFieldName(index2)));
         [ #  # ][ #  # ]
     641                 :            :         }
     642                 :      10104 :         nError++;
     643                 :            :     }
     644 [ +  - ][ +  + ]:      10342 :     if ( reader1.getFieldTypeName(index1) != reader2.getFieldTypeName(index2) )
     645                 :            :     {
     646 [ +  - ][ -  + ]:       8378 :         if (options.forceOutput() && (REPORT == eVerbosity))
                 [ -  + ]
     647                 :            :         {
     648                 :          0 :             dumpTypeClass (bDump, typeClass, keyName);
     649                 :            :             fprintf(stdout, "  Field %d: Type1 = %s  !=  Type2 = %s\n", index1,
     650 [ #  # ][ #  # ]:          0 :                     U2S(reader1.getFieldTypeName(index1)), U2S(reader2.getFieldTypeName(index2)));
         [ #  # ][ #  # ]
     651                 :            :         }
     652                 :       8378 :         nError++;
     653                 :            :     }
     654                 :            :     else
     655                 :            :     {
     656         [ +  - ]:       1964 :         RTConstValue constValue1 = reader1.getFieldValue(index1);
     657         [ +  - ]:       1964 :         RTConstValue constValue2 = reader2.getFieldValue(index2);
     658         [ -  + ]:       1964 :         if ( constValue1.m_type != constValue2.m_type )
     659                 :            :         {
     660 [ #  # ][ #  # ]:          0 :             if (options.forceOutput() && (REPORT == eVerbosity))
                 [ #  # ]
     661                 :            :             {
     662         [ #  # ]:          0 :                 dumpTypeClass (bDump, typeClass, keyName);
     663                 :            :                 fprintf(stdout, "  Field %d: Access1 = %s  !=  Access2 = %s\n", index1,
     664         [ #  # ]:          0 :                         getConstValueType(constValue1), getConstValueType(constValue2));
     665         [ #  # ]:          0 :                 fprintf(stdout, "  Field %d: Value1 = ", index1);
     666         [ #  # ]:          0 :                 printConstValue(constValue1);
     667         [ #  # ]:          0 :                 fprintf(stdout, "  !=  Value2 = ");
     668         [ #  # ]:          0 :                 printConstValue(constValue1);
     669         [ #  # ]:          0 :                 fprintf(stdout, "\n;");
     670                 :            :             }
     671                 :          0 :             nError++;
     672                 :            :         }
     673                 :            :         else
     674                 :            :         {
     675         [ +  - ]:       1964 :             nError += checkConstValue(options, keyName, typeClass, bDump, constValue1, constValue2, index1);
     676                 :       1964 :         }
     677                 :            :     }
     678                 :            : 
     679         [ +  + ]:      10342 :     if ( reader1.getFieldFlags(index1) != reader2.getFieldFlags(index2) )
     680                 :            :     {
     681 [ +  - ][ -  + ]:       6868 :         if (options.forceOutput() && (REPORT == eVerbosity))
                 [ -  + ]
     682                 :            :         {
     683                 :          0 :             dumpTypeClass (bDump, typeClass, keyName);
     684                 :            :             fprintf(stdout, "  Field %d: FieldAccess1 = %s  !=  FieldAccess2 = %s\n", index1,
     685                 :          0 :                     getFieldAccess(reader1.getFieldFlags(index1)).getStr(),
     686 [ #  # ][ #  # ]:          0 :                     getFieldAccess(reader1.getFieldFlags(index2)).getStr());
     687                 :            :         }
     688                 :       6868 :         nError++;
     689                 :            :     }
     690                 :            : 
     691 [ -  + ][ #  # ]:      10342 :     if ( options.fullCheck() && (reader1.getFieldDocumentation(index1) != reader2.getFieldDocumentation(index2)) )
         [ #  # ][ #  # ]
         [ -  + ][ -  + ]
           [ -  +  #  #  
                   #  # ]
     692                 :            :     {
     693 [ #  # ][ #  # ]:          0 :         if (options.forceOutput() && (REPORT == eVerbosity))
                 [ #  # ]
     694                 :            :         {
     695                 :          0 :             dumpTypeClass (bDump, typeClass, keyName);
     696                 :            :             fprintf(stdout, "  Field %d: Doku1 = %s\n             Doku2 = %s\n", index1,
     697 [ #  # ][ #  # ]:          0 :                     U2S(reader1.getFieldDocumentation(index1)), U2S(reader2.getFieldDocumentation(index2)));
         [ #  # ][ #  # ]
     698                 :            :         }
     699                 :          0 :         nError++;
     700                 :            :     }
     701                 :      10342 :     return nError;
     702                 :            : }
     703                 :            : 
     704                 :          0 : static char const * getMethodMode(RTMethodMode methodMode)
     705                 :            : {
     706   [ #  #  #  #  :          0 :     switch ( methodMode )
                      # ]
     707                 :            :     {
     708                 :            :         case RT_MODE_ONEWAY:
     709                 :          0 :             return "ONEWAY";
     710                 :            :         case RT_MODE_ONEWAY_CONST:
     711                 :          0 :             return "ONEWAY,CONST";
     712                 :            :         case RT_MODE_TWOWAY:
     713                 :          0 :             return "NONE";
     714                 :            :         case RT_MODE_TWOWAY_CONST:
     715                 :          0 :             return "CONST";
     716                 :            :         default:
     717                 :          0 :             return "INVALID";
     718                 :            :     }
     719                 :            : }
     720                 :            : 
     721                 :          0 : static char const * getParamMode(RTParamMode paramMode)
     722                 :            : {
     723   [ #  #  #  # ]:          0 :     switch ( paramMode )
     724                 :            :     {
     725                 :            :         case RT_PARAM_IN:
     726                 :          0 :             return "IN";
     727                 :            :         case RT_PARAM_OUT:
     728                 :          0 :             return "OUT";
     729                 :            :         case RT_PARAM_INOUT:
     730                 :          0 :             return "INOUT";
     731                 :            :         default:
     732                 :          0 :             return "INVALID";
     733                 :            :     }
     734                 :            : }
     735                 :            : 
     736                 :          0 : static sal_uInt32 checkMethod(Options_Impl const & options,
     737                 :            :                               const OUString& keyName,
     738                 :            :                               RTTypeClass typeClass,
     739                 :            :                               sal_Bool & bDump,
     740                 :            :                               typereg::Reader& reader1,
     741                 :            :                               typereg::Reader& reader2,
     742                 :            :                               sal_uInt16 index)
     743                 :            : {
     744                 :          0 :     sal_uInt32 nError = 0;
     745 [ #  # ][ #  # ]:          0 :     if ( reader1.getMethodName(index) != reader2.getMethodName(index) )
     746                 :            :     {
     747         [ #  # ]:          0 :         if ( options.forceOutput() )
     748                 :            :         {
     749                 :          0 :             dumpTypeClass (bDump, typeClass, keyName);
     750                 :            :             fprintf(stdout, "  Method1 %d: Name1 = %s  !=  Name2 = %s\n", index,
     751                 :            :                     U2S(reader1.getMethodName(index)),
     752 [ #  # ][ #  # ]:          0 :                     U2S(reader2.getMethodName(index)));
         [ #  # ][ #  # ]
     753                 :            :         }
     754                 :          0 :         nError++;
     755                 :            :     }
     756                 :            : 
     757 [ #  # ][ #  # ]:          0 :     if ( reader1.getMethodReturnTypeName(index) != reader2.getMethodReturnTypeName(index) )
     758                 :            :     {
     759         [ #  # ]:          0 :         if ( options.forceOutput() )
     760                 :            :         {
     761                 :          0 :             dumpTypeClass (bDump, typeClass, keyName);
     762                 :            :             fprintf(stdout, "  Method1 %d: ReturnType1 = %s  !=  ReturnType2 = %s\n", index,
     763                 :            :                     U2S(reader1.getMethodReturnTypeName(index)),
     764 [ #  # ][ #  # ]:          0 :                     U2S(reader2.getMethodReturnTypeName(index)));
         [ #  # ][ #  # ]
     765                 :            :         }
     766                 :          0 :         nError++;
     767                 :            :     }
     768                 :            : 
     769                 :          0 :     sal_uInt16 nParams1 = (sal_uInt16)reader1.getMethodParameterCount(index);
     770                 :          0 :     sal_uInt16 nParams2 = (sal_uInt16)reader2.getMethodParameterCount(index);
     771         [ #  # ]:          0 :     if ( nParams1 != nParams2 )
     772                 :            :     {
     773         [ #  # ]:          0 :         if ( options.forceOutput() )
     774                 :            :         {
     775                 :          0 :             dumpTypeClass (bDump, typeClass, keyName);
     776                 :          0 :             fprintf(stdout, "  Method %d : nParameters1 = %d  !=  nParameters2 = %d\n", index, nParams1, nParams2);
     777                 :            :         }
     778                 :          0 :         nError++;
     779                 :            :     }
     780                 :          0 :     sal_uInt16 i=0;
     781 [ #  # ][ #  # ]:          0 :     for (i=0; i < nParams1 && i < nParams2; i++)
                 [ #  # ]
     782                 :            :     {
     783 [ #  # ][ #  # ]:          0 :         if ( reader1.getMethodParameterTypeName(index, i) != reader2.getMethodParameterTypeName(index, i) )
     784                 :            :         {
     785         [ #  # ]:          0 :             if ( options.forceOutput() )
     786                 :            :             {
     787                 :          0 :                 dumpTypeClass (bDump, typeClass, keyName);
     788                 :            :                 fprintf(stdout, "  Method %d, Parameter %d: Type1 = %s  !=  Type2 = %s\n", index, i,
     789                 :            :                         U2S(reader1.getMethodParameterTypeName(index, i)),
     790 [ #  # ][ #  # ]:          0 :                         U2S(reader2.getMethodParameterTypeName(index, i)));
         [ #  # ][ #  # ]
     791                 :            :             }
     792                 :          0 :             nError++;
     793                 :            :         }
     794 [ #  # ][ #  # ]:          0 :         if ( options.fullCheck() && (reader1.getMethodParameterName(index, i) != reader2.getMethodParameterName(index, i)) )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
           [ #  #  #  #  
                   #  # ]
     795                 :            :         {
     796         [ #  # ]:          0 :             if ( options.forceOutput() )
     797                 :            :             {
     798                 :          0 :                 dumpTypeClass (bDump, typeClass, keyName);
     799                 :            :                 fprintf(stdout, "  Method %d, Parameter %d: Name1 = %s  !=  Name2 = %s\n", index, i,
     800                 :            :                         U2S(reader1.getMethodParameterName(index, i)),
     801 [ #  # ][ #  # ]:          0 :                         U2S(reader2.getMethodParameterName(index, i)));
         [ #  # ][ #  # ]
     802                 :            :             }
     803                 :          0 :             nError++;
     804                 :            :         }
     805         [ #  # ]:          0 :         if ( reader1.getMethodParameterFlags(index, i) != reader2.getMethodParameterFlags(index, i) )
     806                 :            :         {
     807         [ #  # ]:          0 :             if ( options.forceOutput() )
     808                 :            :             {
     809                 :          0 :                 dumpTypeClass (bDump, typeClass, keyName);
     810                 :            :                 fprintf(stdout, "  Method %d, Parameter %d: Mode1 = %s  !=  Mode2 = %s\n", index, i,
     811                 :            :                         getParamMode(reader1.getMethodParameterFlags(index, i)),
     812                 :          0 :                         getParamMode(reader2.getMethodParameterFlags(index, i)));
     813                 :            :             }
     814                 :          0 :             nError++;
     815                 :            :         }
     816                 :            :     }
     817 [ #  # ][ #  # ]:          0 :     if ( i < nParams1 && options.forceOutput() )
                 [ #  # ]
     818                 :            :     {
     819                 :          0 :         dumpTypeClass (bDump, typeClass, keyName);
     820                 :          0 :         fprintf(stdout, "  Registry1: Method %d contains %d more parameters\n", index, nParams1 - i);
     821                 :            :     }
     822 [ #  # ][ #  # ]:          0 :     if ( i < nParams2 && options.forceOutput() )
                 [ #  # ]
     823                 :            :     {
     824                 :          0 :         dumpTypeClass (bDump, typeClass, keyName);
     825                 :          0 :         fprintf(stdout, "  Registry2: Method %d contains %d more parameters\n", index, nParams2 - i);
     826                 :            :     }
     827                 :            : 
     828                 :          0 :     sal_uInt16 nExcep1 = (sal_uInt16)reader1.getMethodExceptionCount(index);
     829                 :          0 :     sal_uInt16 nExcep2 = (sal_uInt16)reader2.getMethodExceptionCount(index);
     830         [ #  # ]:          0 :     if ( nExcep1 != nExcep2 )
     831                 :            :     {
     832         [ #  # ]:          0 :         if ( options.forceOutput() )
     833                 :            :         {
     834                 :          0 :             dumpTypeClass (bDump, typeClass, keyName);
     835                 :          0 :             fprintf(stdout, "  nExceptions1 = %d  !=  nExceptions2 = %d\n", nExcep1, nExcep2);
     836                 :            :         }
     837                 :          0 :         nError++;
     838                 :            :     }
     839 [ #  # ][ #  # ]:          0 :     for (i=0; i < nExcep1 && i < nExcep2; i++)
                 [ #  # ]
     840                 :            :     {
     841 [ #  # ][ #  # ]:          0 :         if ( reader1.getMethodExceptionTypeName(index, i) != reader2.getMethodExceptionTypeName(index, i) )
     842                 :            :         {
     843         [ #  # ]:          0 :             if ( options.forceOutput() )
     844                 :            :             {
     845                 :          0 :                 dumpTypeClass (bDump, typeClass, keyName);
     846                 :            :                 fprintf(stdout, "  Method %d, Exception %d: Name1 = %s  !=  Name2 = %s\n", index, i,
     847                 :            :                         U2S(reader1.getMethodExceptionTypeName(index, i)),
     848 [ #  # ][ #  # ]:          0 :                         U2S(reader2.getMethodExceptionTypeName(index, i)));
         [ #  # ][ #  # ]
     849                 :            :             }
     850                 :          0 :             nError++;
     851                 :            :         }
     852                 :            :     }
     853 [ #  # ][ #  # ]:          0 :     if ( i < nExcep1 && options.forceOutput() )
                 [ #  # ]
     854                 :            :     {
     855                 :          0 :         dumpTypeClass (bDump, typeClass, keyName);
     856                 :          0 :         fprintf(stdout, "  Registry1: Method %d contains %d more exceptions\n", index, nExcep1 - i);
     857                 :            :     }
     858 [ #  # ][ #  # ]:          0 :     if ( i < nExcep2 && options.forceOutput() )
                 [ #  # ]
     859                 :            :     {
     860                 :          0 :         dumpTypeClass (bDump, typeClass, keyName);
     861                 :          0 :         fprintf(stdout, "  Registry2: Method %d contains %d more exceptions\n", index, nExcep2 - i);
     862                 :            :     }
     863                 :            : 
     864         [ #  # ]:          0 :     if ( reader1.getMethodFlags(index) != reader2.getMethodFlags(index) )
     865                 :            :     {
     866         [ #  # ]:          0 :         if ( options.forceOutput() )
     867                 :            :         {
     868                 :          0 :             dumpTypeClass (bDump, typeClass, keyName);
     869                 :            :             fprintf(stdout, "  Method %d: Mode1 = %s  !=  Mode2 = %s\n", index,
     870                 :            :                     getMethodMode(reader1.getMethodFlags(index)),
     871                 :          0 :                     getMethodMode(reader2.getMethodFlags(index)));
     872                 :            :         }
     873                 :          0 :         nError++;
     874                 :            :     }
     875                 :            : 
     876 [ #  # ][ #  # ]:          0 :     if ( options.fullCheck() && (reader1.getMethodDocumentation(index) != reader2.getMethodDocumentation(index)) )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
           [ #  #  #  #  
                   #  # ]
     877                 :            :     {
     878         [ #  # ]:          0 :         if ( options.forceOutput() )
     879                 :            :         {
     880                 :          0 :             dumpTypeClass (bDump, typeClass, keyName);
     881                 :            :             fprintf(stdout, "  Method %d: Doku1 = %s\n              Doku2 = %s\n", index,
     882                 :            :                     U2S(reader1.getMethodDocumentation(index)),
     883 [ #  # ][ #  # ]:          0 :                     U2S(reader2.getMethodDocumentation(index)));
         [ #  # ][ #  # ]
     884                 :            :         }
     885                 :          0 :         nError++;
     886                 :            :     }
     887                 :          0 :     return nError;
     888                 :            : }
     889                 :            : 
     890                 :          0 : static char const * getReferenceType(RTReferenceType refType)
     891                 :            : {
     892   [ #  #  #  #  :          0 :     switch (refType)
                      # ]
     893                 :            :     {
     894                 :            :         case RT_REF_SUPPORTS:
     895                 :          0 :             return "RT_REF_SUPPORTS";
     896                 :            :         case RT_REF_OBSERVES:
     897                 :          0 :             return "RT_REF_OBSERVES";
     898                 :            :         case RT_REF_EXPORTS:
     899                 :          0 :             return "RT_REF_EXPORTS";
     900                 :            :         case RT_REF_NEEDS:
     901                 :          0 :             return "RT_REF_NEEDS";
     902                 :            :         default:
     903                 :          0 :             return "RT_REF_INVALID";
     904                 :            :     }
     905                 :            : }
     906                 :            : 
     907                 :          2 : static sal_uInt32 checkReference(Options_Impl const & options,
     908                 :            :                                  const OUString& keyName,
     909                 :            :                                  RTTypeClass typeClass,
     910                 :            :                                  sal_Bool & bDump,
     911                 :            :                                  typereg::Reader& reader1,
     912                 :            :                                     typereg::Reader& reader2,
     913                 :            :                                     sal_uInt16 index1,
     914                 :            :                                  sal_uInt16 index2)
     915                 :            : {
     916                 :          2 :     sal_uInt32 nError = 0;
     917 [ +  - ][ -  + ]:          2 :     if ( reader1.getReferenceTypeName(index1) != reader2.getReferenceTypeName(index2) )
     918                 :            :     {
     919 [ #  # ][ #  # ]:          0 :         if ( options.forceOutput() && !options.unoTypeCheck() )
                 [ #  # ]
     920                 :            :         {
     921                 :          0 :             dumpTypeClass (bDump, typeClass, keyName);
     922                 :            :             fprintf(stdout, "  Reference %d: Name1 = %s  !=  Name2 = %s\n", index1,
     923                 :            :                     U2S(reader1.getReferenceTypeName(index1)),
     924 [ #  # ][ #  # ]:          0 :                     U2S(reader2.getReferenceTypeName(index2)));
         [ #  # ][ #  # ]
     925                 :            :         }
     926                 :          0 :         nError++;
     927                 :            :     }
     928 [ +  - ][ -  + ]:          2 :     if ( reader1.getReferenceTypeName(index1) != reader2.getReferenceTypeName(index2) )
     929                 :            :     {
     930 [ #  # ][ #  # ]:          0 :         if ( options.forceOutput() && !options.unoTypeCheck() )
                 [ #  # ]
     931                 :            :         {
     932                 :          0 :             dumpTypeClass (bDump, typeClass, keyName);
     933                 :            :             fprintf(stdout, "  Reference %d: Type1 = %s  !=  Type2 = %s\n", index1,
     934                 :            :                     getReferenceType(reader1.getReferenceSort(index1)),
     935                 :          0 :                     getReferenceType(reader2.getReferenceSort(index2)));
     936                 :            :         }
     937                 :          0 :         nError++;
     938                 :            :     }
     939 [ -  + ][ #  # ]:          2 :     if ( options.fullCheck() && (reader1.getReferenceDocumentation(index1) != reader2.getReferenceDocumentation(index2)) )
         [ #  # ][ #  # ]
         [ -  + ][ -  + ]
           [ -  +  #  #  
                   #  # ]
     940                 :            :     {
     941 [ #  # ][ #  # ]:          0 :         if ( options.forceOutput() && !options.unoTypeCheck() )
                 [ #  # ]
     942                 :            :         {
     943                 :          0 :             dumpTypeClass (bDump, typeClass, keyName);
     944                 :            :             fprintf(stdout, "  Reference %d: Doku1 = %s\n                 Doku2 = %s\n", index1,
     945                 :            :                     U2S(reader1.getReferenceDocumentation(index1)),
     946 [ #  # ][ #  # ]:          0 :                     U2S(reader2.getReferenceDocumentation(index2)));
         [ #  # ][ #  # ]
     947                 :            :         }
     948                 :          0 :         nError++;
     949                 :            :     }
     950         [ -  + ]:          2 :     if ( reader1.getReferenceFlags(index1) != reader2.getReferenceFlags(index2) )
     951                 :            :     {
     952 [ #  # ][ #  # ]:          0 :         if ( options.forceOutput() && !options.unoTypeCheck() )
                 [ #  # ]
     953                 :            :         {
     954                 :          0 :             dumpTypeClass (bDump, typeClass, keyName);
     955                 :            :             fprintf(stdout, "  Reference %d: Access1 = %s  !=  Access2 = %s\n", index1,
     956                 :          0 :                     getFieldAccess(reader1.getReferenceFlags(index1)).getStr(),
     957 [ #  # ][ #  # ]:          0 :                     getFieldAccess(reader1.getReferenceFlags(index2)).getStr());
     958                 :            :         }
     959                 :          0 :         nError++;
     960                 :            :     }
     961                 :          2 :     return nError;
     962                 :            : }
     963                 :            : 
     964                 :          6 : static sal_uInt32 checkFieldsWithoutOrder(Options_Impl const & options,
     965                 :            :                                           const OUString& keyName,
     966                 :            :                                           RTTypeClass typeClass,
     967                 :            :                                           sal_Bool & bDump,
     968                 :            :                                           typereg::Reader& reader1,
     969                 :            :                                           typereg::Reader& reader2)
     970                 :            : {
     971                 :          6 :     sal_uInt32 nError = 0;
     972                 :            : 
     973                 :          6 :     sal_uInt16 nFields1 = (sal_uInt16)reader1.getFieldCount();
     974                 :          6 :     sal_uInt16 nFields2 = (sal_uInt16)reader2.getFieldCount();
     975                 :          6 :     sal_uInt16 i=0, j=0;
     976                 :            : 
     977         [ -  + ]:          6 :     if ( nFields1 > nFields2 )
     978                 :            :     {
     979         [ #  # ]:          0 :         if ( options.forceOutput() )
     980                 :            :         {
     981         [ #  # ]:          0 :             dumpTypeClass (bDump, typeClass, keyName);
     982                 :            :             fprintf(stdout, "  %s1 contains %d more properties as %s2\n",
     983         [ #  # ]:          0 :                     getTypeClass(typeClass), nFields1-nFields2, getTypeClass(typeClass));
     984                 :            :         }
     985                 :            :     }
     986                 :            : 
     987                 :          6 :     sal_Bool bFound = sal_False;
     988         [ +  - ]:          6 :     ::std::set< sal_uInt16 > moreProps;
     989                 :            : 
     990         [ +  + ]:        244 :     for (i=0; i < nFields1; i++)
     991                 :            :     {
     992         [ +  - ]:      10342 :         for (j=0; j < nFields2; j++)
     993                 :            :         {
     994 [ +  - ][ +  + ]:      10342 :             if (!checkField(options, keyName, typeClass, bDump, reader1, reader2, i, j, SILENT))
     995                 :            :             {
     996                 :        238 :                 bFound =  sal_True;
     997         [ +  - ]:        238 :                 moreProps.insert(j);
     998                 :        238 :                 break;
     999                 :            :             }
    1000                 :            :         }
    1001         [ -  + ]:        238 :         if (!bFound)
    1002                 :            :         {
    1003         [ #  # ]:          0 :             if (options.forceOutput())
    1004                 :            :             {
    1005         [ #  # ]:          0 :                 dumpTypeClass (bDump, typeClass, keyName);
    1006                 :            :                 fprintf(stdout, "  incompatible change: Field %d ('%s') of r1 is not longer a property of this %s in r2\n",
    1007 [ #  # ][ #  # ]:          0 :                         i, U2S(shortName(reader1.getFieldName(i))), getTypeClass(typeClass));
                 [ #  # ]
    1008                 :            :             }
    1009                 :          0 :             nError++;
    1010                 :            :         }
    1011                 :            :         else
    1012                 :            :         {
    1013                 :        238 :             bFound = sal_False;
    1014                 :            :         }
    1015                 :            :     }
    1016                 :            : 
    1017 [ +  - ][ +  - ]:          6 :     if ( typeClass == RT_TYPE_SERVICE && !moreProps.empty() )
                 [ +  - ]
    1018                 :            :     {
    1019         [ +  + ]:        254 :         for (j=0; j < nFields2; j++)
    1020                 :            :         {
    1021 [ +  - ][ +  - ]:        248 :             if ( moreProps.find(j) == moreProps.end() )
                 [ +  + ]
    1022                 :            :             {
    1023         [ -  + ]:         10 :                 if ( (reader2.getFieldFlags(j) & RT_ACCESS_OPTIONAL) != RT_ACCESS_OPTIONAL )
    1024                 :            :                 {
    1025         [ #  # ]:          0 :                     if ( options.forceOutput() )
    1026                 :            :                     {
    1027         [ #  # ]:          0 :                         dumpTypeClass (bDump, typeClass, keyName);
    1028                 :            :                         fprintf(stdout,
    1029                 :            :                                 "  incompatible change: Field %d ('%s') of r2 is a new property"
    1030                 :            :                                 " compared to this %s in r1 and is not 'optional'\n",
    1031 [ #  # ][ #  # ]:          0 :                                 j, U2S(shortName(reader2.getFieldName(j))), getTypeClass(typeClass));
                 [ #  # ]
    1032                 :            :                     }
    1033                 :          0 :                     nError++;
    1034                 :            :                 }
    1035                 :            :             }
    1036                 :            :         }
    1037                 :            :     }
    1038                 :            : 
    1039                 :          6 :     return nError;
    1040                 :            : }
    1041                 :            : 
    1042                 :         15 : static sal_uInt32 checkBlob(
    1043                 :            :     Options_Impl const & options,
    1044                 :            :     const OUString& keyName,
    1045                 :            :     typereg::Reader& reader1, sal_uInt32 size1,
    1046                 :            :     typereg::Reader& reader2, sal_uInt32 size2)
    1047                 :            : {
    1048                 :         15 :     sal_uInt32 nError = 0;
    1049                 :         15 :     sal_Bool bDump = sal_True;
    1050                 :            : 
    1051 [ -  + ][ #  # ]:         15 :     if ( options.fullCheck() && (size1 != size2) )
                 [ -  + ]
    1052                 :            :     {
    1053         [ #  # ]:          0 :         if ( options.forceOutput() )
    1054                 :            :         {
    1055                 :            :             fprintf(
    1056                 :            :                 stdout, "    Size1 = %lu    Size2 = %lu\n",
    1057                 :            :                 sal::static_int_cast< unsigned long >(size1),
    1058         [ #  # ]:          0 :                 sal::static_int_cast< unsigned long >(size2));
    1059                 :            :         }
    1060                 :            :     }
    1061         [ +  + ]:         15 :     if (reader1.isPublished())
    1062                 :            :     {
    1063         [ -  + ]:          6 :         if (!reader2.isPublished())
    1064                 :            :         {
    1065         [ #  # ]:          0 :             if (options.forceOutput())
    1066                 :            :             {
    1067         [ #  # ]:          0 :                 dumpTypeClass(bDump, /*"?"*/ reader1.getTypeClass(), keyName);
    1068         [ #  # ]:          0 :                 fprintf(stdout, "    published in 1 but unpublished in 2\n");
    1069                 :            :             }
    1070                 :          0 :             ++nError;
    1071                 :            :         }
    1072                 :            :     }
    1073         [ +  - ]:          9 :     else if (!options.checkUnpublished())
    1074                 :            :     {
    1075                 :          9 :         return nError;
    1076                 :            :     }
    1077         [ -  + ]:          6 :     if ( reader1.getTypeClass() != reader2.getTypeClass() )
    1078                 :            :     {
    1079         [ #  # ]:          0 :         if ( options.forceOutput() )
    1080                 :            :         {
    1081         [ #  # ]:          0 :             dumpTypeClass(bDump, /*"?"*/ reader1.getTypeClass(), keyName);
    1082                 :            :             fprintf(stdout, "    TypeClass1 = %s  !=  TypeClass2 = %s\n",
    1083                 :            :                     getTypeClass(reader1.getTypeClass()),
    1084         [ #  # ]:          0 :                     getTypeClass(reader2.getTypeClass()));
    1085                 :            :         }
    1086                 :          0 :         return ++nError;
    1087                 :            :     }
    1088                 :            : 
    1089                 :          6 :     RTTypeClass typeClass = reader1.getTypeClass();
    1090 [ +  - ][ -  + ]:          6 :     if ( reader1.getTypeName() != reader2.getTypeName() )
                 [ +  - ]
    1091                 :            :     {
    1092         [ #  # ]:          0 :         if ( options.forceOutput() )
    1093                 :            :         {
    1094         [ #  # ]:          0 :             dumpTypeClass(bDump, typeClass, keyName);
    1095                 :            :             fprintf(stdout, "    TypeName1 = %s  !=  TypeName2 = %s\n",
    1096 [ #  # ][ #  # ]:          0 :                     U2S(reader1.getTypeName()), U2S(reader2.getTypeName()));
         [ #  # ][ #  # ]
                 [ #  # ]
    1097                 :            :         }
    1098                 :          0 :         nError++;
    1099                 :            :     }
    1100 [ +  - ][ +  - ]:          6 :     if ( (typeClass == RT_TYPE_INTERFACE ||
                 [ -  + ]
    1101                 :            :           typeClass == RT_TYPE_STRUCT ||
    1102                 :            :           typeClass == RT_TYPE_EXCEPTION) )
    1103                 :            :     {
    1104         [ #  # ]:          0 :         if (reader1.getSuperTypeCount() != reader2.getSuperTypeCount())
    1105                 :            :         {
    1106         [ #  # ]:          0 :             dumpTypeClass(bDump, typeClass, keyName);
    1107                 :            :             fprintf(
    1108                 :            :                 stdout, "    SuperTypeCount1 = %d  !=  SuperTypeCount2 = %d\n",
    1109                 :          0 :                 static_cast< int >(reader1.getSuperTypeCount()),
    1110         [ #  # ]:          0 :                 static_cast< int >(reader2.getSuperTypeCount()));
    1111                 :          0 :             ++nError;
    1112                 :            :         } else
    1113                 :            :         {
    1114         [ #  # ]:          0 :             for (sal_Int16 i = 0; i < reader1.getSuperTypeCount(); ++i)
    1115                 :            :             {
    1116 [ #  # ][ #  # ]:          0 :                 if (reader1.getSuperTypeName(i) != reader2.getSuperTypeName(i))
                 [ #  # ]
    1117                 :            :                 {
    1118         [ #  # ]:          0 :                     if ( options.forceOutput() )
    1119                 :            :                     {
    1120         [ #  # ]:          0 :                         dumpTypeClass(bDump, typeClass, keyName);
    1121                 :            :                         fprintf(stdout, "    SuperTypeName1 = %s  !=  SuperTypeName2 = %s\n",
    1122 [ #  # ][ #  # ]:          0 :                                 U2S(reader1.getSuperTypeName(i)), U2S(reader2.getSuperTypeName(i)));
         [ #  # ][ #  # ]
                 [ #  # ]
    1123                 :            :                     }
    1124                 :          0 :                     nError++;
    1125                 :            :                 }
    1126                 :            :             }
    1127                 :            :         }
    1128                 :            :     }
    1129                 :            : 
    1130                 :          6 :     sal_uInt16 nFields1 = (sal_uInt16)reader1.getFieldCount();
    1131                 :          6 :     sal_uInt16 nFields2 = (sal_uInt16)reader2.getFieldCount();
    1132                 :          6 :     sal_Bool bCheckNormal = sal_True;
    1133                 :            : 
    1134         [ #  # ]:         12 :     if ( (typeClass == RT_TYPE_SERVICE ||
           [ #  #  +  - ]
         [ +  - ][ -  + ]
    1135                 :            :           typeClass == RT_TYPE_MODULE ||
    1136                 :          6 :           typeClass == RT_TYPE_CONSTANTS) && options.unoTypeCheck() )
    1137                 :            :     {
    1138                 :          6 :         bCheckNormal = sal_False;
    1139                 :            :     }
    1140                 :            : 
    1141         [ -  + ]:          6 :     if ( bCheckNormal )
    1142                 :            :     {
    1143         [ #  # ]:          0 :         if ( nFields1 != nFields2 )
    1144                 :            :         {
    1145         [ #  # ]:          0 :             if ( options.forceOutput() )
    1146                 :            :             {
    1147         [ #  # ]:          0 :                 dumpTypeClass(bDump, typeClass, keyName);
    1148         [ #  # ]:          0 :                 fprintf(stdout, "    nFields1 = %d  !=  nFields2 = %d\n", nFields1, nFields2);
    1149                 :            :             }
    1150                 :          0 :             nError++;
    1151                 :            :         }
    1152                 :            : 
    1153                 :            :         sal_uInt16 i;
    1154 [ #  # ][ #  # ]:          0 :         for (i=0; i < nFields1 && i < nFields2; i++)
                 [ #  # ]
    1155                 :            :         {
    1156         [ #  # ]:          0 :             nError += checkField(options, keyName, typeClass, bDump, reader1, reader2, i, i, REPORT);
    1157                 :            :         }
    1158 [ #  # ][ #  # ]:          0 :         if ( i < nFields1 && options.forceOutput() )
                 [ #  # ]
    1159                 :            :         {
    1160         [ #  # ]:          0 :             dumpTypeClass(bDump, typeClass, keyName);
    1161         [ #  # ]:          0 :             fprintf(stdout, "    Registry1 contains %d more fields\n", nFields1 - i);
    1162                 :            :         }
    1163 [ #  # ][ #  # ]:          0 :         if ( i < nFields2 && options.forceOutput() )
                 [ #  # ]
    1164                 :            :         {
    1165         [ #  # ]:          0 :             dumpTypeClass(bDump, typeClass, keyName);
    1166         [ #  # ]:          0 :             fprintf(stdout, "    Registry2 contains %d more fields\n", nFields2 - i);
    1167                 :            :         }
    1168                 :            :     }
    1169                 :            :     else
    1170                 :            :     {
    1171         [ +  - ]:          6 :         nError += checkFieldsWithoutOrder(options, keyName, typeClass, bDump, reader1, reader2);
    1172                 :            :     }
    1173                 :            : 
    1174         [ -  + ]:          6 :     if ( typeClass == RT_TYPE_INTERFACE )
    1175                 :            :     {
    1176                 :          0 :         sal_uInt16 nMethods1 = (sal_uInt16)reader1.getMethodCount();
    1177                 :          0 :         sal_uInt16 nMethods2 = (sal_uInt16)reader2.getMethodCount();
    1178         [ #  # ]:          0 :         if ( nMethods1 != nMethods2 )
    1179                 :            :         {
    1180         [ #  # ]:          0 :             if ( options.forceOutput() )
    1181                 :            :             {
    1182         [ #  # ]:          0 :                 dumpTypeClass(bDump, typeClass, keyName);
    1183         [ #  # ]:          0 :                 fprintf(stdout, "    nMethods1 = %d  !=  nMethods2 = %d\n", nMethods1, nMethods2);
    1184                 :            :             }
    1185                 :          0 :             nError++;
    1186                 :            :         }
    1187                 :            : 
    1188                 :            :         sal_uInt16 i;
    1189 [ #  # ][ #  # ]:          0 :         for (i=0; i < nMethods1 && i < nMethods2; i++)
                 [ #  # ]
    1190                 :            :         {
    1191         [ #  # ]:          0 :             nError += checkMethod(options, keyName, typeClass, bDump, reader1, reader2, i);
    1192                 :            :         }
    1193 [ #  # ][ #  # ]:          0 :         if ( i < nMethods1 && options.forceOutput() )
                 [ #  # ]
    1194                 :            :         {
    1195         [ #  # ]:          0 :             fprintf(stdout, "    Registry1 contains %d more methods\n", nMethods1 - i);
    1196                 :            :         }
    1197 [ #  # ][ #  # ]:          0 :         if ( i < nMethods2 && options.forceOutput() )
                 [ #  # ]
    1198                 :            :         {
    1199         [ #  # ]:          0 :             fprintf(stdout, "    Registry2 contains %d more methods\n", nMethods2 - i);
    1200                 :            :         }
    1201                 :            :     }
    1202         [ +  - ]:          6 :     if ( typeClass == RT_TYPE_SERVICE )
    1203                 :            :     {
    1204                 :          6 :         sal_uInt16 nReference1 = (sal_uInt16)reader1.getReferenceCount();
    1205                 :          6 :         sal_uInt16 nReference2 = (sal_uInt16)reader2.getReferenceCount();
    1206                 :            : 
    1207         [ +  - ]:          6 :         if ( !bCheckNormal )
    1208                 :            :         {
    1209                 :          6 :             sal_uInt16 i=0, j=0;
    1210                 :            : 
    1211         [ -  + ]:          6 :             if ( nReference1 > nReference2 )
    1212                 :            :             {
    1213         [ #  # ]:          0 :                 if ( options.forceOutput() )
    1214                 :            :                 {
    1215         [ #  # ]:          0 :                     dumpTypeClass(bDump, typeClass, keyName);
    1216                 :            :                     fprintf(stdout, "    service1 contains %d more references as service2\n",
    1217         [ #  # ]:          0 :                             nReference1-nReference2);
    1218                 :            :                 }
    1219                 :            :             }
    1220                 :            : 
    1221                 :          6 :             sal_Bool bFound = sal_False;
    1222         [ +  - ]:          6 :             ::std::set< sal_uInt16 > moreReferences;
    1223                 :            : 
    1224         [ +  + ]:          8 :             for (i=0; i < nReference1; i++)
    1225                 :            :             {
    1226         [ +  - ]:          2 :                 for (j=0; j < nReference2; j++)
    1227                 :            :                 {
    1228 [ +  - ][ +  - ]:          2 :                     if (!checkReference(options, keyName, typeClass, bDump, reader1, reader2, i, j))
    1229                 :            :                     {
    1230                 :          2 :                         bFound =  sal_True;
    1231         [ +  - ]:          2 :                         moreReferences.insert(j);
    1232                 :          2 :                         break;
    1233                 :            :                     }
    1234                 :            :                 }
    1235         [ -  + ]:          2 :                 if (!bFound)
    1236                 :            :                 {
    1237         [ #  # ]:          0 :                     if (options.forceOutput())
    1238                 :            :                     {
    1239         [ #  # ]:          0 :                         dumpTypeClass(bDump, typeClass, keyName);
    1240                 :            :                         fprintf(stdout,
    1241                 :            :                                 "  incompatible change: Reference %d ('%s') in 'r1' is not longer a reference"
    1242                 :            :                                 " of this service in 'r2'\n",
    1243 [ #  # ][ #  # ]:          0 :                                 i, U2S(shortName(reader1.getReferenceTypeName(i))));
                 [ #  # ]
    1244                 :            :                     }
    1245                 :          0 :                     nError++;
    1246                 :            :                 }
    1247                 :            :                 else
    1248                 :            :                 {
    1249                 :          2 :                     bFound = sal_False;
    1250                 :            :                 }
    1251                 :            :             }
    1252                 :            : 
    1253         [ +  + ]:          6 :             if ( !moreReferences.empty() )
    1254                 :            :             {
    1255         [ +  + ]:          4 :                 for (j=0; j < nReference2; j++)
    1256                 :            :                 {
    1257 [ +  - ][ +  - ]:          2 :                     if ( moreReferences.find(j) == moreReferences.end() )
                 [ -  + ]
    1258                 :            :                     {
    1259         [ #  # ]:          0 :                         if ( (reader2.getReferenceFlags(j) & RT_ACCESS_OPTIONAL) != RT_ACCESS_OPTIONAL )
    1260                 :            :                         {
    1261         [ #  # ]:          0 :                             if ( options.forceOutput() )
    1262                 :            :                             {
    1263         [ #  # ]:          0 :                                 dumpTypeClass(bDump, typeClass, keyName);
    1264                 :            :                                 fprintf(stdout,
    1265                 :            :                                         "  incompatible change: Reference %d ('%s') of r2 is a new reference"
    1266                 :            :                                         " compared to this service in r1 and is not 'optional'\n",
    1267 [ #  # ][ #  # ]:          0 :                                         j, U2S(shortName(reader2.getReferenceTypeName(j))));
                 [ #  # ]
    1268                 :            :                             }
    1269                 :          0 :                             nError++;
    1270                 :            :                         }
    1271                 :            :                     }
    1272                 :            :                 }
    1273                 :          6 :             }
    1274                 :            :         }
    1275                 :            :         else
    1276                 :            :         {
    1277         [ #  # ]:          0 :             if ( nReference1 != nReference2 )
    1278                 :            :             {
    1279         [ #  # ]:          0 :                 if ( options.forceOutput() )
    1280                 :            :                 {
    1281         [ #  # ]:          0 :                     dumpTypeClass(bDump, typeClass, keyName);
    1282         [ #  # ]:          0 :                     fprintf(stdout, "    nReferences1 = %d  !=  nReferences2 = %d\n", nReference1, nReference2);
    1283                 :            :                 }
    1284                 :          0 :                 nError++;
    1285                 :            :             }
    1286                 :            : 
    1287                 :            :             sal_uInt16 i;
    1288 [ #  # ][ #  # ]:          0 :             for (i=0; i < nReference1 && i < nReference2; i++)
                 [ #  # ]
    1289                 :            :             {
    1290         [ #  # ]:          0 :                 nError += checkReference(options, keyName, typeClass, bDump, reader1, reader2, i, i);
    1291                 :            :             }
    1292 [ #  # ][ #  # ]:          0 :             if ( i < nReference1 && options.forceOutput() )
                 [ #  # ]
    1293                 :            :             {
    1294         [ #  # ]:          0 :                 fprintf(stdout, "    Registry1 contains %d more references\n", nReference1 - i);
    1295                 :            :             }
    1296 [ #  # ][ #  # ]:          0 :             if ( i < nReference2 && options.forceOutput() )
                 [ #  # ]
    1297                 :            :             {
    1298         [ #  # ]:          0 :                 fprintf(stdout, "    Registry2 contains %d more references\n", nReference2 - i);
    1299                 :            :             }
    1300                 :            :         }
    1301                 :            :     }
    1302                 :            : 
    1303 [ -  + ][ #  # ]:          6 :     if ( options.fullCheck() && (reader1.getDocumentation() != reader2.getDocumentation()) )
         [ #  # ][ #  # ]
         [ -  + ][ -  + ]
           [ -  +  #  #  
                   #  # ]
    1304                 :            :     {
    1305         [ #  # ]:          0 :         if ( options.forceOutput() )
    1306                 :            :         {
    1307         [ #  # ]:          0 :             dumpTypeClass(bDump, typeClass, keyName);
    1308                 :            :             fprintf(stdout, "    Doku1 = %s\n    Doku2 = %s\n",
    1309 [ #  # ][ #  # ]:          0 :                     U2S(reader1.getDocumentation()), U2S(reader2.getDocumentation()));
         [ #  # ][ #  # ]
                 [ #  # ]
    1310                 :            :         }
    1311                 :          0 :         nError++;
    1312                 :            :     }
    1313                 :         15 :     return nError;
    1314                 :            : }
    1315                 :            : 
    1316                 :       8768 : static sal_uInt32 checkValueDifference(
    1317                 :            :     Options_Impl const & options,
    1318                 :            :     RegistryKey& key1, RegValueType valueType1, sal_uInt32 size1,
    1319                 :            :     RegistryKey& key2, RegValueType valueType2, sal_uInt32 size2)
    1320                 :            : {
    1321                 :       8768 :     OUString tmpName;
    1322                 :       8768 :     sal_uInt32 nError = 0;
    1323                 :            : 
    1324         [ +  - ]:       8768 :     if ( valueType1 == valueType2 )
    1325                 :            :     {
    1326                 :       8768 :         sal_Bool bEqual = sal_True;
    1327   [ -  -  -  + ]:       8768 :         switch (valueType1)
    1328                 :            :         {
    1329                 :            :         case RG_VALUETYPE_LONGLIST:
    1330                 :            :             {
    1331         [ #  # ]:          0 :                 RegistryValueList<sal_Int32> valueList1;
    1332         [ #  # ]:          0 :                 RegistryValueList<sal_Int32> valueList2;
    1333         [ #  # ]:          0 :                 key1.getLongListValue(tmpName, valueList1);
    1334         [ #  # ]:          0 :                 key2.getLongListValue(tmpName, valueList2);
    1335                 :          0 :                 sal_uInt32 length1 = valueList1.getLength();
    1336                 :          0 :                 sal_uInt32 length2 = valueList1.getLength();
    1337         [ #  # ]:          0 :                 if ( length1 != length2 )
    1338                 :            :                 {
    1339                 :          0 :                     bEqual = sal_False;
    1340                 :            :                     break;
    1341                 :            :                 }
    1342         [ #  # ]:          0 :                 for (sal_uInt32 i=0; i<length1; i++)
    1343                 :            :                 {
    1344         [ #  # ]:          0 :                     if ( valueList1.getElement(i) != valueList2.getElement(i) )
    1345                 :            :                     {
    1346                 :          0 :                         bEqual = sal_False;
    1347                 :          0 :                         break;
    1348                 :            :                     }
    1349 [ #  # ][ #  # ]:          0 :                 }
         [ #  # ][ #  # ]
    1350                 :            :             }
    1351                 :          0 :             break;
    1352                 :            :         case RG_VALUETYPE_STRINGLIST:
    1353                 :            :             {
    1354         [ #  # ]:          0 :                 RegistryValueList<sal_Char*> valueList1;
    1355         [ #  # ]:          0 :                 RegistryValueList<sal_Char*> valueList2;
    1356         [ #  # ]:          0 :                 key1.getStringListValue(tmpName, valueList1);
    1357         [ #  # ]:          0 :                 key2.getStringListValue(tmpName, valueList2);
    1358                 :          0 :                 sal_uInt32 length1 = valueList1.getLength();
    1359                 :          0 :                 sal_uInt32 length2 = valueList1.getLength();
    1360         [ #  # ]:          0 :                 if ( length1 != length2 )
    1361                 :            :                 {
    1362                 :          0 :                     bEqual = sal_False;
    1363                 :            :                     break;
    1364                 :            :                 }
    1365         [ #  # ]:          0 :                 for (sal_uInt32 i=0; i<length1; i++)
    1366                 :            :                 {
    1367         [ #  # ]:          0 :                     if ( strcmp(valueList1.getElement(i), valueList2.getElement(i)) != 0 )
    1368                 :            :                     {
    1369                 :          0 :                         bEqual = sal_False;
    1370                 :          0 :                         break;
    1371                 :            :                     }
    1372 [ #  # ][ #  # ]:          0 :                 }
         [ #  # ][ #  # ]
    1373                 :            :             }
    1374                 :          0 :             break;
    1375                 :            :         case RG_VALUETYPE_UNICODELIST:
    1376                 :            :             {
    1377         [ #  # ]:          0 :                 RegistryValueList<sal_Unicode*> valueList1;
    1378         [ #  # ]:          0 :                 RegistryValueList<sal_Unicode*> valueList2;
    1379         [ #  # ]:          0 :                 key1.getUnicodeListValue(tmpName, valueList1);
    1380         [ #  # ]:          0 :                 key2.getUnicodeListValue(tmpName, valueList2);
    1381                 :          0 :                 sal_uInt32 length1 = valueList1.getLength();
    1382                 :          0 :                 sal_uInt32 length2 = valueList1.getLength();
    1383         [ #  # ]:          0 :                 if ( length1 != length2 )
    1384                 :            :                 {
    1385                 :          0 :                     bEqual = sal_False;
    1386                 :            :                     break;
    1387                 :            :                 }
    1388         [ #  # ]:          0 :                 for (sal_uInt32 i=0; i<length1; i++)
    1389                 :            :                 {
    1390         [ #  # ]:          0 :                     if ( rtl_ustr_compare(valueList1.getElement(i), valueList2.getElement(i)) != 0 )
    1391                 :            :                     {
    1392                 :          0 :                         bEqual = sal_False;
    1393                 :          0 :                         break;
    1394                 :            :                     }
    1395 [ #  # ][ #  # ]:          0 :                 }
         [ #  # ][ #  # ]
    1396                 :            :             }
    1397                 :          0 :             break;
    1398                 :            :         default:
    1399                 :       8768 :             break;
    1400                 :            :         }
    1401                 :            : 
    1402         [ +  - ]:       8768 :         if ( bEqual)
    1403                 :            :         {
    1404         [ +  - ]:       8768 :             std::vector< sal_uInt8 > value1(size1);
    1405 [ +  - ][ +  - ]:       8768 :             key1.getValue(tmpName, &value1[0]);
    1406                 :            : 
    1407         [ +  - ]:       8768 :             std::vector< sal_uInt8 > value2(size2);
    1408 [ +  - ][ +  - ]:       8768 :             key2.getValue(tmpName, &value2[0]);
    1409                 :            : 
    1410 [ +  - ][ +  - ]:       8768 :             bEqual = (memcmp(&value1[0], &value2[0], value1.size()) == 0 );
    1411 [ +  + ][ +  - ]:       8768 :             if ( !bEqual && valueType1 == RG_VALUETYPE_BINARY && valueType2 == RG_VALUETYPE_BINARY )
                 [ +  - ]
    1412                 :            :             {
    1413 [ +  - ][ +  - ]:         15 :                 typereg::Reader reader1(&value1[0], value1.size(), false, TYPEREG_VERSION_1);
    1414 [ +  - ][ +  - ]:         15 :                 typereg::Reader reader2(&value2[0], value2.size(), false, TYPEREG_VERSION_1);
    1415 [ +  - ][ +  - ]:         15 :                 if ( reader1.isValid() && reader2.isValid() )
                 [ +  - ]
    1416                 :            :                 {
    1417 [ +  - ][ +  - ]:         15 :                     return checkBlob(options, key1.getName(), reader1, size1, reader2, size2);
    1418 [ +  - ][ -  + ]:         15 :                 }
    1419                 :            :             }
    1420         [ +  - ]:       8753 :             if ( bEqual )
    1421                 :            :             {
    1422                 :       8753 :                 return 0;
    1423                 :            :             }
    1424                 :            :             else
    1425                 :            :             {
    1426         [ #  # ]:          0 :                 if ( options.forceOutput() )
    1427                 :            :                 {
    1428 [ #  # ][ #  # ]:          0 :                     fprintf(stdout, "Difference: key values of key \"%s\" are different\n", U2S(key1.getName()));
                 [ #  # ]
    1429                 :            :                 }
    1430         [ +  - ]:       8768 :                 nError++;
    1431         [ -  + ]:      17536 :             }
    1432                 :            :         }
    1433                 :            :     }
    1434                 :            : 
    1435         [ #  # ]:          0 :     if ( options.forceOutput() )
    1436                 :            :     {
    1437   [ #  #  #  #  :          0 :         switch (valueType1)
             #  #  #  #  
                      # ]
    1438                 :            :         {
    1439                 :            :         case RG_VALUETYPE_NOT_DEFINED:
    1440         [ #  # ]:          0 :             fprintf(stdout, "    Registry 1: key has no value\n");
    1441                 :          0 :             break;
    1442                 :            :         case RG_VALUETYPE_LONG:
    1443                 :            :             {
    1444         [ #  # ]:          0 :                 std::vector< sal_uInt8 > value1(size1);
    1445 [ #  # ][ #  # ]:          0 :                 key1.getValue(tmpName, &value1[0]);
    1446                 :            : 
    1447         [ #  # ]:          0 :                 fprintf(stdout, "    Registry 1: Value: Type = RG_VALUETYPE_LONG\n");
    1448                 :            :                 fprintf(
    1449                 :            :                     stdout, "                       Size = %lu\n",
    1450         [ #  # ]:          0 :                     sal::static_int_cast< unsigned long >(size1));
    1451 [ #  # ][ #  # ]:          0 :                 fprintf(stdout, "                       Data = %p\n", &value1[0]);
    1452                 :            :             }
    1453                 :          0 :             break;
    1454                 :            :         case RG_VALUETYPE_STRING:
    1455                 :            :             {
    1456         [ #  # ]:          0 :                 std::vector< sal_uInt8 > value1(size1);
    1457 [ #  # ][ #  # ]:          0 :                 key1.getValue(tmpName, &value1[0]);
    1458                 :            : 
    1459         [ #  # ]:          0 :                 fprintf(stdout, "    Registry 1: Value: Type = RG_VALUETYPE_STRING\n");
    1460                 :            :                 fprintf(
    1461                 :            :                     stdout, "                       Size = %lu\n",
    1462         [ #  # ]:          0 :                     sal::static_int_cast< unsigned long >(size1));
    1463 [ #  # ][ #  # ]:          0 :                 fprintf(stdout, "                       Data = \"%s\"\n", reinterpret_cast<char const*>(&value1[0]));
    1464                 :            :             }
    1465                 :          0 :             break;
    1466                 :            :         case RG_VALUETYPE_UNICODE:
    1467                 :            :             {
    1468         [ #  # ]:          0 :                 std::vector< sal_uInt8 > value1(size1);
    1469 [ #  # ][ #  # ]:          0 :                 key1.getValue(tmpName, &value1[0]);
    1470                 :            : 
    1471         [ #  # ]:          0 :                 OUString uStrValue(reinterpret_cast<sal_Unicode const*>(&value1[0]));
    1472         [ #  # ]:          0 :                 fprintf(stdout, "    Registry 1: Value: Type = RG_VALUETYPE_UNICODE\n");
    1473                 :            :                 fprintf(
    1474                 :            :                     stdout, "                       Size = %lu\n",
    1475         [ #  # ]:          0 :                     sal::static_int_cast< unsigned long >(size1));
    1476 [ #  # ][ #  # ]:          0 :                 fprintf(stdout, "                       Data = \"%s\"\n", U2S(uStrValue));
    1477                 :            :             }
    1478                 :          0 :             break;
    1479                 :            :         case RG_VALUETYPE_BINARY:
    1480         [ #  # ]:          0 :             fprintf(stdout, "    Registry 1: Value: Type = RG_VALUETYPE_BINARY\n");
    1481                 :          0 :             break;
    1482                 :            :         case RG_VALUETYPE_LONGLIST:
    1483                 :            :             {
    1484         [ #  # ]:          0 :                 RegistryValueList<sal_Int32> valueList;
    1485         [ #  # ]:          0 :                 key1.getLongListValue(tmpName, valueList);
    1486         [ #  # ]:          0 :                 fprintf(stdout, "    Registry 1: Value: Type = RG_VALUETYPE_LONGLIST\n");
    1487                 :            :                 fprintf(
    1488                 :            :                     stdout, "                       Size = %lu\n",
    1489         [ #  # ]:          0 :                     sal::static_int_cast< unsigned long >(size1));
    1490                 :          0 :                 sal_uInt32 length = valueList.getLength();
    1491         [ #  # ]:          0 :                 for (sal_uInt32 i=0; i<length; i++)
    1492                 :            :                 {
    1493                 :            :                     fprintf(
    1494                 :            :                         stdout, "                       Data[%lu] = %ld\n",
    1495                 :            :                         sal::static_int_cast< unsigned long >(i),
    1496         [ #  # ]:          0 :                         sal::static_int_cast< long >(valueList.getElement(i)));
    1497         [ #  # ]:          0 :                 }
    1498                 :            :             }
    1499                 :          0 :             break;
    1500                 :            :         case RG_VALUETYPE_STRINGLIST:
    1501                 :            :             {
    1502         [ #  # ]:          0 :                 RegistryValueList<sal_Char*> valueList;
    1503         [ #  # ]:          0 :                 key1.getStringListValue(tmpName, valueList);
    1504         [ #  # ]:          0 :                 fprintf(stdout, "    Registry 1: Value: Type = RG_VALUETYPE_STRINGLIST\n");
    1505                 :            :                 fprintf(
    1506                 :            :                     stdout, "                       Size = %lu\n",
    1507         [ #  # ]:          0 :                     sal::static_int_cast< unsigned long >(size1));
    1508                 :          0 :                 sal_uInt32 length = valueList.getLength();
    1509         [ #  # ]:          0 :                 for (sal_uInt32 i=0; i<length; i++)
    1510                 :            :                 {
    1511                 :            :                     fprintf(
    1512                 :            :                         stdout, "                       Data[%lu] = \"%s\"\n",
    1513                 :            :                         sal::static_int_cast< unsigned long >(i),
    1514         [ #  # ]:          0 :                         valueList.getElement(i));
    1515         [ #  # ]:          0 :                 }
    1516                 :            :             }
    1517                 :          0 :             break;
    1518                 :            :         case RG_VALUETYPE_UNICODELIST:
    1519                 :            :             {
    1520         [ #  # ]:          0 :                 RegistryValueList<sal_Unicode*> valueList;
    1521         [ #  # ]:          0 :                 key1.getUnicodeListValue(tmpName, valueList);
    1522         [ #  # ]:          0 :                 fprintf(stdout, "    Registry 1: Value: Type = RG_VALUETYPE_UNICODELIST\n");
    1523                 :            :                 fprintf(
    1524                 :            :                     stdout, "                       Size = %lu\n",
    1525         [ #  # ]:          0 :                     sal::static_int_cast< unsigned long >(size1));
    1526                 :          0 :                 sal_uInt32 length = valueList.getLength();
    1527                 :          0 :                 OUString uStrValue;
    1528         [ #  # ]:          0 :                 for (sal_uInt32 i=0; i<length; i++)
    1529                 :            :                 {
    1530                 :          0 :                     uStrValue = OUString(valueList.getElement(i));
    1531                 :            :                     fprintf(
    1532                 :            :                         stdout, "                       Data[%lu] = \"%s\"\n",
    1533 [ #  # ][ #  # ]:          0 :                         sal::static_int_cast< unsigned long >(i), U2S(uStrValue));
    1534         [ #  # ]:          0 :                 }
    1535                 :            :             }
    1536                 :          0 :             break;
    1537                 :            :         }
    1538                 :            : 
    1539   [ #  #  #  #  :          0 :         switch (valueType2)
             #  #  #  #  
                      # ]
    1540                 :            :         {
    1541                 :            :         case RG_VALUETYPE_NOT_DEFINED:
    1542         [ #  # ]:          0 :             fprintf(stdout, "    Registry 2: key has no value\n");
    1543                 :          0 :             break;
    1544                 :            :         case RG_VALUETYPE_LONG:
    1545                 :            :             {
    1546         [ #  # ]:          0 :                 std::vector< sal_uInt8 > value2(size2);
    1547 [ #  # ][ #  # ]:          0 :                 key2.getValue(tmpName, &value2[0]);
    1548                 :            : 
    1549         [ #  # ]:          0 :                 fprintf(stdout, "    Registry 2: Value: Type = RG_VALUETYPE_LONG\n");
    1550                 :            :                 fprintf(
    1551                 :            :                     stdout, "                       Size = %lu\n",
    1552         [ #  # ]:          0 :                     sal::static_int_cast< unsigned long >(size2));
    1553 [ #  # ][ #  # ]:          0 :                 fprintf(stdout, "                       Data = %p\n", &value2[0]);
    1554                 :            :             }
    1555                 :          0 :             break;
    1556                 :            :         case RG_VALUETYPE_STRING:
    1557                 :            :             {
    1558         [ #  # ]:          0 :                 std::vector< sal_uInt8 > value2(size2);
    1559 [ #  # ][ #  # ]:          0 :                 key2.getValue(tmpName, &value2[0]);
    1560                 :            : 
    1561         [ #  # ]:          0 :                 fprintf(stdout, "    Registry 2: Value: Type = RG_VALUETYPE_STRING\n");
    1562                 :            :                 fprintf(
    1563                 :            :                     stdout, "                       Size = %lu\n",
    1564         [ #  # ]:          0 :                     sal::static_int_cast< unsigned long >(size2));
    1565 [ #  # ][ #  # ]:          0 :                 fprintf(stdout, "                       Data = \"%s\"\n", reinterpret_cast<char const*>(&value2[0]));
    1566                 :            :             }
    1567                 :          0 :             break;
    1568                 :            :         case RG_VALUETYPE_UNICODE:
    1569                 :            :             {
    1570         [ #  # ]:          0 :                 std::vector< sal_uInt8 > value2(size2);
    1571 [ #  # ][ #  # ]:          0 :                 key2.getValue(tmpName, &value2[0]);
    1572                 :            : 
    1573         [ #  # ]:          0 :                 OUString uStrValue(reinterpret_cast<sal_Unicode const*>(&value2[0]));
    1574         [ #  # ]:          0 :                 fprintf(stdout, "    Registry 2: Value: Type = RG_VALUETYPE_UNICODE\n");
    1575                 :            :                 fprintf(
    1576                 :            :                     stdout, "                       Size = %lu\n",
    1577         [ #  # ]:          0 :                     sal::static_int_cast< unsigned long >(size2));
    1578 [ #  # ][ #  # ]:          0 :                 fprintf(stdout, "                       Data = \"%s\"\n", U2S(uStrValue));
    1579                 :            :             }
    1580                 :          0 :             break;
    1581                 :            :         case RG_VALUETYPE_BINARY:
    1582         [ #  # ]:          0 :             fprintf(stdout, "    Registry 2: Value: Type = RG_VALUETYPE_BINARY\n");
    1583                 :          0 :             break;
    1584                 :            :         case RG_VALUETYPE_LONGLIST:
    1585                 :            :             {
    1586         [ #  # ]:          0 :                 RegistryValueList<sal_Int32> valueList;
    1587         [ #  # ]:          0 :                 key2.getLongListValue(tmpName, valueList);
    1588         [ #  # ]:          0 :                 fprintf(stdout, "    Registry 2: Value: Type = RG_VALUETYPE_LONGLIST\n");
    1589                 :            :                 fprintf(
    1590                 :            :                     stdout, "                       Size = %lu\n",
    1591         [ #  # ]:          0 :                     sal::static_int_cast< unsigned long >(size2));
    1592                 :          0 :                 sal_uInt32 length = valueList.getLength();
    1593         [ #  # ]:          0 :                 for (sal_uInt32 i=0; i<length; i++)
    1594                 :            :                 {
    1595                 :            :                     fprintf(
    1596                 :            :                         stdout, "                       Data[%lu] = %ld\n",
    1597                 :            :                         sal::static_int_cast< unsigned long >(i),
    1598         [ #  # ]:          0 :                         sal::static_int_cast< long >(valueList.getElement(i)));
    1599         [ #  # ]:          0 :                 }
    1600                 :            :             }
    1601                 :          0 :             break;
    1602                 :            :         case RG_VALUETYPE_STRINGLIST:
    1603                 :            :             {
    1604         [ #  # ]:          0 :                 RegistryValueList<sal_Char*> valueList;
    1605         [ #  # ]:          0 :                 key2.getStringListValue(tmpName, valueList);
    1606         [ #  # ]:          0 :                 fprintf(stdout, "    Registry 2: Value: Type = RG_VALUETYPE_STRINGLIST\n");
    1607                 :            :                 fprintf(
    1608                 :            :                     stdout, "                       Size = %lu\n",
    1609         [ #  # ]:          0 :                     sal::static_int_cast< unsigned long >(size2));
    1610                 :          0 :                 sal_uInt32 length = valueList.getLength();
    1611         [ #  # ]:          0 :                 for (sal_uInt32 i=0; i<length; i++)
    1612                 :            :                 {
    1613                 :            :                     fprintf(
    1614                 :            :                         stdout, "                       Data[%lu] = \"%s\"\n",
    1615                 :            :                         sal::static_int_cast< unsigned long >(i),
    1616         [ #  # ]:          0 :                         valueList.getElement(i));
    1617         [ #  # ]:          0 :                 }
    1618                 :            :             }
    1619                 :          0 :             break;
    1620                 :            :         case RG_VALUETYPE_UNICODELIST:
    1621                 :            :             {
    1622         [ #  # ]:          0 :                 RegistryValueList<sal_Unicode*> valueList;
    1623         [ #  # ]:          0 :                 key2.getUnicodeListValue(tmpName, valueList);
    1624         [ #  # ]:          0 :                 fprintf(stdout, "    Registry 2: Value: Type = RG_VALUETYPE_UNICODELIST\n");
    1625                 :            :                 fprintf(
    1626                 :            :                     stdout, "                       Size = %lu\n",
    1627         [ #  # ]:          0 :                     sal::static_int_cast< unsigned long >(size2));
    1628                 :          0 :                 sal_uInt32 length = valueList.getLength();
    1629                 :          0 :                 OUString uStrValue;
    1630         [ #  # ]:          0 :                 for (sal_uInt32 i=0; i<length; i++)
    1631                 :            :                 {
    1632                 :          0 :                     uStrValue = OUString(valueList.getElement(i));
    1633                 :            :                     fprintf(
    1634                 :            :                         stdout, "                       Data[%lu] = \"%s\"\n",
    1635 [ #  # ][ #  # ]:          0 :                         sal::static_int_cast< unsigned long >(i), U2S(uStrValue));
    1636         [ #  # ]:          0 :                 }
    1637                 :            :             }
    1638                 :          0 :             break;
    1639                 :            :         }
    1640                 :            :     }
    1641                 :       8768 :     return nError;
    1642                 :            : }
    1643                 :            : 
    1644                 :          0 : static bool hasPublishedChildren(Options_Impl const & options, RegistryKey & key)
    1645                 :            : {
    1646         [ #  # ]:          0 :     RegistryKeyNames subKeyNames;
    1647         [ #  # ]:          0 :     key.getKeyNames(rtl::OUString(), subKeyNames);
    1648         [ #  # ]:          0 :     for (sal_uInt32 i = 0; i < subKeyNames.getLength(); ++i)
    1649                 :            :     {
    1650                 :          0 :         rtl::OUString keyName(subKeyNames.getElement(i));
    1651 [ #  # ][ #  # ]:          0 :         if (!options.matchedWithExcludeKey(keyName))
    1652                 :            :         {
    1653                 :          0 :             keyName = keyName.copy(keyName.lastIndexOf('/') + 1);
    1654         [ #  # ]:          0 :             RegistryKey subKey;
    1655 [ #  # ][ #  # ]:          0 :             if (!key.openKey(keyName, subKey))
    1656                 :            :             {
    1657         [ #  # ]:          0 :                 if (options.forceOutput())
    1658                 :            :                 {
    1659                 :            :                     fprintf(
    1660                 :            :                         stdout,
    1661                 :            :                         ("WARNING: could not open key \"%s\" in registry"
    1662                 :            :                          " \"%s\"\n"),
    1663                 :            :                         U2S(subKeyNames.getElement(i)),
    1664 [ #  # ][ #  # ]:          0 :                         options.getRegName1().c_str());
    1665                 :            :                 }
    1666                 :            :             }
    1667         [ #  # ]:          0 :             if (subKey.isValid())
    1668                 :            :             {
    1669                 :            :                 RegValueType type;
    1670                 :            :                 sal_uInt32 size;
    1671 [ #  # ][ #  # ]:          0 :                 if (subKey.getValueInfo(rtl::OUString(), &type, &size) != REG_NO_ERROR)
    1672                 :            :                 {
    1673         [ #  # ]:          0 :                     if (options.forceOutput())
    1674                 :            :                     {
    1675                 :            :                         fprintf(
    1676                 :            :                             stdout,
    1677                 :            :                             ("WARNING: could not read key \"%s\" in registry"
    1678                 :            :                              " \"%s\"\n"),
    1679                 :            :                             U2S(subKeyNames.getElement(i)),
    1680 [ #  # ][ #  # ]:          0 :                             options.getRegName1().c_str());
    1681                 :            :                     }
    1682                 :            :                 }
    1683         [ #  # ]:          0 :                 else if (type == RG_VALUETYPE_BINARY)
    1684                 :            :                 {
    1685                 :          0 :                     bool published = false;
    1686         [ #  # ]:          0 :                     std::vector< sal_uInt8 > value(size);
    1687 [ #  # ][ #  # ]:          0 :                     if (subKey.getValue(rtl::OUString(), &value[0]) != REG_NO_ERROR)
                 [ #  # ]
    1688                 :            :                     {
    1689         [ #  # ]:          0 :                         if (options.forceOutput())
    1690                 :            :                         {
    1691                 :            :                             fprintf(
    1692                 :            :                                 stdout,
    1693                 :            :                                 ("WARNING: could not read key \"%s\" in"
    1694                 :            :                                  " registry \"%s\"\n"),
    1695                 :            :                                 U2S(subKeyNames.getElement(i)),
    1696 [ #  # ][ #  # ]:          0 :                                 options.getRegName1().c_str());
    1697                 :            :                         }
    1698                 :            :                     }
    1699                 :            :                     else
    1700                 :            :                     {
    1701 [ #  # ][ #  # ]:          0 :                         published = typereg::Reader(&value[0], value.size(), false, TYPEREG_VERSION_1).isPublished();
    1702                 :            :                     }
    1703         [ #  # ]:          0 :                     if (published)
    1704                 :            :                     {
    1705                 :          0 :                         return true;
    1706         [ #  # ]:          0 :                     }
    1707                 :            :                 }
    1708 [ #  # ][ #  # ]:          0 :             }
    1709                 :            :         }
    1710         [ #  # ]:          0 :     }
    1711         [ #  # ]:          0 :     return false;
    1712                 :            : }
    1713                 :            : 
    1714                 :       8772 : static sal_uInt32 checkDifferences(
    1715                 :            :     Options_Impl const & options,
    1716                 :            :     RegistryKey& key, StringSet& keys,
    1717                 :            :     RegistryKeyNames& subKeyNames1,
    1718                 :            :     RegistryKeyNames& subKeyNames2)
    1719                 :            : {
    1720                 :       8772 :     sal_uInt32 nError = 0;
    1721                 :       8772 :     sal_uInt32 length1 = subKeyNames1.getLength();
    1722                 :       8772 :     sal_uInt32 length2 = subKeyNames2.getLength();
    1723                 :            :     sal_uInt32 i,j;
    1724                 :            : 
    1725         [ +  + ]:      17542 :     for (i=0; i<length1; i++)
    1726                 :            :     {
    1727                 :       8770 :         sal_Bool bFound = sal_False;
    1728         [ +  - ]:     501764 :         for (j=0; j<length2; j++)
    1729                 :            :         {
    1730         [ +  + ]:     501764 :             if ( subKeyNames1.getElement(i) == subKeyNames2.getElement(j) )
    1731                 :            :             {
    1732                 :       8770 :                 bFound = sal_True;
    1733         [ +  - ]:       8770 :                 keys.insert(subKeyNames1.getElement(i));
    1734                 :       8770 :                 break;
    1735                 :            :             }
    1736                 :            :         }
    1737         [ -  + ]:       8770 :         if ( !bFound )
    1738                 :            :         {
    1739         [ #  # ]:          0 :             if ( options.fullCheck() )
    1740                 :            :             {
    1741         [ #  # ]:          0 :                 if ( options.forceOutput() )
    1742                 :            :                 {
    1743                 :            :                     fprintf(stdout, "EXISTENCE: key \"%s\" exists only in registry \"%s\"\n",
    1744 [ #  # ][ #  # ]:          0 :                             U2S(subKeyNames1.getElement(i)), options.getRegName1().c_str());
    1745                 :            :                 }
    1746                 :          0 :                 nError++;
    1747                 :            :             }
    1748                 :            :             else
    1749                 :            :             {
    1750                 :          0 :                 rtl::OUString keyName(subKeyNames1.getElement(i));
    1751 [ #  # ][ #  # ]:          0 :                 if (!options.matchedWithExcludeKey(keyName))
    1752                 :            :                 {
    1753                 :          0 :                     keyName = keyName.copy(keyName.lastIndexOf('/') + 1);
    1754         [ #  # ]:          0 :                     RegistryKey subKey;
    1755 [ #  # ][ #  # ]:          0 :                     if (key.openKey(keyName, subKey))
    1756                 :            :                     {
    1757         [ #  # ]:          0 :                         if (options.forceOutput())
    1758                 :            :                         {
    1759                 :            :                             fprintf(
    1760                 :            :                                 stdout,
    1761                 :            :                                 ("ERROR: could not open key \"%s\" in registry"
    1762                 :            :                                  " \"%s\"\n"),
    1763                 :            :                                 U2S(subKeyNames1.getElement(i)),
    1764 [ #  # ][ #  # ]:          0 :                                 options.getRegName1().c_str());
    1765                 :            :                         }
    1766                 :          0 :                         ++nError;
    1767                 :            :                     }
    1768         [ #  # ]:          0 :                     if (subKey.isValid())
    1769                 :            :                     {
    1770                 :            :                         RegValueType type;
    1771                 :            :                         sal_uInt32 size;
    1772 [ #  # ][ #  # ]:          0 :                         if (subKey.getValueInfo(rtl::OUString(), &type, &size) != REG_NO_ERROR)
    1773                 :            :                         {
    1774         [ #  # ]:          0 :                             if (options.forceOutput())
    1775                 :            :                             {
    1776                 :            :                                 fprintf(
    1777                 :            :                                     stdout,
    1778                 :            :                                     ("ERROR: could not read key \"%s\" in"
    1779                 :            :                                      " registry \"%s\"\n"),
    1780                 :            :                                     U2S(subKeyNames1.getElement(i)),
    1781 [ #  # ][ #  # ]:          0 :                                     options.getRegName1().c_str());
    1782                 :            :                             }
    1783                 :          0 :                             ++nError;
    1784                 :            :                         }
    1785         [ #  # ]:          0 :                         else if (type == RG_VALUETYPE_BINARY)
    1786                 :            :                         {
    1787         [ #  # ]:          0 :                             std::vector< sal_uInt8 > value(size);
    1788 [ #  # ][ #  # ]:          0 :                             if (subKey.getValue(rtl::OUString(), &value[0]) != REG_NO_ERROR)
                 [ #  # ]
    1789                 :            :                             {
    1790         [ #  # ]:          0 :                                 if (options.forceOutput())
    1791                 :            :                                 {
    1792                 :            :                                     fprintf(
    1793                 :            :                                         stdout,
    1794                 :            :                                         ("ERROR: could not read key \"%s\" in"
    1795                 :            :                                          " registry \"%s\"\n"),
    1796                 :            :                                         U2S(subKeyNames1.getElement(i)),
    1797 [ #  # ][ #  # ]:          0 :                                         options.getRegName1().c_str());
    1798                 :            :                                 }
    1799                 :          0 :                                 ++nError;
    1800                 :            :                             }
    1801                 :            :                             else
    1802                 :            :                             {
    1803 [ #  # ][ #  # ]:          0 :                                 typereg::Reader reader(&value[0], value.size(), false, TYPEREG_VERSION_1);
    1804         [ #  # ]:          0 :                                 if (reader.getTypeClass() == RT_TYPE_MODULE)
    1805                 :            :                                 {
    1806 [ #  # ][ #  # ]:          0 :                                     if (options.checkUnpublished() || hasPublishedChildren(options, subKey))
         [ #  # ][ #  # ]
    1807                 :            :                                     {
    1808         [ #  # ]:          0 :                                         if (options.forceOutput())
    1809                 :            :                                         {
    1810                 :            :                                             fprintf(
    1811                 :            :                                                 stdout,
    1812                 :            :                                                 ("EXISTENCE: module \"%s\""
    1813                 :            :                                                  " %sexists only in registry"
    1814                 :            :                                                  " 1\n"),
    1815                 :            :                                                 U2S(subKeyNames1.getElement(i)),
    1816                 :          0 :                                                 (options.checkUnpublished()
    1817                 :            :                                                  ? ""
    1818 [ #  # ][ #  # ]:          0 :                                                  : "with published children "));
                 [ #  # ]
    1819                 :            :                                         }
    1820                 :          0 :                                         ++nError;
    1821                 :            :                                     }
    1822                 :            :                                 }
    1823 [ #  # ][ #  # ]:          0 :                                 else if (options.checkUnpublished() || reader.isPublished())
                 [ #  # ]
    1824                 :            :                                 {
    1825         [ #  # ]:          0 :                                     if (options.forceOutput())
    1826                 :            :                                     {
    1827                 :            :                                         fprintf(
    1828                 :            :                                             stdout,
    1829                 :            :                                             ("EXISTENCE: %spublished key \"%s\""
    1830                 :            :                                              " exists only in registry 1\n"),
    1831                 :          0 :                                             reader.isPublished() ? "" : "un",
    1832 [ #  # ][ #  # ]:          0 :                                             U2S(subKeyNames1.getElement(i)));
                 [ #  # ]
    1833                 :            :                                     }
    1834                 :          0 :                                     ++nError;
    1835                 :          0 :                                 }
    1836                 :          0 :                             }
    1837                 :            :                         }
    1838         [ #  # ]:          0 :                     }
    1839                 :          0 :                 }
    1840                 :            :             }
    1841                 :            :         }
    1842                 :            :     }
    1843                 :            : 
    1844         [ +  + ]:      17544 :     for (i=0; i<length2; i++)
    1845                 :            :     {
    1846                 :       8772 :         sal_Bool bFound = sal_False;
    1847         [ +  + ]:     501870 :         for (j=0; j<length1; j++)
    1848                 :            :         {
    1849         [ +  + ]:     501868 :             if ( subKeyNames2.getElement(i) == subKeyNames1.getElement(j) )
    1850                 :            :             {
    1851                 :       8770 :                 bFound = sal_True;
    1852         [ +  - ]:       8770 :                 keys.insert(subKeyNames2.getElement(i));
    1853                 :       8770 :                 break;
    1854                 :            :             }
    1855                 :            :         }
    1856 [ +  + ][ -  + ]:       8772 :         if ( !bFound && options.fullCheck() )
                 [ -  + ]
    1857                 :            :         {
    1858         [ #  # ]:          0 :             if ( options.forceOutput() )
    1859                 :            :             {
    1860                 :            :                 fprintf(stdout, "EXISTENCE: key \"%s\" exists only in registry \"%s\"\n",
    1861 [ #  # ][ #  # ]:          0 :                         U2S(subKeyNames2.getElement(i)), options.getRegName2().c_str());
    1862                 :            :             }
    1863                 :          0 :             nError++;
    1864                 :            :         }
    1865                 :            :     }
    1866                 :       8772 :     return nError;
    1867                 :            : }
    1868                 :            : 
    1869                 :       8772 : static sal_uInt32 compareKeys(
    1870                 :            :     Options_Impl const & options,
    1871                 :            :     RegistryKey& key1,
    1872                 :            :     RegistryKey& key2)
    1873                 :            : {
    1874                 :       8772 :     sal_uInt32 nError = 0;
    1875                 :            : 
    1876                 :       8772 :     RegValueType valueType1 = RG_VALUETYPE_NOT_DEFINED;
    1877                 :       8772 :     RegValueType valueType2 = RG_VALUETYPE_NOT_DEFINED;
    1878                 :       8772 :     sal_uInt32 size1 = 0;
    1879                 :       8772 :     sal_uInt32 size2 = 0;
    1880                 :            : 
    1881                 :       8772 :     OUString tmpName;
    1882         [ +  - ]:       8772 :     RegError e1 = key1.getValueInfo(tmpName, &valueType1, &size1);
    1883         [ +  - ]:       8772 :     RegError e2 = key2.getValueInfo(tmpName, &valueType2, &size2);
    1884 [ +  - ][ +  - ]:       8772 :     if ( (e1 == e2) && (e1 != REG_VALUE_NOT_EXISTS) && (e1 != REG_INVALID_VALUE) )
                 [ +  + ]
    1885                 :            :     {
    1886         [ +  - ]:       8768 :         nError += checkValueDifference(options, key1, valueType1, size1, key2, valueType2, size2);
    1887                 :            :     }
    1888                 :            :     else
    1889                 :            :     {
    1890 [ +  - ][ -  + ]:          4 :         if ( (e1 != REG_INVALID_VALUE) || (e2 != REG_INVALID_VALUE) )
    1891                 :            :         {
    1892         [ #  # ]:          0 :             if ( options.forceOutput() )
    1893                 :            :             {
    1894 [ #  # ][ #  # ]:          0 :                 fprintf(stdout, "VALUES: key values of key \"%s\" are different\n", U2S(key1.getName()));
                 [ #  # ]
    1895                 :            :             }
    1896                 :          0 :             nError++;
    1897                 :            :         }
    1898                 :            :     }
    1899                 :            : 
    1900         [ +  - ]:       8772 :     RegistryKeyNames subKeyNames1;
    1901         [ +  - ]:       8772 :     RegistryKeyNames subKeyNames2;
    1902                 :            : 
    1903         [ +  - ]:       8772 :     key1.getKeyNames(tmpName, subKeyNames1);
    1904         [ +  - ]:       8772 :     key2.getKeyNames(tmpName, subKeyNames2);
    1905                 :            : 
    1906         [ +  - ]:       8772 :     StringSet keys;
    1907         [ +  - ]:       8772 :     nError += checkDifferences(options, key1, keys, subKeyNames1, subKeyNames2);
    1908                 :            : 
    1909                 :       8772 :     StringSet::iterator iter = keys.begin();
    1910                 :       8772 :     StringSet::iterator end = keys.end();
    1911                 :            : 
    1912         [ +  + ]:      17542 :     while ( iter !=  end )
    1913                 :            :     {
    1914                 :       8770 :         OUString keyName(*iter);
    1915 [ -  + ][ +  - ]:       8770 :         if ( options.matchedWithExcludeKey(keyName) )
    1916                 :            :         {
    1917                 :          0 :             ++iter;
    1918                 :          0 :             continue;
    1919                 :            :         }
    1920                 :            : 
    1921                 :       8770 :         sal_Int32 nPos = keyName.lastIndexOf( '/' );
    1922         [ +  - ]:       8770 :         keyName = keyName.copy( nPos != -1 ? nPos+1 : 0 );
    1923                 :            : 
    1924         [ +  - ]:       8770 :         RegistryKey subKey1;
    1925 [ +  - ][ -  + ]:       8770 :         if ( key1.openKey(keyName, subKey1) )
    1926                 :            :         {
    1927         [ #  # ]:          0 :             if ( options.forceOutput() )
    1928                 :            :             {
    1929                 :            :                 fprintf(stdout, "ERROR: could not open key \"%s\" in registry \"%s\"\n",
    1930 [ #  # ][ #  # ]:          0 :                         U2S(*iter), options.getRegName1().c_str());
    1931                 :            :             }
    1932                 :          0 :             nError++;
    1933                 :            :         }
    1934                 :            : 
    1935         [ +  - ]:       8770 :         RegistryKey subKey2;
    1936 [ +  - ][ -  + ]:       8770 :         if ( key2.openKey(keyName, subKey2) )
    1937                 :            :         {
    1938         [ #  # ]:          0 :             if ( options.forceOutput() )
    1939                 :            :             {
    1940                 :            :                 fprintf(stdout, "ERROR: could not open key \"%s\" in registry \"%s\"\n",
    1941 [ #  # ][ #  # ]:          0 :                         U2S(*iter), options.getRegName2().c_str());
    1942                 :            :             }
    1943                 :          0 :             nError++;
    1944                 :            :         }
    1945                 :            : 
    1946 [ +  - ][ +  - ]:       8770 :         if ( subKey1.isValid() && subKey2.isValid() )
                 [ +  - ]
    1947                 :            :         {
    1948         [ +  - ]:       8770 :             nError += compareKeys(options, subKey1, subKey2);
    1949                 :            :         }
    1950                 :       8770 :         ++iter;
    1951 [ +  - ][ +  - ]:       8770 :     }
                 [ +  - ]
    1952                 :            : 
    1953 [ +  - ][ +  - ]:       8772 :     return nError;
    1954                 :            : }
    1955                 :            : 
    1956                 :            : #if (defined UNX) || defined __MINGW32__
    1957                 :          2 : int main( int argc, char * argv[] )
    1958                 :            : #else
    1959                 :            : int _cdecl main( int argc, char * argv[] )
    1960                 :            : #endif
    1961                 :            : {
    1962         [ +  - ]:          2 :     std::vector< std::string > args;
    1963                 :            : 
    1964         [ +  - ]:          2 :     Options_Impl options(argv[0]);
    1965         [ +  + ]:         14 :     for (int i = 1; i < argc; i++)
    1966                 :            :     {
    1967 [ +  - ][ -  + ]:         12 :         if (!Options::checkArgument(args, argv[i], strlen(argv[i])))
    1968                 :            :         {
    1969                 :            :             // failure.
    1970         [ #  # ]:          0 :             options.printUsage();
    1971                 :          0 :             return (1);
    1972                 :            :         }
    1973                 :            :     }
    1974 [ +  - ][ -  + ]:          2 :     if (!options.initOptions(args))
    1975                 :            :     {
    1976                 :          0 :         return (1);
    1977                 :            :     }
    1978                 :            : 
    1979         [ +  - ]:          2 :     OUString regName1( convertToFileUrl(options.getRegName1().c_str(), options.getRegName1().size()) );
    1980         [ +  - ]:          2 :     OUString regName2( convertToFileUrl(options.getRegName2().c_str(), options.getRegName2().size()) );
    1981                 :            : 
    1982 [ +  - ][ +  - ]:          2 :     Registry reg1, reg2;
    1983 [ +  - ][ -  + ]:          2 :     if ( reg1.open(regName1, REG_READONLY) )
    1984                 :            :     {
    1985                 :            :         fprintf(stdout, "%s: open registry \"%s\" failed\n",
    1986         [ #  # ]:          0 :                 options.getProgramName().c_str(), options.getRegName1().c_str());
    1987                 :          0 :         return (2);
    1988                 :            :     }
    1989 [ +  - ][ -  + ]:          2 :     if ( reg2.open(regName2, REG_READONLY) )
    1990                 :            :     {
    1991                 :            :         fprintf(stdout, "%s: open registry \"%s\" failed\n",
    1992         [ #  # ]:          0 :                 options.getProgramName().c_str(), options.getRegName2().c_str());
    1993                 :          0 :         return (3);
    1994                 :            :     }
    1995                 :            : 
    1996 [ +  - ][ +  - ]:          2 :     RegistryKey key1, key2;
    1997 [ +  - ][ -  + ]:          2 :     if ( reg1.openRootKey(key1) )
    1998                 :            :     {
    1999                 :            :         fprintf(stdout, "%s: open root key of registry \"%s\" failed\n",
    2000         [ #  # ]:          0 :                 options.getProgramName().c_str(), options.getRegName1().c_str());
    2001                 :          0 :         return (4);
    2002                 :            :     }
    2003 [ +  - ][ -  + ]:          2 :     if ( reg2.openRootKey(key2) )
    2004                 :            :     {
    2005                 :            :         fprintf(stdout, "%s: open root key of registry \"%s\" failed\n",
    2006         [ #  # ]:          0 :                 options.getProgramName().c_str(), options.getRegName2().c_str());
    2007                 :          0 :         return (5);
    2008                 :            :     }
    2009                 :            : 
    2010         [ -  + ]:          2 :     if ( options.isStartKeyValid() )
    2011                 :            :     {
    2012 [ #  # ][ #  # ]:          0 :         if ( options.matchedWithExcludeKey( options.getStartKey() ) )
    2013                 :            :         {
    2014                 :            :             fprintf(stdout, "%s: start key is equal to one of the exclude keys\n",
    2015         [ #  # ]:          0 :                     options.getProgramName().c_str());
    2016                 :          0 :             return (6);
    2017                 :            :         }
    2018 [ #  # ][ #  # ]:          0 :         RegistryKey sk1, sk2;
    2019 [ #  # ][ #  # ]:          0 :         if ( key1.openKey(options.getStartKey(), sk1) )
    2020                 :            :         {
    2021                 :            :             fprintf(stdout, "%s: open start key of registry \"%s\" failed\n",
    2022         [ #  # ]:          0 :                     options.getProgramName().c_str(), options.getRegName1().c_str());
    2023                 :          0 :             return (7);
    2024                 :            :         }
    2025 [ #  # ][ #  # ]:          0 :         if ( key2.openKey(options.getStartKey(), sk2) )
    2026                 :            :         {
    2027                 :            :             fprintf(stdout, "%s: open start key of registry \"%s\" failed\n",
    2028         [ #  # ]:          0 :                     options.getProgramName().c_str(), options.getRegName2().c_str());
    2029                 :          0 :             return (8);
    2030                 :            :         }
    2031                 :            : 
    2032         [ #  # ]:          0 :         key1 = sk1;
    2033 [ #  # ][ #  # ]:          0 :         key2 = sk2;
         [ #  # ][ #  # ]
                 [ #  # ]
    2034                 :            :     }
    2035                 :            : 
    2036         [ +  - ]:          2 :     sal_uInt32 nError = compareKeys(options, key1, key2);
    2037         [ -  + ]:          2 :     if ( nError )
    2038                 :            :     {
    2039         [ #  # ]:          0 :         if ( options.unoTypeCheck() )
    2040                 :            :         {
    2041                 :            :             fprintf(stdout, "%s: registries are incompatible: %lu differences!\n",
    2042                 :          0 :                     options.getProgramName().c_str(),
    2043         [ #  # ]:          0 :                     sal::static_int_cast< unsigned long >(nError));
    2044                 :            :         }
    2045                 :            :         else
    2046                 :            :         {
    2047                 :            :             fprintf(stdout, "%s: registries contain %lu differences!\n",
    2048                 :          0 :                     options.getProgramName().c_str(),
    2049         [ #  # ]:          0 :                     sal::static_int_cast< unsigned long >(nError));
    2050                 :            :         }
    2051                 :            :     }
    2052                 :            : 
    2053         [ +  - ]:          2 :     key1.releaseKey();
    2054         [ +  - ]:          2 :     key2.releaseKey();
    2055 [ +  - ][ -  + ]:          2 :     if ( reg1.close() )
    2056                 :            :     {
    2057                 :            :         fprintf(stdout, "%s: closing registry \"%s\" failed\n",
    2058         [ #  # ]:          0 :                 options.getProgramName().c_str(), options.getRegName1().c_str());
    2059                 :          0 :         return (9);
    2060                 :            :     }
    2061 [ +  - ][ -  + ]:          2 :     if ( reg2.close() )
    2062                 :            :     {
    2063                 :            :         fprintf(stdout, "%s: closing registry \"%s\" failed\n",
    2064         [ #  # ]:          0 :                 options.getProgramName().c_str(), options.getRegName2().c_str());
    2065                 :          0 :         return (10);
    2066                 :            :     }
    2067                 :            : 
    2068 [ -  + ][ +  - ]:          2 :     return ((nError > 0) ? 11 : 0);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    2069                 :            : }
    2070                 :            : 
    2071                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10