diff options
Diffstat (limited to 'basic/source/runtime')
-rw-r--r-- | basic/source/runtime/methods.cxx | 65 | ||||
-rw-r--r-- | basic/source/runtime/methods1.cxx | 7 | ||||
-rw-r--r-- | basic/source/runtime/rtlproto.hxx | 1 | ||||
-rw-r--r-- | basic/source/runtime/runtime.cxx | 27 | ||||
-rw-r--r-- | basic/source/runtime/stdobj.cxx | 2 | ||||
-rw-r--r-- | basic/source/runtime/step0.cxx | 2 | ||||
-rw-r--r-- | basic/source/runtime/step1.cxx | 11 | ||||
-rw-r--r-- | basic/source/runtime/step2.cxx | 6 |
8 files changed, 96 insertions, 25 deletions
diff --git a/basic/source/runtime/methods.cxx b/basic/source/runtime/methods.cxx index 1f73c8a80745..fd871ecaa286 100644 --- a/basic/source/runtime/methods.cxx +++ b/basic/source/runtime/methods.cxx @@ -79,6 +79,7 @@ using namespace com::sun::star::lang; using namespace com::sun::star::ucb; using namespace com::sun::star::io; using namespace com::sun::star::script; +using namespace com::sun::star::frame; #include "stdobj.hxx" #include <basic/sbstdobj.hxx> @@ -89,6 +90,7 @@ using namespace com::sun::star::script; #include "iosys.hxx" #include "ddectrl.hxx" #include <sbintern.hxx> +#include <basic/vbahelper.hxx> #include <list> #include <math.h> @@ -383,22 +385,48 @@ RTLFUNC(Asc) } } -RTLFUNC(Chr) +void implChr( SbxArray& rPar, bool bChrW ) { - (void)pBasic; - (void)bWrite; - if ( rPar.Count() < 2 ) StarBASIC::Error( SbERR_BAD_ARGUMENT ); else { SbxVariableRef pArg = rPar.Get( 1 ); - sal_Unicode aCh = (sal_Unicode)pArg->GetUShort(); - String aStr( aCh ); + + String aStr; + if( !bChrW && SbiRuntime::isVBAEnabled() ) + { + sal_Char c = (sal_Char)pArg->GetByte(); + ByteString s( c ); + aStr = String( s, gsl_getSystemTextEncoding() ); + } + else + { + sal_Unicode aCh = (sal_Unicode)pArg->GetUShort(); + aStr = String( aCh ); + } rPar.Get(0)->PutString( aStr ); } } +RTLFUNC(Chr) +{ + (void)pBasic; + (void)bWrite; + + bool bChrW = false; + implChr( rPar, bChrW ); +} + +RTLFUNC(ChrW) +{ + (void)pBasic; + (void)bWrite; + + bool bChrW = true; + implChr( rPar, bChrW ); +} + #ifdef UNX #define _MAX_PATH 260 @@ -481,11 +509,16 @@ RTLFUNC(CurDir) RTLFUNC(ChDir) { - (void)pBasic; (void)bWrite; rPar.Get(0)->PutEmpty(); - if (rPar.Count() != 2) + if (rPar.Count() == 2) + { + // VBA: track current directory per document type (separately for Writer, Calc, Impress, etc.) + if( SbiRuntime::isVBAEnabled() ) + ::basic::vba::registerCurrentDirectory( getDocumentModel( pBasic ), rPar.Get(1)->GetString() ); + } + else StarBASIC::Error( SbERR_BAD_ARGUMENT ); } @@ -689,7 +722,7 @@ void implRemoveDirRecursive( const String& aDirPath ) FileBase::RC nRet = DirectoryItem::get( aDirPath, aItem ); sal_Bool bExists = (nRet == FileBase::E_None); - FileStatus aFileStatus( FileStatusMask_Type ); + FileStatus aFileStatus( osl_FileStatus_Mask_Type ); nRet = aItem.getFileStatus( aFileStatus ); FileStatus::Type aType = aFileStatus.getFileType(); sal_Bool bFolder = isFolder( aType ); @@ -716,7 +749,7 @@ void implRemoveDirRecursive( const String& aDirPath ) break; // Handle flags - FileStatus aFileStatus2( FileStatusMask_Type | FileStatusMask_FileURL ); + FileStatus aFileStatus2( osl_FileStatus_Mask_Type | osl_FileStatus_Mask_FileURL ); nRet = aItem2.getFileStatus( aFileStatus2 ); ::rtl::OUString aPath = aFileStatus2.getFileURL(); @@ -845,7 +878,7 @@ RTLFUNC(FileLen) { DirectoryItem aItem; DirectoryItem::get( getFullPathUNC( aStr ), aItem ); - FileStatus aFileStatus( FileStatusMask_FileSize ); + FileStatus aFileStatus( osl_FileStatus_Mask_FileSize ); aItem.getFileStatus( aFileStatus ); nLen = (sal_Int32)aFileStatus.getFileSize(); } @@ -2459,7 +2492,7 @@ String getDirectoryPath( String aPathStr ) FileBase::RC nRet = DirectoryItem::get( aPathStr, aItem ); if( nRet == FileBase::E_None ) { - FileStatus aFileStatus( FileStatusMask_Type ); + FileStatus aFileStatus( osl_FileStatus_Mask_Type ); nRet = aItem.getFileStatus( aFileStatus ); if( nRet == FileBase::E_None ) { @@ -2470,7 +2503,7 @@ String getDirectoryPath( String aPathStr ) } else if( aType == FileStatus::Link ) { - FileStatus aFileStatus2( FileStatusMask_LinkTargetURL ); + FileStatus aFileStatus2( osl_FileStatus_Mask_LinkTargetURL ); nRet = aItem.getFileStatus( aFileStatus2 ); if( nRet == FileBase::E_None ) aRetStr = getDirectoryPath( aFileStatus2.getLinkTargetURL() ); @@ -2817,7 +2850,7 @@ RTLFUNC(Dir) } // Handle flags - FileStatus aFileStatus( FileStatusMask_Type | FileStatusMask_FileName ); + FileStatus aFileStatus( osl_FileStatus_Mask_Type | osl_FileStatus_Mask_FileName ); nRet = aItem.getFileStatus( aFileStatus ); // Only directories? @@ -2917,7 +2950,7 @@ RTLFUNC(GetAttr) { DirectoryItem aItem; DirectoryItem::get( getFullPathUNC( rPar.Get(1)->GetString() ), aItem ); - FileStatus aFileStatus( FileStatusMask_Attributes | FileStatusMask_Type ); + FileStatus aFileStatus( osl_FileStatus_Mask_Attributes | osl_FileStatus_Mask_Type ); aItem.getFileStatus( aFileStatus ); sal_uInt64 nAttributes = aFileStatus.getAttributes(); sal_Bool bReadOnly = (nAttributes & Attribute_ReadOnly) != 0; @@ -2969,7 +3002,7 @@ RTLFUNC(FileDateTime) { DirectoryItem aItem; DirectoryItem::get( getFullPathUNC( aPath ), aItem ); - FileStatus aFileStatus( FileStatusMask_ModifyTime ); + FileStatus aFileStatus( osl_FileStatus_Mask_ModifyTime ); aItem.getFileStatus( aFileStatus ); TimeValue aTimeVal = aFileStatus.getModifyTime(); oslDateTime aDT; diff --git a/basic/source/runtime/methods1.cxx b/basic/source/runtime/methods1.cxx index c12924770fa1..fccdf5595e89 100644 --- a/basic/source/runtime/methods1.cxx +++ b/basic/source/runtime/methods1.cxx @@ -1063,6 +1063,10 @@ sal_Bool lcl_ReadSbxVariable( SbxVariable& rVar, SvStream* pStrm, { sal_uInt8 aByte; *pStrm >> aByte; + + if( bBinary && SbiRuntime::isVBAEnabled() && aByte == 1 && pStrm->IsEof() ) + aByte = 0; + rVar.PutByte( aByte ); } break; @@ -1178,7 +1182,8 @@ void PutGet( SbxArray& rPar, sal_Bool bPut ) } sal_Int16 nFileNo = rPar.Get(1)->GetInteger(); SbxVariable* pVar2 = rPar.Get(2); - sal_Bool bHasRecordNo = (sal_Bool)(pVar2->GetType() != SbxEMPTY); + SbxDataType eType2 = pVar2->GetType(); + sal_Bool bHasRecordNo = (sal_Bool)(eType2 != SbxEMPTY && eType2 != SbxERROR); long nRecordNo = pVar2->GetLong(); if ( nFileNo < 1 || ( bHasRecordNo && nRecordNo < 1 ) ) { diff --git a/basic/source/runtime/rtlproto.hxx b/basic/source/runtime/rtlproto.hxx index ea83f89fdd36..469cd0f0afe6 100644 --- a/basic/source/runtime/rtlproto.hxx +++ b/basic/source/runtime/rtlproto.hxx @@ -158,6 +158,7 @@ extern RTLFUNC(Abs); extern RTLFUNC(Asc); extern RTLFUNC(Atn); extern RTLFUNC(Chr); +extern RTLFUNC(ChrW); extern RTLFUNC(Cos); extern RTLFUNC(CurDir); extern RTLFUNC(ChDir); // JSM diff --git a/basic/source/runtime/runtime.cxx b/basic/source/runtime/runtime.cxx index 40258844adac..b40c962314c0 100644 --- a/basic/source/runtime/runtime.cxx +++ b/basic/source/runtime/runtime.cxx @@ -652,6 +652,7 @@ void SbiRuntime::SetParameters( SbxArray* pParams ) // Methoden sind immer byval! sal_Bool bByVal = v->IsA( TYPE(SbxMethod) ); SbxDataType t = v->GetType(); + bool bTargetTypeIsArray = false; if( p ) { bByVal |= sal_Bool( ( p->eType & SbxBYREF ) == 0 ); @@ -660,9 +661,13 @@ void SbiRuntime::SetParameters( SbxArray* pParams ) if( !bByVal && t != SbxVARIANT && (!v->IsFixed() || (SbxDataType)(v->GetType() & 0x0FFF ) != t) ) bByVal = sal_True; + + bTargetTypeIsArray = (p->nUserData & PARAM_INFO_WITHBRACKETS) != 0; } if( bByVal ) { + if( bTargetTypeIsArray ) + t = SbxOBJECT; SbxVariable* v2 = new SbxVariable( t ); v2->SetFlag( SBX_READWRITE ); *v2 = *v; @@ -1230,6 +1235,28 @@ void SbiRuntime::ClearForStack() PopFor(); } +SbiForStack* SbiRuntime::FindForStackItemForCollection( class BasicCollection* pCollection ) +{ + SbiForStack* pRet = NULL; + + SbiForStack* p = pForStk; + while( p ) + { + SbxVariable* pVar = p->refEnd.Is() ? (SbxVariable*)p->refEnd : NULL; + if( p->eForType == FOR_EACH_COLLECTION && pVar != NULL && + (pCollection = PTR_CAST(BasicCollection,pVar)) == pCollection ) + { + pRet = p; + break; + } + } + + return pRet; +} + + +////////////////////////////////////////////////////////////////////////// +// // DLL-Aufrufe void SbiRuntime::DllCall diff --git a/basic/source/runtime/stdobj.cxx b/basic/source/runtime/stdobj.cxx index 919fd9c00626..53b2ae11c76b 100644 --- a/basic/source/runtime/stdobj.cxx +++ b/basic/source/runtime/stdobj.cxx @@ -148,7 +148,7 @@ static Methods aMethods[] = { { "Chr", SbxSTRING, 1 | _FUNCTION, RTLNAME(Chr),0 }, { "string", SbxINTEGER, 0,NULL,0 }, -{ "ChrW", SbxSTRING, 1 | _FUNCTION | _COMPATONLY, RTLNAME(Chr),0}, +{ "ChrW", SbxSTRING, 1 | _FUNCTION | _COMPATONLY, RTLNAME(ChrW),0}, { "string", SbxINTEGER, 0,NULL,0 }, { "CInt", SbxINTEGER, 1 | _FUNCTION, RTLNAME(CInt),0 }, diff --git a/basic/source/runtime/step0.cxx b/basic/source/runtime/step0.cxx index 7743126835dc..bc3aeabf0255 100644 --- a/basic/source/runtime/step0.cxx +++ b/basic/source/runtime/step0.cxx @@ -802,6 +802,8 @@ void SbiRuntime::DimImpl( SbxVariableRef refVar ) // auch Arrays ohne Dimensionsangaben zulassen (VB-komp.) if( pDims ) { + refVar->ResetFlag( SBX_VAR_TO_DIM ); + for( sal_uInt16 i = 1; i < pDims->Count(); ) { sal_Int32 lb = pDims->Get( i++ )->GetLong(); diff --git a/basic/source/runtime/step1.cxx b/basic/source/runtime/step1.cxx index 53b482b8f22e..8beddbc7b083 100644 --- a/basic/source/runtime/step1.cxx +++ b/basic/source/runtime/step1.cxx @@ -39,8 +39,7 @@ #include "sbunoobj.hxx" #include "errobject.hxx" -bool checkUnoObjectType( SbUnoObject* refVal, - const String& aClass ); +bool checkUnoObjectType( SbUnoObject* refVal, const ::rtl::OUString& aClass ); // Laden einer numerischen Konstanten (+ID) @@ -437,15 +436,15 @@ void SbiRuntime::StepPRCHAR( sal_uInt32 nOp1 ) // Check, ob TOS eine bestimmte Objektklasse ist (+StringID) -bool SbiRuntime::implIsClass( SbxObject* pObj, const String& aClass ) +bool SbiRuntime::implIsClass( SbxObject* pObj, const ::rtl::String& aClass ) { bool bRet = true; - if( aClass.Len() != 0 ) + if( aClass.getLenth() != 0 ) { bRet = pObj->IsClass( aClass ); if( !bRet ) - bRet = aClass.EqualsIgnoreCaseAscii( String( RTL_CONSTASCII_USTRINGPARAM("object") ) ); + bRet = aClass.equalsIgnoreCaseAscii( String( RTL_CONSTASCII_USTRINGPARAM("object") ) ); if( !bRet ) { String aObjClass = pObj->GetClassName(); @@ -463,7 +462,7 @@ bool SbiRuntime::implIsClass( SbxObject* pObj, const String& aClass ) } bool SbiRuntime::checkClass_Impl( const SbxVariableRef& refVal, - const String& aClass, bool bRaiseErrors, bool bDefault ) + const ::rtl::OUString& aClass, bool bRaiseErrors, bool bDefault ) { bool bOk = bDefault; diff --git a/basic/source/runtime/step2.cxx b/basic/source/runtime/step2.cxx index ebc012c36f99..e9ed8b533b40 100644 --- a/basic/source/runtime/step2.cxx +++ b/basic/source/runtime/step2.cxx @@ -621,7 +621,7 @@ SbxVariable* SbiRuntime::CheckArray( SbxVariable* pElem ) else if( bVBAEnabled ) // !pObj { SbxArray* pParam = pElem->GetParameters(); - if( pParam != NULL ) + if( pParam != NULL && !pElem->IsSet( SBX_VAR_TO_DIM ) ) Error( SbERR_NO_OBJECT ); } } @@ -1131,6 +1131,10 @@ void SbiRuntime::implHandleSbxFlags( SbxVariable* pVar, SbxDataType t, sal_uInt3 aStr.Fill( nCount, 0 ); pVar->PutString( aStr ); } + + bool bVarToDim = ((nOp2 & SBX_TYPE_VAR_TO_DIM_FLAG) != 0); + if( bVarToDim ) + pVar->SetFlag( SBX_VAR_TO_DIM ); } // Einrichten einer lokalen Variablen (+StringID+Typ) |