summaryrefslogtreecommitdiff
path: root/cppu/test/alignment/pass1.cxx
diff options
context:
space:
mode:
authorDaniel Boelzle <dbo@openoffice.org>2001-10-17 11:40:31 +0000
committerDaniel Boelzle <dbo@openoffice.org>2001-10-17 11:40:31 +0000
commit866f0e76d0d7317076cbb3fc1c7d128c4c54af3a (patch)
tree34789eee05052249c5b354f2db67b1403ddf9026 /cppu/test/alignment/pass1.cxx
parentdc3a05a841b2d89e74391b2652bce9183f08bc6f (diff)
#92951# added comprehensive type test
Diffstat (limited to 'cppu/test/alignment/pass1.cxx')
-rw-r--r--cppu/test/alignment/pass1.cxx266
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;
+ }
+}