oox/source/ole/vbamodule.cxx | 48 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+)
New commits: commit 2edf8cba49e8ba72fa7b0e02d24a38cab45c697c Author: Noel Power <noel.po...@novell.com> Date: Fri Mar 2 13:04:18 2012 +0000 weed out unmatched Sub/End Sub statements when importing VBA fdo#46889 fix mishandling of 'End Sub' is there is a trailing comment fod#46889 Signed-off-by: Miklos Vajna <vmik...@suse.cz> diff --git a/oox/source/ole/vbamodule.cxx b/oox/source/ole/vbamodule.cxx index cbd9744..12e1110 100644 --- a/oox/source/ole/vbamodule.cxx +++ b/oox/source/ole/vbamodule.cxx @@ -218,6 +218,7 @@ void VbaModule::createEmptyModule( const Reference< XNameContainer >& rxBasicLib OUString VbaModule::readSourceCode( StorageBase& rVbaStrg, const Reference< XNameContainer >& rxOleNameOverrides ) const { OUStringBuffer aSourceCode; + const static rtl::OUString sUnmatchedRemovedTag( RTL_CONSTASCII_USTRINGPARAM( "Rem removed unmatched Sub/End: " ) ); if( (maStreamName.getLength() > 0) && (mnOffset != SAL_MAX_UINT32) ) { BinaryXInputStream aInStrm( rVbaStrg.openInputStream( maStreamName ), true ); @@ -231,6 +232,14 @@ OUString VbaModule::readSourceCode( StorageBase& rVbaStrg, const Reference< XNam VbaInputStream aVbaStrm( aInStrm ); // load the source code line-by-line, with some more processing TextInputStream aVbaTextStrm( mxContext, aVbaStrm, meTextEnc ); + + struct ProcedurePair + { + bool bInProcedure; + sal_uInt32 nPos; + ProcedurePair() : bInProcedure( false ), nPos( 0 ) {}; + } procInfo; + while( !aVbaTextStrm.isEof() ) { OUString aCodeLine = aVbaTextStrm.readLine(); @@ -241,6 +250,45 @@ OUString VbaModule::readSourceCode( StorageBase& rVbaStrg, const Reference< XNam } else { + // Hack here to weed out any unmatched End Sub / Sub Foo statements. + // The behaviour of the vba ide practically guarantees the case and + // spacing of Sub statement(s). However, indentation can be arbitrary hence + // the trim. + rtl::OUString trimLine( aCodeLine.trim() ); + if ( mbExecutable && ( + trimLine.matchAsciiL( RTL_CONSTASCII_STRINGPARAM("Sub ") ) || + trimLine.matchAsciiL( RTL_CONSTASCII_STRINGPARAM("Public Sub ") ) || + trimLine.matchAsciiL( RTL_CONSTASCII_STRINGPARAM("Private Sub ") ) || + trimLine.matchAsciiL( RTL_CONSTASCII_STRINGPARAM("Static Sub ") ) ) ) + { + // this should never happen, basic doesn't support nested procedures + // first Sub Foo must be bogus + if ( procInfo.bInProcedure ) + { + // comment out the line + aSourceCode.insert( procInfo.nPos, sUnmatchedRemovedTag ); + // mark location of this Sub + procInfo.nPos = aSourceCode.getLength(); + } + else + { + procInfo.bInProcedure = true; + procInfo.nPos = aSourceCode.getLength(); + } + } + else if ( mbExecutable && aCodeLine.trim().matchAsciiL( RTL_CONSTASCII_STRINGPARAM("End Sub")) ) + { + // un-matched End Sub + if ( !procInfo.bInProcedure ) + { + aSourceCode.append( sUnmatchedRemovedTag ); + } + else + { + procInfo.bInProcedure = false; + procInfo.nPos = 0; + } + } // normal source code line if( !mbExecutable ) aSourceCode.appendAscii( RTL_CONSTASCII_STRINGPARAM( "Rem " ) ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits