diff options
author | Daniel Boelzle <dbo@openoffice.org> | 2001-10-17 11:40:31 +0000 |
---|---|---|
committer | Daniel Boelzle <dbo@openoffice.org> | 2001-10-17 11:40:31 +0000 |
commit | 866f0e76d0d7317076cbb3fc1c7d128c4c54af3a (patch) | |
tree | 34789eee05052249c5b354f2db67b1403ddf9026 /cppu/test/alignment/pass1.cxx | |
parent | dc3a05a841b2d89e74391b2652bce9183f08bc6f (diff) |
#92951# added comprehensive type test
Diffstat (limited to 'cppu/test/alignment/pass1.cxx')
-rw-r--r-- | cppu/test/alignment/pass1.cxx | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/cppu/test/alignment/pass1.cxx b/cppu/test/alignment/pass1.cxx new file mode 100644 index 000000000000..d277d125ecfc --- /dev/null +++ b/cppu/test/alignment/pass1.cxx @@ -0,0 +1,266 @@ +/************************************************************************* + * + * $RCSfile: pass1.cxx,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: dbo $ $Date: 2001-10-17 12:40:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include <stdio.h> +#include <vector> + +#include <rtl/string.hxx> +#include <rtl/strbuf.hxx> +#include <rtl/bootstrap.hxx> +#include <rtl/process.h> + +#include <registry/reflread.hxx> + +// starting the executable: +// -env:UNO_CFG_URL=local;<absolute_path>..\\..\\test\\cfg_data;<absolute_path>\\cfg_update +// -env:UNO_TYPES=cpputest.rdb + +#include <cppuhelper/bootstrap.hxx> + +#include <com/sun/star/lang/XComponent.hpp> + +#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) ) +#define OSTR(x) ::rtl::OUStringToOString( x, RTL_TEXTENCODING_ASCII_US ) + + +using namespace ::cppu; +using namespace ::rtl; +using namespace ::osl; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + + +static void find_all_structs( + Reference< registry::XRegistryKey > const & xKey, + ::std::vector< OUString > * pNames ) +{ + static RegistryTypeReaderLoader s_loader; + OSL_VERIFY( s_loader.isLoaded() ); + + if (xKey.is() && xKey->isValid()) + { + if (xKey->getValueType() == registry::RegistryValueType_BINARY) + { + Sequence< sal_Int8 > aBytes( xKey->getBinaryValue() ); + RegistryTypeReader aReader( + s_loader, (const sal_uInt8 *)aBytes.getConstArray(), + aBytes.getLength(), sal_False ); + + switch (aReader.getTypeClass()) + { + case RT_TYPE_EXCEPTION: + case RT_TYPE_STRUCT: + pNames->push_back( aReader.getTypeName().replace( '/', '.' ) ); + break; + } + } + + Sequence< Reference< registry::XRegistryKey > > keys( xKey->openKeys() ); + Reference< registry::XRegistryKey > const * pKeys = keys.getConstArray(); + for ( sal_Int32 nPos = keys.getLength(); nPos--; ) + { + find_all_structs( pKeys[ nPos ], pNames ); + } + } +} + +static OString makeIncludeName( OUString const & name ) SAL_THROW( () ) +{ + return OSTR(name.replace( '.', '/' )); +} +static OString makeCppName( OUString const & name ) SAL_THROW( () ) +{ + OStringBuffer buf( 64 ); + OString str( OSTR(name) ); + sal_Int32 n = 0; + do + { + buf.append( str.getToken( 0, '.', n ) ); + if (n >= 0) + buf.append( "::" ); + } + while (n >= 0); + return buf.makeStringAndClear(); +} + +//================================================================================================== +int SAL_CALL main( int, char const ** ) +{ + sal_Int32 argc = rtl_getAppCommandArgCount(); + if (argc < 1) + { + fprintf( stderr, "usage: pass1 pass2_source [typelist_to_stdout]\n" ); + return 1; + } + + try + { + // determine types rdb + OUString rdb_name; + Bootstrap bootstrap; + if (!bootstrap.getFrom( OUSTR("UNO_TYPES"), rdb_name ) || !rdb_name.getLength()) + { + fprintf( + stderr, + "### no UNO_TYPES registry found!!!\n\n" + "usage: pass1 pass2_source [typelist_to_stdout]\n" ); + return 1; + } + + Reference< XComponentContext > xContext( defaultBootstrap_InitialComponentContext() ); + + // read out all struct names from given registry + Reference< registry::XSimpleRegistry > xSimReg( createSimpleRegistry() ); + OSL_ASSERT( xSimReg.is() ); + xSimReg->open( rdb_name, sal_True, sal_False ); + OSL_ASSERT( xSimReg->isValid() ); + Reference< registry::XRegistryKey > xKey( xSimReg->getRootKey() ); + OSL_ASSERT( xKey.is() && xKey->isValid() ); + + ::std::vector< OUString > names; + names.reserve( 128 ); + find_all_structs( xKey->openKey( OUSTR("UCR") ), &names ); + + OUString fileName; + OSL_VERIFY( osl_Process_E_None == rtl_getAppCommandArg( 0, &fileName.pData ) ); + bool bDumpStdOut = (argc > 1); + + // generate pass2 output file [and type list] + OString str( OSTR(fileName) ); + FILE * hPass2 = fopen( str.getStr(), "w" ); + OSL_ASSERT( hPass2 ); + + size_t nPos; + for ( nPos = names.size(); nPos--; ) + { + OUString const & name = names[ nPos ]; + if (bDumpStdOut) + { + // type name on stdout + OString str( OSTR(name) ); + fprintf( stdout, "%s\n", str.getStr() ); + } + // all includes + OString includeName( makeIncludeName( name ) ); + fprintf( hPass2, "#include <%s.hdl>\n", includeName.getStr() ); + } + // include diagnose.h + fprintf( + hPass2, + "\n#include <diagnose.h>\n\n" + "int SAL_CALL main( int argc, char const * argv[] )\n{\n" ); + // generate all type checks + for ( nPos = names.size(); nPos--; ) + { + OUString const & name = names[ nPos ]; + typelib_TypeDescription * pTD = 0; + typelib_typedescription_getByName( &pTD, name.pData ); + if (pTD) + { + if (! pTD->bComplete) + { + typelib_typedescription_complete( &pTD ); + } + typelib_CompoundTypeDescription * pCTD = (typelib_CompoundTypeDescription *)pTD; + + OString cppName( makeCppName( name ) ); + fprintf( + hPass2, "\tBINTEST_VERIFYSIZE( %s, %d );\n", + cppName.getStr(), pTD->nSize ); + fprintf( + hPass2, "\tBINTEST_VERIFYALIGNMENT( %s, %d );\n", + cppName.getStr(), pTD->nAlignment ); + // offset checks + for ( sal_Int32 nPos = pCTD->nMembers; nPos--; ) + { + OString memberName( OSTR(pCTD->ppMemberNames[ nPos ]) ); + fprintf( + hPass2, "\tBINTEST_VERIFYOFFSET( %s, %s, %d );\n", + cppName.getStr(), memberName.getStr(), pCTD->pMemberOffsets[ nPos ] ); + } + typelib_typedescription_release( pTD ); + } + else + { + OString str( OSTR(name) ); + fprintf( stderr, "### cannot dump type %s!!!\n", str.getStr() ); + } + } + fprintf( + hPass2, + "\n\tfprintf( stdout, \"> alignment test succeeded.\\n\" );\n" + "\treturn 0;\n}\n\n" ); + fclose( hPass2 ); + + Reference< lang::XComponent > xComp( xContext, UNO_QUERY ); + if (xComp.is()) + { + xComp->dispose(); + } + return 0; + } + catch (Exception & exc) + { + OString str( OUStringToOString( exc.Message, RTL_TEXTENCODING_ASCII_US ) ); + ::fprintf( stderr, "# caught exception: %s\n", str.getStr() ); + return 1; + } +} |